From db9a6dee242042be12ba2cbb986e56988fccc664 Mon Sep 17 00:00:00 2001 From: skl Date: Mon, 14 Nov 2005 12:41:17 +0000 Subject: [PATCH] Improvement of extrusion functionality --- src/SMESH/Makefile.in | 3 +- src/SMESH/SMESH_MeshEditor.cxx | 72 +++++++++++++++++++++++------- src/SMESH/SMESH_MeshEditor.hxx | 45 +++++++++++++++---- src/SMESH/SMESH_SequenceOfNode.hxx | 19 ++++++++ 4 files changed, 115 insertions(+), 24 deletions(-) create mode 100644 src/SMESH/SMESH_SequenceOfNode.hxx diff --git a/src/SMESH/Makefile.in b/src/SMESH/Makefile.in index 613502dc2..a311488eb 100644 --- a/src/SMESH/Makefile.in +++ b/src/SMESH/Makefile.in @@ -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 = diff --git a/src/SMESH/SMESH_MeshEditor.cxx b/src/SMESH/SMESH_MeshEditor.cxx index b73f854d2..d75adf3e7 100644 --- a/src/SMESH/SMESH_MeshEditor.cxx +++ b/src/SMESH/SMESH_MeshEditor.cxx @@ -77,6 +77,7 @@ typedef map > TNodeOfNode typedef TNodeOfNodeListMap::iterator TNodeOfNodeListMapItr; typedef map > TElemOfVecOfNnlmiMap; + //======================================================================= //function : SMESH_MeshEditor //purpose : @@ -2419,18 +2420,33 @@ void SMESH_MeshEditor::RotationSweep(set & 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 (itn->next()); - gp_Pnt P2(aN->X(),aN->Y(),aN->Z()); - if(P1.Distance(P2)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)nodesIterator(); + while(itn->more()) { + const SMDS_MeshNode* aN = static_cast (itn->next()); + gp_Pnt P2(aN->X(),aN->Y(),aN->Z()); + if(P1.Distance(P2)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 & 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 diff --git a/src/SMESH/SMESH_MeshEditor.hxx b/src/SMESH/SMESH_MeshEditor.hxx index ea02a7a7c..78457ef15 100644 --- a/src/SMESH/SMESH_MeshEditor.hxx +++ b/src/SMESH/SMESH_MeshEditor.hxx @@ -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 #include @@ -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 & theElements, - // const gp_Vec& theStep, - // const int theNbSteps); void ExtrusionSweep (set & 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 & theElems, + ExtrusParam& theParams, + TElemOfElemListMap& newElemsMap, + const int theFlags, + const double theTolerance); + + // Generate new elements by extrusion of theElements // by theStep by theNbSteps diff --git a/src/SMESH/SMESH_SequenceOfNode.hxx b/src/SMESH/SMESH_SequenceOfNode.hxx new file mode 100644 index 000000000..2781ee190 --- /dev/null +++ b/src/SMESH/SMESH_SequenceOfNode.hxx @@ -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 + +typedef const SMDS_MeshNode* SMDS_MeshNodePtr; + +DEFINE_BASECOLLECTION (SMESH_BaseCollectionNodePtr, SMDS_MeshNodePtr) +DEFINE_SEQUENCE(SMESH_SequenceOfNode, + SMESH_BaseCollectionNodePtr, SMDS_MeshNodePtr) + + +#endif -- 2.39.2