From eff8826ca7d2aa2d4a890d04749b0badb247e35c Mon Sep 17 00:00:00 2001 From: PaddleStroke Date: Tue, 22 Oct 2024 17:45:29 +0200 Subject: [PATCH] Assembly: Joint creation: add expression support to spinboxes --- src/Mod/Assembly/JointObject.py | 63 ++++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 20 deletions(-) diff --git a/src/Mod/Assembly/JointObject.py b/src/Mod/Assembly/JointObject.py index fa3a6c3a93..4743711ca9 100644 --- a/src/Mod/Assembly/JointObject.py +++ b/src/Mod/Assembly/JointObject.py @@ -1211,22 +1211,6 @@ class TaskAssemblyCreateJoint(QtCore.QObject): self.jType = JointTypes[self.form.jointType.currentIndex()] self.form.jointType.currentIndexChanged.connect(self.onJointTypeChanged) - self.form.distanceSpinbox.valueChanged.connect(self.onDistanceChanged) - self.form.distanceSpinbox2.valueChanged.connect(self.onDistance2Changed) - self.form.offsetSpinbox.valueChanged.connect(self.onOffsetChanged) - self.form.rotationSpinbox.valueChanged.connect(self.onRotationChanged) - self.form.offset1Button.clicked.connect(self.onOffset1Clicked) - self.form.offset2Button.clicked.connect(self.onOffset2Clicked) - - self.form.limitCheckbox1.stateChanged.connect(self.adaptUi) - self.form.limitCheckbox2.stateChanged.connect(self.adaptUi) - self.form.limitCheckbox3.stateChanged.connect(self.adaptUi) - self.form.limitCheckbox4.stateChanged.connect(self.adaptUi) - self.form.limitLenMinSpinbox.valueChanged.connect(self.onLimitLenMinChanged) - self.form.limitLenMaxSpinbox.valueChanged.connect(self.onLimitLenMaxChanged) - self.form.limitRotMinSpinbox.valueChanged.connect(self.onLimitRotMinChanged) - self.form.limitRotMaxSpinbox.valueChanged.connect(self.onLimitRotMaxChanged) - self.form.reverseRotCheckbox.setChecked(self.jType == "Gears") self.form.reverseRotCheckbox.stateChanged.connect(self.reverseRotToggled) @@ -1259,6 +1243,33 @@ class TaskAssemblyCreateJoint(QtCore.QObject): self.adaptUi() + self.form.distanceSpinbox.valueChanged.connect(self.onDistanceChanged) + self.form.distanceSpinbox2.valueChanged.connect(self.onDistance2Changed) + self.form.offsetSpinbox.valueChanged.connect(self.onOffsetChanged) + self.form.rotationSpinbox.valueChanged.connect(self.onRotationChanged) + bind = Gui.ExpressionBinding(self.form.distanceSpinbox).bind(self.joint, "Distance") + bind = Gui.ExpressionBinding(self.form.distanceSpinbox2).bind(self.joint, "Distance2") + bind = Gui.ExpressionBinding(self.form.offsetSpinbox).bind(self.joint, "Offset2.Base.z") + bind = Gui.ExpressionBinding(self.form.rotationSpinbox).bind( + self.joint, "Offset2.Rotation.Yaw" + ) + self.form.offset1Button.clicked.connect(self.onOffset1Clicked) + self.form.offset2Button.clicked.connect(self.onOffset2Clicked) + + self.form.limitCheckbox1.stateChanged.connect(self.adaptUi) + self.form.limitCheckbox2.stateChanged.connect(self.adaptUi) + self.form.limitCheckbox3.stateChanged.connect(self.adaptUi) + self.form.limitCheckbox4.stateChanged.connect(self.adaptUi) + + self.form.limitLenMinSpinbox.valueChanged.connect(self.onLimitLenMinChanged) + self.form.limitLenMaxSpinbox.valueChanged.connect(self.onLimitLenMaxChanged) + self.form.limitRotMinSpinbox.valueChanged.connect(self.onLimitRotMinChanged) + self.form.limitRotMaxSpinbox.valueChanged.connect(self.onLimitRotMaxChanged) + bind = Gui.ExpressionBinding(self.form.limitLenMinSpinbox).bind(self.joint, "LengthMin") + bind = Gui.ExpressionBinding(self.form.limitLenMaxSpinbox).bind(self.joint, "LengthMax") + bind = Gui.ExpressionBinding(self.form.limitRotMinSpinbox).bind(self.joint, "AngleMin") + bind = Gui.ExpressionBinding(self.form.limitRotMaxSpinbox).bind(self.joint, "AngleMax") + if self.creating: # This has to be after adaptUi so that properties default values are adapted # if needed. For instance for gears adaptUi will prevent radii from being 0 @@ -1625,16 +1636,28 @@ class TaskAssemblyCreateJoint(QtCore.QObject): needAngleLimits = self.jType in JointUsingLimitAngle if needLengthLimits: distance = UtilsAssembly.getJointDistance(self.joint) - if not self.form.limitCheckbox1.isChecked(): + if ( + not self.form.limitCheckbox1.isChecked() + and self.form.limitLenMinSpinbox.property("expression") == "" + ): self.form.limitLenMinSpinbox.setProperty("rawValue", distance) - if not self.form.limitCheckbox2.isChecked(): + if ( + not self.form.limitCheckbox2.isChecked() + and self.form.limitLenMaxSpinbox.property("expression") == "" + ): self.form.limitLenMaxSpinbox.setProperty("rawValue", distance) if needAngleLimits: angle = UtilsAssembly.getJointXYAngle(self.joint) / math.pi * 180 - if not self.form.limitCheckbox3.isChecked(): + if ( + not self.form.limitCheckbox3.isChecked() + and self.form.limitRotMinSpinbox.property("expression") == "" + ): self.form.limitRotMinSpinbox.setProperty("rawValue", angle) - if not self.form.limitCheckbox4.isChecked(): + if ( + not self.form.limitCheckbox4.isChecked() + and self.form.limitRotMaxSpinbox.property("expression") == "" + ): self.form.limitRotMaxSpinbox.setProperty("rawValue", angle) def moveMouse(self, info):