From 6d74cfa38333e70e35f90a449fdcb4d338d448d9 Mon Sep 17 00:00:00 2001 From: marioalexis Date: Thu, 17 Nov 2022 12:32:13 -0300 Subject: [PATCH 01/12] Part: Fix endless-loop in TopoShapePy::proximity function --- src/Mod/Part/App/TopoShapePyImp.cpp | 48 ++--------------------------- 1 file changed, 3 insertions(+), 45 deletions(-) diff --git a/src/Mod/Part/App/TopoShapePyImp.cpp b/src/Mod/Part/App/TopoShapePyImp.cpp index 8c439b1934..1846159840 100644 --- a/src/Mod/Part/App/TopoShapePyImp.cpp +++ b/src/Mod/Part/App/TopoShapePyImp.cpp @@ -2494,54 +2494,12 @@ PyObject* TopoShapePy::proximity(PyObject *args) BRepExtrema_ShapeProximity proximity; proximity.LoadShape1 (s1); proximity.LoadShape2 (s2); - if (tol > 0.0) + if (tol > 0.0) { proximity.SetTolerance (tol); + } + proximity.Perform(); if (!proximity.IsDone()) { - // the proximity failed, maybe it's because the shapes are not yet mesh - TopLoc_Location aLoc; - TopExp_Explorer xp(s1, TopAbs_FACE); - while (xp.More()) { - const Handle(Poly_Triangulation)& aTriangulation = - BRep_Tool::Triangulation(TopoDS::Face(xp.Current()), aLoc); - if (aTriangulation.IsNull()) { - PyErr_SetString(PartExceptionOCCError, "BRepExtrema_ShapeProximity not done, call 'tessellate' beforehand"); - return nullptr; - } - } - - xp.Init(s2, TopAbs_FACE); - while (xp.More()) { - const Handle(Poly_Triangulation)& aTriangulation = - BRep_Tool::Triangulation(TopoDS::Face(xp.Current()), aLoc); - if (aTriangulation.IsNull()) { - PyErr_SetString(PartExceptionOCCError, "BRepExtrema_ShapeProximity not done, call 'tessellate' beforehand"); - return nullptr; - } - } - - // check also for free edges - xp.Init(s1, TopAbs_EDGE, TopAbs_FACE); - while (xp.More()) { - const Handle(Poly_Polygon3D)& aPoly3D = - BRep_Tool::Polygon3D(TopoDS::Edge(xp.Current()), aLoc); - if (aPoly3D.IsNull()) { - PyErr_SetString(PartExceptionOCCError, "BRepExtrema_ShapeProximity not done, call 'tessellate' beforehand"); - return nullptr; - } - } - - xp.Init(s2, TopAbs_EDGE, TopAbs_FACE); - while (xp.More()) { - const Handle(Poly_Polygon3D)& aPoly3D = - BRep_Tool::Polygon3D(TopoDS::Edge(xp.Current()), aLoc); - if (aPoly3D.IsNull()) { - PyErr_SetString(PartExceptionOCCError, "BRepExtrema_ShapeProximity not done, call 'tessellate' beforehand"); - return nullptr; - } - } - - // another problem must have occurred PyErr_SetString(PartExceptionOCCError, "BRepExtrema_ShapeProximity not done"); return nullptr; } From cdb953c4629522dabdfa1b04f85c259438aeb712 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sat, 19 Nov 2022 15:57:54 +0100 Subject: [PATCH 02/12] Part: [skip ci] fix some warnings reported by GH actions --- src/Mod/Part/App/TopoShapePyImp.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Mod/Part/App/TopoShapePyImp.cpp b/src/Mod/Part/App/TopoShapePyImp.cpp index 1846159840..bb6330cbc9 100644 --- a/src/Mod/Part/App/TopoShapePyImp.cpp +++ b/src/Mod/Part/App/TopoShapePyImp.cpp @@ -1143,7 +1143,7 @@ PyObject* TopoShapePy::generalFuse(PyObject *args) TopoDS_Shape gfaResultShape = this->getTopoShapePtr()->generalFuse(shapeVec,tolerance,&map); Py::Object shapePy = shape2pyshape(gfaResultShape); Py::List mapPy; - for(TopTools_ListOfShape &shapes: map){ + for(TopTools_ListOfShape &shapes : map) { Py::List shapesPy; for(TopTools_ListIteratorOfListOfShape it(shapes); it.More(); it.Next()){ shapesPy.append(shape2pyshape(it.Value())); @@ -1247,7 +1247,7 @@ PyObject* TopoShapePy::childShapes(PyObject *args) namespace Part { // Containers to associate TopAbs_ShapeEnum values to each TopoShape*Py class -const std::vector> vecTypeShape = { +static const std::vector> vecTypeShape = { {&TopoShapeCompoundPy::Type, TopAbs_COMPOUND}, {&TopoShapeCompSolidPy::Type, TopAbs_COMPSOLID}, {&TopoShapeSolidPy::Type, TopAbs_SOLID}, @@ -1259,7 +1259,7 @@ const std::vector> vecTypeShape = { {&TopoShapePy::Type, TopAbs_SHAPE} }; -const std::map mapTypeShape( +static const std::map mapTypeShape( vecTypeShape.begin(), vecTypeShape.end()); // Returns shape type of a Python type. Similar to TopAbs::ShapeTypeFromString. @@ -1271,7 +1271,7 @@ static TopAbs_ShapeEnum ShapeTypeFromPyType(PyTypeObject* pyType) return it->second; } return TopAbs_SHAPE; -}; +} } PyObject* TopoShapePy::ancestorsOfType(PyObject *args) @@ -2500,7 +2500,7 @@ PyObject* TopoShapePy::proximity(PyObject *args) proximity.Perform(); if (!proximity.IsDone()) { - PyErr_SetString(PartExceptionOCCError, "BRepExtrema_ShapeProximity not done"); + PyErr_SetString(PartExceptionOCCError, "BRepExtrema_ShapeProximity failed, make sure the shapes are tessellated"); return nullptr; } From 2ecd6db0e7c9324f7c16ec37241929b0595d85d5 Mon Sep 17 00:00:00 2001 From: berniev Date: Sat, 19 Nov 2022 17:00:59 +1000 Subject: [PATCH 03/12] change ALL_UPPER_CASE constexpr definitions to camelCase --- LibraryVersions.h.cmake | 23 +++++++++++------------ src/App/Application.cpp | 18 +++++++++--------- src/Gui/Splashscreen.cpp | 18 +++++++++--------- 3 files changed, 29 insertions(+), 30 deletions(-) diff --git a/LibraryVersions.h.cmake b/LibraryVersions.h.cmake index 66730589ed..df24cba839 100644 --- a/LibraryVersions.h.cmake +++ b/LibraryVersions.h.cmake @@ -25,38 +25,37 @@ // No CMake version info for libarea, Zipios, or KDL // Coin3D -constexpr char * FC_COIN3D_VERSION = "${COIN3D_VERSION}"; +constexpr char * fcCoin3dVersion = "${COIN3D_VERSION}"; // Eigen3 -constexpr char * FC_EIGEN3_VERSION = "${EIGEN3_VERSION}"; +constexpr char * fcEigen3Version = "${EIGEN3_VERSION}"; // FreeType -constexpr char * FC_FREETYPE_VERSION = "${FREETYPE_VERSION_STRING}"; +constexpr char * fcFreetypeVersion = "${FREETYPE_VERSION_STRING}"; // pcl -constexpr char * FC_PCL_VERSION = "${PCL_VERSION}"; +constexpr char * fcPclVersion = "${PCL_VERSION}"; // PyCXX -constexpr char * FC_PYCXX_VERSION = "${PYCXX_VERSION}"; +constexpr char * fcPycxxVersion = "${PYCXX_VERSION}"; // PySide -constexpr char * FC_PYSIDE_VERSION = "${PySide2_VERSION}"; +constexpr char * fcPysideVersion = "${PySide2_VERSION}"; // PyBind -constexpr char * FC_PYBIND11_VERSION = "${pybind11_VERSION}"; +constexpr char * fcPybind11Version = "${pybind11_VERSION}"; // Shiboken -constexpr char * FC_SHIBOKEN_VERSION = "${Shiboken2_VERSION}"; +constexpr char * fcShibokenVersion = "${Shiboken2_VERSION}"; // vtk -constexpr char * FC_VTK_VERSION = "${VTK_VERSION}"; +constexpr char * fcVtkVersion = "${VTK_VERSION}"; // Xerces-C -constexpr char * FC_XERCESC_VERSION = "${XercesC_VERSION}"; +constexpr char * fcXercescVersion = "${XercesC_VERSION}"; // Pivy -constexpr char * FC_PIVY_VERSION = "${PIVY_VERSION}"; +constexpr char * fcPivyVersion = "${PIVY_VERSION}"; #endif // LIBRARY_VERSIONS_H - diff --git a/src/App/Application.cpp b/src/App/Application.cpp index 47a82cba73..68f1040362 100644 --- a/src/App/Application.cpp +++ b/src/App/Application.cpp @@ -2313,20 +2313,20 @@ void processProgramOptions(const variables_map& vm, std::map Date: Fri, 18 Nov 2022 13:52:47 -0500 Subject: [PATCH 04/12] [Sketcher] fix header uniformity Make uniform all Sketcher headers. --- src/Mod/Sketcher/Gui/DrawSketchHandlerArc.h | 1 - src/Mod/Sketcher/Gui/EditDatumDialog.cpp | 1 + src/Mod/Sketcher/Gui/EditDatumDialog.h | 1 + .../Sketcher/Gui/PropertyConstraintListItem.h | 1 - src/Mod/Sketcher/Gui/SoZoomTranslation.h | 2 +- src/Mod/Sketcher/Init.py | 11 ++++------- src/Mod/Sketcher/InitGui.py | 16 ++++++---------- .../Sketcher/SketcherTests/TestSketchFillet.py | 3 ++- src/Mod/Sketcher/TestSketcherApp.py | 5 +++-- src/Mod/Sketcher/TestSketcherGui.py | 3 ++- 10 files changed, 20 insertions(+), 24 deletions(-) diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandlerArc.h b/src/Mod/Sketcher/Gui/DrawSketchHandlerArc.h index 4090832e01..0d72b7fe3f 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandlerArc.h +++ b/src/Mod/Sketcher/Gui/DrawSketchHandlerArc.h @@ -1,4 +1,3 @@ - /*************************************************************************** * Copyright (c) 2022 Abdullah Tahiri * * * diff --git a/src/Mod/Sketcher/Gui/EditDatumDialog.cpp b/src/Mod/Sketcher/Gui/EditDatumDialog.cpp index 5c6f420609..daa866d03d 100644 --- a/src/Mod/Sketcher/Gui/EditDatumDialog.cpp +++ b/src/Mod/Sketcher/Gui/EditDatumDialog.cpp @@ -1,4 +1,5 @@ /*************************************************************************** + * Copyright (c) 2011 Werner Mayer * * * * This file is part of the FreeCAD CAx development system. * * * diff --git a/src/Mod/Sketcher/Gui/EditDatumDialog.h b/src/Mod/Sketcher/Gui/EditDatumDialog.h index 0f28dbcde2..d4ded4873a 100644 --- a/src/Mod/Sketcher/Gui/EditDatumDialog.h +++ b/src/Mod/Sketcher/Gui/EditDatumDialog.h @@ -1,4 +1,5 @@ /*************************************************************************** + * Copyright (c) 2011 Werner Mayer * * * * This file is part of the FreeCAD CAx development system. * * * diff --git a/src/Mod/Sketcher/Gui/PropertyConstraintListItem.h b/src/Mod/Sketcher/Gui/PropertyConstraintListItem.h index ef3dcdee2d..f14703d062 100644 --- a/src/Mod/Sketcher/Gui/PropertyConstraintListItem.h +++ b/src/Mod/Sketcher/Gui/PropertyConstraintListItem.h @@ -1,4 +1,3 @@ - /*************************************************************************** * Copyright (c) 2014 Abdullah Tahiri * * * diff --git a/src/Mod/Sketcher/Gui/SoZoomTranslation.h b/src/Mod/Sketcher/Gui/SoZoomTranslation.h index 3362057a45..4a2ac1a271 100644 --- a/src/Mod/Sketcher/Gui/SoZoomTranslation.h +++ b/src/Mod/Sketcher/Gui/SoZoomTranslation.h @@ -1,5 +1,5 @@ /*************************************************************************** - * * + * Copyright (c) 2011 Werner Mayer * * * * This file is part of the FreeCAD CAx development system. * * * diff --git a/src/Mod/Sketcher/Init.py b/src/Mod/Sketcher/Init.py index 78971447c7..5338e2b2d4 100644 --- a/src/Mod/Sketcher/Init.py +++ b/src/Mod/Sketcher/Init.py @@ -1,8 +1,5 @@ -# FreeCAD init script of the Sketcher module -# (c) 2001 Juergen Riegel - #*************************************************************************** -#* (c) Juergen Riegel (juergen.riegel@web.de) 2002 * +#* Copyright (c) 2001,2002 Juergen Riegel * #* * #* This file is part of the FreeCAD CAx development system. * #* * @@ -13,17 +10,17 @@ #* for detail see the LICENCE text file. * #* * #* FreeCAD is distributed in the hope that it will be useful, * -#* but WITHOUT ANY WARRANTY; without even the implied warranty of * +#* 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 Library General Public * -#* License along with FreeCAD; if not, write to the Free Software * +#* License along with FreeCAD; if not, write to the Free Software * #* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * #* USA * #* * -#* Juergen Riegel 2002 * #***************************************************************************/ +# FreeCAD init script of the Sketcher module FreeCAD.__unit_test__ += [ "TestSketcherApp" ] diff --git a/src/Mod/Sketcher/InitGui.py b/src/Mod/Sketcher/InitGui.py index f48c26b0c0..0022ccf96f 100644 --- a/src/Mod/Sketcher/InitGui.py +++ b/src/Mod/Sketcher/InitGui.py @@ -1,12 +1,5 @@ -# Sketcher gui init module -# (c) 2003 Juergen Riegel -# -# Gathering all the information to start FreeCAD -# This is the second one of three init scripts, the third one -# runs when the gui is up - #*************************************************************************** -#* (c) Juergen Riegel (juergen.riegel@web.de) 2002 * +#* Copyright (c) 2002,2003 Juergen Riegel * #* * #* This file is part of the FreeCAD CAx development system. * #* * @@ -26,10 +19,13 @@ #* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * #* USA * #* * -#* Juergen Riegel 2002 * #***************************************************************************/ - +# Sketcher gui init module +# +# Gathering all the information to start FreeCAD +# This is the second one of three init scripts, the third one +# runs when the gui is up class SketcherWorkbench ( Workbench ): "Sketcher workbench object" diff --git a/src/Mod/Sketcher/SketcherTests/TestSketchFillet.py b/src/Mod/Sketcher/SketcherTests/TestSketchFillet.py index c10dac09ea..dcdaafb62d 100644 --- a/src/Mod/Sketcher/SketcherTests/TestSketchFillet.py +++ b/src/Mod/Sketcher/SketcherTests/TestSketchFillet.py @@ -1,4 +1,5 @@ -# (c) Emmanuel O'Brien 2021 LGPL * +#************************************************************************** +# Copyright (c) 2021 Emmanuel O'Brien * # * # This file is part of the FreeCAD CAx development system. * # * diff --git a/src/Mod/Sketcher/TestSketcherApp.py b/src/Mod/Sketcher/TestSketcherApp.py index 0e62d8d4e0..a7f1f2c2d7 100644 --- a/src/Mod/Sketcher/TestSketcherApp.py +++ b/src/Mod/Sketcher/TestSketcherApp.py @@ -1,5 +1,6 @@ -# (c) Juergen Riegel (FreeCAD@juergen-riegel.net) 2011 LGPL * -# (c) Emmanuel O'Brien 2021 LGPL * +#************************************************************************** +# Copyright (c) 2011 Juergen Riegel * +# Copyright (c) 2021 Emmanuel O'Brien * # * # This file is part of the FreeCAD CAx development system. * # * diff --git a/src/Mod/Sketcher/TestSketcherGui.py b/src/Mod/Sketcher/TestSketcherGui.py index 8f97f212f0..3bb1d067d5 100644 --- a/src/Mod/Sketcher/TestSketcherGui.py +++ b/src/Mod/Sketcher/TestSketcherGui.py @@ -1,4 +1,5 @@ -# (c) Juergen Riegel (FreeCAD@juergen-riegel.net) 2011 LGPL * +#************************************************************************** +# Copyright (c) 2011 Juergen Riegel * # * # This file is part of the FreeCAD CAx development system. * # * From 23b1ed84a48ceaadbb03dbc1a9ffce2743a7626c Mon Sep 17 00:00:00 2001 From: wandererfan Date: Thu, 17 Nov 2022 18:08:13 -0500 Subject: [PATCH 05/12] [Units]Allow querying schema for unit of measure --- src/Base/UnitsApi.cpp | 5 +++++ src/Base/UnitsApi.h | 3 +++ src/Base/UnitsSchema.h | 3 +++ src/Base/UnitsSchemaCentimeters.h | 2 ++ src/Base/UnitsSchemaImperial1.h | 4 ++++ 5 files changed, 17 insertions(+) diff --git a/src/Base/UnitsApi.cpp b/src/Base/UnitsApi.cpp index 3db89f6949..e4eb715d65 100644 --- a/src/Base/UnitsApi.cpp +++ b/src/Base/UnitsApi.cpp @@ -163,6 +163,11 @@ bool UnitsApi::isMultiUnitAngle() return UserPrefSystem->isMultiUnitAngle(); } +std::string UnitsApi::getBasicLengthUnit() +{ + return UserPrefSystem->getBasicLengthUnit(); +} + // === static translation methods ========================================== QString UnitsApi::schemaTranslate(const Base::Quantity& quant, double &factor, QString &unitString) diff --git a/src/Base/UnitsApi.h b/src/Base/UnitsApi.h index 45099a4f64..b1cd08e57c 100644 --- a/src/Base/UnitsApi.h +++ b/src/Base/UnitsApi.h @@ -98,6 +98,9 @@ public: //return true if the current user schema uses multiple units for angles (ex. DMS) static bool isMultiUnitAngle(); + //return the basic unit of measure for length in the current user schema. + static std::string getBasicLengthUnit(); + // Python interface static PyMethodDef Methods[]; diff --git a/src/Base/UnitsSchema.h b/src/Base/UnitsSchema.h index bfe5fab95f..e04893772e 100644 --- a/src/Base/UnitsSchema.h +++ b/src/Base/UnitsSchema.h @@ -71,6 +71,9 @@ public: //return true if this schema uses multiple units for angles (ex. DMS) virtual bool isMultiUnitAngle() const {return false;} + + //return the basic length unit for this schema + virtual std::string getBasicLengthUnit() const { return std::string("mm"); } }; diff --git a/src/Base/UnitsSchemaCentimeters.h b/src/Base/UnitsSchemaCentimeters.h index ea6ab8e043..b45805233c 100644 --- a/src/Base/UnitsSchemaCentimeters.h +++ b/src/Base/UnitsSchemaCentimeters.h @@ -37,6 +37,8 @@ class UnitsSchemaCentimeters: public UnitsSchema { public: QString schemaTranslate(const Base::Quantity& quant, double &factor, QString &unitString) override; + + std::string getBasicLengthUnit() const override { return std::string("cm"); } }; } // namespace Base diff --git a/src/Base/UnitsSchemaImperial1.h b/src/Base/UnitsSchemaImperial1.h index aaed330630..2360bcc90d 100644 --- a/src/Base/UnitsSchemaImperial1.h +++ b/src/Base/UnitsSchemaImperial1.h @@ -41,6 +41,7 @@ public: //virtual void setSchemaUnits(void); //virtual void resetSchemaUnits(void); QString schemaTranslate(const Base::Quantity& quant, double &factor, QString &unitString) override; + std::string getBasicLengthUnit() const override { return std::string("in"); } }; /** The schema class for the imperial unit system @@ -53,6 +54,7 @@ public: //virtual void setSchemaUnits(void); //virtual void resetSchemaUnits(void); QString schemaTranslate(const Base::Quantity& quant, double &factor, QString &unitString) override; + std::string getBasicLengthUnit() const override { return std::string("in"); } }; /** The schema class for the imperial unit system @@ -65,6 +67,7 @@ public: //virtual void setSchemaUnits(void); //virtual void resetSchemaUnits(void); QString schemaTranslate(const Base::Quantity& quant, double &factor, QString &unitString) override; + std::string getBasicLengthUnit() const override { return std::string("ft"); } //return true if this schema uses multiple units for length (ex. Ft/In) bool isMultiUnitLength() const override {return true;} @@ -81,6 +84,7 @@ public: //virtual void setSchemaUnits(void); //virtual void resetSchemaUnits(void); QString schemaTranslate(const Base::Quantity& quant, double &factor, QString &unitString) override; + std::string getBasicLengthUnit() const override { return std::string("ft"); } //return true if this schema uses multiple units for angles (ex. DMS) bool isMultiUnitAngle() const override {return true;} From 7193ea0007757b882821a68a2ca0f43e30cb24bc Mon Sep 17 00:00:00 2001 From: wmayer Date: Sat, 19 Nov 2022 16:54:08 +0100 Subject: [PATCH 06/12] Base: [skip ci] fix readability-identifier-length --- src/Base/UnitsApi.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Base/UnitsApi.cpp b/src/Base/UnitsApi.cpp index e4eb715d65..3b3731d424 100644 --- a/src/Base/UnitsApi.cpp +++ b/src/Base/UnitsApi.cpp @@ -87,9 +87,9 @@ const char* UnitsApi::getDescription(UnitSystem system) } } -UnitsSchemaPtr UnitsApi::createSchema(UnitSystem s) +UnitsSchemaPtr UnitsApi::createSchema(UnitSystem system) { - switch (s) { + switch (system) { case UnitSystem::SI1: return std::make_unique(); case UnitSystem::SI2: @@ -115,14 +115,14 @@ UnitsSchemaPtr UnitsApi::createSchema(UnitSystem s) return nullptr; } -void UnitsApi::setSchema(UnitSystem s) +void UnitsApi::setSchema(UnitSystem system) { if (UserPrefSystem) { UserPrefSystem->resetSchemaUnits(); // for schemas changed the Quantity constants } - UserPrefSystem = createSchema(s); - currentSystem = s; + UserPrefSystem = createSchema(system); + currentSystem = system; // for wrong value fall back to standard schema if (!UserPrefSystem) { @@ -133,21 +133,21 @@ void UnitsApi::setSchema(UnitSystem s) UserPrefSystem->setSchemaUnits(); // if necessary a unit schema can change the constants in Quantity (e.g. mi=1.8km rather then 1.6km). } -QString UnitsApi::toString(const Base::Quantity& q, const QuantityFormat& f) +QString UnitsApi::toString(const Base::Quantity& quantity, const QuantityFormat& format) { - QString value = QString::fromLatin1("'%1 %2'").arg(q.getValue(), 0, f.toFormat(), f.precision) - .arg(q.getUnit().getString()); + QString value = QString::fromLatin1("'%1 %2'").arg(quantity.getValue(), 0, format.toFormat(), format.precision) + .arg(quantity.getUnit().getString()); return value; } -QString UnitsApi::toNumber(const Base::Quantity& q, const QuantityFormat& f) +QString UnitsApi::toNumber(const Base::Quantity& quantity, const QuantityFormat& format) { - return toNumber(q.getValue(), f); + return toNumber(quantity.getValue(), format); } -QString UnitsApi::toNumber(double d, const QuantityFormat& f) +QString UnitsApi::toNumber(double value, const QuantityFormat& format) { - QString number = QString::fromLatin1("%1").arg(d, 0, f.toFormat(), f.precision); + QString number = QString::fromLatin1("%1").arg(value, 0, format.toFormat(), format.precision); return number; } From db837c746885dba8548f174628666418acc060d5 Mon Sep 17 00:00:00 2001 From: Uwe Date: Sun, 20 Nov 2022 00:38:21 +0100 Subject: [PATCH 07/12] [sketch] Geo.cpp: fix compiler warning - as reported here: https://forum.freecadweb.org/viewtopic.php?f=10&t=73647 --- src/Mod/Sketcher/App/planegcs/Geo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Mod/Sketcher/App/planegcs/Geo.cpp b/src/Mod/Sketcher/App/planegcs/Geo.cpp index d765429fea..74dbc6a7d0 100644 --- a/src/Mod/Sketcher/App/planegcs/Geo.cpp +++ b/src/Mod/Sketcher/App/planegcs/Geo.cpp @@ -729,7 +729,7 @@ double BSpline::getLinCombFactor(double x, size_t k, size_t i) std::vector d(degree + 1, 0.0); // Ensure this is within range - int idxOfPole = i + degree - k; + int idxOfPole = static_cast(i) + degree - static_cast(k); if (idxOfPole < 0 || idxOfPole > degree) return 0.0; d[idxOfPole] = 1.0; From ba62ec0e2462faf69037795c13a758c761d45fee Mon Sep 17 00:00:00 2001 From: berniev Date: Fri, 18 Nov 2022 21:11:35 +1000 Subject: [PATCH 08/12] remove unused code in find pyside --- cMake/FindPySide2Tools.cmake | 5 ----- cMake/FindPySide6Tools.cmake | 5 ----- 2 files changed, 10 deletions(-) diff --git a/cMake/FindPySide2Tools.cmake b/cMake/FindPySide2Tools.cmake index 038ceb49ac..559d546570 100644 --- a/cMake/FindPySide2Tools.cmake +++ b/cMake/FindPySide2Tools.cmake @@ -3,11 +3,6 @@ # PYSIDE_RCC_EXECUTABLE - Location of PYSIDE2RCC executable # PYSIDE_TOOLS_FOUND - PySide2 utilities found. -IF(PYSIDE2_UIC_EXECUTABLE AND PYSIDE2_RCC_EXECUTABLE) - # Already in cache, be silent - set(PYSIDE2_TOOLS_FOUND_QUIETLY TRUE) -ENDIF() - if(WIN32 OR ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") #pyside2 tools are often in same location as python interpreter get_filename_component(PYTHON_BIN_DIR ${PYTHON_EXECUTABLE} PATH) diff --git a/cMake/FindPySide6Tools.cmake b/cMake/FindPySide6Tools.cmake index 405bf9c514..15e78de42d 100644 --- a/cMake/FindPySide6Tools.cmake +++ b/cMake/FindPySide6Tools.cmake @@ -3,11 +3,6 @@ # PYSIDE_RCC_EXECUTABLE - Location of PYSIDE6RCC executable # PYSIDE_TOOLS_FOUND - PYSIDE6 utilities found. -IF(PYSIDE6_UIC_EXECUTABLE AND PYSIDE6_RCC_EXECUTABLE) - # Already in cache, be silent - set(PYSIDE_TOOLS_FOUND_QUIETLY TRUE) -ENDIF() - if (TARGET Qt6::uic) get_target_property(PYSIDE6_UIC_EXECUTABLE Qt6::uic LOCATION) set(UICOPTIONS "--generator=python") From d0d511f940a018de37b06c43f48bd71c56a13104 Mon Sep 17 00:00:00 2001 From: Aapo Date: Sun, 20 Nov 2022 13:12:26 +0200 Subject: [PATCH 09/12] [TD] DrawViewPart: Fix Dimension attachment for Coarse Views and faceless Views --- src/Mod/TechDraw/App/DrawViewPart.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Mod/TechDraw/App/DrawViewPart.cpp b/src/Mod/TechDraw/App/DrawViewPart.cpp index 36901ffc7d..509e8ec1d8 100644 --- a/src/Mod/TechDraw/App/DrawViewPart.cpp +++ b/src/Mod/TechDraw/App/DrawViewPart.cpp @@ -438,6 +438,14 @@ void DrawViewPart::postHlrTasks(void) for (auto& b : bals) { b->recomputeFeature(); } + // Dimensions need to be recomputed now, unless their recomputation must be postponed + // until face creation, in which case they are recomputed after that + if (!handleFaces() || CoarseView.getValue()) { + std::vector dims = getDimensions(); + for (auto& d : dims) { + d->recomputeFeature(); + } + } //second pass if required if (ScaleType.isValue("Automatic") && @@ -453,7 +461,7 @@ void DrawViewPart::postHlrTasks(void) requestPaint(); } -//run any tasks that need to been done after faces are available +// Run any tasks that need to be done after faces are available void DrawViewPart::postFaceExtractionTasks(void) { // Some centerlines depend on faces so we could not add CL geometry before now From 36298a5a9882cc010d87a2837bdefed1e1fda43b Mon Sep 17 00:00:00 2001 From: berniev Date: Fri, 18 Nov 2022 21:27:23 +1000 Subject: [PATCH 10/12] cmake: correct usage of ifdefined (PR #7829) --- cMake/FreeCAD_Helpers/PrintFinalReport.cmake | 112 +++++++++---------- 1 file changed, 55 insertions(+), 57 deletions(-) diff --git a/cMake/FreeCAD_Helpers/PrintFinalReport.cmake b/cMake/FreeCAD_Helpers/PrintFinalReport.cmake index bd4851d24f..d1ea9d9edd 100644 --- a/cMake/FreeCAD_Helpers/PrintFinalReport.cmake +++ b/cMake/FreeCAD_Helpers/PrintFinalReport.cmake @@ -1,6 +1,4 @@ macro(PrintFinalReport) - # -------------------------------- The final report ---------------------------------- - message(STATUS "\n==============\n" "Summary report\n" "==============\n") @@ -15,17 +13,17 @@ macro(PrintFinalReport) # Qt5 needs/sets PYTHON_CONFIG_SUFFIX regarding Shiboken message(STATUS "Python: ${PYTHON_VERSION_STRING} [${PYTHON_EXECUTABLE}] [${PYTHON_CONFIG_SUFFIX}]") - if(DEFINED PCL_FOUND) + if(PCL_FOUND) message(STATUS "PCL: ${PCL_VERSION}") - else(DEFINED PCL_FOUND) + else() message(STATUS "PCL: not enabled") - endif(DEFINED PCL_FOUND) + endif() - if(DEFINED pybind11_FOUND) + if(pybind11_FOUND) message(STATUS "pybind11: ${pybind11_VERSION}") - else(DEFINED pybind11_FOUND) + else() message(STATUS "pybind11: not enabled") - endif(DEFINED pybind11_FOUND) + endif() message(STATUS "Boost: ${Boost_VERSION}") @@ -40,35 +38,35 @@ macro(PrintFinalReport) if(BUILD_SMESH) if(FREECAD_USE_EXTERNAL_SMESH) message(STATUS "SMESH: ${SMESH_VERSION_MAJOR}.${SMESH_VERSION_MINOR}.${SMESH_VERSION_PATCH}.${SMESH_VERSION_TWEAK}") - else(FREECAD_USE_EXTERNAL_SMESH) + else() message(STATUS "SMESH: ${SMESH_VERSION_MAJOR}.${SMESH_VERSION_MINOR}.${SMESH_VERSION_PATCH}.${SMESH_VERSION_TWEAK} build internal") message(STATUS "MEDFile: ${MEDFILE_VERSION} [${MEDFILE_LIBRARIES}] [${MEDFILE_INCLUDE_DIRS}]") message(STATUS "HDF5: ${HDF5_VERSION}") message(STATUS "VTK: ${VTK_VERSION}") - endif(FREECAD_USE_EXTERNAL_SMESH) - else(BUILD_SMESH) + endif() + else() message(STATUS "SMESH: do not build") - endif(BUILD_SMESH) + endif() - if(DEFINED NETGEN_FOUND) + if(NETGEN_FOUND) message(STATUS "NETGEN: ${NETGEN_VERSION_MAJOR}.${NETGEN_VERSION_MINOR}.${NETGEN_VERSION_PATCH} (${NETGEN_VERSION}) [${NETGEN_DEFINITIONS}] [${NETGEN_CXX_FLAGS}] [${NGLIB_INCLUDE_DIR}] [${NGLIB_LIBRARIES}] [${NETGEN_INCLUDE_DIRS}]") - else(DEFINED NETGEN_FOUND) + else() message(STATUS "NETGEN: not enabled") - endif(DEFINED NETGEN_FOUND) + endif() #message(STATUS "OpenCV: ${OpenCV_VERSION}") - if(DEFINED SWIG_FOUND) + if(SWIG_FOUND) message(STATUS "SWIG: ${SWIG_VERSION}") - else(DEFINED SWIG_FOUND) + else() message(STATUS "SWIG: not found") - endif(DEFINED SWIG_FOUND) + endif() - if(DEFINED EIGEN3_FOUND) + if(EIGEN3_FOUND) message(STATUS "Eigen3 ${EIGEN3_VERSION}") - else(DEFINED EIGEN3_FOUND) + else() message(STATUS "Eigen3: not found") - endif(DEFINED EIGEN3_FOUND) + endif() message(STATUS "QtCore: ${QtCore_VERSION}") message(STATUS "QtNetwork: ${QtNetwork_VERSION}") @@ -102,27 +100,27 @@ macro(PrintFinalReport) endif() if(DEFINED MACPORTS_PREFIX) - if(DEFINED Shiboken_FOUND) + if(Shiboken_FOUND) message(STATUS "Shiboken: ${Shiboken_VERSION} [${SHIBOKEN_INCLUDE_DIR}]") - else(DEFINED Shiboken_FOUND) + else() message(STATUS "Shiboken: not found (only searched if MACPORTS_PREFIX is defined)") - endif(DEFINED Shiboken_FOUND) - if(DEFINED PySide_FOUND) + endif() + if(PySide_FOUND) message(STATUS "PySide: ${PySide_VERSION} [${PYSIDE_INCLUDE_DIR}]") if(NOT PYSIDE_INCLUDE_DIR) message(STATUS " IncludeDir: Unable to find, python version mismatch?") - endif(NOT PYSIDE_INCLUDE_DIR) - else(DEFINED PySide_FOUND) + endif() + else() message(STATUS "PySide: not found (only searched if MACPORTS_PREFIX is defined)") - endif(DEFINED PySide_FOUND) - endif(DEFINED MACPORTS_PREFIX) + endif() + endif() - if(DEFINED Shiboken${SHIBOKEN_MAJOR_VERSION}_FOUND) + if(Shiboken${SHIBOKEN_MAJOR_VERSION}_FOUND) message(STATUS "Shiboken: ${Shiboken_VERSION} [${Shiboken${SHIBOKEN_MAJOR_VERSION}_DIR}] [${SHIBOKEN_INCLUDE_DIR}]") else() message(STATUS "Shiboken: not found") endif() - if(DEFINED PySide${SHIBOKEN_MAJOR_VERSION}_FOUND) + if(PySide${SHIBOKEN_MAJOR_VERSION}_FOUND) message(STATUS "PySide: ${PySide_VERSION} [${PYSIDE_INCLUDE_DIR}]") if(NOT PYSIDE_INCLUDE_DIR) message(STATUS " IncludeDir: Unable to find, python version mismatch?") @@ -130,21 +128,21 @@ macro(PrintFinalReport) else() message(STATUS "PySide: not found") endif() - if(DEFINED PYSIDE_TOOLS_FOUND) + if(PYSIDE_TOOLS_FOUND) message(STATUS "PySideTools: [${PYSIDE_UIC_EXECUTABLE}] [${PYSIDE_RCC_EXECUTABLE}]") else() message(STATUS "PySideTools: not found") endif() if(FREECAD_USE_FREETYPE) - if(DEFINED FREETYPE_FOUND) + if(FREETYPE_FOUND) message(STATUS "Freetype: ${FREETYPE_VERSION_STRING}") - else(DEFINED FREETYPE_FOUND) + else() message(STATUS "Freetype: not found") - endif(DEFINED FREETYPE_FOUND) - else(FREECAD_USE_FREETYPE) + endif() + else() message(STATUS "Freetype: disabled") - endif(FREECAD_USE_FREETYPE) + endif() message(STATUS "OpenGL: ${OPENGL_gl_LIBRARY}") message(STATUS "OpenGLU: [${OPENGL_glu_LIBRARY}][${OPENGL_INCLUDE_DIR}]") @@ -155,41 +153,41 @@ macro(PrintFinalReport) if (WIN32) #message(STATUS "SPNAV: not available yet for your OS") # FREECAD_USE_3DCONNEXION instead... - else(WIN32) - if(DEFINED SPNAV_FOUND) + else() + if(SPNAV_FOUND) message(STATUS "SPNAV: [${SPNAV_LIBRARY}] [${SPNAV_INCLUDE_DIR}]") - else(DEFINED SPNAV_FOUND) + else() message(STATUS "SPNAV: not found") - endif(DEFINED SPNAV_FOUND) - endif(WIN32) + endif() + endif() if(MATPLOTLIB_FOUND) message(STATUS "Matplotlib: ${MATPLOTLIB_VERSION}") - else(MATPLOTLIB_FOUND) + else() message(STATUS "Matplotlib: not found") - endif(MATPLOTLIB_FOUND) + endif() if(BUILD_VR) - if(DEFINED RIFT_FOUND) + if(RIFT_FOUND) message(STATUS "Rift: ${Rift_VERSION}") - else(DEFINED RIFT_FOUND) + else() message(STATUS "Rift: not found") - endif(DEFINED RIFT_FOUND) - else(BUILD_VR) + endif() + else() message(STATUS "Rift: not enabled (BUILD_VR)") - endif(BUILD_VR) + endif() if(DOXYGEN_FOUND) message(STATUS "Doxygen: ${DOXYGEN_VERSION}") message(STATUS "Language: ${DOXYGEN_LANGUAGE}") if(COIN3D_DOC_FOUND) message(STATUS "Coin3D_DOC: found [${COIN3D_DOC_PATH}]") - else(COIN3D_DOC_FOUND) + else() message(STATUS "Coin3D_DOC: not found") - endif(COIN3D_DOC_FOUND) - else(DOXYGEN_FOUND) + endif() + else() message(STATUS "Doxygen: not found") - endif(DOXYGEN_FOUND) + endif() if(MSVC) # Copy libpack dependency directories to build folder for user as part of overall build process @@ -210,7 +208,7 @@ macro(PrintFinalReport) file(COPY ${FREECAD_LIBPACK_DIR}/resources DESTINATION ${CMAKE_BINARY_DIR}) file(COPY ${FREECAD_LIBPACK_DIR}/translations/qtwebengine_locales DESTINATION ${CMAKE_BINARY_DIR}/translations) message(STATUS "... end copying.\n=======================================\n") - endif(FREECAD_COPY_DEPEND_DIRS_TO_BUILD) + endif() if(COPY_LIBPACK_BIN_TO_BUILD) if(FREECAD_COPY_LIBPACK_BIN_TO_BUILD) @@ -246,12 +244,12 @@ macro(PrintFinalReport) install(DIRECTORY ${FREECAD_LIBPACK_DIR}/resources DESTINATION ${CMAKE_INSTALL_PREFIX}) install(DIRECTORY ${FREECAD_LIBPACK_DIR}/bin DESTINATION ${CMAKE_INSTALL_PREFIX}) message(STATUS "Created install commands for INSTALL target.\n") - endif(FREECAD_INSTALL_DEPEND_DIRS) - endif(FREECAD_LIBPACK_USE AND LIBPACK_FOUND) + endif() + endif() endif() # Print message to start build process message("=================================================\n" "Now run 'cmake --build ${CMAKE_BINARY_DIR}' to build ${PROJECT_NAME}\n" "=================================================\n") -endmacro(PrintFinalReport) +endmacro() From 1ab352040a0dcc3bb89033d83d27458cc0199878 Mon Sep 17 00:00:00 2001 From: Paddle Date: Sat, 19 Nov 2022 18:51:58 +0100 Subject: [PATCH 11/12] Sketcher: Element widget: Improve filter widget. --- src/Mod/Sketcher/Gui/TaskSketcherElements.cpp | 173 +++++++++--------- src/Mod/Sketcher/Gui/TaskSketcherElements.h | 20 +- src/Mod/Sketcher/Gui/TaskSketcherElements.ui | 131 ++++--------- 3 files changed, 135 insertions(+), 189 deletions(-) diff --git a/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp b/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp index fa1af8d6e5..c2b7d8ef8a 100644 --- a/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp +++ b/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp @@ -57,6 +57,8 @@ #include +#include //to be put in _PreComp_ once grid PR merge. + using namespace SketcherGui; using namespace Gui::TaskView; @@ -371,7 +373,7 @@ ElementItem* ElementView::itemFromIndex(const QModelIndex& index) { return static_cast(QListWidget::itemFromIndex(index)); } -// ---------------------------------------------------------------------------- +/* ElementItem delegate ---------------------------------------------------- */ ElementItemDelegate::ElementItemDelegate(ElementView* parent) : QStyledItemDelegate(parent) { // This class relies on the parent being an ElementView, see getElementtItem @@ -486,7 +488,37 @@ ElementItem* ElementItemDelegate::getElementtItem(const QModelIndex& index) cons ElementView* elementView = static_cast(parent()); return elementView->itemFromIndex(index); } -// ---------------------------------------------------------------------------- + +/* Filter element list widget ------------------------------------------------------ */ +ElementFilterList::ElementFilterList(QWidget* parent) : QListWidget(parent) +{ + addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", "Normal"), this)); + addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", "Construction"), this)); + addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", "Internal"), this)); + addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", "External"), this)); + addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", "All types"), this)); + addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Point"), this)); + addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Line"), this)); + addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Circle"), this)); + addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Ellipse"), this)); + addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Arc"), this)); + addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Arc of ellipse"), this)); + addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Arc of hyperbola"), this)); + addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Arc of parabola"), this)); + addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - B-Spline"), this)); + + for (int i = 0; i < count(); i++) { + QListWidgetItem* it = item(i); + + it->setFlags(it->flags() | Qt::ItemIsUserCheckable); + it->setCheckState(Qt::Checked); + } +} + +ElementFilterList::~ElementFilterList() +{ +} + /* TRANSLATOR SketcherGui::TaskSketcherElements */ @@ -499,7 +531,6 @@ TaskSketcherElements::TaskSketcherElements(ViewProviderSketch *sketchView) , previouslyHoveredItemIndex(-1) , previouslyHoveredType(SubElementType::none) , isNamingBoxChecked(false) - , collapseFilter(true) { // we need a separate container widget to add all controls to proxy = new QWidget(this); @@ -518,6 +549,7 @@ TaskSketcherElements::TaskSketcherElements(ViewProviderSketch *sketchView) ui->listWidgetElements->setEditTriggers(QListWidget::NoEditTriggers); ui->listWidgetElements->setMouseTracking(true); + createFilterButtonActions(); createSettingsButtonActions(); connectSignals(); @@ -526,23 +558,6 @@ TaskSketcherElements::TaskSketcherElements(ViewProviderSketch *sketchView) slotElementsChanged(); - - // make filter items checkable - { - QSignalBlocker sigblk(ui->listMultiFilter); - for (int i = 0; i < ui->listMultiFilter->count(); i++) { - QListWidgetItem* item = ui->listMultiFilter->item(i); - - item->setFlags(item->flags() | Qt::ItemIsUserCheckable); - - item->setCheckState(Qt::Checked); - } - ui->listMultiFilter->setVisible(false); - } - - this->installEventFilter(this); - ui->filterBox->installEventFilter(this); - ui->listMultiFilter->installEventFilter(this); } TaskSketcherElements::~TaskSketcherElements() @@ -566,7 +581,7 @@ void TaskSketcherElements::connectSignals() this, &TaskSketcherElements::onListWidgetElementsMouseMoveOnItem ); QObject::connect( - ui->listMultiFilter, &QListWidget::itemChanged, + filterList, &QListWidget::itemChanged, this, &TaskSketcherElements::onListMultiFilterItemChanged ); QObject::connect( @@ -575,15 +590,15 @@ void TaskSketcherElements::connectSignals() ); QObject::connect( ui->settingsButton, &QToolButton::clicked, - this, &TaskSketcherElements::onSettingsButtonClicked + ui->settingsButton, &QToolButton::showMenu ); QObject::connect( qAsConst(ui->settingsButton)->actions()[0], &QAction::changed, this, &TaskSketcherElements::onSettingsExtendedInformationChanged ); QObject::connect( - qAsConst(ui->settingsButton)->actions()[1], &QAction::changed, - this, &TaskSketcherElements::onSettingsAutoCollapseFilterChanged + ui->filterButton, &QToolButton::clicked, + ui->filterButton, &QToolButton::showMenu ); connectionElementsChanged = sketchView->signalElementsChanged.connect( @@ -592,29 +607,19 @@ void TaskSketcherElements::connectSignals() /* filter functions --------------------------------------------------- */ -void TaskSketcherElements::onFilterBoxStateChanged(int val) +void TaskSketcherElements::createFilterButtonActions() { - Q_UNUSED(val) - - ui->listMultiFilter->setVisible(ui->filterBox->checkState() == Qt::Checked); - - slotElementsChanged(); + auto* action = new QWidgetAction(this); + filterList = new ElementFilterList(this); + action->setDefaultWidget(filterList); + qAsConst(ui->filterButton)->addAction(action); } -bool TaskSketcherElements::eventFilter(QObject* obj, QEvent* event) +void TaskSketcherElements::onFilterBoxStateChanged(int val) { - if (collapseFilter) { - if (obj == qobject_cast(ui->filterBox) && event->type() == QEvent::Enter && ui->filterBox->checkState() == Qt::Checked) { - ui->listMultiFilter->show(); - } - else if (obj == qobject_cast(ui->listMultiFilter) && event->type() == QEvent::Leave) { - ui->listMultiFilter->hide(); - } - else if (obj == this && event->type() == QEvent::Leave) { - ui->listMultiFilter->hide(); - } - } - return TaskBox::eventFilter(obj, event); + Q_UNUSED(val); + ui->filterButton->setEnabled(ui->filterBox->checkState() == Qt::Checked); + slotElementsChanged(); } enum class GeoFilterType { NormalGeos, @@ -636,13 +641,33 @@ enum class GeoFilterType { NormalGeos, void TaskSketcherElements::onListMultiFilterItemChanged(QListWidgetItem* item) { { - int start = 4; //From 4 to the end, it's the geometry types (line, circle, arc...) - QSignalBlocker sigblk(ui->listMultiFilter); - if (item == ui->listMultiFilter->item(static_cast(GeoFilterType::AllGeosTypes))) { - for (int i = start; i < ui->listMultiFilter->count(); i++) { - ui->listMultiFilter->item(i)->setCheckState(item->checkState()); + QSignalBlocker sigblk(filterList); + + int index = filterList->row(item); + int indexOfAllTypes = static_cast(GeoFilterType::AllGeosTypes); + + if (index == indexOfAllTypes) { + for (int i = indexOfAllTypes + 1; i < filterList->count(); i++) { + filterList->item(i)->setCheckState(item->checkState()); } } + else if (index > indexOfAllTypes) { + bool atLeastOneUnchecked = false; + bool atLeastOneChecked = false; + + for (int i = indexOfAllTypes + 1; i < filterList->count(); i++) { + if (filterList->item(i)->checkState() == Qt::Checked) + atLeastOneChecked = true; + if (filterList->item(i)->checkState() == Qt::Unchecked) + atLeastOneUnchecked = true; + } + if (atLeastOneChecked && atLeastOneUnchecked) + filterList->item(indexOfAllTypes)->setCheckState(Qt::PartiallyChecked); + else if(atLeastOneUnchecked) + filterList->item(indexOfAllTypes)->setCheckState(Qt::Unchecked); + else if(atLeastOneChecked) + filterList->item(indexOfAllTypes)->setCheckState(Qt::Checked); + } } updateVisibility(); @@ -656,19 +681,19 @@ void TaskSketcherElements::setItemVisibility(QListWidgetItem* it) using GeometryState = ElementItem::GeometryState; - if ((ui->listMultiFilter->item(static_cast(GeoFilterType::NormalGeos))->checkState() == Qt::Unchecked && item->State == GeometryState::Normal) || - (ui->listMultiFilter->item(static_cast(GeoFilterType::ConstructionGeos))->checkState() == Qt::Unchecked && item->State == GeometryState::Construction) || - (ui->listMultiFilter->item(static_cast(GeoFilterType::InternalGeos))->checkState() == Qt::Unchecked && item->State == GeometryState::InternalAlignment) || - (ui->listMultiFilter->item(static_cast(GeoFilterType::ExternalGeos))->checkState() == Qt::Unchecked && item->State == GeometryState::External) || - (ui->listMultiFilter->item(static_cast(GeoFilterType::PointGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomPoint::getClassTypeId()) || - (ui->listMultiFilter->item(static_cast(GeoFilterType::LineGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomLineSegment::getClassTypeId()) || - (ui->listMultiFilter->item(static_cast(GeoFilterType::CircleGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomCircle::getClassTypeId()) || - (ui->listMultiFilter->item(static_cast(GeoFilterType::EllipseGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomEllipse::getClassTypeId()) || - (ui->listMultiFilter->item(static_cast(GeoFilterType::ArcGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomArcOfCircle::getClassTypeId()) || - (ui->listMultiFilter->item(static_cast(GeoFilterType::ArcOfEllipseGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomArcOfEllipse::getClassTypeId()) || - (ui->listMultiFilter->item(static_cast(GeoFilterType::HyperbolaGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomArcOfHyperbola::getClassTypeId()) || - (ui->listMultiFilter->item(static_cast(GeoFilterType::ParabolaGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomArcOfParabola::getClassTypeId()) || - (ui->listMultiFilter->item(static_cast(GeoFilterType::BSplineGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomBSplineCurve::getClassTypeId()) ) + if ((filterList->item(static_cast(GeoFilterType::NormalGeos))->checkState() == Qt::Unchecked && item->State == GeometryState::Normal) || + (filterList->item(static_cast(GeoFilterType::ConstructionGeos))->checkState() == Qt::Unchecked && item->State == GeometryState::Construction) || + (filterList->item(static_cast(GeoFilterType::InternalGeos))->checkState() == Qt::Unchecked && item->State == GeometryState::InternalAlignment) || + (filterList->item(static_cast(GeoFilterType::ExternalGeos))->checkState() == Qt::Unchecked && item->State == GeometryState::External) || + (filterList->item(static_cast(GeoFilterType::PointGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomPoint::getClassTypeId()) || + (filterList->item(static_cast(GeoFilterType::LineGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomLineSegment::getClassTypeId()) || + (filterList->item(static_cast(GeoFilterType::CircleGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomCircle::getClassTypeId()) || + (filterList->item(static_cast(GeoFilterType::EllipseGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomEllipse::getClassTypeId()) || + (filterList->item(static_cast(GeoFilterType::ArcGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomArcOfCircle::getClassTypeId()) || + (filterList->item(static_cast(GeoFilterType::ArcOfEllipseGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomArcOfEllipse::getClassTypeId()) || + (filterList->item(static_cast(GeoFilterType::HyperbolaGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomArcOfHyperbola::getClassTypeId()) || + (filterList->item(static_cast(GeoFilterType::ParabolaGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomArcOfParabola::getClassTypeId()) || + (filterList->item(static_cast(GeoFilterType::BSplineGeos))->checkState() == Qt::Unchecked && item->GeometryType == Part::GeomBSplineCurve::getClassTypeId()) ) { item->setHidden(true); return; @@ -1180,23 +1205,18 @@ void TaskSketcherElements::changeEvent(QEvent *e) void TaskSketcherElements::createSettingsButtonActions() { QAction* action = new QAction(tr("Extended information"), this); - QAction* action2 = new QAction(tr("Auto collapse filter"), this); action->setCheckable(true); - action2->setCheckable(true); ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/Mod/Sketcher/Elements"); { QSignalBlocker block(this); action->setChecked(hGrp->GetBool("ExtendedNaming", false)); - action2->setChecked(hGrp->GetBool("AutoCollapseFilter", false)); } ui->settingsButton->addAction(action); - ui->settingsButton->addAction(action2); isNamingBoxChecked = hGrp->GetBool("ExtendedNaming", false); - collapseFilter = hGrp->GetBool("AutoCollapseFilter", true); } void TaskSketcherElements::onSettingsExtendedInformationChanged() @@ -1210,25 +1230,4 @@ void TaskSketcherElements::onSettingsExtendedInformationChanged() slotElementsChanged(); } -void TaskSketcherElements::onSettingsAutoCollapseFilterChanged() -{ - QList acts = ui->settingsButton->actions(); - collapseFilter = acts[1]->isChecked(); - - ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/Mod/Sketcher/Elements"); - hGrp->SetBool("AutoCollapseFilter", collapseFilter); - - if (collapseFilter) { - ui->listMultiFilter->setVisible(false); - } - else { - ui->listMultiFilter->setVisible(ui->filterBox->checkState() == Qt::Checked); - } -} - -void TaskSketcherElements::onSettingsButtonClicked(bool) -{ - ui->settingsButton->showMenu(); -} - #include "moc_TaskSketcherElements.cpp" diff --git a/src/Mod/Sketcher/Gui/TaskSketcherElements.h b/src/Mod/Sketcher/Gui/TaskSketcherElements.h index 735b7f3714..43053ab416 100644 --- a/src/Mod/Sketcher/Gui/TaskSketcherElements.h +++ b/src/Mod/Sketcher/Gui/TaskSketcherElements.h @@ -69,7 +69,7 @@ class ElementItem : public QListWidgetItem , StartingVertex(startingVertex) , MidVertex(midVertex) , EndVertex(endVertex) - , GeometryType(geometryType) + , GeometryType(std::move(geometryType)) , State(state) , isLineSelected(false) , isStartingPointSelected(false) @@ -177,6 +177,16 @@ Q_SIGNALS: void onItemHovered(QListWidgetItem *); }; +class ElementFilterList : public QListWidget +{ + Q_OBJECT + +public: + explicit ElementFilterList(QWidget* parent = nullptr); + ~ElementFilterList() override; + +}; + class TaskSketcherElements : public Gui::TaskView::TaskBox, public Gui::SelectionObserver { Q_OBJECT @@ -188,13 +198,12 @@ public: /// Observer message from the Selection void onSelectionChanged(const Gui::SelectionChanges& msg) override; - bool eventFilter(QObject* obj, QEvent* event) override; - private: void slotElementsChanged(); void updateVisibility(); void setItemVisibility(QListWidgetItem* item); void clearWidget(); + void createFilterButtonActions(); void createSettingsButtonActions(); void connectSignals(); @@ -203,8 +212,6 @@ public Q_SLOTS: void onListWidgetElementsItemEntered(QListWidgetItem *item); void onListWidgetElementsMouseMoveOnItem(QListWidgetItem* item); void onSettingsExtendedInformationChanged(); - void onSettingsAutoCollapseFilterChanged(); - void onSettingsButtonClicked(bool); void onFilterBoxStateChanged(int val); void onListMultiFilterItemChanged(QListWidgetItem* item); @@ -224,8 +231,9 @@ private: int previouslyHoveredItemIndex; SubElementType previouslyHoveredType; + ElementFilterList* filterList; + bool isNamingBoxChecked; - bool collapseFilter; }; } //namespace SketcherGui diff --git a/src/Mod/Sketcher/Gui/TaskSketcherElements.ui b/src/Mod/Sketcher/Gui/TaskSketcherElements.ui index fb8d713478..a24ea81530 100644 --- a/src/Mod/Sketcher/Gui/TaskSketcherElements.ui +++ b/src/Mod/Sketcher/Gui/TaskSketcherElements.ui @@ -30,17 +30,48 @@ + + + 0 + 0 + + - Check to activate filters + Check to toggle filters - padding-bottom: 0px; margin-bottom: 0px + padding-right: 0px; margin-right: 0px + + + + + + false + + + + + + + + 0 + 0 + + + + Click to show filters + + + padding-left: 0px; margin-left: 0px + + + false Filters - - false + + QToolButton::MenuButtonPopup @@ -69,98 +100,6 @@ - - - - - 0 - 0 - - - - padding-top: 0px; margin-top: 0px - - - QAbstractScrollArea::AdjustToContents - - - QAbstractItemView::NoSelection - - - 0 - - - - Normal - - - - - Construction - - - - - Internal - - - - - External - - - - - All types - - - - - - Point - - - - - - Line - - - - - - Circle - - - - - - Ellipse - - - - - - Arc - - - - - - Arc of ellipse - - - - - - Arc of hyperbola - - - - - - Arc of parabola - - - - - - B-Spline - - - - From 283ee6f1a30721028c9a0dad145ca09d99f4a06b Mon Sep 17 00:00:00 2001 From: 0penBrain <48731257+0penBrain@users.noreply.github.com> Date: Fri, 18 Nov 2022 18:06:58 +0100 Subject: [PATCH 12/12] Sketcher: filter list strings are updated at language change (include fix commits) --- src/Mod/Sketcher/Gui/TaskSketcherElements.cpp | 43 +++++++++++-------- src/Mod/Sketcher/Gui/TaskSketcherElements.h | 23 ++++++++++ 2 files changed, 48 insertions(+), 18 deletions(-) diff --git a/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp b/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp index c2b7d8ef8a..ec48e27f25 100644 --- a/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp +++ b/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp @@ -492,33 +492,40 @@ ElementItem* ElementItemDelegate::getElementtItem(const QModelIndex& index) cons /* Filter element list widget ------------------------------------------------------ */ ElementFilterList::ElementFilterList(QWidget* parent) : QListWidget(parent) { - addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", "Normal"), this)); - addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", "Construction"), this)); - addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", "Internal"), this)); - addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", "External"), this)); - addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", "All types"), this)); - addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Point"), this)); - addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Line"), this)); - addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Circle"), this)); - addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Ellipse"), this)); - addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Arc"), this)); - addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Arc of ellipse"), this)); - addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Arc of hyperbola"), this)); - addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - Arc of parabola"), this)); - addItem(new QListWidgetItem(QApplication::translate("ElementFilterList", " - B-Spline"), this)); - - for (int i = 0; i < count(); i++) { - QListWidgetItem* it = item(i); - + for (auto const &filterItem:filterItems) { + Q_UNUSED(filterItem); + auto it = new QListWidgetItem(); it->setFlags(it->flags() | Qt::ItemIsUserCheckable); it->setCheckState(Qt::Checked); + addItem(it); } + languageChange(); } ElementFilterList::~ElementFilterList() { } +void ElementFilterList::changeEvent(QEvent* e) +{ + if (e->type() == QEvent::LanguageChange) { + languageChange(); + } + QWidget::changeEvent(e); +} + +void ElementFilterList::languageChange() +{ + assert(static_cast(filterItems.size()) == count()); + int i=0; + for (auto const &filterItem:filterItems) { + auto text = QStringLiteral(" ").repeated(filterItem.second-1) + + (filterItem.second > 0 ? QStringLiteral("- ") : QStringLiteral()) + + tr(filterItem.first); + item(i++)->setText(text); + } +} + /* TRANSLATOR SketcherGui::TaskSketcherElements */ diff --git a/src/Mod/Sketcher/Gui/TaskSketcherElements.h b/src/Mod/Sketcher/Gui/TaskSketcherElements.h index 43053ab416..43ff1f1413 100644 --- a/src/Mod/Sketcher/Gui/TaskSketcherElements.h +++ b/src/Mod/Sketcher/Gui/TaskSketcherElements.h @@ -185,6 +185,29 @@ public: explicit ElementFilterList(QWidget* parent = nullptr); ~ElementFilterList() override; +protected: + void changeEvent(QEvent* e) override; + virtual void languageChange(); + +private: + using filterItemRepr = std::pair; // {filter item text, filter item level} + inline static const std::vector filterItems = { + {QT_TR_NOOP("Normal"),0}, + {QT_TR_NOOP("Construction"),0}, + {QT_TR_NOOP("Internal"),0}, + {QT_TR_NOOP("External"),0}, + {QT_TR_NOOP("All types"),0}, + {QT_TR_NOOP("Point"),1}, + {QT_TR_NOOP("Line"),1}, + {QT_TR_NOOP("Circle"),1}, + {QT_TR_NOOP("Ellipse"),1}, + {QT_TR_NOOP("Arc of circle"),1}, + {QT_TR_NOOP("Arc of ellipse"),1}, + {QT_TR_NOOP("Arc of hyperbola"),1}, + {QT_TR_NOOP("Arc of parabola"),1}, + {QT_TR_NOOP("B-Spline"),1} + }; + }; class TaskSketcherElements : public Gui::TaskView::TaskBox, public Gui::SelectionObserver