From 110596005f7994cf088b68accec7f5f781727519 Mon Sep 17 00:00:00 2001 From: ova Date: Tue, 14 Oct 2014 12:22:46 +0400 Subject: [PATCH] 0022761: [EDF] Improvement of Explode dialog box --- doc/salome/gui/GEOM/images/flat_contents.png | Bin 0 -> 12018 bytes .../gui/GEOM/input/creating_explode.doc | 96 +++--- idl/GEOM_Gen.idl | 13 +- src/EntityGUI/EntityGUI_SubShapeDlg.cxx | 286 +++++++----------- src/EntityGUI/EntityGUI_SubShapeDlg.h | 5 - src/GEOMImpl/GEOMImpl_IShapesOperations.cxx | 205 +++++++------ src/GEOMImpl/GEOMImpl_Types.hxx | 11 +- src/GEOM_SWIG/geomBuilder.py | 2 +- 8 files changed, 309 insertions(+), 309 deletions(-) create mode 100644 doc/salome/gui/GEOM/images/flat_contents.png diff --git a/doc/salome/gui/GEOM/images/flat_contents.png b/doc/salome/gui/GEOM/images/flat_contents.png new file mode 100644 index 0000000000000000000000000000000000000000..7b5d3859ddd7941216b34f92a213fda5090a4723 GIT binary patch literal 12018 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 Menu -select New Entity > Explode. +To \b Explode an object into sub-shapes, in the Main Menu +select New Entity > Explode. This operation opens the +Sub Shapes Selection 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 Main Object, which will be exploded and the Type of Sub-shapes 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 TUI Commands you can perform this operation in a +Available choices in the Sub Shapes Type combo box depend on the type +of selected Main Object: +- \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 Select Sub-shapes 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 TUI Commands you can perform this operation in a variety of ways: -
    -
  • geompy.ExtractShapes(Shape, Type, isSorted) 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.
  • -
  • geompy.SubShapeAll(Shape, Type) explodes a Shape on -sub-shapes of a given Type and returns a List of sub-shapes.
  • -
  • geompy.SubShapeAllIDs(Shape, Type) explodes a Shape on -sub-shapes of a given Type and returns a List of IDs of -sub-shapes.
  • -
  • geompy.SubShapeAllSortedCentres(Shape, Type) 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.
  • -
  • geompy.SubShapeAllSortedCentresIDs(Shape, Type) 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.
  • -
  • geompy.SubShape(Shape, Type, ListOfInd) 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].
  • -
  • geompy.SubShapeSortedCentres(Shape, Type, ListOfInd) -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]
  • -
+- geompy.ExtractShapes(Shape, Type, isSorted) 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. +- geompy.SubShapeAll(Shape, Type) explodes a Shape on + sub-shapes of a given Type and returns a List of sub-shapes. +- geompy.SubShapeAllIDs(Shape, Type) explodes a Shape on + sub-shapes of a given Type and returns a List of IDs of + sub-shapes. +- geompy.SubShapeAllSortedCentres(Shape, Type) 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. +- geompy.SubShapeAllSortedCentresIDs(Shape, Type) 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. +- geompy.SubShape(Shape, Type, ListOfInd) 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]. +- geompy.SubShapeSortedCentres(Shape, Type, ListOfInd) + 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] -\n Arguments: 1 SHAPE + 1 type of SubShape. - -\image html neo-obj1.png +Arguments: 1 SHAPE + 1 type of SubShape. Example: diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 924550b10..aebe5357e 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -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 diff --git a/src/EntityGUI/EntityGUI_SubShapeDlg.cxx b/src/EntityGUI/EntityGUI_SubShapeDlg.cxx index 1b2060f3f..d17b41504 100644 --- a/src/EntityGUI/EntityGUI_SubShapeDlg.cxx +++ b/src/EntityGUI/EntityGUI_SubShapeDlg.cxx @@ -55,6 +55,62 @@ #include +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; + if (nbSel == 1) { + Handle(SALOME_InteractiveObject) IO = aSelList.First(); + if (!IO->hasEntry()) { + SUIT_Session::session()->activeApplication()->putInfo(tr("GEOM_PRP_SHAPE_IN_STUDY")); } - } - else { - if (myWithShape == true) { - GroupPoints->ComboBox1->removeItem(GroupPoints->ComboBox1->count() - 1); - myWithShape = false; - } - } - - 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(); } @@ -472,59 +462,23 @@ void EntityGUI_SubShapeDlg::ComboTextChanged() SubShapeToggled(); } -//================================================================================= -// function : NumberOfSubShapes() -// purpose : -//================================================================================= -unsigned int EntityGUI_SubShapeDlg::NumberOfSubShapes(const TopoDS_Shape& S, - const int shapeType) const -{ - if (S.IsNull()) - return 0; - - 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++; - } - } - } - } - else { - TopExp_Explorer Exp (S, TopAbs_ShapeEnum(shapeType)); - for (; Exp.More(); Exp.Next()) { - if (M.Add(Exp.Current())) { - index++; - } - } - } - - 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); + 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 ); + + if ( viewOk && objectOK && shapeTypeOk ) { + GroupPoints->CheckButton1->setEnabled( true ); + } + else { + 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(); } //================================================================================= diff --git a/src/EntityGUI/EntityGUI_SubShapeDlg.h b/src/EntityGUI/EntityGUI_SubShapeDlg.h index 14275c83e..56bb3311d 100644 --- a/src/EntityGUI/EntityGUI_SubShapeDlg.h +++ b/src/EntityGUI/EntityGUI_SubShapeDlg.h @@ -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; diff --git a/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx index 732d938e8..8dbb78b8b 100644 --- a/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx @@ -135,6 +135,63 @@ #include #include // 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: diff --git a/src/GEOMImpl/GEOMImpl_Types.hxx b/src/GEOMImpl/GEOMImpl_Types.hxx index 273ac2193..0281f6b00 100644 --- a/src/GEOMImpl/GEOMImpl_Types.hxx +++ b/src/GEOMImpl/GEOMImpl_Types.hxx @@ -20,6 +20,10 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // +#ifndef GEOMImpl_Types_HXX +#define GEOMImpl_Types_HXX + +#include // GEOM_Object types @@ -371,5 +375,10 @@ #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 diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py index f1968ee10..1fcdd3354 100644 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -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 GEOM.GEOM_IKindOfShape.shape_kind enumeration # and a list of parameters, describing the shape.