Salome HOME
Validator for attributes of the Equal constraint
[modules/shaper.git] / src / SketchPlugin / SketchPlugin_Validators.cpp
index baace5c2aa3541633ba64400234e2f2b17bbde84..fe88ebf595e516bc949a0b732905bf6c59cd8031 100644 (file)
@@ -10,6 +10,7 @@
 #include "SketchPlugin_ConstraintRigid.h"
 #include "SketchPlugin_Line.h"
 #include "SketchPlugin_Arc.h"
+#include "SketchPlugin_Circle.h"
 
 #include "SketcherPrs_Tools.h"
 
@@ -165,3 +166,47 @@ bool SketchPlugin_NotFixedValidator::isValid(
   return true;
 }
 
+bool SketchPlugin_EqualAttrValidator::isValid(
+  const AttributePtr& theAttribute, const std::list<std::string>& theArguments ) const
+{
+  std::string aParamA = theArguments.front();
+  FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(theAttribute->owner());
+  AttributeRefAttrPtr aRefAttr[2];
+  aRefAttr[0] = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(theAttribute);
+  if (!aRefAttr)
+    return false;
+  aRefAttr[1] = aFeature->data()->refattr(aParamA);
+
+  if (!aRefAttr[0]->isObject() || !aRefAttr[1]->isObject())
+    return false;
+
+  int aType[2] = {0, 0}; // types of attributes: 0 - incorrect, 1 - line, 2 - circle, 3 - arc
+  std::list<std::string> anArguments;
+  for (int i = 0; i < 2; i++) {
+    ObjectPtr anObject = aRefAttr[i]->object();
+    aFeature = ModelAPI_Feature::feature(anObject);
+    if (!aFeature)
+      return false;
+
+    if (aFeature->getKind() == SketchPlugin_Line::ID()) {
+      aType[i] = 1;
+      continue;
+    }
+    if (aFeature->getKind() == SketchPlugin_Circle::ID()) {
+      aType[i] = 2;
+      continue;
+    }
+    if (aFeature->getKind() == SketchPlugin_Arc::ID()) {
+      aType[i] = 3;
+      continue;
+    }
+    // wrong type of attribute
+    return false;
+  }
+
+  if ((aType[0] == 1 && aType[1] == 2) ||
+      (aType[0] == 2 && aType[1] == 1))
+    return false;
+  return true;
+}
+