]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issue #2561: CEA 2018-1 Cut
authordbv <dbv@opencascade.com>
Fri, 20 Jul 2018 17:15:58 +0000 (20:15 +0300)
committermpv <mikhail.ponikarov@opencascade.com>
Fri, 10 Aug 2018 07:37:22 +0000 (10:37 +0300)
Cut now allows to select any type of shape

32 files changed:
src/FeaturesPlugin/CMakeLists.txt
src/FeaturesPlugin/FeaturesPlugin_BooleanCut.cpp [new file with mode: 0644]
src/FeaturesPlugin/FeaturesPlugin_BooleanCut.h
src/FeaturesPlugin/FeaturesPlugin_Validators.cpp
src/FeaturesPlugin/Test/Test2240.py
src/FeaturesPlugin/Test/TestBooleanCut_CompSolidCompound_CompSolidCompound.py [new file with mode: 0644]
src/FeaturesPlugin/Test/TestBooleanCut_CompSolid_CompSolid.py [new file with mode: 0644]
src/FeaturesPlugin/Test/TestBooleanCut_EdgeCompound_EdgeCompound.py [new file with mode: 0644]
src/FeaturesPlugin/Test/TestBooleanCut_EdgeCompound_Solid.py [new file with mode: 0644]
src/FeaturesPlugin/Test/TestBooleanCut_Edge_Edge.py [new file with mode: 0644]
src/FeaturesPlugin/Test/TestBooleanCut_Edge_Face.py [new file with mode: 0644]
src/FeaturesPlugin/Test/TestBooleanCut_FaceCompound_FaceCompound.py [new file with mode: 0644]
src/FeaturesPlugin/Test/TestBooleanCut_Face_Face.py [new file with mode: 0644]
src/FeaturesPlugin/Test/TestBooleanCut_Face_Solid.py [new file with mode: 0644]
src/FeaturesPlugin/Test/TestBooleanCut_ShellCompound_ShellCompound.py [new file with mode: 0644]
src/FeaturesPlugin/Test/TestBooleanCut_Shell_Shell.py [new file with mode: 0644]
src/FeaturesPlugin/Test/TestBooleanCut_SolidCompound_SolidCompound.py [new file with mode: 0644]
src/FeaturesPlugin/Test/TestBooleanCut_Solid_Solid.py [new file with mode: 0644]
src/FeaturesPlugin/Test/TestBooleanCut_VertexCompound_Solid.py [new file with mode: 0644]
src/FeaturesPlugin/Test/TestBooleanCut_VertexCompound_VertexCompound.py [new file with mode: 0644]
src/FeaturesPlugin/Test/TestBooleanCut_Vertex_Vertex.py [new file with mode: 0644]
src/FeaturesPlugin/Test/TestBooleanCut_WireCompound_WireCompound.py [new file with mode: 0644]
src/FeaturesPlugin/Test/TestBooleanCut_Wire_Face.py [new file with mode: 0644]
src/FeaturesPlugin/Test/TestBooleanCut_Wire_Wire.py [new file with mode: 0644]
src/GeomAlgoAPI/GeomAlgoAPI_Boolean.cpp
src/GeomAlgoAPI/GeomAlgoAPI_Boolean.h
src/Model/Model_AttributeSelection.cpp
src/Model/Model_BodyBuilder.cpp
src/Model/Model_BodyBuilder.h
src/ModelAPI/Test/Test1512.py
src/ModelAPI/Test/Test2358_2.py
src/PythonAPI/model/tests/tests.py

index 9d466ae6797e21961aaa5c28ce75b13be4bf27b5..e111b5906c52df782dd35f5a6ad26fe9f3b3d7a3 100644 (file)
@@ -68,6 +68,7 @@ SET(PROJECT_SOURCES
     FeaturesPlugin_Rotation.cpp
     FeaturesPlugin_Translation.cpp
     FeaturesPlugin_Boolean.cpp
+    FeaturesPlugin_BooleanCut.cpp
     FeaturesPlugin_Intersection.cpp
     FeaturesPlugin_Partition.cpp
     FeaturesPlugin_Pipe.cpp
@@ -272,4 +273,23 @@ ADD_UNIT_TESTS(TestExtrusion.py
                Test2495.py
                Test2514.py
                Test2520.py
+               TestBooleanCut_CompSolid_CompSolid.py
+               TestBooleanCut_CompSolidCompound_CompSolidCompound.py
+               TestBooleanCut_Edge_Edge.py
+               TestBooleanCut_Edge_Face.py
+               TestBooleanCut_EdgeCompound_EdgeCompound.py
+               TestBooleanCut_EdgeCompound_Solid.py
+               TestBooleanCut_Face_Face.py
+               TestBooleanCut_Face_Solid.py
+               TestBooleanCut_FaceCompound_FaceCompound.py
+               TestBooleanCut_Shell_Shell.py
+               TestBooleanCut_ShellCompound_ShellCompound.py
+               TestBooleanCut_Solid_Solid.py
+               TestBooleanCut_SolidCompound_SolidCompound.py
+               TestBooleanCut_Vertex_Vertex.py
+               TestBooleanCut_VertexCompound_Solid.py
+               TestBooleanCut_VertexCompound_VertexCompound.py
+               TestBooleanCut_Wire_Face.py
+               TestBooleanCut_Wire_Wire.py
+               TestBooleanCut_WireCompound_WireCompound.py
 )
diff --git a/src/FeaturesPlugin/FeaturesPlugin_BooleanCut.cpp b/src/FeaturesPlugin/FeaturesPlugin_BooleanCut.cpp
new file mode 100644 (file)
index 0000000..eebff36
--- /dev/null
@@ -0,0 +1,393 @@
+// Copyright (C) 2014-2017  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<mailto:webmaster.salome@opencascade.com>
+//
+
+#include "FeaturesPlugin_BooleanCut.h"
+
+#include <ModelAPI_ResultCompSolid.h>
+#include <ModelAPI_AttributeSelectionList.h>
+#include <ModelAPI_Tools.h>
+
+#include <GeomAlgoAPI_Boolean.h>
+#include <GeomAlgoAPI_CompoundBuilder.h>
+#include <GeomAlgoAPI_MakeShapeList.h>
+#include <GeomAlgoAPI_PaveFiller.h>
+#include <GeomAlgoAPI_ShapeTools.h>
+#include <GeomAPI_ShapeExplorer.h>
+#include <GeomAPI_ShapeIterator.h>
+
+//==================================================================================================
+FeaturesPlugin_BooleanCut::FeaturesPlugin_BooleanCut()
+: FeaturesPlugin_Boolean(FeaturesPlugin_Boolean::BOOL_CUT)
+{
+}
+
+//==================================================================================================
+void FeaturesPlugin_BooleanCut::execute()
+{
+  ListOfShape anObjects, aTools;
+  std::map<std::shared_ptr<GeomAPI_Shape>, ListOfShape> aCompSolidsObjects;
+  std::map<std::shared_ptr<GeomAPI_Shape>, ListOfShape> aCompoundObjects;
+
+  // Getting objects.
+  AttributeSelectionListPtr anObjectsSelList = selectionList(OBJECT_LIST_ID());
+  for(int anObjectsIndex = 0; anObjectsIndex < anObjectsSelList->size(); anObjectsIndex++) {
+    AttributeSelectionPtr anObjectAttr = anObjectsSelList->value(anObjectsIndex);
+    std::shared_ptr<GeomAPI_Shape> anObject = anObjectAttr->value();
+    if(!anObject.get()) {
+      return;
+    }
+    ResultPtr aContext = anObjectAttr->context();
+    ResultCompSolidPtr aResCompSolidPtr = ModelAPI_Tools::compSolidOwner(aContext);
+    if (aResCompSolidPtr.get())
+    {
+      std::shared_ptr<GeomAPI_Shape> aContextShape = aResCompSolidPtr->shape();
+      GeomAPI_Shape::ShapeType aShapeType = aResCompSolidPtr->shape()->shapeType();
+      std::map<std::shared_ptr<GeomAPI_Shape>, ListOfShape>& aMap =
+        aShapeType == GeomAPI_Shape::COMPSOLID ? aCompSolidsObjects : aCompoundObjects;
+
+        std::map<std::shared_ptr<GeomAPI_Shape>, ListOfShape>::iterator
+          anIt = aMap.begin();
+        for (; anIt != aMap.end(); anIt++) {
+          if (anIt->first->isEqual(aContextShape)) {
+            aMap[anIt->first].push_back(anObject);
+            break;
+          }
+        }
+        if (anIt == aMap.end()) {
+          aMap[aContextShape].push_back(anObject);
+        }
+
+    } else {
+      anObjects.push_back(anObject);
+    }
+  }
+
+  // Getting tools.
+  AttributeSelectionListPtr aToolsSelList = selectionList(TOOL_LIST_ID());
+  for(int aToolsIndex = 0; aToolsIndex < aToolsSelList->size(); aToolsIndex++) {
+    AttributeSelectionPtr aToolAttr = aToolsSelList->value(aToolsIndex);
+    GeomShapePtr aTool = aToolAttr->value();
+    if(!aTool.get()) {
+      return;
+    }
+    aTools.push_back(aTool);
+  }
+
+  int aResultIndex = 0;
+
+  if((anObjects.empty() && aCompSolidsObjects.empty() && aCompoundObjects.empty())
+     || aTools.empty()) {
+    std::string aFeatureError = "Error: Not enough objects for boolean operation.";
+    setError(aFeatureError);
+    return;
+  }
+
+  // For solids cut each object with all tools.
+  for(ListOfShape::iterator anObjectsIt = anObjects.begin();
+      anObjectsIt != anObjects.end();
+      ++anObjectsIt) {
+    std::shared_ptr<GeomAPI_Shape> anObject = *anObjectsIt;
+    GeomAlgoAPI_MakeShapeList aMakeShapeList;
+    std::shared_ptr<GeomAlgoAPI_Boolean> aCutAlgo(
+      new GeomAlgoAPI_Boolean(anObject,
+                              aTools,
+                              GeomAlgoAPI_Boolean::BOOL_CUT));
+    GeomShapePtr aResShape = aCutAlgo->shape();
+
+    // Checking that the algorithm worked properly.
+    if (!aCutAlgo->isDone()) {
+      static const std::string aFeatureError = "Error: Boolean algorithm failed.";
+      setError(aFeatureError);
+      return;
+    }
+    if(aResShape->isNull()) {
+      static const std::string aShapeError = "Error: Resulting shape is Null.";
+      setError(aShapeError);
+      return;
+    }
+    if (!aCutAlgo->isValid()) {
+      std::string aFeatureError = "Error: Resulting shape is not valid.";
+      setError(aFeatureError);
+      return;
+    }
+
+    aMakeShapeList.appendAlgo(aCutAlgo);
+
+    GeomAPI_ShapeIterator aShapeIt(aResShape);
+    if (aShapeIt.more() || aResShape->shapeType() == GeomAPI_Shape::VERTEX)
+    {
+      std::shared_ptr<ModelAPI_ResultBody> aResultBody =
+        document()->createBody(data(), aResultIndex);
+
+      loadNamingDS(aResultBody, anObject, aTools, aResShape,
+                   aMakeShapeList, *(aCutAlgo->mapOfSubShapes()),
+                   false);
+      setResult(aResultBody, aResultIndex);
+      aResultIndex++;
+    }
+  }
+
+  // Compsolids handling
+  for (std::map<std::shared_ptr<GeomAPI_Shape>, ListOfShape>::iterator
+       anIt = aCompSolidsObjects.begin();
+       anIt != aCompSolidsObjects.end();
+       ++anIt)
+  {
+    std::shared_ptr<GeomAPI_Shape> aCompSolid = anIt->first;
+    ListOfShape& aUsedInOperationSolids = anIt->second;
+
+    // Collecting solids from compsolids which will not be modified in boolean operation.
+    ListOfShape aNotUsedSolids;
+    for(GeomAPI_ShapeExplorer anExp(aCompSolid, GeomAPI_Shape::SOLID);
+        anExp.more();
+        anExp.next())
+    {
+      std::shared_ptr<GeomAPI_Shape> aSolidInCompSolid = anExp.current();
+      ListOfShape::iterator aUsedIt = aUsedInOperationSolids.begin();
+      for (; aUsedIt != aUsedInOperationSolids.end(); aUsedIt++) {
+        if (aSolidInCompSolid->isEqual(*aUsedIt)) {
+          break;
+        }
+      }
+      if (aUsedIt == aUsedInOperationSolids.end()) {
+        aNotUsedSolids.push_back(aSolidInCompSolid);
+      }
+    }
+
+    GeomAlgoAPI_MakeShapeList aMakeShapeList;
+    std::shared_ptr<GeomAlgoAPI_Boolean> aCutAlgo(
+      new GeomAlgoAPI_Boolean(aUsedInOperationSolids,
+                              aTools,
+                              GeomAlgoAPI_Boolean::BOOL_CUT));
+
+    // Checking that the algorithm worked properly.
+    if (!aCutAlgo->isDone()) {
+      static const std::string aFeatureError = "Error: Boolean algorithm failed.";
+      setError(aFeatureError);
+      return;
+    }
+    if (aCutAlgo->shape()->isNull()) {
+      static const std::string aShapeError = "Error: Resulting shape is Null.";
+      setError(aShapeError);
+      return;
+    }
+    if (!aCutAlgo->isValid()) {
+      std::string aFeatureError = "Error: Resulting shape is not valid.";
+      setError(aFeatureError);
+      return;
+    }
+
+    aMakeShapeList.appendAlgo(aCutAlgo);
+    GeomAPI_DataMapOfShapeShape aMapOfShapes;
+    aMapOfShapes.merge(aCutAlgo->mapOfSubShapes());
+    GeomShapePtr aResultShape = aCutAlgo->shape();
+
+    // Add result to not used solids from compsolid.
+    if(!aNotUsedSolids.empty()) {
+      ListOfShape aShapesToAdd = aNotUsedSolids;
+      aShapesToAdd.push_back(aCutAlgo->shape());
+      std::shared_ptr<GeomAlgoAPI_PaveFiller> aFillerAlgo(
+        new GeomAlgoAPI_PaveFiller(aShapesToAdd, true));
+      if(!aFillerAlgo->isDone()) {
+        std::string aFeatureError = "Error: PaveFiller algorithm failed.";
+        setError(aFeatureError);
+        return;
+      }
+
+      aMakeShapeList.appendAlgo(aFillerAlgo);
+      aMapOfShapes.merge(aFillerAlgo->mapOfSubShapes());
+      aResultShape = aFillerAlgo->shape();
+    }
+
+    GeomAPI_ShapeIterator aShapeIt(aResultShape);
+    if (aShapeIt.more() || aResultShape->shapeType() == GeomAPI_Shape::VERTEX)
+    {
+      std::shared_ptr<ModelAPI_ResultBody> aResultBody =
+        document()->createBody(data(), aResultIndex);
+
+      loadNamingDS(aResultBody,
+                   aCompSolid,
+                   aTools,
+                   aResultShape,
+                   aMakeShapeList,
+                   aMapOfShapes,
+                   false);
+      setResult(aResultBody, aResultIndex);
+      aResultIndex++;
+    }
+  }
+
+  // Compounds handling
+  for (std::map<std::shared_ptr<GeomAPI_Shape>, ListOfShape>::iterator
+       anIt = aCompoundObjects.begin();
+       anIt != aCompoundObjects.end();
+       ++anIt)
+  {
+    std::shared_ptr<GeomAPI_Shape> aCompound = anIt->first;
+    ListOfShape& aUsedInOperationShapes = anIt->second;
+
+    // Collecting shapes from compound which will not be modified in boolean operation.
+    ListOfShape aNotUsedShapes;
+    for (GeomAPI_ShapeIterator aCompIt(aCompound);
+         aCompIt.more();
+         aCompIt.next())
+    {
+      std::shared_ptr<GeomAPI_Shape> aShapeInCompound = aCompIt.current();
+      ListOfShape::iterator aUsedIt = aUsedInOperationShapes.begin();
+      for (; aUsedIt != aUsedInOperationShapes.end(); aUsedIt++) {
+        if (aShapeInCompound->isEqual(*aUsedIt)) {
+          break;
+        }
+      }
+      if (aUsedIt == aUsedInOperationShapes.end()) {
+        aNotUsedShapes.push_back(aShapeInCompound);
+      }
+    }
+
+    GeomAlgoAPI_MakeShapeList aMakeShapeList;
+    std::shared_ptr<GeomAlgoAPI_Boolean> aCutAlgo(
+      new GeomAlgoAPI_Boolean(aUsedInOperationShapes,
+                              aTools,
+                              GeomAlgoAPI_Boolean::BOOL_CUT));
+
+    // Checking that the algorithm worked properly.
+    if (!aCutAlgo->isDone()) {
+      static const std::string aFeatureError = "Error: Boolean algorithm failed.";
+      setError(aFeatureError);
+      return;
+    }
+    if (aCutAlgo->shape()->isNull()) {
+      static const std::string aShapeError = "Error: Resulting shape is Null.";
+      setError(aShapeError);
+      return;
+    }
+    if (!aCutAlgo->isValid()) {
+      std::string aFeatureError = "Error: Resulting shape is not valid.";
+      setError(aFeatureError);
+      return;
+    }
+
+    aMakeShapeList.appendAlgo(aCutAlgo);
+    GeomAPI_DataMapOfShapeShape aMapOfShapes;
+    aMapOfShapes.merge(aCutAlgo->mapOfSubShapes());
+    GeomShapePtr aResultShape = aCutAlgo->shape();
+
+    // Add result to not used shape from compound.
+    if (!aNotUsedShapes.empty()) {
+      ListOfShape aShapesForResult = aNotUsedShapes;
+      if (aResultShape->shapeType() == GeomAPI_Shape::COMPOUND) {
+        for (GeomAPI_ShapeIterator aResultIt(aResultShape); aResultIt.more(); aResultIt.next()) {
+          aShapesForResult.push_back(aResultIt.current());
+        }
+      } else {
+        aShapesForResult.push_back(aResultShape);
+      }
+
+      if (aShapesForResult.size() == 1) {
+        aResultShape = aShapesForResult.front();
+      } else {
+        aResultShape = GeomAlgoAPI_CompoundBuilder::compound(aShapesForResult);
+      }
+    }
+
+    GeomAPI_ShapeIterator aShapeIt(aResultShape);
+    if (aShapeIt.more() || aResultShape->shapeType() == GeomAPI_Shape::VERTEX) {
+      std::shared_ptr<ModelAPI_ResultBody> aResultBody =
+        document()->createBody(data(), aResultIndex);
+
+      loadNamingDS(aResultBody,
+                   aCompound,
+                   aTools,
+                   aResultShape,
+                   aMakeShapeList,
+                   aMapOfShapes,
+                   false);
+      setResult(aResultBody, aResultIndex);
+      aResultIndex++;
+    }
+  }
+
+  // remove the rest results if there were produced in the previous pass
+  removeResults(aResultIndex);
+}
+
+//==================================================================================================
+void FeaturesPlugin_BooleanCut::loadNamingDS(ResultBodyPtr theResultBody,
+                                             const GeomShapePtr theBaseShape,
+                                             const ListOfShape& theTools,
+                                             const GeomShapePtr theResultShape,
+                                             GeomAlgoAPI_MakeShape& theMakeShape,
+                                             GeomAPI_DataMapOfShapeShape& theMapOfShapes,
+                                             const bool theIsStoreAsGenerated)
+{
+  //load result
+  if(theBaseShape->isEqual(theResultShape)) {
+    theResultBody->store(theResultShape, false);
+  } else {
+    const int aModifyVTag = 1;
+    const int aModifyETag = 2;
+    const int aModifyFTag = 3;
+    const int aDeletedTag = 4;
+    /// sub solids will be placed at labels 5, 6, etc. if result is compound of solids
+    const int aSubsolidsTag = 5;
+
+    theResultBody->storeModified(theBaseShape, theResultShape, aSubsolidsTag);
+
+    const std::string aModVName = "Modified_Vertex";
+    const std::string aModEName = "Modified_Edge";
+    const std::string aModFName = "Modified_Face";
+
+    theResultBody->loadAndOrientModifiedShapes(&theMakeShape, theBaseShape, GeomAPI_Shape::VERTEX,
+                                               aModifyVTag, aModVName, theMapOfShapes, false,
+                                               theIsStoreAsGenerated, true);
+    theResultBody->loadAndOrientModifiedShapes(&theMakeShape, theBaseShape, GeomAPI_Shape::EDGE,
+                                               aModifyETag, aModEName, theMapOfShapes, false,
+                                               theIsStoreAsGenerated, true);
+    theResultBody->loadAndOrientModifiedShapes(&theMakeShape, theBaseShape, GeomAPI_Shape::FACE,
+                                               aModifyFTag, aModFName, theMapOfShapes, false,
+                                               theIsStoreAsGenerated, true);
+
+    theResultBody->loadDeletedShapes(&theMakeShape, theBaseShape,
+                                     GeomAPI_Shape::VERTEX, aDeletedTag);
+    theResultBody->loadDeletedShapes(&theMakeShape, theBaseShape,
+                                     GeomAPI_Shape::EDGE, aDeletedTag);
+    theResultBody->loadDeletedShapes(&theMakeShape, theBaseShape,
+                                     GeomAPI_Shape::FACE, aDeletedTag);
+
+    for (ListOfShape::const_iterator anIter = theTools.begin(); anIter != theTools.end(); anIter++)
+    {
+      theResultBody->loadAndOrientModifiedShapes(&theMakeShape, *anIter, GeomAPI_Shape::VERTEX,
+                                                 aModifyVTag, aModVName, theMapOfShapes, false,
+                                                 theIsStoreAsGenerated, true);
+
+      theResultBody->loadAndOrientModifiedShapes(&theMakeShape, *anIter, GeomAPI_Shape::EDGE,
+                                                 aModifyETag, aModEName, theMapOfShapes, false,
+                                                 theIsStoreAsGenerated, true);
+
+      theResultBody->loadAndOrientModifiedShapes(&theMakeShape, *anIter, GeomAPI_Shape::FACE,
+                                                 aModifyFTag, aModFName, theMapOfShapes, false,
+                                                 theIsStoreAsGenerated, true);
+
+      theResultBody->loadDeletedShapes(&theMakeShape, *anIter, GeomAPI_Shape::VERTEX, aDeletedTag);
+      theResultBody->loadDeletedShapes(&theMakeShape, *anIter, GeomAPI_Shape::EDGE, aDeletedTag);
+      theResultBody->loadDeletedShapes(&theMakeShape, *anIter, GeomAPI_Shape::FACE, aDeletedTag);
+    }
+  }
+}
index f53afa973e2e704186402a3a26f633e87601d749..4ae4463eb0609e124e97abfaf71877de09f3bd25 100644 (file)
 
 #include "FeaturesPlugin_Boolean.h"
 
+#include <ModelAPI_Feature.h>
+#include <ModelAPI_ResultBody.h>
+
 /// \class FeaturesPlugin_BooleanCut
 /// \ingroup Plugins
 /// \brief Feature for applying of Boolean Cut operation.
-class FeaturesPlugin_BooleanCut : public FeaturesPlugin_Boolean
+class FeaturesPlugin_BooleanCut: public FeaturesPlugin_Boolean
 {
 public:
 
@@ -44,10 +47,24 @@ public:
     return MY_KIND;
   }
 
+  /// Creates a new part document if needed.
+  FEATURESPLUGIN_EXPORT virtual void execute();
+
 public:
 
-    /// Use plugin manager for features creation.
-  FeaturesPlugin_BooleanCut(): FeaturesPlugin_Boolean(BOOL_CUT) {};
+  /// Use plugin manager for features creation.
+  FeaturesPlugin_BooleanCut();
+
+private:
+
+  /// Load Naming data structure of the feature to the document
+  void loadNamingDS(ResultBodyPtr theResultBody,
+                    const GeomShapePtr theBaseShape,
+                    const ListOfShape& theTools,
+                    const GeomShapePtr theResultShape,
+                    GeomAlgoAPI_MakeShape& theMakeShape,
+                    GeomAPI_DataMapOfShapeShape& theMapOfShapes,
+                    const bool theIsStoreAsGenerated = false);
 
 };
 
index 4c558d9259be52b2727919250f0f9fbae051bcae..c62648649936a3bb113ea9e73fa10352b3d6099b 100644 (file)
@@ -617,7 +617,9 @@ bool FeaturesPlugin_ValidatorBooleanSelection::isValid(const AttributePtr& theAt
       anAllowedTypes.insert(GeomAPI_Shape::SOLID);
       anAllowedTypes.insert(GeomAPI_Shape::COMPSOLID);
       anAllowedTypes.insert(GeomAPI_Shape::COMPOUND);
-    } else if (anOperationType == FeaturesPlugin_Boolean::BOOL_FILL) {
+    } else if (anOperationType == FeaturesPlugin_Boolean::BOOL_FILL
+               || anOperationType == FeaturesPlugin_Boolean::BOOL_CUT)
+    {
       anAllowedTypes.insert(GeomAPI_Shape::VERTEX);
       anAllowedTypes.insert(GeomAPI_Shape::EDGE);
       anAllowedTypes.insert(GeomAPI_Shape::WIRE);
index 48ce24cd719bbd0c10cd01a1535dbe32f4322f2a..dd709a1bc32703df044ecfce68fc61b82a5d7efc 100644 (file)
@@ -106,7 +106,7 @@ Group_2.result().setName("acier")
 Group_2.result().setColor(170, 85, 0)
 Sketch_3 = model.addSketch(Part_1_doc, model.selection("FACE", "PartSet/XOY"))
 SketchLine_11 = Sketch_3.addLine(40, 0, 30, 0)
-SketchPoint_1 = Sketch_3.addPoint(model.selection("VERTEX", "Partition_1_1_1/Modified_Edge_15_15&Partition_1_1_1/Modified_Edge_15_16"))
+SketchPoint_1 = Sketch_3.addPoint(model.selection("VERTEX", "Partition_1_1_1/Modified_Edge_14_15&Partition_1_1_1/Modified_Edge_14_16"))
 SketchConstraintCoincidence_19 = Sketch_3.setCoincident(SketchLine_11.endPoint(), SketchPoint_1.result())
 SketchLine_12 = Sketch_3.addLine(30, 0, 30, 10)
 SketchLine_13 = Sketch_3.addLine(30, 10, 40, 10)
diff --git a/src/FeaturesPlugin/Test/TestBooleanCut_CompSolidCompound_CompSolidCompound.py b/src/FeaturesPlugin/Test/TestBooleanCut_CompSolidCompound_CompSolidCompound.py
new file mode 100644 (file)
index 0000000..637dbfb
--- /dev/null
@@ -0,0 +1,77 @@
+## Copyright (C) 2014-2017  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<mailto:webmaster.salome@opencascade.com>
+##
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchCircle_1 = Sketch_1.addCircle(-65.75962883650391, 1.812165175943577, 20.84344758927215)
+SketchCircle_1.result().setColor(225, 0, 0)
+SketchCircle_1.results()[1].setColor(225, 0, 0)
+SketchLine_1 = Sketch_1.addLine(-64.98081644495703, 22.64105757725738, -64.58019600110421, -18.99788637597517)
+SketchLine_1.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchLine_1.startPoint(), SketchCircle_1.results()[1])
+SketchConstraintCoincidence_2 = Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchCircle_1.results()[1])
+SketchCircle_2 = Sketch_1.addCircle(62.53870966583226, 1.604010602289747, 23.75523331537361)
+SketchCircle_2.result().setColor(225, 0, 0)
+SketchCircle_2.results()[1].setColor(225, 0, 0)
+SketchLine_2 = Sketch_1.addLine(63.75890236666707, 25.3278854890081, 63.76050419996562, -22.11978184293701)
+SketchLine_2.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_3 = Sketch_1.setCoincident(SketchLine_2.startPoint(), SketchCircle_2.results()[1])
+SketchConstraintCoincidence_4 = Sketch_1.setCoincident(SketchLine_2.endPoint(), SketchCircle_2.results()[1])
+model.do()
+Sketch_2 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchCircle_3 = Sketch_2.addCircle(-32.47294132465983, 2.220594155120791, 24.592292084386)
+SketchCircle_3.result().setColor(225, 0, 0)
+SketchCircle_3.results()[1].setColor(225, 0, 0)
+SketchLine_3 = Sketch_2.addLine(-57.05151402373072, 3.041930894979393, -7.893787575150295, 1.41683366733466)
+SketchLine_3.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_5 = Sketch_2.setCoincident(SketchLine_3.startPoint(), SketchCircle_3.results()[1])
+SketchConstraintCoincidence_6 = Sketch_2.setCoincident(SketchLine_3.endPoint(), SketchCircle_3.results()[1])
+SketchCircle_4 = Sketch_2.addCircle(107.0005131452338, 2.231606536656211, 32.56614591098422)
+SketchCircle_4.result().setColor(225, 0, 0)
+SketchCircle_4.results()[1].setColor(225, 0, 0)
+SketchLine_4 = Sketch_2.addLine(74.45658844157124, 3.434446666454839, 139.5031967571015, 0.1995097076777023)
+SketchLine_4.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_7 = Sketch_2.setCoincident(SketchLine_4.startPoint(), SketchCircle_4.results()[1])
+SketchConstraintCoincidence_8 = Sketch_2.setCoincident(SketchLine_4.endPoint(), SketchCircle_4.results()[1])
+model.do()
+Extrusion_1 = model.addExtrusion(Part_1_doc, [model.selection("COMPOUND", "Sketch_1")], model.selection(), 10, 0)
+Extrusion_2 = model.addExtrusion(Part_1_doc, [model.selection("COMPOUND", "Sketch_2")], model.selection(), 20, 20)
+Compound_1 = model.addCompound(Part_1_doc, [model.selection("COMPSOLID", "Extrusion_1_1"), model.selection("COMPSOLID", "Extrusion_1_2")])
+Compound_2 = model.addCompound(Part_1_doc, [model.selection("COMPSOLID", "Extrusion_2_1"), model.selection("COMPSOLID", "Extrusion_2_2")])
+Cut_1 = model.addCut(Part_1_doc, [model.selection("COMPOUND", "Compound_1_1")], [model.selection("COMPOUND", "Compound_2_1")])
+model.testHaveNamingSubshapes(Cut_1, model, Part_1_doc)
+model.do()
+model.end()
+
+from GeomAPI import  GeomAPI_Shape
+
+model.testNbResults(Cut_1, 1)
+model.testNbSubResults(Cut_1, [2])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.SOLID, [4])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.FACE, [22])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.EDGE, [84])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.VERTEX, [168])
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/Test/TestBooleanCut_CompSolid_CompSolid.py b/src/FeaturesPlugin/Test/TestBooleanCut_CompSolid_CompSolid.py
new file mode 100644 (file)
index 0000000..ba402df
--- /dev/null
@@ -0,0 +1,61 @@
+## Copyright (C) 2014-2017  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<mailto:webmaster.salome@opencascade.com>
+##
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchCircle_1 = Sketch_1.addCircle(-23.21770404974615, 0.697956782029321, 35.59095357943583)
+SketchCircle_1.result().setColor(225, 0, 0)
+SketchCircle_1.results()[1].setColor(225, 0, 0)
+SketchLine_1 = Sketch_1.addLine(-23.86759161364122, 36.28297642299413, -22.5735889911581, -34.88716781357743)
+SketchLine_1.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchLine_1.startPoint(), SketchCircle_1.results()[1])
+SketchConstraintCoincidence_2 = Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchCircle_1.results()[1])
+model.do()
+Sketch_2 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchCircle_2 = Sketch_2.addCircle(32.08143103297851, 1.286314091165838, 40.2404383217231)
+SketchCircle_2.result().setColor(225, 0, 0)
+SketchCircle_2.results()[1].setColor(225, 0, 0)
+SketchLine_2 = Sketch_2.addLine(-8.153954725266397, 0.6486549270159857, 72.23884334545456, 3.869938036363647)
+SketchLine_2.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_3 = Sketch_2.setCoincident(SketchLine_2.startPoint(), SketchCircle_2.results()[1])
+SketchConstraintCoincidence_4 = Sketch_2.setCoincident(SketchLine_2.endPoint(), SketchCircle_2.results()[1])
+model.do()
+Extrusion_1 = model.addExtrusion(Part_1_doc, [model.selection("COMPOUND", "Sketch_1")], model.selection(), 10, 0)
+Extrusion_2 = model.addExtrusion(Part_1_doc, [model.selection("COMPOUND", "Sketch_2")], model.selection(), 20, 20)
+Cut_1 = model.addCut(Part_1_doc, [model.selection("COMPSOLID", "Extrusion_1_1")], [model.selection("COMPSOLID", "Extrusion_2_1")])
+model.testHaveNamingSubshapes(Cut_1, model, Part_1_doc)
+model.do()
+model.end()
+
+from GeomAPI import  GeomAPI_Shape
+
+model.testNbResults(Cut_1, 1)
+model.testNbSubResults(Cut_1, [2])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.SOLID, [2])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.FACE, [11])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.EDGE, [42])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.VERTEX, [84])
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/Test/TestBooleanCut_EdgeCompound_EdgeCompound.py b/src/FeaturesPlugin/Test/TestBooleanCut_EdgeCompound_EdgeCompound.py
new file mode 100644 (file)
index 0000000..32d12c8
--- /dev/null
@@ -0,0 +1,53 @@
+## Copyright (C) 2014-2017  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<mailto:webmaster.salome@opencascade.com>
+##
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_1 = Sketch_1.addLine(-13.70458696967078, 45.46669742770666, 15.88340489230536, 45.46669742770666)
+SketchLine_1.result().setColor(225, 0, 0)
+SketchLine_2 = Sketch_1.addLine(-13.21145377197118, 31.16583469441819, 14.89713849690615, 31.41240129326799)
+SketchLine_2.result().setColor(225, 0, 0)
+SketchLine_3 = Sketch_1.addLine(-5.074756009927738, 49.65832960815328, -4.828189411077946, 26.48106931627197)
+SketchLine_3.result().setColor(225, 0, 0)
+SketchLine_4 = Sketch_1.addLine(7.993273729111718, 49.41176300930348, 8.23984032796152, 26.48106931627197)
+SketchLine_4.result().setColor(225, 0, 0)
+model.do()
+Compound_1 = model.addCompound(Part_1_doc, [model.selection("EDGE", "Sketch_1/Edge-SketchLine_1"), model.selection("EDGE", "Sketch_1/Edge-SketchLine_2")])
+Compound_2 = model.addCompound(Part_1_doc, [model.selection("EDGE", "Sketch_1/Edge-SketchLine_3"), model.selection("EDGE", "Sketch_1/Edge-SketchLine_4")])
+Cut_1 = model.addCut(Part_1_doc, [model.selection("COMPOUND", "Compound_1_1")], [model.selection("COMPOUND", "Compound_2_1")])
+model.testHaveNamingSubshapes(Cut_1, model, Part_1_doc)
+model.do()
+model.end()
+
+from GeomAPI import  GeomAPI_Shape
+
+model.testNbResults(Cut_1, 1)
+model.testNbSubResults(Cut_1, [6])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.SOLID, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.FACE, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.EDGE, [6])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.VERTEX, [12])
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/Test/TestBooleanCut_EdgeCompound_Solid.py b/src/FeaturesPlugin/Test/TestBooleanCut_EdgeCompound_Solid.py
new file mode 100644 (file)
index 0000000..9376fce
--- /dev/null
@@ -0,0 +1,67 @@
+## Copyright (C) 2014-2017  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<mailto:webmaster.salome@opencascade.com>
+##
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_1 = Sketch_1.addLine(-28.62948623265935, 53.77363153293705, 40.23707952134417, 53.11775947813702)
+SketchLine_1.result().setColor(225, 0, 0)
+SketchLine_2 = Sketch_1.addLine(-26.66187006825925, 26.22700523133564, 40.89295157614425, 26.22700523133564)
+SketchLine_2.result().setColor(225, 0, 0)
+model.do()
+Compound_1 = model.addCompound(Part_1_doc, [model.selection("EDGE", "Sketch_1/Edge-SketchLine_1"), model.selection("EDGE", "Sketch_1/Edge-SketchLine_2")])
+Extrusion_1 = model.addExtrusion(Part_1_doc, [], model.selection(), 10, 10)
+Sketch_2 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_3 = Sketch_2.addLine(14.6580693841429, 60.98822413573743, -10.2650686982584, 60.98822413573743)
+SketchLine_3.result().setColor(225, 0, 0)
+SketchLine_4 = Sketch_2.addLine(-10.2650686982584, 60.98822413573743, -10.2650686982584, 18.35654057373522)
+SketchLine_4.result().setColor(225, 0, 0)
+SketchLine_5 = Sketch_2.addLine(-10.2650686982584, 18.35654057373522, 14.6580693841429, 18.35654057373522)
+SketchLine_5.result().setColor(225, 0, 0)
+SketchLine_6 = Sketch_2.addLine(14.6580693841429, 18.35654057373522, 14.6580693841429, 60.98822413573743)
+SketchLine_6.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_1 = Sketch_2.setCoincident(SketchLine_6.endPoint(), SketchLine_3.startPoint())
+SketchConstraintCoincidence_2 = Sketch_2.setCoincident(SketchLine_3.endPoint(), SketchLine_4.startPoint())
+SketchConstraintCoincidence_3 = Sketch_2.setCoincident(SketchLine_4.endPoint(), SketchLine_5.startPoint())
+SketchConstraintCoincidence_4 = Sketch_2.setCoincident(SketchLine_5.endPoint(), SketchLine_6.startPoint())
+SketchConstraintHorizontal_1 = Sketch_2.setHorizontal(SketchLine_3.result())
+SketchConstraintVertical_1 = Sketch_2.setVertical(SketchLine_4.result())
+SketchConstraintHorizontal_2 = Sketch_2.setHorizontal(SketchLine_5.result())
+SketchConstraintVertical_2 = Sketch_2.setVertical(SketchLine_6.result())
+Extrusion_1.setNestedSketch(Sketch_2)
+Cut_1 = model.addCut(Part_1_doc, [model.selection("COMPOUND", "Compound_1_1")], [model.selection("SOLID", "Extrusion_1_1")])
+model.testHaveNamingSubshapes(Cut_1, model, Part_1_doc)
+model.do()
+model.end()
+
+from GeomAPI import  GeomAPI_Shape
+
+model.testNbResults(Cut_1, 1)
+model.testNbSubResults(Cut_1, [4])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.SOLID, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.FACE, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.EDGE, [4])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.VERTEX, [8])
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/Test/TestBooleanCut_Edge_Edge.py b/src/FeaturesPlugin/Test/TestBooleanCut_Edge_Edge.py
new file mode 100644 (file)
index 0000000..45e8667
--- /dev/null
@@ -0,0 +1,48 @@
+## Copyright (C) 2014-2017  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<mailto:webmaster.salome@opencascade.com>
+##
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_1 = Sketch_1.addLine(-25.12006861063466, 20.61578044596912, 27.54545454545454, 58.72898799313897)
+SketchLine_1.result().setColor(225, 0, 0)
+SketchLine_2 = Sketch_1.addLine(-19.22984562607204, 56.30360205831907, 22.69468267581474, 22.00171526586621)
+SketchLine_2.result().setColor(225, 0, 0)
+model.do()
+Edge_1 = model.addEdge(Part_1_doc, [model.selection("EDGE", "Sketch_1/Edge-SketchLine_2"), model.selection("EDGE", "Sketch_1/Edge-SketchLine_1")])
+Cut_1 = model.addCut(Part_1_doc, [model.selection("EDGE", "Edge_1_1")], [model.selection("EDGE", "Edge_1_2")])
+model.testHaveNamingSubshapes(Cut_1, model, Part_1_doc)
+model.do()
+model.end()
+
+from GeomAPI import  GeomAPI_Shape
+
+model.testNbResults(Cut_1, 1)
+model.testNbSubResults(Cut_1, [2])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.SOLID, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.FACE, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.EDGE, [2])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.VERTEX, [4])
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/Test/TestBooleanCut_Edge_Face.py b/src/FeaturesPlugin/Test/TestBooleanCut_Edge_Face.py
new file mode 100644 (file)
index 0000000..4a22aa5
--- /dev/null
@@ -0,0 +1,65 @@
+## Copyright (C) 2014-2017  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<mailto:webmaster.salome@opencascade.com>
+##
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_1 = Sketch_1.addLine(-30.96793587174349, 41.08817635270543, 39.4689378757515, 41.4929859719439)
+SketchLine_1.result().setColor(225, 0, 0)
+model.do()
+Sketch_2 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_2 = Sketch_2.addLine(13.96593186372747, 52.01803607214429, -9.917835671342695, 52.01803607214429)
+SketchLine_2.result().setColor(225, 0, 0)
+SketchLine_3 = Sketch_2.addLine(-9.917835671342695, 52.01803607214429, -9.917835671342695, 27.32464929859719)
+SketchLine_3.result().setColor(225, 0, 0)
+SketchLine_4 = Sketch_2.addLine(-9.917835671342695, 27.32464929859719, 13.96593186372747, 27.32464929859719)
+SketchLine_4.result().setColor(225, 0, 0)
+SketchLine_5 = Sketch_2.addLine(13.96593186372747, 27.32464929859719, 13.96593186372747, 52.01803607214429)
+SketchLine_5.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_1 = Sketch_2.setCoincident(SketchLine_5.endPoint(), SketchLine_2.startPoint())
+SketchConstraintCoincidence_2 = Sketch_2.setCoincident(SketchLine_2.endPoint(), SketchLine_3.startPoint())
+SketchConstraintCoincidence_3 = Sketch_2.setCoincident(SketchLine_3.endPoint(), SketchLine_4.startPoint())
+SketchConstraintCoincidence_4 = Sketch_2.setCoincident(SketchLine_4.endPoint(), SketchLine_5.startPoint())
+SketchConstraintHorizontal_1 = Sketch_2.setHorizontal(SketchLine_2.result())
+SketchConstraintVertical_1 = Sketch_2.setVertical(SketchLine_3.result())
+SketchConstraintHorizontal_2 = Sketch_2.setHorizontal(SketchLine_4.result())
+SketchConstraintVertical_2 = Sketch_2.setVertical(SketchLine_5.result())
+model.do()
+Edge_1 = model.addEdge(Part_1_doc, [model.selection("EDGE", "Sketch_1/Edge-SketchLine_1")])
+Face_1 = model.addFace(Part_1_doc, [model.selection("WIRE", "Sketch_2/Wire-SketchLine_2f-SketchLine_3f-SketchLine_4f-SketchLine_5f")])
+Cut_1 = model.addCut(Part_1_doc, [model.selection("EDGE", "Edge_1_1")], [model.selection("FACE", "Face_1_1")])
+model.testHaveNamingSubshapes(Cut_1, model, Part_1_doc)
+model.do()
+model.end()
+
+from GeomAPI import  GeomAPI_Shape
+
+model.testNbResults(Cut_1, 1)
+model.testNbSubResults(Cut_1, [2])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.SOLID, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.FACE, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.EDGE, [2])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.VERTEX, [4])
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/Test/TestBooleanCut_FaceCompound_FaceCompound.py b/src/FeaturesPlugin/Test/TestBooleanCut_FaceCompound_FaceCompound.py
new file mode 100644 (file)
index 0000000..d1dfcbd
--- /dev/null
@@ -0,0 +1,61 @@
+## Copyright (C) 2014-2017  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<mailto:webmaster.salome@opencascade.com>
+##
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchCircle_1 = Sketch_1.addCircle(-49.71737993138937, 2.062011149228122, 25.20652382544127)
+SketchCircle_1.result().setColor(225, 0, 0)
+SketchCircle_1.results()[1].setColor(225, 0, 0)
+SketchCircle_2 = Sketch_1.addCircle(41.46933533447686, 0.6873370497427074, 27.03914027119833)
+SketchCircle_2.result().setColor(225, 0, 0)
+SketchCircle_2.results()[1].setColor(225, 0, 0)
+model.do()
+Sketch_2 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchCircle_3 = Sketch_2.addCircle(-15.35052744425385, 1.145561749571189, 23.35148318113706)
+SketchCircle_3.result().setColor(225, 0, 0)
+SketchCircle_3.results()[1].setColor(225, 0, 0)
+SketchCircle_4 = Sketch_2.addCircle(82.70955831903943, -3.436685248713552, 26.06650182177207)
+SketchCircle_4.result().setColor(225, 0, 0)
+SketchCircle_4.results()[1].setColor(225, 0, 0)
+model.do()
+Face_1 = model.addFace(Part_1_doc, [model.selection("EDGE", "Sketch_1/Edge-SketchCircle_1_2"), model.selection("EDGE", "Sketch_1/Edge-SketchCircle_2_2")])
+Face_2 = model.addFace(Part_1_doc, [model.selection("EDGE", "Sketch_2/Edge-SketchCircle_3_2"), model.selection("EDGE", "Sketch_2/Edge-SketchCircle_4_2")])
+Compound_1 = model.addCompound(Part_1_doc, [model.selection("FACE", "Face_1_1"), model.selection("FACE", "Face_1_2")])
+Compound_2 = model.addCompound(Part_1_doc, [model.selection("FACE", "Face_2_1"), model.selection("FACE", "Face_2_2")])
+Cut_1 = model.addCut(Part_1_doc, [model.selection("COMPOUND", "Compound_1_1")], [model.selection("COMPOUND", "Compound_2_1")])
+model.testHaveNamingSubshapes(Cut_1, model, Part_1_doc)
+model.do()
+model.end()
+
+from GeomAPI import  GeomAPI_Shape
+
+model.testNbResults(Cut_1, 1)
+model.testNbSubResults(Cut_1, [2])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.SOLID, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.FACE, [2])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.EDGE, [4])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.VERTEX, [8])
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/Test/TestBooleanCut_Face_Face.py b/src/FeaturesPlugin/Test/TestBooleanCut_Face_Face.py
new file mode 100644 (file)
index 0000000..7fd82e5
--- /dev/null
@@ -0,0 +1,57 @@
+## Copyright (C) 2014-2017  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<mailto:webmaster.salome@opencascade.com>
+##
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchCircle_1 = Sketch_1.addCircle(-6.063464837049752, 0.8662092624356818, 32.2304349637617)
+SketchCircle_1.result().setColor(225, 0, 0)
+SketchCircle_1.results()[1].setColor(225, 0, 0)
+model.do()
+Face_1 = model.addFace(Part_1_doc, [model.selection("EDGE", "Sketch_1/Edge-SketchCircle_1_2")])
+Sketch_2 = model.addSketch(Part_1_doc, model.standardPlane("XOY"))
+SketchProjection_1 = Sketch_2.addProjection(model.selection("VERTEX", "PartSet/Origin"), False)
+SketchPoint_1 = SketchProjection_1.createdFeature()
+SketchPoint_1.result().setColor(170, 0, 225)
+SketchCircle_2 = Sketch_2.addCircle(33.45888578231592, 3.635557519489646, 33.65582143213236)
+SketchCircle_2.result().setColor(225, 0, 0)
+SketchCircle_2.results()[1].setColor(225, 0, 0)
+SketchConstraintCoincidence_1 = Sketch_2.setCoincident(SketchPoint_1.result(), SketchCircle_2.results()[1])
+model.do()
+Face_2 = model.addFace(Part_1_doc, [model.selection("FACE", "Sketch_2/Face-SketchCircle_2_2f")])
+Cut_1 = model.addCut(Part_1_doc, [model.selection("FACE", "Face_1_1")], [model.selection("FACE", "Face_2_1")])
+model.testHaveNamingSubshapes(Cut_1, model, Part_1_doc)
+model.do()
+model.end()
+
+from GeomAPI import  GeomAPI_Shape
+
+model.testNbResults(Cut_1, 1)
+model.testNbSubResults(Cut_1, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.SOLID, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.FACE, [1])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.EDGE, [2])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.VERTEX, [4])
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/Test/TestBooleanCut_Face_Solid.py b/src/FeaturesPlugin/Test/TestBooleanCut_Face_Solid.py
new file mode 100644 (file)
index 0000000..319a592
--- /dev/null
@@ -0,0 +1,71 @@
+## Copyright (C) 2014-2017  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<mailto:webmaster.salome@opencascade.com>
+##
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchCircle_1 = Sketch_1.addCircle(-8.850181926352695, 1.062021831162306, 46.73432400996293)
+SketchCircle_1.result().setColor(225, 0, 0)
+SketchCircle_1.results()[1].setColor(225, 0, 0)
+model.do()
+Face_1 = model.addFace(Part_1_doc, [model.selection("EDGE", "Sketch_1/Edge-SketchCircle_1_2")])
+Sketch_2 = model.addSketch(Part_1_doc, model.standardPlane("XOY"))
+SketchLine_1 = Sketch_2.addLine(64.95207814695526, 55.29739830292169, -8.272875875352462, 55.29739830292169)
+SketchLine_1.result().setColor(225, 0, 0)
+SketchLine_2 = Sketch_2.addLine(-8.272875875352462, 55.29739830292169, -8.272875875352462, -5.036618941767999)
+SketchLine_2.result().setColor(225, 0, 0)
+SketchLine_3 = Sketch_2.addLine(-8.272875875352462, -5.036618941767999, 64.95207814695526, -5.036618941767999)
+SketchLine_3.result().setColor(225, 0, 0)
+SketchLine_4 = Sketch_2.addLine(64.95207814695526, -5.036618941767999, 64.95207814695526, 55.29739830292169)
+SketchLine_4.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_1 = Sketch_2.setCoincident(SketchLine_4.endPoint(), SketchLine_1.startPoint())
+SketchConstraintCoincidence_2 = Sketch_2.setCoincident(SketchLine_1.endPoint(), SketchLine_2.startPoint())
+SketchConstraintCoincidence_3 = Sketch_2.setCoincident(SketchLine_2.endPoint(), SketchLine_3.startPoint())
+SketchConstraintCoincidence_4 = Sketch_2.setCoincident(SketchLine_3.endPoint(), SketchLine_4.startPoint())
+SketchConstraintHorizontal_1 = Sketch_2.setHorizontal(SketchLine_1.result())
+SketchConstraintVertical_1 = Sketch_2.setVertical(SketchLine_2.result())
+SketchConstraintHorizontal_2 = Sketch_2.setHorizontal(SketchLine_3.result())
+SketchConstraintVertical_2 = Sketch_2.setVertical(SketchLine_4.result())
+model.do()
+Extrusion_1 = model.addExtrusion(Part_1_doc, [model.selection("FACE", "Sketch_2/Face-SketchLine_1f-SketchLine_2f-SketchLine_3f-SketchLine_4f")], model.selection(), 10, 10)
+Cut_1 = model.addCut(Part_1_doc, [model.selection("FACE", "Face_1_1")], [model.selection("SOLID", "Extrusion_1_1")])
+Group_1_objects = [model.selection("VERTEX", "Cut_1_1/Modified_Edge_divided_2_v_2_1"), model.selection("FACE", "Cut_1_1"), model.selection("FACE", "Cut_1_1"), model.selection("VERTEX", "Cut_1_1/Modified_Face_divided_4_v_3_1")]
+Group_1 = model.addGroup(Part_1_doc, Group_1_objects)
+Group_2_objects = [model.selection("FACE", "Cut_1_1"), model.selection("EDGE", "Cut_1_1/Modified_Face_divided_3_e_2_1"), model.selection("VERTEX", "Cut_1_1/Modified_Face_divided_4_v_3_1"), model.selection("FACE", "Cut_1_1")]
+Group_2 = model.addGroup(Part_1_doc, Group_2_objects)
+Group_3 = model.addGroup(Part_1_doc, [model.selection("FACE", "Cut_1_1")])
+model.testHaveNamingSubshapes(Cut_1, model, Part_1_doc)
+model.do()
+model.end()
+
+from GeomAPI import  GeomAPI_Shape
+
+model.testNbResults(Cut_1, 1)
+model.testNbSubResults(Cut_1, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.SOLID, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.FACE, [1])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.EDGE, [3])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.VERTEX, [6])
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/Test/TestBooleanCut_ShellCompound_ShellCompound.py b/src/FeaturesPlugin/Test/TestBooleanCut_ShellCompound_ShellCompound.py
new file mode 100644 (file)
index 0000000..0336987
--- /dev/null
@@ -0,0 +1,79 @@
+## Copyright (C) 2014-2017  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<mailto:webmaster.salome@opencascade.com>
+##
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchCircle_1 = Sketch_1.addCircle(-174.3348611545506, 14.32227876658794, 70.49121821473575)
+SketchCircle_1.result().setColor(225, 0, 0)
+SketchCircle_1.results()[1].setColor(225, 0, 0)
+SketchLine_1 = Sketch_1.addLine(-170.8787982705978, 84.72872358712971, -177.6798961073988, -56.0895283864863)
+SketchLine_1.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchLine_1.startPoint(), SketchCircle_1.results()[1])
+SketchConstraintCoincidence_2 = Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchCircle_1.results()[1])
+SketchCircle_2 = Sketch_1.addCircle(156.5938368884866, -3.269359348234124, 86.69415181338225)
+SketchCircle_2.result().setColor(225, 0, 0)
+SketchCircle_2.results()[1].setColor(225, 0, 0)
+SketchLine_2 = Sketch_1.addLine(159.264749945663, 83.38363934242156, 152.8285624017236, -89.88170642808817)
+SketchLine_2.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_3 = Sketch_1.setCoincident(SketchLine_2.startPoint(), SketchCircle_2.results()[1])
+SketchConstraintCoincidence_4 = Sketch_1.setCoincident(SketchLine_2.endPoint(), SketchCircle_2.results()[1])
+model.do()
+Sketch_2 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchCircle_3 = Sketch_2.addCircle(-63.56168377478743, 4.78844798363732, 75.55300890562218)
+SketchCircle_3.result().setColor(225, 0, 0)
+SketchCircle_3.results()[1].setColor(225, 0, 0)
+SketchCircle_4 = Sketch_2.addCircle(322.6564034385849, -22.92418256149703, 118.030609731015)
+SketchCircle_4.result().setColor(225, 0, 0)
+SketchCircle_4.results()[1].setColor(225, 0, 0)
+SketchLine_3 = Sketch_2.addLine(-138.9405630492767, 9.915017403336009, 11.9830331245263, 5.907779612586542)
+SketchLine_3.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_5 = Sketch_2.setCoincident(SketchLine_3.startPoint(), SketchCircle_3.results()[1])
+SketchConstraintCoincidence_6 = Sketch_2.setCoincident(SketchLine_3.endPoint(), SketchCircle_3.results()[1])
+SketchLine_4 = Sketch_2.addLine(207.6267015097382, 3.521847530670962, 440.2647819790861, -32.89885701981125)
+SketchLine_4.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_7 = Sketch_2.setCoincident(SketchLine_4.startPoint(), SketchCircle_4.results()[1])
+SketchConstraintCoincidence_8 = Sketch_2.setCoincident(SketchLine_4.endPoint(), SketchCircle_4.results()[1])
+model.do()
+Shell_1_objects = [model.selection("FACE", "Sketch_1/Face-SketchCircle_1_2f-SketchLine_1r"), model.selection("FACE", "Sketch_1/Face-SketchCircle_1_2f-SketchLine_1f"), model.selection("FACE", "Sketch_1/Face-SketchCircle_2_2f-SketchLine_2r"), model.selection("FACE", "Sketch_1/Face-SketchCircle_2_2f-SketchLine_2f")]
+Shell_1 = model.addShell(Part_1_doc, Shell_1_objects)
+Shell_2_objects = [model.selection("FACE", "Sketch_2/Face-SketchCircle_3_2f-SketchLine_3f"), model.selection("FACE", "Sketch_2/Face-SketchCircle_3_2f-SketchLine_3r"), model.selection("FACE", "Sketch_2/Face-SketchCircle_4_2f-SketchLine_4f"), model.selection("FACE", "Sketch_2/Face-SketchCircle_4_2f-SketchLine_4r")]
+Shell_2 = model.addShell(Part_1_doc, Shell_2_objects)
+Compound_1 = model.addCompound(Part_1_doc, [model.selection("SHELL", "Shell_1_1"), model.selection("SHELL", "Shell_1_2")])
+Compound_2 = model.addCompound(Part_1_doc, [model.selection("SHELL", "Shell_2_1"), model.selection("SHELL", "Shell_2_2")])
+Cut_1 = model.addCut(Part_1_doc, [model.selection("COMPOUND", "Compound_1_1")], [model.selection("COMPOUND", "Compound_2_1")])
+model.testHaveNamingSubshapes(Cut_1, model, Part_1_doc)
+model.do()
+model.end()
+
+from GeomAPI import  GeomAPI_Shape
+
+model.testNbResults(Cut_1, 1)
+model.testNbSubResults(Cut_1, [2])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.SOLID, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.FACE, [4])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.EDGE, [14])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.VERTEX, [28])
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/Test/TestBooleanCut_Shell_Shell.py b/src/FeaturesPlugin/Test/TestBooleanCut_Shell_Shell.py
new file mode 100644 (file)
index 0000000..bb7786a
--- /dev/null
@@ -0,0 +1,61 @@
+## Copyright (C) 2014-2017  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<mailto:webmaster.salome@opencascade.com>
+##
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchCircle_1 = Sketch_1.addCircle(-32.92409574173262, 1.332083115848444, 52.41665939244462)
+SketchCircle_1.result().setColor(225, 0, 0)
+SketchCircle_1.results()[1].setColor(225, 0, 0)
+SketchLine_1 = Sketch_1.addLine(-32.3899127495535, 53.7460204836366, -32.9246838934834, -51.08457627329644)
+SketchLine_1.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchLine_1.startPoint(), SketchCircle_1.results()[1])
+SketchConstraintCoincidence_2 = Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchCircle_1.results()[1])
+model.do()
+Sketch_2 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchCircle_2 = Sketch_2.addCircle(52.19056504290929, 1.630574981545157, 59.89949304384059)
+SketchCircle_2.result().setColor(225, 0, 0)
+SketchCircle_2.results()[1].setColor(225, 0, 0)
+SketchLine_2 = Sketch_2.addLine(112.0898160449407, 1.460291967886176, -7.70480537031941, 0.9278161529026914)
+SketchLine_2.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_3 = Sketch_2.setCoincident(SketchLine_2.startPoint(), SketchCircle_2.results()[1])
+SketchConstraintCoincidence_4 = Sketch_2.setCoincident(SketchLine_2.endPoint(), SketchCircle_2.results()[1])
+model.do()
+Shell_1_objects = [model.selection("FACE", "Sketch_2/Face-SketchCircle_2_2f-SketchLine_2r"), model.selection("FACE", "Sketch_2/Face-SketchCircle_2_2f-SketchLine_2f"), model.selection("FACE", "Sketch_1/Face-SketchCircle_1_2f-SketchLine_1r"), model.selection("FACE", "Sketch_1/Face-SketchCircle_1_2f-SketchLine_1f")]
+Shell_1 = model.addShell(Part_1_doc, Shell_1_objects)
+Cut_1 = model.addCut(Part_1_doc, [model.selection("SHELL", "Shell_1_2")], [model.selection("SHELL", "Shell_1_1")])
+model.testHaveNamingSubshapes(Cut_1, model, Part_1_doc)
+model.do()
+model.end()
+
+from GeomAPI import  GeomAPI_Shape
+
+model.testNbResults(Cut_1, 1)
+model.testNbSubResults(Cut_1, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.SOLID, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.FACE, [2])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.EDGE, [7])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.VERTEX, [14])
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/Test/TestBooleanCut_SolidCompound_SolidCompound.py b/src/FeaturesPlugin/Test/TestBooleanCut_SolidCompound_SolidCompound.py
new file mode 100644 (file)
index 0000000..90dc152
--- /dev/null
@@ -0,0 +1,61 @@
+## Copyright (C) 2014-2017  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<mailto:webmaster.salome@opencascade.com>
+##
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchCircle_1 = Sketch_1.addCircle(-64.66755707084829, 12.13132840151158, 21.07964902130243)
+SketchCircle_1.result().setColor(225, 0, 0)
+SketchCircle_1.results()[1].setColor(225, 0, 0)
+SketchCircle_2 = Sketch_1.addCircle(45.61684376247555, 1.775642744728198, 22.96122819474142)
+SketchCircle_2.result().setColor(225, 0, 0)
+SketchCircle_2.results()[1].setColor(225, 0, 0)
+model.do()
+Sketch_2 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchCircle_3 = Sketch_2.addCircle(-36.49725872565889, 7.160803013521951, 17.872664608039)
+SketchCircle_3.result().setColor(225, 0, 0)
+SketchCircle_3.results()[1].setColor(225, 0, 0)
+SketchCircle_4 = Sketch_2.addCircle(78.03127953954764, -3.93858425080257, 22.76570299983515)
+SketchCircle_4.result().setColor(225, 0, 0)
+SketchCircle_4.results()[1].setColor(225, 0, 0)
+model.do()
+Extrusion_1 = model.addExtrusion(Part_1_doc, [model.selection("COMPOUND", "Sketch_1")], model.selection(), 10, 0)
+Extrusion_2 = model.addExtrusion(Part_1_doc, [model.selection("COMPOUND", "Sketch_2")], model.selection(), 20, 20)
+Compound_1 = model.addCompound(Part_1_doc, [model.selection("SOLID", "Extrusion_1_1"), model.selection("SOLID", "Extrusion_1_2")])
+Compound_2 = model.addCompound(Part_1_doc, [model.selection("SOLID", "Extrusion_2_1"), model.selection("SOLID", "Extrusion_2_2")])
+Cut_1 = model.addCut(Part_1_doc, [model.selection("COMPOUND", "Compound_1_1")], [model.selection("COMPOUND", "Compound_2_1")])
+model.testHaveNamingSubshapes(Cut_1, model, Part_1_doc)
+model.do()
+model.end()
+
+from GeomAPI import  GeomAPI_Shape
+
+model.testNbResults(Cut_1, 1)
+model.testNbSubResults(Cut_1, [2])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.SOLID, [2])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.FACE, [8])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.EDGE, [24])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.VERTEX, [48])
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/Test/TestBooleanCut_Solid_Solid.py b/src/FeaturesPlugin/Test/TestBooleanCut_Solid_Solid.py
new file mode 100644 (file)
index 0000000..456005d
--- /dev/null
@@ -0,0 +1,78 @@
+## Copyright (C) 2014-2017  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<mailto:webmaster.salome@opencascade.com>
+##
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_1 = Sketch_1.addLine(15.58517034068135, 30.56312625250501, -33.39679358717434, 30.56312625250501)
+SketchLine_1.result().setColor(225, 0, 0)
+SketchLine_2 = Sketch_1.addLine(-33.39679358717434, 30.56312625250501, -33.39679358717434, -16.39478957915832)
+SketchLine_2.result().setColor(225, 0, 0)
+SketchLine_3 = Sketch_1.addLine(-33.39679358717434, -16.39478957915832, 15.58517034068135, -16.39478957915832)
+SketchLine_3.result().setColor(225, 0, 0)
+SketchLine_4 = Sketch_1.addLine(15.58517034068135, -16.39478957915832, 15.58517034068135, 30.56312625250501)
+SketchLine_4.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchLine_4.endPoint(), SketchLine_1.startPoint())
+SketchConstraintCoincidence_2 = Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchLine_2.startPoint())
+SketchConstraintCoincidence_3 = Sketch_1.setCoincident(SketchLine_2.endPoint(), SketchLine_3.startPoint())
+SketchConstraintCoincidence_4 = Sketch_1.setCoincident(SketchLine_3.endPoint(), SketchLine_4.startPoint())
+SketchConstraintHorizontal_1 = Sketch_1.setHorizontal(SketchLine_1.result())
+SketchConstraintVertical_1 = Sketch_1.setVertical(SketchLine_2.result())
+SketchConstraintHorizontal_2 = Sketch_1.setHorizontal(SketchLine_3.result())
+SketchConstraintVertical_2 = Sketch_1.setVertical(SketchLine_4.result())
+model.do()
+Sketch_2 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_5 = Sketch_2.addLine(35.01603206412826, 45.13627254509017, -8.298597194388776, 45.13627254509017)
+SketchLine_5.result().setColor(225, 0, 0)
+SketchLine_6 = Sketch_2.addLine(-8.298597194388776, 45.13627254509017, -8.298597194388776, 6.679358717434865)
+SketchLine_6.result().setColor(225, 0, 0)
+SketchLine_7 = Sketch_2.addLine(-8.298597194388776, 6.679358717434865, 35.01603206412826, 6.679358717434865)
+SketchLine_7.result().setColor(225, 0, 0)
+SketchLine_8 = Sketch_2.addLine(35.01603206412826, 6.679358717434865, 35.01603206412826, 45.13627254509017)
+SketchLine_8.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_5 = Sketch_2.setCoincident(SketchLine_8.endPoint(), SketchLine_5.startPoint())
+SketchConstraintCoincidence_6 = Sketch_2.setCoincident(SketchLine_5.endPoint(), SketchLine_6.startPoint())
+SketchConstraintCoincidence_7 = Sketch_2.setCoincident(SketchLine_6.endPoint(), SketchLine_7.startPoint())
+SketchConstraintCoincidence_8 = Sketch_2.setCoincident(SketchLine_7.endPoint(), SketchLine_8.startPoint())
+SketchConstraintHorizontal_3 = Sketch_2.setHorizontal(SketchLine_5.result())
+SketchConstraintVertical_3 = Sketch_2.setVertical(SketchLine_6.result())
+SketchConstraintHorizontal_4 = Sketch_2.setHorizontal(SketchLine_7.result())
+SketchConstraintVertical_4 = Sketch_2.setVertical(SketchLine_8.result())
+model.do()
+Extrusion_1 = model.addExtrusion(Part_1_doc, [model.selection("COMPOUND", "Sketch_1"), model.selection("COMPOUND", "Sketch_2")], model.selection(), 100, 0)
+Cut_1 = model.addCut(Part_1_doc, [model.selection("SOLID", "Extrusion_1_1")], [model.selection("SOLID", "Extrusion_1_2")])
+model.testHaveNamingSubshapes(Cut_1, model, Part_1_doc)
+model.do()
+model.end()
+
+from GeomAPI import  GeomAPI_Shape
+
+model.testNbResults(Cut_1, 1)
+model.testNbSubResults(Cut_1, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.SOLID, [1])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.FACE, [8])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.EDGE, [36])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.VERTEX, [72])
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/Test/TestBooleanCut_VertexCompound_Solid.py b/src/FeaturesPlugin/Test/TestBooleanCut_VertexCompound_Solid.py
new file mode 100644 (file)
index 0000000..337eeb9
--- /dev/null
@@ -0,0 +1,72 @@
+## Copyright (C) 2014-2017  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<mailto:webmaster.salome@opencascade.com>
+##
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchPoint_1 = Sketch_1.addPoint(-61.63122212692967, 34.13774013722127)
+SketchPoint_1.result().setColor(225, 0, 0)
+SketchPoint_2 = Sketch_1.addPoint(-27.26436963979418, 34.59596483704974)
+SketchPoint_2.result().setColor(225, 0, 0)
+SketchPoint_3 = Sketch_1.addPoint(25.43147084048027, 34.59596483704974)
+SketchPoint_3.result().setColor(225, 0, 0)
+SketchPoint_4 = Sketch_1.addPoint(54.29962692967411, 33.67951543739281)
+SketchPoint_4.result().setColor(225, 0, 0)
+model.do()
+Compound_1_objects = [model.selection("VERTEX", "Sketch_1/Vertex-SketchPoint_1"), model.selection("VERTEX", "Sketch_1/Vertex-SketchPoint_2"), model.selection("VERTEX", "Sketch_1/Vertex-SketchPoint_3"), model.selection("VERTEX", "Sketch_1/Vertex-SketchPoint_4")]
+Compound_1 = model.addCompound(Part_1_doc, Compound_1_objects)
+Sketch_2 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_1 = Sketch_2.addLine(42.11715050385933, 45.75316349699826, -43.32915483490565, 45.75316349699826)
+SketchLine_1.result().setColor(225, 0, 0)
+SketchLine_2 = Sketch_2.addLine(-43.32915483490565, 45.75316349699826, -43.32915483490565, 20.90707471054887)
+SketchLine_2.result().setColor(225, 0, 0)
+SketchLine_3 = Sketch_2.addLine(-43.32915483490565, 20.90707471054887, 42.11715050385933, 20.90707471054887)
+SketchLine_3.result().setColor(225, 0, 0)
+SketchLine_4 = Sketch_2.addLine(42.11715050385933, 20.90707471054887, 42.11715050385933, 45.75316349699826)
+SketchLine_4.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_1 = Sketch_2.setCoincident(SketchLine_4.endPoint(), SketchLine_1.startPoint())
+SketchConstraintCoincidence_2 = Sketch_2.setCoincident(SketchLine_1.endPoint(), SketchLine_2.startPoint())
+SketchConstraintCoincidence_3 = Sketch_2.setCoincident(SketchLine_2.endPoint(), SketchLine_3.startPoint())
+SketchConstraintCoincidence_4 = Sketch_2.setCoincident(SketchLine_3.endPoint(), SketchLine_4.startPoint())
+SketchConstraintHorizontal_1 = Sketch_2.setHorizontal(SketchLine_1.result())
+SketchConstraintVertical_1 = Sketch_2.setVertical(SketchLine_2.result())
+SketchConstraintHorizontal_2 = Sketch_2.setHorizontal(SketchLine_3.result())
+SketchConstraintVertical_2 = Sketch_2.setVertical(SketchLine_4.result())
+model.do()
+Extrusion_1 = model.addExtrusion(Part_1_doc, [model.selection("FACE", "Sketch_2/Face-SketchLine_1f-SketchLine_2f-SketchLine_3f-SketchLine_4f")], model.selection(), 10, 10)
+Cut_1 = model.addCut(Part_1_doc, [model.selection("COMPOUND", "Compound_1_1")], [model.selection("SOLID", "Extrusion_1_1")])
+model.testHaveNamingSubshapes(Cut_1, model, Part_1_doc)
+model.do()
+model.end()
+
+from GeomAPI import GeomAPI_Shape
+
+model.testNbResults(Cut_1, 1)
+model.testNbSubResults(Cut_1, [2])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.SOLID, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.FACE, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.EDGE, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.VERTEX, [2])
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/Test/TestBooleanCut_VertexCompound_VertexCompound.py b/src/FeaturesPlugin/Test/TestBooleanCut_VertexCompound_VertexCompound.py
new file mode 100644 (file)
index 0000000..f56fcff
--- /dev/null
@@ -0,0 +1,54 @@
+## Copyright (C) 2014-2017  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<mailto:webmaster.salome@opencascade.com>
+##
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchPoint_1 = Sketch_1.addPoint(-61.63122212692967, 34.13774013722127)
+SketchPoint_1.result().setColor(225, 0, 0)
+SketchPoint_2 = Sketch_1.addPoint(-27.26436963979418, 34.59596483704974)
+SketchPoint_2.result().setColor(225, 0, 0)
+SketchPoint_3 = Sketch_1.addPoint(25.43147084048027, 34.59596483704974)
+SketchPoint_3.result().setColor(225, 0, 0)
+SketchPoint_4 = Sketch_1.addPoint(54.29962692967411, 33.67951543739281)
+SketchPoint_4.result().setColor(225, 0, 0)
+model.do()
+Compound_1_objects = [model.selection("VERTEX", "Sketch_1/Vertex-SketchPoint_1"), model.selection("VERTEX", "Sketch_1/Vertex-SketchPoint_2"), model.selection("VERTEX", "Sketch_1/Vertex-SketchPoint_3"), model.selection("VERTEX", "Sketch_1/Vertex-SketchPoint_4")]
+Compound_1 = model.addCompound(Part_1_doc, Compound_1_objects)
+Compound_2 = model.addCompound(Part_1_doc, [model.selection("VERTEX", "Sketch_1/Vertex-SketchPoint_2"), model.selection("VERTEX", "Sketch_1/Vertex-SketchPoint_3")])
+Cut_1 = model.addCut(Part_1_doc, [model.selection("COMPOUND", "Compound_1_1")], [model.selection("COMPOUND", "Compound_2_1")])
+model.testHaveNamingSubshapes(Cut_1, model, Part_1_doc)
+model.do()
+model.end()
+
+from GeomAPI import  GeomAPI_Shape
+
+model.testNbResults(Cut_1, 1)
+model.testNbSubResults(Cut_1, [2])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.SOLID, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.FACE, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.EDGE, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.VERTEX, [2])
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/Test/TestBooleanCut_Vertex_Vertex.py b/src/FeaturesPlugin/Test/TestBooleanCut_Vertex_Vertex.py
new file mode 100644 (file)
index 0000000..0d046ff
--- /dev/null
@@ -0,0 +1,60 @@
+## Copyright (C) 2014-2017  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<mailto:webmaster.salome@opencascade.com>
+##
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchPoint_1 = Sketch_1.addPoint(0, 50)
+SketchPoint_1.result().setColor(225, 0, 0)
+SketchPoint_2 = Sketch_1.addPoint(0, 25)
+SketchPoint_2.result().setColor(225, 0, 0)
+model.do()
+Vertex_1 = model.addVertex(Part_1_doc, [model.selection("VERTEX", "Sketch_1/Vertex-SketchPoint_1")])
+Vertex_2 = model.addVertex(Part_1_doc, [model.selection("VERTEX", "Sketch_1/Vertex-SketchPoint_1")])
+Vertex_3 = model.addVertex(Part_1_doc, [model.selection("VERTEX", "Sketch_1/Vertex-SketchPoint_1")])
+Vertex_4 = model.addVertex(Part_1_doc, [model.selection("VERTEX", "Sketch_1/Vertex-SketchPoint_2")])
+Cut_1 = model.addCut(Part_1_doc, [model.selection("VERTEX", "Vertex_1_1")], [model.selection("VERTEX", "Vertex_2_1")])
+Cut_2 = model.addCut(Part_1_doc, [model.selection("VERTEX", "Vertex_3_1")], [model.selection("VERTEX", "Vertex_4_1")])
+model.testHaveNamingSubshapes(Cut_1, model, Part_1_doc)
+model.testHaveNamingSubshapes(Cut_2, model, Part_1_doc)
+model.do()
+model.end()
+
+from GeomAPI import  GeomAPI_Shape
+
+model.testNbResults(Cut_1, 0)
+model.testNbSubResults(Cut_1, [])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.SOLID, [])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.FACE, [])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.EDGE, [])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.VERTEX, [])
+
+model.testNbResults(Cut_2, 1)
+model.testNbSubResults(Cut_2, [0])
+model.testNbSubShapes(Cut_2, GeomAPI_Shape.SOLID, [0])
+model.testNbSubShapes(Cut_2, GeomAPI_Shape.FACE, [0])
+model.testNbSubShapes(Cut_2, GeomAPI_Shape.EDGE, [0])
+model.testNbSubShapes(Cut_2, GeomAPI_Shape.VERTEX, [1])
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/Test/TestBooleanCut_WireCompound_WireCompound.py b/src/FeaturesPlugin/Test/TestBooleanCut_WireCompound_WireCompound.py
new file mode 100644 (file)
index 0000000..2f6ecf0
--- /dev/null
@@ -0,0 +1,71 @@
+## Copyright (C) 2014-2017  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<mailto:webmaster.salome@opencascade.com>
+##
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_1 = Sketch_1.addLine(-64.96569468267583, 22.00171526586621, -41.05831903945112, 55.95711835334479)
+SketchLine_1.result().setColor(225, 0, 0)
+SketchLine_2 = Sketch_1.addLine(-41.05831903945112, 55.95711835334479, -23.04116638078903, 21.65523156089195)
+SketchLine_2.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchLine_2.startPoint())
+SketchLine_3 = Sketch_1.addLine(14.72555746140652, 19.92281303602059, 33.43567753001715, 55.95711835334479)
+SketchLine_3.result().setColor(225, 0, 0)
+SketchLine_4 = Sketch_1.addLine(33.43567753001715, 55.95711835334479, 50.75986277873073, 22.69468267581476)
+SketchLine_4.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_2 = Sketch_1.setCoincident(SketchLine_3.endPoint(), SketchLine_4.startPoint())
+model.do()
+Sketch_2 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_5 = Sketch_2.addLine(-67.39108061749573, 66.6981132075472, -42.44425385934821, 35.51457975986279)
+SketchLine_5.result().setColor(225, 0, 0)
+SketchLine_6 = Sketch_2.addLine(-42.44425385934821, 35.51457975986279, -16.1114922813036, 69.1234991423671)
+SketchLine_6.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_3 = Sketch_2.setCoincident(SketchLine_5.endPoint(), SketchLine_6.startPoint())
+SketchLine_7 = Sketch_2.addLine(12.64665523156088, 66.6981132075472, 35.16809605488852, 36.5540308747856)
+SketchLine_7.result().setColor(225, 0, 0)
+SketchLine_8 = Sketch_2.addLine(35.16809605488852, 36.5540308747856, 52.49228130360206, 66.35162950257292)
+SketchLine_8.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_4 = Sketch_2.setCoincident(SketchLine_7.endPoint(), SketchLine_8.startPoint())
+model.do()
+Wire_1 = model.addWire(Part_1_doc, [model.selection("EDGE", "Sketch_1/Edge-SketchLine_1"), model.selection("EDGE", "Sketch_1/Edge-SketchLine_2")])
+Wire_2 = model.addWire(Part_1_doc, [model.selection("EDGE", "Sketch_1/Edge-SketchLine_3"), model.selection("EDGE", "Sketch_1/Edge-SketchLine_4")])
+Wire_3 = model.addWire(Part_1_doc, [model.selection("EDGE", "Sketch_2/Edge-SketchLine_5"), model.selection("EDGE", "Sketch_2/Edge-SketchLine_6")])
+Wire_4 = model.addWire(Part_1_doc, [model.selection("EDGE", "Sketch_2/Edge-SketchLine_7"), model.selection("EDGE", "Sketch_2/Edge-SketchLine_8")])
+Compound_1 = model.addCompound(Part_1_doc, [model.selection("WIRE", "Wire_1_1"), model.selection("WIRE", "Wire_2_1")])
+Compound_2 = model.addCompound(Part_1_doc, [model.selection("WIRE", "Wire_3_1"), model.selection("WIRE", "Wire_4_1")])
+Cut_1 = model.addCut(Part_1_doc, [model.selection("COMPOUND", "Compound_1_1")], [model.selection("COMPOUND", "Compound_2_1")])
+model.testHaveNamingSubshapes(Cut_1, model, Part_1_doc)
+model.do()
+model.end()
+
+from GeomAPI import  GeomAPI_Shape
+
+model.testNbResults(Cut_1, 1)
+model.testNbSubResults(Cut_1, [2])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.SOLID, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.FACE, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.EDGE, [8])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.VERTEX, [16])
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/Test/TestBooleanCut_Wire_Face.py b/src/FeaturesPlugin/Test/TestBooleanCut_Wire_Face.py
new file mode 100644 (file)
index 0000000..769b64f
--- /dev/null
@@ -0,0 +1,59 @@
+## Copyright (C) 2014-2017  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<mailto:webmaster.salome@opencascade.com>
+##
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_1 = Sketch_1.addLine(-26.15951972555746, 50.06689536878219, -17.15094339622642, 14.37907375643225)
+SketchLine_1.result().setColor(225, 0, 0)
+SketchLine_2 = Sketch_1.addLine(-17.15094339622642, 14.37907375643225, 26.85248713550602, 14.72555746140652)
+SketchLine_2.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchLine_2.startPoint())
+SketchLine_3 = Sketch_1.addLine(26.85248713550602, 14.72555746140652, 34.47512864493997, 50.41337907375645)
+SketchLine_3.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_2 = Sketch_1.setCoincident(SketchLine_2.endPoint(), SketchLine_3.startPoint())
+model.do()
+Sketch_2 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchCircle_1 = Sketch_2.addCircle(3.984562607204112, 58.72898799313897, 38.16357190022508)
+SketchCircle_1.result().setColor(225, 0, 0)
+SketchCircle_1.results()[1].setColor(225, 0, 0)
+model.do()
+Wire_1_objects = [model.selection("EDGE", "Sketch_1/Edge-SketchLine_1"), model.selection("EDGE", "Sketch_1/Edge-SketchLine_2"), model.selection("EDGE", "Sketch_1/Edge-SketchLine_3")]
+Wire_1 = model.addWire(Part_1_doc, Wire_1_objects)
+Face_1 = model.addFace(Part_1_doc, [model.selection("EDGE", "Sketch_2/Edge-SketchCircle_1_2")])
+Cut_1 = model.addCut(Part_1_doc, [model.selection("WIRE", "Wire_1_1")], [model.selection("FACE", "Face_1_1")])
+model.testHaveNamingSubshapes(Cut_1, model, Part_1_doc)
+model.do()
+model.end()
+
+from GeomAPI import  GeomAPI_Shape
+
+model.testNbResults(Cut_1, 1)
+model.testNbSubResults(Cut_1, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.SOLID, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.FACE, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.EDGE, [3])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.VERTEX, [6])
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/Test/TestBooleanCut_Wire_Wire.py b/src/FeaturesPlugin/Test/TestBooleanCut_Wire_Wire.py
new file mode 100644 (file)
index 0000000..262a79d
--- /dev/null
@@ -0,0 +1,59 @@
+## Copyright (C) 2014-2017  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<mailto:webmaster.salome@opencascade.com>
+##
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_1 = Sketch_1.addLine(-67.98180952066137, 66.89107262893774, -22.72663773945906, 26.22700523133564)
+SketchLine_1.result().setColor(225, 0, 0)
+SketchLine_2 = Sketch_1.addLine(-22.72663773945906, 26.22700523133564, 31.71074280894377, 25.5711331765356)
+SketchLine_2.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchLine_2.startPoint())
+SketchLine_3 = Sketch_1.addLine(31.71074280894377, 25.5711331765356, 74.99829842574599, 68.85868879333785)
+SketchLine_3.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_2 = Sketch_1.setCoincident(SketchLine_2.endPoint(), SketchLine_3.startPoint())
+SketchLine_4 = Sketch_1.addLine(-58.79960075346089, 25.5711331765356, 3.508244452542322, 60.3323520809374)
+SketchLine_4.result().setColor(225, 0, 0)
+SketchLine_5 = Sketch_1.addLine(3.508244452542322, 60.3323520809374, 63.1926014393454, 22.94764495733547)
+SketchLine_5.result().setColor(225, 0, 0)
+SketchConstraintCoincidence_3 = Sketch_1.setCoincident(SketchLine_4.endPoint(), SketchLine_5.startPoint())
+model.do()
+Wire_1_objects = [model.selection("EDGE", "Sketch_1/Edge-SketchLine_1"), model.selection("EDGE", "Sketch_1/Edge-SketchLine_2"), model.selection("EDGE", "Sketch_1/Edge-SketchLine_3")]
+Wire_1 = model.addWire(Part_1_doc, Wire_1_objects)
+Wire_2 = model.addWire(Part_1_doc, [model.selection("EDGE", "Sketch_1/Edge-SketchLine_4"), model.selection("EDGE", "Sketch_1/Edge-SketchLine_5")])
+Cut_1 = model.addCut(Part_1_doc, [model.selection("WIRE", "Wire_1_1")], [model.selection("WIRE", "Wire_2_1")])
+model.testHaveNamingSubshapes(Cut_1, model, Part_1_doc)
+model.do()
+model.end()
+
+from GeomAPI import  GeomAPI_Shape
+
+model.testNbResults(Cut_1, 1)
+model.testNbSubResults(Cut_1, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.SOLID, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.FACE, [0])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.EDGE, [5])
+model.testNbSubShapes(Cut_1, GeomAPI_Shape.VERTEX, [10])
+
+assert(model.checkPythonDump())
index 2af2e8edb0841920fd95f9ad3c6312bf915a283a..b26849dd7b183e6810cd1c0015cdae874caea63d 100644 (file)
 #include <BOPAlgo_BOP.hxx>
 #include <TopTools_ListOfShape.hxx>
 
+//=================================================================================================
+GeomAlgoAPI_Boolean::GeomAlgoAPI_Boolean(const GeomShapePtr theObject,
+                                         const ListOfShape& theTools,
+                                         const OperationType theOperationType)
+{
+  ListOfShape aListWithObject;
+  aListWithObject.push_back(theObject);
+  build(aListWithObject, theTools, theOperationType);
+}
+
 //=================================================================================================
 GeomAlgoAPI_Boolean::GeomAlgoAPI_Boolean(const ListOfShape& theObjects,
                                          const ListOfShape& theTools,
index ba6f8a77ab428ddd200f0934c339caaedce9a6b3..3cb2d6e9297f8dc2c679097ab7312352eef1dbcd 100644 (file)
@@ -39,7 +39,13 @@ public:
     BOOL_COMMON ///< Take common part of objects
   };
 
- public:
+public:
+
+  /// Constructor.
+  GEOMALGOAPI_EXPORT GeomAlgoAPI_Boolean(const GeomShapePtr theObject,
+                                         const ListOfShape& theTools,
+                                         const OperationType theOperationType);
+
 
   /// Constructor.
   GEOMALGOAPI_EXPORT GeomAlgoAPI_Boolean(const ListOfShape& theObjects,
index cf73905ecbcd7d23ecd2acb8c7947c483c99ec5b..fa8e7e4904cadb99934ff2a57b1406e9bd772802 100644 (file)
@@ -1368,6 +1368,24 @@ void Model_AttributeSelection::updateInHistory()
           aValueShape = std::make_shared<GeomAPI_Shape>();
           aValueShape->setImpl<TopoDS_Shape>(new TopoDS_Shape(aNewValues.Value()));
         }
+
+        // Check that list has the same type of shape selection before adding.
+        GeomAPI_Shape::ShapeType aListShapeType = GeomAPI_Shape::SHAPE;
+        if (myParent->selectionType() == "VERTEX") aListShapeType = GeomAPI_Shape::VERTEX;
+        else if (myParent->selectionType() == "EDGE") aListShapeType = GeomAPI_Shape::EDGE;
+        else if (myParent->selectionType() == "FACE") aListShapeType = GeomAPI_Shape::FACE;
+
+        GeomAPI_Shape::ShapeType aShapeShapeType = GeomAPI_Shape::SHAPE;
+        if (aValueShape.get()) {
+          aShapeShapeType = aValueShape->shapeType();
+        } else {
+          (*aNewCont)->shape()->shapeType();
+        }
+
+        if (aListShapeType != GeomAPI_Shape::SHAPE && aListShapeType != aShapeShapeType) {
+          continue;
+        }
+
         myParent->append(*aNewCont, aValueShape);
       }
     }
index 50ee39ca841addf806f59558c6ec05e2b2ed4882..ab2c1dec6e37483221a8f54ac486cc68fd8cf729 100755 (executable)
 //#define DEB_IMPORT 1
 
 Model_BodyBuilder::Model_BodyBuilder(ModelAPI_Object* theOwner)
-: ModelAPI_BodyBuilder(theOwner)
+: ModelAPI_BodyBuilder(theOwner),
+  myDividedIndex(1),
+  myVIndex(1),
+  myEIndex(1),
+  myFIndex(1)
 {
 }
 
@@ -275,6 +279,10 @@ void Model_BodyBuilder::clean()
   myBuilders.clear();
   // remove the old reference (if any)
   aLab.ForgetAttribute(TDF_Reference::GetID());
+  myDividedIndex = 1;
+  myVIndex = 1;
+  myEIndex = 1;
+  myFIndex = 1;
 }
 
 Model_BodyBuilder::~Model_BodyBuilder()
@@ -379,6 +387,22 @@ void Model_BodyBuilder::loadDeletedShapes (GeomAlgoAPI_MakeShape* theMS,
   }
 }
 
+static void removeBadShapes(ListOfShape& theShapes)
+{
+  ListOfShape::iterator anIt = theShapes.begin();
+  while (anIt != theShapes.end()) {
+    TopoDS_Shape aNewShape = (*anIt)->impl<TopoDS_Shape>();
+    bool aSkip = aNewShape.IsNull()
+      || (aNewShape.ShapeType() == TopAbs_EDGE && BRep_Tool::Degenerated(TopoDS::Edge(aNewShape)));
+    if (aSkip) {
+      ListOfShape::iterator aRemoveIt = anIt++;
+      theShapes.erase(aRemoveIt);
+    } else {
+      ++anIt;
+    }
+  }
+}
+
 // Keep only the shapes with minimal shape type
 static void keepTopLevelShapes(ListOfShape& theShapes, const TopoDS_Shape& theRoot,
   const GeomShapePtr& theResultShape = GeomShapePtr())
@@ -429,6 +453,8 @@ void Model_BodyBuilder::loadAndOrientModifiedShapes (
   const bool theIsStoreSeparate,
   const bool theIsStoreAsGenerated)
 {
+  static const int THE_ANCHOR_TAG = 100000;
+
   int anIndex = 1;
   int aTag = theTag;
   bool isBuilt = !theName.empty();
@@ -453,13 +479,17 @@ void Model_BodyBuilder::loadAndOrientModifiedShapes (
     std::shared_ptr<GeomAPI_Shape> aRShape(new GeomAPI_Shape());
     aRShape->setImpl((new TopoDS_Shape(aRoot)));
     theMS->modified(aRShape, aList);
-    if (!theIsStoreSeparate)
-      keepTopLevelShapes(aList, aRoot, aResultShape);
+    if (!theIsStoreSeparate) {
+      //keepTopLevelShapes(aList, aRoot, aResultShape);
+      removeBadShapes(aList);
+    }
     // sort the list of images before naming
     GeomAlgoAPI_SortListOfShapes::sort(aList);
 
     // to trace situation where several objects are produced by one parent (#2317)
-    int aSameParentShapes = -1;
+    int aSameParentShapes = (aShapeIn.ShapeType() == TopAbs_WIRE
+                             || aShapeIn.ShapeType() == TopAbs_SHELL
+                             || aShapeIn.ShapeType() == TopAbs_COMPOUND) ? 0 : -1;
     std::list<std::shared_ptr<GeomAPI_Shape> >::const_iterator
       anIt = aList.begin(), aLast = aList.end();
     for (; anIt != aLast; anIt++) {
@@ -468,15 +498,16 @@ void Model_BodyBuilder::loadAndOrientModifiedShapes (
         std::shared_ptr<GeomAPI_Shape> aMapShape(theSubShapes.find(*anIt));
         aNewShape.Orientation(aMapShape->impl<TopoDS_Shape>().Orientation());
       }
-      GeomShapePtr aGeomNewShape(new GeomAPI_Shape());
-      aGeomNewShape->setImpl(new TopoDS_Shape(aNewShape));
-      if(!aRoot.IsSame(aNewShape) && aResultShape->isSubShape(aGeomNewShape, false) &&
-         !aResultShape->isSame(*anIt)) { // to avoid put of same shape on main label and sub
-        int aBuilderTag = aTag;
+      isBuilt = !theName.empty();
+      if(!aRoot.IsSame(aNewShape)
+         && aResultShape->isSubShape((*anIt), false)
+         && !aResultShape->isSame(*anIt)) // to avoid put of same shape on main label and sub
+      {
         if (!theIsStoreSeparate) {
           aSameParentShapes++;
-        } else if (aNotInTree) { // check this new shape can not be represented as
-          // a sub-shape of higher level sub-shapes
+        } else if (aNotInTree) // check this new shape can not be represented as
+                              // a sub-shape of higher level sub-shapes
+        {
           TopAbs_ShapeEnum aNewType = aNewShape.ShapeType();
           TopAbs_ShapeEnum anAncestorType = typeOfAncestor(aNewType);
           if (anAncestorType != TopAbs_VERTEX) {
@@ -500,25 +531,106 @@ void Model_BodyBuilder::loadAndOrientModifiedShapes (
           }
         }
 
-        static const int THE_ANCHOR_TAG = 100000;
+        int aFoundTag = 0;
+        bool isFoundSameOld = false;
+        bool isFoundDiffOld = false;
+
+        // Check if new shape was already stored.
+        for (std::map<int, TNaming_Builder*>::iterator aBuildersIt = myBuilders.begin();
+             aBuildersIt != myBuilders.end();
+             ++aBuildersIt)
+        {
+          TNaming_Builder* aBuilder = aBuildersIt->second;
+          for (TNaming_Iterator aNamingIt(aBuilder->NamedShape());
+               aNamingIt.More();
+               aNamingIt.Next())
+          {
+            if (aNamingIt.NewShape().IsSame(aNewShape))
+            {
+              aNamingIt.OldShape().IsSame(aRoot) ? isFoundSameOld = true
+                                                 : isFoundDiffOld = true;
+              aFoundTag = aBuildersIt->first;
+            }
+          }
+
+          if (isFoundSameOld || isFoundDiffOld) break;
+        }
+
+        if (isFoundSameOld) {
+          // Builder already contains same old->new shapes, don't store it twice.
+          continue;
+        }
+
+        int aBuilderTag = aSameParentShapes > 0 ? THE_ANCHOR_TAG : aTag;
+
         int aCurShapeType = (int)((*anIt)->shapeType());
         bool needSuffix = false; // suffix for the name based on the shape type
-        if (aSameParentShapes > 0) { // store in other label
-          aBuilderTag = THE_ANCHOR_TAG - aSameParentShapes * 10 - aCurShapeType;
-          needSuffix = true;
-        } else if (aCurShapeType != theKindOfShape) {
+        if (aCurShapeType != theKindOfShape) {
           // modified shape has different type => set another tag
           // to avoid shapes of different types on the same label
-          aBuilderTag = THE_ANCHOR_TAG - aCurShapeType;
+          aBuilderTag = THE_ANCHOR_TAG;
           needSuffix = true;
         }
         std::string aSuffix;
         if (needSuffix) {
           switch (aCurShapeType) {
-          case GeomAPI_Shape::VERTEX: aSuffix = "_v"; break;
-          case GeomAPI_Shape::EDGE:   aSuffix = "_e"; break;
-          case GeomAPI_Shape::FACE:   aSuffix = "_f"; break;
-          default: break;
+            case GeomAPI_Shape::VERTEX: aSuffix = "_v_" + std::to_string(myVIndex++); break;
+            case GeomAPI_Shape::EDGE:   aSuffix = "_e_" + std::to_string(myEIndex++); break;
+            case GeomAPI_Shape::FACE:   aSuffix = "_f_" + std::to_string(myFIndex++); break;
+            default: break;
+          }
+        }
+
+        std::vector<std::pair<TopoDS_Shape, TopoDS_Shape>> aKeepShapes, aMoveShapes;
+        if (isFoundDiffOld) {
+          // Found same new shape with different old shape.
+          if (aFoundTag >= THE_ANCHOR_TAG) {
+            // Found on separated tag.
+            aBuilderTag = aFoundTag; // Store it on the same tag.
+            isBuilt = false; // Don't change name;
+          } else {
+            // Found on previous tag.
+            if (aBuilderTag < THE_ANCHOR_TAG) {
+              // New shape shouls not be separated.
+              aBuilderTag = aFoundTag; // Store it on the same tag.
+              isBuilt = false; // Don't change name;
+            } else {
+              // New shape should be separated from others. Move shapes from found tag to new tag.
+              while (myBuilders.find(aBuilderTag) != myBuilders.end()) {
+                ++aBuilderTag;
+              }
+
+              TNaming_Builder* aFoundBuilder = myBuilders.at(aFoundTag);
+              Handle(TNaming_NamedShape) aFoundNamedShape = aFoundBuilder->NamedShape();
+              TDF_Label aFoundLabel = aFoundNamedShape->Label();
+              TNaming_Evolution anEvolution = aFoundNamedShape->Evolution();
+              for (TNaming_Iterator aNamingIt(aFoundNamedShape);
+                   aNamingIt.More();
+                   aNamingIt.Next())
+              {
+                std::pair<TopoDS_Shape, TopoDS_Shape> aShapesPair =
+                  std::make_pair(aNamingIt.OldShape(), aNamingIt.NewShape());
+                aNamingIt.NewShape().IsSame(aNewShape) ? aMoveShapes.push_back(aShapesPair)
+                                                       : aKeepShapes.push_back(aShapesPair);
+              }
+
+              aFoundNamedShape->Clear();
+              for (std::vector<std::pair<TopoDS_Shape, TopoDS_Shape>>::iterator aKeepIt =
+                     aKeepShapes.begin();
+                   aKeepIt != aKeepShapes.end();
+                   ++aKeepIt)
+              {
+                if (anEvolution == TNaming_GENERATED) {
+                  aFoundBuilder->Generated(aKeepIt->first, aKeepIt->second);
+                } else {
+                  aFoundBuilder->Modify(aKeepIt->first, aKeepIt->second);
+                }
+              }
+            }
+          }
+        } else if (aBuilderTag == THE_ANCHOR_TAG) {
+          while (myBuilders.find(aBuilderTag) != myBuilders.end()) {
+            ++aBuilderTag;
           }
         }
 
@@ -526,40 +638,59 @@ void Model_BodyBuilder::loadAndOrientModifiedShapes (
           // Here we store shapes as generated, to avoid problem when one parent shape produce
           // several child shapes. In this case naming could not determine which shape to select.
           builder(aBuilderTag)->Generated(aRoot, aNewShape);
+          for (std::vector<std::pair<TopoDS_Shape, TopoDS_Shape>>::iterator aMoveIt =
+               aMoveShapes.begin();
+               aMoveIt != aMoveShapes.end();
+               ++aMoveIt)
+          {
+            builder(aBuilderTag)->Generated(aMoveIt->first, aMoveIt->second);
+          }
         } else if (aNotInTree) {
           // not in tree -> store as primitive (stored as separated)
           builder(aBuilderTag)->Generated(aNewShape);
-        } else if (aNewShape.ShapeType() > aRoot.ShapeType()) {
-           // if lower-level type is produced, make it as generated
+        } else if (aCurShapeType != theKindOfShape) {
+           // if different shape type is produced, make it as generated
           builder(aBuilderTag)->Generated(aRoot, aNewShape);
         } else {
           builder(aBuilderTag)->Modify(aRoot, aNewShape);
+          for (std::vector<std::pair<TopoDS_Shape, TopoDS_Shape>>::iterator aMoveIt =
+               aMoveShapes.begin();
+               aMoveIt != aMoveShapes.end();
+               ++aMoveIt) {
+            builder(aBuilderTag)->Modify(aMoveIt->first, aMoveIt->second);
+          }
         }
         if(isBuilt) {
           aStream.str(std::string());
           aStream.clear();
           aStream << theName;
-          if(theIsStoreSeparate)
+          if (theIsStoreSeparate && !isFoundDiffOld)
              aStream << "_" << anIndex++;
 
           if (aSameParentShapes > 0) {
             aStream.str(std::string());
             aStream.clear();
-            aStream << aName << "_" << aSameParentShapes << "divided";
+            aStream << aName << "_" << "divided" << "_" << myDividedIndex++;
           }
 
           aStream << aSuffix;
           buildName(aBuilderTag, aStream.str());
         }
-        if(theIsStoreSeparate) {
+        if(theIsStoreSeparate && !isFoundDiffOld) {
           aTag++;
         }
       } else if (aResultShape->isSame(*anIt)) {
         // keep the modification evolution on the root level (2241 - history propagation issue)
-        if(theIsStoreAsGenerated) {
-          builder(0)->Generated(aRoot, aNewShape);
-        } else {
-          builder(0)->Modify(aRoot, aNewShape);
+        TNaming_Builder* aBuilder = builder(0);
+        TDF_Label aShapeLab = aBuilder->NamedShape()->Label();
+        Handle(TDF_Reference) aRef;
+        // Store only in case if it does not have reference.
+        if (!aShapeLab.FindAttribute(TDF_Reference::GetID(), aRef)) {
+          if (theIsStoreAsGenerated) {
+            builder(0)->Generated(aRoot, aNewShape);
+          } else {
+            builder(0)->Modify(aRoot, aNewShape);
+          }
         }
       }
     }
index 983c03a7564f5f7564d0e9a48c8641d721a1589a..2c8f563218b5d79836565dd06f1e70b6a962e629 100755 (executable)
@@ -153,6 +153,13 @@ private:
   /// builds name for the shape kept at the specified tag
   void buildName(const int theTag, const std::string& theName);
 
+private:
+  int myDividedIndex;
+  int myVIndex;
+  int myEIndex;
+  int myFIndex;
+
+private:
   friend class Model_ResultBody;
   friend class Model_ResultCompSolid;
 };
index 4a3be33be3ea5e00b83971b5a256d466aa2e8b82..bf50090ff81b1d754e1ebf21243199935216542d 100755 (executable)
@@ -154,12 +154,12 @@ def check_owner(selection, topology_type, feature):
 
 # check faces
 check_owner("Extrusion_1_1/Generated_Face_1", "face", aBox)
-check_owner("Fuse_1_1/Modified_Face_3", "face", aBox)
+check_owner("Fuse_1_1/Modified_Face_2", "face", aBox)
 check_owner("Cut_1_1/Modified_Face_1", "face", aHoleExt)
 check_owner("Fuse_1_1/Modified_Face_1", "face", aTower)
 # check edges without ambiguity
 check_owner("Fuse_1_1/Modified_Face_2&Extrusion_1_1/Generated_Face_2", "edge", aBox)
-check_owner("Fuse_1_1/Modified_Face_1&Extrusion_3_1/To_Face_1_1", "edge", aTower)
+check_owner("Fuse_1_1/Modified_Face_1&Extrusion_3_1/To_Face_1", "edge", aTower)
 
 # check the connected topology method: solid is not a compound of connected topology
 assert(aFuse.firstResult().shape().isConnectedTopology() == False)
index 9429879bc075d56943949ad1e50053edfbcc51d6..e52fec361983eaeb2da4b8bd01217d71fe8f1b1b 100644 (file)
@@ -107,7 +107,7 @@ model.do()
 Sketch_3.setName("Sketch_4")
 Sketch_3.result().setName("Sketch_4")
 ExtrusionCut_2 = model.addExtrusionCut(Part_1_doc, [model.selection("COMPOUND", "Sketch_4")], model.selection(), "h", 0, [model.selection("SOLID", "ExtrusionCut_1_1")])
-Fillet_1_objects = [model.selection("EDGE", "ExtrusionCut_2_1/Modfied_3&ExtrusionCut_2_1/Modfied_1divided_f_1"), model.selection("EDGE", "ExtrusionCut_2_1/Modfied_2&ExtrusionCut_2_1/Modfied_3"), model.selection("EDGE", "Extrusion_1_1/Generated_Face_2&ExtrusionCut_2_1/Modfied_3"), model.selection("EDGE", "ExtrusionCut_2_1/Modfied_5&Extrusion_1_1/Generated_Face_2"), model.selection("EDGE", "ExtrusionCut_2_1/Modfied_6&ExtrusionCut_2_1/Modfied_5"), model.selection("EDGE", "ExtrusionCut_2_1/Modfied_5&ExtrusionCut_2_1/Modfied_1divided_f_2"), model.selection("EDGE", "ExtrusionCut_2_1/Modfied_5&ExtrusionCut_1_1/Modfied_2"), model.selection("EDGE", "ExtrusionCut_2_1/Modfied_5&ExtrusionCut_1_1/Modfied_1"), model.selection("EDGE", "ExtrusionCut_1_1/Modfied_2&ExtrusionCut_2_1/Modfied_3"), model.selection("EDGE", "ExtrusionCut_1_1/Modfied_1&ExtrusionCut_2_1/Modfied_3"), model.selection("EDGE", "ExtrusionCut_1_1/Modfied_2&ExtrusionCut_2_1/Modfied_2"), model.selection("EDGE", "ExtrusionCut_2_1/Modfied_6&ExtrusionCut_1_1/Modfied_2"), model.selection("EDGE", "ExtrusionCut_2_1/Modfied_1divided_f_2&ExtrusionCut_1_1/Modfied_1"), model.selection("EDGE", "ExtrusionCut_1_1/Modfied_1&ExtrusionCut_2_1/Modfied_1divided_f_1"), model.selection("EDGE", "ExtrusionCut_2_1/Modfied_1divided_f_1&ExtrusionCut_2_1/Modfied_7"), model.selection("EDGE", "ExtrusionCut_2_1/Modfied_2&ExtrusionCut_2_1/Modfied_9")]
+Fillet_1_objects = [model.selection("EDGE", "ExtrusionCut_2_1/Modfied_3&ExtrusionCut_2_1/Modfied_divided_5_1"), model.selection("EDGE", "ExtrusionCut_2_1/Modfied_2&ExtrusionCut_2_1/Modfied_3"), model.selection("EDGE", "Extrusion_1_1/Generated_Face_2&ExtrusionCut_2_1/Modfied_3"), model.selection("EDGE", "ExtrusionCut_2_1/Modfied_5&Extrusion_1_1/Generated_Face_2"), model.selection("EDGE", "ExtrusionCut_2_1/Modfied_6&ExtrusionCut_2_1/Modfied_5"), model.selection("EDGE", "ExtrusionCut_2_1/Modfied_5&ExtrusionCut_2_1/Modfied_divided_4_1"), model.selection("EDGE", "ExtrusionCut_2_1/Modfied_5&ExtrusionCut_1_1/Modfied_2"), model.selection("EDGE", "ExtrusionCut_2_1/Modfied_5&ExtrusionCut_1_1/Modfied_1"), model.selection("EDGE", "ExtrusionCut_1_1/Modfied_2&ExtrusionCut_2_1/Modfied_3"), model.selection("EDGE", "ExtrusionCut_1_1/Modfied_1&ExtrusionCut_2_1/Modfied_3"), model.selection("EDGE", "ExtrusionCut_1_1/Modfied_2&ExtrusionCut_2_1/Modfied_2"), model.selection("EDGE", "ExtrusionCut_2_1/Modfied_6&ExtrusionCut_1_1/Modfied_2"), model.selection("EDGE", "ExtrusionCut_2_1/Modfied_divided_4_1&ExtrusionCut_1_1/Modfied_1"), model.selection("EDGE", "ExtrusionCut_1_1/Modfied_1&ExtrusionCut_2_1/Modfied_divided_5_1"), model.selection("EDGE", "ExtrusionCut_2_1/Modfied_divided_5_1&ExtrusionCut_2_1/Modfied_7"), model.selection("EDGE", "ExtrusionCut_2_1/Modfied_2&ExtrusionCut_2_1/Modfied_9")]
 Fillet_1 = model.addFillet(Part_1_doc, Fillet_1_objects, 2)
 Group_1_objects = [model.selection("FACE", "Fillet_1_1/Modified_Face_3"), model.selection("FACE", "Fillet_1_1/Modified_Face_5"), model.selection("FACE", "Fillet_1_1/Modified_Face_9"), model.selection("FACE", "Fillet_1_1/Modified_Face_15")]
 Group_1 = model.addGroup(Part_1_doc, Group_1_objects)
index 7cd30c2caa43552c4f5989e5430070f6734a9da9..921abf09a88dd17331ff83b9729f3050476881c3 100644 (file)
@@ -203,6 +203,8 @@ def testHaveNamingByType(theFeature, theModel, thePartDoc, theSubshapeType) :
   :param theFeature: feature to test.
   :param theSubshapeType: type of sub-shape
   """
+  if not theFeature.results():
+    return
   aFirstRes = theFeature.results()[0]
   # Get number of sub-results
   hasSubs = True