From a8c95189fcccea587f04a961ecabc0c944194770 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Thu, 7 Jul 2016 19:49:00 -0300 Subject: [PATCH] Path: added addObject & removeObject python methods to FeatureCompound - fixes #2607 --- src/Mod/Path/App/CMakeLists.txt | 3 + src/Mod/Path/App/FeaturePathCompound.cpp | 11 ++ src/Mod/Path/App/FeaturePathCompound.h | 1 + src/Mod/Path/App/FeaturePathCompoundPy.xml | 28 ++++ src/Mod/Path/App/FeaturePathCompoundPyImp.cpp | 140 ++++++++++++++++++ 5 files changed, 183 insertions(+) create mode 100644 src/Mod/Path/App/FeaturePathCompoundPy.xml create mode 100644 src/Mod/Path/App/FeaturePathCompoundPyImp.cpp diff --git a/src/Mod/Path/App/CMakeLists.txt b/src/Mod/Path/App/CMakeLists.txt index 333782332caa..b562b71eff08 100644 --- a/src/Mod/Path/App/CMakeLists.txt +++ b/src/Mod/Path/App/CMakeLists.txt @@ -31,6 +31,7 @@ generate_from_xml(CommandPy) generate_from_xml(PathPy) generate_from_xml(ToolPy) generate_from_xml(TooltablePy) +generate_from_xml(FeaturePathCompoundPy) SET(Python_SRCS CommandPy.xml @@ -40,6 +41,8 @@ SET(Python_SRCS ToolPy.xml TooltablePy.xml TooltablePyImp.cpp + FeaturePathCompoundPy.xml + FeaturePathCompoundPyImp.cpp ) SET(Mod_SRCS diff --git a/src/Mod/Path/App/FeaturePathCompound.cpp b/src/Mod/Path/App/FeaturePathCompound.cpp index b1d9943a61ef..1b3740f547d7 100644 --- a/src/Mod/Path/App/FeaturePathCompound.cpp +++ b/src/Mod/Path/App/FeaturePathCompound.cpp @@ -29,6 +29,8 @@ #include "FeaturePathCompound.h" #include "Command.h" #include "Path.h" +#include "FeaturePathCompoundPy.h" +#include using namespace Path; using namespace App; @@ -103,6 +105,15 @@ void FeatureCompound::removeObject(DocumentObject* obj) } } +PyObject *FeatureCompound::getPyObject() +{ + if (PythonObject.is(Py::_None())){ + // ref counter is set to 1 + PythonObject = Py::Object(new FeaturePathCompoundPy(this),true); + } + return Py::new_reference_to(PythonObject); +} + // Python Path Compound feature --------------------------------------------------------- namespace App { diff --git a/src/Mod/Path/App/FeaturePathCompound.h b/src/Mod/Path/App/FeaturePathCompound.h index 56763ba4ec17..0eec729b457d 100644 --- a/src/Mod/Path/App/FeaturePathCompound.h +++ b/src/Mod/Path/App/FeaturePathCompound.h @@ -60,6 +60,7 @@ class PathExport FeatureCompound : public Path::Feature void addObject(DocumentObject* obj); /// Removes an object from this group. void removeObject(DocumentObject* obj); + virtual PyObject *getPyObject(void); }; diff --git a/src/Mod/Path/App/FeaturePathCompoundPy.xml b/src/Mod/Path/App/FeaturePathCompoundPy.xml new file mode 100644 index 000000000000..fae79f2c0b73 --- /dev/null +++ b/src/Mod/Path/App/FeaturePathCompoundPy.xml @@ -0,0 +1,28 @@ + + + + + + This class handles Path Compound features + + + + Add an object to the group + + + + + Remove an object from the group + + + + + diff --git a/src/Mod/Path/App/FeaturePathCompoundPyImp.cpp b/src/Mod/Path/App/FeaturePathCompoundPyImp.cpp new file mode 100644 index 000000000000..5c5effe2de37 --- /dev/null +++ b/src/Mod/Path/App/FeaturePathCompoundPyImp.cpp @@ -0,0 +1,140 @@ +/*************************************************************************** + * Copyright (c) 2007 Werner Mayer * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library 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 Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + + +#include "PreCompiled.h" + +#include "FeaturePathCompound.h" +#include + +// inclusion of the generated files (generated out of FeaturePathCompoundPy.xml) +#include "FeaturePathCompoundPy.h" +#include "FeaturePathCompoundPy.cpp" + +using namespace Path; + + +// returns a string which represent the object e.g. when printed in python +std::string FeaturePathCompoundPy::representation(void) const +{ + return std::string(""); +} + + +PyObject* FeaturePathCompoundPy::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(object); + if (!docObj->getDocumentObjectPtr() || !docObj->getDocumentObjectPtr()->getNameInDocument()) { + PyErr_SetString(Base::BaseExceptionFreeCADError, "Cannot add an invalid object"); + return NULL; + } + if (docObj->getDocumentObjectPtr()->getDocument() != getFeaturePathCompoundPtr()->getDocument()) { + PyErr_SetString(Base::BaseExceptionFreeCADError, "Cannot add an object from another document to this group"); + return NULL; + } + if (docObj->getDocumentObjectPtr() == this->getFeaturePathCompoundPtr()) { + PyErr_SetString(Base::BaseExceptionFreeCADError, "Cannot add a group object to itself"); + return NULL; + } + + FeatureCompound* comp = getFeaturePathCompoundPtr(); + + if (comp->getTypeId().isDerivedFrom(Path::FeatureCompoundPython::getClassTypeId())) { + FeatureCompoundPython* comppy = static_cast(comp); + App::Property* proxy = comppy->getPropertyByName("Proxy"); + if (proxy && proxy->getTypeId() == App::PropertyPythonObject::getClassTypeId()) { + Py::Object vp = static_cast(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; + } + } + } + } + + comp->addObject(docObj->getDocumentObjectPtr()); + Py_Return; +} + + +PyObject* FeaturePathCompoundPy::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(object); + if (!docObj->getDocumentObjectPtr() || !docObj->getDocumentObjectPtr()->getNameInDocument()) { + PyErr_SetString(Base::BaseExceptionFreeCADError, "Cannot remove an invalid object"); + return NULL; + } + if (docObj->getDocumentObjectPtr()->getDocument() != getFeaturePathCompoundPtr()->getDocument()) { + PyErr_SetString(Base::BaseExceptionFreeCADError, "Cannot remove an object from another document from this group"); + return NULL; + } + + FeatureCompound* comp = getFeaturePathCompoundPtr(); + + if (comp->getTypeId().isDerivedFrom(Path::FeatureCompoundPython::getClassTypeId())) { + FeatureCompoundPython* comppy = static_cast(comp); + App::Property* proxy = comppy->getPropertyByName("Proxy"); + if (proxy && proxy->getTypeId() == App::PropertyPythonObject::getClassTypeId()) { + Py::Object vp = static_cast(proxy)->getValue(); + if (vp.hasAttr(std::string("removeObject"))) { + Py::Callable method(vp.getAttr(std::string("removeObject"))); + // 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; + } + } + } + } + + comp->removeObject(docObj->getDocumentObjectPtr()); + Py_Return; +} + + + +PyObject *FeaturePathCompoundPy::getCustomAttributes(const char* /*attr*/) const +{ + return 0; +} + + +int FeaturePathCompoundPy::setCustomAttributes(const char* /*attr*/, PyObject* /*obj*/) +{ + return 0; +} +