| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| from PySide import QtCore, QtGui |
| from pivy import coin |
| import FreeCAD |
| import FreeCADGui |
| import Path |
| import Path.Base.Gui.Util as PathGuiUtil |
| import Path.Op.FeatureExtension as FeatureExtensions |
| import Path.Op.Gui.Base as PathOpGui |
|
|
| |
| from lazy_loader.lazy_loader import LazyLoader |
|
|
| Part = LazyLoader("Part", globals(), "Part") |
|
|
| __title__ = "CAM Feature Extensions UI" |
| __author__ = "sliptonic (Brad Collette)" |
| __url__ = "https://www.freecad.org" |
| __doc__ = "Extensions feature page controller." |
|
|
|
|
| translate = FreeCAD.Qt.translate |
|
|
| if False: |
| Path.Log.setLevel(Path.Log.Level.DEBUG, Path.Log.thisModule()) |
| Path.Log.trackModule(Path.Log.thisModule()) |
| else: |
| Path.Log.setLevel(Path.Log.Level.INFO, Path.Log.thisModule()) |
|
|
|
|
| class _Extension(object): |
| ColourEnabled = (1.0, 0.5, 1.0) |
| ColourDisabled = (1.0, 1.0, 0.5) |
| TransparencySelected = 0.0 |
| TransparencyDeselected = 0.7 |
|
|
| def __init__(self, obj, base, face, edge): |
| self.obj = obj |
| self.base = base |
| self.face = face |
| self.edge = edge |
| self.ext = None |
|
|
| if edge: |
| self.ext = FeatureExtensions.createExtension(obj, base, face, edge) |
|
|
| self.switch = self.createExtensionSoSwitch(self.ext) |
| self.root = self.switch |
|
|
| def createExtensionSoSwitch(self, ext): |
| if not ext: |
| return None |
|
|
| sep = coin.SoSeparator() |
| pos = coin.SoTranslation() |
| mat = coin.SoMaterial() |
| crd = coin.SoCoordinate3() |
| fce = coin.SoFaceSet() |
| hnt = coin.SoShapeHints() |
| numVert = list() |
|
|
| try: |
| wire = ext.getWire() |
| except FreeCAD.Base.FreeCADError: |
| wire = None |
|
|
| if not wire: |
| return None |
|
|
| if isinstance(wire, (list, tuple)): |
| p0 = [p for p in wire[0].discretize(Deflection=0.02)] |
| p1 = [p for p in wire[1].discretize(Deflection=0.02)] |
| p2 = list(reversed(p1)) |
| polygon = [(p.x, p.y, p.z) for p in (p0 + p2)] |
| else: |
| if ext.extFaces: |
| |
| allPolys = list() |
| extFaces = ext.getExtensionFaces(wire) |
| for f in extFaces: |
| pCnt = 0 |
| wCnt = 0 |
| for w in f.Wires: |
| if wCnt == 0: |
| poly = [p for p in w.discretize(Deflection=0.01)] |
| else: |
| poly = [p for p in w.discretize(Deflection=0.01)][:-1] |
| pCnt += len(poly) |
| allPolys.extend(poly) |
| numVert.append(pCnt) |
| polygon = [(p.x, p.y, p.z) for p in allPolys] |
| else: |
| |
| poly = [p for p in wire.discretize(Deflection=0.02)] |
| polygon = [(p.x, p.y, p.z) for p in poly] |
| crd.point.setValues(polygon) |
|
|
| mat.diffuseColor = self.ColourDisabled |
| mat.transparency = self.TransparencyDeselected |
|
|
| hnt.faceType = coin.SoShapeHints.UNKNOWN_FACE_TYPE |
| hnt.vertexOrdering = coin.SoShapeHints.CLOCKWISE |
|
|
| if numVert: |
| |
| fce.numVertices.setValues(tuple(numVert)) |
|
|
| sep.addChild(pos) |
| sep.addChild(mat) |
| sep.addChild(hnt) |
| sep.addChild(crd) |
| sep.addChild(fce) |
|
|
| |
| switch = coin.SoSwitch() |
| switch.addChild(sep) |
| switch.whichChild = coin.SO_SWITCH_NONE |
|
|
| self.material = mat |
|
|
| return switch |
|
|
| def _setColour(self, r, g, b): |
| self.material.diffuseColor = (r, g, b) |
|
|
| def isValid(self): |
| return not self.root is None |
|
|
| def show(self): |
| if self.switch: |
| self.switch.whichChild = coin.SO_SWITCH_ALL |
|
|
| def hide(self): |
| if self.switch: |
| self.switch.whichChild = coin.SO_SWITCH_NONE |
|
|
| def enable(self, ena=True): |
| if ena: |
| self.material.diffuseColor = self.ColourEnabled |
| else: |
| self.disable() |
|
|
| def disable(self): |
| self.material.diffuseColor = self.ColourDisabled |
|
|
| def select(self): |
| self.material.transparency = self.TransparencySelected |
|
|
| def deselect(self): |
| self.material.transparency = self.TransparencyDeselected |
|
|
|
|
| class TaskPanelExtensionPage(PathOpGui.TaskPanelPage): |
| DataObject = QtCore.Qt.ItemDataRole.UserRole |
| DataSwitch = QtCore.Qt.ItemDataRole.UserRole + 2 |
|
|
| Direction = { |
| FeatureExtensions.Extension.DirectionNormal: translate("CAM_Pocket", "Normal"), |
| FeatureExtensions.Extension.DirectionX: translate("CAM_Pocket", "X"), |
| FeatureExtensions.Extension.DirectionY: translate("CAM_Pocket", "Y"), |
| } |
|
|
| def initPage(self, obj): |
| self.setTitle(translate("CAM_Pocket", "Extensions")) |
| self.OpIcon = ":/icons/view-axonometric.svg" |
| self.setIcon(self.OpIcon) |
| self.initialEdgeCount = -1 |
| self.edgeCountThreshold = 30 |
| self.fieldsSet = False |
| self.useOutlineCheckbox = None |
| self.useOutline = -1 |
| self.extensionsCache = dict() |
| self.extensionsReady = False |
| self.enabled = True |
| self.lastDefaultLength = "" |
|
|
| self.extensions = list() |
|
|
| self.defaultLength = PathGuiUtil.QuantitySpinBox( |
| self.form.defaultLength, obj, "ExtensionLengthDefault" |
| ) |
|
|
| 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.extensionTree) |
| self.model.setHorizontalHeaderLabels(["Base", "Extension"]) |
|
|
| """ |
| # russ4262: This `if` block shows all available extensions upon edit of operation with any extension enabled. |
| # This can cause the model(s) to overly obscured due to previews of extensions. |
| # Would be great if only enabled extensions were shown. |
| if 0 < len(obj.ExtensionFeature): |
| self.form.showExtensions.setCheckState(QtCore.Qt.Checked) |
| else: |
| self.form.showExtensions.setCheckState(QtCore.Qt.Unchecked) |
| """ |
| self.form.showExtensions.setCheckState(QtCore.Qt.Unchecked) |
|
|
| self.blockUpdateData = False |
|
|
| def cleanupPage(self, obj): |
| try: |
| self.obj.ViewObject.RootNode.removeChild(self.switch) |
| except (ReferenceError, RuntimeError) as e: |
| Path.Log.debug("obj already destroyed - no cleanup required") |
|
|
| def getForm(self): |
| form = FreeCADGui.PySideUic.loadUi(":/panels/PageOpPocketExtEdit.ui") |
| return form |
|
|
| def forAllItemsCall(self, cb): |
| for modelRow in range(self.model.rowCount()): |
| model = self.model.item(modelRow, 0) |
| for featureRow in range(model.rowCount()): |
| feature = model.child(featureRow, 0) |
| for edgeRow in range(feature.rowCount()): |
| item = feature.child(edgeRow, 0) |
| ext = item.data(self.DataObject) |
| cb(item, ext) |
|
|
| def currentExtensions(self): |
| Path.Log.debug("currentExtensions()") |
| extensions = [] |
|
|
| def extractExtension(item, ext): |
| if ext and ext.edge and item.checkState() == QtCore.Qt.Checked: |
| extensions.append(ext.ext) |
|
|
| if self.form.enableExtensions.isChecked(): |
| self.forAllItemsCall(extractExtension) |
| Path.Log.track("extensions", extensions) |
| return extensions |
|
|
| def updateProxyExtensions(self, obj): |
| Path.Log.debug("updateProxyExtensions()") |
| self.extensions = self.currentExtensions() |
| FeatureExtensions.setExtensions(obj, self.extensions) |
|
|
| def getFields(self, obj): |
| Path.Log.track(obj.Label, self.model.rowCount(), self.model.columnCount()) |
| self.blockUpdateData = True |
|
|
| if obj.ExtensionCorners != self.form.extendCorners.isChecked(): |
| obj.ExtensionCorners = self.form.extendCorners.isChecked() |
| self.defaultLength.updateProperty() |
|
|
| self.updateProxyExtensions(obj) |
| self.blockUpdateData = False |
|
|
| def setFields(self, obj): |
| Path.Log.track(obj.Label) |
| |
|
|
| if obj.ExtensionCorners != self.form.extendCorners.isChecked(): |
| self.form.extendCorners.toggle() |
|
|
| self._autoEnableExtensions() |
| self._initializeExtensions(obj) |
| self.defaultLength.updateWidget() |
| self._getUseOutlineState() |
| self.lastDefaultLength = self.form.defaultLength.text() |
| self.fieldsSet = True |
|
|
| def _initializeExtensions(self, obj): |
| """_initializeExtensions()... |
| Subroutine called inside `setFields()` to initialize Extensions efficiently.""" |
| if self.enabled: |
| self.extensions = FeatureExtensions.getExtensions(obj) |
| elif len(obj.ExtensionFeature) > 0: |
| self.extensions = FeatureExtensions.getExtensions(obj) |
| self.form.enableExtensions.setChecked(True) |
| self._includeEdgesAndWires() |
| else: |
| self.form.extensionEdit.setDisabled(True) |
| self.setExtensions(self.extensions) |
|
|
| def _applyDefaultLengthChange(self, index=None): |
| """_applyDefaultLengthChange(index=None)... |
| Helper method to update Default Length spinbox, |
| and update extensions due to change in Default Length.""" |
| self.defaultLength.updateWidget() |
| if self.form.defaultLength.text() != self.lastDefaultLength: |
| self.lastDefaultLength = self.form.defaultLength.text() |
| self._resetCachedExtensions() |
| self._enableExtensions() |
|
|
| def createItemForBaseModel(self, base, sub, edges, extensions): |
| Path.Log.track(base.Label, sub, "+", len(edges), len(base.Shape.getElement(sub).Edges)) |
| |
|
|
| extendCorners = self.form.extendCorners.isChecked() |
| subShape = base.Shape.getElement(sub) |
|
|
| def createSubItem(label, ext0): |
| if ext0.root: |
| 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) |
| ext0.enable() |
| break |
| item.appendRow([item0]) |
|
|
| |
| ext = None |
| item = QtGui.QStandardItem() |
| item.setData(sub, QtCore.Qt.EditRole) |
| item.setData(ext, self.DataObject) |
| item.setSelectable(False) |
|
|
| extensionEdges = {} |
| if self.useOutline == 1 and sub.startswith("Face"): |
| |
| subEdges = subShape.Wires[0].Edges |
| else: |
| |
| subEdges = subShape.Edges |
|
|
| for edge in subEdges: |
| for e, label in edges: |
| if edge.isSame(e): |
| ext1 = self._cachedExtension(self.obj, base, sub, label) |
| if ext1.isValid(): |
| extensionEdges[e] = label[4:] |
| if not extendCorners: |
| createSubItem(label, ext1) |
|
|
| if extendCorners: |
|
|
| def edgesMatchShape(e0, e1): |
| flipped = Path.Geom.flipEdge(e1) |
| if flipped: |
| return Path.Geom.edgesMatch(e0, e1) or Path.Geom.edgesMatch(e0, flipped) |
| else: |
| return Path.Geom.edgesMatch(e0, e1) |
|
|
| self.extensionEdges = extensionEdges |
| Path.Log.debug("extensionEdges.values(): {}".format(extensionEdges.values())) |
| for edgeList in Part.sortEdges( |
| list(extensionEdges) |
| ): |
| 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), |
| ) |
| ) |
| ext2 = self._cachedExtension(self.obj, base, sub, label) |
| createSubItem(label, ext2) |
|
|
| return item |
|
|
| def setExtensions(self, extensions): |
| Path.Log.track(len(extensions)) |
| Path.Log.debug("setExtensions()") |
|
|
| if self.extensionsReady: |
| Path.Log.debug("setExtensions() returning per `extensionsReady` flag") |
| return |
|
|
| self.form.extensionTree.blockSignals(True) |
|
|
| |
| if hasattr(self, "selectionModel"): |
| selectedExtensions = [ |
| self.model.itemFromIndex(index).data(self.DataObject).ext |
| for index in self.selectionModel.selectedIndexes() |
| ] |
| else: |
| selectedExtensions = [] |
| collapsedModels = [] |
| collapsedFeatures = [] |
| for modelRow in range(self.model.rowCount()): |
| model = self.model.item(modelRow, 0) |
| modelName = model.data(QtCore.Qt.EditRole) |
| 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.extensionTree.isExpanded(feature.index()): |
| collapsedFeatures.append( |
| "%s.%s" % (modelName, feature.data(QtCore.Qt.EditRole)) |
| ) |
|
|
| |
| def removeItemSwitch(item, ext): |
| ext.hide() |
| if ext.root: |
| self.switch.removeChild(ext.root) |
|
|
| self.forAllItemsCall(removeItemSwitch) |
| self.model.clear() |
|
|
| |
| if self.enabled: |
| for base in self.obj.Base: |
| show = False |
| edges = [(edge, "Edge%d" % (i + 1)) for i, edge in enumerate(base[0].Shape.Edges)] |
| baseItem = QtGui.QStandardItem() |
| baseItem.setData(base[0].Label, QtCore.Qt.EditRole) |
| baseItem.setSelectable(False) |
| for sub in sorted(base[1]): |
| if sub.startswith("Face"): |
| show = True |
| baseItem.appendRow( |
| self.createItemForBaseModel(base[0], sub, edges, extensions) |
| ) |
| if show: |
| self.model.appendRow(baseItem) |
|
|
| self.form.extensionTree.setModel(self.model) |
| self.form.extensionTree.expandAll() |
| self.form.extensionTree.resizeColumnToContents(0) |
|
|
| |
| 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.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.extensionTree.setExpanded(feature.index(), False) |
| if hasattr(self, "selectionModel") and selectedExtensions: |
| self.restoreSelection(selectedExtensions) |
|
|
| self.form.extensionTree.blockSignals(False) |
| self.extensionsReady = True |
| Path.Log.debug(" setExtensions() finished and setting `extensionsReady=True`") |
|
|
| def updateData(self, obj, prop): |
| Path.Log.track(obj.Label, prop, self.blockUpdateData) |
| |
|
|
| if not self.blockUpdateData: |
| if self.fieldsSet: |
| if self.form.enableExtensions.isChecked(): |
| if prop == "ExtensionLengthDefault": |
| self._applyDefaultLengthChange() |
| elif prop == "Base": |
| self.extensionsReady = False |
| self.setExtensions(FeatureExtensions.getExtensions(obj)) |
| elif prop == "UseOutline": |
| self._getUseOutlineState() |
| self._includeEdgesAndWires() |
| elif prop == "Base": |
| self.extensionsReady = False |
|
|
| def restoreSelection(self, selection): |
| Path.Log.debug("restoreSelection()") |
| Path.Log.track() |
| if 0 == self.model.rowCount(): |
| Path.Log.track("-") |
| self.form.buttonClear.setEnabled(False) |
| self.form.buttonDisable.setEnabled(False) |
| self.form.buttonEnable.setEnabled(False) |
| else: |
| self.form.buttonClear.setEnabled(True) |
|
|
| if selection or self.selectionModel.selectedIndexes(): |
| self.form.buttonDisable.setEnabled(True) |
| self.form.buttonEnable.setEnabled(True) |
| else: |
| self.form.buttonDisable.setEnabled(False) |
| self.form.buttonEnable.setEnabled(False) |
|
|
| FreeCADGui.Selection.clearSelection() |
|
|
| def selectItem(item, ext): |
| for sel in selection: |
| if ext.base == sel.obj and ext.edge == sel.sub: |
| return True |
| return False |
|
|
| def setSelectionVisuals(item, ext): |
| if selectItem(item, ext): |
| self.selectionModel.select(item.index(), QtCore.QItemSelectionModel.Select) |
|
|
| selected = self.selectionModel.isSelected(item.index()) |
| if selected: |
| FreeCADGui.Selection.addSelection(ext.base, ext.face) |
| ext.select() |
| else: |
| ext.deselect() |
|
|
| if self.form.showExtensions.isChecked() or selected: |
| ext.show() |
| else: |
| ext.hide() |
|
|
| self.forAllItemsCall(setSelectionVisuals) |
|
|
| def selectionChanged(self): |
| Path.Log.debug("selectionChanged()") |
| self.restoreSelection([]) |
|
|
| def extensionsClear(self): |
| Path.Log.debug("extensionsClear()") |
|
|
| def disableItem(item, ext): |
| item.setCheckState(QtCore.Qt.Unchecked) |
| ext.disable() |
|
|
| self.forAllItemsCall(disableItem) |
| self.setDirty() |
|
|
| def _extensionsSetState(self, state): |
| Path.Log.debug("_extensionsSetState()") |
| Path.Log.track(state) |
| for index in self.selectionModel.selectedIndexes(): |
| item = self.model.itemFromIndex(index) |
| ext = item.data(self.DataObject) |
| if ext.edge: |
| item.setCheckState(state) |
| ext.enable(state == QtCore.Qt.Checked) |
| self.setDirty() |
|
|
| def extensionsDisable(self): |
| self._extensionsSetState(QtCore.Qt.Unchecked) |
|
|
| def extensionsEnable(self): |
| self._extensionsSetState(QtCore.Qt.Checked) |
|
|
| def updateItemEnabled(self, item): |
| Path.Log.track(item) |
| ext = item.data(self.DataObject) |
| if item.checkState() == QtCore.Qt.Checked: |
| ext.enable() |
| else: |
| ext.disable() |
| self.updateProxyExtensions(self.obj) |
| self.setDirty() |
|
|
| def showHideExtension(self): |
| if self.form.showExtensions.isChecked(): |
|
|
| def enableExtensionEdit(item, ext): |
| ext.show() |
|
|
| self.forAllItemsCall(enableExtensionEdit) |
| else: |
|
|
| def disableExtensionEdit(item, ext): |
| if not self.selectionModel.isSelected(item.index()): |
| ext.hide() |
|
|
| self.forAllItemsCall(disableExtensionEdit) |
| |
|
|
| def toggleExtensionCorners(self): |
| Path.Log.debug("toggleExtensionCorners()") |
| Path.Log.track() |
| self.extensionsReady = False |
| extensions = FeatureExtensions.getExtensions(self.obj) |
| self.setExtensions(extensions) |
| self.selectionChanged() |
| self.setDirty() |
|
|
| def getSignalsForUpdate(self, obj): |
| Path.Log.track(obj.Label) |
| signals = [] |
| signals.append(self.form.defaultLength.editingFinished) |
| signals.append(self.form.enableExtensions.toggled) |
| return signals |
|
|
| def registerSignalHandlers(self, obj): |
| self.form.showExtensions.clicked.connect(self.showHideExtension) |
| self.form.extendCorners.clicked.connect(self.toggleExtensionCorners) |
| self.form.buttonClear.clicked.connect(self.extensionsClear) |
| self.form.buttonDisable.clicked.connect(self.extensionsDisable) |
| self.form.buttonEnable.clicked.connect(self.extensionsEnable) |
| self.form.enableExtensions.toggled.connect(self._enableExtensions) |
| self.form.defaultLength.editingFinished.connect(self._applyDefaultLengthChange) |
|
|
| self.model.itemChanged.connect(self.updateItemEnabled) |
|
|
| self.selectionModel = self.form.extensionTree.selectionModel() |
| self.selectionModel.selectionChanged.connect(self.selectionChanged) |
| self.selectionChanged() |
|
|
| |
| def _getUseOutlineState(self): |
| """_getUseOutlineState() ... |
| This method locates the `useOutline` form checkbox in the `Operation` tab, |
| and saves that reference to self.useOutlineInput. If found, then the boolean |
| value of the checkbox is saved to self.useOutline. |
| """ |
| if self.useOutlineCheckbox: |
| self.useOutline = self.useOutlineCheckbox.isChecked() |
|
|
| if hasattr(self, "parent"): |
| parent = getattr(self, "parent") |
| if parent and hasattr(parent, "featurePages"): |
| for page in parent.featurePages: |
| if hasattr(page, "panelTitle"): |
| if page.panelTitle == "Operation" and hasattr(page.form, "useOutline"): |
| Path.Log.debug("Found useOutline checkbox") |
| self.useOutlineCheckbox = page.form.useOutline |
| if page.form.useOutline.isChecked(): |
| self.useOutline = 1 |
| return |
| else: |
| self.useOutline = 0 |
| return |
|
|
| self.useOutline = -1 |
|
|
| |
| def _autoEnableExtensions(self): |
| """_autoEnableExtensions() ... |
| This method is called to determine if the Extensions feature should be enabled, |
| or auto disabled due to total edge count of selected faces. |
| The auto enable/disable feature is designed to allow quicker access |
| to operations that implement the Extensions feature when selected faces contain |
| large numbers of edges, which require long computation times for preparation. |
| |
| The return value is a simple boolean to communicate whether or not Extensions |
| are be enabled. |
| """ |
| enabled = False |
|
|
| if self.form.enableExtensions.isChecked(): |
| enabled = True |
|
|
| Path.Log.debug("_autoEnableExtensions() is {}".format(enabled)) |
| self.enabled = enabled |
|
|
| def _enableExtensions(self): |
| """_enableExtensions() ... |
| This method is called when the enableExtensions push button is toggled. |
| This method manages the enabled or disabled state of the extensionsEdit |
| Task Panel input group. |
| """ |
| Path.Log.debug("_enableExtensions()") |
|
|
| if self.form.enableExtensions.isChecked(): |
| self.enabled = True |
| self.extensionsReady = False |
| self.form.extensionEdit.setEnabled(True) |
| self.extensions = FeatureExtensions.getExtensions(self.obj) |
| self.setExtensions(self.extensions) |
| else: |
| self.form.extensionEdit.setDisabled(True) |
| self.enabled = False |
|
|
| def _includeEdgesAndWires(self): |
| """_includeEdgesAndWires() ... |
| This method is called when the includeEdges push button is toggled. |
| This method manages the state of the button and the message thereof. |
| """ |
| self._getUseOutlineState() |
| Path.Log.debug("_includeEdgesAndWires()") |
| self.extensionsReady = False |
| self._enableExtensions() |
|
|
| |
| def _cachedExtension(self, obj, base, sub, label): |
| """_cachedExtension(obj, base, sub, label)... |
| This method creates a new _Extension object if none is found within |
| the extensionCache dictionary.""" |
|
|
| if label: |
| cacheLabel = base.Name + "_" + sub + "_" + label |
| else: |
| cacheLabel = base.Name + "_" + sub + "_None" |
|
|
| if cacheLabel in self.extensionsCache: |
| |
| return self.extensionsCache[cacheLabel] |
| else: |
| |
| _ext = _Extension(obj, base, sub, label) |
| self.extensionsCache[cacheLabel] = _ext |
| return _ext |
|
|
| def _resetCachedExtensions(self): |
| Path.Log.debug("_resetCachedExtensions()") |
| reset = dict() |
| self.extensionsCache = reset |
| self.extensionsReady = False |
|
|
|
|
| |
|
|
| FreeCAD.Console.PrintLog("Loading PathFeatureExtensionsGui... done\n") |
|
|