X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Tools.cpp;h=b52be827ea67d9ce23d0112942fb36c1b75eeab2;hb=0cd070a0e4106dd57c5679d5bac26a0d0afd40b5;hp=9bb1dfa84d357c5c5c3cde1cbdad0019ebbab8ea;hpb=031179ada6681b874314c450eeda806f9f8abd28;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Tools.cpp b/src/XGUI/XGUI_Tools.cpp index 9bb1dfa84..b52be827e 100644 --- a/src/XGUI/XGUI_Tools.cpp +++ b/src/XGUI/XGUI_Tools.cpp @@ -1,4 +1,22 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> +// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or +// email : webmaster.salome@opencascade.com +// #include "XGUI_Tools.h" @@ -6,6 +24,7 @@ #include "XGUI_Workshop.h" #include "ModuleBase_IWorkshop.h" +#include "ModuleBase_Tools.h" #include #include @@ -17,7 +36,7 @@ #include #include #include -#include +#include #include @@ -26,6 +45,7 @@ #include #include +#include namespace XGUI_Tools { //****************************************************************** @@ -42,7 +62,8 @@ QString dir(const QString& path, bool isAbs) QString file(const QString& path, bool withExt) { QString fPath = path; - while (!fPath.isEmpty() && (fPath[fPath.length() - 1] == '\\' || fPath[fPath.length() - 1] == '/')) + while (!fPath.isEmpty() && (fPath[fPath.length() - 1] == '\\' || + fPath[fPath.length() - 1] == '/')) fPath.remove(fPath.length() - 1, 1); if (withExt) @@ -66,11 +87,14 @@ QString unionOfObjectNames(const QObjectPtrList& theObjects, const QString& theS { QStringList aObjectNames; foreach (ObjectPtr aObj, theObjects) { - if (!aObj->data()->isValid()) - continue; - aObjectNames << QString::fromStdString(aObj->data()->name()); + if (aObj->data()->isValid()) + aObjectNames << QString::fromStdString(aObj->data()->name()); } - return aObjectNames.join(", "); + if (aObjectNames.count() == 0) + return QString(); + if (aObjectNames.count() == 1) + return aObjectNames.first(); + return aObjectNames.join(theSeparator); } //****************************************************************** @@ -99,23 +123,19 @@ std::string featureInfo(FeaturePtr theFeature) } }*/ + //****************************************************************** -bool canRemoveOrRename(QWidget* theParent, const QObjectPtrList& theObjects) +bool canRemoveOrRename(QWidget* theParent, const std::set& theFeatures) { 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; - } + std::string aNotActivatedNames; + if (!ModelAPI_Tools::allDocumentsActivated(aNotActivatedNames)) { + bool aFoundPartSetObject = ModuleBase_Tools::hasModuleDocumentFeature(theFeatures); if (aFoundPartSetObject) { + const char* aKeyStr = "Selected objects can be used in Part documents which are not loaded: " + "%1. Whould you like to continue?"; 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), + QObject::tr(aKeyStr).arg(aNotActivatedNames.c_str()), QMessageBox::No | QMessageBox::Yes, QMessageBox::No); aResult = aRes == QMessageBox::Yes; } @@ -129,11 +149,14 @@ bool canRename(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)) { - QString aErrMsg(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)); - // We can not use here a dialog box for message - it will crash editing process in ObjectBrowser - Events_Error::send(aErrMsg.toStdString()); + if (ModelAPI_Tools::findVariable(theObject->document(), + FeaturePtr(), qPrintable(theName), aValue, aParam)) { + const char* aKeyStr = "Selected parameter can not be renamed to: %1. " + "There is a parameter with the same name. Its value is: %2."; + QString aErrMsg(QObject::tr(aKeyStr).arg(qPrintable(theName)).arg(aValue)); + // We can not use here a dialog box for message - + // it will crash editing process in ObjectBrowser + Events_InfoMessage("XGUI_Tools", aErrMsg.toStdString()).send(); return false; } } @@ -141,194 +164,12 @@ bool canRename(const ObjectPtr& theObject, const QString& theName) 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; -} - -//************************************************************** -bool isSubOfComposite(const ObjectPtr& theObject) -{ - bool isSub = false; - std::set aRefFeatures; - refsToFeatureInFeatureDocument(theObject, aRefFeatures); - std::set::const_iterator anIt = aRefFeatures.begin(), - aLast = aRefFeatures.end(); - for (; anIt != aLast && !isSub; anIt++) { - isSub = isSubOfComposite(theObject, *anIt); - } - return isSub; -} - -//************************************************************** -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()) - return; - if (theAlreadyProcessed.find(aFeature) != theAlreadyProcessed.end()) - return; - theAlreadyProcessed.insert(aFeature); - - //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) && !aFullIgnoreList.contains(*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) && - !theIgnoreList.contains(aFeature)) - theDirectRefFeatures.insert(aFeature); - } - } - } -} XGUI_Workshop* workshop(ModuleBase_IWorkshop* theWorkshop) { XGUI_ModuleConnector* aConnector = dynamic_cast(theWorkshop); - return aConnector->workshop(); + return aConnector ? aConnector->workshop() : 0; } }