typedef TNodeOfNodeListMap::iterator TNodeOfNodeListMapItr;
typedef map<const SMDS_MeshElement*, vector<TNodeOfNodeListMapItr> > TElemOfVecOfNnlmiMap;
+
//=======================================================================
//function : SMESH_MeshEditor
//purpose :
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;
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;
// 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 {
}
}
+
//=======================================================================
//class : SMESH_MeshEditor_PathPoint
//purpose : auxiliary class
#include "SMESH_Mesh.hxx"
#include "SMESH_Controls.hxx"
+#include "SMESH_SequenceOfNode.hxx"
+#include "gp_Dir.hxx"
+#include "TColStd_HSequenceOfReal.hxx"
#include <list>
#include <map>
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)
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