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
{
/*!
in DirStruct StepVector,
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,
in DirStruct StepVector,
in long NbOfSteps);
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
//purpose :
//=======================================================================
-void SMESH_MeshEditor::ExtrusionSweep(set<const SMDS_MeshElement*> & theElems,
- const gp_Vec& theStep,
- const int theNbSteps)
+void SMESH_MeshEditor::ExtrusionSweep
+ (set<const SMDS_MeshElement*> & theElems,
+ const gp_Vec& theStep,
+ const int theNbSteps,
+ TElemOfElemListMap& newElemsMap,
+ const int theFlags,
+ const double theTolerance)
{
gp_Trsf aTrsf;
aTrsf.SetTranslation( theStep );
TNodeOfNodeListMap mapNewNodes;
TElemOfVecOfNnlmiMap mapElemNewNodes;
- TElemOfElemListMap newElemsMap;
+ //TElemOfElemListMap newElemsMap;
// loop on theElems
set< const SMDS_MeshElement* >::iterator itElem;
double coord[] = { node->X(), node->Y(), node->Z() };
for ( int i = 0; i < theNbSteps; i++ ) {
aTrsf.Transforms( coord[0], coord[1], coord[2] );
- const SMDS_MeshNode * newNode = aMesh->AddNode( coord[0], coord[1], coord[2] );
- listNewNodes.push_back( newNode );
+ if( theFlags & EXTRUSION_FLAG_SEW ) {
+ 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 );
}
// make new elements
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 );
+ }
}
//=======================================================================
#include <list>
#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_MeshFace;
// Generate new elements by rotation of theElements around theAxis
// by theAngle by theNbSteps
- void ExtrusionSweep (std::set<const SMDS_MeshElement*> & theElements,
- const gp_Vec& theStep,
- const int theNbSteps);
+ /*!
+ * Auxilary flag 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
+ */
+ 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
// by theStep by theNbSteps
SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); }
- const SMESH_DataMapOfElemPtrSequenceOfElemPtr& GetExtrusionHistory() const
- { return myExtrusionHistory; }
-
private:
SMESH_Mesh * myMesh;
- SMESH_DataMapOfElemPtrSequenceOfElemPtr myExtrusionHistory;
-
};
#endif
#include <sstream>
+typedef map<const SMDS_MeshElement*,
+ list<const SMDS_MeshElement*> > TElemOfElemListMap;
+
using namespace std;
//=======================================================================
gp_Vec stepVec( P->x, P->y, P->z );
::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
TCollection_AsciiString str = "stepVector = SMESH.DirStruct( SMESH.PointStruct ( ";
str += TCollection_AsciiString((int)theNbOfSteps) + " )";
SMESH_Gen_i::AddToCurrentPyScript( str );
}
+
//=======================================================================
//function : ExtrusionSweepObject1D
//purpose :
gp_Vec stepVec( P->x, P->y, P->z );
::SMESH_MeshEditor anEditor( _myMesh );
- anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps);
+ //anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps);
+ TElemOfElemListMap aHystory;
+ anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps, aHystory);
}
//=======================================================================
gp_Vec stepVec( P->x, P->y, P->z );
::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;
static SMESH::SMESH_MeshEditor::Extrusion_Error convExtrError( const::SMESH_MeshEditor::Extrusion_Error e )
void ExtrusionSweepObject2D(SMESH::SMESH_IDSource_ptr theObject,
const SMESH::DirStruct & StepVector,
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
ExtrusionAlongPath(const SMESH::long_array & IDsOfElements,