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/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") 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() 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(); 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; } @@ -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;} diff --git a/src/Gui/Splashscreen.cpp b/src/Gui/Splashscreen.cpp index f0baa1a54c..3e982a4bac 100644 --- a/src/Gui/Splashscreen.cpp +++ b/src/Gui/Splashscreen.cpp @@ -535,7 +535,7 @@ void AboutDialog::showLibraryInformation() QLatin1String("Eigen"), baseurl + QLatin1String("#_TocEigen"), QLatin1String("https://eigen.tuxfamily.org"), - QString::fromLatin1(FC_EIGEN3_VERSION) + QString::fromLatin1(fcEigen3Version) }; // FreeType @@ -543,7 +543,7 @@ void AboutDialog::showLibraryInformation() QLatin1String("FreeType"), baseurl + QLatin1String("#_TocFreeType"), QLatin1String("https://freetype.org"), - QString::fromLatin1(FC_FREETYPE_VERSION) + QString::fromLatin1(fcFreetypeVersion) }; // KDL @@ -577,7 +577,7 @@ void AboutDialog::showLibraryInformation() QLatin1String("Point Cloud Library"), baseurl + QLatin1String("#_TocPcl"), QLatin1String("https://www.pointclouds.org"), - QString::fromLatin1(FC_PCL_VERSION) + QString::fromLatin1(fcPclVersion) }; // PyCXX @@ -585,7 +585,7 @@ void AboutDialog::showLibraryInformation() QLatin1String("PyCXX"), baseurl + QLatin1String("#_TocPyCXX"), QLatin1String("http://cxx.sourceforge.net"), - QString::fromLatin1(FC_PYCXX_VERSION) + QString::fromLatin1(fcPycxxVersion) }; // Python @@ -601,7 +601,7 @@ void AboutDialog::showLibraryInformation() QLatin1String("Qt for Python (PySide)"), baseurl + QLatin1String("#_TocPySide"), QLatin1String("https://wiki.qt.io/Qt_for_Python"), - QString::fromLatin1(FC_PYSIDE_VERSION) + QString::fromLatin1(fcPysideVersion) }; // Qt @@ -629,7 +629,7 @@ void AboutDialog::showLibraryInformation() QLatin1String("Qt for Python (Shiboken)"), baseurl + QLatin1String("#_TocPySide"), QLatin1String("https://wiki.qt.io/Qt_for_Python"), - QString::fromLatin1(FC_SHIBOKEN_VERSION) + QString::fromLatin1(fcShibokenVersion) }; // vtk @@ -637,7 +637,7 @@ void AboutDialog::showLibraryInformation() QLatin1String("vtk"), baseurl + QLatin1String("#_TocVtk"), QLatin1String("https://www.vtk.org"), - QString::fromLatin1(FC_VTK_VERSION) + QString::fromLatin1(fcVtkVersion) }; // Xerces-C @@ -645,7 +645,7 @@ void AboutDialog::showLibraryInformation() QLatin1String("Xerces-C"), baseurl + QLatin1String("#_TocXercesC"), QLatin1String("https://xerces.apache.org/xerces-c"), - QString::fromLatin1(FC_XERCESC_VERSION) + QString::fromLatin1(fcXercescVersion) }; // Zipios++ @@ -769,7 +769,7 @@ void AboutDialog::on_copyButton_clicked() str << "Python " << PY_VERSION << ", "; str << "Qt " << QT_VERSION_STR << ", "; str << "Coin " << COIN_VERSION << ", "; - str << "Vtk " << FC_VTK_VERSION << ", "; + str << "Vtk " << fcVtkVersion << ", "; #if defined(HAVE_OCC_VERSION) str << "OCC " << OCC_VERSION_MAJOR << "." diff --git a/src/Mod/Part/App/TopoShapePyImp.cpp b/src/Mod/Part/App/TopoShapePyImp.cpp index 8c439b1934..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) @@ -2494,55 +2494,13 @@ 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"); + PyErr_SetString(PartExceptionOCCError, "BRepExtrema_ShapeProximity failed, make sure the shapes are tessellated"); return nullptr; } 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; 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/Gui/TaskSketcherElements.cpp b/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp index fa1af8d6e5..ec48e27f25 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,44 @@ 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) +{ + 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 */ @@ -499,7 +538,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 +556,7 @@ TaskSketcherElements::TaskSketcherElements(ViewProviderSketch *sketchView) ui->listWidgetElements->setEditTriggers(QListWidget::NoEditTriggers); ui->listWidgetElements->setMouseTracking(true); + createFilterButtonActions(); createSettingsButtonActions(); connectSignals(); @@ -526,23 +565,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 +588,7 @@ void TaskSketcherElements::connectSignals() this, &TaskSketcherElements::onListWidgetElementsMouseMoveOnItem ); QObject::connect( - ui->listMultiFilter, &QListWidget::itemChanged, + filterList, &QListWidget::itemChanged, this, &TaskSketcherElements::onListMultiFilterItemChanged ); QObject::connect( @@ -575,15 +597,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 +614,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 +648,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 +688,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 +1212,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 +1237,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..43ff1f1413 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,39 @@ Q_SIGNALS: void onItemHovered(QListWidgetItem *); }; +class ElementFilterList : public QListWidget +{ + Q_OBJECT + +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 { Q_OBJECT @@ -188,13 +221,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 +235,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 +254,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 - - - - 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. * # * 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