Salome HOME
Issue #532 - 4.13. Partition with splitting-arguments making solids with shared faces
authorspo <sergey.pokhodenko@opencascade.com>
Tue, 25 Aug 2015 05:55:08 +0000 (08:55 +0300)
committerspo <sergey.pokhodenko@opencascade.com>
Tue, 25 Aug 2015 05:56:35 +0000 (08:56 +0300)
16 files changed:
CMakeLists.txt
src/FeaturesPlugin/FeaturesPlugin_Partition.cpp
src/FeaturesPlugin/partition_widget.xml
src/GeomAlgoAPI/CMakeLists.txt
src/GeomAlgoAPI/GeomAlgoAPI_Partition.cpp [new file with mode: 0644]
src/GeomAlgoAPI/GeomAlgoAPI_Partition.h [new file with mode: 0644]
src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.cpp
src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.h
src/GeomAlgoImpl/CMakeLists.txt [new file with mode: 0644]
src/GeomAlgoImpl/GEOMAlgo_Splitter.cxx [new file with mode: 0755]
src/GeomAlgoImpl/GEOMAlgo_Splitter.hxx [new file with mode: 0644]
src/GeomAlgoImpl/GeomAlgoImpl.h [new file with mode: 0644]
test.squish/objects.map
test.squish/suite_ISSUES/tst_532/test.py [new file with mode: 0644]
test.squish/suite_ISSUES/tst_532/verificationPoints/VP_EXTRUSION [new file with mode: 0644]
test.squish/suite_ISSUES/tst_532/verificationPoints/VP_PARTITION [new file with mode: 0644]

index e24cc90e79a7943e4cca4d69fd4a554bae205503..1ac46e6910996d9e273bd9138784b261a7a4a4aa 100644 (file)
@@ -49,6 +49,7 @@ ADD_SUBDIRECTORY (src/Model)
 ADD_SUBDIRECTORY (src/ModelAPI)
 ADD_SUBDIRECTORY (src/GeomAPI)
 ADD_SUBDIRECTORY (src/GeomAlgoAPI)
+ADD_SUBDIRECTORY (src/GeomAlgoImpl)
 ADD_SUBDIRECTORY (src/GeomData)
 ADD_SUBDIRECTORY (src/GeomDataAPI)
 ADD_SUBDIRECTORY (src/PartSetPlugin)
index 284acd11863f87592599489e73932f6ce84873b2..362081c0bc879260d67041940c2fffc6ca28bc0b 100755 (executable)
 #include <ModelAPI_Session.h>
 #include <ModelAPI_Validator.h>
 
+#include <GeomAlgoAPI_Partition.h>
+#include <GeomAlgoAPI_MakeShapeList.h>
+#include <GeomAlgoAPI_ShapeTools.h>
+
 //=================================================================================================
 FeaturesPlugin_Partition::FeaturesPlugin_Partition()
 {
@@ -24,27 +28,28 @@ FeaturesPlugin_Partition::FeaturesPlugin_Partition()
 //=================================================================================================
 void FeaturesPlugin_Partition::initAttributes()
 {
-
-  AttributeSelectionListPtr aSelection = 
+  AttributeSelectionListPtr aSelection =
     std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(data()->addAttribute(
     FeaturesPlugin_Partition::OBJECT_LIST_ID(), ModelAPI_AttributeSelectionList::typeId()));
   aSelection->setSelectionType("SOLID");
 
-  aSelection = std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(data()->addAttribute(
+  aSelection =
+    std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(data()->addAttribute(
     FeaturesPlugin_Partition::TOOL_LIST_ID(), ModelAPI_AttributeSelectionList::typeId()));
   aSelection->setSelectionType("SOLID");
 
+  ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), OBJECT_LIST_ID());
   ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), TOOL_LIST_ID());
 }
 
 //=================================================================================================
 std::shared_ptr<GeomAPI_Shape> FeaturesPlugin_Partition::getShape(const std::string& theAttrName)
 {
-  std::shared_ptr<ModelAPI_AttributeReference> aObjRef = std::dynamic_pointer_cast<
-      ModelAPI_AttributeReference>(data()->attribute(theAttrName));
+  std::shared_ptr<ModelAPI_AttributeReference> aObjRef =
+      std::dynamic_pointer_cast<ModelAPI_AttributeReference>(data()->attribute(theAttrName));
   if (aObjRef) {
-    std::shared_ptr<ModelAPI_ResultBody> aConstr = std::dynamic_pointer_cast<
-        ModelAPI_ResultBody>(aObjRef->value());
+    std::shared_ptr<ModelAPI_ResultBody> aConstr =
+        std::dynamic_pointer_cast<ModelAPI_ResultBody>(aObjRef->value());
     if (aConstr)
       return aConstr->shape();
   }
@@ -54,4 +59,80 @@ std::shared_ptr<GeomAPI_Shape> FeaturesPlugin_Partition::getShape(const std::str
 //=================================================================================================
 void FeaturesPlugin_Partition::execute()
 {
+  ListOfShape anObjects, aTools;
+
+  // Getting objects.
+  AttributeSelectionListPtr anObjectsSelList = selectionList(FeaturesPlugin_Partition::OBJECT_LIST_ID());
+  for (int anObjectsIndex = 0; anObjectsIndex < anObjectsSelList->size(); anObjectsIndex++) {
+    std::shared_ptr<ModelAPI_AttributeSelection> anObjectAttr = anObjectsSelList->value(anObjectsIndex);
+    std::shared_ptr<GeomAPI_Shape> anObject = anObjectAttr->value();
+    if (!anObject.get()) {
+      return;
+    }
+    anObjects.push_back(anObject);
+  }
+
+  // Getting tools.
+  AttributeSelectionListPtr aToolsSelList = selectionList(FeaturesPlugin_Partition::TOOL_LIST_ID());
+  for (int aToolsIndex = 0; aToolsIndex < aToolsSelList->size(); aToolsIndex++) {
+    std::shared_ptr<ModelAPI_AttributeSelection> aToolAttr = aToolsSelList->value(aToolsIndex);
+    std::shared_ptr<GeomAPI_Shape> aTool = aToolAttr->value();
+    if (!aTool.get()) {
+      // it could be a construction plane
+      ResultPtr aContext = aToolAttr->context();
+      if (aContext.get()) {
+        aTool = GeomAlgoAPI_ShapeTools::faceToInfinitePlane(aContext->shape());
+      }
+    }
+    if (!aTool.get()) {
+      return;
+    }
+    aTools.push_back(aTool);
+  }
+
+  int aResultIndex = 0;
+
+  if (anObjects.empty() || aTools.empty()) {
+    std::string aFeatureError = "Not enough objects for partition operation";
+    setError(aFeatureError);
+    return;
+  }
+
+  // Cut each object with all tools
+  for (ListOfShape::iterator anObjectsIt = anObjects.begin(); anObjectsIt != anObjects.end(); anObjectsIt++) {
+    std::shared_ptr<GeomAPI_Shape> anObject = *anObjectsIt;
+    ListOfShape aListWithObject; aListWithObject.push_back(anObject);
+    GeomAlgoAPI_Partition aPartitionAlgo(aListWithObject, aTools);
+
+    // Checking that the algorithm worked properly.
+    if (!aPartitionAlgo.isDone()) {
+      static const std::string aFeatureError = "Partition algorithm failed";
+      setError(aFeatureError);
+      return;
+    }
+    if (aPartitionAlgo.shape()->isNull()) {
+      static const std::string aShapeError = "Resulting shape is Null";
+      setError(aShapeError);
+      return;
+    }
+    if (!aPartitionAlgo.isValid()) {
+      std::string aFeatureError = "Warning: resulting shape is not valid";
+      setError(aFeatureError);
+      return;
+    }
+
+    if (GeomAlgoAPI_ShapeTools::volume(aPartitionAlgo.shape()) > 1.e-7) {
+      std::shared_ptr<ModelAPI_ResultBody> aResultBody = document()->createBody(data(), aResultIndex);
+
+      aResultBody->store(aPartitionAlgo.shape());
+
+//      LoadNamingDS(aResultBody, anObject, aTools, aPartitionAlgo);
+
+      setResult(aResultBody, aResultIndex);
+      aResultIndex++;
+    }
+  }
+
+  // remove the rest results if there were produced in the previous pass
+  removeResults(aResultIndex);
 }
index e461210483a8a732649681e0e36fcf40f0d701bf..7358bdc5b019901baca58142acf6d9a023b72526 100755 (executable)
@@ -6,18 +6,18 @@
     icon=":icons/cut_shape.png"
     tooltip="Select a solid objects"
     type_choice="Solids"
-    use_choice="false"
     concealment="true">
     <validator id="PartSet_DifferentObjects"/>
-    <validator id="GeomValidators_ShapeType" parameters="empty,solid"/>
+    <validator id="GeomValidators_ShapeType" parameters="solid"/>
   </multi_selector>
   <multi_selector id="tool_objects" 
     label="Tool object" 
     icon=":icons/cut_tool.png" 
     tooltip="Select a tool face or solid"
-    type_choice="Faces"
+    type_choice="Faces Solids"
+    use_choice="false"
     concealment="true" >
     <validator id="PartSet_DifferentObjects"/>
-    <validator id="GeomValidators_ShapeType" parameters="empty,solid,plane"/>
+    <validator id="GeomValidators_ShapeType" parameters="solid,plane"/>
   </multi_selector>
 </source>
index 5b986ce0a86c305beefa9e1358985469751df4ba..4739f5025d2ca18b68ada9835733d331a5b6b5cd 100644 (file)
@@ -31,6 +31,7 @@ SET(PROJECT_HEADERS
     GeomAlgoAPI_IGESExport.h
     GeomAlgoAPI_Transform.h
     GeomAlgoAPI_ShapeTools.h
+    GeomAlgoAPI_Partition.h
 )
 
 SET(PROJECT_SOURCES
@@ -58,10 +59,12 @@ SET(PROJECT_SOURCES
     GeomAlgoAPI_IGESExport.cpp
     GeomAlgoAPI_Transform.cpp
     GeomAlgoAPI_ShapeTools.cpp
+    GeomAlgoAPI_Partition.cpp
 )
 
 SET(PROJECT_LIBRARIES
     GeomAPI
+    GeomAlgoImpl
     ModelAPI
     ${CAS_OCAF}
     ${CAS_SHAPE}
@@ -90,6 +93,7 @@ SET_SOURCE_FILES_PROPERTIES(GeomAlgoAPI.i PROPERTIES SWIG_DEFINITIONS "-shadow")
 
 INCLUDE_DIRECTORIES(
   ../GeomAPI
+  ../GeomAlgoImpl
   ../ModelAPI
   ${CAS_INCLUDE_DIRS}
 )
@@ -103,6 +107,7 @@ SET(SWIG_SCRIPTS
 SET(SWIG_LINK_LIBRARIES
   GeomAPI
   GeomAlgoAPI
+  GeomAlgoImpl
   ${PYTHON_LIBRARIES}
 )
 
diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Partition.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Partition.cpp
new file mode 100644 (file)
index 0000000..05bc5d2
--- /dev/null
@@ -0,0 +1,117 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
+// File:        GeomAlgoAPI_Partition.cpp
+// Created:     21 Aug 2015
+// Author:      Sergey POKHODENKO
+
+#include "GeomAlgoAPI_Partition.h"
+
+#include <GeomAlgoAPI_DFLoader.h>
+
+#include <GEOMAlgo_Splitter.hxx>
+
+#include <BRepCheck_Analyzer.hxx>
+#include <TopExp_Explorer.hxx>
+#include <TopTools_ListOfShape.hxx>
+
+//=================================================================================================
+std::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_Partition::make(const ListOfShape& theObjects,
+                                                           const ListOfShape& theTools)
+{
+  GeomAlgoAPI_Partition aBoolAlgo(theObjects, theTools);
+  if(aBoolAlgo.isDone() && !aBoolAlgo.shape()->isNull() && aBoolAlgo.isValid()) {
+    return aBoolAlgo.shape();
+  }
+  return std::shared_ptr<GeomAPI_Shape>();
+}
+
+//=================================================================================================
+GeomAlgoAPI_Partition::GeomAlgoAPI_Partition(const ListOfShape& theObjects,
+                                             const ListOfShape& theTools)
+: myDone(false),
+  myShape(new GeomAPI_Shape()),
+  myMap(new GeomAPI_DataMapOfShapeShape()),
+  myMkShape(new GeomAlgoAPI_MakeShape())
+{
+  build(theObjects, theTools);
+}
+
+
+//=================================================================================================
+void GeomAlgoAPI_Partition::build(const ListOfShape& theObjects,
+                                  const ListOfShape& theTools)
+{
+  if (theObjects.empty() || theTools.empty()) {
+    return;
+  }
+
+  // Creating partition operation.
+  GEOMAlgo_Splitter * anOperation = new GEOMAlgo_Splitter;
+  myMkShape->setImpl(anOperation);
+
+  // Getting objects.
+  TopTools_ListOfShape anObjects;
+  for (ListOfShape::const_iterator anObjectsIt = theObjects.begin(); anObjectsIt != theObjects.end(); anObjectsIt++) {
+    const TopoDS_Shape& aShape = (*anObjectsIt)->impl<TopoDS_Shape>();
+    anOperation->AddArgument(aShape);
+  }
+
+  // Getting tools.
+  TopTools_ListOfShape aTools;
+  for (ListOfShape::const_iterator aToolsIt = theTools.begin(); aToolsIt != theTools.end(); aToolsIt++) {
+    const TopoDS_Shape& aShape = (*aToolsIt)->impl<TopoDS_Shape>();
+    anOperation->AddTool(aShape);
+  }
+
+  // Building and getting result.
+  anOperation->Perform();
+  TopoDS_Shape aResult = anOperation->Shape();
+  myDone = !aResult.IsNull();
+  if (!myDone) {
+    return;
+  }
+
+  if(aResult.ShapeType() == TopAbs_COMPOUND) {
+    aResult = GeomAlgoAPI_DFLoader::refineResult(aResult);
+  }
+
+  // fill data map to keep correct orientation of sub-shapes
+  for (TopExp_Explorer Exp(aResult,TopAbs_FACE); Exp.More(); Exp.Next()) {
+    std::shared_ptr<GeomAPI_Shape> aCurrentShape(new GeomAPI_Shape());
+    aCurrentShape->setImpl(new TopoDS_Shape(Exp.Current()));
+    myMap->bind(aCurrentShape, aCurrentShape);
+  }
+  myShape->setImpl(new TopoDS_Shape(aResult));
+
+}
+
+//=================================================================================================
+const bool GeomAlgoAPI_Partition::isDone() const
+{
+  return myDone;
+}
+
+//=================================================================================================
+const bool GeomAlgoAPI_Partition::isValid() const
+{
+  BRepCheck_Analyzer aChecker(myShape->impl<TopoDS_Shape>());
+  return (aChecker.IsValid() == Standard_True);
+}
+
+//=================================================================================================
+const std::shared_ptr<GeomAPI_Shape>& GeomAlgoAPI_Partition::shape() const
+{
+  return myShape;
+}
+
+//=================================================================================================
+std::shared_ptr<GeomAPI_DataMapOfShapeShape> GeomAlgoAPI_Partition::mapOfShapes() const
+{
+  return myMap;
+}
+
+//=================================================================================================
+std::shared_ptr<GeomAlgoAPI_MakeShape> GeomAlgoAPI_Partition::makeShape() const
+{
+  return myMkShape;
+}
diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Partition.h b/src/GeomAlgoAPI/GeomAlgoAPI_Partition.h
new file mode 100644 (file)
index 0000000..39f69b5
--- /dev/null
@@ -0,0 +1,66 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
+// File:        GeomAlgoAPI_Partition.h
+// Created:     21 Aug 2015
+// Author:      Sergey POKHODENKO
+
+#ifndef GeomAlgoAPI_Partition_H_
+#define GeomAlgoAPI_Partition_H_
+
+#include <GeomAlgoAPI.h>
+#include <GeomAlgoAPI_MakeShape.h>
+
+#include <GeomAPI_Shape.h>
+#include <GeomAPI_Interface.h>
+#include <GeomAPI_DataMapOfShapeShape.h>
+
+#include <memory>
+
+/** \class GeomAlgoAPI_Partition
+ *  \ingroup DataAlgo
+ *  \brief Allows to perform of partition operations
+ */
+class GeomAlgoAPI_Partition : public GeomAPI_Interface
+{
+public:
+  /** \brief Creates common partition operation.
+   *  \param[in] theObjects the main shape.
+   *  \param[in] theTools  second shape.
+   *  \return a solid as result of operation.
+   */
+  GEOMALGOAPI_EXPORT static std::shared_ptr<GeomAPI_Shape> make(const ListOfShape& theObjects,
+                                                                const ListOfShape& theTools);
+
+  /// Constructor.
+  GEOMALGOAPI_EXPORT GeomAlgoAPI_Partition(const ListOfShape& theObjects,
+                                           const ListOfShape& theTools);
+
+  /// \return true if algorithm succeed.
+  GEOMALGOAPI_EXPORT const bool isDone() const;
+
+  /// \return true if resulting shape is valid.
+  GEOMALGOAPI_EXPORT const bool isValid() const;
+
+  /// \return result of the boolean algorithm.
+  GEOMALGOAPI_EXPORT const std::shared_ptr<GeomAPI_Shape>& shape() const;
+
+  /// \return map of sub-shapes of the result. To be used for History keeping.
+  GEOMALGOAPI_EXPORT std::shared_ptr<GeomAPI_DataMapOfShapeShape> mapOfShapes() const;
+
+  /// \return interface for for History processing.
+  GEOMALGOAPI_EXPORT std::shared_ptr<GeomAlgoAPI_MakeShape> makeShape() const;
+
+private:
+  /// Builds resulting shape.
+  void build(const ListOfShape& theObjects,
+             const ListOfShape& theTools);
+
+private:
+  /// Fields.
+  bool myDone;
+  std::shared_ptr<GeomAPI_Shape> myShape;
+  std::shared_ptr<GeomAPI_DataMapOfShapeShape> myMap;
+  std::shared_ptr<GeomAlgoAPI_MakeShape> myMkShape;
+};
+
+#endif
index 54835f857cccdaef0bd32fda7b64d5b399b1924a..39b06f92723b9cfe1ed4c8082a617234fd75ce5d 100644 (file)
@@ -8,15 +8,23 @@
 
 #include <GeomAlgoAPI_CompoundBuilder.h>
 
+#include <gp_Pln.hxx>
+
 #include <BOPTools.hxx>
+#include <BRepBuilderAPI_MakeFace.hxx>
 #include <BRepGProp.hxx>
 #include <BRepTools.hxx>
+#include <BRep_Tool.hxx>
+#include <Geom_Plane.hxx>
 #include <GProp_GProps.hxx>
 #include <NCollection_Vector.hxx>
 #include <TCollection_AsciiString.hxx>
 #include <TopoDS_Builder.hxx>
+#include <TopoDS_Face.hxx>
 #include <TopoDS_Shape.hxx>
 #include <TopoDS_Shell.hxx>
+#include <TopoDS.hxx>
+
 
 //=================================================================================================
 double GeomAlgoAPI_ShapeTools::volume(std::shared_ptr<GeomAPI_Shape> theShape)
@@ -159,3 +167,25 @@ void GeomAlgoAPI_ShapeTools::combineShapes(const std::shared_ptr<GeomAPI_Shape>
     theFreeShapes.push_back(aGeomShape);
   }
 }
+
+//=================================================================================================
+std::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_ShapeTools::faceToInfinitePlane(const std::shared_ptr<GeomAPI_Shape>& theFace)
+{
+  if (!theFace.get())
+    return std::shared_ptr<GeomAPI_Shape>();
+
+  TopoDS_Face aPlaneFace = TopoDS::Face(theFace->impl<TopoDS_Shape>());
+  if (aPlaneFace.IsNull())
+    return std::shared_ptr<GeomAPI_Shape>();
+
+  Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast(BRep_Tool::Surface(aPlaneFace));
+  if (aPlane.IsNull())
+    return std::shared_ptr<GeomAPI_Shape>();
+
+  // make an infinity face on the plane
+  TopoDS_Shape anInfiniteFace = BRepBuilderAPI_MakeFace(aPlane->Pln()).Shape();
+
+  std::shared_ptr<GeomAPI_Shape> aResult(new GeomAPI_Shape);
+  aResult->setImpl(new TopoDS_Shape(anInfiniteFace));
+  return aResult;
+}
index 009828dc78569ab1629343bb05667c3714d27c1c..fa792b2d66f0d79b3ab80e21c42b153e05f51ed2 100644 (file)
@@ -37,6 +37,11 @@ public:
                             const GeomAPI_Shape::ShapeType theType,
                             ListOfShape& theCombinedShapes,
                             ListOfShape& theFreeShapes);
+
+  /**
+   * Returns infinite plane received from theFace plane
+   */
+  static std::shared_ptr<GeomAPI_Shape> faceToInfinitePlane(const std::shared_ptr<GeomAPI_Shape>& theFace);
 };
 
 #endif
diff --git a/src/GeomAlgoImpl/CMakeLists.txt b/src/GeomAlgoImpl/CMakeLists.txt
new file mode 100644 (file)
index 0000000..ca33a76
--- /dev/null
@@ -0,0 +1,27 @@
+## Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
+
+SET(PROJECT_HEADERS
+    GeomAlgoImpl.h
+    GEOMAlgo_Splitter.hxx
+)
+
+SET(PROJECT_SOURCES
+    GEOMAlgo_Splitter.cxx
+)
+
+SET(PROJECT_LIBRARIES
+  ${CAS_SHAPE}
+)
+
+ADD_DEFINITIONS(-DGEOMALGOIMPL_EXPORTS ${CAS_DEFINITIONS})
+ADD_LIBRARY(GeomAlgoImpl SHARED ${PROJECT_SOURCES} ${PROJECT_HEADERS})
+
+INCLUDE_DIRECTORIES(
+  ${CAS_INCLUDE_DIRS}
+)
+
+TARGET_LINK_LIBRARIES(GeomAlgoImpl ${PROJECT_LIBRARIES})
+
+INSTALL(TARGETS GeomAlgoImpl DESTINATION bin)
diff --git a/src/GeomAlgoImpl/GEOMAlgo_Splitter.cxx b/src/GeomAlgoImpl/GEOMAlgo_Splitter.cxx
new file mode 100755 (executable)
index 0000000..4bbcf5c
--- /dev/null
@@ -0,0 +1,343 @@
+// Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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
+//
+
+// File:        GEOMAlgo_Splitter.cxx
+// Created:     Thu Sep 06 10:54:04 2012
+// Author:      Peter KURNEV
+//              <pkv@irinox>
+//
+
+#include <GEOMAlgo_Splitter.hxx>
+
+#include <TopAbs_ShapeEnum.hxx>
+
+#include <TopoDS_Shape.hxx>
+#include <TopoDS_Compound.hxx>
+#include <TopoDS_Iterator.hxx>
+
+#include <BRep_Builder.hxx>
+
+#include <BOPCol_MapOfShape.hxx>
+#include <BOPCol_ListOfShape.hxx>
+
+#include <BOPTools.hxx>
+
+
+static 
+  void TreatCompound(const TopoDS_Shape& aC, 
+                     BOPCol_ListOfShape& aLSX);
+
+//=======================================================================
+//function : 
+//purpose  : 
+//=======================================================================
+GEOMAlgo_Splitter::GEOMAlgo_Splitter()
+:
+  BOPAlgo_Builder(),
+  myTools(myAllocator),
+  myMapTools(100, myAllocator)
+{
+  myLimit=TopAbs_SHAPE;
+  myLimitMode=0;
+}
+//=======================================================================
+//function : 
+//purpose  : 
+//=======================================================================
+GEOMAlgo_Splitter::GEOMAlgo_Splitter
+  (const Handle(NCollection_BaseAllocator)& theAllocator)
+:
+  BOPAlgo_Builder(theAllocator),
+  myTools(myAllocator),
+  myMapTools(100, myAllocator)
+{
+  myLimit=TopAbs_SHAPE;
+  myLimitMode=0;
+}
+//=======================================================================
+//function : ~
+//purpose  : 
+//=======================================================================
+GEOMAlgo_Splitter::~GEOMAlgo_Splitter()
+{
+}
+//=======================================================================
+//function : AddTool
+//purpose  : 
+//=======================================================================
+void GEOMAlgo_Splitter::AddTool(const TopoDS_Shape& theShape)
+{
+  if (myMapTools.Add(theShape)) {
+    myTools.Append(theShape);
+    //
+    AddArgument(theShape);
+  }
+}
+//=======================================================================
+//function : Tools
+//purpose  : 
+//=======================================================================
+const BOPCol_ListOfShape& GEOMAlgo_Splitter::Tools()const
+{
+  return myTools;
+}
+//=======================================================================
+//function : SetLimit
+//purpose  : 
+//=======================================================================
+void GEOMAlgo_Splitter::SetLimit(const TopAbs_ShapeEnum aLimit) 
+{
+  myLimit=aLimit;
+}
+//=======================================================================
+//function : Limit
+//purpose  : 
+//=======================================================================
+TopAbs_ShapeEnum GEOMAlgo_Splitter::Limit()const
+{
+  return myLimit;
+}
+//=======================================================================
+//function : SetLimitMode
+//purpose  : 
+//=======================================================================
+void GEOMAlgo_Splitter::SetLimitMode(const Standard_Integer aMode)
+{
+  myLimitMode=aMode;
+}
+//=======================================================================
+//function : LimitMode
+//purpose  : 
+//=======================================================================
+Standard_Integer GEOMAlgo_Splitter::LimitMode()const
+{
+  return myLimitMode;
+}
+//=======================================================================
+//function : Clear
+//purpose  : 
+//=======================================================================
+void GEOMAlgo_Splitter::Clear()
+{
+  myTools.Clear();
+  myMapTools.Clear();
+  myLimit=TopAbs_SHAPE;
+  BOPAlgo_Builder::Clear();
+}
+//=======================================================================
+//function : BuildResult
+//purpose  : 
+//=======================================================================
+void GEOMAlgo_Splitter::BuildResult(const TopAbs_ShapeEnum theType)
+{
+  myErrorStatus=0;
+  //
+  TopAbs_ShapeEnum aType;
+  BRep_Builder aBB;
+  BOPCol_MapOfShape aM;
+  BOPCol_ListIteratorOfListOfShape aIt, aItIm;
+  //
+  aIt.Initialize(myArguments);
+  for (; aIt.More(); aIt.Next()) {
+    const TopoDS_Shape& aS=aIt.Value();
+    aType=aS.ShapeType();
+    if (aType==theType && !myMapTools.Contains(aS)) {
+      if (myImages.IsBound(aS)) {
+        const BOPCol_ListOfShape& aLSIm=myImages.Find(aS);
+        aItIm.Initialize(aLSIm);
+        for (; aItIm.More(); aItIm.Next()) {
+          const TopoDS_Shape& aSIm=aItIm.Value();
+          if (aM.Add(aSIm)) {
+            aBB.Add(myShape, aSIm);
+          }
+        }
+      }
+      else {
+        if (aM.Add(aS)) {
+          aBB.Add(myShape, aS);
+        }
+      }
+    }
+  }
+}
+//=======================================================================
+//function : PostTreat
+//purpose  : 
+//=======================================================================
+void GEOMAlgo_Splitter::PostTreat()
+{
+  if (myLimit!=TopAbs_SHAPE) {
+    Standard_Integer i, aNbS;
+    BRep_Builder aBB;
+    TopoDS_Compound aC;
+    BOPCol_IndexedMapOfShape aMx;
+    //
+    aBB.MakeCompound(aC);
+    //
+    BOPTools::MapShapes(myShape, myLimit, aMx);
+    aNbS=aMx.Extent();
+    for (i=1; i<=aNbS; ++i) {
+      const TopoDS_Shape& aS=aMx(i);
+      aBB.Add(aC, aS);
+    }
+    if (myLimitMode) {
+      Standard_Integer iType, iLimit, iTypeX;
+      TopAbs_ShapeEnum aType, aTypeX;
+      BOPCol_ListOfShape aLSP, aLSX;
+      BOPCol_ListIteratorOfListOfShape aIt, aItX, aItIm;
+      BOPCol_MapOfShape  aM;
+      //
+      iLimit=(Standard_Integer)myLimit; 
+      //
+      // 1. Collect the shapes to process aLSP
+      aIt.Initialize(myArguments);
+      for (; aIt.More(); aIt.Next()) {
+        const TopoDS_Shape& aS=aIt.Value();
+        if (myMapTools.Contains(aS)) {
+          continue;
+        }
+        //
+        aType=aS.ShapeType();
+        iType=(Standard_Integer)aType;
+        //
+        if (iType>iLimit) {
+          aLSP.Append(aS);
+        }
+        //
+        else if (aType==TopAbs_COMPOUND) {
+          aLSX.Clear();
+          //
+          TreatCompound(aS, aLSX);
+          //
+          aItX.Initialize(aLSX);
+          for (; aItX.More(); aItX.Next()) {
+            const TopoDS_Shape& aSX=aItX.Value();
+            aTypeX=aSX.ShapeType();
+            iTypeX=(Standard_Integer)aTypeX;
+            //
+            if (iTypeX>iLimit) {
+              aLSP.Append(aSX);
+            }
+          }
+        }
+      }// for (; aIt.More(); aIt.Next()) {
+      //
+      aMx.Clear();
+      BOPTools::MapShapes(aC, aMx);
+       // 2. Add them to aC
+      aIt.Initialize(aLSP);
+      for (; aIt.More(); aIt.Next()) {
+        const TopoDS_Shape& aS=aIt.Value();
+        if (myImages.IsBound(aS)) {
+          const BOPCol_ListOfShape& aLSIm=myImages.Find(aS);
+          aItIm.Initialize(aLSIm);
+          for (; aItIm.More(); aItIm.Next()) {
+            const TopoDS_Shape& aSIm=aItIm.Value();
+            if (aM.Add(aSIm)) {
+              if (!aMx.Contains(aSIm)) {
+                aBB.Add(aC, aSIm);
+              }
+            }
+          }
+        }
+        else {
+          if (aM.Add(aS)) {
+            if (!aMx.Contains(aS)) {
+              aBB.Add(aC, aS);
+            }
+          }
+        }
+      }
+    }// if (myLimitMode) {
+    myShape=aC;
+  }//if (myLimit!=TopAbs_SHAPE) {
+  //
+  Standard_Integer aNbS;
+  TopoDS_Iterator aIt;
+  BOPCol_ListOfShape aLS;
+  //
+  aIt.Initialize(myShape);
+  for (; aIt.More(); aIt.Next()) {
+    const TopoDS_Shape& aS=aIt.Value();
+    aLS.Append(aS);
+  }
+  aNbS=aLS.Extent();
+  if (aNbS==1) {
+    myShape=aLS.First();
+  }
+  //
+  BOPAlgo_Builder::PostTreat();
+}
+//=======================================================================
+//function : TreatCompound
+//purpose  : 
+//=======================================================================
+void TreatCompound(const TopoDS_Shape& aC1, 
+                   BOPCol_ListOfShape& aLSX)
+{
+  Standard_Integer aNbC1;
+  TopAbs_ShapeEnum aType;
+  BOPCol_ListOfShape aLC, aLC1;
+  BOPCol_ListIteratorOfListOfShape aIt, aIt1;
+  TopoDS_Iterator aItC;
+  //
+  aLC.Append (aC1);
+  while(1) {
+    aLC1.Clear();
+    aIt.Initialize(aLC);
+    for (; aIt.More(); aIt.Next()) {
+      const TopoDS_Shape& aC=aIt.Value(); //C is compound
+      //
+      aItC.Initialize(aC);
+      for (; aItC.More(); aItC.Next()) {
+        const TopoDS_Shape& aS=aItC.Value();
+        aType=aS.ShapeType();
+        if (aType==TopAbs_COMPOUND) {
+          aLC1.Append(aS);
+        }
+        else {
+          aLSX.Append(aS);
+        }
+      }
+    }
+    //
+    aNbC1=aLC1.Extent();
+    if (!aNbC1) {
+      break;
+    }
+    //
+    aLC.Clear();
+    aIt.Initialize(aLC1);
+    for (; aIt.More(); aIt.Next()) {
+      const TopoDS_Shape& aSC=aIt.Value();
+      aLC.Append(aSC);
+    }
+  }// while(1)
+}
+//
+// myErrorStatus
+// 
+// 0  - Ok
+// 1  - The object is just initialized
+// 2  - PaveFiller is failed
+// 10 - No shapes to process
+// 30 - SolidBuilder failed
diff --git a/src/GeomAlgoImpl/GEOMAlgo_Splitter.hxx b/src/GeomAlgoImpl/GEOMAlgo_Splitter.hxx
new file mode 100644 (file)
index 0000000..0796e55
--- /dev/null
@@ -0,0 +1,99 @@
+// Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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
+//
+//  File:   GEOMAlgo_Splitter.hxx
+//
+//  Author: Peter KURNEV
+
+#ifndef GEOMAlgo_Splitter_HeaderFile
+#define GEOMAlgo_Splitter_HeaderFile
+
+#include <GeomAlgoImpl.h>
+
+#include <Standard.hxx>
+#include <Standard_Macro.hxx>
+#include <Standard_Boolean.hxx>
+#include <Standard_Integer.hxx>
+
+#include <NCollection_BaseAllocator.hxx>
+
+#include <TopAbs_ShapeEnum.hxx>
+
+#include <TopoDS_Shape.hxx>
+
+#include <BOPCol_ListOfShape.hxx>
+#include <BOPCol_MapOfShape.hxx>
+
+#include <BOPAlgo_Builder.hxx>
+
+//=======================================================================
+//class    : GEOMAlgo_Splitter
+//purpose  :
+//=======================================================================
+class GEOMAlgo_Splitter : public BOPAlgo_Builder
+{
+ public:
+  
+  GEOMALGOIMPL_EXPORT
+    GEOMAlgo_Splitter();
+
+  GEOMALGOIMPL_EXPORT
+    GEOMAlgo_Splitter(const Handle(NCollection_BaseAllocator)& theAllocator);
+  
+  GEOMALGOIMPL_EXPORT
+    virtual ~GEOMAlgo_Splitter();
+
+  GEOMALGOIMPL_EXPORT
+    void AddTool(const TopoDS_Shape& theShape);
+
+  GEOMALGOIMPL_EXPORT
+    const BOPCol_ListOfShape& Tools()const;
+
+  GEOMALGOIMPL_EXPORT
+    void SetLimit(const TopAbs_ShapeEnum aLimit);
+
+  GEOMALGOIMPL_EXPORT
+    TopAbs_ShapeEnum Limit()const;
+
+  GEOMALGOIMPL_EXPORT
+    void SetLimitMode(const Standard_Integer aMode);
+
+  GEOMALGOIMPL_EXPORT
+    Standard_Integer LimitMode()const;
+
+  GEOMALGOIMPL_EXPORT
+    virtual void Clear();
+
+ protected:
+  GEOMALGOIMPL_EXPORT
+    virtual void BuildResult(const TopAbs_ShapeEnum theType);
+
+  GEOMALGOIMPL_EXPORT
+    virtual void PostTreat();
+  
+ protected:
+  BOPCol_ListOfShape myTools; 
+  BOPCol_MapOfShape myMapTools;        
+  TopAbs_ShapeEnum myLimit;   
+  Standard_Integer myLimitMode;  
+};
+
+#endif
diff --git a/src/GeomAlgoImpl/GeomAlgoImpl.h b/src/GeomAlgoImpl/GeomAlgoImpl.h
new file mode 100644 (file)
index 0000000..19b574b
--- /dev/null
@@ -0,0 +1,20 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
+#ifndef GEOMALGOIMPL_H
+#define GEOMALGOIMPL_H
+
+#if defined GEOMALGOIMPL_EXPORTS
+#if defined WIN32
+#define GEOMALGOIMPL_EXPORT              __declspec( dllexport )
+#else
+#define GEOMALGOIMPL_EXPORT
+#endif
+#else
+#if defined WIN32
+#define GEOMALGOIMPL_EXPORT              __declspec( dllimport )
+#else
+#define GEOMALGOIMPL_EXPORT
+#endif
+#endif
+
+#endif
index c8045e9179029e00b2e76604180c48ed3481a62a..958aae64b4bf4c9daaf249893587fdafad34ef32 100644 (file)
@@ -5,9 +5,11 @@
 :Application errors_XGUI_ErrorDialog   {type='XGUI_ErrorDialog' unnamed='1' visible='1' windowTitle='Application errors'}
 :Basic.Circle_AppElements_Button       {container=':Sketch.Basic_AppElements_MenuGroupPanel' text='Circle' type='AppElements_Button' unnamed='1' visible='1'}
 :Basic.Line_AppElements_Button {container=':Sketch.Basic_AppElements_MenuGroupPanel' text='Line' type='AppElements_Button' unnamed='1' visible='1'}
+:Basic.Plane_AppElements_Button        {container=':Construction.Basic_AppElements_MenuGroupPanel' text='Plane' type='AppElements_Button' unnamed='1' visible='1'}
 :Basic.Point_AppElements_Button        {container=':Sketch.Basic_AppElements_MenuGroupPanel' text='Point' type='AppElements_Button' unnamed='1' visible='1'}
 :Basic.Sketch_AppElements_Button       {container=':Sketch.Basic_AppElements_MenuGroupPanel' text='Sketch' type='AppElements_Button' unnamed='1' visible='1'}
 :Basic_QToolButton     {container=':Sketch.Basic_AppElements_MenuGroupPanel' occurrence='7' type='QToolButton' unnamed='1' visible='1'}
+:Boolean.Partition_AppElements_Button  {container=':Features.Boolean_AppElements_MenuGroupPanel' text='Partition' type='AppElements_Button' unnamed='1' visible='1'}
 :Center.X:_ModuleBase_ParamSpinBox     {container=':Circle.Center_QGroupBox' leftWidget=':Center.X:_QLabel' type='ModuleBase_ParamSpinBox' unnamed='1' visible='1'}
 :Center.X:_QLabel      {container=':Circle.Center_QGroupBox' text='X ' type='QLabel' unnamed='1' visible='1'}
 :Center.Y:_ModuleBase_ParamSpinBox     {container=':Circle.Center_QGroupBox' leftWidget=':Center.Y:_QLabel' type='ModuleBase_ParamSpinBox' unnamed='1' visible='1'}
@@ -24,6 +26,7 @@
 :Constraints.Perpendicular_AppElements_Button  {container=':Sketch.Constraints_AppElements_MenuGroupPanel' text='Perpendicular' type='AppElements_Button' unnamed='1' visible='1'}
 :Constraints.Radius_AppElements_Button {container=':Sketch.Constraints_AppElements_MenuGroupPanel' text='Radius' type='AppElements_Button' unnamed='1' visible='1'}
 :Constraints.Vertical_AppElements_Button       {container=':Sketch.Constraints_AppElements_MenuGroupPanel' text='Vertical' type='AppElements_Button' unnamed='1' visible='1'}
+:Construction.Basic_AppElements_MenuGroupPanel {container=':qt_tabwidget_stackedwidget.Construction_AppElements_Workbench' name='Basic' type='AppElements_MenuGroupPanel' visible='1'}
 :Default.Exit_AppElements_Button       {container=':General.Default_AppElements_MenuGroupPanel' text='Exit' type='AppElements_Button' unnamed='1' visible='1'}
 :Default.Open..._AppElements_Button    {container=':General.Default_AppElements_MenuGroupPanel' text='Open...' type='AppElements_Button' unnamed='1' visible='1'}
 :Default.Preferences_AppElements_Button        {container=':General.Default_AppElements_MenuGroupPanel' text='Preferences' type='AppElements_Button' unnamed='1' visible='1'}
@@ -74,6 +77,7 @@
 :Extrusion_ModuleBase_PageWidget       {container=':OpenParts*.Extrusion_XGUI_PropertyPanel' occurrence='2' type='ModuleBase_PageWidget' unnamed='1' visible='1'}
 :Extrusion_QToolButton {container=':OpenParts*.Extrusion_XGUI_PropertyPanel' occurrence='2' type='QToolButton' unnamed='1' visible='1'}
 :Extrusion_QToolButton_2       {container=':OpenParts*.Extrusion_XGUI_PropertyPanel' type='QToolButton' unnamed='1' visible='1'}
+:Features.Boolean_AppElements_MenuGroupPanel   {container=':qt_tabwidget_stackedwidget.Features_AppElements_Workbench' name='Boolean' type='AppElements_MenuGroupPanel' visible='1'}
 :Features.Extrusion_AppElements_MenuGroupPanel {container=':qt_tabwidget_stackedwidget.Features_AppElements_Workbench' name='Extrusion' type='AppElements_MenuGroupPanel' visible='1'}
 :Features_QScrollArea  {container=':qt_tabwidget_stackedwidget.Features_AppElements_Workbench' type='QScrollArea' unnamed='1' visible='1'}
 :General.Default_AppElements_MenuGroupPanel    {container=':OpenParts*.General_AppElements_DockWidget' name='Default' type='AppElements_MenuGroupPanel' visible='1'}
 :OpenParts*.Panning_QToolButton        {text='Panning' type='QToolButton' unnamed='1' visible='1' window=':OpenParts*_AppElements_MainWindow'}
 :OpenParts*.Parallel_XGUI_PropertyPanel        {name='property_panel_dock' type='XGUI_PropertyPanel' visible='1' window=':OpenParts*_AppElements_MainWindow' windowTitle='Parallel'}
 :OpenParts*.Parameter_XGUI_PropertyPanel       {name='property_panel_dock' type='XGUI_PropertyPanel' visible='1' window=':OpenParts*_AppElements_MainWindow' windowTitle='Parameter'}
+:OpenParts*.Partition_XGUI_PropertyPanel       {name='property_panel_dock' type='XGUI_PropertyPanel' visible='1' window=':OpenParts*_AppElements_MainWindow' windowTitle='Partition'}
 :OpenParts*.Perpendicular_XGUI_PropertyPanel   {name='property_panel_dock' type='XGUI_PropertyPanel' visible='1' window=':OpenParts*_AppElements_MainWindow' windowTitle='Perpendicular'}
+:OpenParts*.Plane_XGUI_PropertyPanel   {name='property_panel_dock' type='XGUI_PropertyPanel' visible='1' window=':OpenParts*_AppElements_MainWindow' windowTitle='Plane'}
 :OpenParts*.Point_XGUI_PropertyPanel   {name='property_panel_dock' type='XGUI_PropertyPanel' visible='1' window=':OpenParts*_AppElements_MainWindow' windowTitle='Point'}
 :OpenParts*.Reset_QToolButton  {text='Reset' type='QToolButton' unnamed='1' visible='1' window=':OpenParts*_AppElements_MainWindow'}
 :OpenParts*.Right_QToolButton  {text='Right' type='QToolButton' unnamed='1' visible='1' window=':OpenParts*_AppElements_MainWindow'}
 :Parameters.Parameter_AppElements_Button       {container=':Part.Parameters_AppElements_MenuGroupPanel' text='Parameter' type='AppElements_Button' unnamed='1' visible='1'}
 :Part.Operations_AppElements_MenuGroupPanel    {container=':qt_tabwidget_stackedwidget.Part_AppElements_Workbench' name='Operations' type='AppElements_MenuGroupPanel' visible='1'}
 :Part.Parameters_AppElements_MenuGroupPanel    {container=':qt_tabwidget_stackedwidget.Part_AppElements_Workbench' name='Parameters' type='AppElements_MenuGroupPanel' visible='1'}
+:Partition.Main objects_QLabel {container=':OpenParts*.Partition_XGUI_PropertyPanel' text='Main objects' type='QLabel' unnamed='1' visible='1'}
+:Partition.Main objects_QListWidget    {aboveWidget=':Partition.Main objects_QLabel' container=':OpenParts*.Partition_XGUI_PropertyPanel' type='QListWidget' unnamed='1' visible='1'}
+:Partition.Tool object_QLabel  {container=':OpenParts*.Partition_XGUI_PropertyPanel' text='Tool object' type='QLabel' unnamed='1' visible='1'}
+:Partition.Tool object_QListWidget     {aboveWidget=':Partition.Tool object_QLabel' container=':OpenParts*.Partition_XGUI_PropertyPanel' type='QListWidget' unnamed='1' visible='1'}
+:Partition.property_panel_ok_QToolButton       {container=':OpenParts*.Partition_XGUI_PropertyPanel' name='property_panel_ok' type='QToolButton' visible='1'}
 :Perpendicular.property_panel_cancel_QToolButton       {container=':OpenParts*.Perpendicular_XGUI_PropertyPanel' name='property_panel_cancel' type='QToolButton' visible='1'}
+:Plane.property_panel_ok_QToolButton   {container=':OpenParts*.Plane_XGUI_PropertyPanel' name='property_panel_ok' type='QToolButton' visible='1'}
 :Point.Point_QGroupBox {container=':OpenParts*.Point_XGUI_PropertyPanel' title='Point' type='QGroupBox' unnamed='1' visible='1'}
 :Point.X:_ModuleBase_ParamSpinBox      {container=':Point.Point_QGroupBox' leftWidget=':Point.X:_QLabel' type='ModuleBase_ParamSpinBox' unnamed='1' visible='1'}
 :Point.X:_QLabel       {container=':Point.Point_QGroupBox' text='X ' type='QLabel' unnamed='1' visible='1'}
 :_ModuleBase_ParamSpinBox      {type='ModuleBase_ParamSpinBox' unnamed='1' visible='1' window=':_QDialog'}
 :_QDialog      {type='QDialog' unnamed='1' visible='1'}
 :_QMenu        {type='QMenu' unnamed='1' visible='1'}
+:qt_tabwidget_stackedwidget.Construction_AppElements_Workbench {container=':General.qt_tabwidget_stackedwidget_QStackedWidget' name='Construction' type='AppElements_Workbench' visible='1'}
 :qt_tabwidget_stackedwidget.Features_AppElements_Workbench     {container=':General.qt_tabwidget_stackedwidget_QStackedWidget' name='Features' type='AppElements_Workbench' visible='1'}
 :qt_tabwidget_stackedwidget.Part_AppElements_Workbench {container=':General.qt_tabwidget_stackedwidget_QStackedWidget' name='Part' type='AppElements_Workbench' visible='1'}
 :qt_tabwidget_stackedwidget.Sketch_AppElements_Workbench       {container=':General.qt_tabwidget_stackedwidget_QStackedWidget' name='Sketch' type='AppElements_Workbench' visible='1'}
diff --git a/test.squish/suite_ISSUES/tst_532/test.py b/test.squish/suite_ISSUES/tst_532/test.py
new file mode 100644 (file)
index 0000000..4531dae
--- /dev/null
@@ -0,0 +1,38 @@
+def sketch():
+    clickButton(waitForObject(":Basic.Line_AppElements_Button"))
+    mouseClick(waitForObject(":OpenParts*_AppElements_ViewPort"), 230, 140, 0, Qt.LeftButton)
+    mouseClick(waitForObject(":OpenParts*_AppElements_ViewPort"), 128, 399, 0, Qt.LeftButton)
+    mouseClick(waitForObject(":OpenParts*_AppElements_ViewPort"), 307, 317, 0, Qt.LeftButton)
+    mouseClick(waitForObject(":OpenParts*_AppElements_ViewPort"), 473, 347, 0, Qt.LeftButton)
+    mouseClick(waitForObject(":OpenParts*_AppElements_ViewPort"), 230, 140, 0, Qt.LeftButton)
+
+def main():
+    source(findFile("scripts", "common.py"))
+    
+    startApplication("linux_run.sh")
+    set_defaults()
+    
+    sketch_create(help_points("XY_plane"), lambda: sketch())
+    
+    part_create()
+
+    extrusion_feature([(266, 251)], 10) # on the sketch
+
+    clickTab(waitForObject(":General.qt_tabwidget_tabbar_QTabBar"), "Construction")
+    clickButton(waitForObject(":Basic.Plane_AppElements_Button"))
+    type(waitForObject(":OpenParts*_AppElements_ViewPort"), "<Control>")
+    mouseDrag(waitForObject(":OpenParts*_AppElements_ViewPort"), 353, 364, -37, -171, 67108866, Qt.RightButton)
+    mouseClick(waitForObject(":OpenParts*_AppElements_ViewPort"), 274, 316, 0, Qt.LeftButton) # inner left face
+    clickButton(waitForObject(":Plane.property_panel_ok_QToolButton"))
+
+    test.vp("VP_EXTRUSION")
+    
+    clickTab(waitForObject(":General.qt_tabwidget_tabbar_QTabBar"), "Features")
+    clickButton(waitForObject(":Boolean.Partition_AppElements_Button"))
+    mouseClick(waitForObject(":Partition.Main objects_QListWidget"), 10, 10, 0, Qt.LeftButton)
+    mouseClick(waitForObject(":OpenParts*_AppElements_ViewPort"), 227, 263, 0, Qt.LeftButton) # extrusion object
+    mouseClick(waitForObject(":Partition.Tool object_QListWidget"), 10, 10, 0, Qt.LeftButton)
+    mouseClick(waitForObject(":OpenParts*_AppElements_ViewPort"), 212, 344, 0, Qt.LeftButton) # construction plane
+    clickButton(waitForObject(":Partition.property_panel_ok_QToolButton"))
+    
+    test.vp("VP_PARTITION")
diff --git a/test.squish/suite_ISSUES/tst_532/verificationPoints/VP_EXTRUSION b/test.squish/suite_ISSUES/tst_532/verificationPoints/VP_EXTRUSION
new file mode 100644 (file)
index 0000000..dd96f63
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<VerificationPoint version="4" type="Screenshot">
+ <Description/>
+ <Verification type="PNG" object=":OpenParts*_AppElements_ViewPort">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<Mask>
+   <Rect width="496" x="51" y="143" height="315" type="positive"/>
+  </Mask>
+  <Algorithm description="Strict mode" name="strict"/>
+ </Verification>
+</VerificationPoint>
diff --git a/test.squish/suite_ISSUES/tst_532/verificationPoints/VP_PARTITION b/test.squish/suite_ISSUES/tst_532/verificationPoints/VP_PARTITION
new file mode 100644 (file)
index 0000000..95cabc7
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<VerificationPoint version="4" type="Screenshot">
+ <Description/>
+ <Verification type="PNG" object=":OpenParts*_AppElements_ViewPort">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<Mask>
+   <Rect width="439" x="86" y="149" height="274" type="positive"/>
+  </Mask>
+  <Algorithm description="Strict mode" name="strict"/>
+ </Verification>
+</VerificationPoint>