Improvement of extrusion functionality

This commit is contained in:
skl 2005-10-25 07:26:54 +00:00
parent 9efbaa6f5e
commit 868e306e09
5 changed files with 174 additions and 31 deletions

View File

@ -147,6 +147,14 @@ module SMESH
typedef sequence<log_block> log_array; typedef sequence<log_block> 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 interface SMESH_IDSource
{ {
/*! /*!
@ -646,6 +654,19 @@ module SMESH
in DirStruct StepVector, in DirStruct StepVector,
in long NbOfSteps); 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, void ExtrusionSweepObject(in SMESH_IDSource theObject,
in DirStruct StepVector, in DirStruct StepVector,
in long NbOfSteps); in long NbOfSteps);

View File

@ -2410,14 +2410,45 @@ void SMESH_MeshEditor::RotationSweep(set<const SMDS_MeshElement*> & theElems,
makeWalls( aMesh, mapNewNodes, newElemsMap, mapElemNewNodes, 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<const SMDS_MeshNode*> (itn->next());
gp_Pnt P2(aN->X(),aN->Y(),aN->Z());
if(P1.Distance(P2)<tolnode)
return aN;
}
// create new node and return it
const SMDS_MeshNode* NewNode = aMesh->AddNode(x,y,z);
return NewNode;
}
//======================================================================= //=======================================================================
//function : ExtrusionSweep //function : ExtrusionSweep
//purpose : //purpose :
//======================================================================= //=======================================================================
void SMESH_MeshEditor::ExtrusionSweep(set<const SMDS_MeshElement*> & theElems, void SMESH_MeshEditor::ExtrusionSweep
const gp_Vec& theStep, (set<const SMDS_MeshElement*> & theElems,
const int theNbSteps) const gp_Vec& theStep,
const int theNbSteps,
TElemOfElemListMap& newElemsMap,
const int theFlags,
const double theTolerance)
{ {
gp_Trsf aTrsf; gp_Trsf aTrsf;
aTrsf.SetTranslation( theStep ); aTrsf.SetTranslation( theStep );
@ -2426,7 +2457,7 @@ void SMESH_MeshEditor::ExtrusionSweep(set<const SMDS_MeshElement*> & theElems,
TNodeOfNodeListMap mapNewNodes; TNodeOfNodeListMap mapNewNodes;
TElemOfVecOfNnlmiMap mapElemNewNodes; TElemOfVecOfNnlmiMap mapElemNewNodes;
TElemOfElemListMap newElemsMap; //TElemOfElemListMap newElemsMap;
// loop on theElems // loop on theElems
set< const SMDS_MeshElement* >::iterator itElem; set< const SMDS_MeshElement* >::iterator itElem;
@ -2457,27 +2488,25 @@ void SMESH_MeshEditor::ExtrusionSweep(set<const SMDS_MeshElement*> & theElems,
double coord[] = { node->X(), node->Y(), node->Z() }; double coord[] = { node->X(), node->Y(), node->Z() };
for ( int i = 0; i < theNbSteps; i++ ) { for ( int i = 0; i < theNbSteps; i++ ) {
aTrsf.Transforms( coord[0], coord[1], coord[2] ); aTrsf.Transforms( coord[0], coord[1], coord[2] );
const SMDS_MeshNode * newNode = aMesh->AddNode( coord[0], coord[1], coord[2] ); if( theFlags & EXTRUSION_FLAG_SEW ) {
listNewNodes.push_back( newNode ); 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 ); newNodesItVec.push_back( nIt );
} }
// make new elements // make new elements
sweepElement( aMesh, elem, newNodesItVec, newElemsMap[elem] ); sweepElement( aMesh, elem, newNodesItVec, newElemsMap[elem] );
// fill history
SMESH_SequenceOfElemPtr SeqNewME;
list<const SMDS_MeshElement*> tmpList = newElemsMap[elem];
for(list<const SMDS_MeshElement*>::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 );
}
} }
//======================================================================= //=======================================================================

View File

@ -35,8 +35,9 @@
#include <list> #include <list>
#include <map> #include <map>
//#include <TColStd_DataMapOfIntegerListOfInteger.hxx>
#include <SMESH_DataMapOfElemPtrSequenceOfElemPtr.hxx> typedef map<const SMDS_MeshElement*,
list<const SMDS_MeshElement*> > TElemOfElemListMap;
class SMDS_MeshElement; class SMDS_MeshElement;
class SMDS_MeshFace; class SMDS_MeshFace;
@ -142,9 +143,46 @@ class SMESH_MeshEditor {
// Generate new elements by rotation of theElements around theAxis // Generate new elements by rotation of theElements around theAxis
// by theAngle by theNbSteps // by theAngle by theNbSteps
void ExtrusionSweep (std::set<const SMDS_MeshElement*> & theElements, /*!
const gp_Vec& theStep, * Auxilary flag for advanced extrusion.
const int theNbSteps); * 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<const SMDS_MeshElement*> & theElements,
// const gp_Vec& theStep,
// const int theNbSteps);
void ExtrusionSweep
(set<const SMDS_MeshElement*> & 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 // Generate new elements by extrusion of theElements
// by theStep by theNbSteps // by theStep by theNbSteps
@ -306,15 +344,10 @@ class SMESH_MeshEditor {
SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); } SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); }
const SMESH_DataMapOfElemPtrSequenceOfElemPtr& GetExtrusionHistory() const
{ return myExtrusionHistory; }
private: private:
SMESH_Mesh * myMesh; SMESH_Mesh * myMesh;
SMESH_DataMapOfElemPtrSequenceOfElemPtr myExtrusionHistory;
}; };
#endif #endif

View File

@ -45,6 +45,9 @@
#include <sstream> #include <sstream>
typedef map<const SMDS_MeshElement*,
list<const SMDS_MeshElement*> > TElemOfElemListMap;
using namespace std; 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 ); gp_Vec stepVec( P->x, P->y, P->z );
::SMESH_MeshEditor anEditor( _myMesh ); ::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 // Update Python script
TCollection_AsciiString str = "stepVector = SMESH.DirStruct( SMESH.PointStruct ( "; 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) + " )"; str += TCollection_AsciiString((int)theNbOfSteps) + " )";
SMESH_Gen_i::AddToCurrentPyScript( str ); SMESH_Gen_i::AddToCurrentPyScript( str );
} }
//======================================================================= //=======================================================================
//function : ExtrusionSweepObject1D //function : ExtrusionSweepObject1D
//purpose : //purpose :
@ -1012,7 +1018,9 @@ void SMESH_MeshEditor_i::ExtrusionSweepObject1D(SMESH::SMESH_IDSource_ptr theObj
gp_Vec stepVec( P->x, P->y, P->z ); gp_Vec stepVec( P->x, P->y, P->z );
::SMESH_MeshEditor anEditor( _myMesh ); ::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 ); gp_Vec stepVec( P->x, P->y, P->z );
::SMESH_MeshEditor anEditor( _myMesh ); ::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<const SMDS_MeshElement*> 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; #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 ) static SMESH::SMESH_MeshEditor::Extrusion_Error convExtrError( const::SMESH_MeshEditor::Extrusion_Error e )

View File

@ -141,6 +141,11 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor
void ExtrusionSweepObject2D(SMESH::SMESH_IDSource_ptr theObject, void ExtrusionSweepObject2D(SMESH::SMESH_IDSource_ptr theObject,
const SMESH::DirStruct & StepVector, const SMESH::DirStruct & StepVector,
CORBA::Long NbOfSteps); 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 SMESH::SMESH_MeshEditor::Extrusion_Error
ExtrusionAlongPath(const SMESH::long_array & IDsOfElements, ExtrusionAlongPath(const SMESH::long_array & IDsOfElements,