mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-01-27 18:50:33 +05:00
Improvement of extrusion functionality
This commit is contained in:
parent
9efbaa6f5e
commit
868e306e09
@ -147,6 +147,14 @@ module SMESH
|
|||||||
typedef sequence<log_block> log_array;
|
typedef sequence<log_block> log_array;
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Auxilary flags 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
|
||||||
|
*/
|
||||||
|
const long EXTRUSION_FLAG_BOUNDARY = 1;
|
||||||
|
const long EXTRUSION_FLAG_SEW = 2;
|
||||||
|
|
||||||
interface SMESH_IDSource
|
interface SMESH_IDSource
|
||||||
{
|
{
|
||||||
/*!
|
/*!
|
||||||
@ -646,6 +654,19 @@ module SMESH
|
|||||||
in DirStruct StepVector,
|
in DirStruct StepVector,
|
||||||
in long NbOfSteps);
|
in long NbOfSteps);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Generate new elements by extrusion of theElements
|
||||||
|
* by StepVector by NbOfSteps
|
||||||
|
* param ExtrFlags set flags for performing extrusion
|
||||||
|
* param SewTolerance - uses for comparing locations of nodes if flag
|
||||||
|
* EXTRUSION_FLAG_SEW is set
|
||||||
|
*/
|
||||||
|
void AdvancedExtrusion(in long_array IDsOfElements,
|
||||||
|
in DirStruct StepVector,
|
||||||
|
in long NbOfSteps,
|
||||||
|
in long ExtrFlags,
|
||||||
|
in double SewTolerance);
|
||||||
|
|
||||||
void ExtrusionSweepObject(in SMESH_IDSource theObject,
|
void ExtrusionSweepObject(in SMESH_IDSource theObject,
|
||||||
in DirStruct StepVector,
|
in DirStruct StepVector,
|
||||||
in long NbOfSteps);
|
in long NbOfSteps);
|
||||||
|
@ -2410,14 +2410,45 @@ void SMESH_MeshEditor::RotationSweep(set<const SMDS_MeshElement*> & theElems,
|
|||||||
makeWalls( aMesh, mapNewNodes, newElemsMap, mapElemNewNodes, 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
|
//function : ExtrusionSweep
|
||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
|
|
||||||
void SMESH_MeshEditor::ExtrusionSweep(set<const SMDS_MeshElement*> & theElems,
|
void SMESH_MeshEditor::ExtrusionSweep
|
||||||
const gp_Vec& theStep,
|
(set<const SMDS_MeshElement*> & theElems,
|
||||||
const int theNbSteps)
|
const gp_Vec& theStep,
|
||||||
|
const int theNbSteps,
|
||||||
|
TElemOfElemListMap& newElemsMap,
|
||||||
|
const int theFlags,
|
||||||
|
const double theTolerance)
|
||||||
{
|
{
|
||||||
gp_Trsf aTrsf;
|
gp_Trsf aTrsf;
|
||||||
aTrsf.SetTranslation( theStep );
|
aTrsf.SetTranslation( theStep );
|
||||||
@ -2426,7 +2457,7 @@ void SMESH_MeshEditor::ExtrusionSweep(set<const SMDS_MeshElement*> & theElems,
|
|||||||
|
|
||||||
TNodeOfNodeListMap mapNewNodes;
|
TNodeOfNodeListMap mapNewNodes;
|
||||||
TElemOfVecOfNnlmiMap mapElemNewNodes;
|
TElemOfVecOfNnlmiMap mapElemNewNodes;
|
||||||
TElemOfElemListMap newElemsMap;
|
//TElemOfElemListMap newElemsMap;
|
||||||
|
|
||||||
// loop on theElems
|
// loop on theElems
|
||||||
set< const SMDS_MeshElement* >::iterator itElem;
|
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() };
|
double coord[] = { node->X(), node->Y(), node->Z() };
|
||||||
for ( int i = 0; i < theNbSteps; i++ ) {
|
for ( int i = 0; i < theNbSteps; i++ ) {
|
||||||
aTrsf.Transforms( coord[0], coord[1], coord[2] );
|
aTrsf.Transforms( coord[0], coord[1], coord[2] );
|
||||||
const SMDS_MeshNode * newNode = aMesh->AddNode( coord[0], coord[1], coord[2] );
|
if( theFlags & EXTRUSION_FLAG_SEW ) {
|
||||||
listNewNodes.push_back( newNode );
|
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 );
|
newNodesItVec.push_back( nIt );
|
||||||
}
|
}
|
||||||
// make new elements
|
// make new elements
|
||||||
sweepElement( aMesh, elem, newNodesItVec, newElemsMap[elem] );
|
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 <list>
|
||||||
#include <map>
|
#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_MeshElement;
|
||||||
class SMDS_MeshFace;
|
class SMDS_MeshFace;
|
||||||
@ -142,9 +143,46 @@ class SMESH_MeshEditor {
|
|||||||
// Generate new elements by rotation of theElements around theAxis
|
// Generate new elements by rotation of theElements around theAxis
|
||||||
// by theAngle by theNbSteps
|
// by theAngle by theNbSteps
|
||||||
|
|
||||||
void ExtrusionSweep (std::set<const SMDS_MeshElement*> & theElements,
|
/*!
|
||||||
const gp_Vec& theStep,
|
* Auxilary flag for advanced extrusion.
|
||||||
const int theNbSteps);
|
* 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
|
// Generate new elements by extrusion of theElements
|
||||||
// by theStep by theNbSteps
|
// by theStep by theNbSteps
|
||||||
|
|
||||||
@ -306,15 +344,10 @@ class SMESH_MeshEditor {
|
|||||||
|
|
||||||
SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); }
|
SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); }
|
||||||
|
|
||||||
const SMESH_DataMapOfElemPtrSequenceOfElemPtr& GetExtrusionHistory() const
|
|
||||||
{ return myExtrusionHistory; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
SMESH_Mesh * myMesh;
|
SMESH_Mesh * myMesh;
|
||||||
|
|
||||||
SMESH_DataMapOfElemPtrSequenceOfElemPtr myExtrusionHistory;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -45,6 +45,9 @@
|
|||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
typedef map<const SMDS_MeshElement*,
|
||||||
|
list<const SMDS_MeshElement*> > TElemOfElemListMap;
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@ -950,7 +953,9 @@ void SMESH_MeshEditor_i::ExtrusionSweep(const SMESH::long_array & theIDsOfElemen
|
|||||||
gp_Vec stepVec( P->x, P->y, P->z );
|
gp_Vec stepVec( P->x, P->y, P->z );
|
||||||
|
|
||||||
::SMESH_MeshEditor anEditor( _myMesh );
|
::SMESH_MeshEditor anEditor( _myMesh );
|
||||||
anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps);
|
//anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps);
|
||||||
|
TElemOfElemListMap aHystory;
|
||||||
|
anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps, aHystory);
|
||||||
|
|
||||||
// Update Python script
|
// Update Python script
|
||||||
TCollection_AsciiString str = "stepVector = SMESH.DirStruct( SMESH.PointStruct ( ";
|
TCollection_AsciiString str = "stepVector = SMESH.DirStruct( SMESH.PointStruct ( ";
|
||||||
@ -987,6 +992,7 @@ void SMESH_MeshEditor_i::ExtrusionSweepObject(SMESH::SMESH_IDSource_ptr theObjec
|
|||||||
str += TCollection_AsciiString((int)theNbOfSteps) + " )";
|
str += TCollection_AsciiString((int)theNbOfSteps) + " )";
|
||||||
SMESH_Gen_i::AddToCurrentPyScript( str );
|
SMESH_Gen_i::AddToCurrentPyScript( str );
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : ExtrusionSweepObject1D
|
//function : ExtrusionSweepObject1D
|
||||||
//purpose :
|
//purpose :
|
||||||
@ -1012,7 +1018,9 @@ void SMESH_MeshEditor_i::ExtrusionSweepObject1D(SMESH::SMESH_IDSource_ptr theObj
|
|||||||
gp_Vec stepVec( P->x, P->y, P->z );
|
gp_Vec stepVec( P->x, P->y, P->z );
|
||||||
|
|
||||||
::SMESH_MeshEditor anEditor( _myMesh );
|
::SMESH_MeshEditor anEditor( _myMesh );
|
||||||
anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps);
|
//anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps);
|
||||||
|
TElemOfElemListMap aHystory;
|
||||||
|
anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps, aHystory);
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@ -1040,9 +1048,56 @@ void SMESH_MeshEditor_i::ExtrusionSweepObject2D(SMESH::SMESH_IDSource_ptr theObj
|
|||||||
gp_Vec stepVec( P->x, P->y, P->z );
|
gp_Vec stepVec( P->x, P->y, P->z );
|
||||||
|
|
||||||
::SMESH_MeshEditor anEditor( _myMesh );
|
::SMESH_MeshEditor anEditor( _myMesh );
|
||||||
anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps);
|
//anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps);
|
||||||
|
TElemOfElemListMap aHystory;
|
||||||
|
anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps, aHystory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : AdvancedExtrusion
|
||||||
|
//purpose :
|
||||||
|
//=======================================================================
|
||||||
|
|
||||||
|
void SMESH_MeshEditor_i::AdvancedExtrusion(const SMESH::long_array & theIDsOfElements,
|
||||||
|
const SMESH::DirStruct & theStepVector,
|
||||||
|
CORBA::Long theNbOfSteps,
|
||||||
|
CORBA::Long theExtrFlags,
|
||||||
|
CORBA::Double theSewTolerance)
|
||||||
|
{
|
||||||
|
SMESHDS_Mesh* aMesh = GetMeshDS();
|
||||||
|
|
||||||
|
set<const SMDS_MeshElement*> elements;
|
||||||
|
for (int i = 0; i < theIDsOfElements.length(); i++)
|
||||||
|
{
|
||||||
|
CORBA::Long index = theIDsOfElements[i];
|
||||||
|
const SMDS_MeshElement * elem = aMesh->FindElement(index);
|
||||||
|
if ( elem )
|
||||||
|
elements.insert( elem );
|
||||||
|
}
|
||||||
|
const SMESH::PointStruct * P = &theStepVector.PS;
|
||||||
|
gp_Vec stepVec( P->x, P->y, P->z );
|
||||||
|
|
||||||
|
::SMESH_MeshEditor anEditor( _myMesh );
|
||||||
|
TElemOfElemListMap aHystory;
|
||||||
|
anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps, aHystory,
|
||||||
|
theExtrFlags, theSewTolerance);
|
||||||
|
|
||||||
|
// Update Python script
|
||||||
|
TCollection_AsciiString str = "stepVector = SMESH.DirStruct( SMESH.PointStruct ( ";
|
||||||
|
str += (TCollection_AsciiString) stepVec.X() + ", ";
|
||||||
|
str += (TCollection_AsciiString) stepVec.Y() + ", ";
|
||||||
|
str += (TCollection_AsciiString) stepVec.Z() + " ))";
|
||||||
|
SMESH_Gen_i::AddToCurrentPyScript( str );
|
||||||
|
str = ("mesh_editor.AdvancedExtrusion(");
|
||||||
|
SMESH_Gen_i::AddArray( str, theIDsOfElements ) += ", stepVector, ";
|
||||||
|
str += TCollection_AsciiString((int)theNbOfSteps) + ",";
|
||||||
|
str += TCollection_AsciiString((int)theExtrFlags) + ", ";
|
||||||
|
str += TCollection_AsciiString((double)theSewTolerance) + " )";
|
||||||
|
SMESH_Gen_i::AddToCurrentPyScript( str );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#define RETCASE(enm) case ::SMESH_MeshEditor::enm: return SMESH::SMESH_MeshEditor::enm;
|
#define RETCASE(enm) case ::SMESH_MeshEditor::enm: return SMESH::SMESH_MeshEditor::enm;
|
||||||
|
|
||||||
static SMESH::SMESH_MeshEditor::Extrusion_Error convExtrError( const::SMESH_MeshEditor::Extrusion_Error e )
|
static SMESH::SMESH_MeshEditor::Extrusion_Error convExtrError( const::SMESH_MeshEditor::Extrusion_Error e )
|
||||||
|
@ -141,6 +141,11 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor
|
|||||||
void ExtrusionSweepObject2D(SMESH::SMESH_IDSource_ptr theObject,
|
void ExtrusionSweepObject2D(SMESH::SMESH_IDSource_ptr theObject,
|
||||||
const SMESH::DirStruct & StepVector,
|
const SMESH::DirStruct & StepVector,
|
||||||
CORBA::Long NbOfSteps);
|
CORBA::Long NbOfSteps);
|
||||||
|
void AdvancedExtrusion(const SMESH::long_array & theIDsOfElements,
|
||||||
|
const SMESH::DirStruct & theStepVector,
|
||||||
|
CORBA::Long theNbOfSteps,
|
||||||
|
CORBA::Long theExtrFlags,
|
||||||
|
CORBA::Double theSewTolerance);
|
||||||
|
|
||||||
SMESH::SMESH_MeshEditor::Extrusion_Error
|
SMESH::SMESH_MeshEditor::Extrusion_Error
|
||||||
ExtrusionAlongPath(const SMESH::long_array & IDsOfElements,
|
ExtrusionAlongPath(const SMESH::long_array & IDsOfElements,
|
||||||
|
Loading…
Reference in New Issue
Block a user