fix implementation of MeshPointPy

This commit is contained in:
wmayer
2017-09-28 15:28:24 +02:00
parent 674c0159da
commit d18500c012

View File

@@ -35,24 +35,34 @@
using namespace Mesh;
// returns a string which represent the object e.g. when printed in python
// returns a string which represents the object e.g. when printed in python
std::string MeshPointPy::representation(void) const
{
MeshPointPy::PointerType ptr = getMeshPointPtr();
Base::Vector3d vec = *ptr;
std::stringstream str;
str << "MeshPoint (";
if(ptr->isBound())
str << ptr->x << ", "<< ptr->y << ", "<< ptr->z << ", Idx=" << ptr->Index;
else
str << ptr->x << ", "<< ptr->y << ", "<< ptr->z ;
if (ptr->isBound()) {
if (getMeshPointPtr()->Mesh->countPoints() <= getMeshPointPtr()->Index) {
str << vec.x << ", " << vec.y << ", " << vec.z << ", Idx=" << ptr->Index << " (Out of range)";
}
else {
vec = getMeshPointPtr()->Mesh->getPoint(getMeshPointPtr()->Index);
str << vec.x << ", " << vec.y << ", " << vec.z << ", Idx=" << ptr->Index;
}
}
else {
str << vec.x << ", " << vec.y << ", " << vec.z;
}
str << ")";
return str.str();
}
PyObject *MeshPointPy::PyMake(struct _typeobject *, PyObject *, PyObject *) // Python wrapper
{
// create a new instance of MeshPointPy and the Twin object
// create a new instance of MeshPointPy and the Twin object
return new MeshPointPy(new MeshPoint);
}
@@ -78,23 +88,35 @@ PyObject* MeshPointPy::unbound(PyObject *args)
PyObject* MeshPointPy::move(PyObject *args)
{
if (!getMeshPointPtr()->isBound())
PyErr_SetString(Base::BaseExceptionFreeCADError, "This object is not bounded to a mesh, so no topological operation is possible!");
if (!getMeshPointPtr()->isBound()) {
PyErr_SetString(PyExc_RuntimeError, "This object is not bounded to a mesh, so no topological operation is possible!");
return 0;
}
if (getMeshPointPtr()->Mesh->countPoints() <= getMeshPointPtr()->Index) {
PyErr_SetString(PyExc_IndexError, "Index out of range");
return 0;
}
double x=0.0,y=0.0,z=0.0;
PyObject *object;
Base::Vector3d vec;
if (PyArg_ParseTuple(args, "ddd", &x,&y,&z)) {
vec.Set(x,y,z);
}
else if (PyArg_ParseTuple(args,"O!",&(Base::VectorPy::Type), &object)) {
do {
if (PyArg_ParseTuple(args, "ddd", &x,&y,&z)) {
vec.Set(x,y,z);
break;
}
PyErr_Clear(); // set by PyArg_ParseTuple()
// Note: must be static_cast, not reinterpret_cast
vec = *(static_cast<Base::VectorPy*>(object)->getVectorPtr());
}
else {
if (PyArg_ParseTuple(args,"O!",&(Base::VectorPy::Type), &object)) {
vec = *(static_cast<Base::VectorPy*>(object)->getVectorPtr());
break;
}
PyErr_SetString(PyExc_TypeError, "Tuple of three floats or Vector expected");
return 0;
}
while (false);
getMeshPointPtr()->Mesh->movePoint(getMeshPointPtr()->Index,vec);
Py_Return;
@@ -113,7 +135,9 @@ Py::Boolean MeshPointPy::getBound(void) const
Py::Object MeshPointPy::getNormal(void) const
{
if (!getMeshPointPtr()->isBound())
PyErr_SetString(Base::BaseExceptionFreeCADError, "This object is not bounded to a mesh, so no topological operation is possible!");
throw Py::RuntimeError("This object is not bound to a mesh, so no topological operation is possible!");
if (getMeshPointPtr()->Mesh->countPoints() <= getMeshPointPtr()->Index)
throw Py::IndexError("Index out of range");
Base::Vector3d* v = new Base::Vector3d(getMeshPointPtr()->Mesh->getPointNormal(getMeshPointPtr()->Index));
Base::VectorPy* normal = new Base::VectorPy(v);
@@ -123,8 +147,8 @@ Py::Object MeshPointPy::getNormal(void) const
Py::Object MeshPointPy::getVector(void) const
{
MeshPointPy::PointerType ptr = reinterpret_cast<MeshPointPy::PointerType>(_pcTwinPointer);
MeshPointPy::PointerType ptr = static_cast<MeshPointPy::PointerType>(_pcTwinPointer);
Base::VectorPy* vec = new Base::VectorPy(*ptr);
vec->setConst();
return Py::Object(vec,true);
@@ -132,49 +156,73 @@ Py::Object MeshPointPy::getVector(void) const
Py::Float MeshPointPy::getx(void) const
{
MeshPointPy::PointerType ptr = reinterpret_cast<MeshPointPy::PointerType>(_pcTwinPointer);
return Py::Float(ptr->x);
MeshPointPy::PointerType ptr = static_cast<MeshPointPy::PointerType>(_pcTwinPointer);
double x = ptr->x;
if (getMeshPointPtr()->isBound()) {
if (getMeshPointPtr()->Mesh->countPoints() > getMeshPointPtr()->Index)
x = getMeshPointPtr()->Mesh->getPoint(getMeshPointPtr()->Index).x;
}
return Py::Float(x);
}
void MeshPointPy::setx(Py::Float arg)
{
MeshPointPy::PointerType ptr = reinterpret_cast<MeshPointPy::PointerType>(_pcTwinPointer);
MeshPointPy::PointerType ptr = static_cast<MeshPointPy::PointerType>(_pcTwinPointer);
ptr->x = (double)arg;
if (getMeshPointPtr()->isBound()) {
getMeshPointPtr()->Mesh->movePoint(getMeshPointPtr()->Index,*ptr);
if (getMeshPointPtr()->Mesh->countPoints() > getMeshPointPtr()->Index)
getMeshPointPtr()->Mesh->setPoint(getMeshPointPtr()->Index,*ptr);
}
}
Py::Float MeshPointPy::gety(void) const
{
MeshPointPy::PointerType ptr = reinterpret_cast<MeshPointPy::PointerType>(_pcTwinPointer);
return Py::Float(ptr->y);
MeshPointPy::PointerType ptr = static_cast<MeshPointPy::PointerType>(_pcTwinPointer);
double y = ptr->y;
if (getMeshPointPtr()->isBound()) {
if (getMeshPointPtr()->Mesh->countPoints() > getMeshPointPtr()->Index)
y = getMeshPointPtr()->Mesh->getPoint(getMeshPointPtr()->Index).y;
}
return Py::Float(y);
}
void MeshPointPy::sety(Py::Float arg)
{
MeshPointPy::PointerType ptr = reinterpret_cast<MeshPointPy::PointerType>(_pcTwinPointer);
MeshPointPy::PointerType ptr = static_cast<MeshPointPy::PointerType>(_pcTwinPointer);
ptr->y = (double)arg;
if (getMeshPointPtr()->isBound()) {
getMeshPointPtr()->Mesh->movePoint(getMeshPointPtr()->Index,*ptr);
if (getMeshPointPtr()->Mesh->countPoints() > getMeshPointPtr()->Index)
getMeshPointPtr()->Mesh->setPoint(getMeshPointPtr()->Index,*ptr);
}
}
Py::Float MeshPointPy::getz(void) const
{
MeshPointPy::PointerType ptr = reinterpret_cast<MeshPointPy::PointerType>(_pcTwinPointer);
return Py::Float(ptr->z);
MeshPointPy::PointerType ptr = static_cast<MeshPointPy::PointerType>(_pcTwinPointer);
double z = ptr->z;
if (getMeshPointPtr()->isBound()) {
if (getMeshPointPtr()->Mesh->countPoints() > getMeshPointPtr()->Index)
z = getMeshPointPtr()->Mesh->getPoint(getMeshPointPtr()->Index).z;
}
return Py::Float(z);
}
void MeshPointPy::setz(Py::Float arg)
{
MeshPointPy::PointerType ptr = reinterpret_cast<MeshPointPy::PointerType>(_pcTwinPointer);
MeshPointPy::PointerType ptr = static_cast<MeshPointPy::PointerType>(_pcTwinPointer);
ptr->z = (double)arg;
if (getMeshPointPtr()->isBound()) {
getMeshPointPtr()->Mesh->movePoint(getMeshPointPtr()->Index,*ptr);
if (getMeshPointPtr()->Mesh->countPoints() > getMeshPointPtr()->Index)
getMeshPointPtr()->Mesh->setPoint(getMeshPointPtr()->Index,*ptr);
}
}
@@ -185,5 +233,5 @@ PyObject *MeshPointPy::getCustomAttributes(const char* /*attr*/) const
int MeshPointPy::setCustomAttributes(const char* /*attr*/, PyObject* /*obj*/)
{
return 0;
return 0;
}