Improvement of extrusion functionality

This commit is contained in:
skl 2005-11-14 12:41:17 +00:00
parent f0cefe4519
commit db9a6dee24
4 changed files with 115 additions and 24 deletions

View File

@ -49,7 +49,8 @@ EXPORT_HEADERS= \
SMESH_Pattern.hxx \ SMESH_Pattern.hxx \
SMESH_IndexedDataMapOfShapeIndexedMapOfShape.hxx \ SMESH_IndexedDataMapOfShapeIndexedMapOfShape.hxx \
SMESH_DataMapOfElemPtrSequenceOfElemPtr.hxx \ SMESH_DataMapOfElemPtrSequenceOfElemPtr.hxx \
SMESH_SequenceOfElemPtr.hxx SMESH_SequenceOfElemPtr.hxx \
SMESH_SequenceOfNode.hxx
EXPORT_PYSCRIPTS = EXPORT_PYSCRIPTS =

View File

@ -77,6 +77,7 @@ typedef map<const SMDS_MeshNode*, list<const SMDS_MeshNode*> > TNodeOfNode
typedef TNodeOfNodeListMap::iterator TNodeOfNodeListMapItr; typedef TNodeOfNodeListMap::iterator TNodeOfNodeListMapItr;
typedef map<const SMDS_MeshElement*, vector<TNodeOfNodeListMapItr> > TElemOfVecOfNnlmiMap; typedef map<const SMDS_MeshElement*, vector<TNodeOfNodeListMapItr> > TElemOfVecOfNnlmiMap;
//======================================================================= //=======================================================================
//function : SMESH_MeshEditor //function : SMESH_MeshEditor
//purpose : //purpose :
@ -2419,11 +2420,24 @@ void SMESH_MeshEditor::RotationSweep(set<const SMDS_MeshElement*> & theElems,
const SMDS_MeshNode* SMESH_MeshEditor::CreateNode(const double x, const SMDS_MeshNode* SMESH_MeshEditor::CreateNode(const double x,
const double y, const double y,
const double z, const double z,
const double tolnode) const double tolnode,
SMESH_SequenceOfNode& aNodes)
{ {
gp_Pnt P1(x,y,z); gp_Pnt P1(x,y,z);
SMESHDS_Mesh * aMesh = myMesh->GetMeshDS(); SMESHDS_Mesh * aMesh = myMesh->GetMeshDS();
// try to search in sequence of existing nodes // try to search in sequence of existing nodes
// if aNodes.Length()>0 we 'nave to use given sequence
// else - use all nodes of mesh
if(aNodes.Length()>0) {
int i;
for(i=1; i<=aNodes.Length(); i++) {
gp_Pnt P2(aNodes.Value(i)->X(),aNodes.Value(i)->Y(),aNodes.Value(i)->Z());
if(P1.Distance(P2)<tolnode)
return aNodes.Value(i);
}
}
else {
SMDS_NodeIteratorPtr itn = aMesh->nodesIterator(); SMDS_NodeIteratorPtr itn = aMesh->nodesIterator();
while(itn->more()) { while(itn->more()) {
const SMDS_MeshNode* aN = static_cast<const SMDS_MeshNode*> (itn->next()); const SMDS_MeshNode* aN = static_cast<const SMDS_MeshNode*> (itn->next());
@ -2431,6 +2445,8 @@ const SMDS_MeshNode* SMESH_MeshEditor::CreateNode(const double x,
if(P1.Distance(P2)<tolnode) if(P1.Distance(P2)<tolnode)
return aN; return aN;
} }
}
// create new node and return it // create new node and return it
const SMDS_MeshNode* NewNode = aMesh->AddNode(x,y,z); const SMDS_MeshNode* NewNode = aMesh->AddNode(x,y,z);
return NewNode; return NewNode;
@ -2450,14 +2466,35 @@ void SMESH_MeshEditor::ExtrusionSweep
const int theFlags, const int theFlags,
const double theTolerance) const double theTolerance)
{ {
gp_Trsf aTrsf; ExtrusParam aParams;
aTrsf.SetTranslation( theStep ); aParams.myDir = gp_Dir(theStep);
aParams.myNodes.Clear();
aParams.mySteps = new TColStd_HSequenceOfReal;
int i;
for(i=1; i<=theNbSteps; i++)
aParams.mySteps->Append(theStep.Magnitude());
ExtrusionSweep(theElems,aParams,newElemsMap,theFlags,theTolerance);
}
//=======================================================================
//function : ExtrusionSweep
//purpose :
//=======================================================================
void SMESH_MeshEditor::ExtrusionSweep
(set<const SMDS_MeshElement*> & theElems,
ExtrusParam& theParams,
TElemOfElemListMap& newElemsMap,
const int theFlags,
const double theTolerance)
{
SMESHDS_Mesh* aMesh = GetMeshDS(); SMESHDS_Mesh* aMesh = GetMeshDS();
TNodeOfNodeListMap mapNewNodes; TNodeOfNodeListMap mapNewNodes;
TElemOfVecOfNnlmiMap mapElemNewNodes; TElemOfVecOfNnlmiMap mapElemNewNodes;
//TElemOfElemListMap newElemsMap;
// loop on theElems // loop on theElems
set< const SMDS_MeshElement* >::iterator itElem; set< const SMDS_MeshElement* >::iterator itElem;
@ -2486,11 +2523,15 @@ void SMESH_MeshEditor::ExtrusionSweep
// make new nodes // make new nodes
double coord[] = { node->X(), node->Y(), node->Z() }; double coord[] = { node->X(), node->Y(), node->Z() };
for ( int i = 0; i < theNbSteps; i++ ) { int nbsteps = theParams.mySteps->Length();
aTrsf.Transforms( coord[0], coord[1], coord[2] ); for ( int i = 0; i < nbsteps; i++ ) {
//aTrsf.Transforms( coord[0], coord[1], coord[2] );
coord[0] = coord[0] + theParams.myDir.X()*theParams.mySteps->Value(i+1);
coord[1] = coord[1] + theParams.myDir.Y()*theParams.mySteps->Value(i+1);
coord[2] = coord[2] + theParams.myDir.Z()*theParams.mySteps->Value(i+1);
if( theFlags & EXTRUSION_FLAG_SEW ) { if( theFlags & EXTRUSION_FLAG_SEW ) {
const SMDS_MeshNode * newNode = CreateNode(coord[0], coord[1], const SMDS_MeshNode * newNode = CreateNode(coord[0], coord[1], coord[2],
coord[2], theTolerance); theTolerance, theParams.myNodes);
listNewNodes.push_back( newNode ); listNewNodes.push_back( newNode );
} }
else { else {
@ -2509,6 +2550,7 @@ void SMESH_MeshEditor::ExtrusionSweep
} }
} }
//======================================================================= //=======================================================================
//class : SMESH_MeshEditor_PathPoint //class : SMESH_MeshEditor_PathPoint
//purpose : auxiliary class //purpose : auxiliary class

View File

@ -32,6 +32,9 @@
#include "SMESH_Mesh.hxx" #include "SMESH_Mesh.hxx"
#include "SMESH_Controls.hxx" #include "SMESH_Controls.hxx"
#include "SMESH_SequenceOfNode.hxx"
#include "gp_Dir.hxx"
#include "TColStd_HSequenceOfReal.hxx"
#include <list> #include <list>
#include <map> #include <map>
@ -153,6 +156,15 @@ class SMESH_MeshEditor {
EXTRUSION_FLAG_SEW = 0x02 EXTRUSION_FLAG_SEW = 0x02
}; };
/*!
* special structire for control of extrusion functionality
*/
struct ExtrusParam {
gp_Dir myDir; // direction of extrusion
Handle(TColStd_HSequenceOfReal) mySteps; // magnitudes for each step
SMESH_SequenceOfNode myNodes; // nodes for using in sewing
};
/*! /*!
* Create new node in the mesh with given coordinates * Create new node in the mesh with given coordinates
* (auxilary for advanced extrusion) * (auxilary for advanced extrusion)
@ -160,29 +172,46 @@ class SMESH_MeshEditor {
const SMDS_MeshNode* CreateNode(const double x, const SMDS_MeshNode* CreateNode(const double x,
const double y, const double y,
const double z, const double z,
const double tolnode); const double tolnode,
SMESH_SequenceOfNode& aNodes);
/*! /*!
* Generate new elements by extrusion of theElements * Generate new elements by extrusion of theElements
* by theStep by theNbSteps * It is a method used in .idl file. All functionality
* param theHistory returns history of extrusion * is implemented in the next method (see below) which
* is used in the cuurent method.
* param theElems - list of elements for extrusion
* param newElemsMap returns history of extrusion
* param theFlags set flags for performing extrusion (see description * param theFlags set flags for performing extrusion (see description
* of enum ExtrusionFlags for additional information) * of enum ExtrusionFlags for additional information)
* param theTolerance - uses for comparing locations of nodes if flag * param theTolerance - uses for comparing locations of nodes if flag
* EXTRUSION_FLAG_SEW is set * EXTRUSION_FLAG_SEW is set
*/ */
//void ExtrusionSweep (std::set<const SMDS_MeshElement*> & theElements,
// const gp_Vec& theStep,
// const int theNbSteps);
void ExtrusionSweep void ExtrusionSweep
(set<const SMDS_MeshElement*> & theElems, (set<const SMDS_MeshElement*> & theElems,
const gp_Vec& theStep, const gp_Vec& theStep,
const int theNbSteps, const int theNbSteps,
TElemOfElemListMap& newElemsMap, TElemOfElemListMap& newElemsMap,
//SMESH_DataMapOfElemPtrSequenceOfElemPtr& theHistory,
const int theFlags = EXTRUSION_FLAG_BOUNDARY, const int theFlags = EXTRUSION_FLAG_BOUNDARY,
const double theTolerance = 1.e-6); const double theTolerance = 1.e-6);
/*!
* Generate new elements by extrusion of theElements
* param theElems - list of elements for extrusion
* param newElemsMap 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
* param theParams - special structure for manage of extrusion
*/
void ExtrusionSweep (set<const SMDS_MeshElement*> & theElems,
ExtrusParam& theParams,
TElemOfElemListMap& newElemsMap,
const int theFlags,
const double theTolerance);
// Generate new elements by extrusion of theElements // Generate new elements by extrusion of theElements
// by theStep by theNbSteps // by theStep by theNbSteps

View File

@ -0,0 +1,19 @@
// File: SMESH_SequenceOfNode.hxx
// Created: 11.11.05 10:00:04
// Author: Sergey KUUL
// Copyright: Open CASCADE 2005
#ifndef SMESH_SequenceOfNode_HeaderFile
#define SMESH_SequenceOfNode_HeaderFile
#include <NCollection_DefineSequence.hxx>
typedef const SMDS_MeshNode* SMDS_MeshNodePtr;
DEFINE_BASECOLLECTION (SMESH_BaseCollectionNodePtr, SMDS_MeshNodePtr)
DEFINE_SEQUENCE(SMESH_SequenceOfNode,
SMESH_BaseCollectionNodePtr, SMDS_MeshNodePtr)
#endif