assembly: allow showing coordinate system in AsmElement
This commit is contained in:
parent
f60914035a
commit
76ef4515e1
134
assembly.py
134
assembly.py
|
@ -955,12 +955,16 @@ class ViewProviderAsmElement(ViewProviderAsmOnTop):
|
||||||
_iconDisabledName = 'Assembly_Assembly_ElementDetached.svg'
|
_iconDisabledName = 'Assembly_Assembly_ElementDetached.svg'
|
||||||
|
|
||||||
def __init__(self,vobj):
|
def __init__(self,vobj):
|
||||||
|
vobj.addProperty('App::PropertyBool',
|
||||||
|
'ShowCS','','Show coordinate cross')
|
||||||
vobj.ShapeColor = self.getDefaultColor()
|
vobj.ShapeColor = self.getDefaultColor()
|
||||||
vobj.PointColor = self.getDefaultColor()
|
vobj.PointColor = self.getDefaultColor()
|
||||||
vobj.LineColor = self.getDefaultColor()
|
vobj.LineColor = self.getDefaultColor()
|
||||||
vobj.Transparency = 50
|
vobj.Transparency = 50
|
||||||
vobj.LineWidth = 4
|
vobj.LineWidth = 4
|
||||||
vobj.PointSize = 4
|
vobj.PointSize = 4
|
||||||
|
self.axisNode = None
|
||||||
|
self.transNode = None
|
||||||
super(ViewProviderAsmElement,self).__init__(vobj)
|
super(ViewProviderAsmElement,self).__init__(vobj)
|
||||||
|
|
||||||
def attach(self,vobj):
|
def attach(self,vobj):
|
||||||
|
@ -995,10 +999,136 @@ class ViewProviderAsmElement(ViewProviderAsmOnTop):
|
||||||
getattr(self.ViewObject.Object,'Detach',False))
|
getattr(self.ViewObject.Object,'Detach',False))
|
||||||
|
|
||||||
def updateData(self,_obj,prop):
|
def updateData(self,_obj,prop):
|
||||||
if not hasattr(self,'ViewObject'):
|
vobj = getattr(self,'ViewObject',None)
|
||||||
|
if not vobj or FreeCAD.isRestoring():
|
||||||
return
|
return
|
||||||
if prop == 'Detach':
|
if prop == 'Detach':
|
||||||
self.ViewObject.signalChangeIcon()
|
vobj.signalChangeIcon()
|
||||||
|
elif prop in ('Placement','Shape','LinkedObject'):
|
||||||
|
self.setupAxis()
|
||||||
|
|
||||||
|
_AxisGroup = None
|
||||||
|
_Axis = None
|
||||||
|
_AxisMap = {'X':0,'Y':1,'Z':2}
|
||||||
|
|
||||||
|
def isCSVisible(self):
|
||||||
|
if self.ViewObject.ShowCS or gui.AsmCmdManager.ShowElementCS:
|
||||||
|
return True
|
||||||
|
obj = self.ViewObject.Object.getLinkedObject(True)
|
||||||
|
return obj and \
|
||||||
|
obj.isDerivedFrom('PartDesign::ViewProviderDatumCoordinateSystem')
|
||||||
|
|
||||||
|
def getElementPicked(self,pp):
|
||||||
|
vobj = self.ViewObject
|
||||||
|
det = pp.getDetail()
|
||||||
|
if self.isCSVisible() and self._Axis and det:
|
||||||
|
idx = pp.getPath().findNode(self._Axis)
|
||||||
|
if idx >= 0:
|
||||||
|
try:
|
||||||
|
from pivy import coin
|
||||||
|
ldx = coin.cast(det,'SoLineDetail').getLineIndex()
|
||||||
|
if ldx==0:
|
||||||
|
return 'X';
|
||||||
|
if ldx==1:
|
||||||
|
return 'Y';
|
||||||
|
if ldx==2:
|
||||||
|
return 'Z';
|
||||||
|
return None
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
return vobj.getElementPicked(pp)
|
||||||
|
|
||||||
|
def getDetailPath(self,subname,path,append):
|
||||||
|
vobj = self.ViewObject
|
||||||
|
node = getattr(self,'axisNode',None)
|
||||||
|
idx = self._AxisMap.get(subname,None)
|
||||||
|
if idx is not None and node:
|
||||||
|
cdx = vobj.RootNode.findChild(node)
|
||||||
|
if cdx >= 0:
|
||||||
|
if append:
|
||||||
|
path.append(vobj.RootNode)
|
||||||
|
elif path.getLength():
|
||||||
|
path.truncate(path.getLength()-1)
|
||||||
|
path.append(node)
|
||||||
|
path.append(node.getChild(0))
|
||||||
|
path.append(self._AxisGroup)
|
||||||
|
path.append(self._Axis)
|
||||||
|
from pivy import coin
|
||||||
|
detail = coin.SoLineDetail()
|
||||||
|
detail.setLineIndex(idx)
|
||||||
|
return detail
|
||||||
|
return vobj.getDetailPath(subname,path,append)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def getAxis(cls):
|
||||||
|
if cls._AxisGroup:
|
||||||
|
return cls._AxisGroup
|
||||||
|
from pivy import coin
|
||||||
|
autoZoom = coin.SoType.fromName(
|
||||||
|
'SoAutoZoomTranslation').createInstance()
|
||||||
|
mat = coin.SoMaterial()
|
||||||
|
mat.diffuseColor.setValues([[1.0, 0.0, 0.0],
|
||||||
|
[0.0, 0.6, 0.0],
|
||||||
|
[0.0, 0.0, 1.0]])
|
||||||
|
|
||||||
|
binding = coin.SoMaterialBinding()
|
||||||
|
binding.value = coin.SoMaterialBinding.PER_FACE_INDEXED
|
||||||
|
|
||||||
|
coords = coin.SoCoordinate3()
|
||||||
|
coords.point.setValues([[0.0, 0.0, 0.0],
|
||||||
|
[6.0, 0.0, 0.0],
|
||||||
|
[0.0, 6.0, 0.0],
|
||||||
|
[0.0, 0.0, 6.0]])
|
||||||
|
|
||||||
|
line = coin.SoType.fromName("SoBrepEdgeSet").createInstance()
|
||||||
|
line.coordIndex.setValues(0,9,[0,1,-1,0,2,-1,0,3,-1])
|
||||||
|
line.materialIndex.setValues([0,1,2])
|
||||||
|
|
||||||
|
draw = coin.SoDrawStyle()
|
||||||
|
draw.lineWidth = 2.0
|
||||||
|
|
||||||
|
group = coin.SoGroup()
|
||||||
|
group.addChild(autoZoom)
|
||||||
|
group.addChild(binding)
|
||||||
|
group.addChild(mat)
|
||||||
|
group.addChild(coords)
|
||||||
|
group.addChild(draw)
|
||||||
|
group.addChild(line)
|
||||||
|
|
||||||
|
cls._AxisGroup = group
|
||||||
|
cls._Axis = line
|
||||||
|
|
||||||
|
return group
|
||||||
|
|
||||||
|
def setupAxis(self):
|
||||||
|
vobj = self.ViewObject
|
||||||
|
switch = getattr(self,'axisNode',None)
|
||||||
|
if not self.isCSVisible():
|
||||||
|
if switch:
|
||||||
|
switch.whichChild = -1
|
||||||
|
return
|
||||||
|
|
||||||
|
if not switch:
|
||||||
|
from pivy import coin
|
||||||
|
switch = coin.SoSwitch()
|
||||||
|
node = coin.SoType.fromName('SoFCSelectionRoot').createInstance()
|
||||||
|
switch.addChild(node)
|
||||||
|
trans = coin.SoTransform()
|
||||||
|
node.addChild(trans)
|
||||||
|
node.addChild(self.getAxis())
|
||||||
|
self.axisNode = switch
|
||||||
|
self.transNode = trans
|
||||||
|
vobj.RootNode.addChild(switch)
|
||||||
|
switch.whichChild = 0
|
||||||
|
|
||||||
|
pla = vobj.Object.Placement.inverse().multiply(
|
||||||
|
utils.getElementPlacement(vobj.Object.Shape))
|
||||||
|
self.transNode.translation.setValue(pla.Base)
|
||||||
|
self.transNode.rotation.setValue(pla.Rotation.Q)
|
||||||
|
|
||||||
|
def onChanged(self,_vobj,prop):
|
||||||
|
if prop == 'ShowCS':
|
||||||
|
self.setupAxis()
|
||||||
|
|
||||||
|
|
||||||
class AsmElementSketch(AsmElement):
|
class AsmElementSketch(AsmElement):
|
||||||
|
|
43
gui.py
43
gui.py
|
@ -646,6 +646,8 @@ class AsmCmdAutoElementVis(AsmCmdCheckable):
|
||||||
_id = 9
|
_id = 9
|
||||||
_menuText = 'Auto element visibility'
|
_menuText = 'Auto element visibility'
|
||||||
_iconName = 'Assembly_AutoElementVis.svg'
|
_iconName = 'Assembly_AutoElementVis.svg'
|
||||||
|
_toolbarName = None
|
||||||
|
_menuGroupName = None
|
||||||
_saveParam = True
|
_saveParam = True
|
||||||
_defaultValue = True
|
_defaultValue = True
|
||||||
|
|
||||||
|
@ -672,6 +674,47 @@ class AsmCmdAutoElementVis(AsmCmdCheckable):
|
||||||
obj.ViewObject.OnTopWhenSelected = 2
|
obj.ViewObject.OnTopWhenSelected = 2
|
||||||
|
|
||||||
|
|
||||||
|
class AsmCmdShowElementCS(AsmCmdCheckable):
|
||||||
|
_id = 28
|
||||||
|
_menuText = 'Show element coordinate system'
|
||||||
|
_iconName = 'Assembly_ShowElementCS.svg'
|
||||||
|
_toolbarName = None
|
||||||
|
_menuGroupName = None
|
||||||
|
_saveParam = True
|
||||||
|
_defaultValue = False
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def IsActive(cls):
|
||||||
|
return True
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def Activated(cls,checked):
|
||||||
|
super(AsmCmdShowElementCS,cls).Activated(checked)
|
||||||
|
from .assembly import isTypeOf,AsmElement
|
||||||
|
for doc in FreeCAD.listDocuments().values():
|
||||||
|
for obj in doc.Objects:
|
||||||
|
if isTypeOf(obj,AsmElement):
|
||||||
|
obj.ViewObject.Proxy.setupAxis()
|
||||||
|
|
||||||
|
|
||||||
|
class AsmCmdElementCommand(AsmCmdBase):
|
||||||
|
_id = 29
|
||||||
|
_iconName = AsmCmdAutoElementVis._iconName
|
||||||
|
_menuText = AsmCmdAutoElementVis._menuText
|
||||||
|
_menuGroupName = ''
|
||||||
|
_toolbarName = AsmCmdBase._toolbarName
|
||||||
|
_cmds = (AsmCmdAutoElementVis.getName(),
|
||||||
|
AsmCmdShowElementCS.getName())
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def IsActive(cls):
|
||||||
|
return True
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def GetCommands(cls):
|
||||||
|
return cls._cmds
|
||||||
|
|
||||||
|
|
||||||
class AsmCmdAddWorkplane(AsmCmdBase):
|
class AsmCmdAddWorkplane(AsmCmdBase):
|
||||||
_id = 8
|
_id = 8
|
||||||
_menuText = 'Add workplane'
|
_menuText = 'Add workplane'
|
||||||
|
|
Loading…
Reference in New Issue
Block a user