Salome HOME
Extrusion fix
[modules/shaper.git] / src / ModelAPI / ModelAPI_Tools.cpp
index 1b618562d6e8c10dc3b3c6daa61a59574a8fbc0e..3f823dcb2f9e8fde966d603bb483a26260776df4 100755 (executable)
@@ -52,8 +52,26 @@ std::string getFeatureError(const FeaturePtr& theFeature)
   if (anError.empty()) {
     bool isDone = ( theFeature->data()->execState() == ModelAPI_StateDone
                  || theFeature->data()->execState() == ModelAPI_StateMustBeUpdated );
-    if (!isDone)
+    if (!isDone) {
       anError = toString(theFeature->data()->execState());
+      // If the feature is Composite and error is StateInvalidArgument,
+      // error text should include error of first invalid sub-feature. Otherwise
+      // it is not clear what is the reason of the invalid argument.
+      if (theFeature->data()->execState() == ModelAPI_StateInvalidArgument) {
+        CompositeFeaturePtr aComposite =
+                    std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(theFeature);
+        if (aComposite) {
+          for (int i = 0, aSize = aComposite->numberOfSubs(); i < aSize; i++) {
+            FeaturePtr aSubFeature = aComposite->subFeature(i);
+            std::string aSubFeatureError = getFeatureError(aSubFeature);
+            if (!aSubFeatureError.empty()) {
+              anError = anError + " in " + aSubFeature->getKind() + ".\n" + aSubFeatureError;
+              break;
+            }
+          }
+        }
+      }
+    }
   }
 
   return anError;
@@ -188,7 +206,7 @@ void findRandomColor(std::vector<int>& theValues)
     fillColorMap();
   }
 
-  int aSize = myColorMap.size();
+  size_t aSize = myColorMap.size();
   int anIndex = rand() % aSize;
   if (myColorMap.find(anIndex) != myColorMap.end()) {
     theValues = myColorMap.at(anIndex);
@@ -234,7 +252,7 @@ FeaturePtr findPartFeature(const DocumentPtr& theMain, const DocumentPtr& theSub
 CompositeFeaturePtr compositeOwner(const FeaturePtr& theFeature)
 {
   if (theFeature.get() && theFeature->data()->isValid()) {
-    const std::set<std::shared_ptr<ModelAPI_Attribute> > aRefs = theFeature->data()->refsToMe();
+    const std::set<std::shared_ptr<ModelAPI_Attribute> >& aRefs = theFeature->data()->refsToMe();
     std::set<std::shared_ptr<ModelAPI_Attribute> >::const_iterator aRefIter = aRefs.begin();
     for(; aRefIter != aRefs.end(); aRefIter++) {
       CompositeFeaturePtr aComp = std::dynamic_pointer_cast<ModelAPI_CompositeFeature>