mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-01-27 04:10:33 +05:00
Inmprovement extrusion algorithm in MeshEditor
This commit is contained in:
parent
d03efc5f7a
commit
423f097f5e
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user