Part: [skip ci] implement getPyObject/setPyObject of TopoShape class

This commit is contained in:
wmayer
2020-10-16 13:46:44 +02:00
parent 822943b1aa
commit 8dfce38041
5 changed files with 70 additions and 124 deletions

View File

@@ -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<TopoShapePy*>(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();

View File

@@ -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<TopoShape &>(shape).getPyObject();
return Py::asObject(ret);
}

View File

@@ -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<Base::PyObjectBase*>(_Shape.getPyObject());
if (prop)
prop->setConst();
return prop;
}

View File

@@ -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<TopoShapePy*>(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) {

View File

@@ -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 */
//@{