From 873e34cd6ed121ea553e202addfad569dd4da853 Mon Sep 17 00:00:00 2001 From: Abdullah Tahiri Date: Tue, 28 Feb 2023 07:12:50 +0100 Subject: [PATCH] Sketcher: Extend ViewProviderSketchGeometryExtension to hold the VisualLayerId ============================================================================== In the Layers implementation there are User Layers, which have no direct impact on visualisation, and allow to group conceptually related geometry into logical entities, and Visual Layers, which define how geometries are visualised (or even whether they are visualised or not). For User Layers, SketchObject is responsible for the definition of the layers, and SketcherGeometryExtension is responsible for indicating the User Layer to which a geometry belongs (via a LayerId field). For Visual Layers, ViewProviderSketch is responsible for the definition of the visual layers, and ViewProviderSketchGeometryExtension is responsible for indicating the visual layer to which a geometry belongs. With this commit, ViewProviderSketchGeometryExtension: - takes over the responsibility of carrying a visual layer Id. - is extended to be persistent and serialise the Id. - is extended to be accesible from Python. --- src/Mod/Sketcher/Gui/AppSketcherGui.cpp | 10 ++- src/Mod/Sketcher/Gui/CMakeLists.txt | 13 +++ .../ViewProviderSketchGeometryExtension.cpp | 27 +++++- .../Gui/ViewProviderSketchGeometryExtension.h | 12 ++- .../ViewProviderSketchGeometryExtensionPy.xml | 27 ++++++ ...ewProviderSketchGeometryExtensionPyImp.cpp | 88 +++++++++++++++++++ 6 files changed, 168 insertions(+), 9 deletions(-) create mode 100644 src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtensionPy.xml create mode 100644 src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtensionPyImp.cpp diff --git a/src/Mod/Sketcher/Gui/AppSketcherGui.cpp b/src/Mod/Sketcher/Gui/AppSketcherGui.cpp index 345c71a6ca..5400376a45 100644 --- a/src/Mod/Sketcher/Gui/AppSketcherGui.cpp +++ b/src/Mod/Sketcher/Gui/AppSketcherGui.cpp @@ -37,6 +37,7 @@ #include "ViewProviderPython.h" #include "ViewProviderSketch.h" #include "ViewProviderSketchGeometryExtension.h" +#include "ViewProviderSketchGeometryExtensionPy.h" #include "Workbench.h" @@ -93,7 +94,7 @@ PyMOD_INIT_FUNC(SketcherGui) PyMOD_Return(nullptr); } - PyObject* mod = SketcherGui::initModule(); + PyObject* sketcherGuiModule = SketcherGui::initModule(); Base::Console().Log("Loading GUI of Sketcher module... done\n"); Gui::BitmapFactory().addPath(QString::fromLatin1(":/icons/constraints")); @@ -116,6 +117,9 @@ PyMOD_INIT_FUNC(SketcherGui) SketcherGui::Workbench::init(); + // Add Types to module + Base::Interpreter().addType(&SketcherGui::ViewProviderSketchGeometryExtensionPy ::Type,sketcherGuiModule,"ViewProviderSketchGeometryExtension"); + // init objects SketcherGui::ViewProviderSketch ::init(); SketcherGui::ViewProviderPython ::init(); @@ -124,7 +128,7 @@ PyMOD_INIT_FUNC(SketcherGui) SketcherGui::SoDatumLabel ::initClass(); SketcherGui::SoZoomTranslation ::initClass(); SketcherGui::PropertyConstraintListItem ::init(); - SketcherGui::ViewProviderSketchGeometryExtension ::init(); + SketcherGui::ViewProviderSketchGeometryExtension ::init(); (void)new Gui::PrefPageProducer ( QT_TRANSLATE_NOOP("QObject","Sketcher") ); (void)new Gui::PrefPageProducer ( QT_TRANSLATE_NOOP("QObject","Sketcher") ); @@ -134,5 +138,5 @@ PyMOD_INIT_FUNC(SketcherGui) // add resources and reloads the translators loadSketcherResource(); - PyMOD_Return(mod); + PyMOD_Return(sketcherGuiModule); } diff --git a/src/Mod/Sketcher/Gui/CMakeLists.txt b/src/Mod/Sketcher/Gui/CMakeLists.txt index ea7062111f..43616f91db 100644 --- a/src/Mod/Sketcher/Gui/CMakeLists.txt +++ b/src/Mod/Sketcher/Gui/CMakeLists.txt @@ -27,6 +27,8 @@ set(SketcherGui_LIBS qt_add_resources(SketcherGui_SRCS Resources/Sketcher.qrc) +generate_from_xml(ViewProviderSketchGeometryExtensionPy) + set(SketcherGui_UIC_SRCS TaskSketcherConstraints.ui TaskSketcherElements.ui @@ -152,6 +154,17 @@ SET(SketcherGui_SRCS ViewProviderSketchGeometryExtension.cpp ) +SET(Python_SRCS + ViewProviderSketchGeometryExtensionPy.xml + ViewProviderSketchGeometryExtensionPyImp.cpp +) +SOURCE_GROUP("Python" FILES ${Python_SRCS}) + +SET(SketcherGui_SRCS + ${SketcherGui_SRCS} + ${Python_SRCS} +) + if(FREECAD_USE_PCH) add_definitions(-D_PreComp_) GET_MSVC_PRECOMPILED_SOURCE("PreCompiled.cpp" PCH_SRCS ${SketcherGui_SRCS}) diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.cpp b/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.cpp index dc04f83d84..68851a217d 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.cpp +++ b/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.cpp @@ -23,6 +23,10 @@ #include "PreCompiled.h" #include +#include +#include + +#include #include "ViewProviderSketchGeometryExtension.h" @@ -30,10 +34,10 @@ using namespace SketcherGui; //---------- Geometry Extension -TYPESYSTEM_SOURCE(SketcherGui::ViewProviderSketchGeometryExtension,Part::GeometryExtension) +TYPESYSTEM_SOURCE(SketcherGui::ViewProviderSketchGeometryExtension,Part::GeometryPersistenceExtension) -ViewProviderSketchGeometryExtension::ViewProviderSketchGeometryExtension():RepresentationFactor(1.0) +ViewProviderSketchGeometryExtension::ViewProviderSketchGeometryExtension():RepresentationFactor(1.0), VisualLayerId(0) { } @@ -42,6 +46,7 @@ void ViewProviderSketchGeometryExtension::copyAttributes(Part::GeometryExtension { Part::GeometryExtension::copyAttributes(cpy); static_cast(cpy)->RepresentationFactor = this->RepresentationFactor; + static_cast(cpy)->VisualLayerId = this->VisualLayerId; } std::unique_ptr ViewProviderSketchGeometryExtension::copy() const @@ -57,7 +62,23 @@ std::unique_ptr ViewProviderSketchGeometryExtension::co #endif } +void ViewProviderSketchGeometryExtension::restoreAttributes(Base::XMLReader &reader) +{ + Part::GeometryPersistenceExtension::restoreAttributes(reader); + + if(reader.hasAttribute("visualLayerId")) + VisualLayerId = reader.getAttributeAsInteger("visualLayerId"); +} + +void ViewProviderSketchGeometryExtension::saveAttributes(Base::Writer &writer) const +{ + Part::GeometryPersistenceExtension::saveAttributes(writer); + + writer.Stream() << "\" visualLayerId=\"" << VisualLayerId; +} + + PyObject * ViewProviderSketchGeometryExtension::getPyObject() { - THROWM(Base::NotImplementedError, "ViewProviderSketchGeometryExtension does not have a Python counterpart"); + return new ViewProviderSketchGeometryExtensionPy(new ViewProviderSketchGeometryExtension(*this)); } diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.h b/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.h index d24107ad2a..63f4b66aa3 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.h +++ b/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.h @@ -29,7 +29,7 @@ namespace SketcherGui { -class SketcherGuiExport ViewProviderSketchGeometryExtension : public Part::GeometryExtension +class SketcherGuiExport ViewProviderSketchGeometryExtension : public Part::GeometryPersistenceExtension { TYPESYSTEM_HEADER_WITH_OVERRIDE(); public: @@ -49,17 +49,23 @@ public: // Applicability: General abstract concepts embodied in a geometry, in practice B-Spline poles. // Why not in SketchGeometryExtension? Because it is merely representation related. It has no place in // a console application. - virtual double getRepresentationFactor() const {return RepresentationFactor;} - virtual void setRepresentationFactor(double representationFactor) {RepresentationFactor = representationFactor;} + double getRepresentationFactor() const {return RepresentationFactor;} + void setRepresentationFactor(double representationFactor) {RepresentationFactor = representationFactor;} + + int getVisualLayerId() const {return VisualLayerId;} + void setVisualLayerId(int visuallayerid) {VisualLayerId = visuallayerid;} protected: void copyAttributes(Part::GeometryExtension * cpy) const override; + void restoreAttributes(Base::XMLReader &reader) override; + void saveAttributes(Base::Writer &writer) const override; private: ViewProviderSketchGeometryExtension(const ViewProviderSketchGeometryExtension&) = default; private: double RepresentationFactor; + int VisualLayerId; }; } //namespace SketcherGui diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtensionPy.xml b/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtensionPy.xml new file mode 100644 index 0000000000..eff215edac --- /dev/null +++ b/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtensionPy.xml @@ -0,0 +1,27 @@ + + + + + + Describes a ViewProviderSketchGeometryExtension + + + + + Sets/returns this geometry's Visual Layer Id. + + + + + + diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtensionPyImp.cpp b/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtensionPyImp.cpp new file mode 100644 index 0000000000..7bc868be17 --- /dev/null +++ b/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtensionPyImp.cpp @@ -0,0 +1,88 @@ +/*************************************************************************** + * Copyright (c) 2023 Abdullah Tahiri * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + +#include "PreCompiled.h" + +#include "ViewProviderSketchGeometryExtensionPy.h" +#include "ViewProviderSketchGeometryExtensionPy.cpp" + + +using namespace SketcherGui; + +// returns a string which represents the object e.g. when printed in python +std::string ViewProviderSketchGeometryExtensionPy::representation() const +{ + std::stringstream str; + str << ""; + return str.str(); +} + +PyObject *ViewProviderSketchGeometryExtensionPy::PyMake(struct _typeobject *, PyObject *, PyObject *) // Python wrapper +{ + // create a new instance of PointPy and the Twin object + return new ViewProviderSketchGeometryExtensionPy(new ViewProviderSketchGeometryExtension); +} + +// constructor method +int ViewProviderSketchGeometryExtensionPy::PyInit(PyObject* args, PyObject* /*kwd*/) +{ + + if (PyArg_ParseTuple(args, "")) { + // default extension + return 0; + } + + PyErr_Clear(); + int VisualLayerId; + if (PyArg_ParseTuple(args, "i", &VisualLayerId)) { + this->getViewProviderSketchGeometryExtensionPtr()->setVisualLayerId(VisualLayerId); + return 0; + } + + PyErr_SetString(PyExc_TypeError, "ViewProviderSketchGeometryExtension constructor accepts:\n" + "-- empty parameter list\n" + "-- int\n"); + return -1; +} + +Py::Long ViewProviderSketchGeometryExtensionPy::getVisualLayerId() const +{ + return Py::Long(this->getViewProviderSketchGeometryExtensionPtr()->getVisualLayerId()); +} + +void ViewProviderSketchGeometryExtensionPy::setVisualLayerId(Py::Long Id) +{ + this->getViewProviderSketchGeometryExtensionPtr()->setVisualLayerId(Id); +} + +PyObject *ViewProviderSketchGeometryExtensionPy::getCustomAttributes(const char* /*attr*/) const +{ + return nullptr; +} + +int ViewProviderSketchGeometryExtensionPy::setCustomAttributes(const char* /*attr*/, PyObject* /*obj*/) +{ + return 0; +} +