@@ -78,9 +78,9 @@ def checkDocumentStructure():
7878class BoltGroupObject :
7979 def __init__ (self , obj ):
8080 obj .addProperty ('App::PropertyPythonObject' , 'names' ).names = []
81- obj .addProperty ('App::PropertyPythonObject ' , 'dir_vectors' ).dir_vectors = []
82- obj .addProperty ('App::PropertyPythonObject ' , 'rot_vectors' ).rot_vectors = []
83- obj .addProperty ('App::PropertyPythonObject ' , 'rot_centers' ).rot_centers = []
81+ obj .addProperty ('App::PropertyVectorList ' , 'dir_vectors' ).dir_vectors = []
82+ obj .addProperty ('App::PropertyVectorList ' , 'rot_vectors' ).rot_vectors = []
83+ obj .addProperty ('App::PropertyVectorList ' , 'rot_centers' ).rot_centers = []
8484 #
8585 obj .addProperty ('App::PropertyFloat' , 'Distance' ).Distance = 20.0
8686 obj .addProperty ('App::PropertyFloat' , 'Revolutions' ).Revolutions = 0.0
@@ -119,7 +119,6 @@ def createBoltDisassemble():
119119 try :
120120 dir_vector = subObject .normalAt (0 , 0 )
121121 break
122-
123122 except :
124123 pass
125124
@@ -129,16 +128,12 @@ def createBoltDisassemble():
129128 if str (subObject .Curve )[0 :6 ] == 'Circle' :
130129 # append object name
131130 SDObj .names .append (sel_obj .Object .Name )
132- # append unmount direction
133- JSON_dir_vector = (dir_vector [0 ], dir_vector [1 ], dir_vector [2 ])
134- SDObj .dir_vectors .append (JSON_dir_vector )
135- # apend rotation axis
136- JSON_rot_axis = (dir_vector [0 ], dir_vector [1 ], dir_vector [2 ])
137- SDObj .rot_vectors .append (JSON_rot_axis )
138- # append rotation center
139- rot_center = subObject .Curve .Center
140- JSON_rot_center = (rot_center [0 ], rot_center [1 ], rot_center [2 ])
141- SDObj .rot_centers .append (JSON_rot_center )
131+ # append unmount direction
132+ SDObj .dir_vectors += [(dir_vector [0 ], dir_vector [1 ], dir_vector [2 ])]
133+ # apend rotation axis
134+ SDObj .rot_vectors += [(dir_vector [0 ], dir_vector [1 ], dir_vector [2 ])]
135+ # append rotation center
136+ SDObj .rot_centers += [subObject .Curve .Center ]
142137 # append initial values for distance, revs, steps
143138 SDObj .distance .append (10.0 )
144139 SDObj .revolutions .append (0 )
@@ -174,9 +169,9 @@ def createBoltDisassemble():
174169class SimpleGroupObject :
175170 def __init__ (self , obj ):
176171 obj .addProperty ('App::PropertyPythonObject' , 'names' ).names = []
177- obj .addProperty ('App::PropertyPythonObject ' , 'dir_vectors' ).dir_vectors = []
178- obj .addProperty ('App::PropertyPythonObject ' , 'rot_vectors' ).rot_vectors = []
179- obj .addProperty ('App::PropertyPythonObject ' , 'rot_centers' ).rot_centers = []
172+ obj .addProperty ('App::PropertyVectorList ' , 'dir_vectors' ).dir_vectors = []
173+ obj .addProperty ('App::PropertyVectorList ' , 'rot_vectors' ).rot_vectors = []
174+ obj .addProperty ('App::PropertyVectorList ' , 'rot_centers' ).rot_centers = []
180175 #
181176 obj .addProperty ('App::PropertyFloat' , 'Distance' ).Distance = 20.0
182177 obj .addProperty ('App::PropertyFloat' , 'Revolutions' ).Revolutions = 0.0
@@ -212,25 +207,23 @@ def createSimpleDisassemble():
212207 # the last face of the last object selected determines the disassemble dir vector
213208 dir_vector = selection [- 1 ].SubObjects [- 1 ].normalAt (0 , 0 )
214209 # the rotation center is the center of mass of the last face selected
215- rot_center = selection [- 1 ].SubObjects [- 1 ].CenterOfMass
216-
210+ rot_center = selection [- 1 ].SubObjects [- 1 ].CenterOfMass
217211 # ignore last object if it cannot be moved, it is only used for positioning
218212 if FreeCAD .ActiveDocument .getObject (selection [- 1 ].Object .Name ) is None :
219- del selection [- 1 ]
220-
213+ del selection [- 1 ]
221214 # create trajectory data
222- for sel_obj in selection :
223- # append object name
224- SDObj .names .append (sel_obj .Object .Name )
225- # append unmount direction
226- JSON_dir_vector = (dir_vector [0 ], dir_vector [1 ], dir_vector [2 ])
227- SDObj .dir_vectors .append (JSON_dir_vector )
215+ obj_selection = FreeCAD .Gui .Selection .getSelection ()
216+ for i , sel_obj in enumerate (obj_selection ):
217+ if len (obj_selection ) > 1 and i == ( len (obj_selection )- 1 ):
218+ # last object only serves as reference
219+ break
220+ SDObj .names .append (sel_obj .Name )
221+ # append unmount direction
222+ SDObj .dir_vectors += [(dir_vector [0 ], dir_vector [1 ], dir_vector [2 ])]
228223 # apend rotation axis
229- JSON_rot_axis = (dir_vector [0 ], dir_vector [1 ], dir_vector [2 ])
230- SDObj .rot_vectors .append (JSON_rot_axis )
224+ SDObj .rot_vectors += [(dir_vector [0 ], dir_vector [1 ], dir_vector [2 ])]
231225 # append rotation center
232- JSON_rot_center = (rot_center [0 ], rot_center [1 ], rot_center [2 ])
233- SDObj .rot_centers .append (JSON_rot_center )
226+ SDObj .rot_centers += [(rot_center [0 ], rot_center [1 ], rot_center [2 ])]
234227
235228 EAFolder = FreeCAD .ActiveDocument .ExplodedAssembly
236229 # add initial placement if this is the first move of the parts
@@ -452,24 +445,13 @@ def goToEnd():
452445
453446 inc_D = traj .Distance / float (1 )
454447 inc_R = traj .Revolutions / float (1 )
455- for i in range (1 ):
456- if i == 0 :
457- dir_vectors = []
458- rot_vectors = []
459- rot_centers = []
460- for s in range (len (objects )):
461- dir_vectors .append (FreeCAD .Vector (tuple (traj .dir_vectors [s ])))
462- rot_vectors .append (FreeCAD .Vector (tuple (traj .rot_vectors [s ])))
463- rot_centers .append (FreeCAD .Vector (tuple (traj .rot_centers [s ])))
464-
465- for n in range (len (objects )):
466- obj = objects [n ]
467- obj_base = dir_vectors [n ]* inc_D
468- obj_rot = FreeCAD .Rotation (rot_vectors [n ], inc_R * 360 )
469- obj_rot_center = rot_centers [n ]
470- incremental_placement = FreeCAD .Placement (obj_base , obj_rot , obj_rot_center )
471- obj .Placement = incremental_placement .multiply (obj .Placement )
472-
448+ for n in range (len (objects )):
449+ obj = objects [n ]
450+ obj_base = traj .dir_vectors [n ]* inc_D
451+ obj_rot = FreeCAD .Rotation (traj .rot_vectors [n ], inc_R * 360 )
452+ obj_rot_center = traj .rot_centers [n ]
453+ incremental_placement = FreeCAD .Placement (obj_base , obj_rot , obj_rot_center )
454+ obj .Placement = incremental_placement .multiply (obj .Placement )
473455
474456 FreeCAD .Gui .updateGui ()
475457
@@ -613,6 +595,8 @@ def modifyIndividualObjectTrajectory():
613595
614596
615597def updateTrajectoryLines ():
598+ # this is disabled because is no longer accurate and needs conversion to new placement
599+ return
616600 EAFolder = FreeCAD .ActiveDocument .ExplodedAssembly .Group
617601 # remove all the previous trajectory lines
618602 for traj in EAFolder :
0 commit comments