]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Update validator
authordbv <dbv@opencascade.com>
Wed, 2 Dec 2015 13:09:29 +0000 (16:09 +0300)
committerdbv <dbv@opencascade.com>
Tue, 8 Dec 2015 08:49:31 +0000 (11:49 +0300)
13 files changed:
src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp
src/FeaturesPlugin/FeaturesPlugin_Revolution.cpp
src/FeaturesPlugin/extrusion_widget.xml
src/FeaturesPlugin/extrusioncut_widget.xml
src/FeaturesPlugin/extrusionfuse_widget.xml
src/FeaturesPlugin/extrusionsketch_widget.xml
src/FeaturesPlugin/revolution_widget.xml
src/FeaturesPlugin/revolutioncut_widget.xml
src/FeaturesPlugin/revolutionfuse_widget.xml
src/FeaturesPlugin/revolutionsketch_widget.xml
src/GeomAPI/GeomAPI_Pln.cpp
src/GeomAPI/GeomAPI_Pln.h
src/GeomValidators/GeomValidators_ZeroOffset.cpp

index c8ac130c44e0f33c8d7fe49615b8ccc3aa3d156c..3f7ed7efdc9ed42fd3ad344ac2c9090ec4db461e 100644 (file)
@@ -61,36 +61,26 @@ void FeaturesPlugin_Extrusion::execute()
   ListOfShape aFacesList;
   AttributeSelectionListPtr aFacesSelectionList = selectionList(LIST_ID());
   for(int anIndex = 0; anIndex < aFacesSelectionList->size(); anIndex++) {
-    std::shared_ptr<ModelAPI_AttributeSelection> aFaceSel = aFacesSelectionList->value(anIndex);
-    ResultPtr aContext = aFaceSel->context();
-    std::shared_ptr<GeomAPI_Shape> aContextShape = aContext->shape();
-    if(!aContextShape.get()) {
-      static const std::string aContextError = "The selection context is bad";
-      setError(aContextError);
-      break;
-    }
-
+    AttributeSelectionPtr aFaceSel = aFacesSelectionList->value(anIndex);
     std::shared_ptr<GeomAPI_Shape> aFaceShape = aFaceSel->value();
-    int aFacesNum = -1; // this mean that "aFace" is used
-    ResultConstructionPtr aConstruction = 
-      std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aContext);
-    if(!aFaceShape.get()) { // this may be the whole sketch result selected, check and get faces
-      if (aConstruction.get()) {
-        aFacesNum = aConstruction->facesNum();
-      } else {
+    if(aFaceShape.get() && !aFaceShape->isNull()) { // Getting face.
+      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();
+      if(!aContextShape.get()) {
+        static const std::string aContextError = "The selection context is bad";
+        setError(aContextError);
+        return;
+      }
+      ResultConstructionPtr aConstruction = std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aContext);
+      if(!aConstruction.get()) {
         static const std::string aFaceError = "Can not find basis for extrusion";
         setError(aFaceError);
-        break;
+        return;
       }
-    }
-    for(int aFaceIndex = 0; aFaceIndex < aFacesNum || aFacesNum == -1; aFaceIndex++) {
-      std::shared_ptr<GeomAPI_Shape> aBaseShape;
-      if (aFacesNum == -1) {
-        if (!aFaceShape->isNull()) {
-          aFacesList.push_back(aFaceShape);
-        }
-        break;
-      } else {
+      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);
       }
index fd06b5f961e9dcd16761ca806a9aece60a5c451e..f37eac6c84c708a68de1274ee27d46f4cbffd67a 100644 (file)
@@ -58,34 +58,26 @@ void FeaturesPlugin_Revolution::execute()
   ListOfShape aFacesList;
   AttributeSelectionListPtr aFacesSelectionList = selectionList(LIST_ID());
   for(int anIndex = 0; anIndex < aFacesSelectionList->size(); anIndex++) {
-    std::shared_ptr<ModelAPI_AttributeSelection> aFaceSel = aFacesSelectionList->value(anIndex);
-    ResultPtr aContext = aFaceSel->context();
-    std::shared_ptr<GeomAPI_Shape> aContextShape = aContext->shape();
-    if(!aContextShape.get()) {
-      static const std::string aContextError = "The selection context is bad";
-      setError(aContextError);
-      break;
-    }
-
+    AttributeSelectionPtr aFaceSel = aFacesSelectionList->value(anIndex);
     std::shared_ptr<GeomAPI_Shape> aFaceShape = aFaceSel->value();
-    int aFacesNum = -1; // this mean that "aFace" is used
-    ResultConstructionPtr aConstruction = 
-      std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aContext);
-    if(!aFaceShape.get()) { // this may be the whole sketch result selected, check and get faces
-      if (aConstruction.get()) {
-        aFacesNum = aConstruction->facesNum();
-      } else {
+    if(aFaceShape.get() && !aFaceShape->isNull()) { // Getting face.
+      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();
+      if(!aContextShape.get()) {
+        static const std::string aContextError = "The selection context is bad";
+        setError(aContextError);
+        return;
+      }
+      ResultConstructionPtr aConstruction = std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aContext);
+      if(!aConstruction.get()) {
         static const std::string aFaceError = "Can not find basis for revolution";
         setError(aFaceError);
-        break;
+        return;
       }
-    }
-    for(int aFaceIndex = 0; aFaceIndex < aFacesNum || aFacesNum == -1; aFaceIndex++) {
-      std::shared_ptr<GeomAPI_Shape> aBaseShape;
-      if (aFacesNum == -1) {
-        aFacesList.push_back(aFaceShape);
-        break;
-      } else {
+      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);
       }
index a2d10a699ffbd5be8f575d58b23b507b632750c1..90a7b70785fd18477577bd0e36f68df2e20ff59d 100644 (file)
@@ -77,5 +77,5 @@
       </groupbox>
     </box>
   </toolbox>
-  <validator id="GeomValidators_ZeroOffset" parameters="CreationMethod,BySizes,to_size,from_size,to_object,to_offset,from_object,from_offset"/>
+  <validator id="GeomValidators_ZeroOffset" parameters="CreationMethod,BySizes,base,to_size,from_size,to_object,to_offset,from_object,from_offset"/>
 </source>
index a5bd0a91d68ea29ccc18634e7eaa5b932c675547..5a1c29076f2b548acc73f87ae60ec9570ebe86e3 100755 (executable)
@@ -72,5 +72,5 @@
     concealment="true">
     <validator id="GeomValidators_ShapeType" parameters="solid"/>
   </multi_selector>
-  <validator id="GeomValidators_ZeroOffset" parameters="CreationMethod,BySizes,to_size,from_size,to_object,to_offset,from_object,from_offset"/>
+  <validator id="GeomValidators_ZeroOffset" parameters="CreationMethod,BySizes,sketch_selection,to_size,from_size,to_object,to_offset,from_object,from_offset"/>
 </source>
index eb92540661e28ab7537ab900b2f1a2ef02701f29..fb06968e0f41c5605b047a695b44266342c7b107 100644 (file)
@@ -72,5 +72,5 @@
     concealment="true">
     <validator id="GeomValidators_ShapeType" parameters="solid"/>
   </multi_selector>
-  <validator id="GeomValidators_ZeroOffset" parameters="CreationMethod,BySizes,to_size,from_size,to_object,to_offset,from_object,from_offset"/>
+  <validator id="GeomValidators_ZeroOffset" parameters="CreationMethod,BySizes,sketch_selection,to_size,from_size,to_object,to_offset,from_object,from_offset"/>
 </source>
index c136499f550c598cae4be4702491e075709dad19..a5c74f6d01ca3c31260ca0a9e0f5c9d039715058 100644 (file)
@@ -65,5 +65,5 @@
       </box>
     </toolbox>
   </groupbox>
-  <validator id="GeomValidators_ZeroOffset" parameters="CreationMethod,BySizes,to_size,from_size,to_object,to_offset,from_object,from_offset"/>
+  <validator id="GeomValidators_ZeroOffset" parameters="CreationMethod,BySizes,sketch_selection,to_size,from_size,to_object,to_offset,from_object,from_offset"/>
 </source>
index 19527f98993284eb885e1d675fe46e628db0ce95..d64ceef234b493bd0e44db33662aec2d1c3610ce 100644 (file)
@@ -93,5 +93,5 @@
       </groupbox>
     </box>
   </toolbox>
-  <validator id="GeomValidators_ZeroOffset" parameters="CreationMethod,ByAngles,to_angle,from_angle,to_object,to_offset,from_object,from_offset"/>
+  <validator id="GeomValidators_ZeroOffset" parameters="CreationMethod,ByAngles,base,to_angle,from_angle,to_object,to_offset,from_object,from_offset"/>
 </source>
\ No newline at end of file
index dac018aaadcfbd8e876e01d56504405d57403d46..c90327b4c7160807ce4770807e027798831ddc11 100644 (file)
@@ -88,5 +88,5 @@
     concealment="true">
     <validator id="GeomValidators_ShapeType" parameters="solid"/>
   </multi_selector>
-  <validator id="GeomValidators_ZeroOffset" parameters="CreationMethod,ByAngles,to_angle,from_angle,to_object,to_offset,from_object,from_offset"/>
+  <validator id="GeomValidators_ZeroOffset" parameters="CreationMethod,ByAngles,sketch_selection,to_angle,from_angle,to_object,to_offset,from_object,from_offset"/>
 </source>
index b590bbfd64396fe5e59e0d529b75c3d398683b24..79455e844807536638b6936750e344b9138a72a2 100644 (file)
@@ -88,5 +88,5 @@
     concealment="true">
     <validator id="GeomValidators_ShapeType" parameters="solid"/>
   </multi_selector>
-  <validator id="GeomValidators_ZeroOffset" parameters="CreationMethod,ByAngles,to_angle,from_angle,to_object,to_offset,from_object,from_offset"/>
+  <validator id="GeomValidators_ZeroOffset" parameters="CreationMethod,ByAngles,sketch_selection,to_angle,from_angle,to_object,to_offset,from_object,from_offset"/>
 </source>
index 460fd7a95a42b6444227cb8077555d098f706745..c72c0f22001ecaf8a411f76e987a3c4b3438ceb3 100644 (file)
@@ -81,5 +81,5 @@
       </box>
     </toolbox>
   </groupbox>
-  <validator id="GeomValidators_ZeroOffset" parameters="CreationMethod,ByAngles,to_angle,from_angle,to_object,to_offset,from_object,from_offset"/>
+  <validator id="GeomValidators_ZeroOffset" parameters="CreationMethod,ByAngles,sketch_selection,to_angle,from_angle,to_object,to_offset,from_object,from_offset"/>
 </source>
index 4947170e9358aaef1dbb5996fbe5439318b60ea0..dfb7e9bd773534d588c2a355cf7188eaf134c743 100644 (file)
@@ -45,3 +45,14 @@ void GeomAPI_Pln::coefficients(double& theA, double& theB, double& theC, double&
 {
   impl<gp_Pln>().Coefficients(theA, theB, theC, theD);
 }
+
+bool GeomAPI_Pln::isCoincident(const std::shared_ptr<GeomAPI_Pln> thePlane, const double theTolerance)
+{
+  if(!thePlane.get()) {
+    return false;
+  }
+
+  const gp_Pln& aMyPln = impl<gp_Pln>();
+  const gp_Pln& anOtherPln = thePlane->impl<gp_Pln>();
+  return (aMyPln.Contains(anOtherPln.Location(), theTolerance) && aMyPln.Axis().IsParallel(anOtherPln.Axis(), theTolerance));
+}
index 405cc7e98a20375671e1d7f172f839e5e59a11e4..e0564557e531a2fbf45d7c4c7599325b54f676b0 100644 (file)
@@ -46,6 +46,10 @@ class GeomAPI_Pln : public GeomAPI_Interface
   /// Returns the plane coefficients (Ax+By+Cz+D=0)
   GEOMAPI_EXPORT 
   void coefficients(double& theA, double& theB, double& theC, double& theD);
+
+  /// Returns true if planes are coincident.
+  GEOMAPI_EXPORT
+  bool isCoincident(const std::shared_ptr<GeomAPI_Pln> thePlane, const double theTolerance = 1.e-7);
 };
 
 #endif
index 9f0d5ede126e960a298332853fdb89c657d9495a..3d08e9fd95817006dd9de5983b8865e88ab65539 100644 (file)
@@ -6,18 +6,25 @@
 
 #include <GeomValidators_ZeroOffset.h>
 
-#include <GeomAPI_Shape.h>
 #include <ModelAPI_AttributeDouble.h>
 #include <ModelAPI_AttributeSelection.h>
+#include <ModelAPI_AttributeSelectionList.h>
 #include <ModelAPI_AttributeString.h>
+#include <ModelAPI_ResultConstruction.h>
+
+#include <GeomAPI_Dir.h>
+#include <GeomAPI_Face.h>
+#include <GeomAPI_Shape.h>
+#include <GeomAPI_Pln.h>
+#include <GeomAPI_Pnt.h>
 
 //=================================================================================================
 bool GeomValidators_ZeroOffset::isValid(const std::shared_ptr<ModelAPI_Feature>& theFeature,
                                         const std::list<std::string>& theArguments,
                                         std::string& theError) const
 {
-  if(theArguments.size() != 8) {
-    theError = "Wrong number of arguments (expected 8).";
+  if(theArguments.size() != 9) {
+    theError = "Wrong number of validator arguments in xml(expected 9).";
     return false;
   }
 
@@ -30,7 +37,45 @@ bool GeomValidators_ZeroOffset::isValid(const std::shared_ptr<ModelAPI_Feature>&
   anIt++;
   std::string aCreationMethod = *anIt;
   anIt++;
-  
+
+  ListOfShape aFacesList;
+  if(theFeature->selection(*anIt)) {
+    AttributeSelectionPtr aFaceSelection = theFeature->selection(*anIt);
+    ResultConstructionPtr aConstruction = std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aFaceSelection->context());
+    if(aConstruction.get()) {
+      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);
+      }
+    }
+  } else if(theFeature->selectionList(*anIt)) {
+    AttributeSelectionListPtr aFacesSelectionList = theFeature->selectionList(*anIt);
+    for(int anIndex = 0; anIndex < aFacesSelectionList->size(); anIndex++) {
+      AttributeSelectionPtr aFaceSel = aFacesSelectionList->value(anIndex);
+      std::shared_ptr<GeomAPI_Shape> aFaceShape = aFaceSel->value();
+      if(aFaceShape.get() && !aFaceShape->isNull()) { // Getting face.
+        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();
+        if(!aContextShape.get()) {
+          break;
+        }
+        ResultConstructionPtr aConstruction = std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aContext);
+        if(!aConstruction.get()) {
+          break;
+        }
+        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);
+        }
+      }
+    }
+  }
+  anIt++;
+
   double aToSize = 0.0;
   double aFromSize = 0.0;
 
@@ -84,9 +129,42 @@ bool GeomValidators_ZeroOffset::isValid(const std::shared_ptr<ModelAPI_Feature>&
     aFromSize = anAttrDouble->value();
   }
 
-  if(((!aFromShape && !aToShape) || ((aFromShape && aToShape) && aFromShape->isEqual(aToShape)))
-    && (aFromSize == -aToSize)) {
-    theError = "FromSize = -ToSize and bounding planes are equal.";
+  bool isPlanesCoincident = false;
+  if(!aFromShape.get() && !aToShape.get()) {
+    isPlanesCoincident = true;
+  } else if(aFromShape.get() && aToShape.get()) {
+    std::shared_ptr<GeomAPI_Face> aFromFace(new GeomAPI_Face(aFromShape));
+    std::shared_ptr<GeomAPI_Pln>  aFromPln = aFromFace->getPlane();
+
+    std::shared_ptr<GeomAPI_Face> aToFace(new GeomAPI_Face(aToShape));
+    std::shared_ptr<GeomAPI_Pln>  aToPln = aToFace->getPlane();
+
+    if(aFromPln.get()) {
+      isPlanesCoincident = aFromPln->isCoincident(aToPln);
+    }
+  } else {
+    std::shared_ptr<GeomAPI_Face> aFace;
+    if(aFromShape.get()) {
+      aFace.reset(new GeomAPI_Face(aFromShape));
+    } else {
+      aFace.reset(new GeomAPI_Face(aToShape));
+    }
+    std::shared_ptr<GeomAPI_Pln> aPln = aFace->getPlane();
+    if(aPln.get()) {
+      for(ListOfShape::const_iterator anIter = aFacesList.cbegin(); anIter != aFacesList.cend(); anIter++) {
+        std::shared_ptr<GeomAPI_Shape> aSketchShape = *anIter;
+        std::shared_ptr<GeomAPI_Face> aSketchFace(new GeomAPI_Face(aSketchShape));
+        std::shared_ptr<GeomAPI_Pln>  aSketchPln = aSketchFace->getPlane();
+        if(aPln->isCoincident(aSketchPln)) {
+          isPlanesCoincident = true;
+          break;
+        }
+      }
+    }
+  }
+
+  if(isPlanesCoincident && aFromSize == -aToSize) {
+    theError = "FromSize = -ToSize and bounding planes are coincident.";
     return false;
   }