From 0ec1d9d76b325fd14ae8b9d85234025a3c702bc1 Mon Sep 17 00:00:00 2001 From: spo Date: Tue, 7 Jul 2015 16:51:15 +0300 Subject: [PATCH] Issue #660 - Move Group is still not implemented --- src/XGUI/XGUI_Workshop.cpp | 139 +++++++++++++++++++++---------------- 1 file changed, 79 insertions(+), 60 deletions(-) diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index 7607e1617..a824f4298 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -1068,74 +1068,87 @@ void XGUI_Workshop::moveObjects() } //************************************************************** -bool XGUI_Workshop::deleteFeatures(const QObjectPtrList& theList, - const std::set& theIgnoredFeatures, - QWidget* theParent, - const bool theAskAboutDeleteReferences) +std::set refFeatures(const ObjectPtr& theObject, bool checkAllDocuments = true) { - // 1. find all referenced features std::set aRefFeatures; - foreach (ObjectPtr aDeletedObj, theList) { - FeaturePtr aDeletedFeature = ModelAPI_Feature::feature(aDeletedObj); - if (aDeletedFeature.get() != NULL) { - DocumentPtr aDeletedFeatureDoc = aDeletedObj->document(); - // 1.1 find references in the current document - aDeletedFeatureDoc->refsToFeature(aDeletedFeature, aRefFeatures, false); - // 1.2 find references in all documents if the document of the feature is - // "PartSet". Features of this document can be used in all other documents - SessionPtr aMgr = ModelAPI_Session::get(); - DocumentPtr aModuleDoc = aMgr->moduleDocument(); - if (aDeletedFeatureDoc == aModuleDoc) { - // the deleted feature and results of the feature should be found in references - std::list aDeletedObjects; - aDeletedObjects.push_back(aDeletedFeature); - typedef std::list > ResultsList; - const ResultsList& aDeletedResults = aDeletedFeature->results(); - ResultsList::const_iterator aRIter = aDeletedResults.begin(); - for (; aRIter != aDeletedResults.cend(); aRIter++) { - ResultPtr aRes = *aRIter; - if (aRes.get()) - aDeletedObjects.push_back(aRes); - } - // get all opened documents; found features in the documents; - // get a list of objects where a feature refers; - // search in these objects the deleted objects. - std::list anOpenedDocs = aMgr->allOpenedDocuments(); - std::list::const_iterator anIt = anOpenedDocs.begin(), - aLast = anOpenedDocs.end(); - std::list > > aRefs; - for (; anIt != aLast; anIt++) { - DocumentPtr aDocument = *anIt; - if (aDocument == aDeletedFeatureDoc) - continue; // this document has been already processed in 1.1 - - int aFeaturesCount = aDocument->size(ModelAPI_Feature::group()); - for (int aId = 0; aId < aFeaturesCount; aId++) { - ObjectPtr anObject = aDocument->object(ModelAPI_Feature::group(), aId); - FeaturePtr aFeature = std::dynamic_pointer_cast(anObject); - if (!aFeature.get()) - continue; - - aRefs.clear(); - aFeature->data()->referencesToObjects(aRefs); - std::list > >::iterator aRef = aRefs.begin(); - bool aHasReferenceToDeleted = false; - for(; aRef != aRefs.end() && !aHasReferenceToDeleted; aRef++) { - std::list::iterator aRefObj = aRef->second.begin(); - for(; aRefObj != aRef->second.end() && !aHasReferenceToDeleted; aRefObj++) { - std::list::const_iterator aDelIt = aDeletedObjects.begin(); - for(; aDelIt != aDeletedObjects.end() && !aHasReferenceToDeleted; aDelIt++) { - aHasReferenceToDeleted = *aDelIt == *aRefObj; - } + FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); + if (!aFeature.get()) + return aRefFeatures; + + DocumentPtr aFeatureDoc = aFeature->document(); + // 1. find references in the current document + aFeatureDoc->refsToFeature(aFeature, aRefFeatures, false); + + // 2. find references in all documents if the document of the feature is + // "PartSet". Features of this document can be used in all other documents + if (checkAllDocuments) { + SessionPtr aMgr = ModelAPI_Session::get(); + DocumentPtr aModuleDoc = aMgr->moduleDocument(); + if (aFeatureDoc == aModuleDoc) { + // the feature and results of the feature should be found in references + std::list aDeletedObjects; + aDeletedObjects.push_back(aFeature); + typedef std::list > ResultsList; + const ResultsList& aResults = aFeature->results(); + ResultsList::const_iterator aRIter = aResults.begin(); + for (; aRIter != aResults.cend(); aRIter++) { + ResultPtr aRes = *aRIter; + if (aRes.get()) + aDeletedObjects.push_back(aRes); + } + // get all opened documents; found features in the documents; + // get a list of objects where a feature refers; + // search in these objects the deleted objects. + std::list anOpenedDocs = aMgr->allOpenedDocuments(); + std::list::const_iterator anIt = anOpenedDocs.begin(), + aLast = anOpenedDocs.end(); + std::list > > aRefs; + for (; anIt != aLast; anIt++) { + DocumentPtr aDocument = *anIt; + if (aDocument == aFeatureDoc) + continue; // this document has been already processed in 1.1 + + int aFeaturesCount = aDocument->size(ModelAPI_Feature::group()); + for (int aId = 0; aId < aFeaturesCount; aId++) { + ObjectPtr anObject = aDocument->object(ModelAPI_Feature::group(), aId); + FeaturePtr aFeature = std::dynamic_pointer_cast(anObject); + if (!aFeature.get()) + continue; + + aRefs.clear(); + aFeature->data()->referencesToObjects(aRefs); + std::list > >::iterator aRef = aRefs.begin(); + bool aHasReferenceToObjetc = false; + for(; aRef != aRefs.end() && !aHasReferenceToObjetc; aRef++) { + std::list::iterator aRefObj = aRef->second.begin(); + for(; aRefObj != aRef->second.end() && !aHasReferenceToObjetc; aRefObj++) { + std::list::const_iterator aObjIt = aDeletedObjects.begin(); + for(; aObjIt != aDeletedObjects.end() && !aHasReferenceToObjetc; aObjIt++) { + aHasReferenceToObjetc = *aObjIt == *aRefObj; } } - if (aHasReferenceToDeleted) - aRefFeatures.insert(aFeature); } + if (aHasReferenceToObjetc) + aRefFeatures.insert(aFeature); } } } } + return aRefFeatures; +} + +//************************************************************** +bool XGUI_Workshop::deleteFeatures(const QObjectPtrList& theList, + const std::set& theIgnoredFeatures, + QWidget* theParent, + const bool theAskAboutDeleteReferences) +{ + // 1. find all referenced features + std::set aRefFeatures; + foreach (ObjectPtr aDeletedObj, theList) { + std::set aFeatures = refFeatures(aDeletedObj); + aRefFeatures.insert(aFeatures.begin(), aFeatures.end()); + } // 2. warn about the references remove, break the delete operation if the user chose it if (theAskAboutDeleteReferences && !aRefFeatures.empty()) { QStringList aRefNames; @@ -1229,7 +1242,13 @@ bool hasResults(QObjectPtrList theObjects, const std::set& theTypes //************************************************************** bool XGUI_Workshop::canMoveFeature() { - return true; + QObjectPtrList aObjects = mySelector->selection()->selectedObjects(); + std::set aRefFeatures; + foreach (ObjectPtr aObject, aObjects) { + std::set aFeatures = refFeatures(aObject, false); + aRefFeatures.insert(aFeatures.begin(), aFeatures.end()); + } + return aRefFeatures.empty(); } //************************************************************** -- 2.39.2