// SPDX-License-Identifier: LGPL-2.1-or-later /**************************************************************************** * * * Copyright (c) 2024 Ondsel * * * * This file is part of FreeCAD. * * * * FreeCAD is free software: you can redistribute it and/or modify it * * under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation, either version 2.1 of the * * License, or (at your option) any later version. * * * * FreeCAD is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with FreeCAD. If not, see * * . * * * ***************************************************************************/ // inclusion of the generated files (generated out of AssemblyObject.xml) #include "AssemblyObjectPy.h" #include "AssemblyObjectPy.cpp" using namespace Assembly; // returns a string which represents the object e.g. when printed in python std::string AssemblyObjectPy::representation() const { return {""}; } PyObject* AssemblyObjectPy::getCustomAttributes(const char* /*attr*/) const { return nullptr; } int AssemblyObjectPy::setCustomAttributes(const char* /*attr*/, PyObject* /*obj*/) { 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(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(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(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(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 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; // Parse the two arguments: a part object and a joint object if (!PyArg_ParseTuple( args, "O!O!", &(App::DocumentObjectPy::Type), &pyPart, &(App::DocumentObjectPy::Type), &pyJoint )) { return nullptr; } auto* part = static_cast(pyPart)->getDocumentObjectPtr(); auto* joint = static_cast(pyJoint)->getDocumentObjectPtr(); // Call the C++ method std::vector downstreamParts = this->getAssemblyObjectPtr()->getDownstreamParts(part, joint); // Convert the result into a Python list of DocumentObjects 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); }