| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | |
| | #include "AssemblyObjectPy.h" |
| | #include "AssemblyObjectPy.cpp" |
| |
|
| | using namespace Assembly; |
| |
|
| | |
| | std::string AssemblyObjectPy::representation() const |
| | { |
| | return {"<Assembly object>"}; |
| | } |
| |
|
| | PyObject* AssemblyObjectPy::getCustomAttributes(const char* ) const |
| | { |
| | return nullptr; |
| | } |
| |
|
| | int AssemblyObjectPy::setCustomAttributes(const char* , PyObject* ) |
| | { |
| | return 0; |
| | } |
| |
|
| | PyObject* AssemblyObjectPy::solve(PyObject* args) const |
| | { |
| | PyObject* enableUndoPy; |
| | bool enableUndo; |
| |
|
| | if (!PyArg_ParseTuple(args, "O!", &PyBool_Type, &enableUndoPy)) { |
| | PyErr_Clear(); |
| | if (!PyArg_ParseTuple(args, "")) { |
| | return nullptr; |
| | } |
| | else { |
| | enableUndo = false; |
| | } |
| | } |
| | else { |
| | enableUndo = Base::asBoolean(enableUndoPy); |
| | } |
| |
|
| | int ret = this->getAssemblyObjectPtr()->solve(enableUndo); |
| | return Py_BuildValue("i", ret); |
| | } |
| |
|
| | PyObject* AssemblyObjectPy::generateSimulation(PyObject* args) const |
| | { |
| | PyObject* pyobj; |
| |
|
| | if (!PyArg_ParseTuple(args, "O", &pyobj)) { |
| | return nullptr; |
| | } |
| | auto* obj = static_cast<App::DocumentObjectPy*>(pyobj)->getDocumentObjectPtr(); |
| | int ret = this->getAssemblyObjectPtr()->generateSimulation(obj); |
| | return Py_BuildValue("i", ret); |
| | } |
| |
|
| | PyObject* AssemblyObjectPy::ensureIdentityPlacements(PyObject* args) const |
| | { |
| | if (!PyArg_ParseTuple(args, "")) { |
| | return nullptr; |
| | } |
| | this->getAssemblyObjectPtr()->ensureIdentityPlacements(); |
| | Py_Return; |
| | } |
| |
|
| | PyObject* AssemblyObjectPy::updateForFrame(PyObject* args) const |
| | { |
| | unsigned long index {}; |
| |
|
| | if (!PyArg_ParseTuple(args, "k", &index)) { |
| | throw Py::RuntimeError("updateForFrame requires an integer index"); |
| | } |
| | PY_TRY |
| | { |
| | this->getAssemblyObjectPtr()->updateForFrame(index); |
| | } |
| | PY_CATCH; |
| |
|
| | Py_Return; |
| | } |
| |
|
| | PyObject* AssemblyObjectPy::numberOfFrames(PyObject* args) const |
| | { |
| | if (!PyArg_ParseTuple(args, "")) { |
| | return nullptr; |
| | } |
| | size_t ret = this->getAssemblyObjectPtr()->numberOfFrames(); |
| | return Py_BuildValue("k", ret); |
| | } |
| |
|
| | PyObject* AssemblyObjectPy::undoSolve(PyObject* args) const |
| | { |
| | if (!PyArg_ParseTuple(args, "")) { |
| | return nullptr; |
| | } |
| | this->getAssemblyObjectPtr()->undoSolve(); |
| | Py_Return; |
| | } |
| |
|
| | PyObject* AssemblyObjectPy::clearUndo(PyObject* args) const |
| | { |
| | if (!PyArg_ParseTuple(args, "")) { |
| | return nullptr; |
| | } |
| | this->getAssemblyObjectPtr()->clearUndo(); |
| | Py_Return; |
| | } |
| |
|
| | PyObject* AssemblyObjectPy::isPartConnected(PyObject* args) const |
| | { |
| | PyObject* pyobj; |
| |
|
| | if (!PyArg_ParseTuple(args, "O!", &(App::DocumentObjectPy::Type), &pyobj)) { |
| | return nullptr; |
| | } |
| | auto* obj = static_cast<App::DocumentObjectPy*>(pyobj)->getDocumentObjectPtr(); |
| | bool ok = this->getAssemblyObjectPtr()->isPartConnected(obj); |
| | return Py_BuildValue("O", (ok ? Py_True : Py_False)); |
| | } |
| |
|
| | PyObject* AssemblyObjectPy::isPartGrounded(PyObject* args) const |
| | { |
| | PyObject* pyobj; |
| |
|
| | if (!PyArg_ParseTuple(args, "O!", &(App::DocumentObjectPy::Type), &pyobj)) { |
| | return nullptr; |
| | } |
| | auto* obj = static_cast<App::DocumentObjectPy*>(pyobj)->getDocumentObjectPtr(); |
| | bool ok = this->getAssemblyObjectPtr()->isPartGrounded(obj); |
| | return Py_BuildValue("O", (ok ? Py_True : Py_False)); |
| | } |
| |
|
| | PyObject* AssemblyObjectPy::isJointConnectingPartToGround(PyObject* args) const |
| | { |
| | PyObject* pyobj; |
| | char* pname; |
| |
|
| | if (!PyArg_ParseTuple(args, "O!s", &(App::DocumentObjectPy::Type), &pyobj, &pname)) { |
| | return nullptr; |
| | } |
| | auto* obj = static_cast<App::DocumentObjectPy*>(pyobj)->getDocumentObjectPtr(); |
| | bool ok = this->getAssemblyObjectPtr()->isJointConnectingPartToGround(obj, pname); |
| | return Py_BuildValue("O", (ok ? Py_True : Py_False)); |
| | } |
| |
|
| | PyObject* AssemblyObjectPy::exportAsASMT(PyObject* args) const |
| | { |
| | char* utf8Name; |
| | if (!PyArg_ParseTuple(args, "et", "utf-8", &utf8Name)) { |
| | return nullptr; |
| | } |
| |
|
| | std::string fileName = utf8Name; |
| | PyMem_Free(utf8Name); |
| |
|
| | if (fileName.empty()) { |
| | PyErr_SetString(PyExc_ValueError, "Passed string is empty"); |
| | return nullptr; |
| | } |
| |
|
| | this->getAssemblyObjectPtr()->exportAsASMT(fileName); |
| |
|
| | Py_Return; |
| | } |
| |
|
| | Py::List AssemblyObjectPy::getJoints() const |
| | { |
| | Py::List ret; |
| | std::vector<App::DocumentObject*> list = getAssemblyObjectPtr()->getJoints(false); |
| |
|
| | for (auto It : list) { |
| | ret.append(Py::Object(It->getPyObject(), true)); |
| | } |
| |
|
| | return ret; |
| | } |
| |
|
| | PyObject* AssemblyObjectPy::getDownstreamParts(PyObject* args) const |
| | { |
| | PyObject* pyPart; |
| | PyObject* pyJoint; |
| |
|
| | |
| | if (!PyArg_ParseTuple( |
| | args, |
| | "O!O!", |
| | &(App::DocumentObjectPy::Type), |
| | &pyPart, |
| | &(App::DocumentObjectPy::Type), |
| | &pyJoint |
| | )) { |
| | return nullptr; |
| | } |
| |
|
| | auto* part = static_cast<App::DocumentObjectPy*>(pyPart)->getDocumentObjectPtr(); |
| | auto* joint = static_cast<App::DocumentObjectPy*>(pyJoint)->getDocumentObjectPtr(); |
| |
|
| | |
| | std::vector<Assembly::ObjRef> downstreamParts |
| | = this->getAssemblyObjectPtr()->getDownstreamParts(part, joint); |
| |
|
| | |
| | Py::List ret; |
| | for (const auto& objRef : downstreamParts) { |
| | if (objRef.obj) { |
| | ret.append(Py::Object(objRef.obj->getPyObject(), true)); |
| | } |
| | } |
| |
|
| | return Py::new_reference_to(ret); |
| | } |
| |
|