From 1c74eee9dfd6a3bc282549655e2c7114acca7da1 Mon Sep 17 00:00:00 2001 From: markus Date: Mon, 24 Sep 2018 17:18:44 -0700 Subject: [PATCH] Simple visualisation of removal shape extensions. --- src/Mod/Path/PathScripts/PathPocketShape.py | 6 +- .../Path/PathScripts/PathPocketShapeGui.py | 91 ++++++++++++++++--- 2 files changed, 79 insertions(+), 18 deletions(-) diff --git a/src/Mod/Path/PathScripts/PathPocketShape.py b/src/Mod/Path/PathScripts/PathPocketShape.py index 428a6b5034..f5a1f14033 100644 --- a/src/Mod/Path/PathScripts/PathPocketShape.py +++ b/src/Mod/Path/PathScripts/PathPocketShape.py @@ -65,7 +65,6 @@ class Extension(object): e2 = e0.copy() off = self.length.Value * direction e2.translate(off) - print("extendEdge(%.2f, %.2f, %.2f)" % (off.x, off.y, off.z)) e2 = PathGeom.flipEdge(e2) e1 = Part.Edge(Part.LineSegment(e0.valueAt(e0.LastParameter), e2.valueAt(e2.FirstParameter))) e3 = Part.Edge(Part.LineSegment(e2.valueAt(e2.LastParameter), e0.valueAt(e0.FirstParameter))) @@ -80,20 +79,17 @@ class Extension(object): feature = self.obj.Shape.getElement(self.sub) if Part.Edge == type(feature): e0 = feature - print("getEdgeCorners(%s)" % self.sub) midparam = e0.FirstParameter + 0.5 * (e0.LastParameter - e0.FirstParameter) tangent = e0.tangentAt(midparam) normal = tangent.cross(FreeCAD.Vector(0, 0, 1)).normalize() poffPlus = e0.valueAt(midparam) + 0.01 * normal poffMinus = e0.valueAt(midparam) - 0.01 * normal if not self.obj.Shape.isInside(poffPlus, 0.005, True): - print('poffPlus') return self.extendEdge(e0, normal) if not self.obj.Shape.isInside(poffMinus, 0.005, True): - print('poffMinus') return self.extendEdge(e0, normal.negative()) else: - print("getCorners(%s)" % self.sub) + PathLog.warning("getWire does not support %s" % type(feature)) class ObjectPocket(PathPocketBase.ObjectPocket): diff --git a/src/Mod/Path/PathScripts/PathPocketShapeGui.py b/src/Mod/Path/PathScripts/PathPocketShapeGui.py index a4fe74ec6f..5b53a203e1 100644 --- a/src/Mod/Path/PathScripts/PathPocketShapeGui.py +++ b/src/Mod/Path/PathScripts/PathPocketShapeGui.py @@ -33,6 +33,7 @@ import PathScripts.PathPocketBaseGui as PathPocketBaseGui import PathScripts.PathUtil as PathUtil from PySide import QtCore, QtGui +from pivy import coin __title__ = "Path Pocket Shape Operation UI" __author__ = "sliptonic (Brad Collette)" @@ -48,11 +49,48 @@ if True: else: PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) +def createExtensionSoSwitch(ext): + sep = coin.SoSeparator() + pos = coin.SoTranslation() + mat = coin.SoMaterial() + crd = coin.SoCoordinate3() + fce = coin.SoFaceSet() + + wire = ext.getWire() + if wire: + polygon = [] + for p in wire.discretize(Deflection=0.01): + polygon.append((p.x, p.y, p.z)) + crd.point.setValues(polygon) + + mat.diffuseColor = (1.0, 0.0, 0.0) + mat.transparency = 0.5 + + sep.addChild(pos) + sep.addChild(mat) + sep.addChild(crd) + sep.addChild(fce) + + switch = coin.SoSwitch() + switch.addChild(sep) + switch.whichChild = coin.SO_SWITCH_NONE + + return switch Wires = [] +Items = [] + +class _Extension(object): + def __init__(self, ext): + self.ext = ext + self.switch = createExtensionSoSwitch(ext) + self.root = self.switch + class TaskPanelExtensionPage(PathOpGui.TaskPanelPage): DataObject = QtCore.Qt.ItemDataRole.UserRole + DataSwitch = QtCore.Qt.ItemDataRole.UserRole + 2 + Direction = { PathPocketShape.Extension.DirectionNormal: translate('PathPocket', 'Normal'), PathPocketShape.Extension.DirectionX: translate('PathPocket', 'X'), @@ -70,6 +108,10 @@ class TaskPanelExtensionPage(PathOpGui.TaskPanelPage): self.form.extensions.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) self.form.extensions.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) + self.switch = coin.SoSwitch() + self.obj.ViewObject.RootNode.addChild(self.switch) + self.switch.whichChild = coin.SO_SWITCH_ALL + def enable(self, ena): if ena != self.enabled: self.enabled = ena @@ -88,31 +130,37 @@ class TaskPanelExtensionPage(PathOpGui.TaskPanelPage): exts = [] for row in range(self.form.extensions.rowCount()): item = self.form.extensions.item(row, 0) - exts.append(item.data(self.DataObject)) + exts.append(item.data(self.DataObject).ext) obj.Proxy.setExtensions(obj, exts) def setFields(self, obj): self.defaultLength.updateSpinBox() self.form.extensions.blockSignals(True) + for row in range(self.form.extensions.rowCount()): + self.switch.removeChild(self.form.extensions.item(row, 0).data(self.DataObject).root) + self.form.extensions.clearContents() self.form.extensions.setRowCount(0) for row, ext in enumerate(self.extensions): PathLog.info("{}.{}".format(ext.obj.Label, ext.sub)) - self.form.extensions.insertRow(row) - item = QtGui.QTableWidgetItem("{}.{}".format(ext.obj.Label, ext.sub)) - item.setData(self.DataObject, ext) - self.form.extensions.setItem(row, 0, item) + _ext = _Extension(ext) - item = QtGui.QTableWidgetItem("{}".format(ext.length)) - item.setData(self.DataObject, ext) - self.form.extensions.setItem(row, 1, item) + item0 = QtGui.QTableWidgetItem("{}.{}".format(ext.obj.Label, ext.sub)) + item0.setData(self.DataObject, _ext) + self.form.extensions.setItem(row, 0, item0) - item = QtGui.QTableWidgetItem("{}".format(self.Direction[ext.direction])) - item.setData(self.DataObject, ext) - self.form.extensions.setItem(row, 2, item) + item1 = QtGui.QTableWidgetItem("{}".format(ext.length)) + item1.setData(self.DataObject, _ext) + self.form.extensions.setItem(row, 1, item1) + + item2 = QtGui.QTableWidgetItem("{}".format(self.Direction[ext.direction])) + item2.setData(self.DataObject, _ext) + self.form.extensions.setItem(row, 2, item2) + + self.switch.addChild(_ext.root) self.form.extensions.resizeColumnsToContents() self.form.extensions.blockSignals(False) @@ -134,6 +182,23 @@ class TaskPanelExtensionPage(PathOpGui.TaskPanelPage): else: self.form.buttonRemove.setEnabled(False) + FreeCADGui.Selection.clearSelection() + print("rowCount = %s" % self.form.extensions.rowCount()) + + for row in range(self.form.extensions.rowCount()): + item = self.form.extensions.item(row, 0) + Items.append(item) + ext = item.data(self.DataObject) + ext.switch.whichChild = coin.SO_SWITCH_NONE + + processed = [] + for item in self.form.extensions.selectedItems(): + ext = item.data(self.DataObject) + if not ext in processed: + FreeCADGui.Selection.addSelection(ext.ext.obj, ext.ext.sub) + ext.switch.whichChild = coin.SO_SWITCH_ALL + processed.append(ext) + def extensionsAdd(self): for sel in FreeCADGui.Selection.getSelectionEx(): for subname in sel.SubElementNames: @@ -151,7 +216,7 @@ class TaskPanelExtensionPage(PathOpGui.TaskPanelPage): Wires = [] processed = [] for item in self.form.extensions.selectedItems(): - ext = item.data(self.DataObject) + ext = item.data(self.DataObject).ext if not ext in processed: Wires.append(ext) wire = ext.getWire() @@ -161,12 +226,12 @@ class TaskPanelExtensionPage(PathOpGui.TaskPanelPage): processed.append(ext) def pageRegisterSignalHandlers(self): - self.form.extensions.itemSelectionChanged.connect(self.itemSelectionChanged) self.form.buttonAdd.clicked.connect(self.extensionsAdd) self.form.buttonClear.clicked.connect(self.extensionsClear) self.form.buttonRemove.clicked.connect(self.extensionsRemove) self.updateSelection(self.obj, FreeCADGui.Selection.getSelectionEx()) + self.form.extensions.itemSelectionChanged.connect(self.itemSelectionChanged) self.itemSelectionChanged() class TaskPanelOpPage(PathPocketBaseGui.TaskPanelOpPage):