Salome HOME
Created a new event that features were reordered due to the "move to end" action
[modules/shaper.git] / src / ModelAPI / ModelAPI_ShapeValidator.cpp
index 08f0a687b5dce9002c96f38fe0bfdf1e1ab1a25a..2348819b0a986bee02e7017aaa4960841486c70d 100644 (file)
@@ -9,27 +9,43 @@
 #include <ModelAPI_AttributeSelection.h>
 #include "ModelAPI_Object.h"
 
-bool ModelAPI_ShapeValidator::isValid(const FeaturePtr& theFeature,
+bool ModelAPI_ShapeValidator::isValid(const AttributePtr& theAttribute,
                                       const std::list<std::string>& theArguments,
-                                      const ObjectPtr& theObject,
-                                      const AttributePtr& theAttribute,
-                                      const GeomShapePtr& theShape) const
+                                      std::string& theError) const
 {
+  FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(theAttribute->owner());
+  AttributeSelectionPtr aSelectionAttribute = 
+                     std::dynamic_pointer_cast<ModelAPI_AttributeSelection>(theAttribute);
+  GeomShapePtr aShape = aSelectionAttribute->value();
+  if (!aShape.get()) {
+    ResultPtr aResult = aSelectionAttribute->context();
+    if (aResult.get())
+      aShape = aResult->shape();
+  }
+
   std::string aCurrentAttributeId = theAttribute->id();
   // get all feature attributes
   std::list<AttributePtr> anAttrs = 
-                   theFeature->data()->attributes(ModelAPI_AttributeSelection::type());
-  if (anAttrs.size() > 0 && theShape.get() != NULL) {
+      aFeature->data()->attributes(ModelAPI_AttributeSelection::typeId());
+  if (anAttrs.size() > 0 && aShape.get() != NULL) {
     std::list<AttributePtr>::iterator anAttr = anAttrs.begin();
     for(; anAttr != anAttrs.end(); anAttr++) {
       AttributePtr anAttribute = *anAttr;
       // take into concideration only other attributes
       if (anAttribute.get() != NULL && anAttribute->id() != aCurrentAttributeId) {
-        AttributeSelectionPtr aSelectionAttribute = 
+        aSelectionAttribute = 
           std::dynamic_pointer_cast<ModelAPI_AttributeSelection>(anAttribute);
         // the shape of the attribute should be not the same
-        if (aSelectionAttribute.get() != NULL && theShape->isEqual(aSelectionAttribute->value())) {
-          return false;
+        if (aSelectionAttribute.get() != NULL) {
+          GeomShapePtr anAttrShape = aSelectionAttribute->value();
+          if (!anAttrShape.get()) {
+            ResultPtr aResult = aSelectionAttribute->context();
+            if (aResult.get())
+              anAttrShape = aResult->shape();
+            }
+            if (aShape->isEqual(anAttrShape)) {
+            return false;
+          }
         }
       }
     }