X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModelAPI%2FModelAPI_Tools.cpp;h=1e57d36b76113351ad2aff3d4c04837c88fd2837;hb=80926f787b594a2e9b77ee5bd22f517bdb910f07;hp=9dd0d9d6c7eee1985ad332b2c8a2614e4ca7c4d5;hpb=a94fc319f2aa64b43c9a73b5ff7063923648faec;p=modules%2Fshaper.git diff --git a/src/ModelAPI/ModelAPI_Tools.cpp b/src/ModelAPI/ModelAPI_Tools.cpp index 9dd0d9d6c..1e57d36b7 100755 --- a/src/ModelAPI/ModelAPI_Tools.cpp +++ b/src/ModelAPI/ModelAPI_Tools.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -268,6 +269,7 @@ CompositeFeaturePtr compositeOwner(const FeaturePtr& theFeature) ResultCompSolidPtr compSolidOwner(const ResultPtr& theSub) { + int anIndex; ResultBodyPtr aBody = std::dynamic_pointer_cast(theSub); if (aBody.get()) { FeaturePtr aFeatureOwner = aBody->document()->feature(aBody); @@ -276,7 +278,7 @@ ResultCompSolidPtr compSolidOwner(const ResultPtr& theSub) aFeatureOwner->results().cbegin(); for(; aResIter != aFeatureOwner->results().cend(); aResIter++) { ResultCompSolidPtr aComp = std::dynamic_pointer_cast(*aResIter); - if (aComp && aComp->isSub(aBody)) + if (aComp && aComp->isSub(aBody, anIndex)) return aComp; } } @@ -284,6 +286,25 @@ ResultCompSolidPtr compSolidOwner(const ResultPtr& theSub) return ResultCompSolidPtr(); // not found } +int compSolidIndex(const ResultPtr& theSub) +{ + int anIndex = -1; + ResultBodyPtr aBody = std::dynamic_pointer_cast(theSub); + if (aBody.get()) { + FeaturePtr aFeatureOwner = aBody->document()->feature(aBody); + if (aFeatureOwner.get()) { + std::list >::const_iterator aResIter = + aFeatureOwner->results().cbegin(); + for(; aResIter != aFeatureOwner->results().cend(); aResIter++) { + ResultCompSolidPtr aComp = std::dynamic_pointer_cast(*aResIter); + if (aComp && aComp->isSub(aBody, anIndex)) + return anIndex; + } + } + } + return anIndex; // not found +} + bool hasSubResults(const ResultPtr& theResult) { ResultCompSolidPtr aCompSolid = std::dynamic_pointer_cast(theResult); @@ -361,6 +382,7 @@ bool removeFeaturesAndReferences(const std::set& theFeatures, return ModelAPI_Tools::removeFeatures(aFeatures, false); } +//*********************************************************************** bool removeFeatures(const std::set& theFeatures, const bool theFlushRedisplay) { @@ -385,6 +407,7 @@ bool removeFeatures(const std::set& theFeatures, return true; } +//*********************************************************************** // Fills the references list by all references of the feature from the references map. // This is a recusive method to find references by next found feature in the map of references. // \param theFeature a feature to find references @@ -602,4 +625,93 @@ void getConcealedResults(const FeaturePtr& theFeature, } } +std::pair getDefaultName( + const std::shared_ptr& theResult, + const int theResultIndex) +{ + typedef std::list< std::pair < std::string, std::list > > ListOfReferences; + + SessionPtr aSession = ModelAPI_Session::get(); + FeaturePtr anOwner = ModelAPI_Feature::feature(theResult->data()->owner()); + + ResultCompSolidPtr aCompSolidRes = compSolidOwner(theResult); + if (aCompSolidRes) { + // names of sub-solids in CompSolid should be default (for example, + // result of boolean operation 'Boolean_1_1' is a CompSolid which is renamed to 'MyBOOL', + // however, sub-elements of 'MyBOOL' should be named 'Boolean_1_1_1', 'Boolean_1_1_2' etc.) + std::ostringstream aDefaultName; + aDefaultName << anOwner->name(); + // compute default name of CompSolid (name of feature + index of CompSolid's result) + int aCompSolidResultIndex = 0; + const std::list& aResults = anOwner->results(); + for (std::list::const_iterator anIt = aResults.begin(); + anIt != aResults.end(); ++anIt, ++aCompSolidResultIndex) + if (aCompSolidRes == *anIt) + break; + aDefaultName << "_" << (aCompSolidResultIndex + 1) << "_" << (theResultIndex + 1); + return std::pair(aDefaultName.str(), false); + } + + DataPtr aData = anOwner->data(); + + ListOfReferences aReferences; + aData->referencesToObjects(aReferences); + + // find first result with user-defined name + ListOfReferences::const_iterator aFoundRef = aReferences.end(); + for (ListOfReferences::const_iterator aRefIt = aReferences.begin(); + aRefIt != aReferences.end(); ++aRefIt) { + bool isConcealed = aSession->validators()->isConcealed(anOwner->getKind(), aRefIt->first); + bool isMainArg = isConcealed && + aSession->validators()->isMainArgument(anOwner->getKind(), aRefIt->first); + if (isConcealed) { + // check the referred object is a Body + // (for example, ExtrusionCut has a sketch as a first attribute which is concealing) + bool isBody = aRefIt->second.size() > 1 || (aRefIt->second.size() == 1 && + aRefIt->second.front()->groupName() == ModelAPI_ResultBody::group()); + if (isBody && (isMainArg || aFoundRef == aReferences.end() || + aData->isPrecedingAttribute(aRefIt->first, aFoundRef->first))) + aFoundRef = aRefIt; + + if (isMainArg) + break; + } + } + + // find an object which is concealed by theResult + if (aFoundRef != aReferences.end() && !aFoundRef->second.empty()) { + std::list::const_iterator anObjIt = aFoundRef->second.begin(); + int aResultIndex = theResultIndex; + while (--aResultIndex >= 0) { + ++anObjIt; + if (anObjIt == aFoundRef->second.end()) { + anObjIt = aFoundRef->second.begin(); + break; + } + } + // check the result is a Body + if ((*anObjIt)->groupName() == ModelAPI_ResultBody::group()) { + // check the result is part of CompSolid + ResultPtr anObjRes = std::dynamic_pointer_cast(*anObjIt); + ResultCompSolidPtr aParentCompSolid = ModelAPI_Tools::compSolidOwner(anObjRes); + if (aParentCompSolid) + anObjRes = aParentCompSolid; + + // return name of reference result only if it has been renamed by the user, + // in other case compose a default name + if (anObjRes->data()->hasUserDefinedName()) + return std::pair(anObjRes->data()->name(), true); + } + } + + // compose default name by the name of the feature and the index of result + std::stringstream aDefaultName; + aDefaultName << anOwner->name(); + // if there are several results (issue #899: any number of result), + // add unique prefix starting from second + if (theResultIndex > 0 || theResult->groupName() == ModelAPI_ResultBody::group()) + aDefaultName << "_" << theResultIndex + 1; + return std::pair(aDefaultName.str(), false); +} + } // namespace ModelAPI_Tools