From 8dfce38041112bb7bd45fa579f47fcf3d9dddb17 Mon Sep 17 00:00:00 2001 From: wmayer Date: Fri, 16 Oct 2020 13:46:44 +0200 Subject: [PATCH] Part: [skip ci] implement getPyObject/setPyObject of TopoShape class --- src/Mod/Part/App/AppPartPy.cpp | 44 ++----------------- src/Mod/Part/App/PartPyCXX.cpp | 43 +----------------- src/Mod/Part/App/PropertyTopoShape.cpp | 44 ++----------------- src/Mod/Part/App/TopoShape.cpp | 61 ++++++++++++++++++++++++++ src/Mod/Part/App/TopoShape.h | 2 + 5 files changed, 70 insertions(+), 124 deletions(-) diff --git a/src/Mod/Part/App/AppPartPy.cpp b/src/Mod/Part/App/AppPartPy.cpp index 4a94a21528..a258c33892 100644 --- a/src/Mod/Part/App/AppPartPy.cpp +++ b/src/Mod/Part/App/AppPartPy.cpp @@ -912,17 +912,8 @@ private: fm->Build(); - if(fm->Shape().IsNull()) - return Py::asObject(new TopoShapePy(new TopoShape(fm->Shape()))); - - switch(fm->Shape().ShapeType()){ - case TopAbs_FACE: - return Py::asObject(new TopoShapeFacePy(new TopoShape(fm->Shape()))); - case TopAbs_COMPOUND: - return Py::asObject(new TopoShapeCompoundPy(new TopoShape(fm->Shape()))); - default: - return Py::asObject(new TopoShapePy(new TopoShape(fm->Shape()))); - } + TopoShape topo(fm->Shape()); + return Py::asObject(topo.getPyObject()); } throw Py::Exception(Base::BaseExceptionFreeCADError, std::string("Argument type signature not recognized. Should be either (list, string), or (shape, string)")); @@ -2012,36 +2003,7 @@ private: PyObject *object; if (PyArg_ParseTuple(args.ptr(),"O!",&(Part::TopoShapePy::Type), &object)) { TopoShape* ptr = static_cast(object)->getTopoShapePtr(); - TopoDS_Shape shape = ptr->getShape(); - if (!shape.IsNull()) { - TopAbs_ShapeEnum type = shape.ShapeType(); - switch (type) - { - case TopAbs_COMPOUND: - return Py::asObject(new TopoShapeCompoundPy(new TopoShape(shape))); - case TopAbs_COMPSOLID: - return Py::asObject(new TopoShapeCompSolidPy(new TopoShape(shape))); - case TopAbs_SOLID: - return Py::asObject(new TopoShapeSolidPy(new TopoShape(shape))); - case TopAbs_SHELL: - return Py::asObject(new TopoShapeShellPy(new TopoShape(shape))); - case TopAbs_FACE: - return Py::asObject(new TopoShapeFacePy(new TopoShape(shape))); - case TopAbs_WIRE: - return Py::asObject(new TopoShapeWirePy(new TopoShape(shape))); - case TopAbs_EDGE: - return Py::asObject(new TopoShapeEdgePy(new TopoShape(shape))); - case TopAbs_VERTEX: - return Py::asObject(new TopoShapeVertexPy(new TopoShape(shape))); - case TopAbs_SHAPE: - return Py::asObject(new TopoShapePy(new TopoShape(shape))); - default: - break; - } - } - else { - throw Py::Exception(PartExceptionOCCError, "empty shape"); - } + return Py::asObject(ptr->getPyObject()); } throw Py::Exception(); diff --git a/src/Mod/Part/App/PartPyCXX.cpp b/src/Mod/Part/App/PartPyCXX.cpp index 44eda6bf96..53967567ca 100644 --- a/src/Mod/Part/App/PartPyCXX.cpp +++ b/src/Mod/Part/App/PartPyCXX.cpp @@ -35,48 +35,7 @@ namespace Part { PartExport Py::Object shape2pyshape(const TopoShape &shape) { - PyObject* ret = 0; - if (!shape.isNull()) { - TopAbs_ShapeEnum type = shape.getShape().ShapeType(); - switch (type) - { - case TopAbs_COMPOUND: - ret = new TopoShapeCompoundPy(new TopoShape(shape)); - break; - case TopAbs_COMPSOLID: - ret = new TopoShapeCompSolidPy(new TopoShape(shape)); - break; - case TopAbs_SOLID: - ret = new TopoShapeSolidPy(new TopoShape(shape)); - break; - case TopAbs_SHELL: - ret = new TopoShapeShellPy(new TopoShape(shape)); - break; - case TopAbs_FACE: - ret = new TopoShapeFacePy(new TopoShape(shape)); - break; - case TopAbs_WIRE: - ret = new TopoShapeWirePy(new TopoShape(shape)); - break; - case TopAbs_EDGE: - ret = new TopoShapeEdgePy(new TopoShape(shape)); - break; - case TopAbs_VERTEX: - ret = new TopoShapeVertexPy(new TopoShape(shape)); - break; - case TopAbs_SHAPE: - ret = new TopoShapePy(new TopoShape(shape)); - break; - default: - //shouldn't happen - ret = new TopoShapePy(new TopoShape(shape)); - break; - } - } else { - ret = new TopoShapePy(new TopoShape(shape)); - } - assert(ret); - + PyObject* ret = const_cast(shape).getPyObject(); return Py::asObject(ret); } diff --git a/src/Mod/Part/App/PropertyTopoShape.cpp b/src/Mod/Part/App/PropertyTopoShape.cpp index b632411a8a..ca011e5e4b 100644 --- a/src/Mod/Part/App/PropertyTopoShape.cpp +++ b/src/Mod/Part/App/PropertyTopoShape.cpp @@ -146,47 +146,9 @@ void PropertyPartShape::transformGeometry(const Base::Matrix4D &rclTrf) PyObject *PropertyPartShape::getPyObject(void) { - Base::PyObjectBase* prop; - const TopoDS_Shape& sh = _Shape.getShape(); - if (sh.IsNull()) { - prop = new TopoShapePy(new TopoShape(sh)); - } - else { - TopAbs_ShapeEnum type = sh.ShapeType(); - switch (type) - { - case TopAbs_COMPOUND: - prop = new TopoShapeCompoundPy(new TopoShape(sh)); - break; - case TopAbs_COMPSOLID: - prop = new TopoShapeCompSolidPy(new TopoShape(sh)); - break; - case TopAbs_SOLID: - prop = new TopoShapeSolidPy(new TopoShape(sh)); - break; - case TopAbs_SHELL: - prop = new TopoShapeShellPy(new TopoShape(sh)); - break; - case TopAbs_FACE: - prop = new TopoShapeFacePy(new TopoShape(sh)); - break; - case TopAbs_WIRE: - prop = new TopoShapeWirePy(new TopoShape(sh)); - break; - case TopAbs_EDGE: - prop = new TopoShapeEdgePy(new TopoShape(sh)); - break; - case TopAbs_VERTEX: - prop = new TopoShapeVertexPy(new TopoShape(sh)); - break; - case TopAbs_SHAPE: - default: - prop = new TopoShapePy(new TopoShape(sh)); - break; - } - } - - prop->setConst(); + Base::PyObjectBase* prop = static_cast(_Shape.getPyObject()); + if (prop) + prop->setConst(); return prop; } diff --git a/src/Mod/Part/App/TopoShape.cpp b/src/Mod/Part/App/TopoShape.cpp index f954552dcc..0e523ef3a6 100644 --- a/src/Mod/Part/App/TopoShape.cpp +++ b/src/Mod/Part/App/TopoShape.cpp @@ -199,6 +199,11 @@ #include "TopoShapeFacePy.h" #include "TopoShapeEdgePy.h" #include "TopoShapeVertexPy.h" +#include "TopoShapeWirePy.h" +#include "TopoShapeShellPy.h" +#include "TopoShapeSolidPy.h" +#include "TopoShapeCompoundPy.h" +#include "TopoShapeCompSolidPy.h" #include "ProgressIndicator.h" #include "modelRefine.h" #include "Tools.h" @@ -542,6 +547,62 @@ PyObject * TopoShape::getPySubShape(const char* Type, bool silent) const return Py::new_reference_to(shape2pyshape(getSubShape(Type,silent))); } +PyObject * TopoShape::getPyObject() +{ + Base::PyObjectBase* prop = nullptr; + if (_Shape.IsNull()) { + prop = new TopoShapePy(new TopoShape(_Shape)); + } + else { + TopAbs_ShapeEnum type = _Shape.ShapeType(); + switch (type) + { + case TopAbs_COMPOUND: + prop = new TopoShapeCompoundPy(new TopoShape(_Shape)); + break; + case TopAbs_COMPSOLID: + prop = new TopoShapeCompSolidPy(new TopoShape(_Shape)); + break; + case TopAbs_SOLID: + prop = new TopoShapeSolidPy(new TopoShape(_Shape)); + break; + case TopAbs_SHELL: + prop = new TopoShapeShellPy(new TopoShape(_Shape)); + break; + case TopAbs_FACE: + prop = new TopoShapeFacePy(new TopoShape(_Shape)); + break; + case TopAbs_WIRE: + prop = new TopoShapeWirePy(new TopoShape(_Shape)); + break; + case TopAbs_EDGE: + prop = new TopoShapeEdgePy(new TopoShape(_Shape)); + break; + case TopAbs_VERTEX: + prop = new TopoShapeVertexPy(new TopoShape(_Shape)); + break; + case TopAbs_SHAPE: + default: + prop = new TopoShapePy(new TopoShape(_Shape)); + break; + } + } + + return prop; +} + +void TopoShape::setPyObject(PyObject* obj) +{ + if (PyObject_TypeCheck(obj, &TopoShapePy::Type)) { + this->_Shape = static_cast(obj)->getTopoShapePtr()->getShape(); + } + else { + std::string error = std::string("type must be 'Shape', not "); + error += obj->ob_type->tp_name; + throw Base::TypeError(error); + } +} + void TopoShape::operator = (const TopoShape& sh) { if (this != &sh) { diff --git a/src/Mod/Part/App/TopoShape.h b/src/Mod/Part/App/TopoShape.h index 37ed0882f9..650eebecf4 100644 --- a/src/Mod/Part/App/TopoShape.h +++ b/src/Mod/Part/App/TopoShape.h @@ -157,6 +157,8 @@ public: bool hasSubShape(TopAbs_ShapeEnum type) const; /// get the Topo"sub"Shape with the given name PyObject * getPySubShape(const char* Type, bool silent=false) const; + PyObject * getPyObject(); + void setPyObject(PyObject*); /** @name Save/restore */ //@{