Groups: Handle add and remove object correctly
This commit is contained in:
@@ -120,102 +120,6 @@ void ViewProviderGeoFeatureGroupExtension::extensionUpdateData(const App::Proper
|
||||
}
|
||||
}
|
||||
|
||||
std::vector< App::DocumentObject* > ViewProviderGeoFeatureGroupExtension::getLinkedObjects(App::DocumentObject* obj) {
|
||||
|
||||
if(!obj)
|
||||
return std::vector< App::DocumentObject* >();
|
||||
|
||||
//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<App::Property*> list;
|
||||
obj->getPropertyList(list);
|
||||
for(App::Property* prop : list) {
|
||||
if(prop->getTypeId().isDerivedFrom(App::PropertyLink::getClassTypeId()))
|
||||
result.push_back(static_cast<App::PropertyLink*>(prop)->getValue());
|
||||
else if(prop->getTypeId().isDerivedFrom(App::PropertyLinkList::getClassTypeId())) {
|
||||
auto vec = static_cast<App::PropertyLinkList*>(prop)->getValues();
|
||||
result.insert(result.end(), vec.begin(), vec.end());
|
||||
}
|
||||
else if(prop->getTypeId().isDerivedFrom(App::PropertyLinkSub::getClassTypeId()))
|
||||
result.push_back(static_cast<App::PropertyLinkSub*>(prop)->getValue());
|
||||
else if(prop->getTypeId().isDerivedFrom(App::PropertyLinkSubList::getClassTypeId())) {
|
||||
auto vec = static_cast<App::PropertyLinkList*>(prop)->getValues();
|
||||
result.insert(result.end(), vec.begin(), vec.end());
|
||||
}
|
||||
}
|
||||
|
||||
//clear all null objects
|
||||
result.erase(std::remove(result.begin(), result.end(), nullptr), result.end());
|
||||
|
||||
//collect all dependencies of those objects
|
||||
std::vector< App::DocumentObject* > links;
|
||||
for(App::DocumentObject *obj : result) {
|
||||
auto vec = getLinkedObjects(obj);
|
||||
links.insert(links.end(), vec.begin(), vec.end());
|
||||
}
|
||||
|
||||
if (!links.empty()) {
|
||||
result.insert(result.end(), links.begin(), links.end());
|
||||
std::sort(result.begin(), result.end());
|
||||
result.erase(std::unique(result.begin(), result.end()), result.end());
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void ViewProviderGeoFeatureGroupExtension::extensionDropObject(App::DocumentObject* obj) {
|
||||
|
||||
// Open command
|
||||
App::DocumentObject* grp = static_cast<App::DocumentObject*>(getExtendedViewProvider()->getObject());
|
||||
App::Document* doc = grp->getDocument();
|
||||
Gui::Document* gui = Gui::Application::Instance->getDocument(doc);
|
||||
gui->openCommand("Move object");
|
||||
|
||||
//links between different CS are not allowed, hence we need to ensure if all dependencies are in
|
||||
//the same geofeaturegroup
|
||||
auto vec = getLinkedObjects(obj);
|
||||
|
||||
//remove all objects already in the correct group
|
||||
vec.erase(std::remove_if(vec.begin(), vec.end(), [this](App::DocumentObject* o){
|
||||
return App::GroupExtension::getGroupOfObject(o) == this->getExtendedViewProvider()->getObject();
|
||||
}), vec.end());
|
||||
|
||||
vec.push_back(obj);
|
||||
|
||||
for(App::DocumentObject* o : vec) {
|
||||
// build Python command for execution
|
||||
QString cmd;
|
||||
cmd = QString::fromLatin1("App.getDocument(\"%1\").getObject(\"%2\").addObject("
|
||||
"App.getDocument(\"%1\").getObject(\"%3\"))")
|
||||
.arg(QString::fromLatin1(doc->getName()))
|
||||
.arg(QString::fromLatin1(grp->getNameInDocument()))
|
||||
.arg(QString::fromLatin1(o->getNameInDocument()));
|
||||
|
||||
Gui::Command::doCommand(Gui::Command::App, cmd.toUtf8());
|
||||
}
|
||||
gui->commitCommand();
|
||||
}
|
||||
|
||||
|
||||
void ViewProviderGeoFeatureGroupExtension::extensionDragObject(App::DocumentObject* obj) {
|
||||
//links between different coordinate systems are not allowed, hence draging one object also needs
|
||||
//to drag out all dependend objects
|
||||
auto vec = getLinkedObjects(obj);
|
||||
|
||||
//add this object
|
||||
vec.push_back(obj);
|
||||
|
||||
for(App::DocumentObject* obj : vec)
|
||||
ViewProviderGroupExtension::extensionDragObject(obj);
|
||||
}
|
||||
|
||||
|
||||
|
||||
namespace Gui {
|
||||
EXTENSION_PROPERTY_SOURCE_TEMPLATE(Gui::ViewProviderGeoFeatureGroupExtensionPython, Gui::ViewProviderGeoFeatureGroupExtension)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user