mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-11-14 09:38:33 +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_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 =
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
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