mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-01-27 04:20:33 +05:00
Improvement of extrusion functionality
This commit is contained in:
parent
9efbaa6f5e
commit
868e306e09
@ -147,6 +147,14 @@ module SMESH
|
||||
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
|
||||
{
|
||||
/*!
|
||||
@ -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);
|
||||
|
@ -2410,14 +2410,45 @@ void SMESH_MeshEditor::RotationSweep(set<const SMDS_MeshElement*> & 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
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
void SMESH_MeshEditor::ExtrusionSweep(set<const SMDS_MeshElement*> & theElems,
|
||||
const gp_Vec& theStep,
|
||||
const int theNbSteps)
|
||||
void SMESH_MeshEditor::ExtrusionSweep
|
||||
(set<const SMDS_MeshElement*> & 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<const SMDS_MeshElement*> & 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<const SMDS_MeshElement*> & 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<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 );
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
|
@ -35,8 +35,9 @@
|
||||
|
||||
#include <list>
|
||||
#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_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<const SMDS_MeshElement*> & 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<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
|
||||
// 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
|
||||
|
@ -45,6 +45,9 @@
|
||||
|
||||
#include <sstream>
|
||||
|
||||
typedef map<const SMDS_MeshElement*,
|
||||
list<const SMDS_MeshElement*> > 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<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;
|
||||
|
||||
static SMESH::SMESH_MeshEditor::Extrusion_Error convExtrError( const::SMESH_MeshEditor::Extrusion_Error e )
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user