From ca8ab83e09ff813a25ebcd5b5180f660a9504fa3 Mon Sep 17 00:00:00 2001 From: PaddleStroke Date: Thu, 25 Apr 2024 17:07:54 +0200 Subject: [PATCH] Assembly: Improve Exploded View's radial explosion, and various small fixes. --- src/Mod/Assembly/CommandCreateView.py | 34 +++++++++++++-------------- src/Mod/Assembly/JointObject.py | 11 +++++++-- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/Mod/Assembly/CommandCreateView.py b/src/Mod/Assembly/CommandCreateView.py index 9b4ac73940..c64c7c8ed3 100644 --- a/src/Mod/Assembly/CommandCreateView.py +++ b/src/Mod/Assembly/CommandCreateView.py @@ -94,9 +94,6 @@ class ExplodedView: def loads(self, state): return None - def getAssembly(self, viewObj): - return viewObj.InList[0] - def onChanged(self, viewObj, prop): if prop == "Moves" and hasattr(self, "stepsChangedCallback"): if self.stepsChangedCallback is not None: @@ -120,7 +117,10 @@ class ExplodedView: return positions def getAssembly(self, viewObj): - return viewObj.InList[0] + for obj in viewObj.InList: + if obj.isDerivedFrom("Assembly::AssemblyObject"): + return obj + return None def saveAssemblyAndExplode(self, viewObj): self.initialPlcs = UtilsAssembly.saveAssemblyPartsPlacements(self.getAssembly(viewObj)) @@ -197,11 +197,8 @@ class ViewProviderExplodedView: if task: task.reject() - assembly = None - for obj in vobj.Object.InList: - if obj.isDerivedFrom("Assembly::AssemblyObject"): - assembly = obj - break + assembly = vobj.Object.Proxy.getAssembly(vobj.Object) + if assembly is None: return False @@ -278,7 +275,7 @@ class ExplodedViewStep: positions = [] if move.MoveType == "Radial": distance = move.MovementTransform.Base.Length - factor = 1 + 4 * distance / size + factor = 4 * distance / size for objName, part in zip(move.ObjNames, move.Parts): if not objName: @@ -291,8 +288,9 @@ class ExplodedViewStep: startPos = UtilsAssembly.getCenterOfBoundingBox([obj], [part]) if move.MoveType == "Radial": - init_vec = obj.Placement.Base - com - obj.Placement.Base = com + init_vec * factor + objCom, objSize = UtilsAssembly.getComAndSize(obj) + init_vec = objCom - com + obj.Placement.Base = obj.Placement.Base + init_vec * factor else: obj.Placement = move.MovementTransform * obj.Placement @@ -305,9 +303,6 @@ class ExplodedViewStep: return positions - def getAssembly(self, move): - return move.InList[0].InList[0] - def getMovingobjects(self, move): movingObjs = [] for objName, part in zip(move.ObjNames, move.Parts): @@ -453,7 +448,8 @@ class TaskAssemblyCreateView(QtCore.QObject): actionAlignToCenter.triggered.connect(self.onAlignToCenter) actionAlignToOrigin.triggered.connect(self.onAlignToPartOrigin) - self.form.btnAlignDragger.setVisible(False) + self.form.btnAlignDragger.setEnabled(False) + self.form.btnAlignDragger.setText("Select a part") self.form.btnRadialExplosion.clicked.connect(self.onRadialClicked) pref = Preferences.preferences() @@ -591,7 +587,11 @@ class TaskAssemblyCreateView(QtCore.QObject): def enableDragger(self, val): self.assembly.ViewObject.DraggerVisibility = val - self.form.btnAlignDragger.setVisible(val) + self.form.btnAlignDragger.setEnabled(val) + if val: + self.form.btnAlignDragger.setText("Align dragger to...") + else: + self.form.btnAlignDragger.setText("Select a part") def onMovesChanged(self): # First reset positions diff --git a/src/Mod/Assembly/JointObject.py b/src/Mod/Assembly/JointObject.py index 53287fcd89..34fed337f9 100644 --- a/src/Mod/Assembly/JointObject.py +++ b/src/Mod/Assembly/JointObject.py @@ -413,7 +413,10 @@ class Joint: return None def getAssembly(self, joint): - return joint.InList[0] + for obj in joint.InList: + if obj.isDerivedFrom("Assembly::AssemblyObject"): + return obj + return None def setJointType(self, joint, jointType): joint.JointType = jointType @@ -882,7 +885,11 @@ class ViewProviderJoint: if task: task.reject() - assembly = vobj.Object.InList[0] + assembly = vobj.Object.Proxy.getAssembly(vobj.Object) + + if assembly is None: + return False + if UtilsAssembly.activeAssembly() != assembly: self.gui_doc.setEdit(assembly)