Download src/Mod/Assembly/App/AssemblyObjectPyImp.cpp from AbdulElahGwaith/FreeCAD: direct link, hf CLI and curl.
- Browser
- Download file 7.34 kB
-
https://huggingface.co/AbdulElahGwaith/FreeCAD/resolve/main/src/Mod/Assembly/App/AssemblyObjectPyImp.cpp
- Command line
-
hf download hf://AbdulElahGwaith/FreeCAD/src/Mod/Assembly/App/AssemblyObjectPyImp.cpp
-
curl -L -o AssemblyObjectPyImp.cpp https://huggingface.co/AbdulElahGwaith/FreeCAD/resolve/main/src/Mod/Assembly/App/AssemblyObjectPyImp.cpp
7.34 kB
| // SPDX-License-Identifier: LGPL-2.1-or-later | |
| /**************************************************************************** | |
| * * | |
| * Copyright (c) 2024 Ondsel <development@ondsel.com> * | |
| * * | |
| * 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 * | |
| * <https://www.gnu.org/licenses/>. * | |
| * * | |
| ***************************************************************************/ | |
| // inclusion of the generated files (generated out of AssemblyObject.xml) | |
| using namespace Assembly; | |
| // returns a string which represents the object e.g. when printed in python | |
| std::string AssemblyObjectPy::representation() const | |
| { | |
| return {"<Assembly object>"}; | |
| } | |
| 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<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; | |
| // 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<App::DocumentObjectPy*>(pyPart)->getDocumentObjectPtr(); | |
| auto* joint = static_cast<App::DocumentObjectPy*>(pyJoint)->getDocumentObjectPtr(); | |
| // Call the C++ method | |
| std::vector<Assembly::ObjRef> 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); | |
| } | |