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; +} +