Add Draft workbench to .pre-commit-config (#24664)

* Add Draft workbench to .pre-commit-config

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
marcuspollio
2025-10-15 11:21:09 +02:00
committed by GitHub
parent 87f88bba30
commit 50e4864efb
225 changed files with 10713 additions and 9269 deletions

View File

@@ -96,11 +96,11 @@ class TaskPanelCircularArray:
self.fuse = params.get_param("Draft_array_fuse")
self.use_link = params.get_param("Draft_array_Link")
self.form.input_c_x.setProperty('rawValue', self.center.x)
self.form.input_c_y.setProperty('rawValue', self.center.y)
self.form.input_c_z.setProperty('rawValue', self.center.z)
self.form.spinbox_r_distance.setProperty('rawValue', self.r_distance)
self.form.spinbox_tan_distance.setProperty('rawValue', self.tan_distance)
self.form.input_c_x.setProperty("rawValue", self.center.x)
self.form.input_c_y.setProperty("rawValue", self.center.y)
self.form.input_c_z.setProperty("rawValue", self.center.z)
self.form.spinbox_r_distance.setProperty("rawValue", self.r_distance)
self.form.spinbox_tan_distance.setProperty("rawValue", self.tan_distance)
self.form.spinbox_number.setValue(self.number)
self.form.spinbox_symmetry.setValue(self.symmetry)
self.form.checkbox_fuse.setChecked(self.fuse)
@@ -129,75 +129,77 @@ class TaskPanelCircularArray:
self.form.button_reset.clicked.connect(self.reset_point)
# When the checkbox changes, change the internal value
if hasattr(self.form.checkbox_fuse, "checkStateChanged"): # Qt version >= 6.7.0
if hasattr(self.form.checkbox_fuse, "checkStateChanged"): # Qt version >= 6.7.0
self.form.checkbox_fuse.checkStateChanged.connect(self.set_fuse)
self.form.checkbox_link.checkStateChanged.connect(self.set_link)
else: # Qt version < 6.7.0
else: # Qt version < 6.7.0
self.form.checkbox_fuse.stateChanged.connect(self.set_fuse)
self.form.checkbox_link.stateChanged.connect(self.set_link)
def accept(self):
"""Execute when clicking the OK button or Enter key."""
self.selection = Gui.Selection.getSelection()
(self.r_distance,
self.tan_distance) = self.get_distances()
(self.r_distance, self.tan_distance) = self.get_distances()
(self.number,
self.symmetry) = self.get_number_symmetry()
(self.number, self.symmetry) = self.get_number_symmetry()
self.axis = self.get_axis()
self.center = self.get_center()
self.valid_input = self.validate_input(self.selection,
self.r_distance,
self.tan_distance,
self.number,
self.symmetry,
self.axis,
self.center)
self.valid_input = self.validate_input(
self.selection,
self.r_distance,
self.tan_distance,
self.number,
self.symmetry,
self.axis,
self.center,
)
if self.valid_input:
self.create_object()
# The internal function already displays messages
self.finish()
def validate_input(self, selection,
r_distance, tan_distance,
number, symmetry,
axis, center):
def validate_input(self, selection, r_distance, tan_distance, number, symmetry, axis, center):
"""Check that the input is valid.
Some values may not need to be checked because
the interface may not allow one to input wrong data.
"""
if not selection:
_err(translate("draft","At least 1 element must be selected"))
_err(translate("draft", "At least 1 element must be selected"))
return False
if number < 2:
_err(translate("draft","Number of layers must be at least 2"))
_err(translate("draft", "Number of layers must be at least 2"))
return False
# TODO: this should handle multiple objects.
# Each of the elements of the selection should be tested.
obj = selection[0]
if obj.isDerivedFrom("App::FeaturePython"):
_err(translate("draft","Selection is not suitable for array"))
_err(translate("draft","Object:") + " {}".format(selection[0].Label))
_err(translate("draft", "Selection is not suitable for array"))
_err(translate("draft", "Object:") + " {}".format(selection[0].Label))
return False
if r_distance == 0:
_wrn(translate("draft","Radial distance is zero. Resulting array may not look correct."))
_wrn(
translate("draft", "Radial distance is zero. Resulting array may not look correct.")
)
elif r_distance < 0:
_wrn(translate("draft","Radial distance is negative. It is made positive to proceed."))
_wrn(translate("draft", "Radial distance is negative. It is made positive to proceed."))
self.r_distance = abs(r_distance)
if tan_distance == 0:
_err(translate("draft","Tangential distance cannot be 0"))
_err(translate("draft", "Tangential distance cannot be 0"))
return False
elif tan_distance < 0:
_wrn(translate("draft","Tangential distance is negative. It is made positive to proceed."))
_wrn(
translate(
"draft", "Tangential distance is negative. It is made positive to proceed."
)
)
self.tan_distance = abs(tan_distance)
# The other arguments are not tested but they should be present.
@@ -246,22 +248,23 @@ class TaskPanelCircularArray:
_cmd += "use_link=" + str(self.use_link)
_cmd += ")"
Gui.addModule('Draft')
Gui.addModule("Draft")
_cmd_list = ["_obj_ = " + _cmd,
"_obj_.Fuse = " + str(self.fuse),
"Draft.autogroup(_obj_)",
"App.ActiveDocument.recompute()"]
_cmd_list = [
"_obj_ = " + _cmd,
"_obj_.Fuse = " + str(self.fuse),
"Draft.autogroup(_obj_)",
"App.ActiveDocument.recompute()",
]
# We commit the command list through the parent command
self.source_command.commit(translate("draft","Create Circular Array"), _cmd_list)
self.source_command.commit(translate("draft", "Create Circular Array"), _cmd_list)
def get_distances(self):
"""Get the distance parameters from the widgets."""
r_d_str = self.form.spinbox_r_distance.text()
tan_d_str = self.form.spinbox_tan_distance.text()
return (U.Quantity(r_d_str).Value,
U.Quantity(tan_d_str).Value)
return (U.Quantity(r_d_str).Value, U.Quantity(tan_d_str).Value)
def get_number_symmetry(self):
"""Get the number and symmetry parameters from the widgets."""
@@ -274,9 +277,9 @@ class TaskPanelCircularArray:
c_x_str = self.form.input_c_x.text()
c_y_str = self.form.input_c_y.text()
c_z_str = self.form.input_c_z.text()
center = App.Vector(U.Quantity(c_x_str).Value,
U.Quantity(c_y_str).Value,
U.Quantity(c_z_str).Value)
center = App.Vector(
U.Quantity(c_x_str).Value, U.Quantity(c_y_str).Value, U.Quantity(c_z_str).Value
)
return center
def get_axis(self):
@@ -289,9 +292,9 @@ class TaskPanelCircularArray:
def reset_point(self):
"""Reset the center point to the original distance."""
self.form.input_c_x.setProperty('rawValue', 0)
self.form.input_c_y.setProperty('rawValue', 0)
self.form.input_c_z.setProperty('rawValue', 0)
self.form.input_c_x.setProperty("rawValue", 0)
self.form.input_c_y.setProperty("rawValue", 0)
self.form.input_c_z.setProperty("rawValue", 0)
self.center = self.get_center()
@@ -301,7 +304,7 @@ class TaskPanelCircularArray:
state = self.tr_true
else:
state = self.tr_false
_msg(translate("draft","Fuse:") + " {}".format(state))
_msg(translate("draft", "Fuse:") + " {}".format(state))
def set_fuse(self):
"""Execute as a callback when the fuse checkbox changes."""
@@ -314,14 +317,13 @@ class TaskPanelCircularArray:
state = self.tr_true
else:
state = self.tr_false
_msg(translate("draft","Create Link array:") + " {}".format(state))
_msg(translate("draft", "Create Link array:") + " {}".format(state))
def set_link(self):
"""Execute as a callback when the link checkbox changes."""
self.use_link = self.form.checkbox_link.isChecked()
params.set_param("Draft_array_Link", self.use_link)
def print_messages(self):
"""Print messages about the operation."""
if len(self.selection) == 1:
@@ -331,15 +333,15 @@ class TaskPanelCircularArray:
# For example, it could take the shapes of all objects,
# make a compound and then use it as input for the array function.
sel_obj = self.selection[0]
_msg(translate("draft","Object:") + " {}".format(sel_obj.Label))
_msg(translate("draft","Radial distance:") + " {}".format(self.r_distance))
_msg(translate("draft","Tangential distance:") + " {}".format(self.tan_distance))
_msg(translate("draft","Number of concentric circles:") + " {}".format(self.number))
_msg(translate("draft","Symmetry parameter:") + " {}".format(self.symmetry))
_msg(translate("draft","Center of rotation:")
+ " ({0}, {1}, {2})".format(self.center.x,
self.center.y,
self.center.z))
_msg(translate("draft", "Object:") + " {}".format(sel_obj.Label))
_msg(translate("draft", "Radial distance:") + " {}".format(self.r_distance))
_msg(translate("draft", "Tangential distance:") + " {}".format(self.tan_distance))
_msg(translate("draft", "Number of concentric circles:") + " {}".format(self.number))
_msg(translate("draft", "Symmetry parameter:") + " {}".format(self.symmetry))
_msg(
translate("draft", "Center of rotation:")
+ " ({0}, {1}, {2})".format(self.center.x, self.center.y, self.center.z)
)
self.print_fuse_state(self.fuse)
self.print_link_state(self.use_link)
@@ -380,24 +382,24 @@ class TaskPanelCircularArray:
# sby = self.form.spinbox_c_y
# sbz = self.form.spinbox_c_z
if d_p:
if self.mask in ('y', 'z'):
if self.mask in ("y", "z"):
# sbx.setText(displayExternal(d_p.x, None, 'Length'))
self.form.input_c_x.setProperty('rawValue', d_p.x)
self.form.input_c_x.setProperty("rawValue", d_p.x)
else:
# sbx.setText(displayExternal(d_p.x, None, 'Length'))
self.form.input_c_x.setProperty('rawValue', d_p.x)
if self.mask in ('x', 'z'):
self.form.input_c_x.setProperty("rawValue", d_p.x)
if self.mask in ("x", "z"):
# sby.setText(displayExternal(d_p.y, None, 'Length'))
self.form.input_c_y.setProperty('rawValue', d_p.y)
self.form.input_c_y.setProperty("rawValue", d_p.y)
else:
# sby.setText(displayExternal(d_p.y, None, 'Length'))
self.form.input_c_y.setProperty('rawValue', d_p.y)
if self.mask in ('x', 'y'):
self.form.input_c_y.setProperty("rawValue", d_p.y)
if self.mask in ("x", "y"):
# sbz.setText(displayExternal(d_p.z, None, 'Length'))
self.form.input_c_z.setProperty('rawValue', d_p.z)
self.form.input_c_z.setProperty("rawValue", d_p.z)
else:
# sbz.setText(displayExternal(d_p.z, None, 'Length'))
self.form.input_c_z.setProperty('rawValue', d_p.z)
self.form.input_c_z.setProperty("rawValue", d_p.z)
if plane:
pass
@@ -452,4 +454,5 @@ class TaskPanelCircularArray:
# Runs the parent command to complete the call
self.source_command.completed()
## @}

View File

@@ -94,17 +94,17 @@ class TaskPanelOrthoArray:
self.v_y = App.Vector(0, start_y, 0)
self.v_z = App.Vector(0, 0, start_z)
self.form.input_X_x.setProperty('rawValue', self.v_x.x)
self.form.input_X_y.setProperty('rawValue', self.v_x.y)
self.form.input_X_z.setProperty('rawValue', self.v_x.z)
self.form.input_X_x.setProperty("rawValue", self.v_x.x)
self.form.input_X_y.setProperty("rawValue", self.v_x.y)
self.form.input_X_z.setProperty("rawValue", self.v_x.z)
self.form.input_Y_x.setProperty('rawValue', self.v_y.x)
self.form.input_Y_y.setProperty('rawValue', self.v_y.y)
self.form.input_Y_z.setProperty('rawValue', self.v_y.z)
self.form.input_Y_x.setProperty("rawValue", self.v_y.x)
self.form.input_Y_y.setProperty("rawValue", self.v_y.y)
self.form.input_Y_z.setProperty("rawValue", self.v_y.z)
self.form.input_Z_x.setProperty('rawValue', self.v_z.x)
self.form.input_Z_y.setProperty('rawValue', self.v_z.y)
self.form.input_Z_z.setProperty('rawValue', self.v_z.z)
self.form.input_Z_x.setProperty("rawValue", self.v_z.x)
self.form.input_Z_y.setProperty("rawValue", self.v_z.y)
self.form.input_Z_z.setProperty("rawValue", self.v_z.z)
self.n_x = params.get_param("XNumOfElements", "Mod/Draft/OrthoArrayLinearMode")
self.n_y = params.get_param("YNumOfElements", "Mod/Draft/OrthoArrayLinearMode")
@@ -154,10 +154,10 @@ class TaskPanelOrthoArray:
self.form.button_reset_Z.clicked.connect(lambda: self.reset_v("Z"))
# When the checkbox changes, change the internal value
if hasattr(self.form.checkbox_fuse, "checkStateChanged"): # Qt version >= 6.7.0
if hasattr(self.form.checkbox_fuse, "checkStateChanged"): # Qt version >= 6.7.0
self.form.checkbox_fuse.checkStateChanged.connect(self.set_fuse)
self.form.checkbox_link.checkStateChanged.connect(self.set_link)
else: # Qt version < 6.7.0
else: # Qt version < 6.7.0
self.form.checkbox_fuse.stateChanged.connect(self.set_fuse)
self.form.checkbox_link.stateChanged.connect(self.set_link)
@@ -167,71 +167,72 @@ class TaskPanelOrthoArray:
self.form.radiobutton_y_axis.clicked.connect(lambda: self.set_active_axis("Y"))
self.form.radiobutton_z_axis.clicked.connect(lambda: self.set_active_axis("Z"))
def accept(self):
"""Execute when clicking the OK button or Enter key."""
self.selection = Gui.Selection.getSelection()
(self.v_x,
self.v_y,
self.v_z) = self.get_intervals()
(self.v_x, self.v_y, self.v_z) = self.get_intervals()
(self.n_x,
self.n_y,
self.n_z) = self.get_numbers()
(self.n_x, self.n_y, self.n_z) = self.get_numbers()
self.valid_input = self.validate_input(self.selection,
self.v_x, self.v_y, self.v_z,
self.n_x, self.n_y, self.n_z)
self.valid_input = self.validate_input(
self.selection, self.v_x, self.v_y, self.v_z, self.n_x, self.n_y, self.n_z
)
if self.valid_input:
axis_values = {
'X': (self.v_x.x, self.n_x),
'Y': (self.v_y.y, self.n_y),
'Z': (self.v_z.z, self.n_z),
"X": (self.v_x.x, self.n_x),
"Y": (self.v_y.y, self.n_y),
"Z": (self.v_z.z, self.n_z),
}
values = axis_values.get(self.active_axis)
if values is not None:
interval, num_elements = values
# Set interval
params.set_param(f"{self.active_axis}Interval", interval, "Mod/Draft/OrthoArrayLinearMode")
params.set_param(
f"{self.active_axis}Interval", interval, "Mod/Draft/OrthoArrayLinearMode"
)
# Set number of elements
params.set_param(f"{self.active_axis}NumOfElements", num_elements, "Mod/Draft/OrthoArrayLinearMode")
params.set_param(
f"{self.active_axis}NumOfElements",
num_elements,
"Mod/Draft/OrthoArrayLinearMode",
)
self.create_object()
# The internal function already displays messages
self.finish()
def validate_input(self, selection,
v_x, v_y, v_z,
n_x, n_y, n_z):
def validate_input(self, selection, v_x, v_y, v_z, n_x, n_y, n_z):
"""Check that the input is valid.
Some values may not need to be checked because
the interface may not allow one to input wrong data.
"""
if not selection:
_err(translate("draft","At least 1 element must be selected"))
_err(translate("draft", "At least 1 element must be selected"))
return False
if n_x < 1 or n_y < 1 or n_z < 1:
_err(translate("draft","Number of elements must be at least 1"))
_err(translate("draft", "Number of elements must be at least 1"))
return False
# TODO: this should handle multiple objects.
# Each of the elements of the selection should be tested.
obj = selection[0]
if obj.isDerivedFrom("App::FeaturePython"):
_err(translate("draft","Selection is not suitable for array"))
_err(translate("draft","Object:") + " {0} ({1})".format(obj.Label, obj.TypeId))
_err(translate("draft", "Selection is not suitable for array"))
_err(translate("draft", "Object:") + " {0} ({1})".format(obj.Label, obj.TypeId))
return False
# we should not ever do this but maybe a sanity check here?
if self.linear_mode:
if not (self.form.radiobutton_x_axis.isChecked() or
self.form.radiobutton_y_axis.isChecked() or
self.form.radiobutton_z_axis.isChecked()):
_err(translate("draft","In linear mode, at least 1 axis must be selected"))
if not (
self.form.radiobutton_x_axis.isChecked()
or self.form.radiobutton_y_axis.isChecked()
or self.form.radiobutton_z_axis.isChecked()
):
_err(translate("draft", "In linear mode, at least 1 axis must be selected"))
return False
# The other arguments are not tested but they should be present.
@@ -293,44 +294,48 @@ class TaskPanelOrthoArray:
_cmd += "use_link=" + str(self.use_link)
_cmd += ")"
Gui.addModule('Draft')
Gui.addModule("Draft")
_cmd_list = ["_obj_ = " + _cmd,
"_obj_.Fuse = " + str(self.fuse),
"Draft.autogroup(_obj_)",
"App.ActiveDocument.recompute()"]
_cmd_list = [
"_obj_ = " + _cmd,
"_obj_.Fuse = " + str(self.fuse),
"Draft.autogroup(_obj_)",
"App.ActiveDocument.recompute()",
]
# We commit the command list through the parent command
self.source_command.commit(translate("draft","Create Orthogonal Array"), _cmd_list)
self.source_command.commit(translate("draft", "Create Orthogonal Array"), _cmd_list)
def get_numbers(self):
"""Get the number of elements from the widgets."""
return (self.form.spinbox_n_X.value(),
self.form.spinbox_n_Y.value(),
self.form.spinbox_n_Z.value())
return (
self.form.spinbox_n_X.value(),
self.form.spinbox_n_Y.value(),
self.form.spinbox_n_Z.value(),
)
def get_intervals(self):
"""Get the interval vectors from the widgets."""
v_x_x_str = self.form.input_X_x.text()
v_x_y_str = self.form.input_X_y.text()
v_x_z_str = self.form.input_X_z.text()
v_x = App.Vector(U.Quantity(v_x_x_str).Value,
U.Quantity(v_x_y_str).Value,
U.Quantity(v_x_z_str).Value)
v_x = App.Vector(
U.Quantity(v_x_x_str).Value, U.Quantity(v_x_y_str).Value, U.Quantity(v_x_z_str).Value
)
v_y_x_str = self.form.input_Y_x.text()
v_y_y_str = self.form.input_Y_y.text()
v_y_z_str = self.form.input_Y_z.text()
v_y = App.Vector(U.Quantity(v_y_x_str).Value,
U.Quantity(v_y_y_str).Value,
U.Quantity(v_y_z_str).Value)
v_y = App.Vector(
U.Quantity(v_y_x_str).Value, U.Quantity(v_y_y_str).Value, U.Quantity(v_y_z_str).Value
)
v_z_x_str = self.form.input_Z_x.text()
v_z_y_str = self.form.input_Z_y.text()
v_z_z_str = self.form.input_Z_z.text()
v_z = App.Vector(U.Quantity(v_z_x_str).Value,
U.Quantity(v_z_y_str).Value,
U.Quantity(v_z_z_str).Value)
v_z = App.Vector(
U.Quantity(v_z_x_str).Value, U.Quantity(v_z_y_str).Value, U.Quantity(v_z_z_str).Value
)
return v_x, v_y, v_z
def reset_v(self, interval):
@@ -343,19 +348,19 @@ class TaskPanelOrthoArray:
for that direction.
"""
if interval == "X":
self.form.input_X_x.setProperty('rawValue', 100)
self.form.input_X_y.setProperty('rawValue', 0)
self.form.input_X_z.setProperty('rawValue', 0)
self.form.input_X_x.setProperty("rawValue", 100)
self.form.input_X_y.setProperty("rawValue", 0)
self.form.input_X_z.setProperty("rawValue", 0)
self.v_x, self.v_y, self.v_z = self.get_intervals()
elif interval == "Y":
self.form.input_Y_x.setProperty('rawValue', 0)
self.form.input_Y_y.setProperty('rawValue', 100)
self.form.input_Y_z.setProperty('rawValue', 0)
self.form.input_Y_x.setProperty("rawValue", 0)
self.form.input_Y_y.setProperty("rawValue", 100)
self.form.input_Y_z.setProperty("rawValue", 0)
self.v_x, self.v_y, self.v_z = self.get_intervals()
elif interval == "Z":
self.form.input_Z_x.setProperty('rawValue', 0)
self.form.input_Z_y.setProperty('rawValue', 0)
self.form.input_Z_z.setProperty('rawValue', 100)
self.form.input_Z_x.setProperty("rawValue", 0)
self.form.input_Z_y.setProperty("rawValue", 0)
self.form.input_Z_z.setProperty("rawValue", 100)
self.v_x, self.v_y, self.v_z = self.get_intervals()
def print_fuse_state(self, fuse):
@@ -364,7 +369,7 @@ class TaskPanelOrthoArray:
state = self.tr_true
else:
state = self.tr_false
_msg(translate("draft","Fuse:") + " {}".format(state))
_msg(translate("draft", "Fuse:") + " {}".format(state))
def set_fuse(self):
"""Execute as a callback when the fuse checkbox changes."""
@@ -377,7 +382,7 @@ class TaskPanelOrthoArray:
state = self.tr_true
else:
state = self.tr_false
_msg(translate("draft","Create link array:") + " {}".format(state))
_msg(translate("draft", "Create link array:") + " {}".format(state))
def set_link(self):
"""Execute as a callback when the link checkbox changes."""
@@ -393,23 +398,23 @@ class TaskPanelOrthoArray:
# For example, it could take the shapes of all objects,
# make a compound and then use it as input for the array function.
sel_obj = self.selection[0]
_msg(translate("draft","Object:") + " {}".format(sel_obj.Label))
_msg(translate("draft", "Object:") + " {}".format(sel_obj.Label))
_msg(translate("draft","Number of X elements:") + " {}".format(self.n_x))
_msg(translate("draft","Interval X:")
+ " ({0}, {1}, {2})".format(self.v_x.x,
self.v_x.y,
self.v_x.z))
_msg(translate("draft","Number of Y elements:") + " {}".format(self.n_y))
_msg(translate("draft","Interval Y:")
+ " ({0}, {1}, {2})".format(self.v_y.x,
self.v_y.y,
self.v_y.z))
_msg(translate("draft","Number of Z elements:") + " {}".format(self.n_z))
_msg(translate("draft","Interval Z:")
+ " ({0}, {1}, {2})".format(self.v_z.x,
self.v_z.y,
self.v_z.z))
_msg(translate("draft", "Number of X elements:") + " {}".format(self.n_x))
_msg(
translate("draft", "Interval X:")
+ " ({0}, {1}, {2})".format(self.v_x.x, self.v_x.y, self.v_x.z)
)
_msg(translate("draft", "Number of Y elements:") + " {}".format(self.n_y))
_msg(
translate("draft", "Interval Y:")
+ " ({0}, {1}, {2})".format(self.v_y.x, self.v_y.y, self.v_y.z)
)
_msg(translate("draft", "Number of Z elements:") + " {}".format(self.n_z))
_msg(
translate("draft", "Interval Z:")
+ " ({0}, {1}, {2})".format(self.v_z.x, self.v_z.y, self.v_z.z)
)
self.print_fuse_state(self.fuse)
self.print_link_state(self.use_link)
@@ -421,7 +426,7 @@ class TaskPanelOrthoArray:
"""Toggle between Linear mode and Orthogonal mode."""
self.linear_mode = self.form.button_linear_mode.isChecked()
self.toggle_axis_radiobuttons(self.linear_mode)
params.set_param("LinearModeOn" , self.linear_mode, "Mod/Draft/OrthoArrayLinearMode")
params.set_param("LinearModeOn", self.linear_mode, "Mod/Draft/OrthoArrayLinearMode")
if self.linear_mode:
self.form.button_linear_mode.setText(translate("draft", "Switch to Ortho Mode"))
@@ -446,7 +451,7 @@ class TaskPanelOrthoArray:
case "Z":
title = translate("draft", "Z-Axis")
self.form.group_linearmode.setTitle(title)
else: # ortho mode
else: # ortho mode
self.form.button_linear_mode.setText(translate("draft", "Switch to Linear Mode"))
# For ortho mode we're showing back default groupboxes and we reparent everything
@@ -458,9 +463,11 @@ class TaskPanelOrthoArray:
def toggle_axis_radiobuttons(self, show):
"""Show or hide the axis radio buttons."""
for radiobutton in [self.form.radiobutton_x_axis,
self.form.radiobutton_y_axis,
self.form.radiobutton_z_axis]:
for radiobutton in [
self.form.radiobutton_x_axis,
self.form.radiobutton_y_axis,
self.form.radiobutton_z_axis,
]:
radiobutton.setVisible(show)
def set_active_axis(self, axis):
@@ -483,7 +490,6 @@ class TaskPanelOrthoArray:
title = translate("draft", "Z-Axis")
self.form.group_linearmode.setTitle(title)
def update_axis_ui(self):
"""Update the UI to reflect the current axis selection."""
# Make sure only one axis is selected
@@ -494,9 +500,9 @@ class TaskPanelOrthoArray:
def _get_axis_widgets(self, axis):
"""Get all widgets for a specific axis."""
return {
'spinbox_elements': getattr(self.form, f"spinbox_n_{axis}", None),
'spinbox_interval': getattr(self.form, f"input_{axis}_{axis.lower()}", None),
'button_reset': getattr(self.form, f"button_reset_{axis}", None)
"spinbox_elements": getattr(self.form, f"spinbox_n_{axis}", None),
"spinbox_interval": getattr(self.form, f"input_{axis}_{axis.lower()}", None),
"button_reset": getattr(self.form, f"button_reset_{axis}", None),
}
def _clear_linear_mode_layout(self):
@@ -525,8 +531,8 @@ class TaskPanelOrthoArray:
# Add widgets to layout
widget_pairs = [
(label_elements, widgets['spinbox_elements']),
(label_interval, widgets['spinbox_interval'])
(label_elements, widgets["spinbox_elements"]),
(label_interval, widgets["spinbox_interval"]),
]
for row_index, (label, widget) in enumerate(widget_pairs):
@@ -536,8 +542,8 @@ class TaskPanelOrthoArray:
group_layout.addWidget(widget, row_index, 1)
# Add reset button spanning both columns
widgets['button_reset'].setParent(self.form.group_linearmode)
group_layout.addWidget(widgets['button_reset'], 2, 0, 1, 2)
widgets["button_reset"].setParent(self.form.group_linearmode)
group_layout.addWidget(widgets["button_reset"], 2, 0, 1, 2)
def _restore_axis_to_ortho_layout(self, axis, row_index):
"""Restore widgets for a specific axis back to their original Ortho layout positions."""
@@ -545,16 +551,16 @@ class TaskPanelOrthoArray:
# Restore spinbox elements to grid layout
grid_number_layout = self.form.findChild(QtWidgets.QGridLayout, "grid_number")
grid_number_layout.addWidget(widgets['spinbox_elements'], row_index, 1)
grid_number_layout.addWidget(widgets["spinbox_elements"], row_index, 1)
# Restore interval input to its axis-specific inner grid layout
inner_grid_layout = self.form.findChild(QtWidgets.QGridLayout, f"grid_{axis}")
inner_grid_layout.addWidget(widgets['spinbox_interval'], row_index, 1)
inner_grid_layout.addWidget(widgets["spinbox_interval"], row_index, 1)
# Restore reset button to its axis group
group_box = self.form.findChild(QtWidgets.QGroupBox, f"group_{axis}")
group_axis_layout = group_box.layout()
group_axis_layout.addWidget(widgets['button_reset'], 1, 0)
group_axis_layout.addWidget(widgets["button_reset"], 1, 0)
def _setup_ortho_mode_layout(self):
"""Restore all widgets back to their original Ortho mode layout positions."""
@@ -592,4 +598,5 @@ class TaskPanelOrthoArray:
# Runs the parent command to complete the call
self.source_command.completed()
## @}

View File

@@ -91,10 +91,10 @@ class TaskPanelPolarArray:
self.fuse = params.get_param("Draft_array_fuse")
self.use_link = params.get_param("Draft_array_Link")
self.form.input_c_x.setProperty('rawValue', self.center.x)
self.form.input_c_y.setProperty('rawValue', self.center.y)
self.form.input_c_z.setProperty('rawValue', self.center.z)
self.form.spinbox_angle.setProperty('rawValue', self.angle)
self.form.input_c_x.setProperty("rawValue", self.center.x)
self.form.input_c_y.setProperty("rawValue", self.center.y)
self.form.input_c_z.setProperty("rawValue", self.center.z)
self.form.spinbox_angle.setProperty("rawValue", self.angle)
self.form.spinbox_number.setValue(self.number)
self.form.checkbox_fuse.setChecked(self.fuse)
self.form.checkbox_link.setChecked(self.use_link)
@@ -122,61 +122,63 @@ class TaskPanelPolarArray:
self.form.button_reset.clicked.connect(self.reset_point)
# When the checkbox changes, change the internal value
if hasattr(self.form.checkbox_fuse, "checkStateChanged"): # Qt version >= 6.7.0
if hasattr(self.form.checkbox_fuse, "checkStateChanged"): # Qt version >= 6.7.0
self.form.checkbox_fuse.checkStateChanged.connect(self.set_fuse)
self.form.checkbox_link.checkStateChanged.connect(self.set_link)
else: # Qt version < 6.7.0
else: # Qt version < 6.7.0
self.form.checkbox_fuse.stateChanged.connect(self.set_fuse)
self.form.checkbox_link.stateChanged.connect(self.set_link)
def accept(self):
"""Execute when clicking the OK button or Enter key."""
self.selection = Gui.Selection.getSelection()
(self.number,
self.angle) = self.get_number_angle()
(self.number, self.angle) = self.get_number_angle()
self.center = self.get_center()
self.valid_input = self.validate_input(self.selection,
self.number,
self.angle,
self.center)
self.valid_input = self.validate_input(self.selection, self.number, self.angle, self.center)
if self.valid_input:
self.create_object()
# The internal function already displays messages
# self.print_messages()
self.finish()
def validate_input(self, selection,
number, angle, center):
def validate_input(self, selection, number, angle, center):
"""Check that the input is valid.
Some values may not need to be checked because
the interface may not allow one to input wrong data.
"""
if not selection:
_err(translate("draft","At least 1 element must be selected"))
_err(translate("draft", "At least 1 element must be selected"))
return False
# TODO: this should handle multiple objects.
# Each of the elements of the selection should be tested.
obj = selection[0]
if obj.isDerivedFrom("App::FeaturePython"):
_err(translate("draft","Selection is not suitable for array"))
_err(translate("draft","Object:") + " {}".format(selection[0].Label))
_err(translate("draft", "Selection is not suitable for array"))
_err(translate("draft", "Object:") + " {}".format(selection[0].Label))
return False
if number < 2:
_err(translate("draft","Number of elements must be at least 2"))
_err(translate("draft", "Number of elements must be at least 2"))
return False
if angle > 360:
_wrn(translate("draft","The angle is above 360 degrees. It is set to this value to proceed."))
_wrn(
translate(
"draft", "The angle is above 360 degrees. It is set to this value to proceed."
)
)
self.angle = 360
elif angle < -360:
_wrn(translate("draft","The angle is below -360 degrees. It is set to this value to proceed."))
_wrn(
translate(
"draft", "The angle is below -360 degrees. It is set to this value to proceed."
)
)
self.angle = -360
# The other arguments are not tested but they should be present.
@@ -220,15 +222,17 @@ class TaskPanelPolarArray:
_cmd += "use_link=" + str(self.use_link)
_cmd += ")"
Gui.addModule('Draft')
Gui.addModule("Draft")
_cmd_list = ["_obj_ = " + _cmd,
"_obj_.Fuse = " + str(self.fuse),
"Draft.autogroup(_obj_)",
"App.ActiveDocument.recompute()"]
_cmd_list = [
"_obj_ = " + _cmd,
"_obj_.Fuse = " + str(self.fuse),
"Draft.autogroup(_obj_)",
"App.ActiveDocument.recompute()",
]
# We commit the command list through the parent command
self.source_command.commit(translate("draft","Create Polar Array"), _cmd_list)
self.source_command.commit(translate("draft", "Create Polar Array"), _cmd_list)
def get_number_angle(self):
"""Get the number and angle parameters from the widgets."""
@@ -243,16 +247,16 @@ class TaskPanelPolarArray:
c_x_str = self.form.input_c_x.text()
c_y_str = self.form.input_c_y.text()
c_z_str = self.form.input_c_z.text()
center = App.Vector(U.Quantity(c_x_str).Value,
U.Quantity(c_y_str).Value,
U.Quantity(c_z_str).Value)
center = App.Vector(
U.Quantity(c_x_str).Value, U.Quantity(c_y_str).Value, U.Quantity(c_z_str).Value
)
return center
def reset_point(self):
"""Reset the center point to the original distance."""
self.form.input_c_x.setProperty('rawValue', 0)
self.form.input_c_y.setProperty('rawValue', 0)
self.form.input_c_z.setProperty('rawValue', 0)
self.form.input_c_x.setProperty("rawValue", 0)
self.form.input_c_y.setProperty("rawValue", 0)
self.form.input_c_z.setProperty("rawValue", 0)
self.center = self.get_center()
@@ -262,7 +266,7 @@ class TaskPanelPolarArray:
state = self.tr_true
else:
state = self.tr_false
_msg(translate("draft","Fuse:") + " {}".format(state))
_msg(translate("draft", "Fuse:") + " {}".format(state))
def set_fuse(self):
"""Execute as a callback when the fuse checkbox changes."""
@@ -275,7 +279,7 @@ class TaskPanelPolarArray:
state = self.tr_true
else:
state = self.tr_false
_msg(translate("draft","Create link array:") + " {}".format(state))
_msg(translate("draft", "Create link array:") + " {}".format(state))
def set_link(self):
"""Execute as a callback when the link checkbox changes."""
@@ -291,13 +295,13 @@ class TaskPanelPolarArray:
# For example, it could take the shapes of all objects,
# make a compound and then use it as input for the array function.
sel_obj = self.selection[0]
_msg(translate("draft","Object:") + " {}".format(sel_obj.Label))
_msg(translate("draft","Number of elements:") + " {}".format(self.number))
_msg(translate("draft","Polar angle:") + " {}".format(self.angle))
_msg(translate("draft","Center of rotation:")
+ " ({0}, {1}, {2})".format(self.center.x,
self.center.y,
self.center.z))
_msg(translate("draft", "Object:") + " {}".format(sel_obj.Label))
_msg(translate("draft", "Number of elements:") + " {}".format(self.number))
_msg(translate("draft", "Polar angle:") + " {}".format(self.angle))
_msg(
translate("draft", "Center of rotation:")
+ " ({0}, {1}, {2})".format(self.center.x, self.center.y, self.center.z)
)
self.print_fuse_state(self.fuse)
self.print_link_state(self.use_link)
@@ -338,24 +342,24 @@ class TaskPanelPolarArray:
# sby = self.form.spinbox_c_y
# sbz = self.form.spinbox_c_z
if dp:
if self.mask in ('y', 'z'):
if self.mask in ("y", "z"):
# sbx.setText(displayExternal(dp.x, None, 'Length'))
self.form.input_c_x.setProperty('rawValue', dp.x)
self.form.input_c_x.setProperty("rawValue", dp.x)
else:
# sbx.setText(displayExternal(dp.x, None, 'Length'))
self.form.input_c_x.setProperty('rawValue', dp.x)
if self.mask in ('x', 'z'):
self.form.input_c_x.setProperty("rawValue", dp.x)
if self.mask in ("x", "z"):
# sby.setText(displayExternal(dp.y, None, 'Length'))
self.form.input_c_y.setProperty('rawValue', dp.y)
self.form.input_c_y.setProperty("rawValue", dp.y)
else:
# sby.setText(displayExternal(dp.y, None, 'Length'))
self.form.input_c_y.setProperty('rawValue', dp.y)
if self.mask in ('x', 'y'):
self.form.input_c_y.setProperty("rawValue", dp.y)
if self.mask in ("x", "y"):
# sbz.setText(displayExternal(dp.z, None, 'Length'))
self.form.input_c_z.setProperty('rawValue', dp.z)
self.form.input_c_z.setProperty("rawValue", dp.z)
else:
# sbz.setText(displayExternal(dp.z, None, 'Length'))
self.form.input_c_z.setProperty('rawValue', dp.z)
self.form.input_c_z.setProperty("rawValue", dp.z)
if plane:
pass
@@ -410,4 +414,5 @@ class TaskPanelPolarArray:
# Runs the parent command to complete the call
self.source_command.completed()
## @}

View File

@@ -57,32 +57,32 @@ class ScaleTaskPanel:
self.xValue.setRange(-1000000.0, 1000000.0)
self.xValue.setDecimals(decimals)
self.xValue.setValue(1)
layout.addWidget(self.xValue,0,1,1,1)
layout.addWidget(self.xValue, 0, 1, 1, 1)
self.yLabel = QtWidgets.QLabel()
self.yLabel.setText(translate("Draft", "Y-factor"))
layout.addWidget(self.yLabel,1,0,1,1)
layout.addWidget(self.yLabel, 1, 0, 1, 1)
self.yValue = QtWidgets.QDoubleSpinBox()
self.yValue.setRange(-1000000.0, 1000000.0)
self.yValue.setDecimals(decimals)
self.yValue.setValue(1)
layout.addWidget(self.yValue,1,1,1,1)
layout.addWidget(self.yValue, 1, 1, 1, 1)
self.zLabel = QtWidgets.QLabel()
self.zLabel.setText(translate("Draft", "Z-factor"))
layout.addWidget(self.zLabel,2,0,1,1)
layout.addWidget(self.zLabel, 2, 0, 1, 1)
self.zValue = QtWidgets.QDoubleSpinBox()
self.zValue.setRange(-1000000.0, 1000000.0)
self.zValue.setDecimals(decimals)
self.zValue.setValue(1)
layout.addWidget(self.zValue,2,1,1,1)
layout.addWidget(self.zValue, 2, 1, 1, 1)
self.lock = QtWidgets.QCheckBox()
self.lock.setText(translate("Draft", "Uniform scaling"))
self.lock.setChecked(params.get_param("ScaleUniform"))
layout.addWidget(self.lock,3,0,1,2)
layout.addWidget(self.lock, 3, 0, 1, 2)
QtCore.QObject.connect(self.xValue,QtCore.SIGNAL("valueChanged(double)"),self.setValue)
QtCore.QObject.connect(self.yValue,QtCore.SIGNAL("valueChanged(double)"),self.setValue)
QtCore.QObject.connect(self.zValue,QtCore.SIGNAL("valueChanged(double)"),self.setValue)
QtCore.QObject.connect(self.lock,QtCore.SIGNAL("toggled(bool)"),self.setLock)
QtCore.QObject.connect(self.xValue, QtCore.SIGNAL("valueChanged(double)"), self.setValue)
QtCore.QObject.connect(self.yValue, QtCore.SIGNAL("valueChanged(double)"), self.setValue)
QtCore.QObject.connect(self.zValue, QtCore.SIGNAL("valueChanged(double)"), self.setValue)
QtCore.QObject.connect(self.lock, QtCore.SIGNAL("toggled(bool)"), self.setLock)
if self.__class__.__name__ != "ScaleTaskPanelEdit":
# ScaleRelative option removed in v1.1 as it does not work properly:
@@ -93,24 +93,26 @@ class ScaleTaskPanel:
self.isCopy = QtWidgets.QCheckBox()
self.isCopy.setText(translate("Draft", "Copy"))
self.isCopy.setChecked(params.get_param("ScaleCopy"))
layout.addWidget(self.isCopy,5,0,1,2)
layout.addWidget(self.isCopy, 5, 0, 1, 2)
self.isSubelementMode = QtWidgets.QCheckBox()
self.isSubelementMode.setText(translate("Draft", "Modify subelements"))
self.isSubelementMode.setChecked(params.get_param("SubelementMode"))
layout.addWidget(self.isSubelementMode,6,0,1,2)
layout.addWidget(self.isSubelementMode, 6, 0, 1, 2)
self.isClone = QtWidgets.QCheckBox()
self.isClone.setText(translate("Draft", "Create a clone"))
self.isClone.setChecked(params.get_param("ScaleClone"))
layout.addWidget(self.isClone,7,0,1,2)
layout.addWidget(self.isClone, 7, 0, 1, 2)
self.pickrefButton = QtWidgets.QPushButton()
self.pickrefButton.setText(translate("Draft", "Pick From/To Points"))
layout.addWidget(self.pickrefButton,8,0,1,2)
layout.addWidget(self.pickrefButton, 8, 0, 1, 2)
# QtCore.QObject.connect(self.relative,QtCore.SIGNAL("toggled(bool)"),self.setRelative)
QtCore.QObject.connect(self.isCopy,QtCore.SIGNAL("toggled(bool)"),self.setCopy)
QtCore.QObject.connect(self.isSubelementMode,QtCore.SIGNAL("toggled(bool)"),self.setSubelementMode)
QtCore.QObject.connect(self.isClone,QtCore.SIGNAL("toggled(bool)"),self.setClone)
QtCore.QObject.connect(self.pickrefButton,QtCore.SIGNAL("clicked()"),self.pickRef)
QtCore.QObject.connect(self.isCopy, QtCore.SIGNAL("toggled(bool)"), self.setCopy)
QtCore.QObject.connect(
self.isSubelementMode, QtCore.SIGNAL("toggled(bool)"), self.setSubelementMode
)
QtCore.QObject.connect(self.isClone, QtCore.SIGNAL("toggled(bool)"), self.setClone)
QtCore.QObject.connect(self.pickrefButton, QtCore.SIGNAL("clicked()"), self.pickRef)
def setValue(self, val=None):
"""Set the value of the scale factors."""
@@ -226,7 +228,7 @@ class ScaleTaskPanelEdit(ScaleTaskPanel):
mtx = mtx * self.global_place.Matrix.inverse()
delta = self.global_place.inverse().Rotation.multVec(self.global_place.Base)
delta = -App.Vector(delta.x*x, delta.y*y, delta.z*z)
delta = -App.Vector(delta.x * x, delta.y * y, delta.z * z)
delta = self.global_place.multVec(delta)
self.ghost.setMatrix(mtx)
@@ -266,4 +268,5 @@ class ScaleTaskPanelEdit(ScaleTaskPanel):
Gui.Control.closeDialog()
return None
## @}

View File

@@ -53,4 +53,5 @@ class SelectPlaneTaskPanel:
"""Execute to set the standard buttons."""
return QtWidgets.QDialogButtonBox.Close
## @}

View File

@@ -86,9 +86,9 @@ class ShapeStringTaskPanel:
self.form.sbX.valueChanged.connect(self.set_point_x)
self.form.sbY.valueChanged.connect(self.set_point_y)
self.form.sbZ.valueChanged.connect(self.set_point_z)
if hasattr(self.form.cbGlobalMode, "checkStateChanged"): # Qt version >= 6.7.0
if hasattr(self.form.cbGlobalMode, "checkStateChanged"): # Qt version >= 6.7.0
self.form.cbGlobalMode.checkStateChanged.connect(self.set_global_mode)
else: # Qt version < 6.7.0
else: # Qt version < 6.7.0
self.form.cbGlobalMode.stateChanged.connect(self.set_global_mode)
self.form.pbReset.clicked.connect(self.reset_point)
self.form.sbHeight.valueChanged.connect(self.set_height)
@@ -132,7 +132,7 @@ class ShapeStringTaskPanel:
self.display_point_active = False
def escape_string(self, string):
return string.replace("\\", "\\\\").replace("\"", "\\\"")
return string.replace("\\", "\\\\").replace('"', '\\"')
def platform_win_dialog(self, flag):
"""Handle the type of dialog depending on the platform."""
@@ -207,10 +207,7 @@ class ShapeStringTaskPanel:
Gui.HintManager.hide()
else:
Gui.HintManager.show(
Gui.InputHint(
translate("draft", "%1 pick point"),
Gui.UserInput.MouseLeft
)
Gui.InputHint(translate("draft", "%1 pick point"), Gui.UserInput.MouseLeft)
)
@@ -232,20 +229,22 @@ class ShapeStringTaskPanelCmd(ShapeStringTaskPanel):
Gui.addModule("Draft")
Gui.addModule("WorkingPlane")
cmd = "Draft.make_shapestring("
cmd += "String=\"" + self.escape_string(self.text) + "\", "
cmd += "FontFile=\"" + self.escape_string(self.font_file) + "\", "
cmd += 'String="' + self.escape_string(self.text) + '", '
cmd += 'FontFile="' + self.escape_string(self.font_file) + '", '
cmd += "Size=" + str(self.height) + ", "
cmd += "Tracking=0.0"
cmd += ")"
self.sourceCmd.commit(
translate("draft", "Create ShapeString"),
["ss = " + cmd,
"pl = FreeCAD.Placement()",
"pl.Base = " + toString(self.point),
"pl.Rotation = WorkingPlane.get_working_plane().get_placement().Rotation",
"ss.Placement = pl",
"Draft.autogroup(ss)",
"FreeCAD.ActiveDocument.recompute()"]
[
"ss = " + cmd,
"pl = FreeCAD.Placement()",
"pl.Base = " + toString(self.point),
"pl.Rotation = WorkingPlane.get_working_plane().get_placement().Rotation",
"ss.Placement = pl",
"Draft.autogroup(ss)",
"FreeCAD.ActiveDocument.recompute()",
],
)
def reject(self):
@@ -269,9 +268,9 @@ class ShapeStringTaskPanelEdit(ShapeStringTaskPanel):
def accept(self):
Gui.doCommand("ss = FreeCAD.ActiveDocument.getObject(\"" + self.obj.Name + "\")")
Gui.doCommand("ss.String=\"" + self.escape_string(self.text) + "\"")
Gui.doCommand("ss.FontFile=\"" + self.escape_string(self.font_file) + "\"")
Gui.doCommand('ss = FreeCAD.ActiveDocument.getObject("' + self.obj.Name + '")')
Gui.doCommand('ss.String="' + self.escape_string(self.text) + '"')
Gui.doCommand('ss.FontFile="' + self.escape_string(self.font_file) + '"')
Gui.doCommand("ss.Size=" + str(self.height))
Gui.doCommand("ss.Placement.Base=" + toString(self.point))
Gui.doCommand("FreeCAD.ActiveDocument.recompute()")