From 9e5fcc001fce825d033e1f1154996eba37c85f4a Mon Sep 17 00:00:00 2001 From: Syres916 <46537884+Syres916@users.noreply.github.com> Date: Wed, 20 Dec 2023 18:30:49 +0000 Subject: [PATCH] [PartDesign] Sprocket fix bug with translated references --- src/Mod/PartDesign/SprocketFeature.py | 204 +++++++++++++++++--------- 1 file changed, 135 insertions(+), 69 deletions(-) diff --git a/src/Mod/PartDesign/SprocketFeature.py b/src/Mod/PartDesign/SprocketFeature.py index 8677194fd5..74000dbb25 100644 --- a/src/Mod/PartDesign/SprocketFeature.py +++ b/src/Mod/PartDesign/SprocketFeature.py @@ -86,63 +86,98 @@ class Sprocket: ANSI B29.1-2011 standard roller chain sizes in USCS units (inches) {size: [Pitch, Roller Diameter]} """ - SprocketReferenceRollerTable = {"ANSI 25": [0.250, 0.130, 0.110], - "ANSI 35": [0.375, 0.200, 0.168], - "ANSI 41": [0.500, 0.306, 0.227], - "ANSI 40": [0.500, 0.312, 0.284], - "ANSI 50": [0.625, 0.400, 0.343], - "ANSI 60": [0.750, 0.469, 0.459], - "ANSI 80": [1.000, 0.625, 0.575], - "ANSI 100":[1.250, 0.750, 0.692], - "ANSI 120":[1.500, 0.875, 0.924], - "ANSI 140":[1.750, 1.000, 0.924], - "ANSI 160":[2.000, 1.125, 1.156], - "ANSI 180":[2.250, 1.460, 1.301], - "ANSI 200":[2.500, 1.562, 1.389], - "ANSI 240":[3.000, 1.875, 1.738], - "Bicycle with Derailleur":[0.500, 0.3125, 0.11], - "Bicycle without Derailleur":[0.500, 0.3125, 0.084], - "ISO 606 06B":[0.375, 5.72/25.4, 5.2/25.4], - "ISO 606 08B":[0.500, 7.75/25.4, 7.0/25.4], - "ISO 606 10B":[0.625, 9.65/25.4, 9.1/25.4], - "ISO 606 12B":[0.750, 11.68/25.4, 11.1/25.4], - "ISO 606 16B":[1.000, 17.02/25.4, 16.2/25.4], - "ISO 606 20B":[1.250, 19.56/25.4, 18.5/25.4], - "ISO 606 24B":[1.500, 25.4/25.4, 24.1/25.4], - "Motorcycle 420":[0.500, 0.3125, 0.227], - "Motorcycle 425":[0.500, 0.3125, 0.284], - "Motorcycle 428":[0.500, 0.335, 0.284], - "Motorcycle 520":[0.625, 0.400, 0.227], - "Motorcycle 525":[0.625, 0.400, 0.284], - "Motorcycle 530":[0.625, 0.400, 0.343], - "Motorcycle 630":[0.750, 0.400, 0.343]} + SprocketReferenceRollerTable = { + 0: [0.250, 0.130, 0.110], + 1: [0.375, 0.200, 0.168], + 2: [0.500, 0.306, 0.227], + 3: [0.500, 0.312, 0.284], + 4: [0.625, 0.400, 0.343], + 5: [0.750, 0.469, 0.459], + 6: [1.000, 0.625, 0.575], + 7: [1.250, 0.750, 0.692], + 8: [1.500, 0.875, 0.924], + 9: [1.750, 1.000, 0.924], + 10: [2.000, 1.125, 1.156], + 11: [2.250, 1.460, 1.301], + 12: [2.500, 1.562, 1.389], + 13: [3.000, 1.875, 1.738], + 14: [0.500, 0.3125, 0.11], + 15: [0.500, 0.3125, 0.084], + 16: [0.375, 5.72 / 25.4, 5.2 / 25.4], + 17: [0.500, 7.75 / 25.4, 7.0 / 25.4], + 18: [0.625, 9.65 / 25.4, 9.1 / 25.4], + 19: [0.750, 11.68 / 25.4, 11.1 / 25.4], + 20: [1.000, 17.02 / 25.4, 16.2 / 25.4], + 21: [1.250, 19.56 / 25.4, 18.5 / 25.4], + 22: [1.500, 25.4 / 25.4, 24.1 / 25.4], + 23: [0.500, 0.3125, 0.227], + 24: [0.500, 0.3125, 0.284], + 25: [0.500, 0.335, 0.284], + 26: [0.625, 0.400, 0.227], + 27: [0.625, 0.400, 0.284], + 28: [0.625, 0.400, 0.343], + 29: [0.750, 0.400, 0.343], + } - def __init__(self,obj): + def __init__(self, obj): self.Type = "Sprocket" - obj.addProperty("App::PropertyInteger","NumberOfTeeth","Sprocket","Number of gear teeth") - obj.addProperty("App::PropertyLength","Pitch","Sprocket","Chain Pitch") - obj.addProperty("App::PropertyLength","RollerDiameter","Sprocket","Roller Diameter") - obj.addProperty("App::PropertyEnumeration","SprocketReference","Sprocket","Sprocket Reference") - obj.addProperty("App::PropertyLength","Thickness","Sprocket","Thickness as stated in the reference specification") - - obj.SprocketReference = list(self.SprocketReferenceRollerTable) - - obj.NumberOfTeeth = 50 - obj.Pitch = "0.375 in" - obj.RollerDiameter = "0.20 in" - obj.SprocketReference = "ANSI 35" - obj.Thickness = "0.11 in" - + self.indx = 0 + self.sprockRef = [] + # As the UI file combobox has been translated the reference field needs populating here + tempForm = FreeCADGui.PySideUic.loadUi( + FreeCAD.getHomePath() + "Mod/PartDesign/SprocketFeature.ui" + ) + for sKey in self.SprocketReferenceRollerTable: + tempForm.comboBox_SprocketReference.setCurrentIndex(self.indx) + self.sprockRef.append(tempForm.comboBox_SprocketReference.currentText()) + self.indx += 1 + self._ensure_properties(obj, is_restore=False) + obj.addProperty( + "App::PropertyEnumeration", + "SprocketReference", + "Sprocket", + "Sprocket Reference", + ) + obj.SprocketReference = list(self.sprockRef) obj.Proxy = self + def onDocumentRestored(self, obj): + print(self.sprockRef[1]) + """hook used to migrate older versions of this object""" + self._ensure_properties(obj, is_restore=True) - def execute(self,obj): + def _ensure_properties(self, obj, is_restore): + def ensure_property(type_, name, doc, default): + if not hasattr(obj, name): + obj.addProperty(type_, name, "Sprocket") + if callable(default): + setattr(obj, name, default()) + else: + setattr(obj, name, default) + + ensure_property( + "App::PropertyInteger", "NumberOfTeeth", "Number of gear teeth", 50 + ) + ensure_property("App::PropertyLength", "Pitch", "Chain Pitch", "0.375 in") + ensure_property( + "App::PropertyLength", "RollerDiameter", "Roller Diameter", "0.20 in" + ) + ensure_property( + "App::PropertyLength", + "Thickness", + "Thickness as stated in the reference specification", + "0.11 in", + ) + + def execute(self, obj): w = fcsprocket.FCWireBuilder() - sprocket.CreateSprocket(w, obj.Pitch.Value, obj.NumberOfTeeth, obj.RollerDiameter.Value) + sprocket.CreateSprocket( + w, obj.Pitch.Value, obj.NumberOfTeeth, obj.RollerDiameter.Value + ) sprocketw = Part.Wire([o.toShape() for o in w.wire]) obj.Shape = sprocketw - obj.positionBySupport(); + obj.positionBySupport() return @@ -151,7 +186,7 @@ class ViewProviderSprocket: A View Provider for the Sprocket object """ - def __init__(self,vobj): + def __init__(self, vobj): vobj.Proxy = self def getIcon(self): @@ -161,21 +196,21 @@ class ViewProviderSprocket: self.ViewObject = vobj self.Object = vobj.Object - def setEdit(self,vobj,mode): - taskd = SprocketTaskPanel(self.Object,mode) + def setEdit(self, vobj, mode): + taskd = SprocketTaskPanel(self.Object, mode) taskd.obj = vobj.Object taskd.update() FreeCADGui.Control.showDialog(taskd) return True - def unsetEdit(self,vobj,mode): + def unsetEdit(self, vobj, mode): FreeCADGui.Control.closeDialog() return def dumps(self): return None - def loads(self,state): + def loads(self, state): return None @@ -184,21 +219,43 @@ class SprocketTaskPanel: The editmode TaskPanel for Sprocket objects """ - def __init__(self,obj,mode): + def __init__(self, obj, mode): self.obj = obj - self.form=FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/PartDesign/SprocketFeature.ui") + self.form = FreeCADGui.PySideUic.loadUi( + FreeCAD.getHomePath() + "Mod/PartDesign/SprocketFeature.ui" + ) self.form.setWindowIcon(QtGui.QIcon(":/icons/PartDesign_Sprocket.svg")) - QtCore.QObject.connect(self.form.Quantity_Pitch, QtCore.SIGNAL("valueChanged(double)"), self.pitchChanged) - QtCore.QObject.connect(self.form.Quantity_RollerDiameter, QtCore.SIGNAL("valueChanged(double)"), self.rollerDiameterChanged) - QtCore.QObject.connect(self.form.spinBox_NumberOfTeeth, QtCore.SIGNAL("valueChanged(int)"), self.numTeethChanged) - QtCore.QObject.connect(self.form.comboBox_SprocketReference, QtCore.SIGNAL("currentTextChanged(const QString)"), self.sprocketReferenceChanged) - QtCore.QObject.connect(self.form.Quantity_Thickness, QtCore.SIGNAL("valueChanged(double)"), self.thicknessChanged) + QtCore.QObject.connect( + self.form.Quantity_Pitch, + QtCore.SIGNAL("valueChanged(double)"), + self.pitchChanged, + ) + QtCore.QObject.connect( + self.form.Quantity_RollerDiameter, + QtCore.SIGNAL("valueChanged(double)"), + self.rollerDiameterChanged, + ) + QtCore.QObject.connect( + self.form.spinBox_NumberOfTeeth, + QtCore.SIGNAL("valueChanged(int)"), + self.numTeethChanged, + ) + QtCore.QObject.connect( + self.form.comboBox_SprocketReference, + QtCore.SIGNAL("currentIndexChanged(int)"), + self.sprocketReferenceChanged, + ) + QtCore.QObject.connect( + self.form.Quantity_Thickness, + QtCore.SIGNAL("valueChanged(double)"), + self.thicknessChanged, + ) self.update() - if mode == 0: # fresh created + if mode == 0: # fresh created self.obj.Proxy.execute(self.obj) # calculate once FreeCAD.Gui.SendMsgToActiveView("ViewFit") @@ -209,7 +266,7 @@ class SprocketTaskPanel: self.obj.NumberOfTeeth = self.form.spinBox_NumberOfTeeth.value() self.obj.Pitch = self.form.Quantity_Pitch.text() self.obj.RollerDiameter = self.form.Quantity_RollerDiameter.text() - self.obj.SprocketReference = self.form.comboBox_SprocketReference.currentText() + self.obj.SprocketReference = self.form.comboBox_SprocketReference.currentIndex() self.obj.Thickness = self.form.Quantity_Thickness.text() def transferFrom(self): @@ -228,14 +285,17 @@ class SprocketTaskPanel: FreeCAD.Gui.SendMsgToActiveView("ViewFit") def sprocketReferenceChanged(self, size): - self.obj.Pitch = str(Sprocket.SprocketReferenceRollerTable[size][0]) + " in" - self.obj.RollerDiameter = str(Sprocket.SprocketReferenceRollerTable[size][1]) + " in" - self.obj.Thickness = str(Sprocket.SprocketReferenceRollerTable[size][2]) + " in" - self.obj.SprocketReference = str(size) + self.obj.Pitch = str(Sprocket.SprocketReferenceRollerTable[size][0]) + " in" + self.obj.RollerDiameter = ( + str(Sprocket.SprocketReferenceRollerTable[size][1]) + " in" + ) + self.obj.Thickness = str(Sprocket.SprocketReferenceRollerTable[size][2]) + " in" + self.obj.SprocketReference = self.obj.getEnumerationsOfProperty( + "SprocketReference" + )[size] self.form.Quantity_Pitch.setText(self.obj.Pitch.UserString) self.form.Quantity_RollerDiameter.setText(self.obj.RollerDiameter.UserString) self.form.Quantity_Thickness.setText(self.obj.Thickness.UserString) - self.obj.Proxy.execute(self.obj) FreeCAD.Gui.SendMsgToActiveView("ViewFit") @@ -253,9 +313,13 @@ class SprocketTaskPanel: self.obj.Proxy.execute(self.obj) def getStandardButtons(self): - return int(QtGui.QDialogButtonBox.Ok) | int(QtGui.QDialogButtonBox.Cancel)| int(QtGui.QDialogButtonBox.Apply) + return ( + int(QtGui.QDialogButtonBox.Ok) + | int(QtGui.QDialogButtonBox.Cancel) + | int(QtGui.QDialogButtonBox.Apply) + ) - def clicked(self,button): + def clicked(self, button): if button == QtGui.QDialogButtonBox.Apply: self.transferTo() self.obj.Proxy.execute(self.obj) @@ -269,6 +333,8 @@ class SprocketTaskPanel: FreeCADGui.ActiveDocument.resetEdit() def reject(self): + FreeCAD.ActiveDocument.removeObject(self.obj.Name) + FreeCAD.ActiveDocument.recompute() FreeCADGui.ActiveDocument.resetEdit() FreeCAD.ActiveDocument.abortTransaction()