// constructor method int RotationPy::PyInit(PyObject* args, PyObject* /*kwd*/) { PyObject* o; if (PyArg_ParseTuple(args, "")) { return 0; } PyErr_Clear(); if (PyArg_ParseTuple(args, "O!", &(Base::RotationPy::Type), &o)) { Base::Rotation *rot = static_cast<Base::RotationPy*>(o)->getRotationPtr(); getRotationPtr()->setValue(rot->getValue()); return 0; } PyErr_Clear(); double angle; if (PyArg_ParseTuple(args, "O!d", &(Base::VectorPy::Type), &o, &angle)) { // NOTE: The last parameter defines the rotation angle in degree. getRotationPtr()->setValue(static_cast<Base::VectorPy*>(o)->value(), Base::toRadians<double>(angle)); return 0; } PyErr_Clear(); double q0, q1, q2, q3; if (PyArg_ParseTuple(args, "dddd", &q0, &q1, &q2, &q3)) { getRotationPtr()->setValue(q0, q1, q2, q3); return 0; } PyErr_Clear(); double y, p, r; if (PyArg_ParseTuple(args, "ddd", &y, &p, &r)) { getRotationPtr()->setYawPitchRoll(y, p, r); return 0; } PyErr_Clear(); PyObject *v1, *v2; if (PyArg_ParseTuple(args, "O!O!", &(Base::VectorPy::Type), &v1, &(Base::VectorPy::Type), &v2)) { Py::Vector from(v1, false); Py::Vector to(v2, false); getRotationPtr()->setValue(from.toVector(), to.toVector()); return 0; } PyErr_SetString(PyExc_Exception, "empty parameter list, four floats or Vector and float"); return -1; }
void ComplexGeoData::applyRotation(const Base::Rotation& rot) { Base::Matrix4D mat; rot.getValue(mat); setTransform(mat * getTransform()); }
// constructor method int RotationPy::PyInit(PyObject* args, PyObject* /*kwd*/) { PyObject* o; if (PyArg_ParseTuple(args, "")) { return 0; } PyErr_Clear(); if (PyArg_ParseTuple(args, "O!", &(Base::RotationPy::Type), &o)) { Base::Rotation *rot = static_cast<Base::RotationPy*>(o)->getRotationPtr(); getRotationPtr()->setValue(rot->getValue()); return 0; } PyErr_Clear(); double angle; if (PyArg_ParseTuple(args, "O!d", &(Base::VectorPy::Type), &o, &angle)) { // NOTE: The last parameter defines the rotation angle in degree. getRotationPtr()->setValue(static_cast<Base::VectorPy*>(o)->value(), Base::toRadians<double>(angle)); return 0; } PyErr_Clear(); if (PyArg_ParseTuple(args, "O!d", &(Base::MatrixPy::Type), &o, &angle)) { // NOTE: The last parameter defines the rotation angle in degree. getRotationPtr()->setValue(static_cast<Base::MatrixPy*>(o)->value()); return 0; } PyErr_Clear(); double q0, q1, q2, q3; if (PyArg_ParseTuple(args, "dddd", &q0, &q1, &q2, &q3)) { getRotationPtr()->setValue(q0, q1, q2, q3); return 0; } PyErr_Clear(); double y, p, r; if (PyArg_ParseTuple(args, "ddd", &y, &p, &r)) { getRotationPtr()->setYawPitchRoll(y, p, r); return 0; } double a11 = 1.0, a12 = 0.0, a13 = 0.0, a14 = 0.0; double a21 = 0.0, a22 = 1.0, a23 = 0.0, a24 = 0.0; double a31 = 0.0, a32 = 0.0, a33 = 1.0, a34 = 0.0; double a41 = 0.0, a42 = 0.0, a43 = 0.0, a44 = 1.0; // try read a 4x4 matrix PyErr_Clear(); if (PyArg_ParseTuple(args, "dddddddddddddddd", &a11, &a12, &a13, &a14, &a21, &a22, &a23, &a24, &a31, &a32, &a33, &a34, &a41, &a42, &a43, &a44)) { Matrix4D mtx(a11, a12, a13, a14, a21, a22, a23, a24, a31, a32, a33, a34, a41, a42, a43, a44); getRotationPtr()->setValue(mtx); return 0; } // try read a 3x3 matrix PyErr_Clear(); if (PyArg_ParseTuple(args, "ddddddddd", &a11, &a12, &a13, &a21, &a22, &a23, &a31, &a32, &a33)) { Matrix4D mtx(a11, a12, a13, a14, a21, a22, a23, a24, a31, a32, a33, a34, a41, a42, a43, a44); getRotationPtr()->setValue(mtx); return 0; } PyErr_Clear(); PyObject *v1, *v2; if (PyArg_ParseTuple(args, "O!O!", &(Base::VectorPy::Type), &v1, &(Base::VectorPy::Type), &v2)) { Py::Vector from(v1, false); Py::Vector to(v2, false); getRotationPtr()->setValue(from.toVector(), to.toVector()); return 0; } PyErr_Clear(); PyObject *v3; char *priority = nullptr; if (PyArg_ParseTuple(args, "O!O!O!|s", &(Base::VectorPy::Type), &v1, &(Base::VectorPy::Type), &v2, &(Base::VectorPy::Type), &v3, &priority )) { Py::Vector xdir(v1, false); Py::Vector ydir(v2, false); Py::Vector zdir(v3, false); if (!priority) priority = "ZXY"; try { *getRotationPtr() = (Rotation::makeRotationByAxes(xdir.toVector(), ydir.toVector(), zdir.toVector(), priority)); } catch(Base::Exception &e) { std::string str; str += "FreeCAD exception thrown ("; str += e.what(); str += ")"; PyErr_SetString(Base::BaseExceptionFreeCADError,str.c_str()); return -1; } return 0; } PyErr_SetString(PyExc_TypeError, "Rotation constructor accepts:\n" "-- empty parameter list\n" "-- Rotation object" "-- four floats (a quaternion)\n" "-- three floats (yaw, pitch, roll)" "-- Vector (rotation axis) and float (rotation angle)\n" "-- two Vectors (two axes)\n" "-- Matrix object\n" "-- 16 floats (4x4 matrix)\n" "-- 9 floats (3x3 matrix)\n" "-- 3 vectors + optional string" ); return -1; }