diff --git a/src/App/GeoFeatureGroupExtension.cpp b/src/App/GeoFeatureGroupExtension.cpp index 210bf801a6..5b52d822cb 100644 --- a/src/App/GeoFeatureGroupExtension.cpp +++ b/src/App/GeoFeatureGroupExtension.cpp @@ -111,15 +111,16 @@ Base::Placement GeoFeatureGroupExtension::recursiveGroupPlacement(GeoFeatureGrou return group->placement().getValue(); } -void GeoFeatureGroupExtension::addObject(App::DocumentObject* object) { +std::vector GeoFeatureGroupExtension::addObject(App::DocumentObject* object) { if(!allowObject(object)) - return; + return std::vector(); //cross CoordinateSystem links are not allowed, so we need to move the whole link group auto links = getCSRelevantLinks(object); links.push_back(object); + auto ret = links; std::vector grp = Group.getValues(); for( auto obj : links) { //only one geofeaturegroup per object. @@ -129,13 +130,16 @@ void GeoFeatureGroupExtension::addObject(App::DocumentObject* object) { if (!hasObject(obj)) grp.push_back(obj); + else + ret.erase(std::remove(ret.begin(), ret.end(), obj), ret.end()); } Group.setValues(grp); + return ret; } -void GeoFeatureGroupExtension::removeObject(App::DocumentObject* object) { +std::vector GeoFeatureGroupExtension::removeObject(App::DocumentObject* object) { //cross CoordinateSystem links are not allowed, so we need to remove the whole link group auto links = getCSRelevantLinks(object); @@ -147,6 +151,7 @@ void GeoFeatureGroupExtension::removeObject(App::DocumentObject* object) { grp.erase(std::remove(grp.begin(), grp.end(), link), grp.end()); Group.setValues(grp); + return links; } std::vector< DocumentObject* > GeoFeatureGroupExtension::getObjectsFromLinks(DocumentObject* obj) { diff --git a/src/App/GeoFeatureGroupExtension.h b/src/App/GeoFeatureGroupExtension.h index 20771add4b..a9b5d0ad4d 100644 --- a/src/App/GeoFeatureGroupExtension.h +++ b/src/App/GeoFeatureGroupExtension.h @@ -96,8 +96,8 @@ public: !obj->hasExtension(GeoFeatureGroupExtension::getExtensionClassTypeId()); } - virtual void addObject(DocumentObject* obj); - virtual void removeObject(DocumentObject* obj); + virtual std::vector addObject(DocumentObject* obj) override; + virtual std::vector removeObject(DocumentObject* obj) override; /// returns GeoFeatureGroup relevant objects that are linked from the given one. That meas all linked objects /// including their linkes (recursively) except GeoFeatureGroups, where the recursion stops. Expressions diff --git a/src/App/GroupExtension.cpp b/src/App/GroupExtension.cpp index 9051ccecf9..1645f82975 100644 --- a/src/App/GroupExtension.cpp +++ b/src/App/GroupExtension.cpp @@ -59,13 +59,13 @@ DocumentObject* GroupExtension::addObject(const char* sType, const char* pObject return obj; } -void GroupExtension::addObject(DocumentObject* obj) +std::vector GroupExtension::addObject(DocumentObject* obj) { if(!allowObject(obj)) - return; + return std::vector(); if (hasObject(obj)) - return; + return std::vector(); //only one group per object. Note that it is allowed to be in a group and geofeaturegroup. However, //getGroupOfObject() returns only normal groups, no GeoFeatureGroups. Hence this works. @@ -81,6 +81,9 @@ void GroupExtension::addObject(DocumentObject* obj) std::vector grp = Group.getValues(); grp.push_back(obj); Group.setValues(grp); + + std::vector vec = {obj}; + return vec; } void GroupExtension::addObjects(const std::vector& objs) @@ -106,7 +109,7 @@ void GroupExtension::addObjects(const std::vector& objs) Group.setValues(grp); } -void GroupExtension::removeObject(DocumentObject* obj) +std::vector GroupExtension::removeObject(DocumentObject* obj) { const std::vector & grp = Group.getValues(); std::vector newGrp; @@ -115,6 +118,9 @@ void GroupExtension::removeObject(DocumentObject* obj) if (grp.size() != newGrp.size()) { Group.setValues (newGrp); } + + std::vector vec = {obj}; + return vec; } void GroupExtension::removeObjectsFromDocument() diff --git a/src/App/GroupExtension.h b/src/App/GroupExtension.h index 97b2aaf6eb..02b24f05c0 100644 --- a/src/App/GroupExtension.h +++ b/src/App/GroupExtension.h @@ -50,9 +50,9 @@ public: * append it to this group as well. */ virtual DocumentObject *addObject(const char* sType, const char* pObjectName); - /* Adds the object \a obj to this group. + /* Adds the object \a obj to this group. Returns all objects that have been added. */ - virtual void addObject(DocumentObject* obj); + virtual std::vector addObject(DocumentObject* obj); /* Adds an array of object \a objs to this group. */ virtual void addObjects(const std::vector& objs); @@ -60,9 +60,9 @@ public: */ virtual bool allowObject(DocumentObject* ) {return true;} - /** Removes an object from this group. + /** Removes an object from this group. Returns all objects that have been removed. */ - virtual void removeObject(DocumentObject* obj); + virtual std::vector removeObject(DocumentObject* obj); /** Removes all children objects from this group and the document. */ virtual void removeObjectsFromDocument(); diff --git a/src/App/GroupExtensionPyImp.cpp b/src/App/GroupExtensionPyImp.cpp index 398dcfc30a..4d3fd7aa3e 100644 --- a/src/App/GroupExtensionPyImp.cpp +++ b/src/App/GroupExtensionPyImp.cpp @@ -86,8 +86,12 @@ PyObject* GroupExtensionPy::addObject(PyObject *args) GroupExtension* grp = getGroupExtensionPtr(); - grp->addObject(docObj->getDocumentObjectPtr()); - Py_Return; + auto vec = grp->addObject(docObj->getDocumentObjectPtr()); + Py::List list; + for (App::DocumentObject* obj : vec) + list.append(Py::asObject(obj->getPyObject())); + + return Py::new_reference_to(list); } PyObject* GroupExtensionPy::removeObject(PyObject *args) @@ -108,8 +112,12 @@ PyObject* GroupExtensionPy::removeObject(PyObject *args) GroupExtension* grp = getGroupExtensionPtr(); - grp->removeObject(docObj->getDocumentObjectPtr()); - Py_Return; + auto vec = grp->removeObject(docObj->getDocumentObjectPtr()); + Py::List list; + for (App::DocumentObject* obj : vec) + list.append(Py::asObject(obj->getPyObject())); + + return Py::new_reference_to(list); } PyObject* GroupExtensionPy::removeObjectsFromDocument(PyObject *args) diff --git a/src/App/OriginGroupExtension.cpp b/src/App/OriginGroupExtension.cpp index f6f869a156..a7b9ca5502 100644 --- a/src/App/OriginGroupExtension.cpp +++ b/src/App/OriginGroupExtension.cpp @@ -174,9 +174,9 @@ void OriginGroupExtension::relinkToOrigin(App::DocumentObject* obj) } } -void OriginGroupExtension::addObject(DocumentObject* obj) { +std::vector< DocumentObject* > OriginGroupExtension::addObject(DocumentObject* obj) { relinkToOrigin(obj); - App::GeoFeatureGroupExtension::addObject(obj); + return App::GeoFeatureGroupExtension::addObject(obj); } diff --git a/src/App/OriginGroupExtension.h b/src/App/OriginGroupExtension.h index 2e98bae3a0..c802308e29 100644 --- a/src/App/OriginGroupExtension.h +++ b/src/App/OriginGroupExtension.h @@ -66,7 +66,7 @@ public: //changes all links of obj to a origin to point to this groupes origin void relinkToOrigin(App::DocumentObject* obj); - virtual void addObject(DocumentObject* obj) override; + virtual std::vector addObject(DocumentObject* obj) override; protected: /// Checks integrity of the Origin diff --git a/src/Gui/Tree.cpp b/src/Gui/Tree.cpp index 53f463a444..2b413f85fa 100644 --- a/src/Gui/Tree.cpp +++ b/src/Gui/Tree.cpp @@ -44,6 +44,7 @@ #include #include #include +#include #include "Tree.h" #include "Command.h" @@ -643,11 +644,26 @@ void TreeWidget::dropEvent(QDropEvent *event) vpp->dragObject(obj); } - std::list baseViews = gui->getMDIViews(); - for (MDIView* view : baseViews) { - View3DInventor *activeView = dynamic_cast(view); - if (activeView && !activeView->getViewer()->hasViewProvider(vpc)) { - activeView->getViewer()->addViewProvider(vpc); + //make sure it is not part of a geofeaturegroup anymore. When this has happen we need to handle + //all removed objects + std::vector vps = {vpc}; + auto grp = App::GeoFeatureGroupExtension::getGroupOfObject(obj); + if(grp) { + auto removed = grp->getExtensionByType()->removeObject(obj); + for(auto o : removed) { + auto remvp = gui->getViewProvider(o); + if(remvp) + vps.push_back(remvp); + } + } + + for(auto vp : vps) { + std::list baseViews = gui->getMDIViews(); + for (MDIView* view : baseViews) { + View3DInventor *activeView = dynamic_cast(view); + if (activeView && !activeView->getViewer()->hasViewProvider(vp)) { + activeView->getViewer()->addViewProvider(vp); + } } } } diff --git a/src/Mod/PartDesign/App/Body.cpp b/src/Mod/PartDesign/App/Body.cpp index b80d1aed2f..7ec008b9aa 100644 --- a/src/Mod/PartDesign/App/Body.cpp +++ b/src/Mod/PartDesign/App/Body.cpp @@ -265,16 +265,19 @@ Body* Body::findBodyOf(const App::DocumentObject* feature) } -void Body::addObject(App::DocumentObject *feature) +std::vector Body::addObject(App::DocumentObject *feature) { if(!isAllowed(feature)) throw Base::Exception("Body: object is not allowed"); - + + //TODO: features should not add all links + /* //only one group per object auto *group = App::GroupExtension::getGroupOfObject(feature); if(group && group != getExtendedObject()) group->getExtensionByType()->removeObject(feature); - + */ + insertObject (feature, getNextSolidFeature (), /*after = */ false); // Move the Tip if we added a solid if (isSolidFeature(feature)) { @@ -345,7 +348,7 @@ void Body::insertObject(App::DocumentObject* feature, App::DocumentObject* targe } -void Body::removeObject(App::DocumentObject* feature) +std::vector Body::removeObject(App::DocumentObject* feature) { App::DocumentObject* nextSolidFeature = getNextSolidFeature(feature); App::DocumentObject* prevSolidFeature = getPrevSolidFeature(feature); diff --git a/src/Mod/PartDesign/App/Body.h b/src/Mod/PartDesign/App/Body.h index 43626df3f1..04efa9a88b 100644 --- a/src/Mod/PartDesign/App/Body.h +++ b/src/Mod/PartDesign/App/Body.h @@ -68,7 +68,7 @@ public: * Add the feature into the body at the current insert point. * The insertion poin is the before next solid after the Tip feature */ - virtual void addObject(App::DocumentObject*) override; + virtual std::vector addObject(App::DocumentObject*) override; /** * Insert the feature into the body after the given feature. @@ -84,7 +84,7 @@ public: void insertObject(App::DocumentObject* feature, App::DocumentObject* target, bool after=false); /// Remove the feature from the body - virtual void removeObject(DocumentObject* obj) override; + virtual std::vector removeObject(DocumentObject* obj) override; /** * Checks if the given document object lays after the current insert point