Salome HOME
Improvement of extrusion functionality
authorskl <skl@opencascade.com>
Tue, 25 Oct 2005 07:26:54 +0000 (07:26 +0000)
committerskl <skl@opencascade.com>
Tue, 25 Oct 2005 07:26:54 +0000 (07:26 +0000)
idl/SMESH_Mesh.idl
src/SMESH/SMESH_MeshEditor.cxx
src/SMESH/SMESH_MeshEditor.hxx
src/SMESH_I/SMESH_MeshEditor_i.cxx
src/SMESH_I/SMESH_MeshEditor_i.hxx

index 7dee0ce3f213ed8057c9f907c5912d8fb8c2bf7d..1fe2f2dd8c10642f7cd64631258545e0fe2a8f0e 100644 (file)
@@ -147,6 +147,14 @@ module SMESH
   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
   {
     /*!
@@ -646,6 +654,19 @@ module SMESH
                         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);
index 846a3cc31b5e6779b75d820565f24f786197b07a..b73f854d2e02183bdd38380e856e61733bb49344 100644 (file)
@@ -2410,14 +2410,45 @@ void SMESH_MeshEditor::RotationSweep(set<const SMDS_MeshElement*> & 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
 //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 );
@@ -2426,7 +2457,7 @@ void SMESH_MeshEditor::ExtrusionSweep(set<const SMDS_MeshElement*> & theElems,
 
   TNodeOfNodeListMap mapNewNodes;
   TElemOfVecOfNnlmiMap mapElemNewNodes;
-  TElemOfElemListMap newElemsMap;
+  //TElemOfElemListMap newElemsMap;
 
   // loop on theElems
   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() };
         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 );
+  }
 }
 
 //=======================================================================
index 6c4dc76c8ef55a38daac5e66238e305382225385..ea02a7a7c105e3229b86d7d7e560ae850f3c450a 100644 (file)
@@ -35,8 +35,9 @@
 
 #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;
@@ -142,9 +143,46 @@ class SMESH_MeshEditor {
   // 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
 
@@ -306,15 +344,10 @@ class SMESH_MeshEditor {
 
   SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); }
 
-  const SMESH_DataMapOfElemPtrSequenceOfElemPtr& GetExtrusionHistory() const
-    { return myExtrusionHistory; }
-
  private:
 
   SMESH_Mesh * myMesh;
 
-  SMESH_DataMapOfElemPtrSequenceOfElemPtr myExtrusionHistory;
-
 };
 
 #endif
index 0c46be9fe4b994850d2c7639fea6db5369e61fc3..76f79d76b37b6cf36603842e64b0c609247dfdf8 100644 (file)
@@ -45,6 +45,9 @@
 
 #include <sstream>
 
+typedef map<const SMDS_MeshElement*,
+            list<const SMDS_MeshElement*> > TElemOfElemListMap;
+
 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 );
 
   ::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 ( ";
@@ -987,6 +992,7 @@ void SMESH_MeshEditor_i::ExtrusionSweepObject(SMESH::SMESH_IDSource_ptr theObjec
   str += TCollection_AsciiString((int)theNbOfSteps) + " )";
   SMESH_Gen_i::AddToCurrentPyScript( str );
 }
+
 //=======================================================================
 //function : ExtrusionSweepObject1D
 //purpose  :
@@ -1012,7 +1018,9 @@ void SMESH_MeshEditor_i::ExtrusionSweepObject1D(SMESH::SMESH_IDSource_ptr theObj
   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);
 }
 
 //=======================================================================
@@ -1040,9 +1048,56 @@ void SMESH_MeshEditor_i::ExtrusionSweepObject2D(SMESH::SMESH_IDSource_ptr theObj
   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 )
index 327c497a5bc87335c365be0eee2982638b2f4d83..aa28198c1fb6bef8e5fc6d5833e33afb6543b30d 100644 (file)
@@ -141,6 +141,11 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor
   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,