From 00995421b180c4dd7673f79384a92d28d5c8e74d Mon Sep 17 00:00:00 2001 From: vsr Date: Thu, 13 Nov 2014 18:53:32 +0300 Subject: [PATCH] 0022767: [EDF] Construction of composite solids --- .../examples/topological_geom_objs_ex07.py | 46 +++++ doc/salome/gui/GEOM/images/neo-obj6.png | Bin 15148 -> 15271 bytes doc/salome/gui/GEOM/images/neo-obj6_2.png | Bin 0 -> 15703 bytes doc/salome/gui/GEOM/input/creating_solid.doc | 30 +++- .../GEOM/input/tui_topological_geom_objs.doc | 4 + idl/GEOM_Gen.idl | 9 + idl/GEOM_Superv.idl | 2 + resources/CMakeLists.txt | 1 + resources/GEOMCatalog.xml.in | 27 +++ resources/solid_from_faces.png | Bin 0 -> 1147 bytes src/BuildGUI/BuildGUI_SolidDlg.cxx | 168 ++++++++++++------ src/BuildGUI/BuildGUI_SolidDlg.h | 2 + src/GEOMGUI/GEOM_images.ts | 8 + src/GEOMGUI/GEOM_msg_en.ts | 16 ++ src/GEOMGUI/GEOM_msg_fr.ts | 16 ++ src/GEOMGUI/GEOM_msg_ja.ts | 16 ++ src/GEOMImpl/GEOMImpl_IShapes.hxx | 6 + src/GEOMImpl/GEOMImpl_IShapesOperations.cxx | 71 ++++++++ src/GEOMImpl/GEOMImpl_IShapesOperations.hxx | 3 + src/GEOMImpl/GEOMImpl_ShapeDriver.cxx | 80 ++++++--- src/GEOMImpl/GEOMImpl_Types.hxx | 2 +- src/GEOM_I/GEOM_IShapesOperations_i.cc | 34 ++++ src/GEOM_I/GEOM_IShapesOperations_i.hh | 3 + src/GEOM_I_Superv/GEOM_Superv_i.cc | 19 ++ src/GEOM_I_Superv/GEOM_Superv_i.hh | 3 +- src/GEOM_SWIG/GEOM_TestAll.py | 12 +- src/GEOM_SWIG/geomBuilder.py | 33 ++++ 27 files changed, 527 insertions(+), 84 deletions(-) create mode 100644 doc/salome/examples/topological_geom_objs_ex07.py mode change 100755 => 100644 doc/salome/gui/GEOM/images/neo-obj6.png create mode 100644 doc/salome/gui/GEOM/images/neo-obj6_2.png create mode 100644 resources/solid_from_faces.png diff --git a/doc/salome/examples/topological_geom_objs_ex07.py b/doc/salome/examples/topological_geom_objs_ex07.py new file mode 100644 index 000000000..f1e646a74 --- /dev/null +++ b/doc/salome/examples/topological_geom_objs_ex07.py @@ -0,0 +1,46 @@ +# Creation of a Solid(s) from connected faces + +import salome +salome.salome_init() +import GEOM +from salome.geom import geomBuilder +geompy = geomBuilder.New(salome.myStudy) +gg = salome.ImportComponentGUI("GEOM") + +# create a box +box = geompy.MakeBoxDXDYDZ(200, 200, 200) + +# make a copy of a box translated by X coordinate +box_translation = geompy.MakeTranslation(box, 200, 0, 0) + +# extract shells from boxes +box_shell = geompy.SubShapeAllSorted(box, geompy.ShapeType["SHELL"])[0] +box_translation_shell = geompy.SubShapeAllSorted(box_translation, geompy.ShapeType["SHELL"])[0] + +# extract faces from boxes +box_faces = geompy.SubShapeAllSorted(box, geompy.ShapeType["FACE"]) +box_translation_faces = geompy.SubShapeAllSorted(box_translation, geompy.ShapeType["FACE"]) + +# create solids from shells +msf_shells_noint = geompy.MakeSolidFromConnectedFaces([box_shell, box_translation_shell],0) +msf_shells_int = geompy.MakeSolidFromConnectedFaces([box_shell, box_translation_shell], 1) + +# create solids from faces +msf_faces_noint = geompy.MakeSolidFromConnectedFaces(box_faces+box_translation_faces, 0) +msf_faces_int = geompy.MakeSolidFromConnectedFaces(box_faces+box_translation_faces, 1) + +# add objects in the study +id_solid_shells_noint = geompy.addToStudy(msf_shells_noint,"Solid_from_shells_no_intersect") +id_solid_shells_int = geompy.addToStudy(msf_shells_int,"Solid_from_shells_intersect") +id_solid_faces_noint = geompy.addToStudy(msf_faces_noint,"Solid_from_faces_no_intersect") +id_solid_faces_int = geompy.addToStudy(msf_faces_int,"Solid_from_faces_intersect") + +# display the results +gg.createAndDisplayGO(id_solid_shells_noint) +gg.setDisplayMode(id_solid_shells_noint,1) +gg.createAndDisplayGO(id_solid_shells_int) +gg.setDisplayMode(id_solid_shells_int,1) +gg.createAndDisplayGO(id_solid_faces_noint) +gg.setDisplayMode(id_solid_faces_noint,1) +gg.createAndDisplayGO(id_solid_faces_int) +gg.setDisplayMode(id_solid_faces_int,1) diff --git a/doc/salome/gui/GEOM/images/neo-obj6.png b/doc/salome/gui/GEOM/images/neo-obj6.png old mode 100755 new mode 100644 index fd8af08117572689f65cccd752443a753fd9ce8b..9a38edaa19f0b0caafe7949b813ce8768224836d GIT binary patch literal 15271 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≈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 literal 15148 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¨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 Z9hcv2rGh>Lzk-FlkX4o`mVV>+e*nfoD1-n2 diff --git a/doc/salome/gui/GEOM/images/neo-obj6_2.png b/doc/salome/gui/GEOM/images/neo-obj6_2.png new file mode 100644 index 0000000000000000000000000000000000000000..8fac38f4e9af844591e5fd2a08b5e34fe9aab97d GIT binary patch literal 15703 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 z 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GEOM/input/creating_solid.doc b/doc/salome/gui/GEOM/input/creating_solid.doc index 48a05750e..3108535e8 100644 --- a/doc/salome/gui/GEOM/input/creating_solid.doc +++ b/doc/salome/gui/GEOM/input/creating_solid.doc @@ -2,24 +2,40 @@ \page create_solid_page Solid -\n To create a \b Solid in the Main Menu select New Entity - > Build - > +To create a \b Solid in the Main Menu select New Entity - > Build - > Solid. -You can create a \b Solid from a list of shells. +Firstly, you can create a \b Solid from a list of shells. The \b Result will be a \b GEOM_Object (SOLID). -\n TUI Command: geompy.MakeSolid(ListOfShape), where -ListOfShape is a list of shells from which the solid is constructed. -\n Arguments: Name + A closed shell or a list of closed shells. +TUI Command: geompy.MakeSolid(ListOfShape), where +\c ListOfShape is a list of shells from which the solid is constructed. + +Arguments: Name + A closed shell or a list of closed shells. \image html neo-obj6.png -\n Example: +Example: \image html solidsn.png "Solid" +Secondly, it is possible to create a \b Solid (or a compound of solids) from a list of +connected faces or shells. + +The \b Result will be a \b GEOM_Object (SOLID or COMPOUND). + +TUI Command: geompy.MakeSolidFromConnectedFaces(ListOfShape, isIntersect), where +\c ListOfShape is a list of faces and/or shells from which the solid is constructed and +\c isIntersect is a boolean flag which, when set to \c True, forces performing intersection +between arguments + +Arguments: Name + A set of connected faces and/or shells + Boolean flag. + +\image html neo-obj6_2.png + Our TUI Scripts provide you with useful examples of creation of -\ref tui_creation_solid "Advanced Geometric Objects". +\ref tui_creation_solid "Solid from shell" and +\ref tui_creation_solid_from_faces "Solid from connected faces". */ diff --git a/doc/salome/gui/GEOM/input/tui_topological_geom_objs.doc b/doc/salome/gui/GEOM/input/tui_topological_geom_objs.doc index 9576e47a8..b643ac9a6 100644 --- a/doc/salome/gui/GEOM/input/tui_topological_geom_objs.doc +++ b/doc/salome/gui/GEOM/input/tui_topological_geom_objs.doc @@ -22,6 +22,10 @@

Creation of a Solid

\tui_script{topological_geom_objs_ex05.py} +\anchor tui_creation_solid_from_faces +

Creation of a Solid from the set of connected faces

+\tui_script{topological_geom_objs_ex07.py} + \anchor tui_creation_compound

Creation of a Compound

\tui_script{topological_geom_objs_ex06.py} diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index abf0b7347..0b24f8c7d 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -1966,6 +1966,15 @@ module GEOM */ GEOM_Object MakeCompound (in ListOfGO theShapes); + /*! + * \brief Make a solid (or solids) from connected set of faces and/or shells. + * \param theFacesOrShells List of faces and/or shells. + * \param isIntersect If TRUE, forces performing intersections between arguments. + * + * \return New GEOM_Object, containing the created solid (or compound of solids). + */ + GEOM_Object MakeSolidFromConnectedFaces (in ListOfGO theFacesOrShells, in boolean isIntersect); + /*! * \brief Replace coincident faces in \a theShapes by one face. * \param theShapes Initial shapes. diff --git a/idl/GEOM_Superv.idl b/idl/GEOM_Superv.idl index 3bf0fea3f..4843422c5 100644 --- a/idl/GEOM_Superv.idl +++ b/idl/GEOM_Superv.idl @@ -395,6 +395,8 @@ module GEOM GEOM_Object MakeSolidShell (in GEOM_Object theShell) ; GEOM_Object MakeSolidShells (in GEOM_List theShells) ; GEOM_Object MakeCompound (in GEOM_List theShapes) ; + GEOM_Object MakeSolidFromConnectedFaces (in GEOM_List theFacesOrShells, + in boolean isIntersect); GEOM_Object MakeGlueFaces (in GEOM_Object theShape, in double theTolerance, in boolean doKeepNonSolids); diff --git a/resources/CMakeLists.txt b/resources/CMakeLists.txt index 7a6644562..d841d3612 100755 --- a/resources/CMakeLists.txt +++ b/resources/CMakeLists.txt @@ -169,6 +169,7 @@ SET( _res_files shapesonshape.png shared_shapes.png sketch.png + solid_from_faces.png sphere.png spheredxyz.png spherepoint.png diff --git a/resources/GEOMCatalog.xml.in b/resources/GEOMCatalog.xml.in index bb07e4de7..eeed1d6b1 100644 --- a/resources/GEOMCatalog.xml.in +++ b/resources/GEOMCatalog.xml.in @@ -4327,6 +4327,33 @@ + + MakeSolidFromConnectedFaces + SALOME team + @SALOMEGEOM_VERSION@ + unknown + 0 + + + theFacesOrShells + GEOM/GEOM_List + unknown + + + isIntersect + boolean + unknown + + + + + return + GEOM/GEOM_Object + unknown + + + + MakeCompound SALOME team diff --git a/resources/solid_from_faces.png b/resources/solid_from_faces.png new file mode 100644 index 0000000000000000000000000000000000000000..f3ce5329ee7a154ad0863b3d4c7bc64b483dc426 GIT binary patch literal 1147 zcmV->1cdvEP)2x~$7x@7D_dUd$(=XdBuOWm$DYdPr zQmHU9GBPtgJw4<5{%Ik^X5HU5or$98Y5&xzQ~Yt`gZF>9@GaxJRyg|1LGZ@0DurC4 zyMj+IPx0L)d+7OB&pzc=10qpSZws1H#(*fed*L&pn>R-RoDZkopz?NV|L(|Bi!^(~ z>>HDO{mTJlImG1n4rHO}B^go{IG%@6n$-5wxBpqLe{pgHnDBoNRynj}S|5M()~HK_ zRU6ozfU=3HFZ23=>%8>I5stp|C9Q6cm4?KtdNjfWtqq;4=Na;A>D&r*v z`W$d-P#FN_VG4~BmM{!)U6-MqJLpd=zVGAtDMe9WjiRx#yakNA_c%B?j9boO{M}eN zhY|CThB%H3xu#a@qYU{rxF3(~B)1-!c+;rkw$5L9>W#3VoBxD|}j zSexMlu(sCXx5Xy8Oz3r5U^Lb!%3P2qA+jg8fJIR-6m-ejOAP7-C?r-&+(IK8nra_} zVMsfyqh*3BQmob(U7}=yDRWeBxeHv`%;DUkEK6k*o5mwnNbp>An3CNvxI4gF%lh@p z=psdzIaq@=2CWM^3s(t(pcVwdku1w_thG3fb9iiQ?BdDSYLhq)vkN|hf#KTxD1l$2 z6|JMXt7`b+M}3Qr#ldkL4B-0x6nW12+^;LZBR;^16DQ8T^2EE7bIm2()d42lHG*h> zW4i>kd=CrH%@R#5`fjBHcYNYRkna^Zkw-7ogiqdr_Xsvy7DAjpK7O2Iyg*)BRLip5 zuH(c$-w$3wH)eVKs~2g9A@eup$ogVTsgYTV`^^NpDYw7nIF6BPhRPsRJxlGd%fRp+ z?p@LBE%tCLj)~{n-1Zje4t6L-j&G_Mtq{MjVO_lmbOEH4IMN}%Z7EWVxMfir7Ay#p zAf;p>U829;&tpSVsI)|8f=ZresourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_BUILD_SOLID" ) ) ); - QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) ); + QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) ); + QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_BUILD_SOLID" ) ) ); + QPixmap image2( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_SOLID_FROM_FACES" ) ) ); setWindowTitle( tr( "GEOM_SOLID_TITLE" ) ); /***************************************************************/ mainFrame()->GroupConstructors->setTitle( tr( "GEOM_SOLID" ) ); - mainFrame()->RadioButton1->setIcon( image0 ); - mainFrame()->RadioButton2->setAttribute( Qt::WA_DeleteOnClose ); - mainFrame()->RadioButton2->close(); + mainFrame()->RadioButton1->setIcon( image1 ); + mainFrame()->RadioButton2->setIcon( image2 ); mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose ); mainFrame()->RadioButton3->close(); GroupSolid = new DlgRef_1Sel1Check( centralWidget() ); - - GroupSolid->GroupBox1->setTitle( tr( "GEOM_ARGUMENTS" ) ); + GroupSolid->GroupBox1->setTitle( tr( "GEOM_SOLID_SHELLS" ) ); GroupSolid->TextLabel1->setText( tr( "GEOM_OBJECTS" ) ); GroupSolid->CheckButton1->setText( tr( "GEOM_CREATE_SINGLE_SOLID" ) ); - GroupSolid->PushButton1->setIcon( image1 ); + GroupSolid->PushButton1->setIcon( image0 ); GroupSolid->LineEdit1->setReadOnly( true ); + GroupFaces = new DlgRef_1Sel1Check( centralWidget() ); + GroupFaces->GroupBox1->setTitle( tr( "GEOM_SOLID_FACES" ) ); + GroupFaces->TextLabel1->setText( tr( "GEOM_OBJECTS" ) ); + GroupFaces->CheckButton1->setText( tr( "GEOM_SOLID_FROM_FACE_OPT" ) ); + GroupFaces->PushButton1->setIcon( image0 ); + GroupFaces->LineEdit1->setReadOnly( true ); + QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); layout->setMargin( 0 ); layout->setSpacing( 6 ); layout->addWidget( GroupSolid ); + layout->addWidget( GroupFaces ); /***************************************************************/ setHelpFileName("create_solid_page.html"); @@ -118,7 +125,10 @@ void BuildGUI_SolidDlg::Init() connect( buttonOk(), SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); + connect(this, SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int))); + connect( GroupSolid->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); + connect( GroupFaces->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); connect( GroupSolid->CheckButton1, SIGNAL( toggled( bool ) ), this, SLOT( EnableNameField( bool ) ) ); connect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(), @@ -126,6 +136,8 @@ void BuildGUI_SolidDlg::Init() initName( tr( "GEOM_SOLID" ) ); SelectionIntoArgument(); + + ConstructorsClicked(0); } @@ -150,9 +162,45 @@ bool BuildGUI_SolidDlg::ClickOnApply() return false; initName(); + + myEditCurrentArgument->setText(""); + ConstructorsClicked(getConstructorId()); + return true; } +//================================================================================= +// function : ConstructorsClicked() +// purpose : Radio button management +//================================================================================= +void BuildGUI_SolidDlg::ConstructorsClicked(int constructorId) +{ + switch (constructorId) { + case 0: + { + globalSelection(); + GroupFaces->hide(); + GroupSolid->show(); + myEditCurrentArgument = GroupSolid->LineEdit1; + GroupSolid->LineEdit1->setText(""); + break; + } + case 1: + { + globalSelection(); + GroupSolid->hide(); + GroupFaces->show(); + myEditCurrentArgument = GroupFaces->LineEdit1; + GroupFaces->LineEdit1->setText(""); + break; + } + } + + qApp->processEvents(); + updateGeometry(); + resize(minimumSizeHint()); + SelectionIntoArgument(); +} //================================================================================= // function : SelectionIntoArgument() @@ -164,7 +212,10 @@ void BuildGUI_SolidDlg::SelectionIntoArgument() //myShells = getSelected( TopAbs_SHELL, -1 ); QList types; + if (myEditCurrentArgument == GroupSolid->LineEdit1) types << TopAbs_SHELL << TopAbs_COMPOUND; + else if (myEditCurrentArgument == GroupFaces->LineEdit1) + types << TopAbs_FACE << TopAbs_SHELL << TopAbs_COMPOUND; myShells = getSelected( types, -1 ); if ( !myShells.isEmpty() ) { @@ -180,18 +231,25 @@ void BuildGUI_SolidDlg::SelectionIntoArgument() void BuildGUI_SolidDlg::SetEditCurrentArgument() { QPushButton* send = (QPushButton*)sender(); - if ( send != GroupSolid->PushButton1 ) - return; - //globalSelection( GEOM_SHELL ); TColStd_MapOfInteger aMap; - aMap.Add( GEOM_SHELL ); - aMap.Add( GEOM_COMPOUNDFILTER ); QList aSubShapes; - aSubShapes.append( GEOM_SHELL ); - globalSelection( aMap, aSubShapes ); + aMap.Add( GEOM_COMPOUNDFILTER ); - myEditCurrentArgument = GroupSolid->LineEdit1; + if (send == GroupSolid->PushButton1) { + aMap.Add( GEOM_SHELL ); + aSubShapes.append( GEOM_SHELL ); + globalSelection( aMap, aSubShapes ); + myEditCurrentArgument = GroupSolid->LineEdit1; + } + else if (send == GroupFaces->PushButton1) { + aMap.Add( GEOM_SHELL ); + aMap.Add( GEOM_FACE ); + aSubShapes.append( GEOM_SHELL ); + aSubShapes.append( GEOM_FACE ); + globalSelection( aMap, aSubShapes ); + myEditCurrentArgument = GroupFaces->LineEdit1; + } myEditCurrentArgument->setFocus(); SelectionIntoArgument(); @@ -205,16 +263,10 @@ void BuildGUI_SolidDlg::SetEditCurrentArgument() void BuildGUI_SolidDlg::ActivateThisDialog() { GEOMBase_Skeleton::ActivateThisDialog(); - connect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(), - SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); - //globalSelection( GEOM_SHELL ); - TColStd_MapOfInteger aMap; - aMap.Add( GEOM_SHELL ); - aMap.Add( GEOM_COMPOUNDFILTER ); - QList aSubShapes; - aSubShapes.append( GEOM_SHELL ); - globalSelection( aMap, aSubShapes ); + ConstructorsClicked(getConstructorId()); } @@ -257,15 +309,14 @@ bool BuildGUI_SolidDlg::isValid (QString& msg) GEOM::MeasureOpPtr anOp; anOp.take(myGeomGUI->GetGeomGen()->GetIMeasureOperations(getStudyId())); - - if (!GroupSolid->CheckButton1->isChecked() || myShells.count() == 1) { - for (int i = 0, n = myShells.count(); i < n && ok; i++) { - CORBA::String_var aRes = anOp->IsGoodForSolid(myShells[i].get()); - if (strlen(aRes.in())) { - msg = QObject::tr(aRes.in()).arg(GEOMBase::GetName(myShells[i].get())); - ok = false; - } - } + if (getConstructorId() == 0 && (!GroupSolid->CheckButton1->isChecked() || myShells.count() == 1)) { + for (int i = 0, n = myShells.count(); i < n && ok; i++) { + CORBA::String_var aRes = anOp->IsGoodForSolid(myShells[i].get()); + if (strlen(aRes.in())) { + msg = QObject::tr(aRes.in()).arg(GEOMBase::GetName(myShells[i].get())); + ok = false; + } + } } return ok; } @@ -315,24 +366,41 @@ bool BuildGUI_SolidDlg::isClosed( GEOM::GEOM_Object_ptr shell ) bool BuildGUI_SolidDlg::execute( ObjectList& objects ) { GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow( getOperation() ); + GEOM::GEOM_Object_var anObj; + + switch (getConstructorId()) { + case 0: + { + if ( GroupSolid->CheckButton1->isChecked() ) { + GEOM::ListOfGO_var objlist = new GEOM::ListOfGO(); + objlist->length( myShells.count() ); + for ( int i = 0; i < myShells.count(); i++ ) + objlist[i] = myShells[i].copy(); + + anObj = anOper->MakeSolidShells( objlist.in() ); + + if ( !anObj->_is_nil() ) objects.push_back( anObj._retn() ); + } + else { + for ( int i = 0, n = myShells.count(); i< n; i++ ){ + anObj = anOper->MakeSolidShell( myShells[ i ].get() ); + + if ( !anObj->_is_nil() ) objects.push_back( anObj._retn() ); + } + } + break; + } + case 1: + { + GEOM::ListOfGO_var objlist = new GEOM::ListOfGO(); + objlist->length( myShells.count() ); + for ( int i = 0; i < myShells.count(); i++ ) + objlist[i] = myShells[i].copy(); - if ( GroupSolid->CheckButton1->isChecked() ) { - GEOM::ListOfGO_var objlist = new GEOM::ListOfGO(); - objlist->length( myShells.count() ); - for ( int i = 0; i < myShells.count(); i++ ) - objlist[i] = myShells[i].copy(); - - GEOM::GEOM_Object_var anObj = anOper->MakeSolidShells( objlist.in() ); - - if ( !anObj->_is_nil() ) - objects.push_back( anObj._retn() ); - } - else { - for ( int i = 0, n = myShells.count(); i< n; i++ ) { - GEOM::GEOM_Object_var anObj = anOper->MakeSolidShell( myShells[ i ].get() ); + anObj = anOper->MakeSolidFromConnectedFaces( objlist.in(), GroupFaces->CheckButton1->isChecked() ); - if ( !anObj->_is_nil() ) - objects.push_back( anObj._retn() ); + if ( !anObj->_is_nil() ) objects.push_back( anObj._retn() ); + break; } } diff --git a/src/BuildGUI/BuildGUI_SolidDlg.h b/src/BuildGUI/BuildGUI_SolidDlg.h index 6be374c6f..7a70f085a 100644 --- a/src/BuildGUI/BuildGUI_SolidDlg.h +++ b/src/BuildGUI/BuildGUI_SolidDlg.h @@ -59,12 +59,14 @@ private: QList myShells; DlgRef_1Sel1Check* GroupSolid; + DlgRef_1Sel1Check* GroupFaces; private slots: void ClickOnOk(); bool ClickOnApply(); void SetEditCurrentArgument(); void SelectionIntoArgument(); + void ConstructorsClicked( int ); void ActivateThisDialog(); void EnableNameField( bool ); }; diff --git a/src/GEOMGUI/GEOM_images.ts b/src/GEOMGUI/GEOM_images.ts index 67ed0460e..c8c70c163 100644 --- a/src/GEOMGUI/GEOM_images.ts +++ b/src/GEOMGUI/GEOM_images.ts @@ -175,6 +175,10 @@ ICON_DLG_BUILD_SHELL build_shell.png + + ICON_DLG_SOLID_FROM_FACES + solid_from_faces.png + ICON_DLG_BUILD_SOLID build_solid.png @@ -1267,6 +1271,10 @@ ICO_SOLID build_solid.png + + ICO_SOLID_FROM_FACES + solid_from_face.png + ICO_SOLID_SEL_ONLY build_solid.png diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index a3de0e031..27690e1f5 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -707,6 +707,10 @@ Please, select face, shell or solid and try again GEOM_FACE_OPT Try to create a planar face + + GEOM_SOLID_FROM_FACE_OPT + Intersect shapes + MAKE_FACE_TOLERANCE_TOO_BIG Cannot build a planar face: required tolerance is @@ -1944,6 +1948,14 @@ Please, select face, shell or solid and try again GEOM_SOLID_TITLE Solid Construction + + GEOM_SOLID_SHELLS + Make Solid From Shells + + + GEOM_SOLID_FACES + Make Solid From Connected Set Of Faces/Shells + GEOM_SPHERE Sphere @@ -3004,6 +3016,10 @@ Please, select face, shell or solid and try again MEN_SOLID Solid + + MEN_SOLID_FROM_FACES + Solid from connected faces + MEN_SOLID_SEL_ONLY Solid diff --git a/src/GEOMGUI/GEOM_msg_fr.ts b/src/GEOMGUI/GEOM_msg_fr.ts index 45f12ad4f..037d015c5 100644 --- a/src/GEOMGUI/GEOM_msg_fr.ts +++ b/src/GEOMGUI/GEOM_msg_fr.ts @@ -723,6 +723,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau GEOM_FACE_OPT Privilégier la création d'une face plane + + GEOM_SOLID_FROM_FACE_OPT + Intersect shapes + MAKE_FACE_TOLERANCE_TOO_BIG Impossible de construire une face plane: @@ -1944,6 +1948,14 @@ Choisissez une face, une coque ou un solide et essayez de nouveau GEOM_SOLID_TITLE Construction d'un solide + + GEOM_SOLID_SHELLS + Make Solid From Shells + + + GEOM_SOLID_FACES + Make Solid From Connected Set Of Faces/Shells + GEOM_SPHERE Sphère @@ -2988,6 +3000,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau MEN_SOLID Solide + + MEN_SOLID_FROM_FACES + Solid from connected faces + MEN_SOLID_SEL_ONLY Solide diff --git a/src/GEOMGUI/GEOM_msg_ja.ts b/src/GEOMGUI/GEOM_msg_ja.ts index f68d1c4b9..65c9fcd45 100644 --- a/src/GEOMGUI/GEOM_msg_ja.ts +++ b/src/GEOMGUI/GEOM_msg_ja.ts @@ -703,6 +703,10 @@ GEOM_FACE_OPT 平らなフェースを作成 + + GEOM_SOLID_FROM_FACE_OPT + Intersect shapes + MAKE_FACE_TOLERANCE_TOO_BIG 平坦な面を作成できません: 作成された顔があまりにも高い耐性 @@ -1923,6 +1927,14 @@ GEOM_SOLID_TITLE ソリッドの構築 + + GEOM_SOLID_SHELLS + Make Solid From Shells + + + GEOM_SOLID_FACES + Make Solid From Connected Set Of Faces/Shells + GEOM_SPHERE Sphere @@ -2971,6 +2983,10 @@ MEN_SOLID ソリッド + + MEN_SOLID_FROM_FACES + Solid from connected faces + MEN_SOLID_SEL_ONLY ソリッド diff --git a/src/GEOMImpl/GEOMImpl_IShapes.hxx b/src/GEOMImpl/GEOMImpl_IShapes.hxx index a43024b78..54357bef6 100644 --- a/src/GEOMImpl/GEOMImpl_IShapes.hxx +++ b/src/GEOMImpl/GEOMImpl_IShapes.hxx @@ -36,6 +36,7 @@ class GEOMImpl_IShapes SHAPE_ARG_SHAPES = 1, // for Wire, Shell, Solid and Compound SHAPE_ARG_BASE = 2, // for Face, Solid and Sub-shape SHAPE_ARG_PLANAR = 3, // for Face + SHAPE_ARG_INTERSECT = 3, // for Solid From Connected Faces (NOTE: same value as SHAPE_ARG_PLANAR is used!) SHAPE_ARG_SUBTYPE = 4, // for Sub-shape SHAPE_ARG_INDICES = 5, // for Sub-shape SHAPE_ARG_TOLERANCE = 6, // linear tolerance (for Wire, Edge) @@ -81,6 +82,11 @@ class GEOMImpl_IShapes Standard_Real GetAngularTolerance() { return _func->GetReal(SHAPE_ARG_ANGLE_TOL); } + void SetIsIntersect(const Standard_Boolean isIntersect) + {_func->SetInteger(SHAPE_ARG_INTERSECT, isIntersect ? 1 : 0);} + + Standard_Boolean GetIsIntersect() { return (_func->GetInteger(SHAPE_ARG_INTERSECT) == 1); } + private: Handle(GEOM_Function) _func; diff --git a/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx index ae755770c..da8445efc 100644 --- a/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx @@ -782,6 +782,77 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeShape return aShape; } +//============================================================================= +/*! + * MakeSolidFromConnectedFaces + */ +//============================================================================= +Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeSolidFromConnectedFaces + (std::list theFacesOrShells, + const Standard_Boolean isIntersect) +{ + SetErrorCode(KO); + + //Add a new object + Handle(GEOM_Object) aSolid = GetEngine()->AddObject(GetDocID(), GEOM_SOLID); + + //Add a new function + Handle(GEOM_Function) aFunction = + aSolid->AddFunction(GEOMImpl_ShapeDriver::GetID(), SOLID_FACES); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ShapeDriver::GetID()) return NULL; + + GEOMImpl_IShapes aCI (aFunction); + + Handle(TColStd_HSequenceOfTransient) aShapesSeq = new TColStd_HSequenceOfTransient; + + // Shapes + std::list::iterator it = theFacesOrShells.begin(); + for (; it != theFacesOrShells.end(); it++) { + Handle(GEOM_Function) aRefSh = (*it)->GetLastFunction(); + if (aRefSh.IsNull()) { + SetErrorCode("NULL argument shape for the shape construction"); + return NULL; + } + aShapesSeq->Append(aRefSh); + } + aCI.SetShapes(aShapesSeq); + aCI.SetIsIntersect(isIntersect); + + //Compute the shape + try { + OCC_CATCH_SIGNALS; + if (!GetSolver()->ComputeFunction(aFunction)) { + SetErrorCode("Shape driver failed"); + return NULL; + } + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return NULL; + } + + //Make a Python command + GEOM::TPythonDump pd (aFunction); + pd << aSolid << " = geompy.MakeSolidFromConnectedFaces(["; + + // Shapes + it = theFacesOrShells.begin(); + if (it != theFacesOrShells.end()) { + pd << (*it++); + while (it != theFacesOrShells.end()) { + pd << ", " << (*it++); + } + } + pd << "]," << (isIntersect ? "True" : "False") << ")"; + + SetErrorCode(OK); + return aSolid; +} + //============================================================================= /*! * MakeGlueFaces diff --git a/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx b/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx index 025646331..dca4233a9 100644 --- a/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx @@ -95,6 +95,9 @@ class GEOMImpl_IShapesOperations : public GEOM_IOperations Standard_EXPORT Handle(GEOM_Object) MakeCompound (std::list theShapes); + Standard_EXPORT Handle(GEOM_Object) MakeSolidFromConnectedFaces (std::list theFacesOrShells, + const Standard_Boolean isIntersect); + Standard_EXPORT Handle(GEOM_Object) MakeGlueFaces (std::list< Handle(GEOM_Object) >& theShapes, const Standard_Real theTolerance, const Standard_Boolean doKeepNonSolids); diff --git a/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx b/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx index c220237e9..9e8f83b06 100644 --- a/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx @@ -98,6 +98,11 @@ #include #include +#include +#include + +#include + //modified by NIZNHY-PKV Wed Dec 28 13:48:20 2011f //static // void KeepEdgesOrder(const Handle(TopTools_HSequenceOfShape)& aEdges, @@ -137,12 +142,12 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const TopoDS_Shape aShape; TCollection_AsciiString aWarning; - TopAbs_ShapeEnum anExpectedType = TopAbs_SHAPE; + std::list anExpectedType; BRep_Builder B; if (aType == WIRE_EDGES) { - anExpectedType = TopAbs_WIRE; + anExpectedType.push_back(TopAbs_WIRE); Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); @@ -153,7 +158,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const aShape = MakeWireFromEdges(aShapes, aTolerance); } else if (aType == FACE_WIRE) { - anExpectedType = TopAbs_FACE; + anExpectedType.push_back(TopAbs_FACE); Handle(GEOM_Function) aRefBase = aCI.GetBase(); TopoDS_Shape aShapeBase = aRefBase->GetValue(); @@ -188,7 +193,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const } } else if (aType == FACE_WIRES) { - anExpectedType = TopAbs_FACE; + anExpectedType.push_back(TopAbs_FACE); // Try to build a face from a set of wires and edges int ind; @@ -310,9 +315,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const } } else if (aType == FACE_FROM_SURFACE) { -#ifdef RESULT_TYPE_CHECK - anExpectedType = TopAbs_FACE; -#endif + anExpectedType.push_back(TopAbs_FACE); Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); @@ -348,7 +351,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const } } else if (aType == SHELL_FACES) { - anExpectedType = TopAbs_SHELL; + anExpectedType.push_back(TopAbs_SHELL); Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); unsigned int ind, nbshapes = aShapes->Length(); @@ -407,7 +410,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const } else if (aType == SOLID_SHELLS) { - anExpectedType = TopAbs_SOLID; + anExpectedType.push_back(TopAbs_SOLID); Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); unsigned int ind, nbshapes = aShapes->Length(); @@ -441,7 +444,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const aShape = Sol; } else if (aType == COMPOUND_SHAPES) { - anExpectedType = TopAbs_COMPOUND; + anExpectedType.push_back(TopAbs_COMPOUND); Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); unsigned int ind, nbshapes = aShapes->Length(); @@ -462,7 +465,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const } else if (aType == EDGE_WIRE) { - anExpectedType = TopAbs_EDGE; + anExpectedType.push_back(TopAbs_EDGE); Handle(GEOM_Function) aRefBase = aCI.GetBase(); TopoDS_Shape aWire = aRefBase->GetValue(); @@ -472,8 +475,35 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const aShape = MakeEdgeFromWire(aWire, LinTol, AngTol); } + else if (aType == SOLID_FACES) { + anExpectedType.push_back(TopAbs_SOLID); + anExpectedType.push_back(TopAbs_COMPOUND); + anExpectedType.push_back(TopAbs_COMPSOLID); + + Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes(); + unsigned int ind, nbshapes = aShapes->Length(); + + // add faces + BOPCol_ListOfShape aLS; + for (ind = 1; ind <= nbshapes; ind++) { + Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(aShapes->Value(ind)); + TopoDS_Shape aShape_i = aRefShape->GetValue(); + if (aShape_i.IsNull()) { + Standard_NullObject::Raise("Shape for solid construction is null"); + } + aLS.Append(aShape_i); + } + + BOPAlgo_MakerVolume aMV; + aMV.SetArguments(aLS); + aMV.SetIntersect(aCI.GetIsIntersect()); + aMV.Perform(); + if (aMV.ErrorStatus()) return 0; + + aShape = aMV.Shape(); + } else if (aType == EDGE_CURVE_LENGTH) { - anExpectedType = TopAbs_EDGE; + anExpectedType.push_back(TopAbs_EDGE); GEOMImpl_IVector aVI (aFunction); @@ -575,9 +605,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const ("Shape for isoline construction is not a face"); } } else if (aType == EDGE_UV) { -#ifdef RESULT_TYPE_CHECK - anExpectedType = TopAbs_EDGE; -#endif + anExpectedType.push_back(TopAbs_EDGE); GEOMImpl_IShapeExtend aSE (aFunction); Handle(GEOM_Function) aRefEdge = aSE.GetShape(); TopoDS_Shape aShapeEdge = aRefEdge->GetValue(); @@ -588,9 +616,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const aShape = ExtendEdge(anEdge, aSE.GetUMin(), aSE.GetUMax()); } } else if (aType == FACE_UV) { -#ifdef RESULT_TYPE_CHECK - anExpectedType = TopAbs_FACE; -#endif + anExpectedType.push_back(TopAbs_FACE); GEOMImpl_IShapeExtend aSE (aFunction); Handle(GEOM_Function) aRefFace = aSE.GetShape(); @@ -604,9 +630,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const aSE.GetVMin(), aSE.GetVMax()); } } else if (aType == SURFACE_FROM_FACE) { -#ifdef RESULT_TYPE_CHECK - anExpectedType = TopAbs_FACE; -#endif + anExpectedType.push_back(TopAbs_FACE); GEOMImpl_IShapeExtend aSE (aFunction); Handle(GEOM_Function) aRefFace = aSE.GetShape(); @@ -663,8 +687,13 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const // Check if the result shape type is compatible with the expected. const TopAbs_ShapeEnum aShType = aShape.ShapeType(); - if (anExpectedType != TopAbs_SHAPE && anExpectedType != aShType) { - Standard_ConstructionError::Raise("Result type check failed"); + if (!anExpectedType.empty()) { + bool ok = false; + std::list::const_iterator it; + for (it = anExpectedType.begin(); it != anExpectedType.end() && !ok; ++it) + ok = (*it == TopAbs_SHAPE || *it == aShType); + if (!ok) + Standard_ConstructionError::Raise("Result type check failed"); } aFunction->SetValue(aShape); @@ -1516,6 +1545,11 @@ GetCreationInformation(std::string& theOperationName, theOperationName = "SOLID"; AddParam( theParams, "Objects", aCI.GetShapes() ); break; + case SOLID_FACES: + theOperationName = "SOLID_FROM_FACES"; + AddParam( theParams, "Objects", aCI.GetShapes() ); + AddParam( theParams, "Is intersect", aCI.GetIsIntersect() ); + break; case COMPOUND_SHAPES: theOperationName = "COMPOUND"; AddParam( theParams, "Objects", aCI.GetShapes() ); diff --git a/src/GEOMImpl/GEOMImpl_Types.hxx b/src/GEOMImpl/GEOMImpl_Types.hxx index 556255ae8..f7f329ebb 100644 --- a/src/GEOMImpl/GEOMImpl_Types.hxx +++ b/src/GEOMImpl/GEOMImpl_Types.hxx @@ -311,7 +311,7 @@ #define EDGE_UV 16 #define FACE_UV 17 #define SURFACE_FROM_FACE 18 - +#define SOLID_FACES 19 #define ARCHIMEDE_TYPE 1 diff --git a/src/GEOM_I/GEOM_IShapesOperations_i.cc b/src/GEOM_I/GEOM_IShapesOperations_i.cc index 4e619573c..dce57e0aa 100644 --- a/src/GEOM_I/GEOM_IShapesOperations_i.cc +++ b/src/GEOM_I/GEOM_IShapesOperations_i.cc @@ -406,6 +406,40 @@ GEOM_IShapesOperations_i::MakeCompound (const GEOM::ListOfGO& theShapes) return GetObject(anObject); } +//============================================================================= +/*! + * MakeSolidFromConnectedFaces + */ +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeSolidFromConnectedFaces + (const GEOM::ListOfGO& theFacesOrShells, + const CORBA::Boolean isIntersect) +{ + GEOM::GEOM_Object_var aGEOMObject; + + //Set a not done flag + GetOperations()->SetNotDone(); + + int ind, aLen; + std::list aShapes; + + //Get the shapes + aLen = theFacesOrShells.length(); + for (ind = 0; ind < aLen; ind++) { + Handle(GEOM_Object) aSh = GetObjectImpl(theFacesOrShells[ind]); + if (aSh.IsNull()) return aGEOMObject._retn(); + aShapes.push_back(aSh); + } + + // Make Solid + Handle(GEOM_Object) anObject = + GetOperations()->MakeSolidFromConnectedFaces(aShapes, isIntersect); + if (!GetOperations()->IsDone() || anObject.IsNull()) + return aGEOMObject._retn(); + + return GetObject(anObject); +} + //============================================================================= /*! * MakeGlueFaces diff --git a/src/GEOM_I/GEOM_IShapesOperations_i.hh b/src/GEOM_I/GEOM_IShapesOperations_i.hh index 7587a6a2d..5ba281994 100644 --- a/src/GEOM_I/GEOM_IShapesOperations_i.hh +++ b/src/GEOM_I/GEOM_IShapesOperations_i.hh @@ -75,6 +75,9 @@ class GEOM_I_EXPORT GEOM_IShapesOperations_i : GEOM::GEOM_Object_ptr MakeCompound (const GEOM::ListOfGO& theShapes); + GEOM::GEOM_Object_ptr MakeSolidFromConnectedFaces (const GEOM::ListOfGO& theFacesOrShells, + CORBA::Boolean isIntersect); + GEOM::GEOM_Object_ptr MakeGlueFaces (const GEOM::ListOfGO& theShape, CORBA::Double theTolerance, CORBA::Boolean doKeepNonSolids); diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.cc b/src/GEOM_I_Superv/GEOM_Superv_i.cc index 98cc96638..266252668 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.cc +++ b/src/GEOM_I_Superv/GEOM_Superv_i.cc @@ -2341,6 +2341,25 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeCompound (GEOM::GEOM_List_ptr theShapes return NULL; } +//============================================================================= +// MakeSolidFromConnectedFaces: +//============================================================================= +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeSolidFromConnectedFaces (GEOM::GEOM_List_ptr theFacesOrShells, + CORBA::Boolean isIntersect) +{ + beginService( " GEOM_Superv_i::MakeSolidFromConnectedFaces" ); + MESSAGE("GEOM_Superv_i::MakeSolidFromConnectedFaces"); + if (GEOM_List_i* aListImpl = + dynamic_cast*>(GetServant(theFacesOrShells, myPOA).in())) { + getShapesOp(); + GEOM::GEOM_Object_ptr anObj = myShapesOp->MakeSolidFromConnectedFaces(aListImpl->GetList(), isIntersect); + endService( " GEOM_Superv_i::MakeSolidFromConnectedFaces" ); + return anObj; + } + endService( " GEOM_Superv_i::MakeSolidFromConnectedFaces" ); + return NULL; +} + //============================================================================= // MakeGlueFaces: //============================================================================= diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.hh b/src/GEOM_I_Superv/GEOM_Superv_i.hh index f33f4f8bb..a41e6b32f 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.hh +++ b/src/GEOM_I_Superv/GEOM_Superv_i.hh @@ -507,6 +507,8 @@ public: GEOM::GEOM_Object_ptr MakeSolidShell (GEOM::GEOM_Object_ptr theShell); GEOM::GEOM_Object_ptr MakeSolidShells (GEOM::GEOM_List_ptr theShells); GEOM::GEOM_Object_ptr MakeCompound (GEOM::GEOM_List_ptr theShapes); + GEOM::GEOM_Object_ptr MakeSolidFromConnectedFaces (GEOM::GEOM_List_ptr theFacesOrShells, + CORBA::Boolean isIntersect); GEOM::GEOM_Object_ptr MakeGlueFaces (GEOM::GEOM_Object_ptr theShape, CORBA::Double theTolerance, CORBA::Boolean doKeepNonSolids); @@ -534,7 +536,6 @@ public: CORBA::Short theShapeType, GEOM::shape_state theState); - //-----------------------------------------------------------// // BlocksOperations // //-----------------------------------------------------------// diff --git a/src/GEOM_SWIG/GEOM_TestAll.py b/src/GEOM_SWIG/GEOM_TestAll.py index cb9a9720a..6dafa5265 100644 --- a/src/GEOM_SWIG/GEOM_TestAll.py +++ b/src/GEOM_SWIG/GEOM_TestAll.py @@ -190,7 +190,13 @@ def TestAll (geompy, math): prism1_faces[3], prism1_faces[4], prism1_faces[5], prism1_faces[2]]) Solid = geompy.MakeSolid([Shell1]) #(List of GEOM_Object)->GEOM_Object - + + Box1_translation = geompy.MakeTranslation(Box1, 10, 0, 0) + Box1_shell = geompy.SubShapeAllSorted(Box1, geompy.ShapeType["SHELL"])[0] + Box1_translation_shell = geompy.SubShapeAllSorted(Box1_translation, geompy.ShapeType["SHELL"])[0] + + Solid_from_shells = geompy.MakeSolidFromConnectedFaces([Box1_shell, Box1_translation_shell], 1) #(List of GEOM_Object, Boolean)->GEOM_Object + # Create Isoline Isoline = geompy.MakeIsoline(Face1, True, 0.5) #(1 GEOM_Object, Boolean, Double)->GEOM_Object @@ -416,6 +422,8 @@ def TestAll (geompy, math): id_Prism1 = geompy.addToStudy(Prism1, "Prism by Two Pnt") id_Shell1 = geompy.addToStudy(Shell1, "Shell from Prism1 faces") id_Solid = geompy.addToStudy(Solid, "Solid") + id_Solid1 = geompy.addToStudy(Solid_from_shells, "Solid1") + id_Compound = geompy.addToStudy(Compound, "Compound") id_Plane2 = geompy.addToStudy(Plane2, "Plane on Face") @@ -497,7 +505,7 @@ def TestAll (geompy, math): id_Partition = geompy.addToStudy(Partition, "Partition") id_Partition1 = geompy.addToStudy(Partition1, "Half Partition") - + #Decompose objects # SubShape diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py index 08b4811ec..ec10f2467 100644 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -4649,6 +4649,39 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): RaiseIfFailed("MakeCompound", self.ShapesOp) self._autoPublish(anObj, theName, "compound") return anObj + + ## Create a solid (or solids) from the set of faces and/or shells. + # @param theFacesOrShells List of faces and/or shells. + # @param isIntersect If TRUE, forces performing intersections + # between arguments; otherwise (default) intersection is not performed. + # @param theName Object name; when specified, this parameter is used + # for result publication in the study. Otherwise, if automatic + # publication is switched on, default value is used for result name. + # + # @return New GEOM.GEOM_Object, containing the created solid (or compound of solids). + # + # @ref tui_creation_solid_from_faces "Example" + @ManageTransactions("ShapesOp") + def MakeSolidFromConnectedFaces(self, theFacesOrShells, isIntersect = False, theName=None): + """ + Create a solid (or solids) from the set of connected faces and/or shells. + + Parameters: + theFacesOrShells List of faces and/or shells. + isIntersect If TRUE, forces performing intersections + between arguments; otherwise (default) intersection is not performed + theName Object name; when specified, this parameter is used. + for result publication in the study. Otherwise, if automatic + publication is switched on, default value is used for result name. + + Returns: + New GEOM.GEOM_Object, containing the created solid (or compound of solids). + """ + # Example: see GEOM_TestAll.py + anObj = self.ShapesOp.MakeSolidFromConnectedFaces(theFacesOrShells, isIntersect) + RaiseIfFailed("MakeSolidFromConnectedFaces", self.ShapesOp) + self._autoPublish(anObj, theName, "solid") + return anObj # end of l3_advanced ## @} -- 2.39.2