Added support for global extend corners

This commit is contained in:
Markus Lampert
2018-12-28 03:42:47 -08:00
committed by wmayer
parent dcbe97144b
commit 0367c28fbc
3 changed files with 141 additions and 79 deletions

View File

@@ -24,6 +24,8 @@
import FreeCAD
import FreeCADGui
import Part
import PathScripts.PathGeom as PathGeom
import PathScripts.PathGui as PathGui
import PathScripts.PathLog as PathLog
import PathScripts.PathOp as PathOp
@@ -55,13 +57,13 @@ def createExtensionSoSwitch(ext):
mat = coin.SoMaterial()
crd = coin.SoCoordinate3()
fce = coin.SoFaceSet()
hnt = coin.SoShapeHints()
if not ext is None:
wire = ext.getWire()
if wire:
polygon = []
for p in wire.discretize(Deflection=0.01):
polygon.append((p.x, p.y, p.z))
poly = [p for p in wire.discretize(Deflection=0.01)][:-1]
polygon = [(p.x, p.y, p.z) for p in poly]
crd.point.setValues(polygon)
else:
return None
@@ -69,8 +71,12 @@ def createExtensionSoSwitch(ext):
mat.diffuseColor = (1.0, 0.0, 0.0)
mat.transparency = 0.5
hnt.faceType = coin.SoShapeHints.UNKNOWN_FACE_TYPE
hnt.vertexOrdering = coin.SoShapeHints.CLOCKWISE
sep.addChild(pos)
sep.addChild(mat)
sep.addChild(hnt)
sep.addChild(crd)
sep.addChild(fce)
@@ -82,19 +88,30 @@ def createExtensionSoSwitch(ext):
class _Extension(object):
def __init__(self, obj, base, face, edge):
self.obj = obj
self.base = base
self.face = face
self.edge = edge
if edge is None:
self.ext = None
else:
self.ext = obj.Proxy.createExtension(obj, base, edge)
self.ext = obj.Proxy.createExtension(obj, base, face, edge)
self.switch = createExtensionSoSwitch(self.ext)
self.root = self.switch
def isValid(self):
return not self.root is None
def getEdgeNumbers(self):
return self.ext.getEdgeNumbers()
def getEdges(self):
return self.ext.getEdges()
def isWire(self):
return 1 == len(self.getEdgeNumbers())
Page = None
class TaskPanelExtensionPage(PathOpGui.TaskPanelPage):
@@ -113,14 +130,14 @@ class TaskPanelExtensionPage(PathOpGui.TaskPanelPage):
self.defaultLength = PathGui.QuantitySpinBox(self.form.defaultLength, obj, 'ExtensionLengthDefault')
self.form.extensions.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
self.form.extensions.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
self.form.extensionTree.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
self.form.extensionTree.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
self.switch = coin.SoSwitch()
self.obj.ViewObject.RootNode.addChild(self.switch)
self.switch.whichChild = coin.SO_SWITCH_ALL
self.model = QtGui.QStandardItemModel(self.form.extensions)
self.model = QtGui.QStandardItemModel(self.form.extensionTree)
self.model.setHorizontalHeaderLabels(['Base', 'Extension'])
global Page
@@ -143,7 +160,9 @@ class TaskPanelExtensionPage(PathOpGui.TaskPanelPage):
def getFields(self, obj):
PathLog.track(obj.Label, self.model.rowCount(), self.model.columnCount())
self.defaultLength.updateProperty()
extensions = []
def extractExtension(item):
@@ -158,7 +177,9 @@ class TaskPanelExtensionPage(PathOpGui.TaskPanelPage):
def setFields(self, obj):
PathLog.track(obj.Label)
self.defaultLength.updateSpinBox()
self.extensions = obj.Proxy.getExtensions(obj)
self.setExtensions(self.extensions)
def createItemForBaseModel(self, base, sub, edges, extensions):
@@ -169,28 +190,50 @@ class TaskPanelExtensionPage(PathOpGui.TaskPanelPage):
item.setData(ext, self.DataObject)
item.setSelectable(False)
extendCorners = self.form.extendCorners.isChecked()
def createSubItem(label, ext0):
self.switch.addChild(ext0.root)
item0 = QtGui.QStandardItem()
item0.setData(label, QtCore.Qt.EditRole)
item0.setData(ext0, self.DataObject)
item0.setCheckable(True)
for e in extensions:
if e.obj == base and e.sub == label:
item0.setCheckState(QtCore.Qt.Checked)
break
item.appendRow([item0])
extensionEdges = {}
for edge in base.Shape.getElement(sub).Edges:
for (e, label) in edges:
if edge.isSame(e):
ext0 = _Extension(self.obj, base, sub, label)
if ext0.isValid():
self.switch.addChild(ext0.root)
item0 = QtGui.QStandardItem()
item0.setData(label, QtCore.Qt.EditRole)
item0.setData(ext0, self.DataObject)
item0.setCheckable(True)
for e in extensions:
if e.obj == base and e.sub == label:
item0.setCheckState(QtCore.Qt.Checked)
break
item.appendRow([item0])
extensionEdges[e] = label[4:]
if not extendCorners:
createSubItem(label, ext0)
break
if extendCorners:
def edgesMatchShape(e0, e1):
return PathGeom.edgesMatch(e0, e1) or PathGeom.edgesMatch(e0, PathGeom.flipEdge(e1))
self.extensionEdges = extensionEdges
for edgeList in Part.sortEdges(extensionEdges.keys()):
self.edgeList = edgeList
if len(edgeList) == 1:
label = "Edge%s" % [extensionEdges[keyEdge] for keyEdge in extensionEdges.keys() if edgesMatchShape(keyEdge, edgeList[0])][0]
else:
label = "Wire(%s)" % ','.join(sorted([extensionEdges[keyEdge] for e in edgeList for keyEdge in extensionEdges.keys() if edgesMatchShape(e, keyEdge)], key=lambda s: int(s)))
ext0 = _Extension(self.obj, base, sub, label)
createSubItem(label, ext0)
return item
def setExtensions(self, extensions):
PathLog.track(len(extensions))
self.form.extensions.blockSignals(True)
self.form.extensionTree.blockSignals(True)
# remember current visual state
if hasattr(self, 'selectionModel'):
@@ -202,11 +245,11 @@ class TaskPanelExtensionPage(PathOpGui.TaskPanelPage):
for modelRow in range(self.model.rowCount()):
model = self.model.item(modelRow, 0)
modelName = model.data(QtCore.Qt.EditRole)
if not self.form.extensions.isExpanded(model.index()):
if not self.form.extensionTree.isExpanded(model.index()):
collapsedModels.append(modelName)
for featureRow in range(model.rowCount()):
feature = model.child(featureRow, 0);
if not self.form.extensions.isExpanded(feature.index()):
if not self.form.extensionTree.isExpanded(feature.index()):
collapsedFeatures.append("%s.%s" % (modelName, feature.data(QtCore.Qt.EditRole)))
# remove current extensions and all their visuals
@@ -227,21 +270,21 @@ class TaskPanelExtensionPage(PathOpGui.TaskPanelPage):
baseItem.appendRow(self.createItemForBaseModel(base[0], sub, edges, extensions))
self.model.appendRow(baseItem)
self.form.extensions.setModel(self.model)
self.form.extensions.expandAll()
self.form.extensions.resizeColumnToContents(0)
self.form.extensionTree.setModel(self.model)
self.form.extensionTree.expandAll()
self.form.extensionTree.resizeColumnToContents(0)
# restore previous state - at least the parts that are still valid
for modelRow in range(self.model.rowCount()):
model = self.model.item(modelRow, 0)
modelName = model.data(QtCore.Qt.EditRole)
if modelName in collapsedModels:
self.form.extensions.setExpanded(model.index(), False)
self.form.extensionTree.setExpanded(model.index(), False)
for featureRow in range(model.rowCount()):
feature = model.child(featureRow, 0);
featureName = "%s.%s" % (modelName, feature.data(QtCore.Qt.EditRole))
if featureName in collapsedFeatures:
self.form.extensions.setExpanded(feature.index(), False)
self.form.extensionTree.setExpanded(feature.index(), False)
if hasattr(self, 'selectionModel') and selectedExtensions:
self.restoreSelection(selectedExtensions)
@@ -309,16 +352,19 @@ class TaskPanelExtensionPage(PathOpGui.TaskPanelPage):
def getSignalsForUpdate(self, obj):
PathLog.track(obj.Label)
return [self.form.defaultLength.editingFinished]
signals = []
signals.append(self.form.defaultLength.editingFinished)
return signals
def registerSignalHandlers(self, obj):
self.form.extendCorners.clicked.connect(lambda : self.setExtensions(obj.Proxy.getExtensions(obj)))
self.form.buttonClear.clicked.connect(self.extensionsClear)
self.form.buttonDisable.clicked.connect(self.extensionsDisable)
self.form.buttonEnable.clicked.connect(self.extensionsEnable)
self.model.itemChanged.connect(lambda x: self.setDirty())
self.selectionModel = self.form.extensions.selectionModel()
self.selectionModel = self.form.extensionTree.selectionModel()
self.selectionModel.selectionChanged.connect(self.selectionChanged)
class TaskPanelOpPage(PathPocketBaseGui.TaskPanelOpPage):