Salome HOME
Issue #2361 sketch line color is wrong after delete and undo
[modules/shaper.git] / src / ModelAPI / ModelAPI_Tools.cpp
index 7956c4dbb91966ec0a54917e62e6c7d0777b0e2b..1e57d36b76113351ad2aff3d4c04837c88fd2837 100755 (executable)
@@ -382,6 +382,7 @@ bool removeFeaturesAndReferences(const std::set<FeaturePtr>& theFeatures,
   return ModelAPI_Tools::removeFeatures(aFeatures, false);
 }
 
+//***********************************************************************
 bool removeFeatures(const std::set<FeaturePtr>& theFeatures,
                     const bool theFlushRedisplay)
 {
@@ -406,6 +407,7 @@ bool removeFeatures(const std::set<FeaturePtr>& 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
@@ -623,8 +625,9 @@ void getConcealedResults(const FeaturePtr& theFeature,
   }
 }
 
-std::string getDefaultName(const std::shared_ptr<ModelAPI_Result>& theResult,
-                           const int theResultIndex)
+std::pair<std::string, bool> getDefaultName(
+    const std::shared_ptr<ModelAPI_Result>& theResult,
+    const int theResultIndex)
 {
   typedef std::list< std::pair < std::string, std::list<ObjectPtr> > > ListOfReferences;
 
@@ -646,7 +649,7 @@ std::string getDefaultName(const std::shared_ptr<ModelAPI_Result>& theResult,
       if (aCompSolidRes == *anIt)
         break;
     aDefaultName << "_" << (aCompSolidResultIndex + 1) << "_" << (theResultIndex + 1);
-    return aDefaultName.str();
+    return std::pair<std::string, bool>(aDefaultName.str(), false);
   }
 
   DataPtr aData = anOwner->data();
@@ -658,14 +661,20 @@ std::string getDefaultName(const std::shared_ptr<ModelAPI_Result>& theResult,
   ListOfReferences::const_iterator aFoundRef = aReferences.end();
   for (ListOfReferences::const_iterator aRefIt = aReferences.begin();
        aRefIt != aReferences.end(); ++aRefIt) {
-    if (aSession->validators()->isConcealed(anOwner->getKind(), aRefIt->first)) {
+    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 && (aFoundRef == aReferences.end() ||
+      if (isBody && (isMainArg || aFoundRef == aReferences.end() ||
           aData->isPrecedingAttribute(aRefIt->first, aFoundRef->first)))
         aFoundRef = aRefIt;
+
+      if (isMainArg)
+        break;
     }
   }
 
@@ -687,7 +696,11 @@ std::string getDefaultName(const std::shared_ptr<ModelAPI_Result>& theResult,
       ResultCompSolidPtr aParentCompSolid = ModelAPI_Tools::compSolidOwner(anObjRes);
       if (aParentCompSolid)
         anObjRes = aParentCompSolid;
-      return anObjRes->data()->name();
+
+      // 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<std::string, bool>(anObjRes->data()->name(), true);
     }
   }
 
@@ -698,7 +711,7 @@ std::string getDefaultName(const std::shared_ptr<ModelAPI_Result>& theResult,
   // add unique prefix starting from second
   if (theResultIndex > 0 || theResult->groupName() == ModelAPI_ResultBody::group())
     aDefaultName << "_" << theResultIndex + 1;
-  return aDefaultName.str();
+  return std::pair<std::string, bool>(aDefaultName.str(), false);
 }
 
 } // namespace ModelAPI_Tools