mover: support tracing any geometry element

This commit is contained in:
Zheng, Lei 2018-01-29 17:15:27 +08:00
parent 6917d3897e
commit d4992a4706
3 changed files with 62 additions and 19 deletions

View File

@ -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)

33
gui.py
View File

@ -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'

View File

@ -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,