mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-11-11 16:19:16 +05:00
Improvement of extrusion functionality
This commit is contained in:
parent
f0cefe4519
commit
db9a6dee24
@ -49,7 +49,8 @@ EXPORT_HEADERS= \
|
||||
SMESH_Pattern.hxx \
|
||||
SMESH_IndexedDataMapOfShapeIndexedMapOfShape.hxx \
|
||||
SMESH_DataMapOfElemPtrSequenceOfElemPtr.hxx \
|
||||
SMESH_SequenceOfElemPtr.hxx
|
||||
SMESH_SequenceOfElemPtr.hxx \
|
||||
SMESH_SequenceOfNode.hxx
|
||||
|
||||
EXPORT_PYSCRIPTS =
|
||||
|
||||
|
@ -77,6 +77,7 @@ typedef map<const SMDS_MeshNode*, list<const SMDS_MeshNode*> > TNodeOfNode
|
||||
typedef TNodeOfNodeListMap::iterator TNodeOfNodeListMapItr;
|
||||
typedef map<const SMDS_MeshElement*, vector<TNodeOfNodeListMapItr> > TElemOfVecOfNnlmiMap;
|
||||
|
||||
|
||||
//=======================================================================
|
||||
//function : SMESH_MeshEditor
|
||||
//purpose :
|
||||
@ -2419,18 +2420,33 @@ void SMESH_MeshEditor::RotationSweep(set<const SMDS_MeshElement*> & theElems,
|
||||
const SMDS_MeshNode* SMESH_MeshEditor::CreateNode(const double x,
|
||||
const double y,
|
||||
const double z,
|
||||
const double tolnode)
|
||||
const double tolnode,
|
||||
SMESH_SequenceOfNode& aNodes)
|
||||
{
|
||||
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;
|
||||
}
|
||||
// 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();
|
||||
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;
|
||||
@ -2450,14 +2466,35 @@ void SMESH_MeshEditor::ExtrusionSweep
|
||||
const int theFlags,
|
||||
const double theTolerance)
|
||||
{
|
||||
gp_Trsf aTrsf;
|
||||
aTrsf.SetTranslation( theStep );
|
||||
ExtrusParam aParams;
|
||||
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();
|
||||
|
||||
TNodeOfNodeListMap mapNewNodes;
|
||||
TElemOfVecOfNnlmiMap mapElemNewNodes;
|
||||
//TElemOfElemListMap newElemsMap;
|
||||
|
||||
// loop on theElems
|
||||
set< const SMDS_MeshElement* >::iterator itElem;
|
||||
@ -2486,11 +2523,15 @@ void SMESH_MeshEditor::ExtrusionSweep
|
||||
|
||||
// make new nodes
|
||||
double coord[] = { node->X(), node->Y(), node->Z() };
|
||||
for ( int i = 0; i < theNbSteps; i++ ) {
|
||||
aTrsf.Transforms( coord[0], coord[1], coord[2] );
|
||||
int nbsteps = theParams.mySteps->Length();
|
||||
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 ) {
|
||||
const SMDS_MeshNode * newNode = CreateNode(coord[0], coord[1],
|
||||
coord[2], theTolerance);
|
||||
const SMDS_MeshNode * newNode = CreateNode(coord[0], coord[1], coord[2],
|
||||
theTolerance, theParams.myNodes);
|
||||
listNewNodes.push_back( newNode );
|
||||
}
|
||||
else {
|
||||
@ -2509,6 +2550,7 @@ void SMESH_MeshEditor::ExtrusionSweep
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//=======================================================================
|
||||
//class : SMESH_MeshEditor_PathPoint
|
||||
//purpose : auxiliary class
|
||||
|
@ -32,6 +32,9 @@
|
||||
|
||||
#include "SMESH_Mesh.hxx"
|
||||
#include "SMESH_Controls.hxx"
|
||||
#include "SMESH_SequenceOfNode.hxx"
|
||||
#include "gp_Dir.hxx"
|
||||
#include "TColStd_HSequenceOfReal.hxx"
|
||||
|
||||
#include <list>
|
||||
#include <map>
|
||||
@ -153,6 +156,15 @@ class SMESH_MeshEditor {
|
||||
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
|
||||
* (auxilary for advanced extrusion)
|
||||
@ -160,29 +172,46 @@ class SMESH_MeshEditor {
|
||||
const SMDS_MeshNode* CreateNode(const double x,
|
||||
const double y,
|
||||
const double z,
|
||||
const double tolnode);
|
||||
const double tolnode,
|
||||
SMESH_SequenceOfNode& aNodes);
|
||||
|
||||
/*!
|
||||
* Generate new elements by extrusion of theElements
|
||||
* by theStep by theNbSteps
|
||||
* param theHistory returns history of extrusion
|
||||
* Generate new elements by extrusion of theElements
|
||||
* It is a method used in .idl file. All functionality
|
||||
* 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
|
||||
* 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
|
||||
* 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
|
||||
// by theStep by theNbSteps
|
||||
|
||||
|
19
src/SMESH/SMESH_SequenceOfNode.hxx
Normal file
19
src/SMESH/SMESH_SequenceOfNode.hxx
Normal 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
|
Loading…
Reference in New Issue
Block a user