PyObject* DocumentObjectGroupPy::addObject(PyObject *args) { PyObject *object; if (!PyArg_ParseTuple(args, "O!", &(DocumentObjectPy::Type), &object)) // convert args: Python->C return NULL; // NULL triggers exception DocumentObjectPy* docObj = static_cast<DocumentObjectPy*>(object); if (!docObj->getDocumentObjectPtr() || !docObj->getDocumentObjectPtr()->getNameInDocument()) { PyErr_SetString(Base::BaseExceptionFreeCADError, "Cannot add an invalid object"); return NULL; } if (docObj->getDocumentObjectPtr()->getDocument() != getDocumentObjectGroupPtr()->getDocument()) { PyErr_SetString(Base::BaseExceptionFreeCADError, "Cannot add an object from another document to this group"); return NULL; } if (docObj->getDocumentObjectPtr() == this->getDocumentObjectGroupPtr()) { PyErr_SetString(Base::BaseExceptionFreeCADError, "Cannot add a group object to itself"); return NULL; } if (docObj->getDocumentObjectPtr()->getTypeId().isDerivedFrom(DocumentObjectGroup::getClassTypeId())) { App::DocumentObjectGroup* docGrp = static_cast<DocumentObjectGroup*>(docObj->getDocumentObjectPtr()); if (this->getDocumentObjectGroupPtr()->isChildOf(docGrp)) { PyErr_SetString(Base::BaseExceptionFreeCADError, "Cannot add a group object to a child group"); return NULL; } } DocumentObjectGroup* grp = getDocumentObjectGroupPtr(); if (grp->getTypeId().isDerivedFrom(App::DocumentObjectGroupPython::getClassTypeId())) { DocumentObjectGroupPython* grppy = static_cast<DocumentObjectGroupPython*>(grp); App::Property* proxy = grppy->getPropertyByName("Proxy"); if (proxy && proxy->getTypeId() == App::PropertyPythonObject::getClassTypeId()) { Py::Object vp = static_cast<App::PropertyPythonObject*>(proxy)->getValue(); if (vp.hasAttr(std::string("addObject"))) { Py::Callable method(vp.getAttr(std::string("addObject"))); // check which this method belongs to to avoid an infinite recursion if (method.getAttr(std::string("__self__")) != Py::Object(this)) { Py::Tuple args(1); args[0] = Py::Object(object); method.apply(args); Py_Return; } } } } grp->addObject(docObj->getDocumentObjectPtr()); Py_Return; }
PyObject* DocumentObjectGroupPy::removeObject(PyObject *args) { PyObject *object; if (!PyArg_ParseTuple(args, "O!", &(DocumentObjectPy::Type), &object)) // convert args: Python->C return NULL; // NULL triggers exception DocumentObjectPy* docObj = static_cast<DocumentObjectPy*>(object); if (!docObj->getDocumentObjectPtr() || !docObj->getDocumentObjectPtr()->getNameInDocument()) { PyErr_SetString(Base::BaseExceptionFreeCADError, "Cannot remove an invalid object"); return NULL; } if (docObj->getDocumentObjectPtr()->getDocument() != getDocumentObjectGroupPtr()->getDocument()) { PyErr_SetString(Base::BaseExceptionFreeCADError, "Cannot remove an object from another document from this group"); return NULL; } DocumentObjectGroup* grp = getDocumentObjectGroupPtr(); if (grp->getTypeId().isDerivedFrom(App::DocumentObjectGroupPython::getClassTypeId())) { DocumentObjectGroupPython* grppy = static_cast<DocumentObjectGroupPython*>(grp); App::Property* proxy = grppy->getPropertyByName("Proxy"); if (proxy && proxy->getTypeId() == App::PropertyPythonObject::getClassTypeId()) { Py::Object vp = static_cast<App::PropertyPythonObject*>(proxy)->getValue(); if (vp.hasAttr(std::string("removeObject"))) { Py::Callable method(vp.getAttr(std::string("removeObject"))); Py::Tuple args(1); args[0] = Py::Object(object); method.apply(args); Py_Return; } } } grp->removeObject(docObj->getDocumentObjectPtr()); Py_Return; }