Salome HOME
updated copyright message
[modules/shaper.git] / src / BuildPlugin / BuildPlugin_Validators.cpp
index ac454e620fd03348cf9162e682171fb8320e2fda..13063fa0361f545b6a08242dc83bc98322715ce2 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2020  CEA/DEN, EDF R&D
+// Copyright (C) 2014-2023  CEA, EDF
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 //
 
 #include "BuildPlugin_Validators.h"
+#include "BuildPlugin_Solid.h"
+#include "BuildPlugin_Face.h"
+#include "BuildPlugin_Wire.h"
 
 #include <ModelAPI_AttributeSelectionList.h>
+#include <ModelAPI_AttributeString.h>
 #include <ModelAPI_ResultConstruction.h>
 
 #include <GeomAPI_PlanarEdges.h>
@@ -39,6 +43,8 @@
 #include <GeomValidators_FeatureKind.h>
 #include <GeomValidators_ShapeType.h>
 
+#include <BuildPlugin_Interpolation.h>
+
 #include <SketchPlugin_Sketch.h>
 
 #include <Events_InfoMessage.h>
@@ -123,8 +129,42 @@ bool BuildPlugin_ValidatorBaseForWire::isValid(const std::shared_ptr<ModelAPI_Fe
     return false;
   }
 
-  GeomAPI_Shape::ShapeType aShapeType = GeomAPI_Shape::shapeTypeByStr(theArguments.back());
+  if (theFeature->getKind() == BuildPlugin_Wire::ID()) {
+    /// remove objects of sub-type if ojects of correct type is in List,  in some cases :
+    /// Wire builder: wires and edges selected
+    std::set<int> aRemove;
+    for (int anIndex = 0; anIndex < aSelectionList->size(); ++anIndex) {
+      AttributeSelectionPtr aSelection = aSelectionList->value(anIndex);
+      GeomShapePtr aShape = aSelection->value();
+      if (aShape.get()) {
+        GeomAPI_Shape::ShapeType aType = aShape->shapeType();
+        if (aType == GeomAPI_Shape::WIRE) {
+          // check for edges
+          GeomAPI_ShapeExplorer anEdgeExp(aShape, GeomAPI_Shape::EDGE);
+          for (; anEdgeExp.more(); anEdgeExp.next()) {
+            GeomShapePtr aEdge = anEdgeExp.current();
+            for (int i = 0; i < aSelectionList->size(); ++i) {
+              AttributeSelectionPtr aSel = aSelectionList->value(i);
+              GeomShapePtr aShp = aSel->value();
+              if (aShp.get()) {
+                if (aShp->shapeType() == GeomAPI_Shape::EDGE) {
+                  if (aShp->isEqual(aEdge) || aShp->isSameGeometry(aEdge))
+                    aRemove.insert(i);
+                }
+              }
+              else {
+                aRemove.insert(anIndex);
+              }
+            }
+          }
+        }
+      }
+    }
+    if (aRemove.size() > 0)
+      aSelectionList->remove(aRemove);
+  }
 
+  GeomAPI_Shape::ShapeType aShapeType = GeomAPI_Shape::shapeTypeByStr(theArguments.back());
   // Collect base shapes.
   ListOfShape aListOfShapes;
   for(int anIndex = 0; anIndex < aSelectionList->size(); ++anIndex) {
@@ -194,6 +234,60 @@ bool BuildPlugin_ValidatorBaseForFace::isValid(const std::shared_ptr<ModelAPI_Fe
     return false;
   }
 
+  if (theFeature->getKind() == BuildPlugin_Face::ID()) {
+    /// remove objects of sub-type if ojects of correct type is in List,  in some cases :
+    /// - Face builder: edges, faces and wires selected
+    ///                 --> remove edges and wires
+    std::set<int> aRemove;
+    for (int anIndex = 0; anIndex < aSelectionList->size(); ++anIndex) {
+      AttributeSelectionPtr aSelection = aSelectionList->value(anIndex);
+      GeomShapePtr aShape = aSelection->value();
+      if (aShape.get()) {
+        GeomAPI_Shape::ShapeType aType = aShape->shapeType();
+        if (aType == GeomAPI_Shape::FACE) {
+          // Check for wires
+          GeomAPI_ShapeExplorer anWireExp(aShape, GeomAPI_Shape::WIRE);
+          for (; anWireExp.more(); anWireExp.next()) {
+            GeomShapePtr aWire = anWireExp.current();
+            for (int i = 0; i < aSelectionList->size(); ++i) {
+              AttributeSelectionPtr aSel = aSelectionList->value(i);
+              GeomShapePtr aShp = aSel->value();
+              if (aShp.get()) {
+                if (aShp->shapeType() == GeomAPI_Shape::WIRE) {
+                  if (aShp->isEqual(aWire) || aShp->isSameGeometry(aWire))
+                    aRemove.insert(i);
+                }
+              }
+              else {
+                aRemove.insert(anIndex);
+              }
+            }
+          }
+
+          // check for edges
+          GeomAPI_ShapeExplorer anEdgeExp(aShape, GeomAPI_Shape::EDGE);
+          for (; anEdgeExp.more(); anEdgeExp.next()) {
+            GeomShapePtr aEdge = anEdgeExp.current();
+            for (int i = 0; i < aSelectionList->size(); ++i) {
+              AttributeSelectionPtr aSel = aSelectionList->value(i);
+              GeomShapePtr aShp = aSel->value();
+              if (aShp.get()) {
+                if (aShp->shapeType() == GeomAPI_Shape::EDGE) {
+                  if (aShp->isEqual(aEdge) || aShp->isSameGeometry(aEdge))
+                    aRemove.insert(i);
+                }
+              }
+              else {
+                aRemove.insert(anIndex);
+              }
+            }
+          }
+        }
+      }
+    }
+    if (aRemove.size() > 0)
+      aSelectionList->remove(aRemove);
+  }
   bool hasEdgesOrWires = false;
   bool hasFaces = false;
 
@@ -290,6 +384,45 @@ bool BuildPlugin_ValidatorBaseForSolids::isValid(
     return false;
   }
 
+  if (theFeature->getKind() == BuildPlugin_Solid::ID()) {
+    /// remove objects of sub-type if ojects of correct type is in List,  in some cases :
+    /// Solid builder: faces and shapes shells or solids seleted
+    ///                --> remove faces
+
+    std::set<int> aRemove;
+    for (int anIndex = 0; anIndex < aSelectionList->size(); ++anIndex) {
+      AttributeSelectionPtr aSelection = aSelectionList->value(anIndex);
+      GeomShapePtr aShape = aSelection->value();
+      if (aShape.get()) {
+        GeomAPI_Shape::ShapeType aType = aShape->shapeType();
+        if ((aType == GeomAPI_Shape::SHAPE) ||
+          (aType == GeomAPI_Shape::SOLID) ||
+          (aType == GeomAPI_Shape::SHELL)) {
+
+          GeomAPI_ShapeExplorer anExp(aShape, GeomAPI_Shape::FACE);
+          for (; anExp.more(); anExp.next()) {
+            GeomShapePtr aFace = anExp.current();
+            for (int i = 0; i < aSelectionList->size(); ++i) {
+              AttributeSelectionPtr aSel = aSelectionList->value(i);
+              GeomShapePtr aShp = aSel->value();
+              if (aShp.get()) {
+                if (aShp->shapeType() == GeomAPI_Shape::FACE) {
+                  if (aShp->isEqual(aFace))
+                    aRemove.insert(i);
+                }
+              }
+              else {
+                aRemove.insert(anIndex);
+              }
+            }
+          }
+        }
+      }
+    }
+    if (aRemove.size() > 0)
+      aSelectionList->remove(aRemove);
+  }
+
   // Collect base shapes.
   ListOfShape anOriginalShapes;
   for (int anIndex = 0; anIndex < aSelectionList->size(); ++anIndex) {
@@ -569,3 +702,27 @@ bool BuildPlugin_ValidatorBaseForVertex::isValid(const AttributePtr& theAttribut
 
   return true;
 }
+
+//=================================================================================================
+bool BuildPlugin_ValidatorExpressionInterpolation::isValid(const AttributePtr& theAttribute,
+                                                   const std::list<std::string>& /*theArguments*/,
+                                                   Events_InfoMessage& theError) const
+{
+  FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(theAttribute->owner());
+
+  AttributeStringPtr aStrAttr =
+      std::dynamic_pointer_cast<ModelAPI_AttributeString>(theAttribute);
+  if (!aStrAttr->isInitialized()) {
+    theError = "Attribute \"%1\" is not initialized.";
+    theError.arg(aStrAttr->id());
+    return false;
+  }
+  bool isEmptyExpr = aStrAttr->value().empty();
+  if (isEmptyExpr) {
+    theError = "Expression is empty.";
+    return false;
+  }
+
+  theError = aFeature->string(BuildPlugin_Interpolation::EXPRESSION_ERROR_ID())->value();
+  return theError.empty();
+}