Salome HOME
0022761: [EDF] Improvement of Explode dialog box
authorova <ova@opencascade.com>
Tue, 14 Oct 2014 08:22:46 +0000 (12:22 +0400)
committervsr <vsr@opencascade.com>
Thu, 13 Nov 2014 13:01:25 +0000 (16:01 +0300)
doc/salome/gui/GEOM/images/flat_contents.png [new file with mode: 0644]
doc/salome/gui/GEOM/input/creating_explode.doc
idl/GEOM_Gen.idl
src/EntityGUI/EntityGUI_SubShapeDlg.cxx
src/EntityGUI/EntityGUI_SubShapeDlg.h
src/GEOMImpl/GEOMImpl_IShapesOperations.cxx
src/GEOMImpl/GEOMImpl_Types.hxx
src/GEOM_SWIG/geomBuilder.py

diff --git a/doc/salome/gui/GEOM/images/flat_contents.png b/doc/salome/gui/GEOM/images/flat_contents.png
new file mode 100644 (file)
index 0000000..7b5d385
Binary files /dev/null and b/doc/salome/gui/GEOM/images/flat_contents.png differ
index 1de29847ad4f599962e0e4d385d727f5b3f8f395..e3ae84893776131bb4b53a52eee059e943bb3d62 100644 (file)
@@ -2,49 +2,75 @@
 
 \page create_explode_page Explode
 
-\n To \b Explode an object into sub-shapes, in the <b>Main Menu</b>
-select <b>New Entity > Explode</b>.
+To \b Explode an object into sub-shapes, in the <b>Main Menu</b>
+select <b>New Entity > Explode</b>. This operation opens the
+<b>Sub Shapes Selection</b> dialog box.
 
-\n To create a list of  sub-shapes (vertices, edges, wires etc.) of the
+\image html neo-obj1.png
+
+To create a list of  sub-shapes (vertices, edges, wires etc.) of the
 given shape using the \b Explode operation, you need to define the <b>Main
 Object</b>, which will be exploded and the <b>Type of Sub-shapes</b> you wish to
 obtain from it.
-\n The \b Result of the operation will be a List of \b GEOM_Objects
+
+The \b Result of the operation will be a List of \b GEOM_Objects
 (vertexes, edges, wires, faces, shells or solids).
 
-\n Using <b>TUI Commands</b> you can perform this operation in a
+Available choices in the <b>Sub Shapes Type</b> combo box depend on the type
+of selected <b>Main Object</b>:
+- \b Compound: to extract compounds;
+- \b Compsolid: to extract compsolids;
+- \b Solid: to extract solids;
+- \b Shell: to extract shells;
+- \b Face: to extract faces;
+- \b Wire: to extract wires;
+- \b Edge: to extract edges;
+- \b Vertex: to extract vertices;
+- \b Shape: to extract top-level contents of the compound shape;
+- \b Flat: to extract "flat" contents of the compound shape.
+
+Note: "flat" contents means top-level simple-type sub-shapes extracted from
+the compound object recursively (i.e. there is no compounds in the result).
+For example, if a compound C1 contains a solid S1 and another compound C2 that
+contains solids S2 and S3 (see picture below):
+- Explode operation with \b Shape type given as parameter will return S1 and C2;
+- Explode operation with \b Flat type given as parameter will return S1, S2 and S3.
+
+\image html flat_contents.png
+
+Switching on <b>Select Sub-shapes</b> check box allows manual selection of sub-shapes
+to be extracted from the main object. In this mode the user can select sub-shapes
+directly in 3D viewer.
+
+Using <b>TUI Commands</b> you can perform this operation in a
 variety of ways:
-<ul>
-<li><em>geompy.ExtractShapes(Shape, Type, isSorted)</em> explodes a
-Shape into sub-shapes of a given Type and returns a List of sub-shapes.
-This method does not return the Shape itself if it matches the
-Type.</li>
-<li><em>geompy.SubShapeAll(Shape, Type)</em> explodes a Shape on
-sub-shapes of a given Type and returns a List of sub-shapes.</li>
-<li><em>geompy.SubShapeAllIDs(Shape, Type)</em> explodes a Shape on
-sub-shapes of a given Type and returns a List of IDs of
-sub-shapes.</li>
-<li><em>geompy.SubShapeAllSortedCentres(Shape, Type)</em> explodes a
-shape on sub-shapes of a given type and sorts them taking into account
-their gravity centers, to provide stable order of sub-shapes.
-It returns a list of sub-shapes.</li>
-<li><em>geompy.SubShapeAllSortedCentresIDs(Shape, Type)</em> explodes
-a shape on sub-shapes of a given type and sorts them taking into
-account their gravity centers, to provide stable order of sub-shapes.
-It returns a List of IDs of sub-shapes.</li>
-<li><em>geompy.SubShape(Shape, Type, ListOfInd)</em> allows to obtain
-a compound of sub-shapes of  the Shape,  selected by they indices in a
-list of all sub-shapes of the given Type. Each index is in the range
-[1, Nb_Sub-Shapes_Of_Given_Type].</li>
-<li><em>geompy.SubShapeSortedCentres(Shape, Type, ListOfInd)</em>
-allows to obtain a compound of sub-shapes of the Shape, selected by
-they indices in sorted list of all sub-shapes of the given Type. Each
-index is in the range [1, Nb_Sub-Shapes_Of_Given_Type]</li>
-</ul>
-
-\n <b>Arguments: </b>1 SHAPE + 1 type of SubShape.
+- <em>geompy.ExtractShapes(Shape, Type, isSorted)</em> explodes a
+  Shape into sub-shapes of a given Type and returns a List of sub-shapes.
+  This method does not return the Shape itself if it matches the
+  Type.
+- <em>geompy.SubShapeAll(Shape, Type)</em> explodes a Shape on
+  sub-shapes of a given Type and returns a List of sub-shapes.
+- <em>geompy.SubShapeAllIDs(Shape, Type)</em> explodes a Shape on
+  sub-shapes of a given Type and returns a List of IDs of
+  sub-shapes.
+- <em>geompy.SubShapeAllSortedCentres(Shape, Type)</em> explodes a
+  shape on sub-shapes of a given type and sorts them taking into account
+  their gravity centers, to provide stable order of sub-shapes.
+  It returns a list of sub-shapes.
+- <em>geompy.SubShapeAllSortedCentresIDs(Shape, Type)</em> explodes
+  a shape on sub-shapes of a given type and sorts them taking into
+  account their gravity centers, to provide stable order of sub-shapes.
+  It returns a List of IDs of sub-shapes.
+- <em>geompy.SubShape(Shape, Type, ListOfInd)</em> allows to obtain
+  a compound of sub-shapes of  the Shape,  selected by they indices in a
+  list of all sub-shapes of the given Type. Each index is in the range
+  [1, Nb_Sub-Shapes_Of_Given_Type].
+- <em>geompy.SubShapeSortedCentres(Shape, Type, ListOfInd)</em>
+  allows to obtain a compound of sub-shapes of the Shape, selected by
+  they indices in sorted list of all sub-shapes of the given Type. Each
+  index is in the range [1, Nb_Sub-Shapes_Of_Given_Type]
 
-\image html neo-obj1.png
+<b>Arguments: </b>1 SHAPE + 1 type of SubShape.
 
 <b>Example:</b>
 
index 72504d151a0e533ad900355cb6a407aabe5f5134..abf0b7347a0ec9cdc01162d559ac2cfe0a31adbc 100644 (file)
@@ -39,7 +39,7 @@ module GEOM
    */
   enum shape_type 
   { 
-    /*!  */
+    /*! A collection of arbitrary shapes */
     COMPOUND,
     /*! A collection of solids */ 
     COMPSOLID, 
@@ -47,16 +47,19 @@ module GEOM
     SOLID, 
     /*! A collection of faces connected by some edges of their wire boundaries */
     SHELL,
-    /*! Part of a plane (in 2D geometry) or a surface (in 3D geometry) bounded by a close wire */
+    /*! Part of a plane (in 2D geometry) or a surface (in 3D geometry) bounded by a closed wire */
     FACE, 
-    /*!  A sequence of edges connected by their vertices */
+    /*! A sequence of edges connected by their vertices */
     WIRE, 
     /*! Edge, a shape corresponding to a curve, and bound by a vertex at each extremity */
     EDGE, 
     /*! A zero-dimensional shape corresponding to a point in geometry */
     VERTEX,
-    /*!  */ 
-    SHAPE };
+    /*! Arbitrary shape in a Compound (used for processing of Compounds in some operations) */ 
+    SHAPE,
+    /*! Flat (top-level) contents of a Compound (used for processing of Compounds in some operations) */
+    FLAT
+    };
 
   /*!
    * \brief Marker type
index 667ddd30307ce720a3d6426ed78b44dbfccdd7f0..9e6114394fbc0f5183bb0073bb5b30ccb980a966 100644 (file)
 
 #include <GEOMImpl_Types.hxx>
 
+namespace
+{
+  const char* const ShapeTypes [] = {
+    "Compound",
+    "Compsolid",
+    "Solid",
+    "Shell",
+    "Face",
+    "Wire",
+    "Edge",
+    "Vertex",
+    "Shape",
+    "Flat"
+  };
+
+  unsigned int NumberOfSubShapes(const TopoDS_Shape& S, const int shapeType, TopTools_MapOfShape& M)
+  {
+    unsigned int index = 0;
+
+    if (!S.IsNull()) {
+      if (S.ShapeType() == TopAbs_COMPOUND &&
+          (shapeType == TopAbs_SHAPE || shapeType == TopAbs_FLAT || shapeType == TopAbs_COMPOUND)) {
+        TopoDS_Iterator It(S, Standard_True, Standard_True);
+        for (; It.More(); It.Next()) {
+          TopoDS_Shape SS = It.Value();
+          if (M.Add(SS)) {
+            if (shapeType == TopAbs_FLAT) {
+              if (SS.ShapeType() != TopAbs_COMPOUND)
+                index++;
+              else
+                index += NumberOfSubShapes(SS, shapeType, M);
+            }
+            else if (shapeType == TopAbs_SHAPE || shapeType == SS.ShapeType()) {
+              index++;
+            }
+          }
+        }
+      }
+      else {
+        TopExp_Explorer Exp (S, TopAbs_ShapeEnum(shapeType));
+        for (; Exp.More(); Exp.Next()) {
+          if (M.Add(Exp.Current())) {
+            index++;
+          }
+        }
+      }
+    }
+    return index;
+  }
+  unsigned int NumberOfSubShapes(const TopoDS_Shape& S, const int shapeType)
+  {
+    TopTools_MapOfShape M;
+    return NumberOfSubShapes(S, shapeType, M);
+  }
+}
+
 //=================================================================================
 // class    : EntityGUI_SubShapeDlg
 // purpose  : Constructs a EntityGUI_SubShapeDlg which is a child of 'parent', with the
@@ -66,7 +122,6 @@ EntityGUI_SubShapeDlg::EntityGUI_SubShapeDlg(GeometryGUI* theGeometryGUI, QWidge
                                               bool modal, Qt::WindowFlags fl)
   : GEOMBase_Skeleton(theGeometryGUI, parent, modal, fl),
     myDmMode( -1 ),
-    myWithShape(true),
     myIsHiddenMain(false)
 {
   QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_SUBSHAPE")));
@@ -133,18 +188,9 @@ void EntityGUI_SubShapeDlg::Init()
   myEditCurrentArgument = GroupPoints->LineEdit1;
   myObject = GEOM::GEOM_Object::_nil();
 
-  myWithShape = true;
-
   /* type for sub-shape selection */
-  GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Compound");
-  GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Compsolid");
-  GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Solid");
-  GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Shell");
-  GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Face");
-  GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Wire");
-  GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Edge");
-  GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Vertex");
-  GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Shape");
+  for ( int i = 0; i <= (int)GEOM::FLAT; i++ )
+    GroupPoints->ComboBox1->addItem(ShapeTypes[i], i);
 
   if (SUIT_Session::session()->activeApplication()->desktop()->activeWindow()->getViewManager()->getType()
       != OCCViewer_Viewer::Type())
@@ -172,6 +218,7 @@ void EntityGUI_SubShapeDlg::Init()
   updateButtonState();
   resize(100,100);
   SelectionIntoArgument();
+  SubShapeToggled();
 }
 
 //=================================================================================
@@ -282,6 +329,8 @@ void EntityGUI_SubShapeDlg::SelectionIntoArgument()
   if (!isAllSubShapes())
     return;
 
+  int currentType = GroupPoints->ComboBox1->itemData( GroupPoints->ComboBox1->currentIndex() ).toInt();
+
   ResetStateOfDialog();
 
   QString aString = ""; /* name of selection */
@@ -291,87 +340,47 @@ void EntityGUI_SubShapeDlg::SelectionIntoArgument()
   aSelMgr->selectedObjects(aSelList);
 
   int nbSel = GEOMBase::GetNameOfSelectedIObjects(aSelList, aString, true);
-  if (nbSel != 1)
-    return;
-
-  Handle(SALOME_InteractiveObject) IO = aSelList.First();
-  if (!IO->hasEntry()) {
-    SUIT_Session::session()->activeApplication()->putInfo(tr("GEOM_PRP_SHAPE_IN_STUDY"));
-    updateButtonState();
-    return;
-  }
-
-  if (myIsHiddenMain) {
-    GEOM_Displayer* aDisplayer = getDisplayer();
-    aDisplayer->Display(myObject);
-    myIsHiddenMain = false;
-  }
-
-  TopoDS_Shape S = GEOMBase::GetTopoFromSelection(aSelList);
-  if (S.IsNull() || S.ShapeType() == TopAbs_VERTEX) {
-    myObject = GEOM::GEOM_Object::_nil();
-    updateButtonState();
-    return;
-  }
-
-  myObject = GEOMBase::ConvertIOinGEOMObject(IO);
-  if (myObject->_is_nil()) {
-    updateButtonState();
-    return;
-  }
-
-  myShape = S;
-  GroupPoints->LineEdit1->setText(aString);
-
-  int SelectedShapeType = GroupPoints->ComboBox1->currentIndex();
-  int count = GroupPoints->ComboBox1->count();
-
-  if (myWithShape)
-    count = count - 1;
-
-  int i = 0;
-  // Solving PAL5590
-  if (myShape.ShapeType() == TopAbs_COMPOUND) {
-    unsigned int nb = NumberOfSubShapes(myShape, TopAbs_COMPOUND);
-    if (nb > 0)
-      i++;
-  }
-  while (i <= myShape.ShapeType()) {
-    GroupPoints->ComboBox1->removeItem(0);
-    i++;
-  }
-
-  if (myShape.ShapeType() == TopAbs_COMPOUND) {
-    if (myWithShape == false) {
-      GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Shape");
-      myWithShape = true;
-    }
-  }
-  else {
-    if (myWithShape == true) {
-      GroupPoints->ComboBox1->removeItem(GroupPoints->ComboBox1->count() - 1);
-      myWithShape = false;
+  if (nbSel == 1) {
+    Handle(SALOME_InteractiveObject) IO = aSelList.First();
+    if (!IO->hasEntry()) {
+      SUIT_Session::session()->activeApplication()->putInfo(tr("GEOM_PRP_SHAPE_IN_STUDY"));
     }
-  }
-
-  int count1 = GroupPoints->ComboBox1->count();
-  if (myWithShape)
-    count1 = count1 - 1;
-
-  if (SelectedShapeType > myShape.ShapeType()) {
-    if (SelectedShapeType == 8) {
-      if (myShape.ShapeType() != TopAbs_COMPOUND) {
-        GroupPoints->ComboBox1->setCurrentIndex(0);
-        ComboTextChanged();
+    else {
+      TopoDS_Shape S = GEOMBase::GetTopoFromSelection(aSelList);
+      if (S.IsNull() || S.ShapeType() == TopAbs_VERTEX) {
+        myObject = GEOM::GEOM_Object::_nil();
       }
-    }
-    else
-      GroupPoints->ComboBox1->setCurrentIndex(count1 - count + SelectedShapeType);
-  }
-  else {
-    GroupPoints->ComboBox1->setCurrentIndex(0);
-    ComboTextChanged();
-  }
+      else {
+        myObject = GEOMBase::ConvertIOinGEOMObject(IO);
+        if (!CORBA::is_nil(myObject)) {
+          myShape = S;
+          GroupPoints->LineEdit1->setText(aString);
+          int i = 0;
+          // Solving PAL5590
+          if (myShape.ShapeType() == TopAbs_COMPOUND) {
+            unsigned int nb = NumberOfSubShapes(myShape, TopAbs_COMPOUND);
+            if (nb > 0)
+              i++;
+          }
+          while (i <= myShape.ShapeType()) {
+            GroupPoints->ComboBox1->removeItem(0);
+            i++;
+          }
+          // remove Shape and Flat types for non-compound shapes
+          if (myShape.ShapeType() != TopAbs_COMPOUND) {
+            int idx = GroupPoints->ComboBox1->findData( (int)GEOM::SHAPE );
+            if ( idx != -1 ) GroupPoints->ComboBox1->removeItem( idx );
+            idx = GroupPoints->ComboBox1->findData( (int)GEOM::FLAT );
+            if ( idx != -1 ) GroupPoints->ComboBox1->removeItem( idx );
+          } // if (myShape.ShapeType() != TopAbs_COMPOUND)
+        } // if (!CORBA::is_nil(myObject))
+      } // if (S.IsNull() || S.ShapeType() == TopAbs_VERTEX)
+    } // if (!IO->hasEntry()) ... else
+  } // if (nbSel == 1)
+
+  int idx = GroupPoints->ComboBox1->findData( currentType );
+  if ( idx != -1 )
+    GroupPoints->ComboBox1->setCurrentIndex( idx );
 
   updateButtonState();
 }
@@ -420,29 +429,10 @@ void EntityGUI_SubShapeDlg::ResetStateOfDialog()
   myShape.Nullify();
   myEditCurrentArgument->setText("");
 
-  int SelectedShapeType = GroupPoints->ComboBox1->currentIndex();
-  int count = GroupPoints->ComboBox1->count();
-  if (myWithShape)
-    count = count - 1;
-
   /* type for sub-shape selection */
   GroupPoints->ComboBox1->clear();
-  GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Compound");
-  GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Compsolid");
-  GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Solid");
-  GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Shell");
-  GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Face");
-  GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Wire");
-  GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Edge");
-  GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Vertex");
-  GroupPoints->ComboBox1->insertItem(GroupPoints->ComboBox1->count(), "Shape");
-
-  myWithShape = true;
-
-  GroupPoints->ComboBox1->setCurrentIndex(8 - count + SelectedShapeType);
-
-  // to avoid recursion: SelectionIntoArgument->ResetStateOfDialog->ComboTextChanged->SubShapeToggled->activateSelection->(currentSelectionChanged)->SelectionIntoArgument
-  //ComboTextChanged();
+  for ( int i = 0; i <= (int)GEOM::FLAT; i++ )
+    GroupPoints->ComboBox1->addItem(ShapeTypes[i], i);
 
   updateButtonState();
 }
@@ -473,58 +463,22 @@ void EntityGUI_SubShapeDlg::ComboTextChanged()
 }
 
 //=================================================================================
-// function : NumberOfSubShapes()
+// function : updateButtonState
 // purpose  :
 //=================================================================================
-unsigned int EntityGUI_SubShapeDlg::NumberOfSubShapes(const TopoDS_Shape& S,
-                                                      const int shapeType) const
+void EntityGUI_SubShapeDlg::updateButtonState()
 {
-  if (S.IsNull())
-    return 0;
+  bool viewOk = SUIT_Session::session()->activeApplication()->desktop()->activeWindow()->getViewManager()->getType() == OCCViewer_Viewer::Type();
+  bool shapeTypeOk = shapeType() != TopAbs_SHAPE && shapeType() != TopAbs_FLAT && shapeType() != TopAbs_COMPOUND;
+  bool objectOK = !CORBA::is_nil( myObject );
 
-  unsigned int index = 0;
-  TopTools_MapOfShape M;
-
-  if (S.ShapeType() == TopAbs_COMPOUND &&
-       (TopAbs_ShapeEnum(shapeType) == TopAbs_SHAPE ||
-         TopAbs_ShapeEnum(shapeType) == TopAbs_COMPSOLID ||
-         TopAbs_ShapeEnum(shapeType) == TopAbs_COMPOUND)) {
-    TopoDS_Iterator It(S, Standard_True, Standard_True);
-    for (; It.More(); It.Next()) {
-      if (M.Add(It.Value())) {
-        if (TopAbs_ShapeEnum(shapeType) == TopAbs_SHAPE ||
-             TopAbs_ShapeEnum(shapeType) == It.Value().ShapeType()) {
-          index++;
-        }
-      }
-    }
+  if ( viewOk && objectOK && shapeTypeOk ) {
+    GroupPoints->CheckButton1->setEnabled( true );
   }
   else {
-    TopExp_Explorer Exp (S, TopAbs_ShapeEnum(shapeType));
-    for (; Exp.More(); Exp.Next()) {
-      if (M.Add(Exp.Current())) {
-        index++;
-      }
-    }
+    GroupPoints->CheckButton1->setChecked( false );
+    GroupPoints->CheckButton1->setEnabled( false );
   }
-
-  M.Clear();
-  return index;
-}
-
-//=================================================================================
-// function : updateButtonState
-// purpose  :
-//=================================================================================
-void EntityGUI_SubShapeDlg::updateButtonState()
-{
-  if (SUIT_Session::session()->activeApplication()->desktop()->activeWindow()->getViewManager()->getType() != OCCViewer_Viewer::Type() ||
-      myObject->_is_nil() || shapeType() == TopAbs_SHAPE || shapeType() == TopAbs_COMPOUND) {
-    GroupPoints->CheckButton1->setChecked(false);
-    GroupPoints->CheckButton1->setEnabled(false);
-  }
-  else
-    GroupPoints->CheckButton1->setEnabled(true);
 }
 
 //=================================================================================
@@ -533,7 +487,7 @@ void EntityGUI_SubShapeDlg::updateButtonState()
 //=================================================================================
 bool EntityGUI_SubShapeDlg::isAllSubShapes() const
 {
-  return !GroupPoints->CheckButton1->isChecked() || !GroupPoints->CheckButton1->isEnabled();
+  return !GroupPoints->CheckButton1->isEnabled() || !GroupPoints->CheckButton1->isChecked();
 }
 
 //=================================================================================
@@ -542,19 +496,7 @@ bool EntityGUI_SubShapeDlg::isAllSubShapes() const
 //=================================================================================
 int EntityGUI_SubShapeDlg::shapeType() const
 {
-  int type = GroupPoints->ComboBox1->currentIndex();
-
-  if (myObject->_is_nil())
-    return type;
-
-  // Solving PAL5590
-  type += myShape.ShapeType() + 1;
-  if (myShape.ShapeType() == TopAbs_COMPOUND &&
-      NumberOfSubShapes(myShape, TopAbs_COMPOUND) > 0) {
-    type--;
-  }
-
-  return type;
+  return GroupPoints->ComboBox1->itemData(GroupPoints->ComboBox1->currentIndex()).toInt();
 }
 
 //=================================================================================
index 14275c83effe1077fb3f5d6c13132c9628cd154c..56bb3311de7367ade3e90a762df9dc890e378221 100644 (file)
@@ -73,9 +73,6 @@ private:
 
   void                                ResetStateOfDialog();
 
-  unsigned int                        NumberOfSubShapes (const TopoDS_Shape&,
-                                                         const int) const;
-
   void                                activateSelection();
   int                                 getSelectedSubshapes (TColStd_IndexedMapOfInteger& theMapIndex);
   void                                updateButtonState();
@@ -87,8 +84,6 @@ private:
   GEOM::GEOM_Object_var               myObject;
   int                                 myDmMode;
 
-  bool                                myWithShape;
-
   bool                                myIsHiddenMain;
 
   DlgRef_1Sel1List1Check3Btn*         GroupPoints;
index a68e3dbc466385219c317fb5e0bb0d5e04cf6b5d..ae755770c146b9537df1b1ee9f941479f1dc6c7b 100644 (file)
 #include <Standard_Failure.hxx>
 #include <Standard_ErrorHandler.hxx> // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC
 
+namespace {
+
+  //================================================================================
+  /*!
+   * \brief Return normal to face at extrema point
+   */
+  //================================================================================
+
+  gp_Vec GetNormal (const TopoDS_Face& face, const BRepExtrema_DistShapeShape& extrema)
+  {
+    gp_Vec defaultNorm(1,0,0); // to have same normals on different faces
+    try {
+      // get UV at extrema point
+      Standard_Real u,v, f,l;
+      switch ( extrema.SupportTypeShape2(1) ) {
+      case BRepExtrema_IsInFace: {
+        extrema.ParOnFaceS2(1, u, v );
+        break;
+      }
+      case BRepExtrema_IsOnEdge: {
+        TopoDS_Edge edge = TopoDS::Edge( extrema.SupportOnShape2(1));
+        Handle(Geom2d_Curve) pcurve = BRep_Tool::CurveOnSurface( edge, face, f,l );
+        extrema.ParOnEdgeS2( 1, u );
+        gp_Pnt2d uv = pcurve->Value( u );
+        u = uv.Coord(1);
+        v = uv.Coord(2);
+        break;
+      }
+      case BRepExtrema_IsVertex: return defaultNorm;
+      }
+      // get derivatives
+      BRepAdaptor_Surface surface( face, false );
+      gp_Vec du, dv; gp_Pnt p;
+      surface.D1( u, v, p, du, dv );
+
+      return du ^ dv;
+
+    } catch (Standard_Failure ) {
+    }
+    return defaultNorm;
+  }
+
+  void AddFlatSubShapes(const TopoDS_Shape& S, TopTools_ListOfShape& L, TopTools_MapOfShape& M)
+  {
+    if (S.ShapeType() != TopAbs_COMPOUND) {
+      L.Append(S);
+    }
+    else {
+      TopoDS_Iterator It(S, Standard_True, Standard_True);
+      for (; It.More(); It.Next()) {
+       TopoDS_Shape SS = It.Value();
+       if (M.Add(SS))
+         AddFlatSubShapes(SS, L, M);
+      }
+    }
+  }
+}
 
 //=============================================================================
 /*!
@@ -1298,17 +1355,20 @@ Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::MakeExplode
   TopTools_ListOfShape listShape;
 
   if (aShape.ShapeType() == TopAbs_COMPOUND &&
-      (TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE ||
-       TopAbs_ShapeEnum(theShapeType) == TopAbs_COMPSOLID ||
-       TopAbs_ShapeEnum(theShapeType) == TopAbs_COMPOUND))
+      (theShapeType == TopAbs_SHAPE || theShapeType == TopAbs_FLAT || theShapeType == TopAbs_COMPOUND))
   {
     TopoDS_Iterator It (aShape, Standard_True, Standard_True);
     for (; It.More(); It.Next()) {
-      if (mapShape.Add(It.Value())) {
-        if (TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE ||
-            TopAbs_ShapeEnum(theShapeType) == It.Value().ShapeType()) {
-          listShape.Append(It.Value());
+      TopoDS_Shape SS = It.Value();
+      if (mapShape.Add(SS)) {
+       if (theShapeType == TopAbs_FLAT) {
+          AddFlatSubShapes(SS, listShape, mapShape);
+       }
+        else if (theShapeType == TopAbs_SHAPE || theShapeType == SS.ShapeType()) {
+         listShape.Append(SS);
         }
+        // VSR: for EXPLODE_NEW_INCLUDE_MAIN and EXPLODE_OLD_INCLUDE_MAIN:
+        // it seems it is necessary to add top-level shape if theShapeType == TopAbs_COMPOUND
       }
     }
   }
@@ -1320,7 +1380,7 @@ Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::MakeExplode
         listShape.Append(exp.Current());
   }
 
-  if (listShape.IsEmpty()) {
+  if (listShape.IsEmpty()){
     //SetErrorCode("The given shape has no sub-shapes of the requested type");
     SetErrorCode(NOT_FOUND_ANY); // NPAL18017
     return aSeq;
@@ -1364,16 +1424,15 @@ Handle(TColStd_HSequenceOfTransient) GEOMImpl_IShapesOperations::MakeExplode
       // Put this subshape in the list of sub-shapes of theMainShape
       aMainShape->AddSubShapeReference(aFunction);
     }
-
     if (!anObj.IsNull()) {
-      aSeq->Append(anObj);
+          aSeq->Append(anObj);
 
-      // for python command
-      TDF_Tool::Entry(anObj->GetEntry(), anEntry);
-      anAsciiList += anEntry;
-      anAsciiList += ",";
-    }
-  }
+          // for python command
+          TDF_Tool::Entry(anObj->GetEntry(), anEntry);
+          anAsciiList += anEntry;
+          anAsciiList += ",";
+        }
+      }
 
   //Make a Python command
   anAsciiList.Trunc(anAsciiList.Length() - 1);
@@ -1422,16 +1481,17 @@ Handle(TColStd_HSequenceOfInteger) GEOMImpl_IShapesOperations::SubShapeAllIDs
   TopTools_ListOfShape listShape;
 
   if (aShape.ShapeType() == TopAbs_COMPOUND &&
-      (TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE ||
-       TopAbs_ShapeEnum(theShapeType) == TopAbs_COMPSOLID ||
-       TopAbs_ShapeEnum(theShapeType) == TopAbs_COMPOUND))
+      (theShapeType == TopAbs_SHAPE || theShapeType == TopAbs_FLAT || theShapeType == TopAbs_COMPOUND))
   {
     TopoDS_Iterator It (aShape, Standard_True, Standard_True);
     for (; It.More(); It.Next()) {
-      if (mapShape.Add(It.Value())) {
-        if (TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE ||
-            TopAbs_ShapeEnum(theShapeType) == It.Value().ShapeType()) {
-          listShape.Append(It.Value());
+      TopoDS_Shape SS = It.Value();
+      if (mapShape.Add(SS)) {
+       if (theShapeType == TopAbs_FLAT) {
+          AddFlatSubShapes(SS, listShape, mapShape);
+       }
+        else if (theShapeType == TopAbs_SHAPE || theShapeType == SS.ShapeType()) {
+          listShape.Append(SS);
         }
       }
     }
@@ -1850,33 +1910,41 @@ Standard_Integer GEOMImpl_IShapesOperations::NumberOfSubShapes
   */
 
   try {
-    OCC_CATCH_SIGNALS;
-    int iType, nbTypes [TopAbs_SHAPE];
-    for (iType = 0; iType < TopAbs_SHAPE; ++iType)
-      nbTypes[iType] = 0;
-    nbTypes[aShape.ShapeType()]++;
-
-    TopTools_MapOfShape aMapOfShape;
-    aMapOfShape.Add(aShape);
-    TopTools_ListOfShape aListOfShape;
-    aListOfShape.Append(aShape);
-
-    TopTools_ListIteratorOfListOfShape itL (aListOfShape);
-    for (; itL.More(); itL.Next()) {
-      TopoDS_Iterator it (itL.Value());
-      for (; it.More(); it.Next()) {
-        TopoDS_Shape s = it.Value();
-        if (aMapOfShape.Add(s)) {
-          aListOfShape.Append(s);
-          nbTypes[s.ShapeType()]++;
+    if (theShapeType == TopAbs_FLAT) {
+      TopTools_MapOfShape aMapOfShape;
+      TopTools_ListOfShape aListOfShape;
+      AddFlatSubShapes(aShape, aListOfShape, aMapOfShape);
+      nbShapes = aListOfShape.Extent();
+    }
+    else {
+      OCC_CATCH_SIGNALS;
+      int iType, nbTypes [TopAbs_SHAPE];
+      for (iType = 0; iType < TopAbs_SHAPE; ++iType)
+        nbTypes[iType] = 0;
+      nbTypes[aShape.ShapeType()]++;
+      
+      TopTools_MapOfShape aMapOfShape;
+      aMapOfShape.Add(aShape);
+      TopTools_ListOfShape aListOfShape;
+      aListOfShape.Append(aShape);
+      
+      TopTools_ListIteratorOfListOfShape itL (aListOfShape);
+      for (; itL.More(); itL.Next()) {
+        TopoDS_Iterator it (itL.Value());
+        for (; it.More(); it.Next()) {
+          TopoDS_Shape s = it.Value();
+          if (aMapOfShape.Add(s)) {
+            aListOfShape.Append(s);
+            nbTypes[s.ShapeType()]++;
+          }
         }
       }
+      
+      if (TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE)
+        nbShapes = aMapOfShape.Extent();
+      else
+        nbShapes = nbTypes[theShapeType];
     }
-
-    if (TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE)
-      nbShapes = aMapOfShape.Extent();
-    else
-      nbShapes = nbTypes[theShapeType];
   }
   catch (Standard_Failure) {
     Handle(Standard_Failure) aFail = Standard_Failure::Caught();
@@ -3850,49 +3918,6 @@ void GEOMImpl_IShapesOperations::GetShapeProperties( const TopoDS_Shape aShape,
   return;
 }
 
-namespace {
-
-  //================================================================================
-  /*!
-   * \brief Return normal to face at extrema point
-   */
-  //================================================================================
-
-  gp_Vec GetNormal (const TopoDS_Face& face, const BRepExtrema_DistShapeShape& extrema)
-  {
-    gp_Vec defaultNorm(1,0,0); // to have same normals on different faces
-    try {
-      // get UV at extrema point
-      Standard_Real u,v, f,l;
-      switch ( extrema.SupportTypeShape2(1) ) {
-      case BRepExtrema_IsInFace: {
-        extrema.ParOnFaceS2(1, u, v );
-        break;
-      }
-      case BRepExtrema_IsOnEdge: {
-        TopoDS_Edge edge = TopoDS::Edge( extrema.SupportOnShape2(1));
-        Handle(Geom2d_Curve) pcurve = BRep_Tool::CurveOnSurface( edge, face, f,l );
-        extrema.ParOnEdgeS2( 1, u );
-        gp_Pnt2d uv = pcurve->Value( u );
-        u = uv.Coord(1);
-        v = uv.Coord(2);
-        break;
-      }
-      case BRepExtrema_IsVertex: return defaultNorm;
-      }
-      // get derivatives
-      BRepAdaptor_Surface surface( face, false );
-      gp_Vec du, dv; gp_Pnt p;
-      surface.D1( u, v, p, du, dv );
-
-      return du ^ dv;
-
-    } catch (Standard_Failure ) {
-    }
-    return defaultNorm;
-  }
-}
-
 //=============================================================================
 /*!
  *  case GetInPlace:
index d79349d3982a085c6cbcff3b1988bc0a2d68a669..556255ae846a512f6dd3382ae776d3fab19a49f8 100644 (file)
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 
+#ifndef GEOMImpl_Types_HXX
+#define GEOMImpl_Types_HXX
+
+#include <TopAbs_ShapeEnum.hxx>
 
 // GEOM_Object types
 
 #define USER_TYPE_EX 1000 // Base type for GEOM plugins
 
 
-//Plugins specified constants
+// Plugins specified constants
 #define PLUGIN_NAME "Plugin Name"
+
+// Flat type for TopAbs
+enum { TopAbs_FLAT = TopAbs_SHAPE+1 };
+
+#endif // GEOMImpl_Types_HXX
index a50216635d49227f13e461e0a4cfbb4ec0618636..08b4811eca89e9f55f8f8994b151d60288daeaec 100644 (file)
@@ -559,7 +559,7 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen):
         ## Enumeration ShapeType as a dictionary. \n
         ## Topological types of shapes (like Open Cascade types). See GEOM::shape_type for details.
         #  @ingroup l1_geomBuilder_auxiliary
-        ShapeType = {"AUTO":-1, "COMPOUND":0, "COMPSOLID":1, "SOLID":2, "SHELL":3, "FACE":4, "WIRE":5, "EDGE":6, "VERTEX":7, "SHAPE":8}
+        ShapeType = {"AUTO":-1, "COMPOUND":0, "COMPSOLID":1, "SOLID":2, "SHELL":3, "FACE":4, "WIRE":5, "EDGE":6, "VERTEX":7, "SHAPE":8, "FLAT":9}
 
         ## Kinds of shape in terms of <VAR>GEOM.GEOM_IKindOfShape.shape_kind</VAR> enumeration
         #  and a list of parameters, describing the shape.