Skip to content

Commit a7f000c

Browse files
committed
Updated to work with Part type objects and gave editability to trajectory vectors
1 parent 1bc1e38 commit a7f000c

File tree

3 files changed

+57
-51
lines changed

3 files changed

+57
-51
lines changed

ExplodedAssembly.py

Lines changed: 33 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,9 @@ def checkDocumentStructure():
7878
class 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():
174169
class 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

615597
def 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:

README.md

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,37 @@ Instructions for Ubuntu & Mint specifically but can be adapted to other distros.
3737
Then
3838
- Relaunch FreeCAD (workbench should be incorporated automagically).
3939

40-
### Usage
40+
### Basic usage
4141

42+
#### Run example file
4243
1. Check the provided 'example.fcstd'.
43-
2. Load the workbench and then click on "Load Example File" inside the workbench commands tab:
44+
2. Load the workbench and then click on "Load Example File" inside the workbench drowpdown menu.
4445

4546
![example file](https://cloud.githubusercontent.com/assets/4140247/26527781/1ea3f7ba-4369-11e7-90cb-2c85a09e878f.PNG)
4647

4748
Watch the [Exploded Assembly workflow screencast](https://www.youtube.com/watch?v=t72qdG772Q8&feature=youtu.be).
4849

50+
#### Create Simple Group
51+
#### To explode a single object:
52+
1. Select the objects you want to explode
53+
2. If the selected object is of type "Body", the selected face will be used as a normal
54+
3. If you want to explode an object of type "Part" (contains other objects), select the Part object and then a face to be used as normal vector.
55+
4. Several parameters can be modified at the properties of the single group (direction, speed, rotation...)
56+
57+
##### To explode several objects
58+
1. Select the objects you want to explode in the same direction (type of objects allowed are Body and Part)
59+
2. Select one face to use its normal as direction
60+
3. Press the icon **Create Simple Group**
61+
4. You can change the direction vectors and other parameters at the properties of the single group
62+
63+
#### Create Bolt Group
64+
Bolt groups allow to rotate several screws/nuts/bolts around its own axis while moving. To create a Bolt Group:
65+
1. Select one circular edge of each the bolts you want to animate
66+
2. Select one face (arbitrary shape) wich has as normal vector in the direction in wich you want to move the selected bolts
67+
3. Press the icon **Create Bolt Group**
68+
4. You can change the direction vectors and other parameters at the properties of the single group
69+
70+
4971
### Documentation
5072
Wiki documentation will be available soon.
5173

example.fcstd

128 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)