From d4992a47060eaab27dbf22c176ed0467f877d6bd Mon Sep 17 00:00:00 2001 From: "Zheng, Lei" Date: Mon, 29 Jan 2018 17:15:27 +0800 Subject: [PATCH] mover: support tracing any geometry element --- assembly.py | 1 + gui.py | 33 ++++++++++++++++++++++++++++++++- mover.py | 47 +++++++++++++++++++++++++++++------------------ 3 files changed, 62 insertions(+), 19 deletions(-) diff --git a/assembly.py b/assembly.py index 205a23b..66161e0 100644 --- a/assembly.py +++ b/assembly.py @@ -1656,6 +1656,7 @@ class ViewProviderAssembly(ViewProviderAsmGroup): def initDraggingPlacement(self): if not getattr(self,'_movingPart',None): return + self._movingPart.begin() return (FreeCADGui.editDocument().EditingTransform, self._movingPart.draggerPlacement, self._movingPart.bbox) diff --git a/gui.py b/gui.py index d61c243..ef1d072 100644 --- a/gui.py +++ b/gui.py @@ -1,6 +1,6 @@ from collections import OrderedDict import FreeCAD, FreeCADGui -from .utils import objName,addIconToFCAD,guilogger as logger +from .utils import getElementPos,objName,addIconToFCAD,guilogger as logger from .proxy import ProxyType from .FCADLogger import FCADLogger @@ -267,6 +267,37 @@ class AsmCmdTrace(AsmCmdCheckable): _menuText = 'Trace part move' _iconName = 'Assembly_Trace.svg' + _object = None + _subname = None + + @classmethod + def Activated(cls,checked): + super(AsmCmdTrace,cls).Activated(checked) + if not checked: + cls._object = None + return + sel = FreeCADGui.Selection.getSelectionEx('',False) + if len(sel)==1: + subs = sel[0].SubElementNames + if len(subs)==1: + cls._object = sel[0].Object + cls._subname = subs[0] + logger.info('trace {}.{}'.format( + cls._object.Name,cls._subname)) + return + logger.info('trace moving element') + + @classmethod + def getPosition(cls): + if not cls._object: + return + try: + if cls._object.Document != FreeCAD.ActiveDocument: + cls._object = None + return getElementPos((cls._object,cls._subname)) + except Exception: + cls._object = None + class AsmCmdAutoRecompute(AsmCmdCheckable): _id = 5 _menuText = 'Auto recompute' diff --git a/mover.py b/mover.py index 45c4e04..b524b8e 100644 --- a/mover.py +++ b/mover.py @@ -53,8 +53,8 @@ class AsmMovingPart(object): self.offset = pla.copy() self.offsetInv = pla.inverse() self.draggerPlacement = info.Placement.multiply(pla) - self.tracePoint = self.draggerPlacement.Base self.trace = None + self.tracePoint = None @classmethod def onRollback(cls): @@ -66,7 +66,10 @@ class AsmMovingPart(object): movingPart = getattr(vobj.Proxy,'_movingPart',None) if movingPart: vobj.Object.recompute(True) - movingPart.tracePoint = movingPart.draggerPlacement.Base + movingPart.tracePoint = movingPart.TracePosition + + def begin(self): + self.tracePoint = self.TracePosition def update(self): info = getElementInfo(self.info.Parent,self.info.SubnameRef) @@ -87,6 +90,14 @@ class AsmMovingPart(object): self.draggerPlacement.inverse()) return utils.roundPlacement(pla) + @property + def TracePosition(self): + pos = gui.AsmCmdTrace.getPosition() + if pos: + return pos + mat = FreeCADGui.editDocument().EditingTransform + return mat.multiply(self.draggerPlacement.Base) + def move(self): info = self.info part = info.Part @@ -95,7 +106,7 @@ class AsmMovingPart(object): updatePla = True rollback = [] - if utils.isDraftWire(part): + if not info.Subname.startswith('Face') and utils.isDraftWire(part): updatePla = False if info.Subname.startswith('Vertex'): idx = utils.draftWireVertex2PointIndex(part,info.Subname) @@ -171,21 +182,21 @@ class AsmMovingPart(object): solver.solve, self.objs, dragPart=info.Part, rollback=rollback): obj.recompute(True) - if gui.AsmCmdManager.Trace and \ - not self.tracePoint.isEqual(self.draggerPlacement.Base,1e-5): - try: - # check if the object is deleted - self.trace.Name - except Exception: - self.trace = None - mat = FreeCADGui.editDocument().EditingTransform - if not self.trace: - self.trace = FreeCAD.ActiveDocument.addObject( - 'Part::Polygon','AsmTrace') - self.trace.Nodes = {-1:mat.multiply(self.tracePoint)} - self.tracePoint = self.draggerPlacement.Base - self.trace.Nodes = {-1:mat.multiply(self.draggerPlacement.Base)} - self.trace.recompute() + if gui.AsmCmdManager.Trace: + pos = self.TracePosition + if not self.tracePoint.isEqual(pos,1e-5): + try: + # check if the object is deleted + self.trace.Name + except Exception: + self.trace = None + if not self.trace: + self.trace = FreeCAD.ActiveDocument.addObject( + 'Part::Polygon','AsmTrace') + self.trace.Nodes = [self.tracePoint] + self.tracePoint = pos + self.trace.Nodes = {-1:pos} + self.trace.recompute() # self.draggerPlacement, which holds the intended dragger placement, is # updated by the above solver call through the following chain,