Salome HOME
Make "DoF" message from the sketch plugin translated correctly to French.
[modules/shaper.git] / src / PartSet / PartSet_Validators.cpp
old mode 100755 (executable)
new mode 100644 (file)
index ec18af3..f8d05fe
@@ -1,8 +1,21 @@
-// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
-
-// File:        PartSet_Validators.cpp
-// Created:     09 July 2014
-// Author:      Vitaly SMETANNIKOV
+// Copyright (C) 2014-2019  CEA/DEN, EDF R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
 
 #include "PartSet_Validators.h"
 
@@ -19,6 +32,9 @@
 #include <ModuleBase_OperationFeature.h>
 #include <ModuleBase_ViewerPrs.h>
 
+#include <GeomDataAPI_Point2D.h>
+#include <GeomAPI_Pnt2d.h>
+
 #include <Events_InfoMessage.h>
 
 #include <ModelAPI_AttributeRefAttr.h>
 #include <ModelAPI_AttributeSelectionList.h>
 #include <ModelAPI_AttributeRefList.h>
 #include <ModelAPI_Object.h>
-#include <ModelAPI_ResultCompSolid.h>
+#include <ModelAPI_ResultBody.h>
 #include <ModelAPI_Session.h>
 #include <ModelAPI_Tools.h>
 
 #include <SketchPlugin_Sketch.h>
 #include <SketchPlugin_ConstraintCoincidence.h>
 #include <SketchPlugin_Arc.h>
+#include <SketchPlugin_Point.h>
 #include <GeomAPI_Edge.h>
 
 #include <list>
@@ -265,26 +282,19 @@ bool PartSet_TangentSelection::isValid(const ModuleBase_ISelection* theSelection
       return false;
     GeomAPI_Edge aEdge1(aShape);
 
-    if (aEdge1.isLine() || aEdge1.isArc()) {
-      if (aList.size() == 2) {
-        // Check second selection
-        aPrs = aList.last();
-        const GeomShapePtr& aShape2 = aPrs->shape();
-        if (!aShape2.get() || aShape2->isNull() || aShape2->shapeType() != GeomAPI_Shape::EDGE)
-          return false;
-        GeomAPI_Edge aEdge2(aShape2);
-
-        if (aEdge1.isLine() && aEdge2.isArc())
-          return true;
-        else if (aEdge1.isArc() && aEdge2.isLine())
-          return true;
-        else
-          return false;
-      } else
-        return true;
+    if (aList.size() == 2) {
+      // Check second selection
+      aPrs = aList.last();
+      const GeomShapePtr& aShape2 = aPrs->shape();
+      if (!aShape2.get() || aShape2->isNull() || aShape2->shapeType() != GeomAPI_Shape::EDGE)
+        return false;
+      GeomAPI_Edge aEdge2(aShape2);
+
+      if (aEdge1.isLine() && aEdge2.isLine())
+        return false;
     }
-    return false;
   }
+  return true;
 }
 
 bool PartSet_AngleSelection::isValid(const ModuleBase_ISelection* theSelection,
@@ -318,12 +328,12 @@ bool PartSet_EqualSelection::isValid(const ModuleBase_ISelection* theSelection,
             aType = 1;
           else if (aType != 1)
             return false;
-        } else if (aEdge.isCircle()) {
+        } else if (aEdge.isCircle() || aEdge.isArc()) {
           if (aCount == 1)
             aType = 2;
           else if (aType != 2)
             return false;
-        } else if (aEdge.isArc()) {
+        } else if (aEdge.isEllipse()) {
           if (aCount == 1)
             aType = 3;
           else if (aType != 3)
@@ -389,6 +399,17 @@ bool PartSet_ProjectionSelection::isValid(const ModuleBase_ISelection* theSelect
   }
 }
 
+bool PartSet_IntersectionSelection::isValid(const ModuleBase_ISelection* theSelection,
+                                     ModuleBase_Operation* theOperation) const
+{
+  if (theSelection->getSelected(ModuleBase_ISelection::Viewer).size() == 0) {
+    return isEmptySelectionValid(theOperation);
+  } else {
+    int aCount = shapesNbLines(theSelection);
+    return aCount == 0;
+  }
+}
+
 
 std::string PartSet_DifferentObjectsValidator::errorMessage(
                          const PartSet_DifferentObjectsValidator::ErrorType& theType,
@@ -471,6 +492,7 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute
     AttributeSelectionPtr anAttr =
       std::dynamic_pointer_cast<ModelAPI_AttributeSelection>(theAttribute);
     ResultPtr aContext = anAttr->context();
+    FeaturePtr aContextFeature = anAttr->contextFeature();
     GeomShapePtr aShape = anAttr->value();
 
     // Check selection attributes
@@ -489,6 +511,24 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute
               return false;
             }
           }
+          // check the whole selected feature contains the result
+          if (aContextFeature.get()) {
+            if (aRef->contextFeature().get()) {
+              if (aContextFeature == aRef->contextFeature()) {
+                theError = errorMessage(EqualShapes, "", theAttribute->id(), aRef->id());
+                return false;
+              }
+            } else if (aRef->context().get() &&
+                aRef->context()->document()->feature(aRef->context()) == aContextFeature) {
+              theError = errorMessage(EqualShapes, "", theAttribute->id(), aRef->id());
+              return false;
+            }
+          } else if (aRef->contextFeature().get() && aContext.get()) {
+            if (aContext->document()->feature(aContext) == aRef->contextFeature()) {
+              theError = errorMessage(EqualShapes, "", theAttribute->id(), aRef->id());
+              return false;
+            }
+          }
         }
       }
     }
@@ -529,7 +569,8 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute
           for(int i = 0; i < aCurSelList->size(); i++) {
             std::shared_ptr<ModelAPI_AttributeSelection> aCurSel = aCurSelList->value(i);
             ResultPtr aCurSelContext = aCurSel->context();
-            ResultCompSolidPtr aCurSelCompSolidPtr = ModelAPI_Tools::compSolidOwner(aCurSelContext);
+            FeaturePtr aCurSelFeature = aCurSel->contextFeature();
+            ResultBodyPtr aCurSelCompSolidPtr = ModelAPI_Tools::bodyOwner(aCurSelContext);
             std::shared_ptr<GeomAPI_Shape> aCurSelCompSolid;
             if(aCurSelCompSolidPtr.get()) {
               aCurSelCompSolid = aCurSelCompSolidPtr->shape();
@@ -537,27 +578,47 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute
             for(int j = 0; j < aRefSelList->size(); j++) {
               std::shared_ptr<ModelAPI_AttributeSelection> aRefSel = aRefSelList->value(j);
               ResultPtr aRefSelContext = aRefSel->context();
-              ResultCompSolidPtr aRefSelCompSolidPtr =
-                ModelAPI_Tools::compSolidOwner(aRefSelContext);
+              FeaturePtr aRefSelFeature = aRefSel->contextFeature();
+              ResultBodyPtr aRefSelCompSolidPtr =
+                ModelAPI_Tools::bodyOwner(aRefSelContext);
               std::shared_ptr<GeomAPI_Shape> aRefSelCompSolid;
-              if(aRefSelCompSolidPtr.get()) {
+              if (aRefSelCompSolidPtr.get()) {
                 aRefSelCompSolid = aRefSelCompSolidPtr->shape();
               }
               if ((aCurSelCompSolid.get() && aCurSelCompSolid->isEqual(aRefSel->value()))
                 || (aRefSelCompSolid.get() && aRefSelCompSolid->isEqual(aCurSel->value()))) {
-                  theError = errorMessage(EqualShapes, "", theAttribute->id(),
-                                          aRefSel->id());
-                  return false;
+                theError = errorMessage(EqualShapes, "", theAttribute->id(),
+                  aRefSel->id());
+                return false;
               }
-              if(aCurSelContext == aRefSelContext) {
+              if (aCurSelContext == aRefSelContext) {
                 if (aCurSel->value().get() == NULL || aRefSel->value().get() == NULL) {
-                  theError = errorMessage(EmptyShapes, "", theAttribute->id(),
-                                          aRefSel->id());
+                  theError = errorMessage(EmptyShapes, "", theAttribute->id(), aRefSel->id());
                   return false;
                 }
                 if (aCurSel->value()->isEqual(aRefSel->value())) {
-                  theError = errorMessage(EqualShapes, "", theAttribute->id(),
-                                          aRefSel->id());
+                  theError = errorMessage(EqualShapes, "", theAttribute->id(), aRefSel->id());
+                  return false;
+                }
+              }
+
+              // check the whole selected feature contains the result
+              if (aCurSelFeature.get()) {
+                if (aRefSelFeature.get()) {
+                  if (aCurSelFeature == aRefSelFeature) {
+                    theError = errorMessage(EqualShapes, "", theAttribute->id(), aRefSel->id());
+                    return false;
+                  }
+                }
+                else if (aRefSelContext.get() &&
+                  aRefSelContext->document()->feature(aRefSelContext) == aCurSelFeature) {
+                  theError = errorMessage(EqualShapes, "", theAttribute->id(), aRefSel->id());
+                  return false;
+                }
+              }
+              else if (aRefSelFeature.get() && aCurSelContext.get()) {
+                if (aCurSelContext->document()->feature(aCurSelContext) == aRefSelFeature) {
+                  theError = errorMessage(EqualShapes, "", theAttribute->id(), aRefSel->id());
                   return false;
                 }
               }
@@ -595,6 +656,56 @@ bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute
   return true;
 }
 
+bool PartSet_DifferentPointsValidator::isValid(const AttributePtr& theAttribute,
+                                               const std::list<std::string>& theArguments,
+                                               Events_InfoMessage& theError) const
+{
+  FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(theAttribute->owner());
+
+  // the type of validated attributes should be equal, attributes with
+  // different types are not validated
+  // Check RefAttr attributes
+  std::string anAttrType = theAttribute->attributeType();
+  std::list<std::shared_ptr<ModelAPI_Attribute> > anAttrs;
+  if (anAttrType != ModelAPI_AttributeRefAttr::typeId())
+    return true;
+
+  // obtain point of the given attribute
+  AttributePoint2DPtr anAttributePoint = getRefPointAttribute(theAttribute);
+  if (!anAttributePoint.get() || !anAttributePoint->isInitialized())
+    return true;
+
+  // obtain point of the parameter attribute
+  AttributePoint2DPtr anArgumentPoint = getRefPointAttribute
+                                              (aFeature->attribute(theArguments.front()));
+
+  if (!anArgumentPoint.get() || !anArgumentPoint->isInitialized())
+    return true;
+
+  return !anAttributePoint->pnt()->isEqual(anArgumentPoint->pnt());
+}
+
+AttributePoint2DPtr PartSet_DifferentPointsValidator::getRefPointAttribute
+                                                     (const AttributePtr& theAttribute) const
+{
+  AttributeRefAttrPtr anAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(theAttribute);
+
+  AttributePoint2DPtr aPointAttribute;
+  if (anAttr->isObject()) {
+    ObjectPtr anObject  = anAttr->object();
+    if (anObject.get()) {
+      FeaturePtr aFeature = ModelAPI_Feature::feature(anObject);
+      if (aFeature->getKind() == SketchPlugin_Point::ID())
+        aPointAttribute = std::dynamic_pointer_cast<GeomDataAPI_Point2D>
+                                          (aFeature->attribute(SketchPlugin_Point::COORD_ID()));
+    }
+  }
+  else {
+    aPointAttribute = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(anAttr->attr());
+  }
+  return aPointAttribute;
+}
+
 bool PartSet_CoincidentAttr::isValid(const AttributePtr& theAttribute,
                                      const std::list<std::string>& theArguments,
                                      Events_InfoMessage& theError) const
@@ -639,10 +750,13 @@ bool PartSet_CoincidentAttr::isValid(const AttributePtr& theAttribute,
         AttributePtr aAR = aRAttr->attr();
         if (aAR->id() != SketchPlugin_Arc::CENTER_ID()) // ignore constraint to center of arc
           aCoinList.insert(aConstrFeature);
+          QList<bool> anIsAttributes;
           PartSet_Tools::findCoincidences(aConstrFeature, aCoinsideLines, aCoins,
-                                          SketchPlugin_ConstraintCoincidence::ENTITY_A());
+                                          SketchPlugin_ConstraintCoincidence::ENTITY_A(),
+                                          anIsAttributes);
           PartSet_Tools::findCoincidences(aConstrFeature, aCoinsideLines, aCoins,
-                                          SketchPlugin_ConstraintCoincidence::ENTITY_B());
+                                          SketchPlugin_ConstraintCoincidence::ENTITY_B(),
+                                          anIsAttributes);
       }
     }
     // if there is no coincidence then it is not valid