Salome HOME
Merge branch 'Dev_1.2.0' of newgeom:newgeom.git into Dev_1.2.0
[modules/shaper.git] / src / SketchPlugin / SketchPlugin_Validators.cpp
index 674f9de12ee3be1107ddb2c399d67adb3ad86993..9dfdb517155a23638c3f2808b20bcf96365c0cda 100644 (file)
@@ -23,7 +23,7 @@
 #include <ModelAPI_AttributeSelectionList.h>
 #include <ModelAPI_Session.h>
 
-#include <GeomValidators_Edge.h>
+#include <GeomValidators_ShapeType.h>
 
 #include <GeomDataAPI_Point2D.h>
 
@@ -48,20 +48,20 @@ bool SketchPlugin_DistanceAttrValidator::isValid(
     // 1. check whether the references object is a linear
     ObjectPtr anObject = aRefAttr->object();
 
-    const ModelAPI_AttributeValidator* anEdgeValidator = 
-      dynamic_cast<const GeomValidators_Edge*>(aFactory->validator("GeomValidators_Edge"));
+    const ModelAPI_AttributeValidator* aShapeValidator = 
+      dynamic_cast<const GeomValidators_ShapeType*>(aFactory->validator("GeomValidators_ShapeType"));
     std::list<std::string> anArguments;
     anArguments.push_back("circle");
-    bool anEdgeValid = anEdgeValidator->isValid(aRefAttr, anArguments);
+    bool aShapeValid = aShapeValidator->isValid(aRefAttr, anArguments);
     // the circle line is not a valid case
-    if (anEdgeValid)
+    if (aShapeValid)
       return false;
       
     anArguments.clear();
     anArguments.push_back("line");
-    anEdgeValid = anEdgeValidator->isValid(aRefAttr, anArguments);
+    aShapeValid = aShapeValidator->isValid(aRefAttr, anArguments);
     // if the attribute value is not a line, that means it is a vertex. A vertex is always valid
-    if (!anEdgeValid)
+    if (!aShapeValid)
       return true;
 
     FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(theAttribute->owner());
@@ -280,3 +280,37 @@ bool SketchPlugin_CoincidenceAttrValidator::isValid(
   return false;
 }
 
+
+bool SketchPlugin_CopyValidator::isValid(
+  const AttributePtr& theAttribute, const std::list<std::string>& theArguments ) const
+{
+  FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(theAttribute->owner());
+  AttributeSelectionListPtr aSelAttr = 
+    std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(theAttribute);
+  if (!aSelAttr)
+    return false;
+
+  AttributeRefListPtr aRefListOfInitial = std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(
+      aFeature->attribute(SketchPlugin_Constraint::ENTITY_A()));
+  AttributeRefListPtr aRefListOfCopied = std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(
+      aFeature->attribute(SketchPlugin_Constraint::ENTITY_B()));
+  std::list<ObjectPtr> anInitialObjects = aRefListOfInitial->list();
+  std::list<ObjectPtr> aCopiedObjects = aRefListOfCopied->list();
+
+  std::list<ObjectPtr>::iterator anObjIter;
+  for(int anInd = 0; anInd < aSelAttr->size(); anInd++) {
+    std::shared_ptr<ModelAPI_AttributeSelection> aSelect = aSelAttr->value(anInd);
+    anObjIter = anInitialObjects.begin();
+    for (; anObjIter != anInitialObjects.end(); anObjIter++)
+      if (aSelect->context() == *anObjIter)
+        break;
+    if (anObjIter != anInitialObjects.end())
+      continue;
+    anObjIter = aCopiedObjects.begin();
+    for (; anObjIter != aCopiedObjects.end(); anObjIter++)
+      if (aSelect->context() == *anObjIter)
+        return false;
+  }
+  return true;
+}
+