diff --git a/src/App/ExtensionContainer.cpp b/src/App/ExtensionContainer.cpp index b3688d51ba..be52ac6922 100644 --- a/src/App/ExtensionContainer.cpp +++ b/src/App/ExtensionContainer.cpp @@ -94,7 +94,7 @@ bool ExtensionContainer::hasExtension(const std::string& name) const { } -Extension* ExtensionContainer::getExtension(Base::Type t) { +Extension* ExtensionContainer::getExtension(Base::Type t) const { auto result = _extensions.find(t); if(result == _extensions.end()) { @@ -115,7 +115,7 @@ bool ExtensionContainer::hasExtensions() const { return !_extensions.empty(); } -Extension* ExtensionContainer::getExtension(const std::string& name) { +Extension* ExtensionContainer::getExtension(const std::string& name) const { //and for types derived from it, as they can be cast to the extension for(auto entry : _extensions) { diff --git a/src/App/ExtensionContainer.h b/src/App/ExtensionContainer.h index 1108a75dfb..511d70e6ed 100644 --- a/src/App/ExtensionContainer.h +++ b/src/App/ExtensionContainer.h @@ -127,12 +127,12 @@ public: bool hasExtension(Base::Type) const; //returns first of type (or derived from) and throws otherwise bool hasExtension(const std::string& name) const; //this version does not check derived classes bool hasExtensions() const; - App::Extension* getExtension(Base::Type); //returns first of type (or derived from) and throws otherwise - App::Extension* getExtension(const std::string& name); //this version does not check derived classes + App::Extension* getExtension(Base::Type) const; + App::Extension* getExtension(const std::string& name) const; //this version does not check derived classes //returns first of type (or derived from) and throws otherwise template - ExtensionT* getExtensionByType() { + ExtensionT* getExtensionByType() const { return dynamic_cast(getExtension(ExtensionT::getExtensionClassTypeId())); }; diff --git a/src/App/GeoFeatureGroupExtension.cpp b/src/App/GeoFeatureGroupExtension.cpp index 71dfe2d9cc..d10391559f 100644 --- a/src/App/GeoFeatureGroupExtension.cpp +++ b/src/App/GeoFeatureGroupExtension.cpp @@ -92,7 +92,7 @@ std::vector GeoFeatureGroupExtension::getGeoSubObjects () std::set nextSearchSet; for ( auto obj: curSearchSet) { if ( isNonGeoGroup (obj) ) { - const App::DocumentObjectGroup *grp = static_cast (obj); + auto *grp = obj->getExtensionByType(); // Check if we havent already processed the element may happen in case of nontree structure // Note: if the condition is false this generally indicates malformed structure if ( processedGroups.find (grp) == processedGroups.end() ) { @@ -127,7 +127,7 @@ bool GeoFeatureGroupExtension::geoHasObject (const DocumentObject* obj) const { std::set nextSearchSet; for ( auto obj: curSearchSet) { if ( isNonGeoGroup (obj) ) { - const App::DocumentObjectGroup *grp = static_cast (obj); + auto *grp = obj->getExtensionByType(); if ( processedGroups.find (grp) == processedGroups.end() ) { processedGroups.insert ( grp ); const auto & objs = grp->Group.getValues(); @@ -148,11 +148,11 @@ DocumentObject* GeoFeatureGroupExtension::getGroupOfObject(const DocumentObject* GeoFeatureGroupExtension* grp = (*it)->getExtensionByType(); if ( indirect ) { if (grp->geoHasObject(obj)) { - return dynamic_cast(grp); + return grp->getExtendedObject(); } } else { if (grp->hasObject(obj)) { - return dynamic_cast(grp); + return grp->getExtendedObject(); } } } diff --git a/src/App/GeoFeatureGroupExtension.h b/src/App/GeoFeatureGroupExtension.h index 901b34bcfd..c6fe4a9f9f 100644 --- a/src/App/GeoFeatureGroupExtension.h +++ b/src/App/GeoFeatureGroupExtension.h @@ -73,7 +73,7 @@ public: /// Returns true if the given DocumentObject is DocumentObjectGroup but not GeoFeatureGroup static bool isNonGeoGroup(const DocumentObject* obj) { - return obj->hasExtension(GroupExtension::getExtensionClassTypeId()) & + return obj->hasExtension(GroupExtension::getExtensionClassTypeId()) && !obj->hasExtension(GeoFeatureGroupExtension::getExtensionClassTypeId()); } }; diff --git a/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp b/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp index d8593d4ad7..d9221c3da1 100644 --- a/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp +++ b/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp @@ -99,7 +99,12 @@ std::vector< App::DocumentObject* > ViewProviderGeoFeatureGroupExtension::getLin if(!obj) return std::vector< App::DocumentObject* >(); - //we get all linked objects, and that recursively + //if the object is a geofeaturegroup than all dependencies belong to that CS, we are not allowed + //to grap them + if(obj->hasExtension(App::GeoFeatureGroupExtension::getExtensionClassTypeId())) + return std::vector< App::DocumentObject* >(); + + //we get all linked objects std::vector< App::DocumentObject* > result; std::vector list; obj->getPropertyList(list); @@ -123,7 +128,7 @@ std::vector< App::DocumentObject* > ViewProviderGeoFeatureGroupExtension::getLin //collect all dependencies of those objects std::vector< App::DocumentObject* > links; - for(App::DocumentObject *obj : result) { + for(App::DocumentObject *obj : result) { auto vec = getLinkedObjects(obj); links.insert(links.end(), vec.begin(), vec.end()); }