X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Tools.cpp;h=9bb1dfa84d357c5c5c3cde1cbdad0019ebbab8ea;hb=220bd2b37119be1c65abf88a88792445cb9d99f8;hp=ab9ef819f618481662ef078c9f63979fd9326252;hpb=cbde248859fb0072f6012907391ea90cfc254574;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Tools.cpp b/src/XGUI/XGUI_Tools.cpp index ab9ef819f..9bb1dfa84 100644 --- a/src/XGUI/XGUI_Tools.cpp +++ b/src/XGUI/XGUI_Tools.cpp @@ -2,6 +2,11 @@ #include "XGUI_Tools.h" +#include "XGUI_ModuleConnector.h" +#include "XGUI_Workshop.h" + +#include "ModuleBase_IWorkshop.h" + #include #include #include @@ -56,6 +61,18 @@ QString addSlash(const QString& path) return res; } +//****************************************************************** +QString unionOfObjectNames(const QObjectPtrList& theObjects, const QString& theSeparator) +{ + QStringList aObjectNames; + foreach (ObjectPtr aObj, theObjects) { + if (!aObj->data()->isValid()) + continue; + aObjectNames << QString::fromStdString(aObj->data()->name()); + } + return aObjectNames.join(", "); +} + //****************************************************************** bool isModelObject(FeaturePtr theFeature) { @@ -190,9 +207,31 @@ bool isSubOfComposite(const ObjectPtr& theObject) //************************************************************** void refsToFeatureInAllDocuments(const ObjectPtr& theSourceObject, const ObjectPtr& theObject, + const QObjectPtrList& theIgnoreList, std::set& theDirectRefFeatures, std::set& theIndirectRefFeatures, std::set& theAlreadyProcessed) +{ + refsDirectToFeatureInAllDocuments(theSourceObject, theObject, theIgnoreList, theDirectRefFeatures, + theAlreadyProcessed); + + // Run recursion. It is possible recursive dependency, like the following: plane, extrusion uses plane, + // axis is built on extrusion. Delete of a plane should check the dependency from the axis also. + std::set::const_iterator aFeatureIt = theDirectRefFeatures.begin(); + for (; aFeatureIt != theDirectRefFeatures.end(); ++aFeatureIt) { + std::set aRecursiveRefFeatures; + refsToFeatureInAllDocuments(theSourceObject, *aFeatureIt, theIgnoreList, + aRecursiveRefFeatures, aRecursiveRefFeatures, theAlreadyProcessed); + theIndirectRefFeatures.insert(aRecursiveRefFeatures.begin(), aRecursiveRefFeatures.end()); + } + +} + +//************************************************************** +void refsDirectToFeatureInAllDocuments(const ObjectPtr& theSourceObject, const ObjectPtr& theObject, + const QObjectPtrList& theIgnoreList, + std::set& theDirectRefFeatures, + std::set& theAlreadyProcessed) { FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); if (!aFeature.get()) @@ -201,15 +240,29 @@ void refsToFeatureInAllDocuments(const ObjectPtr& theSourceObject, const ObjectP return; theAlreadyProcessed.insert(aFeature); - // 1. find references in the current document + //convert ignore object list to containt sub-features if the composite feature is in the list + QObjectPtrList aFullIgnoreList; + QObjectPtrList::const_iterator anIIt = theIgnoreList.begin(), anILast = theIgnoreList.end(); + for (; anIIt != anILast; anIIt++) { + aFullIgnoreList.append(*anIIt); + CompositeFeaturePtr aComposite = std::dynamic_pointer_cast(*anIIt); + // if the current feature is aborted, the composite is removed and has invalid data + if (aComposite.get() && aComposite->data()->isValid()) { + int aNbSubs = aComposite->numberOfSubs(); + for (int aSub = 0; aSub < aNbSubs; aSub++) { + aFullIgnoreList.append(aComposite->subFeature(aSub)); + } + } + } + // 1. find references in the current document std::set aRefFeatures; refsToFeatureInFeatureDocument(theObject, aRefFeatures); std::set::const_iterator anIt = aRefFeatures.begin(), aLast = aRefFeatures.end(); for (; anIt != aLast; anIt++) { // composite feature should not be deleted when the sub feature is to be deleted - if (!isSubOfComposite(theSourceObject, *anIt)) + if (!isSubOfComposite(theSourceObject, *anIt) && !aFullIgnoreList.contains(*anIt)) theDirectRefFeatures.insert(*anIt); } @@ -264,21 +317,18 @@ void refsToFeatureInAllDocuments(const ObjectPtr& theSourceObject, const ObjectP } } } - if (aHasReferenceToObject && !isSubOfComposite(theSourceObject, aFeature)) + if (aHasReferenceToObject && !isSubOfComposite(theSourceObject, aFeature) && + !theIgnoreList.contains(aFeature)) theDirectRefFeatures.insert(aFeature); } } } +} - // Run recursion. It is possible recursive dependency, like the following: plane, extrusion uses plane, - // axis is built on extrusion. Delete of a plane should check the dependency from the axis also. - std::set::const_iterator aFeatureIt = theDirectRefFeatures.begin(); - for (; aFeatureIt != theDirectRefFeatures.end(); ++aFeatureIt) { - std::set aRecursiveRefFeatures; - refsToFeatureInAllDocuments(theSourceObject, *aFeatureIt, - aRecursiveRefFeatures, aRecursiveRefFeatures, theAlreadyProcessed); - theIndirectRefFeatures.insert(aRecursiveRefFeatures.begin(), aRecursiveRefFeatures.end()); - } +XGUI_Workshop* workshop(ModuleBase_IWorkshop* theWorkshop) +{ + XGUI_ModuleConnector* aConnector = dynamic_cast(theWorkshop); + return aConnector->workshop(); } }