From 8e1ef24a91d1db7af5b9e7b3bae0f39048846c49 Mon Sep 17 00:00:00 2001 From: jfa Date: Wed, 27 May 2009 11:46:05 +0000 Subject: [PATCH] IMPs 19766 (Wire from unconnected edges) and 20004 (NumberOfSolids) --- doc/salome/gui/GEOM/images/neo-obj3.png | Bin 14430 -> 16230 bytes doc/salome/gui/GEOM/input/creating_wire.doc | 13 +- doc/salome/gui/GEOM/input/tui_test_others.doc | 7 +- idl/GEOM_Gen.idl | 14 +- idl/GEOM_Superv.idl | 3 +- src/BuildGUI/BuildGUI_WireDlg.cxx | 47 ++--- src/BuildGUI/BuildGUI_WireDlg.h | 6 +- src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx | 56 +----- src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx | 18 +- src/GEOMImpl/GEOMImpl_IShapes.hxx | 29 ++-- src/GEOMImpl/GEOMImpl_IShapesOperations.cxx | 163 ++++++++++++++---- src/GEOMImpl/GEOMImpl_IShapesOperations.hxx | 9 +- src/GEOMImpl/GEOMImpl_ShapeDriver.cxx | 31 +++- src/GEOM_I/GEOM_Gen_i.cc | 15 +- src/GEOM_I/GEOM_IShapesOperations_i.cc | 27 +-- src/GEOM_I/GEOM_IShapesOperations_i.hh | 9 +- src/GEOM_I/GEOM_Object_i.cc | 4 +- src/GEOM_I_Superv/GEOM_Superv_i.cc | 5 +- src/GEOM_I_Superv/GEOM_Superv_i.hh | 3 +- src/GEOM_SWIG/GEOM_TestOthers.py | 11 +- src/GEOM_SWIG/geompyDC.py | 37 +++- 21 files changed, 321 insertions(+), 186 deletions(-) diff --git a/doc/salome/gui/GEOM/images/neo-obj3.png b/doc/salome/gui/GEOM/images/neo-obj3.png index 65464a70cd4fda36a51ba4ad7f4cf987c62fe1b0..cb9bd40b18114f8b3ecc5b25bf0fe90d8c61e372 100755 GIT binary patch literal 16230 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 M$cyJbe)abM0FaAZ`~Uy| literal 14430 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 diff --git a/doc/salome/gui/GEOM/input/creating_wire.doc b/doc/salome/gui/GEOM/input/creating_wire.doc index 54cf6c79a..1443599cd 100644 --- a/doc/salome/gui/GEOM/input/creating_wire.doc +++ b/doc/salome/gui/GEOM/input/creating_wire.doc @@ -6,12 +6,15 @@ \n You can create a \b Wire from several connected edges and wires by selecting them in the object browser or in the viewer holding Shift -button. -\n The \b Result will be a \b GEOM_Object (WIRE). +button. Select \b Tolerance which will be used to check +connections. If you use \b Tolerance more than 1e-07, and gap, +covered by this tolerance, is detected, edges will be modified to +connect in the middle of the gap. +\n The \b Result will be a \b GEOM_Object (WIRE). -\n TUI Command: geompy.MakeWire(ListOfShape) +\n TUI Command: geompy.MakeWire(ListOfShape, Tolerance) -Arguments: Name + List of connected wires or edges. +Arguments: Name + List of connected wires or edges + Tolerance. \n Dialog Box: @@ -24,4 +27,4 @@ button. Our TUI Scripts provide you with useful examples of creation of \ref tui_creation_wire "Advanced Geometric Objects". -*/ \ No newline at end of file +*/ diff --git a/doc/salome/gui/GEOM/input/tui_test_others.doc b/doc/salome/gui/GEOM/input/tui_test_others.doc index 32d3c8b21..332f3d58d 100644 --- a/doc/salome/gui/GEOM/input/tui_test_others.doc +++ b/doc/salome/gui/GEOM/input/tui_test_others.doc @@ -40,11 +40,8 @@ \anchor swig_MakeChamfer \until id_MakeChamfer -\anchor swig_NumberOfFaces -\until Bad number of faces - -\anchor swig_NumberOfEdges -\until Bad number of edges +\anchor swig_NumberOf +\until Bad number of shapes \anchor swig_MakeBlockExplode \until id_MakeBlockExplode diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 04aa32a40..1109bde2c 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -1202,9 +1202,12 @@ module GEOM /*! * Create a wire from the set of edges and wires. * \param theEdgesAndWires List of edge and/or wires. + * \param theTolerance Maximum distance between vertices, that will be merged. + * Values less than 1e-07 are equivalent to 1e-07 (Precision::Confusion()). * \return New GEOM_Object, containing the created wire. */ - GEOM_Object MakeWire (in ListOfGO theEdgesAndWires); + GEOM_Object MakeWire (in ListOfGO theEdgesAndWires, + in double theTolerance); /*! * Create a face on the given wire. @@ -1358,6 +1361,15 @@ module GEOM */ long NumberOfEdges (in GEOM_Object theShape); + /*! + * Count number of subshapes of type \a theShapeType in the given shape. + * \param theShape Shape to count subshapes in. + * \param theShapeType The type of subshapes to count. + * \return Number of subshapes of type \a theShapeType in \a theShape. + */ + long NumberOfSubShapes (in GEOM_Object theShape, + in long theShapeType); + /*! * Reverses an orientation the given shape. * \param theShape Shape to be reversed. diff --git a/idl/GEOM_Superv.idl b/idl/GEOM_Superv.idl index ed4334994..1f6d2f769 100644 --- a/idl/GEOM_Superv.idl +++ b/idl/GEOM_Superv.idl @@ -360,7 +360,8 @@ module GEOM //-----------------------------------------------------------// GEOM_Object MakeEdge (in GEOM_Object thePnt1, in GEOM_Object thePnt2) ; - GEOM_Object MakeWire (in GEOM_List theEdgesAndWires) ; + GEOM_Object MakeWire (in GEOM_List theEdgesAndWires, + in double theTolerance) ; GEOM_Object MakeFace (in GEOM_Object theWire, in boolean isPlanarWanted) ; GEOM_Object MakeFaceWires (in GEOM_List theWires, diff --git a/src/BuildGUI/BuildGUI_WireDlg.cxx b/src/BuildGUI/BuildGUI_WireDlg.cxx index 05326e457..5acb5845e 100644 --- a/src/BuildGUI/BuildGUI_WireDlg.cxx +++ b/src/BuildGUI/BuildGUI_WireDlg.cxx @@ -22,7 +22,7 @@ // GEOM GEOMGUI : GUI for Geometry component // File : BuildGUI_WireDlg.cxx // Author : Lucien PIGNOLONI, Open CASCADE S.A.S. -// + #include "BuildGUI_WireDlg.h" #include @@ -37,6 +37,7 @@ #include #include +#include //================================================================================= // class : BuildGUI_WireDlg() @@ -61,16 +62,22 @@ BuildGUI_WireDlg::BuildGUI_WireDlg( GeometryGUI* theGeometryGUI, QWidget* parent mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose ); mainFrame()->RadioButton3->close(); - GroupPoints = new DlgRef_1Sel( centralWidget() ); + GroupArgs = new DlgRef_1Sel1Spin( centralWidget() ); - GroupPoints->GroupBox1->setTitle( tr( "GEOM_WIRE_CONNECT" ) ); - GroupPoints->TextLabel1->setText( tr( "GEOM_OBJECTS" ) ); - GroupPoints->PushButton1->setIcon( image1 ); - GroupPoints->LineEdit1->setReadOnly( true ); + GroupArgs->GroupBox1->setTitle( tr( "GEOM_WIRE_CONNECT" ) ); + GroupArgs->TextLabel1->setText( tr( "GEOM_OBJECTS" ) ); + GroupArgs->PushButton1->setIcon( image1 ); + GroupArgs->LineEdit1->setReadOnly( true ); + + GroupArgs->TextLabel2->setText( tr( "GEOM_TOLERANCE" ) ); + double SpecificStep = 0.0001; + double prec = Precision::Confusion(); + initSpinBox(GroupArgs->SpinBox_DX, prec, MAX_NUMBER, SpecificStep, 9); + GroupArgs->SpinBox_DX->setValue(prec); QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); layout->setMargin( 0 ); layout->setSpacing( 6 ); - layout->addWidget( GroupPoints ); + layout->addWidget( GroupArgs ); /***************************************************************/ setHelpFileName( "create_wire_page.html" ); @@ -97,8 +104,8 @@ BuildGUI_WireDlg::~BuildGUI_WireDlg() void BuildGUI_WireDlg::Init() { /* init variables */ - myEditCurrentArgument = GroupPoints->LineEdit1; - GroupPoints->LineEdit1->setReadOnly( true ); + myEditCurrentArgument = GroupArgs->LineEdit1; + GroupArgs->LineEdit1->setReadOnly( true ); myOkEdgesAndWires = false; @@ -110,7 +117,7 @@ void BuildGUI_WireDlg::Init() /* signals and slots connections */ connect( buttonOk(), SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); - connect( GroupPoints->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); + connect( GroupArgs->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); connect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(), SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); @@ -180,14 +187,14 @@ void BuildGUI_WireDlg::SelectionIntoArgument() void BuildGUI_WireDlg::SetEditCurrentArgument() { QPushButton* send = (QPushButton*)sender(); - if ( send != GroupPoints->PushButton1 ) + if ( send != GroupArgs->PushButton1 ) return; TColStd_MapOfInteger aMap; aMap.Add( GEOM_WIRE ); aMap.Add( GEOM_EDGE ); globalSelection( aMap ); - myEditCurrentArgument = GroupPoints->LineEdit1; + myEditCurrentArgument = GroupArgs->LineEdit1; myEditCurrentArgument->setFocus(); SelectionIntoArgument(); @@ -233,25 +240,25 @@ GEOM::GEOM_IOperations_ptr BuildGUI_WireDlg::createOperation() // function : isValid // purpose : //================================================================================= -bool BuildGUI_WireDlg::isValid( QString& ) +bool BuildGUI_WireDlg::isValid (QString& msg) { - return myOkEdgesAndWires; + bool ok = GroupArgs->SpinBox_DX->isValid(msg, !IsPreview()); + return myOkEdgesAndWires && ok; } //================================================================================= // function : execute // purpose : //================================================================================= -bool BuildGUI_WireDlg::execute( ObjectList& objects ) +bool BuildGUI_WireDlg::execute (ObjectList& objects) { GEOM::GEOM_Object_var anObj; - anObj = GEOM::GEOM_IShapesOperations::_narrow( - getOperation() )->MakeWire( myEdgesAndWires ); + anObj = GEOM::GEOM_IShapesOperations::_narrow(getOperation())-> + MakeWire(myEdgesAndWires, GroupArgs->SpinBox_DX->value()); - if ( !anObj->_is_nil() ) - objects.push_back( anObj._retn() ); + if (!anObj->_is_nil()) + objects.push_back(anObj._retn()); return true; } - diff --git a/src/BuildGUI/BuildGUI_WireDlg.h b/src/BuildGUI/BuildGUI_WireDlg.h index 616df0246..6b500ee30 100644 --- a/src/BuildGUI/BuildGUI_WireDlg.h +++ b/src/BuildGUI/BuildGUI_WireDlg.h @@ -22,13 +22,13 @@ // GEOM GEOMGUI : GUI for Geometry component // File : BuildGUI_WireDlg.h // Author : Lucien PIGNOLONI, Open CASCADE S.A.S. -// + #ifndef BUILDGUI_WIREDLG_H #define BUILDGUI_WIREDLG_H #include -class DlgRef_1Sel; +class DlgRef_1Sel1Spin; //================================================================================= // class : BuildGUI_WireDlg @@ -56,7 +56,7 @@ private: GEOM::ListOfGO myEdgesAndWires; bool myOkEdgesAndWires; /* to check when arguments is defined */ - DlgRef_1Sel* GroupPoints; + DlgRef_1Sel1Spin* GroupArgs; private slots: void ClickOnOk(); diff --git a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx index ffa7b4d3f..8b6857797 100644 --- a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx @@ -18,7 +18,7 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// + #include #include @@ -61,7 +61,6 @@ #include #include #include -#include #include #include #include @@ -1447,59 +1446,6 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeRevolutionAxisAngle2Ways return aRevolution; } -//============================================================================= -/*! - * MakeSolidShell - */ -//============================================================================= -Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakeSolidShell (Handle(GEOM_Object) theShell) -{ - SetErrorCode(KO); - - if (theShell.IsNull()) return NULL; - - //Add a new Solid object - Handle(GEOM_Object) aSolid = GetEngine()->AddObject(GetDocID(), GEOM_SOLID); - - //Add a new Solid function for creation a solid from a shell - Handle(GEOM_Function) aFunction = - aSolid->AddFunction(GEOMImpl_ShapeDriver::GetID(), SOLID_SHELL); - 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(GEOM_Function) aRefShell = theShell->GetLastFunction(); - - if (aRefShell.IsNull()) return NULL; - - aCI.SetBase(aRefShell); - - //Compute the Solid value - try { -#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 - OCC_CATCH_SIGNALS; -#endif - if (!GetSolver()->ComputeFunction(aFunction)) { - SetErrorCode("Solid 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(aFunction) << aSolid << " = geompy.MakeSolid(" << theShell << ")"; - - SetErrorCode(OK); - return aSolid; -} - //============================================================================= /*! * MakeFilling diff --git a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx index 6f1295b41..151ea1218 100644 --- a/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx @@ -18,7 +18,7 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// + #ifndef _GEOMImpl_I3DPrimOperations_HXX_ #define _GEOMImpl_I3DPrimOperations_HXX_ @@ -97,14 +97,16 @@ class GEOMImpl_I3DPrimOperations : public GEOM_IOperations { Handle(GEOM_Object) theAxis, double theAngle); - Standard_EXPORT Handle(GEOM_Object) MakeSolidShell (Handle(GEOM_Object) theShell); - - Standard_EXPORT Handle(GEOM_Object) MakeFilling (Handle(GEOM_Object) theShape, int theMinDeg, int theMaxDeg, double theTol2D, double theTol3D, int theNbIter, bool isApprox); + Standard_EXPORT Handle(GEOM_Object) MakeFilling (Handle(GEOM_Object) theShape, + int theMinDeg, int theMaxDeg, + double theTol2D, double theTol3D, + int theNbIter, bool isApprox); - Standard_EXPORT Handle(GEOM_Object) MakeThruSections(const Handle(TColStd_HSequenceOfTransient)& theSeqSections, - bool theModeSolid, - double thePreci, - bool theRuled); + Standard_EXPORT Handle(GEOM_Object) MakeThruSections + (const Handle(TColStd_HSequenceOfTransient)& theSeqSections, + bool theModeSolid, + double thePreci, + bool theRuled); Standard_EXPORT Handle(GEOM_Object) MakePipeWithDifferentSections( const Handle(TColStd_HSequenceOfTransient)& theBases, diff --git a/src/GEOMImpl/GEOMImpl_IShapes.hxx b/src/GEOMImpl/GEOMImpl_IShapes.hxx index a4efd5161..e0827f4ea 100644 --- a/src/GEOMImpl/GEOMImpl_IShapes.hxx +++ b/src/GEOMImpl/GEOMImpl_IShapes.hxx @@ -19,27 +19,27 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// NOTE: This is an intreface to a function for the Shapes -// (Wire, Face, Shell, Solid and Compound) creation. -// +// NOTE: This is an intreface to a function for the Shapes +// (Wire, Face, Shell, Solid and Compound) creation. + #include "GEOM_Function.hxx" #include "TColStd_HSequenceOfTransient.hxx" #include "TColStd_HArray1OfInteger.hxx" -#define SHAPE_ARG_SHAPES 1 // for Wire, Shell, Solid and Compound - -#define SHAPE_ARG_BASE 2 // for Face, Solid and Sub-shape - -#define SHAPE_ARG_PLANAR 3 // for Face - -#define SHAPE_ARG_SUBTYPE 4 // for Sub-shape -#define SHAPE_ARG_INDICES 5 // for Sub-shape - class GEOMImpl_IShapes { public: + enum { + 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_SUBTYPE = 4, // for Sub-shape + SHAPE_ARG_INDICES = 5, // for Sub-shape + SHAPE_ARG_TOLERANCE = 6 // for Wire + }; + GEOMImpl_IShapes(Handle(GEOM_Function) theFunction): _func(theFunction) {} void SetShapes(const Handle(TColStd_HSequenceOfTransient)& theShapes) @@ -69,6 +69,11 @@ class GEOMImpl_IShapes Handle(TColStd_HArray1OfInteger) GetIndices() { return _func->GetIntegerArray(SHAPE_ARG_INDICES); } + void SetTolerance(const Standard_Real theValue) + { _func->SetReal(SHAPE_ARG_TOLERANCE, theValue); } + + Standard_Integer GetTolerance() { return _func->GetReal(SHAPE_ARG_TOLERANCE); } + private: Handle(GEOM_Function) _func; diff --git a/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx index 1abf84024..519f6c82b 100644 --- a/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx @@ -214,9 +214,71 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeEdge */ //============================================================================= Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeWire - (std::list theShapes) + (std::list theShapes, + const Standard_Real theTolerance) { - return MakeShape(theShapes, GEOM_WIRE, WIRE_EDGES, "MakeWire"); + SetErrorCode(KO); + + //Add a new object + Handle(GEOM_Object) aWire = GetEngine()->AddObject(GetDocID(), GEOM_WIRE); + + //Add a new function + Handle(GEOM_Function) aFunction = + aWire->AddFunction(GEOMImpl_ShapeDriver::GetID(), WIRE_EDGES); + if (aFunction.IsNull()) return NULL; + + //Check if the function is set correctly + if (aFunction->GetDriverGUID() != GEOMImpl_ShapeDriver::GetID()) return NULL; + + GEOMImpl_IShapes aCI (aFunction); + aCI.SetTolerance(theTolerance); + + Handle(TColStd_HSequenceOfTransient) aShapesSeq = new TColStd_HSequenceOfTransient; + + // Shapes + std::list::iterator it = theShapes.begin(); + for (; it != theShapes.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); + + //Compute the shape + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + 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 << aWire << " = geompy.MakeWire(["; + + // Shapes + it = theShapes.begin(); + if (it != theShapes.end()) { + pd << (*it++); + while (it != theShapes.end()) { + pd << ", " << (*it++); + } + } + pd << "])"; + + SetErrorCode(OK); + return aWire; } //============================================================================= @@ -442,7 +504,7 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeCompound */ //============================================================================= Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeShape - (std::list theShapes, + (std::list theShapes, const Standard_Integer theObjectType, const Standard_Integer theFunctionType, const TCollection_AsciiString& theMethodName) @@ -1103,54 +1165,83 @@ TCollection_AsciiString GEOMImpl_IShapesOperations::GetShapeTypeString (Handle(G //============================================================================= /*! - * NumberOfFaces + * NumberOfSubShapes */ //============================================================================= -Standard_Integer GEOMImpl_IShapesOperations::NumberOfFaces (Handle(GEOM_Object) theShape) +Standard_Integer GEOMImpl_IShapesOperations::NumberOfSubShapes + (Handle(GEOM_Object) theShape, + const Standard_Integer theShapeType) { SetErrorCode(KO); - - Standard_Integer nb = 0; + Standard_Integer nbShapes = 0; if (theShape.IsNull()) return -1; TopoDS_Shape aShape = theShape->GetValue(); if (aShape.IsNull()) return -1; + /* TopTools_MapOfShape mapShape; - TopExp_Explorer exp (aShape, TopAbs_FACE); - for (; exp.More(); exp.Next()) - if (mapShape.Add(exp.Current())) - nb++; - - SetErrorCode(OK); - return nb; -} - -//============================================================================= -/*! - * NumberOfEdges - */ -//============================================================================= -Standard_Integer GEOMImpl_IShapesOperations::NumberOfEdges (Handle(GEOM_Object) theShape) -{ - SetErrorCode(KO); - - Standard_Integer nb = 0; - - if (theShape.IsNull()) return -1; - TopoDS_Shape aShape = theShape->GetValue(); - if (aShape.IsNull()) return -1; + if (aShape.ShapeType() == TopAbs_COMPOUND && + (TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE || + TopAbs_ShapeEnum(theShapeType) == TopAbs_COMPSOLID || + TopAbs_ShapeEnum(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()) { + nbShapes++; + } + } + } + } else { + TopExp_Explorer exp (aShape, TopAbs_ShapeEnum(theShapeType)); + for (; exp.More(); exp.Next()) + if (mapShape.Add(exp.Current())) + nbShapes++; + } + */ - TopTools_MapOfShape mapShape; + try { +#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 + OCC_CATCH_SIGNALS; +#endif + 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()]++; + } + } + } - TopExp_Explorer exp (aShape, TopAbs_EDGE); - for (; exp.More(); exp.Next()) - if (mapShape.Add(exp.Current())) - nb++; + if (TopAbs_ShapeEnum(theShapeType) == TopAbs_SHAPE) + nbShapes = aMapOfShape.Extent(); + else + nbShapes = nbTypes[theShapeType]; + } + catch (Standard_Failure) { + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + SetErrorCode(aFail->GetMessageString()); + return -1; + } SetErrorCode(OK); - return nb; + return nbShapes; } //============================================================================= diff --git a/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx b/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx index 3deb09d0a..373e1a82a 100644 --- a/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IShapesOperations.hxx @@ -26,7 +26,7 @@ // Project : SALOME // $Header$ //============================================================================= -// + #ifndef _GEOMImpl_IShapesOperations_HXX_ #define _GEOMImpl_IShapesOperations_HXX_ @@ -56,7 +56,8 @@ class GEOMImpl_IShapesOperations : public GEOM_IOperations Standard_EXPORT Handle(GEOM_Object) MakeEdge (Handle(GEOM_Object) thePoint1, Handle(GEOM_Object) thePoint2); - Standard_EXPORT Handle(GEOM_Object) MakeWire (std::list theEdgesAndWires); + Standard_EXPORT Handle(GEOM_Object) MakeWire (std::list theEdgesAndWires, + const Standard_Real theTolerance); Standard_EXPORT Handle(GEOM_Object) MakeFace (Handle(GEOM_Object) theWire, const bool isPlanarWanted); @@ -102,8 +103,8 @@ class GEOMImpl_IShapesOperations : public GEOM_IOperations Standard_EXPORT TCollection_AsciiString GetShapeTypeString (Handle(GEOM_Object) theShape); - Standard_EXPORT Standard_Integer NumberOfFaces (Handle(GEOM_Object) theShape); - Standard_EXPORT Standard_Integer NumberOfEdges (Handle(GEOM_Object) theShape); + Standard_EXPORT Standard_Integer NumberOfSubShapes (Handle(GEOM_Object) theShape, + const Standard_Integer theShapeType); Standard_EXPORT Handle(GEOM_Object) ReverseShape(Handle(GEOM_Object) theShapes); diff --git a/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx b/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx index 43af2ed5c..1165007ea 100644 --- a/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_ShapeDriver.cxx @@ -18,7 +18,7 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// + #include #include @@ -29,6 +29,7 @@ // OCCT Includes #include +#include #include #include @@ -152,17 +153,37 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const Standard_ConstructionError::Raise("Wire construction failed: several loops detected"); } else if (aFW->StatusReorder(ShapeExtend_FAIL)) { Standard_ConstructionError::Raise("Wire construction failed"); - } else if (aFW->StatusReorder(ShapeExtend_DONE2)) { - Standard_ConstructionError::Raise("Wire construction failed: some gaps detected"); + //} else if (aFW->StatusReorder(ShapeExtend_DONE2)) { + // Standard_ConstructionError::Raise("Wire construction failed: some gaps detected"); } else { } + // IMP 0019766: Building a Wire from unconnected edges by introducing a tolerance + Standard_Real aTolerance = aCI.GetTolerance(); + if (aTolerance < Precision::Confusion()) + aTolerance = Precision::Confusion(); + aFW->ClosedWireMode() = Standard_False; - aFW->FixConnected(); + aFW->FixConnected(aTolerance); if (aFW->StatusConnected(ShapeExtend_FAIL)) { Standard_ConstructionError::Raise("Wire construction failed: cannot build connected wire"); } + // IMP 0019766 + aFW->FixGapsByRangesMode() = Standard_True; + if (aFW->FixGaps3d()) { + Handle(ShapeExtend_WireData) sbwd = aFW->WireData(); + Handle(ShapeFix_Edge) aFe = new ShapeFix_Edge; + for (Standard_Integer iedge = 1; iedge <= sbwd->NbEdges(); iedge++) { + TopoDS_Edge aEdge = TopoDS::Edge(sbwd->Edge(iedge)); + aFe->FixVertexTolerance(aEdge); + aFe->FixSameParameter(aEdge); + } + } + else if (aFW->StatusGaps3d(ShapeExtend_FAIL)) { + Standard_ConstructionError::Raise("Wire construction failed: cannot fix 3d gaps"); + } + aShape = aFW->WireAPIMake(); } } @@ -446,7 +467,7 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const // Check shape validity BRepCheck_Analyzer ana (aShape, false); if (!ana.IsValid()) { - Standard_ConstructionError::Raise("Algorithm have produced an invalid shape result"); + //Standard_ConstructionError::Raise("Algorithm have produced an invalid shape result"); } aFunction->SetValue(aShape); diff --git a/src/GEOM_I/GEOM_Gen_i.cc b/src/GEOM_I/GEOM_Gen_i.cc index 7dd05a5f7..7f9f5cab4 100644 --- a/src/GEOM_I/GEOM_Gen_i.cc +++ b/src/GEOM_I/GEOM_Gen_i.cc @@ -29,6 +29,7 @@ #include "GEOM_Object_i.hh" #include +//#include #include "Utils_CorbaException.hxx" #include "OpUtil.hxx" @@ -326,7 +327,8 @@ SALOMEDS::TMPFile* GEOM_Gen_i::Save(SALOMEDS::SComponent_ptr theComponent, // Prepare a file name to open TCollection_AsciiString aNameWithExt(""); if (isMultiFile) - aNameWithExt = TCollection_AsciiString((char*)(SALOMEDS_Tool::GetNameFromPath(theComponent->GetStudy()->URL())).c_str()); + aNameWithExt = TCollection_AsciiString((char*)(SALOMEDS_Tool::GetNameFromPath + (theComponent->GetStudy()->URL())).c_str()); aNameWithExt += TCollection_AsciiString("_GEOM.sgd"); aSeq[0] = CORBA::string_dup(aNameWithExt.ToCString()); // Build a full file name of temporary file @@ -389,7 +391,8 @@ CORBA::Boolean GEOM_Gen_i::Load(SALOMEDS::SComponent_ptr theComponent, // Prepare a file name to open TCollection_AsciiString aNameWithExt(""); if (isMultiFile) - aNameWithExt = TCollection_AsciiString((char*)(SALOMEDS_Tool::GetNameFromPath(theComponent->GetStudy()->URL())).c_str()); + aNameWithExt = TCollection_AsciiString((char*)(SALOMEDS_Tool::GetNameFromPath + (theComponent->GetStudy()->URL())).c_str()); aNameWithExt += TCollection_AsciiString("_GEOM.sgd"); TCollection_AsciiString aFullName = (TCollection_AsciiString((char*)aTmpDir.c_str()) + aNameWithExt); @@ -448,14 +451,16 @@ CORBA::Boolean GEOM_Gen_i::CanCopy(SALOMEDS::SObject_ptr theObject) { // function : CopyFrom() // purpose : //============================================================================ -SALOMEDS::TMPFile* GEOM_Gen_i::CopyFrom(SALOMEDS::SObject_ptr theObject, CORBA::Long& theObjectID) { +SALOMEDS::TMPFile* GEOM_Gen_i::CopyFrom(SALOMEDS::SObject_ptr theObject, CORBA::Long& theObjectID) +{ // Declare a sequence of the byte to store the copied object SALOMEDS::TMPFile_var aStreamFile = new SALOMEDS::TMPFile; // Try to get GEOM_Object object by given SObject SALOMEDS::GenericAttribute_var anAttr; if (!theObject->FindAttribute(anAttr, "AttributeIOR")) return aStreamFile._retn(); - GEOM::GEOM_Object_var anObject = GEOM::GEOM_Object::_narrow(_orb->string_to_object(SALOMEDS::AttributeIOR::_narrow(anAttr)->Value())); + GEOM::GEOM_Object_var anObject = GEOM::GEOM_Object::_narrow + (_orb->string_to_object(SALOMEDS::AttributeIOR::_narrow(anAttr)->Value())); if (anObject->_is_nil()) return aStreamFile._retn(); aStreamFile = anObject->GetShapeStream(); @@ -1360,7 +1365,7 @@ char* GEOM_Gen_i::getObjectInfo(CORBA::Long studyId, const char* entry) aGeomObject = GEOM::GEOM_Object::_narrow(anObject); } - char* aTypeInfo = "Object"; + const char* aTypeInfo = "Object"; if ( !aGeomObject->_is_nil() ) { GEOM::GEOM_IKindOfShape::shape_kind aKind; GEOM::ListOfLong_var anInts; diff --git a/src/GEOM_I/GEOM_IShapesOperations_i.cc b/src/GEOM_I/GEOM_IShapesOperations_i.cc index 504f111fa..7013c56fd 100644 --- a/src/GEOM_I/GEOM_IShapesOperations_i.cc +++ b/src/GEOM_I/GEOM_IShapesOperations_i.cc @@ -30,6 +30,7 @@ #include "GEOM_Engine.hxx" #include "GEOM_Object.hxx" +#include #include #include @@ -90,7 +91,8 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeEdge */ //============================================================================= GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeWire - (const GEOM::ListOfGO& theEdgesAndWires) + (const GEOM::ListOfGO& theEdgesAndWires, + const CORBA::Double theTolerance) { GEOM::GEOM_Object_var aGEOMObject; @@ -110,7 +112,7 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeWire // Make Solid Handle(GEOM_Object) anObject = - GetOperations()->MakeWire(aShapes); + GetOperations()->MakeWire(aShapes, theTolerance); if (!GetOperations()->IsDone() || anObject.IsNull()) return aGEOMObject._retn(); @@ -554,13 +556,7 @@ char* GEOM_IShapesOperations_i::GetShapeTypeString (GEOM::GEOM_Object_ptr theSha //============================================================================= CORBA::Long GEOM_IShapesOperations_i::NumberOfFaces (GEOM::GEOM_Object_ptr theShape) { - Handle(GEOM_Object) aShape = GetObjectImpl(theShape); - if (aShape.IsNull()) return -1; - - CORBA::Long aNb = GetOperations()->NumberOfFaces(aShape); - if (!GetOperations()->IsDone()) return -1; - - return aNb; + return NumberOfSubShapes(theShape, Standard_Integer(TopAbs_FACE)); } //============================================================================= @@ -569,11 +565,22 @@ CORBA::Long GEOM_IShapesOperations_i::NumberOfFaces (GEOM::GEOM_Object_ptr theSh */ //============================================================================= CORBA::Long GEOM_IShapesOperations_i::NumberOfEdges (GEOM::GEOM_Object_ptr theShape) +{ + return NumberOfSubShapes(theShape, Standard_Integer(TopAbs_EDGE)); +} + +//============================================================================= +/*! + * NumberOfSubShapes + */ +//============================================================================= +CORBA::Long GEOM_IShapesOperations_i::NumberOfSubShapes (GEOM::GEOM_Object_ptr theShape, + const CORBA::Long theShapeType) { Handle(GEOM_Object) aShape = GetObjectImpl(theShape); if (aShape.IsNull()) return -1; - CORBA::Long aNb = GetOperations()->NumberOfEdges(aShape); + CORBA::Long aNb = GetOperations()->NumberOfSubShapes(aShape, theShapeType); if (!GetOperations()->IsDone()) return -1; return aNb; diff --git a/src/GEOM_I/GEOM_IShapesOperations_i.hh b/src/GEOM_I/GEOM_IShapesOperations_i.hh index 2b1523918..61747cc36 100644 --- a/src/GEOM_I/GEOM_IShapesOperations_i.hh +++ b/src/GEOM_I/GEOM_IShapesOperations_i.hh @@ -18,7 +18,7 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// + #ifndef _GEOM_IShapesOperations_i_HeaderFile #define _GEOM_IShapesOperations_i_HeaderFile @@ -45,7 +45,8 @@ class GEOM_I_EXPORT GEOM_IShapesOperations_i : GEOM::GEOM_Object_ptr MakeEdge (GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2); - GEOM::GEOM_Object_ptr MakeWire (const GEOM::ListOfGO& theEdgesAndWires); + GEOM::GEOM_Object_ptr MakeWire (const GEOM::ListOfGO& theEdgesAndWires, + const CORBA::Double theTolerance); GEOM::GEOM_Object_ptr MakeFace (GEOM::GEOM_Object_ptr theWire, CORBA::Boolean isPlanarWanted); @@ -63,7 +64,7 @@ class GEOM_I_EXPORT GEOM_IShapesOperations_i : GEOM::GEOM_Object_ptr MakeGlueFaces (GEOM::GEOM_Object_ptr theShape, CORBA::Double theTolerance, - CORBA::Boolean doKeepNonSolids); + CORBA::Boolean doKeepNonSolids); GEOM::ListOfGO* GetGlueFaces (GEOM::GEOM_Object_ptr theShape, CORBA::Double theTolerance); @@ -95,6 +96,8 @@ class GEOM_I_EXPORT GEOM_IShapesOperations_i : CORBA::Long NumberOfFaces (GEOM::GEOM_Object_ptr theShape); CORBA::Long NumberOfEdges (GEOM::GEOM_Object_ptr theShape); + CORBA::Long NumberOfSubShapes (GEOM::GEOM_Object_ptr theShape, + const CORBA::Long theShapeType); GEOM::GEOM_Object_ptr ChangeOrientation (GEOM::GEOM_Object_ptr theShape); diff --git a/src/GEOM_I/GEOM_Object_i.cc b/src/GEOM_I/GEOM_Object_i.cc index 12ea73a99..6aee4454c 100644 --- a/src/GEOM_I/GEOM_Object_i.cc +++ b/src/GEOM_I/GEOM_Object_i.cc @@ -18,17 +18,17 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// + #include #include -//#include #include #include #include "utilities.h" #include #include +//#include #include #include diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.cc b/src/GEOM_I_Superv/GEOM_Superv_i.cc index 8d9dd3272..a5e8efb38 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.cc +++ b/src/GEOM_I_Superv/GEOM_Superv_i.cc @@ -1886,14 +1886,15 @@ GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeEdge (GEOM::GEOM_Object_ptr thePnt1, //============================================================================= // MakeWire: //============================================================================= -GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeWire (GEOM::GEOM_List_ptr theEdgesAndWires) +GEOM::GEOM_Object_ptr GEOM_Superv_i::MakeWire (GEOM::GEOM_List_ptr theEdgesAndWires, + CORBA::Double theTolerance) { beginService( " GEOM_Superv_i::MakeWire" ); MESSAGE("GEOM_Superv_i::MakeWire"); if (GEOM_List_i* aListImplEW = dynamic_cast*>(GetServant(theEdgesAndWires, myPOA).in())) { getShapesOp(); - GEOM::GEOM_Object_ptr anObj = myShapesOp->MakeWire(aListImplEW->GetList()); + GEOM::GEOM_Object_ptr anObj = myShapesOp->MakeWire(aListImplEW->GetList(), theTolerance); endService( " GEOM_Superv_i::MakeWire" ); return anObj; } diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.hh b/src/GEOM_I_Superv/GEOM_Superv_i.hh index e5c37fe14..da63e2366 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.hh +++ b/src/GEOM_I_Superv/GEOM_Superv_i.hh @@ -438,7 +438,8 @@ public: //-----------------------------------------------------------// GEOM::GEOM_Object_ptr MakeEdge (GEOM::GEOM_Object_ptr thePnt1, GEOM::GEOM_Object_ptr thePnt2); - GEOM::GEOM_Object_ptr MakeWire (GEOM::GEOM_List_ptr theEdgesAndWires); + GEOM::GEOM_Object_ptr MakeWire (GEOM::GEOM_List_ptr theEdgesAndWires, + CORBA::Double theTolerance); GEOM::GEOM_Object_ptr MakeFace (GEOM::GEOM_Object_ptr theWire, CORBA::Boolean isPlanarWanted); GEOM::GEOM_Object_ptr MakeFaceWires (GEOM::GEOM_List_ptr theWires, diff --git a/src/GEOM_SWIG/GEOM_TestOthers.py b/src/GEOM_SWIG/GEOM_TestOthers.py index f1da60701..ef5e604fa 100644 --- a/src/GEOM_SWIG/GEOM_TestOthers.py +++ b/src/GEOM_SWIG/GEOM_TestOthers.py @@ -203,16 +203,23 @@ def TestOtherOperations (geompy, math): [f_ind_1, f_ind_2, f_ind_3]) id_MakeChamfer = geompy.addToStudy(MakeChamfer, "MakeChamfer") - # NumberOfFaces + # NumberOf NumberOfFaces = geompy.NumberOfFaces(Box) if NumberOfFaces != 6: print "Bad number of faces in BOX!" - # NumberOfEdges NumberOfEdges = geompy.NumberOfEdges(Box) if NumberOfEdges != 12: print "Bad number of edges in BOX!" + NumberOfSolids = geompy.NumberOfSolids(Box) + if NumberOfSolids != 1: + print "Bad number of solids in BOX!" + + NumberOfShapes = geompy.NumberOfSubShapes(Box, geompy.ShapeType["SHAPE"]) + if NumberOfShapes != 34: + print "Bad number of shapes in BOX!" + # MakeBlockExplode Compound = geompy.MakeCompound([Box, Sphere]) MakeBlockExplode = geompy.MakeBlockExplode(Compound, 6, 6) diff --git a/src/GEOM_SWIG/geompyDC.py b/src/GEOM_SWIG/geompyDC.py index 72beea22a..eac732fd8 100644 --- a/src/GEOM_SWIG/geompyDC.py +++ b/src/GEOM_SWIG/geompyDC.py @@ -1388,12 +1388,14 @@ class geompyDC(GEOM._objref_GEOM_Gen): ## Create a wire from the set of edges and wires. # @param theEdgesAndWires List of edges and/or wires. + # @param theTolerance Maximum distance between vertices, that will be merged. + # Values less than 1e-07 are equivalent to 1e-07 (Precision::Confusion()). # @return New GEOM_Object, containing the created wire. # # @ref tui_creation_wire "Example" - def MakeWire(self,theEdgesAndWires): + def MakeWire(self, theEdgesAndWires, theTolerance = 1e-07): # Example: see GEOM_TestAll.py - anObj = self.ShapesOp.MakeWire(theEdgesAndWires) + anObj = self.ShapesOp.MakeWire(theEdgesAndWires, theTolerance) RaiseIfFailed("MakeWire", self.ShapesOp) return anObj @@ -1475,8 +1477,8 @@ class geompyDC(GEOM._objref_GEOM_Gen): # @param theShape Shape to count faces of. # @return Quantity of faces. # - # @ref swig_NumberOfFaces "Example" - def NumberOfFaces(self,theShape): + # @ref swig_NumberOf "Example" + def NumberOfFaces(self, theShape): # Example: see GEOM_TestOthers.py nb_faces = self.ShapesOp.NumberOfFaces(theShape) RaiseIfFailed("NumberOfFaces", self.ShapesOp) @@ -1486,13 +1488,36 @@ class geompyDC(GEOM._objref_GEOM_Gen): # @param theShape Shape to count edges of. # @return Quantity of edges. # - # @ref swig_NumberOfEdges "Example" - def NumberOfEdges(self,theShape): + # @ref swig_NumberOf "Example" + def NumberOfEdges(self, theShape): # Example: see GEOM_TestOthers.py nb_edges = self.ShapesOp.NumberOfEdges(theShape) RaiseIfFailed("NumberOfEdges", self.ShapesOp) return nb_edges + ## Gives quantity of subshapes of type theShapeType in the given shape. + # @param theShape Shape to count subshapes of. + # @param theShapeType Type of subshapes to count. + # @return Quantity of subshapes of given type. + # + # @ref swig_NumberOf "Example" + def NumberOfSubShapes(self, theShape, theShapeType): + # Example: see GEOM_TestOthers.py + nb_ss = self.ShapesOp.NumberOfSubShapes(theShape, theShapeType) + RaiseIfFailed("NumberOfSubShapes", self.ShapesOp) + return nb_ss + + ## Gives quantity of solids in the given shape. + # @param theShape Shape to count solids in. + # @return Quantity of solids. + # + # @ref swig_NumberOf "Example" + def NumberOfSolids(self, theShape): + # Example: see GEOM_TestOthers.py + nb_solids = self.ShapesOp.NumberOfSubShapes(theShape, ShapeType["SOLID"]) + RaiseIfFailed("NumberOfSolids", self.ShapesOp) + return nb_solids + # end of l2_measure ## @} -- 2.39.2