X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Tools.cpp;h=45398077f6f74fd50603f75f5d93ebc09db61055;hb=65a616a3bb6cbdf09c61fed7eb91d1f5d9667988;hp=26672cd89bc4cdf295c2152632fe497bdb6c8048;hpb=3874b57fe5aba25ff5aee2a07654fc23c1ee8eb0;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Tools.cpp b/src/XGUI/XGUI_Tools.cpp index 26672cd89..45398077f 100644 --- a/src/XGUI/XGUI_Tools.cpp +++ b/src/XGUI/XGUI_Tools.cpp @@ -4,9 +4,19 @@ #include #include +#include +#include +#include +#include +#include +#include +#include +#include + #include #include +#include #include #include @@ -71,4 +81,180 @@ std::string featureInfo(FeaturePtr theFeature) } }*/ +//****************************************************************** +bool canRemoveOrRename(QWidget* theParent, const QObjectPtrList& theObjects) +{ + bool aResult = true; + QString aNotActivatedNames; + if (!XGUI_Tools::allDocumentsActivated(aNotActivatedNames)) { + DocumentPtr aModuleDoc = ModelAPI_Session::get()->moduleDocument(); + bool aFoundPartSetObject = false; + foreach (ObjectPtr aObj, theObjects) { + if (aObj->groupName() == ModelAPI_ResultPart::group()) + continue; + aFoundPartSetObject = aObj->document() == aModuleDoc; + } + if (aFoundPartSetObject) { + QMessageBox::StandardButton aRes = QMessageBox::warning(theParent, QObject::tr("Warning"), + QObject::tr("Selected objects can be used in Part documents which are not loaded: \ +%1. Whould you like to continue?").arg(aNotActivatedNames), + QMessageBox::No | QMessageBox::Yes, QMessageBox::No); + aResult = aRes == QMessageBox::Yes; + } + } + return aResult; +} + +//****************************************************************** +bool canRename(QWidget* theParent, const ObjectPtr& theObject, const QString& theName) +{ + if (std::dynamic_pointer_cast(theObject).get()) { + double aValue; + ResultParameterPtr aParam; + if (ModelAPI_Tools::findVariable(theObject->document(), qPrintable(theName), aValue, aParam)) { + QMessageBox::information(theParent, QObject::tr("Rename parameter"), + QString(QObject::tr("Selected parameter can not be renamed to: %1. \ +There is a parameter with the same name. Its value is: %2.")).arg(qPrintable(theName)).arg(aValue)); + return false; + } + } + + return true; +} + +//****************************************************************** +bool allDocumentsActivated(QString& theNotActivatedNames) +{ + bool anAllPartActivated = true; + QStringList aRefNames; + + DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); + int aSize = aRootDoc->size(ModelAPI_ResultPart::group()); + for (int i = 0; i < aSize; i++) { + ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), i); + ResultPartPtr aPart = std::dynamic_pointer_cast(aObject); + if (!aPart->isActivated()) { + anAllPartActivated = false; + aRefNames.append(aObject->data()->name().c_str()); + } + } + theNotActivatedNames = aRefNames.join(", "); + return anAllPartActivated; +} + +//************************************************************** +void refsToFeatureInFeatureDocument(const ObjectPtr& theObject, std::set& theRefFeatures) +{ + FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); + if (aFeature.get()) { + DocumentPtr aFeatureDoc = aFeature->document(); + // 1. find references in the current document + aFeatureDoc->refsToFeature(aFeature, theRefFeatures, false); + } +} + +//************************************************************** +bool isSubOfComposite(const ObjectPtr& theObject, const FeaturePtr& theFeature) +{ + bool isSub = false; + CompositeFeaturePtr aComposite = std::dynamic_pointer_cast(theFeature); + if (aComposite.get()) { + isSub = aComposite->isSub(theObject); + // the recursive is possible, the parameters are sketch circle and extrusion cut. They are + // separated by composite sketch feature + if (!isSub) { + int aNbSubs = aComposite->numberOfSubs(); + for (int aSub = 0; aSub < aNbSubs && !isSub; aSub++) { + isSub = isSubOfComposite(theObject, aComposite->subFeature(aSub)); + } + } + } + return isSub; +} + +//************************************************************** +void refsToFeatureInAllDocuments(const ObjectPtr& theSourceObject, const ObjectPtr& theObject, + std::set& theDirectRefFeatures, std::set& theIndirectRefFeatures) +{ + FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); + if (!aFeature.get()) + return; + + // 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++) { + if (!isSubOfComposite(theSourceObject, *anIt)) + theDirectRefFeatures.insert(*anIt); + } + + // 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 + DocumentPtr aFeatureDoc = aFeature->document(); + + 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 aObjects; + aObjects.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()) + aObjects.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. + SessionPtr aMgr = ModelAPI_Session::get(); + 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 aHasReferenceToObject = false; + for(; aRef != aRefs.end() && !aHasReferenceToObject; aRef++) { + std::list::iterator aRefObj = aRef->second.begin(); + for(; aRefObj != aRef->second.end() && !aHasReferenceToObject; aRefObj++) { + std::list::const_iterator aObjIt = aObjects.begin(); + for(; aObjIt != aObjects.end() && !aHasReferenceToObject; aObjIt++) { + aHasReferenceToObject = *aObjIt == *aRefObj; + } + } + } + if (aHasReferenceToObject && !isSubOfComposite(theSourceObject, 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 aRecursiveRefFeatures; + std::set::const_iterator aFeatureIt = theDirectRefFeatures.begin(); + for (; aFeatureIt != theDirectRefFeatures.end(); ++aFeatureIt) { + refsToFeatureInAllDocuments(theSourceObject, *aFeatureIt, aRecursiveRefFeatures, aRecursiveRefFeatures); + } + theIndirectRefFeatures.insert(aRecursiveRefFeatures.begin(), aRecursiveRefFeatures.end()); +} + }