# -*- coding: utf-8 -*- # *************************************************************************** # * Copyright (c) 2020 Russell Johnson (russ4262) * # * * # * This program is free software; you can redistribute it and/or modify * # * it under the terms of the GNU Lesser General Public License (LGPL) * # * as published by the Free Software Foundation; either version 2 of * # * the License, or (at your option) any later version. * # * for detail see the LICENCE text file. * # * * # * This program is distributed in the hope that it will be useful, * # * but WITHOUT ANY WARRANTY; without even the implied warranty of * # * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * # * GNU Library General Public License for more details. * # * * # * You should have received a copy of the GNU Library General Public * # * License along with this program; if not, write to the Free Software * # * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * # * USA * # * * # *************************************************************************** import FreeCAD import FreeCADGui import PathGui as PGui # ensure Path/Gui/Resources are loaded import PathScripts.PathSlot as PathSlot import PathScripts.PathGui as PathGui import PathScripts.PathOpGui as PathOpGui from PySide import QtCore __title__ = "Path Slot Operation UI" __author__ = "russ4262 (Russell Johnson)" __url__ = "http://www.freecadweb.org" __doc__ = "Slot operation page controller and command implementation." __contributors__ = "" DEBUG = False def debugMsg(msg): global DEBUG if DEBUG: FreeCAD.Console.PrintMessage('PathSlotGui:: ' + msg + '\n') class TaskPanelOpPage(PathOpGui.TaskPanelPage): '''Page controller class for the Slot operation.''' def getForm(self): '''getForm() ... returns UI''' debugMsg('getForm()') return FreeCADGui.PySideUic.loadUi(":/panels/PageOpSlotEdit.ui") def initPage(self, obj): '''initPage(obj) ... Is called after getForm() to initiate the task panel.''' debugMsg('initPage()') # pylint: disable=attribute-defined-outside-init self.CATS = [None, None] self.propEnums = PathSlot.ObjectSlot.opPropertyEnumerations(False) self.ENUMS = dict() self.setTitle("Slot - " + obj.Label) # retrieve property enumerations # Requirements due to Gui::QuantitySpinBox class use in UI panel self.geo1Extension = PathGui.QuantitySpinBox(self.form.geo1Extension, obj, 'ExtendPathStart') self.geo2Extension = PathGui.QuantitySpinBox(self.form.geo2Extension, obj, 'ExtendPathEnd') def setFields(self, obj): '''setFields(obj) ... transfers obj's property values to UI''' debugMsg('setFields()') debugMsg('... calling updateVisibility()') self.updateVisibility() self.updateQuantitySpinBoxes() self.setupToolController(obj, self.form.toolController) self.setupCoolant(obj, self.form.coolantController) enums = self.propEnums['Reference1'] if 'Reference1' in self.ENUMS: enums = self.ENUMS['Reference1'] debugMsg(' -enums1: {}'.format(enums)) idx = enums.index(obj.Reference1) self.form.geo1Reference.setCurrentIndex(idx) enums = self.propEnums['Reference2'] if 'Reference2' in self.ENUMS: enums = self.ENUMS['Reference2'] debugMsg(' -enums2: {}'.format(enums)) idx = enums.index(obj.Reference2) self.form.geo2Reference.setCurrentIndex(idx) self.selectInComboBox(obj.LayerMode, self.form.layerMode) self.selectInComboBox(obj.PathOrientation, self.form.pathOrientation) if obj.ReverseDirection: self.form.reverseDirection.setCheckState(QtCore.Qt.Checked) else: self.form.reverseDirection.setCheckState(QtCore.Qt.Unchecked) def updateQuantitySpinBoxes(self): self.geo1Extension.updateSpinBox() self.geo2Extension.updateSpinBox() def getFields(self, obj): '''getFields(obj) ... transfers values from UI to obj's proprties''' debugMsg('getFields()') self.updateToolController(obj, self.form.toolController) self.updateCoolant(obj, self.form.coolantController) obj.Reference1 = str(self.form.geo1Reference.currentText()) self.geo1Extension.updateProperty() obj.Reference2 = str(self.form.geo2Reference.currentText()) self.geo2Extension.updateProperty() val = self.propEnums['LayerMode'][self.form.layerMode.currentIndex()] obj.LayerMode = val val = self.propEnums['PathOrientation'][self.form.pathOrientation.currentIndex()] obj.PathOrientation = val obj.ReverseDirection = self.form.reverseDirection.isChecked() def getSignalsForUpdate(self, obj): '''getSignalsForUpdate(obj) ... return list of signals for updating obj''' debugMsg('getSignalsForUpdate()') signals = [] signals.append(self.form.toolController.currentIndexChanged) signals.append(self.form.coolantController.currentIndexChanged) signals.append(self.form.geo1Extension.editingFinished) signals.append(self.form.geo1Reference.currentIndexChanged) signals.append(self.form.geo2Extension.editingFinished) signals.append(self.form.geo2Reference.currentIndexChanged) signals.append(self.form.layerMode.currentIndexChanged) signals.append(self.form.pathOrientation.currentIndexChanged) signals.append(self.form.reverseDirection.stateChanged) return signals def updateVisibility(self, sentObj=None): '''updateVisibility(sentObj=None)... Updates visibility of Tasks panel objects.''' # debugMsg('updateVisibility()') hideFeatures = True if hasattr(self.obj, 'Base'): if self.obj.Base: self.form.customPoints.hide() self.form.featureReferences.show() self.form.pathOrientation_label.show() self.form.pathOrientation.show() hideFeatures = False base, sublist = self.obj.Base[0] subCnt = len(sublist) if subCnt == 1: debugMsg(' -subCnt == 1') # Save value, then reset choices n1 = sublist[0] s1 = getattr(base.Shape, n1) # Show Reference1 and cusomize options within self.form.geo1Reference.show() self.form.geo1Reference_label.show() self.form.geo1Reference_label.setText('Reference: {}'.format(n1)) self.customizeReference_1(n1, single=True) # Hide Reference2 self.form.geo2Reference.hide() self.form.geo2Reference_label.hide() self.form.geo2Reference_label.setText('End Reference') if self.CATS[1]: self.CATS[1] = None elif subCnt == 2: debugMsg(' -subCnt == 2') n1 = sublist[0] n2 = sublist[1] s1 = getattr(base.Shape, n1) s2 = getattr(base.Shape, n2) # Show Reference1 and cusomize options within self.form.geo1Reference.show() self.form.geo1Reference_label.show() self.form.geo1Reference_label.setText('Start Reference: {}'.format(n1)) self.customizeReference_1(n1) # Show Reference2 and cusomize options within self.form.geo2Reference.show() self.form.geo2Reference_label.show() self.form.geo2Reference_label.setText('End Reference: {}'.format(n2)) self.customizeReference_2(n2) else: self.form.pathOrientation_label.hide() self.form.pathOrientation.hide() if hideFeatures: # reset values self.CATS = [None, None] self.selectInComboBox('Start to End', self.form.pathOrientation) # hide inputs and show message self.form.featureReferences.hide() self.form.customPoints.show() def customizeReference_1(self, sub, single=False): debugMsg('customizeReference_1()') # Customize Reference1 combobox options # by removing unavailable choices cat = sub[:4] if cat != self.CATS[0]: self.CATS[0] = cat slot = PathSlot.ObjectSlot enums = slot._makeReference1Enumerations(slot, sub, single) self.ENUMS['Reference1'] = enums debugMsg('Ref1: {}'.format(enums)) self._updateComboBox(self.form.geo1Reference, enums) # self.form.geo1Reference.setCurrentIndex(0) # self.form.geo1Reference.setCurrentText(enums[0]) def customizeReference_2(self, sub): debugMsg('customizeReference_2()') # Customize Reference2 combobox options # by removing unavailable choices cat = sub[:4] if cat != self.CATS[1]: self.CATS[1] = cat slot = PathSlot.ObjectSlot enums = slot._makeReference2Enumerations(slot, sub) self.ENUMS['Reference2'] = enums debugMsg('Ref2: {}'.format(enums)) self._updateComboBox(self.form.geo2Reference, enums) # self.form.geo2Reference.setCurrentIndex(0) # self.form.geo2Reference.setCurrentText(enums[0]) def registerSignalHandlers(self, obj): # debugMsg('registerSignalHandlers()') # self.form.pathOrientation.currentIndexChanged.connect(self.updateVisibility) pass def _updateComboBox(self, cBox, enums): cBox.blockSignals(True) cBox.clear() cBox.addItems(enums) cBox.blockSignals(False) Command = PathOpGui.SetupOperation('Slot', PathSlot.Create, TaskPanelOpPage, 'Path_Slot', QtCore.QT_TRANSLATE_NOOP("Path_Slot", "Slot"), QtCore.QT_TRANSLATE_NOOP("Path_Slot", "Create a Slot operation from selected geometry or custom points."), PathSlot.SetupProperties) FreeCAD.Console.PrintLog("Loading PathSlotGui... done\n")