From 868e306e098d4ca6bfd1d183f0a57fb9cb805086 Mon Sep 17 00:00:00 2001 From: skl Date: Tue, 25 Oct 2005 07:26:54 +0000 Subject: [PATCH] Improvement of extrusion functionality --- idl/SMESH_Mesh.idl | 21 ++++++++++ src/SMESH/SMESH_MeshEditor.cxx | 65 +++++++++++++++++++++--------- src/SMESH/SMESH_MeshEditor.hxx | 53 +++++++++++++++++++----- src/SMESH_I/SMESH_MeshEditor_i.cxx | 61 ++++++++++++++++++++++++++-- src/SMESH_I/SMESH_MeshEditor_i.hxx | 5 +++ 5 files changed, 174 insertions(+), 31 deletions(-) diff --git a/idl/SMESH_Mesh.idl b/idl/SMESH_Mesh.idl index 7dee0ce3f..1fe2f2dd8 100644 --- a/idl/SMESH_Mesh.idl +++ b/idl/SMESH_Mesh.idl @@ -147,6 +147,14 @@ module SMESH typedef sequence log_array; + /*! + * Auxilary flags for advanced extrusion. + * BOUNDARY: create or not boundary for result of extrusion + * SEW: try to use existing nodes or create new nodes in any case + */ + const long EXTRUSION_FLAG_BOUNDARY = 1; + const long EXTRUSION_FLAG_SEW = 2; + interface SMESH_IDSource { /*! @@ -646,6 +654,19 @@ module SMESH in DirStruct StepVector, in long NbOfSteps); + /*! + * Generate new elements by extrusion of theElements + * by StepVector by NbOfSteps + * param ExtrFlags set flags for performing extrusion + * param SewTolerance - uses for comparing locations of nodes if flag + * EXTRUSION_FLAG_SEW is set + */ + void AdvancedExtrusion(in long_array IDsOfElements, + in DirStruct StepVector, + in long NbOfSteps, + in long ExtrFlags, + in double SewTolerance); + void ExtrusionSweepObject(in SMESH_IDSource theObject, in DirStruct StepVector, in long NbOfSteps); diff --git a/src/SMESH/SMESH_MeshEditor.cxx b/src/SMESH/SMESH_MeshEditor.cxx index 846a3cc31..b73f854d2 100644 --- a/src/SMESH/SMESH_MeshEditor.cxx +++ b/src/SMESH/SMESH_MeshEditor.cxx @@ -2410,14 +2410,45 @@ void SMESH_MeshEditor::RotationSweep(set & theElems, makeWalls( aMesh, mapNewNodes, newElemsMap, mapElemNewNodes, theElems ); } + + +//======================================================================= +//function : CreateNode +//purpose : +//======================================================================= +const SMDS_MeshNode* SMESH_MeshEditor::CreateNode(const double x, + const double y, + const double z, + const double tolnode) +{ + gp_Pnt P1(x,y,z); + SMESHDS_Mesh * aMesh = myMesh->GetMeshDS(); + // try to search in sequence of existing nodes + SMDS_NodeIteratorPtr itn = aMesh->nodesIterator(); + while(itn->more()) { + const SMDS_MeshNode* aN = static_cast (itn->next()); + gp_Pnt P2(aN->X(),aN->Y(),aN->Z()); + if(P1.Distance(P2)AddNode(x,y,z); + return NewNode; +} + + //======================================================================= //function : ExtrusionSweep //purpose : //======================================================================= -void SMESH_MeshEditor::ExtrusionSweep(set & theElems, - const gp_Vec& theStep, - const int theNbSteps) +void SMESH_MeshEditor::ExtrusionSweep + (set & theElems, + const gp_Vec& theStep, + const int theNbSteps, + TElemOfElemListMap& newElemsMap, + const int theFlags, + const double theTolerance) { gp_Trsf aTrsf; aTrsf.SetTranslation( theStep ); @@ -2426,7 +2457,7 @@ void SMESH_MeshEditor::ExtrusionSweep(set & theElems, TNodeOfNodeListMap mapNewNodes; TElemOfVecOfNnlmiMap mapElemNewNodes; - TElemOfElemListMap newElemsMap; + //TElemOfElemListMap newElemsMap; // loop on theElems set< const SMDS_MeshElement* >::iterator itElem; @@ -2457,27 +2488,25 @@ void SMESH_MeshEditor::ExtrusionSweep(set & theElems, double coord[] = { node->X(), node->Y(), node->Z() }; for ( int i = 0; i < theNbSteps; i++ ) { aTrsf.Transforms( coord[0], coord[1], coord[2] ); - const SMDS_MeshNode * newNode = aMesh->AddNode( coord[0], coord[1], coord[2] ); - listNewNodes.push_back( newNode ); + if( theFlags & EXTRUSION_FLAG_SEW ) { + const SMDS_MeshNode * newNode = CreateNode(coord[0], coord[1], + coord[2], theTolerance); + listNewNodes.push_back( newNode ); + } + else { + const SMDS_MeshNode * newNode = aMesh->AddNode( coord[0], coord[1], coord[2] ); + listNewNodes.push_back( newNode ); + } } } newNodesItVec.push_back( nIt ); } // make new elements sweepElement( aMesh, elem, newNodesItVec, newElemsMap[elem] ); - - // fill history - SMESH_SequenceOfElemPtr SeqNewME; - list tmpList = newElemsMap[elem]; - for(list::iterator ite = tmpList.begin(); - ite!=tmpList.end(); ite++) { - SeqNewME.Append(*ite); - } - myExtrusionHistory.Bind(elem,SeqNewME); - // end fill history - } - makeWalls( aMesh, mapNewNodes, newElemsMap, mapElemNewNodes, theElems ); + if( theFlags & EXTRUSION_FLAG_BOUNDARY ) { + makeWalls( aMesh, mapNewNodes, newElemsMap, mapElemNewNodes, theElems ); + } } //======================================================================= diff --git a/src/SMESH/SMESH_MeshEditor.hxx b/src/SMESH/SMESH_MeshEditor.hxx index 6c4dc76c8..ea02a7a7c 100644 --- a/src/SMESH/SMESH_MeshEditor.hxx +++ b/src/SMESH/SMESH_MeshEditor.hxx @@ -35,8 +35,9 @@ #include #include -//#include -#include + +typedef map > TElemOfElemListMap; class SMDS_MeshElement; class SMDS_MeshFace; @@ -142,9 +143,46 @@ class SMESH_MeshEditor { // Generate new elements by rotation of theElements around theAxis // by theAngle by theNbSteps - void ExtrusionSweep (std::set & theElements, - const gp_Vec& theStep, - const int theNbSteps); + /*! + * Auxilary flag for advanced extrusion. + * BOUNDARY: create or not boundary for result of extrusion + * SEW: try to use existing nodes or create new nodes in any case + */ + enum ExtrusionFlags { + EXTRUSION_FLAG_BOUNDARY = 0x01, + EXTRUSION_FLAG_SEW = 0x02 + }; + + /*! + * Create new node in the mesh with given coordinates + * (auxilary for advanced extrusion) + */ + const SMDS_MeshNode* CreateNode(const double x, + const double y, + const double z, + const double tolnode); + + /*! + * Generate new elements by extrusion of theElements + * by theStep by theNbSteps + * param theHistory returns history of extrusion + * param theFlags set flags for performing extrusion (see description + * of enum ExtrusionFlags for additional information) + * param theTolerance - uses for comparing locations of nodes if flag + * EXTRUSION_FLAG_SEW is set + */ + //void ExtrusionSweep (std::set & theElements, + // const gp_Vec& theStep, + // const int theNbSteps); + void ExtrusionSweep + (set & theElems, + const gp_Vec& theStep, + const int theNbSteps, + TElemOfElemListMap& newElemsMap, + //SMESH_DataMapOfElemPtrSequenceOfElemPtr& theHistory, + const int theFlags = EXTRUSION_FLAG_BOUNDARY, + const double theTolerance = 1.e-6); + // Generate new elements by extrusion of theElements // by theStep by theNbSteps @@ -306,15 +344,10 @@ class SMESH_MeshEditor { SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); } - const SMESH_DataMapOfElemPtrSequenceOfElemPtr& GetExtrusionHistory() const - { return myExtrusionHistory; } - private: SMESH_Mesh * myMesh; - SMESH_DataMapOfElemPtrSequenceOfElemPtr myExtrusionHistory; - }; #endif diff --git a/src/SMESH_I/SMESH_MeshEditor_i.cxx b/src/SMESH_I/SMESH_MeshEditor_i.cxx index 0c46be9fe..76f79d76b 100644 --- a/src/SMESH_I/SMESH_MeshEditor_i.cxx +++ b/src/SMESH_I/SMESH_MeshEditor_i.cxx @@ -45,6 +45,9 @@ #include +typedef map > TElemOfElemListMap; + using namespace std; //======================================================================= @@ -950,7 +953,9 @@ void SMESH_MeshEditor_i::ExtrusionSweep(const SMESH::long_array & theIDsOfElemen gp_Vec stepVec( P->x, P->y, P->z ); ::SMESH_MeshEditor anEditor( _myMesh ); - anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps); + //anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps); + TElemOfElemListMap aHystory; + anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps, aHystory); // Update Python script TCollection_AsciiString str = "stepVector = SMESH.DirStruct( SMESH.PointStruct ( "; @@ -987,6 +992,7 @@ void SMESH_MeshEditor_i::ExtrusionSweepObject(SMESH::SMESH_IDSource_ptr theObjec str += TCollection_AsciiString((int)theNbOfSteps) + " )"; SMESH_Gen_i::AddToCurrentPyScript( str ); } + //======================================================================= //function : ExtrusionSweepObject1D //purpose : @@ -1012,7 +1018,9 @@ void SMESH_MeshEditor_i::ExtrusionSweepObject1D(SMESH::SMESH_IDSource_ptr theObj gp_Vec stepVec( P->x, P->y, P->z ); ::SMESH_MeshEditor anEditor( _myMesh ); - anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps); + //anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps); + TElemOfElemListMap aHystory; + anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps, aHystory); } //======================================================================= @@ -1040,9 +1048,56 @@ void SMESH_MeshEditor_i::ExtrusionSweepObject2D(SMESH::SMESH_IDSource_ptr theObj gp_Vec stepVec( P->x, P->y, P->z ); ::SMESH_MeshEditor anEditor( _myMesh ); - anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps); + //anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps); + TElemOfElemListMap aHystory; + anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps, aHystory); +} + + +//======================================================================= +//function : AdvancedExtrusion +//purpose : +//======================================================================= + +void SMESH_MeshEditor_i::AdvancedExtrusion(const SMESH::long_array & theIDsOfElements, + const SMESH::DirStruct & theStepVector, + CORBA::Long theNbOfSteps, + CORBA::Long theExtrFlags, + CORBA::Double theSewTolerance) +{ + SMESHDS_Mesh* aMesh = GetMeshDS(); + + set elements; + for (int i = 0; i < theIDsOfElements.length(); i++) + { + CORBA::Long index = theIDsOfElements[i]; + const SMDS_MeshElement * elem = aMesh->FindElement(index); + if ( elem ) + elements.insert( elem ); + } + const SMESH::PointStruct * P = &theStepVector.PS; + gp_Vec stepVec( P->x, P->y, P->z ); + + ::SMESH_MeshEditor anEditor( _myMesh ); + TElemOfElemListMap aHystory; + anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps, aHystory, + theExtrFlags, theSewTolerance); + + // Update Python script + TCollection_AsciiString str = "stepVector = SMESH.DirStruct( SMESH.PointStruct ( "; + str += (TCollection_AsciiString) stepVec.X() + ", "; + str += (TCollection_AsciiString) stepVec.Y() + ", "; + str += (TCollection_AsciiString) stepVec.Z() + " ))"; + SMESH_Gen_i::AddToCurrentPyScript( str ); + str = ("mesh_editor.AdvancedExtrusion("); + SMESH_Gen_i::AddArray( str, theIDsOfElements ) += ", stepVector, "; + str += TCollection_AsciiString((int)theNbOfSteps) + ","; + str += TCollection_AsciiString((int)theExtrFlags) + ", "; + str += TCollection_AsciiString((double)theSewTolerance) + " )"; + SMESH_Gen_i::AddToCurrentPyScript( str ); } + #define RETCASE(enm) case ::SMESH_MeshEditor::enm: return SMESH::SMESH_MeshEditor::enm; static SMESH::SMESH_MeshEditor::Extrusion_Error convExtrError( const::SMESH_MeshEditor::Extrusion_Error e ) diff --git a/src/SMESH_I/SMESH_MeshEditor_i.hxx b/src/SMESH_I/SMESH_MeshEditor_i.hxx index 327c497a5..aa28198c1 100644 --- a/src/SMESH_I/SMESH_MeshEditor_i.hxx +++ b/src/SMESH_I/SMESH_MeshEditor_i.hxx @@ -141,6 +141,11 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor void ExtrusionSweepObject2D(SMESH::SMESH_IDSource_ptr theObject, const SMESH::DirStruct & StepVector, CORBA::Long NbOfSteps); + void AdvancedExtrusion(const SMESH::long_array & theIDsOfElements, + const SMESH::DirStruct & theStepVector, + CORBA::Long theNbOfSteps, + CORBA::Long theExtrFlags, + CORBA::Double theSewTolerance); SMESH::SMESH_MeshEditor::Extrusion_Error ExtrusionAlongPath(const SMESH::long_array & IDsOfElements, -- 2.30.2