Salome HOME
Error management -- Attribute validator returns an error.
[modules/shaper.git] / src / SketchPlugin / SketchPlugin_Validators.cpp
index a613620761710efe89c4f014b9fc02deff3c3bac..b8b2fa53e498be217bd9f10fb550ea393caa5aca 100644 (file)
@@ -7,21 +7,30 @@
 #include "SketchPlugin_Validators.h"
 #include "SketchPlugin_ConstraintDistance.h"
 #include "SketchPlugin_ConstraintCoincidence.h"
+#include "SketchPlugin_ConstraintRigid.h"
 #include "SketchPlugin_Line.h"
 #include "SketchPlugin_Arc.h"
+#include "SketchPlugin_Circle.h"
+#include "SketchPlugin_Point.h"
+
+#include "SketcherPrs_Tools.h"
 
 #include <ModelAPI_Data.h>
 #include <ModelAPI_Validator.h>
 #include <ModelAPI_AttributeDouble.h>
 #include <ModelAPI_AttributeRefAttr.h>
+#include <ModelAPI_AttributeRefList.h>
+#include <ModelAPI_AttributeSelectionList.h>
 #include <ModelAPI_Session.h>
 
-#include <GeomValidators_Edge.h>
+#include <GeomValidators_ShapeType.h>
 
 #include <GeomDataAPI_Point2D.h>
 
-bool SketchPlugin_DistanceAttrValidator::isValid(
-  const AttributePtr& theAttribute, const std::list<std::string>& theArguments ) const
+
+bool SketchPlugin_DistanceAttrValidator::isValid(const AttributePtr& theAttribute, 
+                                                 const std::list<std::string>& theArguments,
+                                                 std::string& theError) const
 {
   // there is a check whether the feature contains a point and a linear edge or two point values
   std::string aParamA = theArguments.front();
@@ -40,35 +49,39 @@ 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());
     // If it is a line then we have to check that first attribute id not a line
-    std::shared_ptr<GeomDataAPI_Point2D> aPoint = getFeaturePoint(aFeature->data(), aParamA);
+    std::shared_ptr<SketchPlugin_Feature> aSFeature =
+                            std::dynamic_pointer_cast<SketchPlugin_Feature>(theAttribute->owner());
+    SketchPlugin_Sketch* aSketch = aSFeature->sketch();
+    std::shared_ptr<GeomAPI_Ax3> aPlane = SketchPlugin_Sketch::plane(aSketch);
+    std::shared_ptr<GeomDataAPI_Point2D> aPoint = SketcherPrs_Tools::getFeaturePoint(
+                                                               aFeature->data(), aParamA, aPlane);
     if (aPoint)
       return true;
   }
   return false;
 }
 
-
-
-bool SketchPlugin_TangentAttrValidator::isValid(
-  const AttributePtr& theAttribute, const std::list<std::string>& theArguments ) const
+bool SketchPlugin_TangentAttrValidator::isValid(const AttributePtr& theAttribute, 
+                                                const std::list<std::string>& theArguments,
+                                                std::string& theError) const
 {
   // there is a check whether the feature contains a point and a linear edge or two point values
   std::string aParamA = theArguments.front();
@@ -93,47 +106,192 @@ bool SketchPlugin_TangentAttrValidator::isValid(
       if (aOtherFea->getKind() != SketchPlugin_Arc::ID())
         return false;
     } else if (aRefFea->getKind() == SketchPlugin_Arc::ID()) {
-      if (aOtherFea->getKind() != SketchPlugin_Line::ID())
+      if (aOtherFea->getKind() != SketchPlugin_Line::ID() &&
+          aOtherFea->getKind() != SketchPlugin_Arc::ID())
         return false;
     } else
       return false;
 
-    // check that both have coincidence
-    FeaturePtr aConstrFeature;
-    std::set<FeaturePtr> aCoinList;
-    const std::set<std::shared_ptr<ModelAPI_Attribute>>& aRefsList = aRefFea->data()->refsToMe();
-    std::set<std::shared_ptr<ModelAPI_Attribute>>::const_iterator aIt;
-    for (aIt = aRefsList.cbegin(); aIt != aRefsList.cend(); ++aIt) {
-      std::shared_ptr<ModelAPI_Attribute> aAttr = (*aIt);
-      aConstrFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aAttr->owner());
-      if (aConstrFeature->getKind() == SketchPlugin_ConstraintCoincidence::ID()) {
-        AttributeRefAttrPtr aRAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(aAttr);
-        AttributePtr aAR = aRAttr->attr();
-        if (aAR->id() != SketchPlugin_Arc::CENTER_ID()) // ignore constraint to center of arc
-          aCoinList.insert(aConstrFeature);
-      }
-    }
-    // if there is no coincidence then it is not valid
-    if (aCoinList.size() == 0)
+    return true;
+  }
+  return false;
+}
+
+bool SketchPlugin_NotFixedValidator::isValid(const AttributePtr& theAttribute, 
+                                             const std::list<std::string>& theArguments,
+                                             std::string& theError) const
+{
+  std::shared_ptr<SketchPlugin_Feature> aFeature =
+      std::dynamic_pointer_cast<SketchPlugin_Feature>(theAttribute->owner());
+  if (!aFeature)
+    return true;
+
+  AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(theAttribute);
+  if (!aRefAttr)
+    return false;
+
+  SketchPlugin_Sketch* aSketch = aFeature->sketch();
+  int aNbFeatures = aSketch->numberOfSubs();
+  for (int anInd = 0; anInd < aNbFeatures; anInd++) {
+    FeaturePtr aSubFeature = aSketch->subFeature(anInd);
+    if (aSubFeature->getKind() != SketchPlugin_ConstraintRigid::ID() || aSubFeature == aFeature)
+      continue;
+    AttributeRefAttrPtr aRAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
+        aSubFeature->attribute(SketchPlugin_ConstraintRigid::ENTITY_A()));
+    if (aRefAttr->isObject()) {
+      if (aRefAttr->object() == aRAttr->object())
+        return false;
+    } else if (aRefAttr->attr() == aRAttr->attr())
+      return false;
+  }
+  return true;
+}
+
+bool SketchPlugin_EqualAttrValidator::isValid(const AttributePtr& theAttribute, 
+                                              const std::list<std::string>& theArguments,
+                                              std::string& theError) 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;
 
-    // find that coincedence is the same
-    const std::set<std::shared_ptr<ModelAPI_Attribute>>& aOtherList = aOtherFea->data()->refsToMe();
-    std::set<FeaturePtr>::const_iterator aCoinsIt;
-    for (aIt = aOtherList.cbegin(); aIt != aOtherList.cend(); ++aIt) {
-      std::shared_ptr<ModelAPI_Attribute> aAttr = (*aIt);
-      aConstrFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aAttr->owner());
-      aCoinsIt = aCoinList.find(aConstrFeature);
-      if (aCoinsIt != aCoinList.end()) {
-        AttributeRefAttrPtr aRAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(aAttr);
-        AttributePtr aAR = aRAttr->attr();
-        if (aAR->id() != SketchPlugin_Arc::CENTER_ID())
-          return true;
-      }
+    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;
+}
+
+bool SketchPlugin_MirrorAttrValidator::isValid(const AttributePtr& theAttribute, 
+                                               const std::list<std::string>& theArguments,
+                                               std::string& theError) 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 aRefListOfMirrored = std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(
+      aFeature->attribute(SketchPlugin_Constraint::ENTITY_C()));
+  std::list<ObjectPtr> aMirroredObjects = aRefListOfMirrored->list();
+
+  for(int anInd = 0; anInd < aSelAttr->size(); anInd++) {
+    std::shared_ptr<ModelAPI_AttributeSelection> aSelect = aSelAttr->value(anInd);
+    std::list<ObjectPtr>::iterator aMirIter = aMirroredObjects.begin();
+    for (; aMirIter != aMirroredObjects.end(); aMirIter++)
+      if (aSelect->context() == *aMirIter)
+        return false;
+  }
+  return true;
+}
+
+
+bool SketchPlugin_CoincidenceAttrValidator::isValid(const AttributePtr& theAttribute, 
+                                                    const std::list<std::string>& theArguments,
+                                                    std::string& theError) const
+{
+  // there is a check whether the feature contains a point and a linear edge or two point values
+  std::string aParamA = theArguments.front();
+  SessionPtr aMgr = ModelAPI_Session::get();
+  ModelAPI_ValidatorsFactory* aFactory = aMgr->validators();
+
+  FeaturePtr aConstraint = std::dynamic_pointer_cast<ModelAPI_Feature>(theAttribute->owner());
+  AttributeRefAttrPtr aRefAttrA = aConstraint->data()->refattr(aParamA);
+  if (!aRefAttrA)
+    return false;
+
+  AttributeRefAttrPtr aRefAttrB = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(theAttribute);
+  if (!aRefAttrB)
+    return false;
+
+  // first attribute is a point, it may coincide with any object
+  if (!aRefAttrA->isObject())
+    return true;
+  else {
+    FeaturePtr aFeature = ModelAPI_Feature::feature(aRefAttrA->object());
+    if (!aFeature)
+      return false;
+    if (aFeature->getKind() == SketchPlugin_Point::ID())
+      return true;
+  }
+
+  // second attribute is a point, it may coincide with any object
+  if (!aRefAttrB->isObject())
+    return true;
+  else {
+    FeaturePtr aFeature = ModelAPI_Feature::feature(aRefAttrB->object());
+    if (!aFeature)
+      return false;
+    if (aFeature->getKind() == SketchPlugin_Point::ID())
+      return true;
+  }
+
   return false;
 }
 
 
+bool SketchPlugin_CopyValidator::isValid(const AttributePtr& theAttribute, 
+                                         const std::list<std::string>& theArguments,
+                                         std::string& theError) 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;
+}