Draft: Added utilities -> create Working Plane Proxy command
This commit is contained in:
parent
5bb2a5d4dd
commit
dd7b65a585
|
@ -63,7 +63,7 @@ class ArchWorkbench(Workbench):
|
|||
"Draft_FinishLine","Draft_CloseLine"]
|
||||
self.draftutils = ["Draft_VisGroup","Draft_Heal","Draft_FlipDimension",
|
||||
"Draft_ToggleConstructionMode","Draft_ToggleContinueMode","Draft_Edit",
|
||||
"Draft_Slope"]
|
||||
"Draft_Slope","Draft_SetWorkingPlaneProxy"]
|
||||
self.snapList = ['Draft_Snap_Lock','Draft_Snap_Midpoint','Draft_Snap_Perpendicular',
|
||||
'Draft_Snap_Grid','Draft_Snap_Intersection','Draft_Snap_Parallel',
|
||||
'Draft_Snap_Endpoint','Draft_Snap_Angle','Draft_Snap_Center',
|
||||
|
|
|
@ -3561,6 +3561,16 @@ def downgrade(objects,delete=False,force=None):
|
|||
return [addList,deleteList]
|
||||
|
||||
|
||||
def makeWorkingPlaneProxy(placement):
|
||||
"creates a Working Plane proxy object in the current document"
|
||||
if FreeCAD.ActiveDocument:
|
||||
obj = FreeCAD.ActiveDocument.addObject("App::FeaturePython","WPProxy")
|
||||
WorkingPlaneProxy(obj)
|
||||
if FreeCAD.GuiUp:
|
||||
ViewProviderWorkingPlaneProxy(obj.ViewObject)
|
||||
obj.Placement = placement
|
||||
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Python Features definitions
|
||||
#---------------------------------------------------------------------------
|
||||
|
@ -6047,4 +6057,174 @@ class _ViewProviderVisGroup:
|
|||
if vobj.Object.InList[0].isDerivedFrom("Drawing::FeaturePage"):
|
||||
vobj.Object.InList[0].touch()
|
||||
|
||||
|
||||
class WorkingPlaneProxy:
|
||||
|
||||
"The Draft working plane proxy object"
|
||||
|
||||
def __init__(self,obj):
|
||||
obj.Proxy = self
|
||||
obj.addProperty("App::PropertyPlacement","Placement","Base",QT_TRANSLATE_NOOP("App::Property","The placement of this object"))
|
||||
obj.addProperty("Part::PropertyPartShape","Shape","Base","")
|
||||
self.Type = "WorkingPlaneProxy"
|
||||
|
||||
def execute(self,obj):
|
||||
import Part
|
||||
l = 1
|
||||
if obj.ViewObject:
|
||||
if hasattr(obj.ViewObject,"DisplaySize"):
|
||||
l = obj.ViewObject.DisplaySize.Value
|
||||
p = Part.makePlane(l,l,Vector(l/2,-l/2,0),Vector(0,0,-1))
|
||||
# make sure the normal direction is pointing outwards, you never know what OCC will decide...
|
||||
if p.normalAt(0,0).getAngle(obj.Placement.Rotation.multVec(FreeCAD.Vector(0,0,1))) > 1:
|
||||
p.reverse()
|
||||
p.Placement = obj.Placement
|
||||
obj.Shape = p
|
||||
|
||||
def onChanged(self,obj,prop):
|
||||
pass
|
||||
|
||||
def getNormal(self,obj):
|
||||
return obj.Shape.Faces[0].normalAt(0,0)
|
||||
|
||||
def __getstate__(self):
|
||||
return self.Type
|
||||
|
||||
def __setstate__(self,state):
|
||||
if state:
|
||||
self.Type = state
|
||||
|
||||
|
||||
class ViewProviderWorkingPlaneProxy:
|
||||
|
||||
"A View Provider for working plane proxies"
|
||||
|
||||
def __init__(self,vobj):
|
||||
vobj.addProperty("App::PropertyLength","DisplaySize","Arch",QT_TRANSLATE_NOOP("App::Property","The display length of this section plane"))
|
||||
vobj.addProperty("App::PropertyLength","ArrowSize","Arch",QT_TRANSLATE_NOOP("App::Property","The size of the arrows of this section plane"))
|
||||
vobj.addProperty("App::PropertyPercent","Transparency","Base","")
|
||||
vobj.addProperty("App::PropertyFloat","LineWidth","Base","")
|
||||
vobj.addProperty("App::PropertyColor","LineColor","Base","")
|
||||
vobj.DisplaySize = 100
|
||||
vobj.ArrowSize = 5
|
||||
vobj.Transparency = 70
|
||||
vobj.LineWidth = 1
|
||||
vobj.LineColor = (0.0,0.25,0.25,1.0)
|
||||
vobj.Proxy = self
|
||||
self.Object = vobj.Object
|
||||
|
||||
def getIcon(self):
|
||||
import Draft_rc
|
||||
return ":/icons/Draft_SelectPlane.svg"
|
||||
|
||||
def claimChildren(self):
|
||||
return []
|
||||
|
||||
def attach(self,vobj):
|
||||
from pivy import coin
|
||||
self.clip = None
|
||||
self.mat1 = coin.SoMaterial()
|
||||
self.mat2 = coin.SoMaterial()
|
||||
self.fcoords = coin.SoCoordinate3()
|
||||
fs = coin.SoIndexedFaceSet()
|
||||
fs.coordIndex.setValues(0,7,[0,1,2,-1,0,2,3])
|
||||
self.drawstyle = coin.SoDrawStyle()
|
||||
self.drawstyle.style = coin.SoDrawStyle.LINES
|
||||
self.lcoords = coin.SoCoordinate3()
|
||||
ls = coin.SoType.fromName("SoBrepEdgeSet").createInstance()
|
||||
ls.coordIndex.setValues(0,28,[0,1,-1,2,3,4,5,-1,6,7,-1,8,9,10,11,-1,12,13,-1,14,15,16,17,-1,18,19,20,21])
|
||||
sep = coin.SoSeparator()
|
||||
psep = coin.SoSeparator()
|
||||
fsep = coin.SoSeparator()
|
||||
fsep.addChild(self.mat2)
|
||||
fsep.addChild(self.fcoords)
|
||||
fsep.addChild(fs)
|
||||
psep.addChild(self.mat1)
|
||||
psep.addChild(self.drawstyle)
|
||||
psep.addChild(self.lcoords)
|
||||
psep.addChild(ls)
|
||||
sep.addChild(fsep)
|
||||
sep.addChild(psep)
|
||||
vobj.addDisplayMode(sep,"Default")
|
||||
self.onChanged(vobj,"DisplaySize")
|
||||
self.onChanged(vobj,"LineColor")
|
||||
self.onChanged(vobj,"Transparency")
|
||||
|
||||
def getDisplayModes(self,vobj):
|
||||
return ["Default"]
|
||||
|
||||
def getDefaultDisplayMode(self):
|
||||
return "Default"
|
||||
|
||||
def setDisplayMode(self,mode):
|
||||
return mode
|
||||
|
||||
def updateData(self,obj,prop):
|
||||
if prop in ["Placement"]:
|
||||
self.onChanged(obj.ViewObject,"DisplaySize")
|
||||
return
|
||||
|
||||
def onChanged(self,vobj,prop):
|
||||
if prop == "LineColor":
|
||||
l = vobj.LineColor
|
||||
self.mat1.diffuseColor.setValue([l[0],l[1],l[2]])
|
||||
self.mat2.diffuseColor.setValue([l[0],l[1],l[2]])
|
||||
elif prop == "Transparency":
|
||||
if hasattr(vobj,"Transparency"):
|
||||
self.mat2.transparency.setValue(vobj.Transparency/100.0)
|
||||
elif prop in ["DisplaySize","ArrowSize"]:
|
||||
if hasattr(vobj,"DisplaySize"):
|
||||
l = vobj.DisplaySize.Value/2
|
||||
else:
|
||||
l = 1
|
||||
verts = []
|
||||
fverts = []
|
||||
l1 = 0.1
|
||||
if hasattr(vobj,"ArrowSize"):
|
||||
l1 = vobj.ArrowSize.Value if vobj.ArrowSize.Value > 0 else 0.1
|
||||
l2 = l1/3
|
||||
pl = FreeCAD.Placement(vobj.Object.Placement)
|
||||
fverts.append(pl.multVec(Vector(-l,-l,0)))
|
||||
fverts.append(pl.multVec(Vector(l,-l,0)))
|
||||
fverts.append(pl.multVec(Vector(l,l,0)))
|
||||
fverts.append(pl.multVec(Vector(-l,l,0)))
|
||||
|
||||
verts.append(pl.multVec(Vector(0,0,0)))
|
||||
verts.append(pl.multVec(Vector(l-l1,0,0)))
|
||||
verts.append(pl.multVec(Vector(l-l1,l2,0)))
|
||||
verts.append(pl.multVec(Vector(l,0,0)))
|
||||
verts.append(pl.multVec(Vector(l-l1,-l2,0)))
|
||||
verts.append(pl.multVec(Vector(l-l1,l2,0)))
|
||||
|
||||
verts.append(pl.multVec(Vector(0,0,0)))
|
||||
verts.append(pl.multVec(Vector(0,l-l1,0)))
|
||||
verts.append(pl.multVec(Vector(-l2,l-l1,0)))
|
||||
verts.append(pl.multVec(Vector(0,l,0)))
|
||||
verts.append(pl.multVec(Vector(l2,l-l1,0)))
|
||||
verts.append(pl.multVec(Vector(-l2,l-l1,0)))
|
||||
|
||||
verts.append(pl.multVec(Vector(0,0,0)))
|
||||
verts.append(pl.multVec(Vector(0,0,l-l1)))
|
||||
verts.append(pl.multVec(Vector(-l2,0,l-l1)))
|
||||
verts.append(pl.multVec(Vector(0,0,l)))
|
||||
verts.append(pl.multVec(Vector(l2,0,l-l1)))
|
||||
verts.append(pl.multVec(Vector(-l2,0,l-l1)))
|
||||
verts.append(pl.multVec(Vector(0,-l2,l-l1)))
|
||||
verts.append(pl.multVec(Vector(0,0,l)))
|
||||
verts.append(pl.multVec(Vector(0,l2,l-l1)))
|
||||
verts.append(pl.multVec(Vector(0,-l2,l-l1)))
|
||||
|
||||
self.lcoords.point.setValues(verts)
|
||||
self.fcoords.point.setValues(fverts)
|
||||
elif prop == "LineWidth":
|
||||
self.drawstyle.lineWidth = vobj.LineWidth
|
||||
return
|
||||
|
||||
def __getstate__(self):
|
||||
return None
|
||||
|
||||
def __setstate__(self,state):
|
||||
return None
|
||||
|
||||
|
||||
# @}
|
||||
|
|
|
@ -733,16 +733,6 @@ class DraftToolBar:
|
|||
maxwidth = maxwidth + 16 +10 # add icon width and a margin
|
||||
for i in pb:
|
||||
i.setMaximumWidth(maxwidth)
|
||||
|
||||
if (not self.taskmode) or self.tray:
|
||||
self.wplabel.setToolTip(translate("draft", "Set/unset a working plane"))
|
||||
self.colorButton.setToolTip(translate("draft", "Line Color"))
|
||||
self.facecolorButton.setToolTip(translate("draft", "Face Color"))
|
||||
self.widthButton.setToolTip(translate("draft", "Line Width"))
|
||||
self.fontsizeButton.setToolTip(translate("draft", "Font Size"))
|
||||
self.applyButton.setToolTip(translate("draft", "Apply to selected objects"))
|
||||
self.constrButton.setToolTip(translate("draft", "Toggles Construction Mode"))
|
||||
self.autoGroupButton.setToolTip(translate("draft", "Sets/unsets auto-grouping"))
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Interface modes
|
||||
|
|
|
@ -344,6 +344,11 @@ class SelectPlane(DraftTool):
|
|||
self.display(plane.axis)
|
||||
self.finish()
|
||||
return
|
||||
elif Draft.getType(sel.Object) == "WorkingPlaneProxy":
|
||||
plane.setFromPlacement(sel.Object.Placement,rebase=True)
|
||||
self.display(plane.axis)
|
||||
self.finish()
|
||||
return
|
||||
elif sel.HasSubObjects:
|
||||
if len(sel.SubElementNames) == 1:
|
||||
if "Face" in sel.SubElementNames[0]:
|
||||
|
@ -432,10 +437,10 @@ class SelectPlane(DraftTool):
|
|||
else: suffix = ''
|
||||
if type(arg).__name__ == 'str':
|
||||
self.ui.wplabel.setText(arg+suffix)
|
||||
self.ui.wplabel.setToolTip(translate("draft", "Current working plane:")+arg+suffix)
|
||||
elif type(arg).__name__ == 'Vector':
|
||||
plv = 'd('+str(arg.x)+','+str(arg.y)+','+str(arg.z)+')'
|
||||
self.ui.wplabel.setText(plv+suffix)
|
||||
self.ui.wplabel.setToolTip(translate("draft", "Current working plane:")+self.ui.wplabel.text())
|
||||
FreeCADGui.doCommandGui("FreeCADGui.Snapper.setGrid()")
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
|
@ -5056,6 +5061,28 @@ class SetAutoGroup():
|
|||
self.ui.setAutoGroup(self.groups[i])
|
||||
|
||||
|
||||
class SetWorkingPlaneProxy():
|
||||
"The SetWorkingPlaneProxy FreeCAD command definition"
|
||||
|
||||
def GetResources(self):
|
||||
return {'Pixmap' : 'Draft_SelectPlane',
|
||||
'MenuText': QtCore.QT_TRANSLATE_NOOP("Draft_SetWorkingPlaneProxy", "Create WP Proxy"),
|
||||
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Draft_SetWorkingPlaneProxy", "Creates a proxy object from the current working plane")}
|
||||
|
||||
def IsActive(self):
|
||||
if FreeCADGui.ActiveDocument:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def Activated(self):
|
||||
if hasattr(FreeCAD,"DraftWorkingPlane"):
|
||||
FreeCAD.ActiveDocument.openTransaction("Create WP proxy")
|
||||
FreeCADGui.addModule("Draft")
|
||||
FreeCADGui.doCommand("Draft.makeWorkingPlaneProxy(FreeCAD.DraftWorkingPlane.getPlacement())")
|
||||
FreeCAD.ActiveDocument.recompute()
|
||||
FreeCAD.ActiveDocument.commitTransaction()
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Snap tools
|
||||
#---------------------------------------------------------------------------
|
||||
|
@ -5298,6 +5325,7 @@ FreeCADGui.addCommand('Draft_ShowSnapBar',ShowSnapBar())
|
|||
FreeCADGui.addCommand('Draft_ToggleGrid',ToggleGrid())
|
||||
FreeCADGui.addCommand('Draft_FlipDimension',Draft_FlipDimension())
|
||||
FreeCADGui.addCommand('Draft_AutoGroup',SetAutoGroup())
|
||||
FreeCADGui.addCommand('Draft_SetWorkingPlaneProxy',SetWorkingPlaneProxy())
|
||||
|
||||
# snap commands
|
||||
FreeCADGui.addCommand('Draft_Snap_Lock',Draft_Snap_Lock())
|
||||
|
|
|
@ -83,7 +83,7 @@ class DraftWorkbench (Workbench):
|
|||
self.lineList = ["Draft_UndoLine","Draft_FinishLine","Draft_CloseLine"]
|
||||
self.utils = ["Draft_VisGroup","Draft_Heal","Draft_FlipDimension",
|
||||
"Draft_ToggleConstructionMode","Draft_ToggleContinueMode","Draft_Edit",
|
||||
"Draft_Slope"]
|
||||
"Draft_Slope","Draft_SetWorkingPlaneProxy"]
|
||||
self.snapList = ['Draft_Snap_Lock','Draft_Snap_Midpoint','Draft_Snap_Perpendicular',
|
||||
'Draft_Snap_Grid','Draft_Snap_Intersection','Draft_Snap_Parallel',
|
||||
'Draft_Snap_Endpoint','Draft_Snap_Angle','Draft_Snap_Center',
|
||||
|
|
|
@ -311,12 +311,14 @@ class plane:
|
|||
0.0,0.0,0.0,1.0)
|
||||
return FreeCAD.Placement(m)
|
||||
|
||||
def setFromPlacement(self,pl):
|
||||
"sets the working plane from a placement (rotaton ONLY)"
|
||||
def setFromPlacement(self,pl,rebase=False):
|
||||
"sets the working plane from a placement (rotaton ONLY, unless rebaee=True)"
|
||||
rot = FreeCAD.Placement(pl).Rotation
|
||||
self.u = rot.multVec(FreeCAD.Vector(1,0,0))
|
||||
self.v = rot.multVec(FreeCAD.Vector(0,1,0))
|
||||
self.axis = rot.multVec(FreeCAD.Vector(0,0,1))
|
||||
if rebase:
|
||||
self.position = pl.Base
|
||||
|
||||
def inverse(self):
|
||||
"inverts the direction of the working plane"
|
||||
|
|
Loading…
Reference in New Issue
Block a user