Salome HOME
Merge branch 'master' of salome:modules/shaper
[modules/shaper.git] / src / GeomValidators / GeomValidators_ZeroOffset.cpp
index 3d08e9fd95817006dd9de5983b8865e88ab65539..20d324edd59db1d70acaf4c152607a02cf6b75fd 100644 (file)
@@ -6,6 +6,8 @@
 
 #include <GeomValidators_ZeroOffset.h>
 
+#include <Events_InfoMessage.h>
+
 #include <ModelAPI_AttributeDouble.h>
 #include <ModelAPI_AttributeSelection.h>
 #include <ModelAPI_AttributeSelectionList.h>
@@ -21,7 +23,7 @@
 //=================================================================================================
 bool GeomValidators_ZeroOffset::isValid(const std::shared_ptr<ModelAPI_Feature>& theFeature,
                                         const std::list<std::string>& theArguments,
-                                        std::string& theError) const
+                                        Events_InfoMessage& theError) const
 {
   if(theArguments.size() != 9) {
     theError = "Wrong number of validator arguments in xml(expected 9).";
@@ -46,7 +48,9 @@ bool GeomValidators_ZeroOffset::isValid(const std::shared_ptr<ModelAPI_Feature>&
       int aSketchFacesNum = aConstruction->facesNum();
       for(int aFaceIndex = 0; aFaceIndex < aSketchFacesNum; aFaceIndex++) {
         std::shared_ptr<GeomAPI_Shape> aFace = std::dynamic_pointer_cast<GeomAPI_Shape>(aConstruction->face(aFaceIndex));
-        aFacesList.push_back(aFace);
+        if(aFace->isFace() && aFace->isPlanar()) {
+          aFacesList.push_back(aFace);
+        }
       }
     }
   } else if(theFeature->selectionList(*anIt)) {
@@ -55,7 +59,9 @@ bool GeomValidators_ZeroOffset::isValid(const std::shared_ptr<ModelAPI_Feature>&
       AttributeSelectionPtr aFaceSel = aFacesSelectionList->value(anIndex);
       std::shared_ptr<GeomAPI_Shape> aFaceShape = aFaceSel->value();
       if(aFaceShape.get() && !aFaceShape->isNull()) { // Getting face.
-        aFacesList.push_back(aFaceShape);
+        if(aFaceShape->isFace() && aFaceShape->isPlanar()) {
+          aFacesList.push_back(aFaceShape);
+        }
       } else { // This may be the whole sketch result selected, check and get faces.
         ResultPtr aContext = aFaceSel->context();
         std::shared_ptr<GeomAPI_Shape> aContextShape = aContext->shape();
@@ -69,7 +75,9 @@ bool GeomValidators_ZeroOffset::isValid(const std::shared_ptr<ModelAPI_Feature>&
         int aFacesNum = aConstruction->facesNum();
         for(int aFaceIndex = 0; aFaceIndex < aFacesNum || aFacesNum == -1; aFaceIndex++) {
           aFaceShape = std::dynamic_pointer_cast<GeomAPI_Shape>(aConstruction->face(aFaceIndex));
-          aFacesList.push_back(aFaceShape);
+          if(aFaceShape->isFace() && aFaceShape->isPlanar()) {
+            aFacesList.push_back(aFaceShape);
+          }
         }
       }
     }
@@ -134,9 +142,17 @@ bool GeomValidators_ZeroOffset::isValid(const std::shared_ptr<ModelAPI_Feature>&
     isPlanesCoincident = true;
   } else if(aFromShape.get() && aToShape.get()) {
     std::shared_ptr<GeomAPI_Face> aFromFace(new GeomAPI_Face(aFromShape));
+    if (aFromFace->isNull()) {
+      theError = "From face selection is invalid.";
+      return false;
+    }
     std::shared_ptr<GeomAPI_Pln>  aFromPln = aFromFace->getPlane();
 
     std::shared_ptr<GeomAPI_Face> aToFace(new GeomAPI_Face(aToShape));
+    if (aToFace->isNull()) {
+      theError = "To face selection is invalid.";
+      return false;
+    }
     std::shared_ptr<GeomAPI_Pln>  aToPln = aToFace->getPlane();
 
     if(aFromPln.get()) {
@@ -146,8 +162,16 @@ bool GeomValidators_ZeroOffset::isValid(const std::shared_ptr<ModelAPI_Feature>&
     std::shared_ptr<GeomAPI_Face> aFace;
     if(aFromShape.get()) {
       aFace.reset(new GeomAPI_Face(aFromShape));
+      if (aFace->isNull()) {
+        theError = "From face selection is invalid.";
+        return false;
+      }
     } else {
       aFace.reset(new GeomAPI_Face(aToShape));
+      if (aFace->isNull()) {
+        theError = "To face selection is invalid.";
+        return false;
+      }
     }
     std::shared_ptr<GeomAPI_Pln> aPln = aFace->getPlane();
     if(aPln.get()) {