From 4ae36283d0d08660cc07d84721fe5243027bda89 Mon Sep 17 00:00:00 2001 From: sliptonic Date: Fri, 12 Sep 2025 12:42:42 -0500 Subject: [PATCH] Ensure Qt5 compatibility with enums Correct LGPL headers rework bullnose Fixes #19050 --- src/Mod/CAM/CAMTests/TestPathToolBit.py | 2 +- .../CAM/CAMTests/TestPathToolShapeClasses.py | 10 +++--- .../Resources/panels/PageOpAdaptiveEdit.ui | 12 +++---- .../CAM/Gui/Resources/preferences/PathJob.ui | 22 ++++++------- src/Mod/CAM/Path/Base/PropertyBag.py | 1 + src/Mod/CAM/Path/Tool/assets/manager.py | 2 +- .../CAM/Path/Tool/library/serializers/fctl.py | 3 -- .../CAM/Path/Tool/library/ui/properties.py | 30 +++++++++-------- .../CAM/Path/Tool/shape/models/bullnose.py | 6 ++-- .../CAM/Path/Tool/toolbit/models/bullnose.py | 5 +-- .../CAM/Path/Tool/toolbit/serializers/fctb.py | 2 +- .../CAM/Path/Tool/toolbit/serializers/yaml.py | 31 ++++++++++-------- src/Mod/CAM/Tools/Bit/6mm_Bullnose.fctb | 2 +- src/Mod/CAM/Tools/Shape/bullnose.fcstd | Bin 15503 -> 16188 bytes 14 files changed, 67 insertions(+), 61 deletions(-) diff --git a/src/Mod/CAM/CAMTests/TestPathToolBit.py b/src/Mod/CAM/CAMTests/TestPathToolBit.py index d5b9fbe758..126fe763c5 100644 --- a/src/Mod/CAM/CAMTests/TestPathToolBit.py +++ b/src/Mod/CAM/CAMTests/TestPathToolBit.py @@ -62,7 +62,7 @@ class TestPathToolBit(PathTestWithAssets): # Parameters should be loaded from the shape file and set on the tool bit's object self.assertEqual(bullnose_bit.obj.Diameter, FreeCAD.Units.Quantity("5.0 mm")) - self.assertEqual(bullnose_bit.obj.FlatRadius, FreeCAD.Units.Quantity("1.5 mm")) + self.assertEqual(bullnose_bit.obj.CornerRadius, FreeCAD.Units.Quantity("1.5 mm")) def testToolBitPickle(self): """Test if ToolBit is picklable""" diff --git a/src/Mod/CAM/CAMTests/TestPathToolShapeClasses.py b/src/Mod/CAM/CAMTests/TestPathToolShapeClasses.py index dc09140ef7..c473c99a4b 100644 --- a/src/Mod/CAM/CAMTests/TestPathToolShapeClasses.py +++ b/src/Mod/CAM/CAMTests/TestPathToolShapeClasses.py @@ -153,8 +153,8 @@ class TestPathToolShapeClasses(PathTestWithAssets): self.assertEqual(ToolBitShape.resolve_name("ballend").asset_id, "ballend") self.assertEqual(ToolBitShape.resolve_name("v-bit").asset_id, "v-bit") self.assertEqual(ToolBitShape.resolve_name("vbit").asset_id, "vbit") - self.assertEqual(ToolBitShape.resolve_name("torus").asset_id, "torus") - self.assertEqual(ToolBitShape.resolve_name("torus.fcstd").asset_id, "torus") + self.assertEqual(ToolBitShape.resolve_name("bullnose").asset_id, "bullnose") + self.assertEqual(ToolBitShape.resolve_name("bullnose.fcstd").asset_id, "bullnose") self.assertEqual(ToolBitShape.resolve_name("SlittingSaw").asset_id, "SlittingSaw") # Test unknown name - should return the input name self.assertEqual(ToolBitShape.resolve_name("nonexistent").asset_id, "nonexistent") @@ -336,12 +336,12 @@ class TestPathToolShapeClasses(PathTestWithAssets): shape = self._test_shape_common("bullnose") self.assertEqual(shape["Diameter"].Value, 5.0) self.assertEqual(unit(shape["Diameter"]), "mm") - self.assertEqual(shape["FlatRadius"].Value, 1.5) - self.assertEqual(unit(shape["FlatRadius"]), "mm") + self.assertEqual(shape["CornerRadius"].Value, 1.5) + self.assertEqual(unit(shape["CornerRadius"]), "mm") # Need an instance to get parameter labels, get it from the asset manager uri = ToolBitShape.resolve_name("bullnose") instance = self.assets.get(uri) - self.assertEqual(instance.get_parameter_label("FlatRadius"), "Torus radius") + self.assertEqual(instance.get_parameter_label("CornerRadius"), "Corner radius") def test_toolbitshapevbit_defaults(self): """Test ToolBitShapeVBit default parameters and labels.""" diff --git a/src/Mod/CAM/Gui/Resources/panels/PageOpAdaptiveEdit.ui b/src/Mod/CAM/Gui/Resources/panels/PageOpAdaptiveEdit.ui index 667bc2755a..b1f31d1dd5 100644 --- a/src/Mod/CAM/Gui/Resources/panels/PageOpAdaptiveEdit.ui +++ b/src/Mod/CAM/Gui/Resources/panels/PageOpAdaptiveEdit.ui @@ -50,19 +50,19 @@ - QFrame::Shape::StyledPanel + QFrame::StyledPanel - QFrame::Shadow::Raised + QFrame::Raised - QFrame::Shape::StyledPanel + QFrame::StyledPanel - QFrame::Shadow::Raised + QFrame::Raised @@ -92,7 +92,7 @@ Larger values (further to the right) will calculate faster; smaller values (furt 10 - Qt::Orientation::Horizontal + Qt::Horizontal 1 @@ -318,7 +318,7 @@ This option changes that behavior to cut each discrete area to its full depth be - Qt::Orientation::Vertical + Qt::Vertical diff --git a/src/Mod/CAM/Gui/Resources/preferences/PathJob.ui b/src/Mod/CAM/Gui/Resources/preferences/PathJob.ui index c53822ac8b..73482d95e4 100644 --- a/src/Mod/CAM/Gui/Resources/preferences/PathJob.ui +++ b/src/Mod/CAM/Gui/Resources/preferences/PathJob.ui @@ -106,7 +106,7 @@ If left empty no template will be preselected. - Qt::Orientation::Vertical + Qt::Vertical @@ -144,7 +144,7 @@ If left empty no template will be preselected. - QFormLayout::FieldGrowthPolicy::AllNonFixedFieldsGrow + QFormLayout::AllNonFixedFieldsGrow @@ -257,7 +257,7 @@ See the file save policy below on how to deal with name conflicts. - QFormLayout::FieldGrowthPolicy::AllNonFixedFieldsGrow + QFormLayout::AllNonFixedFieldsGrow @@ -322,7 +322,7 @@ See the file save policy below on how to deal with name conflicts. - Qt::Orientation::Vertical + Qt::Vertical @@ -387,7 +387,7 @@ See the file save policy below on how to deal with name conflicts. - Qt::Orientation::Horizontal + Qt::Horizontal @@ -514,7 +514,7 @@ See the file save policy below on how to deal with name conflicts. - Qt::Orientation::Horizontal + Qt::Horizontal @@ -556,21 +556,21 @@ See the file save policy below on how to deal with name conflicts. - QAbstractSpinBox::ButtonSymbols::NoButtons + QAbstractSpinBox::NoButtons - QAbstractSpinBox::ButtonSymbols::NoButtons + QAbstractSpinBox::NoButtons - QAbstractSpinBox::ButtonSymbols::NoButtons + QAbstractSpinBox::NoButtons @@ -599,7 +599,7 @@ See the file save policy below on how to deal with name conflicts. - Qt::Orientation::Vertical + Qt::Vertical @@ -616,7 +616,7 @@ See the file save policy below on how to deal with name conflicts. - Qt::Orientation::Vertical + Qt::Vertical diff --git a/src/Mod/CAM/Path/Base/PropertyBag.py b/src/Mod/CAM/Path/Base/PropertyBag.py index 2b0fd946ab..7cfa299120 100644 --- a/src/Mod/CAM/Path/Base/PropertyBag.py +++ b/src/Mod/CAM/Path/Base/PropertyBag.py @@ -105,6 +105,7 @@ class PropertyBag(object): try: obj.removeProperty(self.CustomPropertyGroups) except Exception: + # Removing the property may fail if it does not exist; safe to ignore in this context. pass obj.addProperty( "App::PropertyEnumeration", diff --git a/src/Mod/CAM/Path/Tool/assets/manager.py b/src/Mod/CAM/Path/Tool/assets/manager.py index 072ec3a100..e96cc8e0b0 100644 --- a/src/Mod/CAM/Path/Tool/assets/manager.py +++ b/src/Mod/CAM/Path/Tool/assets/manager.py @@ -46,7 +46,7 @@ from .cache import AssetCache, CacheKey logger = logging.getLogger(__name__) -logging.basicConfig(level=logging.INFO) +logging.basicConfig(level=logging.ERROR) @dataclass diff --git a/src/Mod/CAM/Path/Tool/library/serializers/fctl.py b/src/Mod/CAM/Path/Tool/library/serializers/fctl.py index 275bfea0fe..f8fe8555fc 100644 --- a/src/Mod/CAM/Path/Tool/library/serializers/fctl.py +++ b/src/Mod/CAM/Path/Tool/library/serializers/fctl.py @@ -35,9 +35,6 @@ class FCTLSerializer(AssetSerializer): extensions = (".fctl",) mime_type = "application/x-freecad-toolbit-library" - Path.Log.setLevel(Path.Log.Level.DEBUG, Path.Log.thisModule()) - Path.Log.trackModule(Path.Log.thisModule()) - @classmethod def get_label(cls) -> str: return FreeCAD.Qt.translate("CAM", "FreeCAD Tool Library") diff --git a/src/Mod/CAM/Path/Tool/library/ui/properties.py b/src/Mod/CAM/Path/Tool/library/ui/properties.py index 20d1dc4f59..42202eea43 100644 --- a/src/Mod/CAM/Path/Tool/library/ui/properties.py +++ b/src/Mod/CAM/Path/Tool/library/ui/properties.py @@ -1,24 +1,28 @@ # -*- coding: utf-8 -*- +# SPDX-License-Identifier: LGPL-2.1-or-later # *************************************************************************** +# * * # * Copyright (c) 2025 Samuel Abels * # * * -# * 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 file is part of FreeCAD. * # * * -# * 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. * +# * FreeCAD is free software: you can redistribute it and/or modify it * +# * under the terms of the GNU Lesser General Public License as * +# * published by the Free Software Foundation, either version 2.1 of the * +# * License, or (at your option) any later version. * # * * -# * 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 * +# * FreeCAD 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 * +# * Lesser General Public License for more details. * +# * * +# * You should have received a copy of the GNU Lesser General Public * +# * License along with FreeCAD. If not, see * +# * . * # * * # *************************************************************************** + + from PySide import QtWidgets import FreeCADGui import FreeCAD diff --git a/src/Mod/CAM/Path/Tool/shape/models/bullnose.py b/src/Mod/CAM/Path/Tool/shape/models/bullnose.py index faeb13dc45..2e78f4eb4e 100644 --- a/src/Mod/CAM/Path/Tool/shape/models/bullnose.py +++ b/src/Mod/CAM/Path/Tool/shape/models/bullnose.py @@ -52,12 +52,12 @@ class ToolBitShapeBullnose(ToolBitShape): FreeCAD.Qt.translate("ToolBitShape", "Shank diameter"), "App::PropertyLength", ), - "FlatRadius": ( - FreeCAD.Qt.translate("ToolBitShape", "Torus radius"), + "CornerRadius": ( + FreeCAD.Qt.translate("ToolBitShape", "Corner radius"), "App::PropertyLength", ), } @property def label(self) -> str: - return FreeCAD.Qt.translate("ToolBitShape", "Torus") + return FreeCAD.Qt.translate("ToolBitShape", "Bullnose") diff --git a/src/Mod/CAM/Path/Tool/toolbit/models/bullnose.py b/src/Mod/CAM/Path/Tool/toolbit/models/bullnose.py index e86c180965..3033c02ebf 100644 --- a/src/Mod/CAM/Path/Tool/toolbit/models/bullnose.py +++ b/src/Mod/CAM/Path/Tool/toolbit/models/bullnose.py @@ -39,9 +39,10 @@ class ToolBitBullnose(ToolBit, CuttingToolMixin, RotaryToolBitMixin): diameter = self.get_property_str("Diameter", "?", precision=3) flutes = self.get_property("Flutes") cutting_edge_height = self.get_property_str("CuttingEdgeHeight", "?", precision=3) - flat_radius = self.get_property_str("FlatRadius", "?", precision=3) + #flat_radius = self.get_property_str("FlatRadius", "?", precision=3) + corner_radius = self.get_property_str("CornerRadius", "?", precision=3) return FreeCAD.Qt.translate( "CAM", - f"{diameter} {flutes}-flute bullnose, {cutting_edge_height} cutting edge, {flat_radius} flat radius", + f"{diameter} {flutes}-flute bullnose, {cutting_edge_height} cutting edge, {corner_radius} corner radius", ) diff --git a/src/Mod/CAM/Path/Tool/toolbit/serializers/fctb.py b/src/Mod/CAM/Path/Tool/toolbit/serializers/fctb.py index ee1efa6959..498a0b31ce 100644 --- a/src/Mod/CAM/Path/Tool/toolbit/serializers/fctb.py +++ b/src/Mod/CAM/Path/Tool/toolbit/serializers/fctb.py @@ -28,7 +28,7 @@ from ...shape import ToolBitShape from ..models.base import ToolBit -if True: +if False: Path.Log.setLevel(Path.Log.Level.DEBUG, Path.Log.thisModule()) Path.Log.trackModule(Path.Log.thisModule()) else: diff --git a/src/Mod/CAM/Path/Tool/toolbit/serializers/yaml.py b/src/Mod/CAM/Path/Tool/toolbit/serializers/yaml.py index 95d679dc4c..85f062b9ba 100644 --- a/src/Mod/CAM/Path/Tool/toolbit/serializers/yaml.py +++ b/src/Mod/CAM/Path/Tool/toolbit/serializers/yaml.py @@ -1,26 +1,29 @@ # -*- coding: utf-8 -*- +# SPDX-License-Identifier: LGPL-2.1-or-later # *************************************************************************** +# * * # * Copyright (c) 2025 Samuel Abels * # * * -# * 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 file is part of FreeCAD. * # * * -# * 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. * +# * FreeCAD is free software: you can redistribute it and/or modify it * +# * under the terms of the GNU Lesser General Public License as * +# * published by the Free Software Foundation, either version 2.1 of the * +# * License, or (at your option) any later version. * # * * -# * 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 * +# * FreeCAD 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 * +# * Lesser General Public License for more details. * +# * * +# * You should have received a copy of the GNU Lesser General Public * +# * License along with FreeCAD. If not, see * +# * . * # * * # *************************************************************************** + import yaml -from typing import List, Optional, Mapping, Type, cast +from typing import List, Optional, Mapping, Type from ...assets.serializer import AssetSerializer from ...assets.uri import AssetUri from ...shape import ToolBitShape diff --git a/src/Mod/CAM/Tools/Bit/6mm_Bullnose.fctb b/src/Mod/CAM/Tools/Bit/6mm_Bullnose.fctb index b2830fd38c..fb6dbfab13 100644 --- a/src/Mod/CAM/Tools/Bit/6mm_Bullnose.fctb +++ b/src/Mod/CAM/Tools/Bit/6mm_Bullnose.fctb @@ -6,7 +6,7 @@ "parameter": { "CuttingEdgeHeight": "40.0000 mm", "Diameter": "6.0000 mm", - "FlatRadius": "1.5000 mm", + "CornerRadius": "1.5000 mm", "Length": "50.0000 mm", "ShankDiameter": "3.0000 mm" }, diff --git a/src/Mod/CAM/Tools/Shape/bullnose.fcstd b/src/Mod/CAM/Tools/Shape/bullnose.fcstd index 121fa6339757fc68540f06b99db859324b6ab469..c2a7053993578f495b7aa0f660db75704a4fea62 100644 GIT binary patch literal 16188 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