Draft: Enhancements to Working Plane selection UI
This commit is contained in:
@@ -441,9 +441,11 @@ class DraftToolBar:
|
||||
layout.addWidget(button)
|
||||
return button
|
||||
|
||||
def _label (self,name, layout, hide=True):
|
||||
def _label (self,name, layout, hide=True,wrap=False):
|
||||
label = QtGui.QLabel(self.baseWidget)
|
||||
label.setObjectName(name)
|
||||
if wrap:
|
||||
label.setWordWrap(True)
|
||||
if hide: label.hide()
|
||||
layout.addWidget(label)
|
||||
return label
|
||||
@@ -580,6 +582,7 @@ class DraftToolBar:
|
||||
|
||||
# options
|
||||
|
||||
self.WPLabel = self._label("WPLabel", self.layout,wrap=True)
|
||||
fl = QtGui.QHBoxLayout()
|
||||
self.layout.addLayout(fl)
|
||||
self.numFacesLabel = self._label("numfaceslabel", fl)
|
||||
@@ -642,7 +645,15 @@ class DraftToolBar:
|
||||
self.layout.addLayout(ml)
|
||||
self.mainlineLabel = self._label("mainlineLabel", ml)
|
||||
self.mainlineValue = self._spinbox("mainlineValue", ml)
|
||||
self.centerPlane = self._checkbox("centerPlane",self.layout,checked = self.isCenterPlane)
|
||||
gl = QtGui.QHBoxLayout()
|
||||
self.layout.addLayout(gl)
|
||||
self.centerLabel = self._label("centerLabel", gl)
|
||||
self.centerPlane = self._checkbox("centerPlane",gl,checked = self.isCenterPlane)
|
||||
gl = QtGui.QHBoxLayout()
|
||||
self.layout.addLayout(gl)
|
||||
self.snapLabel = self._label("snapLabel", gl)
|
||||
self.snapValue = self._spinbox("snapValue", gl)
|
||||
self.snapValue.setValue(Draft.getParam("snapRange",5))
|
||||
|
||||
# spacer
|
||||
if not self.taskmode:
|
||||
@@ -714,6 +725,7 @@ class DraftToolBar:
|
||||
QtCore.QObject.connect(self.gridValue,QtCore.SIGNAL("textEdited(QString)"),self.setGridSize)
|
||||
QtCore.QObject.connect(self.mainlineValue,QtCore.SIGNAL("valueChanged(int)"),self.setMainline)
|
||||
QtCore.QObject.connect(self.centerPlane,QtCore.SIGNAL("stateChanged(int)"),self.setCenterPlane)
|
||||
QtCore.QObject.connect(self.snapValue,QtCore.SIGNAL("valueChanged(int)"),self.setSnapValue)
|
||||
|
||||
# following lines can cause a crash and are not needed anymore when using the task panel
|
||||
# http://forum.freecadweb.org/viewtopic.php?f=3&t=6952
|
||||
@@ -817,6 +829,7 @@ class DraftToolBar:
|
||||
self.finishButton.setToolTip(translate("draft", "Finishes the current drawing or editing operation"))
|
||||
self.continueCmd.setToolTip(translate("draft", "If checked, command will not finish until you press the command button again"))
|
||||
self.continueCmd.setText(translate("draft", "Continue")+" ("+inCommandShortcuts["Continue"][0]+")")
|
||||
self.WPLabel.setText(translate("draft", "Select a face or working plane proxy or 3 vertices, or choose one of the options below"))
|
||||
self.occOffset.setToolTip(translate("draft", "If checked, an OCC-style offset will be performed instead of the classic offset"))
|
||||
self.occOffset.setText(translate("draft", "&OCC-style offset"))
|
||||
self.addButton.setToolTip(translate("draft", "Add points to the current object"))
|
||||
@@ -839,15 +852,15 @@ class DraftToolBar:
|
||||
self.numFaces.setToolTip(translate("draft", "Number of sides"))
|
||||
self.offsetLabel.setText(translate("draft", "Offset"))
|
||||
self.xyButton.setText(translate("draft", "XY (top)"))
|
||||
self.xyButton.setToolTip(translate("draft", "Select XY plane"))
|
||||
self.xyButton.setToolTip(translate("draft", "Sets the working plane on the ground XY plane"))
|
||||
self.xzButton.setText(translate("draft", "XZ (front)"))
|
||||
self.xzButton.setToolTip(translate("draft", "Select XZ plane"))
|
||||
self.xzButton.setToolTip(translate("draft", "Sets the working plane on the front XZ plane"))
|
||||
self.yzButton.setText(translate("draft", "YZ (side)"))
|
||||
self.yzButton.setToolTip(translate("draft", "Select YZ plane"))
|
||||
self.yzButton.setToolTip(translate("draft", "Setsthe working plane on the side YZ plane"))
|
||||
self.currentViewButton.setText(translate("draft", "View"))
|
||||
self.currentViewButton.setToolTip(translate("draft", "Select plane perpendicular to the current view"))
|
||||
self.resetPlaneButton.setText(translate("draft", "Auto"))
|
||||
self.resetPlaneButton.setToolTip(translate("draft", "Do not project points to a drawing plane"))
|
||||
self.currentViewButton.setToolTip(translate("draft", "Sets the working plane perpendicular to the current view"))
|
||||
self.resetPlaneButton.setText(translate("draft", "Automatic"))
|
||||
self.resetPlaneButton.setToolTip(translate("draft", "The working plane adapts to the current view when a command is started"))
|
||||
self.isCopy.setText(translate("draft", "Copy")+" ("+inCommandShortcuts["Copy"][0]+")")
|
||||
self.isCopy.setToolTip(translate("draft", "If checked, objects will be copied instead of moved. Preferences -> Draft -> Global copy mode to keep this mode in next commands"))
|
||||
self.isSubelementMode.setText(translate("draft", "Modify subelements")+" ("+inCommandShortcuts["SubelementMode"][0]+")")
|
||||
@@ -864,7 +877,10 @@ class DraftToolBar:
|
||||
self.gridValue.setToolTip(translate("draft", "The spacing between the grid lines"))
|
||||
self.mainlineLabel.setText(translate("draft", "Main line every"))
|
||||
self.mainlineValue.setToolTip(translate("draft", "The number of lines between main lines"))
|
||||
self.centerPlane.setText(translate("draft", "Center plane on view"))
|
||||
self.centerLabel.setText(translate("draft", "Center plane on view"))
|
||||
self.centerPlane.setToolTip(translate("draft", "Centers the working plane on the current view"))
|
||||
self.snapLabel.setText(translate("draft", "Snapping radius"))
|
||||
self.snapValue.setToolTip(translate("draft", "This is the distance in screen pixels under which a point will be snapped. You can also change the radius while drawing, using keys")+" "+inCommandShortcuts["Increase"][0]+" , "+inCommandShortcuts["Decrease"][0])
|
||||
self.retranslateTray(widget)
|
||||
|
||||
# Update the maximum width of the push buttons
|
||||
@@ -934,7 +950,7 @@ class DraftToolBar:
|
||||
if FreeCADGui.Control.activeDialog():
|
||||
FreeCADGui.Control.closeDialog()
|
||||
todo.delay(FreeCADGui.Control.showDialog,dummy(extra))
|
||||
self.setTitle(title)
|
||||
self.setTitle(title,icon)
|
||||
|
||||
def redraw(self):
|
||||
"utility function that is performed after each clicked point"
|
||||
@@ -959,7 +975,8 @@ class DraftToolBar:
|
||||
self.zValue.selectAll()
|
||||
|
||||
def selectPlaneUi(self):
|
||||
self.taskUi(translate("draft", "Select Plane"))
|
||||
self.taskUi(title=translate("draft", "Working plane setup"),icon="Draft_SelectPlane")
|
||||
self.WPLabel.show()
|
||||
self.xyButton.show()
|
||||
self.xzButton.show()
|
||||
self.yzButton.show()
|
||||
@@ -975,7 +992,12 @@ class DraftToolBar:
|
||||
self.mainlineValue.show()
|
||||
p = Draft.getParam("gridEvery",10)
|
||||
self.mainlineValue.setValue(p)
|
||||
self.centerLabel.show()
|
||||
self.centerPlane.show()
|
||||
self.snapLabel.show()
|
||||
self.snapValue.show()
|
||||
p = Draft.getParam("snapRange",5)
|
||||
self.snapValue.setValue(p)
|
||||
|
||||
def extraLineUi(self):
|
||||
'''shows length and angle controls'''
|
||||
@@ -1154,7 +1176,11 @@ class DraftToolBar:
|
||||
self.gridValue.hide()
|
||||
self.mainlineLabel.hide()
|
||||
self.mainlineValue.hide()
|
||||
self.centerLabel.hide()
|
||||
self.centerPlane.hide()
|
||||
self.snapLabel.hide()
|
||||
self.snapValue.hide()
|
||||
self.WPLabel.hide()
|
||||
|
||||
def trimUi(self,title=translate("draft","Trim")):
|
||||
self.taskUi(title)
|
||||
@@ -2122,6 +2148,11 @@ class DraftToolBar:
|
||||
Draft.setParam("snapRange",par+val)
|
||||
FreeCADGui.Snapper.showradius()
|
||||
|
||||
def setSnapValue(self,val):
|
||||
Draft.setParam("snapRange",val)
|
||||
if hasattr(FreeCADGui,"Snapper"):
|
||||
FreeCADGui.Snapper.showradius()
|
||||
|
||||
def constrain(self,val):
|
||||
if val == "angle":
|
||||
self.alock = not(self.alock)
|
||||
|
||||
@@ -326,116 +326,7 @@ class SelectPlane(DraftTool):
|
||||
DraftTool.Activated(self)
|
||||
self.offset = 0
|
||||
if self.doc:
|
||||
sel = FreeCADGui.Selection.getSelectionEx()
|
||||
if len(sel) == 1:
|
||||
sel = sel[0]
|
||||
self.ui = FreeCADGui.draftToolBar
|
||||
if Draft.getType(sel.Object) == "Axis":
|
||||
plane.alignToEdges(sel.Object.Shape.Edges)
|
||||
self.display(plane.axis)
|
||||
self.finish()
|
||||
return
|
||||
elif Draft.getType(sel.Object) in ["WorkingPlaneProxy","BuildingPart"]:
|
||||
plane.setFromPlacement(sel.Object.Placement,rebase=True)
|
||||
plane.weak = False
|
||||
if hasattr(sel.Object.ViewObject,"AutoWorkingPlane"):
|
||||
if sel.Object.ViewObject.AutoWorkingPlane:
|
||||
plane.weak = True
|
||||
if hasattr(sel.Object.ViewObject,"RestoreView"):
|
||||
if sel.Object.ViewObject.RestoreView:
|
||||
if hasattr(sel.Object.ViewObject,"ViewData"):
|
||||
if len(sel.Object.ViewObject.ViewData) >= 12:
|
||||
d = sel.Object.ViewObject.ViewData
|
||||
camtype = "orthographic"
|
||||
if len(sel.Object.ViewObject.ViewData) == 13:
|
||||
if d[12] == 1:
|
||||
camtype = "perspective"
|
||||
c = FreeCADGui.ActiveDocument.ActiveView.getCameraNode()
|
||||
from pivy import coin
|
||||
if isinstance(c,coin.SoOrthographicCamera):
|
||||
if camtype == "perspective":
|
||||
FreeCADGui.ActiveDocument.ActiveView.setCameraType("Perspective")
|
||||
elif isinstance(c,coin.SoPerspectiveCamera):
|
||||
if camtype == "orthographic":
|
||||
FreeCADGui.ActiveDocument.ActiveView.setCameraType("Orthographic")
|
||||
c = FreeCADGui.ActiveDocument.ActiveView.getCameraNode()
|
||||
c.position.setValue([d[0],d[1],d[2]])
|
||||
c.orientation.setValue([d[3],d[4],d[5],d[6]])
|
||||
c.nearDistance.setValue(d[7])
|
||||
c.farDistance.setValue(d[8])
|
||||
c.aspectRatio.setValue(d[9])
|
||||
c.focalDistance.setValue(d[10])
|
||||
if camtype == "orthographic":
|
||||
c.height.setValue(d[11])
|
||||
else:
|
||||
c.heightAngle.setValue(d[11])
|
||||
if hasattr(sel.Object.ViewObject,"RestoreState"):
|
||||
if sel.Object.ViewObject.RestoreState:
|
||||
if hasattr(sel.Object.ViewObject,"VisibilityMap"):
|
||||
if sel.Object.ViewObject.VisibilityMap:
|
||||
for k,v in sel.Object.ViewObject.VisibilityMap.items():
|
||||
o = FreeCADGui.ActiveDocument.getObject(k)
|
||||
if o:
|
||||
if o.Visibility != (v == "True"):
|
||||
FreeCADGui.doCommand("FreeCADGui.ActiveDocument.getObject(\""+k+"\").Visibility = "+v)
|
||||
self.display(plane.axis)
|
||||
self.ui.wplabel.setText(sel.Object.Label)
|
||||
self.ui.wplabel.setToolTip(translate("draft", "Current working plane")+": "+self.ui.wplabel.text())
|
||||
self.finish()
|
||||
return
|
||||
elif Draft.getType(sel.Object) == "SectionPlane":
|
||||
plane.setFromPlacement(sel.Object.Placement,rebase=True)
|
||||
plane.weak = False
|
||||
self.display(plane.axis)
|
||||
self.ui.wplabel.setText(sel.Object.Label)
|
||||
self.ui.wplabel.setToolTip(translate("draft", "Current working plane")+": "+self.ui.wplabel.text())
|
||||
self.finish()
|
||||
return
|
||||
elif sel.HasSubObjects:
|
||||
if len(sel.SubElementNames) == 1:
|
||||
if "Face" in sel.SubElementNames[0]:
|
||||
plane.alignToFace(sel.SubObjects[0], self.offset)
|
||||
self.display(plane.axis)
|
||||
self.finish()
|
||||
return
|
||||
elif sel.SubElementNames[0] == "Plane":
|
||||
plane.setFromPlacement(sel.Object.Placement,rebase=True)
|
||||
self.display(plane.axis)
|
||||
self.finish()
|
||||
return
|
||||
elif len(sel.SubElementNames) == 3:
|
||||
if ("Vertex" in sel.SubElementNames[0]) \
|
||||
and ("Vertex" in sel.SubElementNames[1]) \
|
||||
and ("Vertex" in sel.SubElementNames[2]):
|
||||
plane.alignTo3Points(sel.SubObjects[0].Point,
|
||||
sel.SubObjects[1].Point,
|
||||
sel.SubObjects[2].Point,
|
||||
self.offset)
|
||||
self.display(plane.axis)
|
||||
self.finish()
|
||||
return
|
||||
elif sel.Object.isDerivedFrom("Part::Feature"):
|
||||
if sel.Object.Shape:
|
||||
if len(sel.Object.Shape.Faces) == 1:
|
||||
plane.alignToFace(sel.Object.Shape.Faces[0], self.offset)
|
||||
self.display(plane.axis)
|
||||
self.finish()
|
||||
return
|
||||
elif sel:
|
||||
subs = []
|
||||
import Part
|
||||
for s in sel:
|
||||
for so in s.SubObjects:
|
||||
if isinstance(so,Part.Vertex):
|
||||
subs.append(so)
|
||||
if len(subs) == 3:
|
||||
plane.alignTo3Points(subs[0].Point,
|
||||
subs[1].Point,
|
||||
subs[2].Point,
|
||||
self.offset)
|
||||
self.display(plane.axis)
|
||||
self.finish()
|
||||
return
|
||||
|
||||
self.ui.selectPlaneUi()
|
||||
msg(translate("draft", "Pick a face to define the drawing plane")+"\n")
|
||||
if plane.alignToSelection(self.offset):
|
||||
@@ -450,19 +341,117 @@ class SelectPlane(DraftTool):
|
||||
self.finish()
|
||||
if arg["Type"] == "SoMouseButtonEvent":
|
||||
if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"):
|
||||
cursor = arg["Position"]
|
||||
doc = FreeCADGui.ActiveDocument
|
||||
info = Draft.get3DView().getObjectInfo((cursor[0],cursor[1]))
|
||||
if info:
|
||||
try:
|
||||
shape = doc.getObject(info["Object"]).Object.Shape
|
||||
component = getattr(shape, info["Component"])
|
||||
if plane.alignToFace(component, self.offset) \
|
||||
or plane.alignToCurve(component, self.offset):
|
||||
self.display(plane.axis)
|
||||
self.finish()
|
||||
except:
|
||||
pass
|
||||
# coin detection happens before the selection got a chance of being updated, sowe must delay
|
||||
DraftGui.todo.delay(self.checkSelection,None)
|
||||
|
||||
def checkSelection(self):
|
||||
if self.handle():
|
||||
self.finish()
|
||||
|
||||
def handle(self):
|
||||
sel = FreeCADGui.Selection.getSelectionEx()
|
||||
if len(sel) == 1:
|
||||
sel = sel[0]
|
||||
self.ui = FreeCADGui.draftToolBar
|
||||
if Draft.getType(sel.Object) == "Axis":
|
||||
plane.alignToEdges(sel.Object.Shape.Edges)
|
||||
self.display(plane.axis)
|
||||
return True
|
||||
elif Draft.getType(sel.Object) in ["WorkingPlaneProxy","BuildingPart"]:
|
||||
plane.setFromPlacement(sel.Object.Placement,rebase=True)
|
||||
plane.weak = False
|
||||
if hasattr(sel.Object.ViewObject,"AutoWorkingPlane"):
|
||||
if sel.Object.ViewObject.AutoWorkingPlane:
|
||||
plane.weak = True
|
||||
if hasattr(sel.Object.ViewObject,"RestoreView"):
|
||||
if sel.Object.ViewObject.RestoreView:
|
||||
if hasattr(sel.Object.ViewObject,"ViewData"):
|
||||
if len(sel.Object.ViewObject.ViewData) >= 12:
|
||||
d = sel.Object.ViewObject.ViewData
|
||||
camtype = "orthographic"
|
||||
if len(sel.Object.ViewObject.ViewData) == 13:
|
||||
if d[12] == 1:
|
||||
camtype = "perspective"
|
||||
c = FreeCADGui.ActiveDocument.ActiveView.getCameraNode()
|
||||
from pivy import coin
|
||||
if isinstance(c,coin.SoOrthographicCamera):
|
||||
if camtype == "perspective":
|
||||
FreeCADGui.ActiveDocument.ActiveView.setCameraType("Perspective")
|
||||
elif isinstance(c,coin.SoPerspectiveCamera):
|
||||
if camtype == "orthographic":
|
||||
FreeCADGui.ActiveDocument.ActiveView.setCameraType("Orthographic")
|
||||
c = FreeCADGui.ActiveDocument.ActiveView.getCameraNode()
|
||||
c.position.setValue([d[0],d[1],d[2]])
|
||||
c.orientation.setValue([d[3],d[4],d[5],d[6]])
|
||||
c.nearDistance.setValue(d[7])
|
||||
c.farDistance.setValue(d[8])
|
||||
c.aspectRatio.setValue(d[9])
|
||||
c.focalDistance.setValue(d[10])
|
||||
if camtype == "orthographic":
|
||||
c.height.setValue(d[11])
|
||||
else:
|
||||
c.heightAngle.setValue(d[11])
|
||||
if hasattr(sel.Object.ViewObject,"RestoreState"):
|
||||
if sel.Object.ViewObject.RestoreState:
|
||||
if hasattr(sel.Object.ViewObject,"VisibilityMap"):
|
||||
if sel.Object.ViewObject.VisibilityMap:
|
||||
for k,v in sel.Object.ViewObject.VisibilityMap.items():
|
||||
o = FreeCADGui.ActiveDocument.getObject(k)
|
||||
if o:
|
||||
if o.Visibility != (v == "True"):
|
||||
FreeCADGui.doCommand("FreeCADGui.ActiveDocument.getObject(\""+k+"\").Visibility = "+v)
|
||||
self.display(plane.axis)
|
||||
self.ui.wplabel.setText(sel.Object.Label)
|
||||
self.ui.wplabel.setToolTip(translate("draft", "Current working plane")+": "+self.ui.wplabel.text())
|
||||
return True
|
||||
elif Draft.getType(sel.Object) == "SectionPlane":
|
||||
plane.setFromPlacement(sel.Object.Placement,rebase=True)
|
||||
plane.weak = False
|
||||
self.display(plane.axis)
|
||||
self.ui.wplabel.setText(sel.Object.Label)
|
||||
self.ui.wplabel.setToolTip(translate("draft", "Current working plane")+": "+self.ui.wplabel.text())
|
||||
return True
|
||||
elif sel.HasSubObjects:
|
||||
if len(sel.SubElementNames) == 1:
|
||||
if "Face" in sel.SubElementNames[0]:
|
||||
plane.alignToFace(sel.SubObjects[0], self.offset)
|
||||
self.display(plane.axis)
|
||||
return True
|
||||
elif sel.SubElementNames[0] == "Plane":
|
||||
plane.setFromPlacement(sel.Object.Placement,rebase=True)
|
||||
self.display(plane.axis)
|
||||
return True
|
||||
elif len(sel.SubElementNames) == 3:
|
||||
if ("Vertex" in sel.SubElementNames[0]) \
|
||||
and ("Vertex" in sel.SubElementNames[1]) \
|
||||
and ("Vertex" in sel.SubElementNames[2]):
|
||||
plane.alignTo3Points(sel.SubObjects[0].Point,
|
||||
sel.SubObjects[1].Point,
|
||||
sel.SubObjects[2].Point,
|
||||
self.offset)
|
||||
self.display(plane.axis)
|
||||
return True
|
||||
elif sel.Object.isDerivedFrom("Part::Feature"):
|
||||
if sel.Object.Shape:
|
||||
if len(sel.Object.Shape.Faces) == 1:
|
||||
plane.alignToFace(sel.Object.Shape.Faces[0], self.offset)
|
||||
self.display(plane.axis)
|
||||
return True
|
||||
elif sel:
|
||||
subs = []
|
||||
import Part
|
||||
for s in sel:
|
||||
for so in s.SubObjects:
|
||||
if isinstance(so,Part.Vertex):
|
||||
subs.append(so)
|
||||
if len(subs) == 3:
|
||||
plane.alignTo3Points(subs[0].Point,
|
||||
subs[1].Point,
|
||||
subs[2].Point,
|
||||
self.offset)
|
||||
self.display(plane.axis)
|
||||
return True
|
||||
return False
|
||||
|
||||
def getCenterPoint(self,x,y,z):
|
||||
if not self.ui.isCenterPlane:
|
||||
@@ -1068,7 +1057,7 @@ class CubicBezCurve(Line):
|
||||
if ((self.point-self.node[0]).Length < Draft.tolerance()) and len(self.node) >= 4:
|
||||
#self.undolast()
|
||||
self.node=self.node[0:-2]
|
||||
self.node.append(2 * self.node[0] - self.node[1]) #close the curve with a smooth simmetric knot
|
||||
self.node.append(2 * self.node[0] - self.node[1]) #close the curve with a smooth simmetric knot
|
||||
self.finish(True,cont=True)
|
||||
msg(translate("draft", "Bezier curve has been closed")+"\n")
|
||||
if (arg["State"] == "UP") and (arg["Button"] == "BUTTON1"): #left click
|
||||
@@ -1088,7 +1077,7 @@ class CubicBezCurve(Line):
|
||||
self.finish(False,cont=True)
|
||||
if (len(self.node) > 2): #does this make sense for a BCurve?
|
||||
self.node[-3] = 2 * self.node[-2] - self.node[-1]
|
||||
self.drawUpdate(self.point)
|
||||
self.drawUpdate(self.point)
|
||||
# DNC: allows to close the curve
|
||||
# by placing ends close to each other
|
||||
# with tol = Draft tolerance
|
||||
@@ -1117,19 +1106,19 @@ class CubicBezCurve(Line):
|
||||
'''creates shape for display during creation process.'''
|
||||
# not quite right. draws 1 big bez. sb segmented
|
||||
edges = []
|
||||
|
||||
|
||||
if len(pts) >= 2: #allow lower degree segment
|
||||
poles=pts[1:]
|
||||
else:
|
||||
poles=[]
|
||||
|
||||
|
||||
if self.degree:
|
||||
segpoleslst = [poles[x:x+self.degree] for x in range(0, len(poles), (self.degree or 1))]
|
||||
else:
|
||||
segpoleslst = [pts]
|
||||
|
||||
|
||||
startpoint=pts[0]
|
||||
|
||||
|
||||
for segpoles in segpoleslst:
|
||||
c = Part.BezierCurve() #last segment may have lower degree
|
||||
c.increase(len(segpoles))
|
||||
@@ -4555,7 +4544,7 @@ class Edit(Modifier):
|
||||
msg(translate("draft", "Please select only one object")+"\n",'warning')
|
||||
self.finish()
|
||||
return
|
||||
else:
|
||||
else:
|
||||
self.ghost = None
|
||||
self.ui.selectUi()
|
||||
msg(translate("draft", "Select a Draft object to edit")+"\n")
|
||||
@@ -4591,33 +4580,33 @@ class Edit(Modifier):
|
||||
if hasattr(self.obj.ViewObject,"Selectable"):
|
||||
self.selectstate = self.obj.ViewObject.Selectable
|
||||
self.obj.ViewObject.Selectable = False
|
||||
|
||||
|
||||
FreeCADGui.Selection.clearSelection()
|
||||
self.editing = None
|
||||
self.editpoints = []
|
||||
self.pl = None
|
||||
self.arc3Pt = False
|
||||
FreeCADGui.Snapper.setSelectMode(True)
|
||||
|
||||
|
||||
# Edit Gui setup is moved inside each kind of object
|
||||
|
||||
|
||||
# overwrite self.obj to match the right editing target
|
||||
if Draft.getType(self.obj) == "Wall":
|
||||
if Draft.getType(self.obj.Base) in ["Wire","Circle","Rectangle",
|
||||
"Polygon"]:
|
||||
self.obj=self.obj.Base
|
||||
|
||||
|
||||
if "Placement" in self.obj.PropertiesList:
|
||||
self.pl = self.obj.Placement
|
||||
self.invpl = self.pl.inverse()
|
||||
# setup of different object type (set editUi, set editTrackers)
|
||||
|
||||
|
||||
if Draft.getType(self.obj) in ["Wire","BSpline"]:
|
||||
self.ui.editUi("Wire")
|
||||
for p in self.obj.Points:
|
||||
if self.pl: p = self.pl.multVec(p)
|
||||
self.editpoints.append(p)
|
||||
|
||||
|
||||
elif Draft.getType(self.obj) == "BezCurve":
|
||||
self.ui.editUi("BezCurve")
|
||||
self.resetTrackersBezier()
|
||||
@@ -4629,7 +4618,7 @@ class Edit(Modifier):
|
||||
if self.planetrack:
|
||||
self.planetrack.set(self.obj.Shape.Edges[0].Curve.\
|
||||
getPole(1))
|
||||
|
||||
|
||||
elif Draft.getType(self.obj) == "Circle":
|
||||
self.setCirclePts()
|
||||
|
||||
@@ -4644,12 +4633,12 @@ class Edit(Modifier):
|
||||
self.by = v[2].Point.sub(v[1].Point)
|
||||
if self.obj.Height < 0:
|
||||
self.by = self.by.negative()
|
||||
|
||||
|
||||
elif Draft.getType(self.obj) == "Polygon":
|
||||
self.ui.editUi()
|
||||
self.editpoints.append(self.obj.Placement.Base)
|
||||
self.editpoints.append(self.obj.Shape.Vertexes[0].Point)
|
||||
|
||||
|
||||
elif Draft.getType(self.obj) == "Dimension":
|
||||
self.ui.editUi()
|
||||
p = self.obj.ViewObject.Proxy.textpos.translation.getValue()
|
||||
@@ -4657,7 +4646,7 @@ class Edit(Modifier):
|
||||
self.editpoints.append(self.obj.End)
|
||||
self.editpoints.append(self.obj.Dimline)
|
||||
self.editpoints.append(Vector(p[0],p[1],p[2]))
|
||||
|
||||
|
||||
elif Draft.getType(self.obj) == "Wall":
|
||||
self.ui.editUi()
|
||||
if Draft.getType(self.obj.Base) == "Sketch":
|
||||
@@ -4666,7 +4655,7 @@ class Edit(Modifier):
|
||||
self.editpoints.append(self.obj.Base.getPoint(0,2))
|
||||
else:
|
||||
msg(translate("draft","Wall base sketch is too complex to edit: it's suggested to edit directly the sketch")+"\n",'warning')
|
||||
|
||||
|
||||
elif Draft.getType(self.obj) == "Window":
|
||||
msg("Window was found \n")
|
||||
self.ui.editUi()
|
||||
@@ -4680,14 +4669,14 @@ class Edit(Modifier):
|
||||
pos.y+float(self.obj.Width)*math.sin(angle-math.pi/2),
|
||||
pos.z))
|
||||
self.editpoints.append(FreeCAD.Vector(pos.x,pos.y,h))
|
||||
|
||||
|
||||
elif Draft.getType(self.obj) == "Space":
|
||||
self.ui.editUi()
|
||||
try:
|
||||
self.editpoints.append(self.obj.ViewObject.Proxy.getTextPosition(self.obj.ViewObject))
|
||||
except:
|
||||
pass
|
||||
|
||||
|
||||
elif Draft.getType(self.obj) == "Structure":
|
||||
self.ui.editUi()
|
||||
if self.obj.Nodes:
|
||||
@@ -4701,7 +4690,7 @@ class Edit(Modifier):
|
||||
if self.pl:
|
||||
p = self.pl.multVec(p)
|
||||
self.editpoints.append(p)
|
||||
|
||||
|
||||
elif Draft.getType(self.obj) == "PanelCut":
|
||||
self.ui.editUi()
|
||||
if self.obj.TagPosition.Length == 0:
|
||||
@@ -4709,7 +4698,7 @@ class Edit(Modifier):
|
||||
else:
|
||||
pos = self.pl.multVec(self.obj.TagPosition)
|
||||
self.editpoints.append(pos)
|
||||
|
||||
|
||||
elif Draft.getType(self.obj) == "PanelSheet":
|
||||
self.ui.editUi()
|
||||
self.editpoints.append(self.pl.multVec(self.obj.TagPosition))
|
||||
@@ -4738,7 +4727,7 @@ class Edit(Modifier):
|
||||
else:
|
||||
msg(translate("draft", "This object type is not editable")+"\n",'warning')
|
||||
self.finish()
|
||||
|
||||
|
||||
else:
|
||||
self.finish()
|
||||
|
||||
@@ -4777,18 +4766,18 @@ class Edit(Modifier):
|
||||
|
||||
def action(self,arg):
|
||||
"scene event handler"
|
||||
|
||||
|
||||
if arg["Type"] == "SoKeyboardEvent":
|
||||
if arg["Key"] == "ESCAPE":
|
||||
self.finish()
|
||||
elif arg["Key"] == "f":
|
||||
self.finish()
|
||||
elif arg["Key"] == "c":
|
||||
self.finish(closed=True)
|
||||
self.finish(closed=True)
|
||||
elif arg["Key"] == "i":
|
||||
if (arg["State"] == "DOWN") and Draft.getType(self.obj) == "Circle":
|
||||
self.arcInvert()
|
||||
|
||||
if (arg["State"] == "DOWN") and Draft.getType(self.obj) == "Circle":
|
||||
self.arcInvert()
|
||||
|
||||
elif arg["Type"] == "SoLocation2Event": #mouse movement detection
|
||||
self.point,ctrlPoint,info = getPoint(self,arg)
|
||||
if self.editing != None:
|
||||
@@ -4802,12 +4791,12 @@ class Edit(Modifier):
|
||||
else:
|
||||
self.obj.ViewObject.Selectable = False
|
||||
redraw3DView()
|
||||
|
||||
|
||||
elif arg["Type"] == "SoMouseButtonEvent":
|
||||
|
||||
|
||||
if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"):
|
||||
self.ui.redraw()
|
||||
|
||||
|
||||
if self.editing == None:
|
||||
p = FreeCADGui.ActiveDocument.ActiveView.getCursorPos()
|
||||
done = False
|
||||
@@ -4949,7 +4938,7 @@ class Edit(Modifier):
|
||||
pts[self.editing] = editPnt
|
||||
self.obj.Points = pts
|
||||
self.trackers[self.editing].set(v)
|
||||
|
||||
|
||||
elif Draft.getType(self.obj) == "Circle":
|
||||
self.updateCircle(v)
|
||||
elif Draft.getType(self.obj) == "Rectangle":
|
||||
@@ -4974,7 +4963,7 @@ class Edit(Modifier):
|
||||
self.obj.recompute()
|
||||
self.trackers[0].set(self.obj.Placement.Base)
|
||||
self.trackers[1].set(self.obj.Shape.Vertexes[2].Point)
|
||||
|
||||
|
||||
elif Draft.getType(self.obj) == "Polygon":
|
||||
delta = v.sub(self.obj.Placement.Base)
|
||||
if self.editing == 0:
|
||||
@@ -4991,7 +4980,7 @@ class Edit(Modifier):
|
||||
self.obj.Radius = rad
|
||||
self.obj.recompute()
|
||||
self.trackers[1].set(self.obj.Shape.Vertexes[0].Point)
|
||||
|
||||
|
||||
elif Draft.getType(self.obj) == "Dimension":
|
||||
if self.editing == 0:
|
||||
self.obj.Start = v
|
||||
@@ -5001,7 +4990,7 @@ class Edit(Modifier):
|
||||
self.obj.Dimline = v
|
||||
elif self.editing == 3:
|
||||
self.obj.ViewObject.TextPosition = v
|
||||
|
||||
|
||||
elif Draft.getType(self.obj) == "Wall":
|
||||
if self.editing == 0:
|
||||
self.obj.Base.movePoint(0,1,v)
|
||||
@@ -5010,7 +4999,7 @@ class Edit(Modifier):
|
||||
self.obj.Base.movePoint(0,2,v)
|
||||
self.obj.Base.recompute()
|
||||
self.obj.recompute()
|
||||
|
||||
|
||||
elif Draft.getType(self.obj) == "Window":
|
||||
pos=self.obj.Base.Placement.Base
|
||||
if self.editing == 0:
|
||||
@@ -5025,20 +5014,20 @@ class Edit(Modifier):
|
||||
for obj in self.obj.Hosts:
|
||||
obj.recompute()
|
||||
self.obj.recompute()
|
||||
|
||||
|
||||
elif Draft.getType(self.obj) == "Space":
|
||||
if self.editing == 0:
|
||||
self.obj.ViewObject.TextPosition = v
|
||||
|
||||
|
||||
elif Draft.getType(self.obj) == "Structure":
|
||||
nodes = self.obj.Nodes
|
||||
nodes[self.editing] = self.invpl.multVec(v)
|
||||
self.obj.Nodes = nodes
|
||||
|
||||
|
||||
elif Draft.getType(self.obj) == "PanelCut":
|
||||
if self.editing == 0:
|
||||
self.obj.TagPosition = self.invpl.multVec(v)
|
||||
|
||||
|
||||
elif Draft.getType(self.obj) == "PanelSheet":
|
||||
if self.editing == 0:
|
||||
self.obj.TagPosition = self.invpl.multVec(v)
|
||||
@@ -5061,7 +5050,7 @@ class Edit(Modifier):
|
||||
self.editpoints.append(self.obj.Shape.Vertexes[0].Point)#First endpoint
|
||||
self.editpoints.append(self.obj.Shape.Vertexes[1].Point)#Second endpoint
|
||||
self.editpoints.append(self.getArcMid())#Midpoint
|
||||
|
||||
|
||||
def updateCirclePts(self,ep1=1,ep2=1,ep3=1,ep4=1):
|
||||
self.obj.recompute()
|
||||
if ep1 == 1:
|
||||
@@ -5070,10 +5059,10 @@ class Edit(Modifier):
|
||||
self.trackers[1].set(self.obj.Shape.Vertexes[0].Point)
|
||||
if ep3 == 1:
|
||||
self.trackers[2].set(self.obj.Shape.Vertexes[1].Point)
|
||||
if ep4 == 1:
|
||||
if ep4 == 1:
|
||||
self.trackers[3].set(self.getArcMid())
|
||||
|
||||
|
||||
|
||||
|
||||
def updateCircle(self,v):
|
||||
delta = v.sub(self.obj.Placement.Base)
|
||||
if self.obj.FirstAngle == self.obj.LastAngle:# object is a circle
|
||||
@@ -5085,9 +5074,9 @@ class Edit(Modifier):
|
||||
if self.editing == 1:
|
||||
self.obj.Radius = delta.Length
|
||||
self.updateCirclePts(0,0,0,0)
|
||||
|
||||
|
||||
else:#self.obj is an arc
|
||||
|
||||
|
||||
if self.arc3Pt == True:#edit by center radius FirstAngle LastAngle
|
||||
deltaX = v[0]-self.obj.Placement.Base[0]
|
||||
deltaY = v[1]-self.obj.Placement.Base[1]
|
||||
@@ -5109,7 +5098,7 @@ class Edit(Modifier):
|
||||
self.obj.Radius = delta.Length
|
||||
self.obj.recompute()
|
||||
self.updateCirclePts(0,1,1,1)
|
||||
|
||||
|
||||
elif self.arc3Pt == False:
|
||||
if self.editing == 0:#center point
|
||||
import DraftVecUtils
|
||||
@@ -5127,7 +5116,7 @@ class Edit(Modifier):
|
||||
if self.editing == 1:#first point
|
||||
p1=v
|
||||
p2=self.getArcMid()
|
||||
p3=self.obj.Shape.Vertexes[1].Point
|
||||
p3=self.obj.Shape.Vertexes[1].Point
|
||||
elif self.editing == 3:#midpoint
|
||||
p1=self.obj.Shape.Vertexes[0].Point
|
||||
p2=v
|
||||
@@ -5146,7 +5135,7 @@ class Edit(Modifier):
|
||||
deltaY = p3[1]-self.obj.Placement.Base[1]
|
||||
dangleL = math.degrees(math.atan2(deltaY,deltaX))
|
||||
self.obj.FirstAngle = dangleF
|
||||
self.obj.LastAngle = dangleL
|
||||
self.obj.LastAngle = dangleL
|
||||
self.updateCirclePts()
|
||||
|
||||
def getArcMid(self):#Returns object midpoint
|
||||
@@ -5165,7 +5154,7 @@ class Edit(Modifier):
|
||||
msg("wall edit mode: get midpoint")
|
||||
else:
|
||||
msg("Failed to get object midpoint during Editing")
|
||||
|
||||
|
||||
def arcInvert(self):
|
||||
FA=self.obj.FirstAngle
|
||||
self.obj.FirstAngle=self.obj.LastAngle
|
||||
|
||||
Reference in New Issue
Block a user