Salome HOME
PAL19802 A "Clear Mesh data" method for SMESH.Mesh objects
authoreap <eap@opencascade.com>
Mon, 26 May 2008 14:14:19 +0000 (14:14 +0000)
committereap <eap@opencascade.com>
Mon, 26 May 2008 14:14:19 +0000 (14:14 +0000)
14 files changed:
doc/salome/gui/SMESH/images/mesh_clear.png [new file with mode: 0644]
idl/SMESH_Mesh.idl
resources/Makefile.am
resources/mesh_clear.png [new file with mode: 0644]
src/SMESH/SMESH_Mesh.cxx
src/SMESH/SMESH_Mesh.hxx
src/SMESH/SMESH_subMesh.cxx
src/SMESHGUI/SMESHGUI.cxx
src/SMESHGUI/SMESH_images.po
src/SMESHGUI/SMESH_msg_en.po
src/SMESH_I/SMESH_2smeshpy.cxx
src/SMESH_I/SMESH_Mesh_i.cxx
src/SMESH_I/SMESH_Mesh_i.hxx
src/SMESH_SWIG/smeshDC.py

diff --git a/doc/salome/gui/SMESH/images/mesh_clear.png b/doc/salome/gui/SMESH/images/mesh_clear.png
new file mode 100644 (file)
index 0000000..0d44a12
Binary files /dev/null and b/doc/salome/gui/SMESH/images/mesh_clear.png differ
index b041641778cfb967434d1d1f09b43b07b1afa524..27f89506dbd33dafc1bff23ba9ccd28d61154172 100644 (file)
@@ -204,6 +204,11 @@ module SMESH
     GEOM::GEOM_Object GetShapeToMesh()
       raises (SALOME::SALOME_Exception);
 
+    /*!
+     * Remove all nodes and elements
+     */
+    void Clear()
+      raises (SALOME::SALOME_Exception);
 
     /*!
      * Get the subMesh object associated to a subShape. The subMesh object
index d4c2d9fc20fc145750206c0ee7bf92c11034344f..f660266d2ab2f0a83adbb2aa6b9e25ca2a1b9424 100644 (file)
@@ -39,6 +39,7 @@ dist_salomeres_DATA = \
        mesh_area.png \
        mesh_aspect.png \
        mesh_aspect_3d.png \
+       mesh_clear.png \
        mesh_compute.png \
        mesh_connectivity.png \
        mesh_diagonal.png \
diff --git a/resources/mesh_clear.png b/resources/mesh_clear.png
new file mode 100644 (file)
index 0000000..0d44a12
Binary files /dev/null and b/resources/mesh_clear.png differ
index 0b361a52ba302c4eb2285dee267a39119f3fe326..581f50c8785a9837b7a37023443a0cb103ace166 100644 (file)
@@ -201,6 +201,54 @@ const TopoDS_Solid& SMESH_Mesh::PseudoShape()
   return aSolid;
 }
 
+//=======================================================================
+/*!
+ * \brief Remove all nodes and elements
+ */
+//=======================================================================
+
+void SMESH_Mesh::Clear()
+{
+  // clear sub-meshes; get ready to re-compute as a side-effect 
+
+  if ( SMESH_subMesh *sm = GetSubMeshContaining( GetShapeToMesh() ) )
+  {
+    SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator(/*includeSelf=*/true,
+                                                             /*complexShapeFirst=*/false);
+    while ( smIt->more() )
+    {
+      sm = smIt->next();
+      TopAbs_ShapeEnum shapeType = sm->GetSubShape().ShapeType();      
+      if ( shapeType == TopAbs_VERTEX || shapeType < TopAbs_SOLID )
+        // all other shapes depends on vertices so they are already cleaned
+        sm->ComputeStateEngine( SMESH_subMesh::CLEAN );
+    }
+  }
+
+  // clear entities not on sub-meshes
+
+  SMDS_VolumeIteratorPtr vIt = _myMeshDS->volumesIterator();
+  while ( vIt->more() )
+    _myMeshDS->RemoveFreeElement( vIt->next(), 0 );
+
+  SMDS_FaceIteratorPtr fIt = _myMeshDS->facesIterator();
+  while ( fIt->more() )
+    _myMeshDS->RemoveFreeElement( fIt->next(), 0 );
+
+  SMDS_EdgeIteratorPtr eIt = _myMeshDS->edgesIterator();
+  while ( eIt->more() )
+    _myMeshDS->RemoveFreeElement( eIt->next(), 0 );
+
+  SMDS_NodeIteratorPtr nIt = _myMeshDS->nodesIterator();
+  while ( nIt->more() ) {
+    const SMDS_MeshNode * node = nIt->next();
+    if ( node->NbInverseElements() == 0 )
+      _myMeshDS->RemoveFreeNode( node, 0 );
+    else
+      _myMeshDS->RemoveNode(node);
+  }
+}
+
 //=======================================================================
 //function : UNVToMesh
 //purpose  : 
index 3005f678e0b77f28527105a6905d2a5d9093f69c..46ef2a95972a4106c79c3b2b5199f07491c66a0b 100644 (file)
@@ -82,6 +82,10 @@ public:
    */
   static const TopoDS_Solid& PseudoShape();
 
+  /*!
+   * \brief Remove all nodes and elements
+   */
+  void Clear();
 
   int UNVToMesh(const char* theFileName);
   /*!
index e0891b1d6875f37c2aa3a3c63a479d5e44e19b23..017107a340c69e3b0eecf077a1f4e25c8c538341 100644 (file)
@@ -1223,8 +1223,10 @@ bool SMESH_subMesh::ComputeStateEngine(int event)
     _computeState = READY_TO_COMPUTE;
     SMESHDS_SubMesh* smDS = GetSubMeshDS();
     if ( smDS && smDS->NbNodes() ) {
-      if ( event == CLEAN ) // this occures for algo which !NeedDescretBoundary() (PAL19272)
+      if ( event == CLEAN ) {
+        CleanDependants();
         cleanSubMesh( this );
+      }
       else
         _computeState = COMPUTE_OK;
     }
index 61c953327a10818fad91e6e61c9daa5e5a9053a2..45044586bbf37a92af58be7b2513ffff9321bf3e 100644 (file)
@@ -1513,6 +1513,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       new SMESHGUI_BuildCompoundDlg( this );
     }
     break;
+
   case 407: // DIAGONAL INVERSION
   case 408: // Delete diagonal
     {
@@ -2143,6 +2144,38 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
        }
       break;
     }
+  case 4043: {                                // CLEAR_MESH
+
+    if(checkLock(aStudy)) break;
+    
+    SALOME_ListIO selected;
+    if( LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr() )
+      aSel->selectedObjects( selected );
+
+    SUIT_OverrideCursor wc;
+    SALOME_ListIteratorOfListIO It (selected);
+    for ( ; It.More(); It.Next() )
+    {
+      Handle(SALOME_InteractiveObject) IOS = It.Value();
+      SMESH::SMESH_Mesh_var aMesh =
+        SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IOS);
+      if ( aMesh->_is_nil()) continue;
+      try {
+        SMESH::UpdateView(SMESH::eErase, IOS->getEntry());
+        aMesh->Clear();
+        _PTR(SObject) aMeshSObj = SMESH::FindSObject(aMesh);
+        SMESH::ModifiedMesh( aMeshSObj, false, true);
+      }
+      catch (const SALOME::SALOME_Exception& S_ex){
+       wc.suspend();
+       SalomeApp_Tools::QtCatchCorbaException(S_ex);
+       wc.resume();
+      }
+    }
+    SMESH::UpdateView();
+    updateObjBrowser();
+    break;
+  }
   case 4051:                                   // RENUMBERING NODES
     {
       if(checkLock(aStudy)) break;
@@ -2533,6 +2566,7 @@ void SMESHGUI::initialize( CAM_Application* app )
   createSMESHAction( 4032, "HEXA",            "ICON_DLG_HEXAS" );
   createSMESHAction( 4041, "REMOVE_NODES",    "ICON_DLG_REM_NODE" );
   createSMESHAction( 4042, "REMOVE_ELEMENTS", "ICON_DLG_REM_ELEMENT" );
+  createSMESHAction( 4043, "CLEAR_MESH"    ,  "ICON_CLEAR_MESH" );
   createSMESHAction( 4051, "RENUM_NODES",     "ICON_DLG_RENUMBERING_NODES" );
   createSMESHAction( 4052, "RENUM_ELEMENTS",  "ICON_DLG_RENUMBERING_ELEMENTS" );
   createSMESHAction( 4061, "TRANS",           "ICON_SMESH_TRANSLATION_VECTOR" );
@@ -2624,7 +2658,7 @@ void SMESHGUI::initialize( CAM_Application* app )
 
   createMenu( 5105, toolsId, -1 );
 
-  createMenu( 702, meshId, -1 );
+  createMenu( 702, meshId, -1 ); // "Mesh" menu
   createMenu( 703, meshId, -1 );
   createMenu( 704, meshId, -1 );
   createMenu( 710, meshId, -1 );
@@ -2683,6 +2717,7 @@ void SMESHGUI::initialize( CAM_Application* app )
 
   createMenu( 4041, removeId, -1 );
   createMenu( 4042, removeId, -1 );
+  createMenu( 4043, removeId, -1 );
 
   createMenu( 4051, renumId, -1 );
   createMenu( 4052, renumId, -1 );
@@ -2770,6 +2805,7 @@ void SMESHGUI::initialize( CAM_Application* app )
   createTool( separator(), addRemTb );
   createTool( 4041, addRemTb );
   createTool( 4042, addRemTb );
+  createTool( 4043, addRemTb );
   createTool( separator(), addRemTb );
   createTool( 4051, addRemTb );
   createTool( 4052, addRemTb );
@@ -2833,12 +2869,16 @@ void SMESHGUI::initialize( CAM_Application* app )
   createPopupItem( 801, OB, mesh );                        // CREATE_GROUP
   createPopupItem( 802, OB, subMesh );                     // CONSTRUCT_GROUP
   popupMgr()->insert( separator(), -1, 0 );
-  createPopupItem( 1100, OB, hypo, "" /*"&& $hasReference={false}"*/ );   // EDIT HYPOTHESIS
+  createPopupItem( 1100, OB, hypo);                        // EDIT HYPOTHESIS
   createPopupItem( 1102, OB, hyp_alg ); // REMOVE HYPOTHESIS / ALGORITHMS
-  createPopupItem( 1101, OB, mesh_group + " " + hyp_alg, "" /*"&& $hasReference={false}"*/ ); // RENAME
+  createPopupItem( 1101, OB, mesh_group + " " + hyp_alg ); // RENAME
   popupMgr()->insert( separator(), -1, 0 );
+  createPopupItem( 4043, OB, mesh );                       // CLEAR_MESH
+  popupMgr()->insert( separator(), -1, 0 );
+
+  QString         nbSelected = QtxPopupMgr::Selection::defSelCountParam();
+  QString only_one_non_empty = QString( " && %1=1 && numberOfNodes>0" ).arg( nbSelected );
 
-  QString only_one_non_empty = QString( " && %1=1 && numberOfNodes>0" ).arg( QtxPopupMgr::Selection::defSelCountParam() );
   createPopupItem( 125, OB, mesh, only_one_non_empty );   // EXPORT_MED
   createPopupItem( 126, OB, mesh, only_one_non_empty );   // EXPORT_UNV
   createPopupItem( 141, OB, mesh, only_one_non_empty );   // EXPORT_STL
index fa3443962a0eb2a5961b046560353bc9b0a8a679..aa4e9d78283d60f7a74510cd4202498386a6db86 100644 (file)
@@ -304,6 +304,9 @@ msgstr "mesh_compute.png"
 msgid "ICON_BUILD_COMPOUND"
 msgstr "mesh_build_compound.png"
 
+msgid "ICON_CLEAR_MESH"
+msgstr "mesh_clear.png"
+
 msgid "ICON_UNION"
 msgstr "mesh_unionGroups.png"
 
index 22b2fa82762586d80e0ed28498a4e61d16c25be6..f4831978a2426b77d9ce626059af7836c9a44af0 100644 (file)
@@ -2514,6 +2514,9 @@ msgstr "Quality controls"
 msgid "MEN_RENAME"
 msgstr "Rename"
 
+msgid "MEN_CLEAR_MESH"
+msgstr "Clear Mesh Data"
+
 msgid "MEN_UNASSIGN"
 msgstr "Unassign"
 
@@ -2834,6 +2837,9 @@ msgstr "Update"
 msgid "TOP_RENAME"
 msgstr "Rename"
 
+msgid "TOP_CLEAR_MESH"
+msgstr "Clear Mesh Data"
+
 msgid "TOP_UNASSIGN"
 msgstr "Unassign"
 
@@ -3156,6 +3162,9 @@ msgstr "Update"
 msgid "STB_RENAME"
 msgstr "Rename"
 
+msgid "STB_CLEAR_MESH"
+msgstr "Clear Mesh Data"
+
 msgid "STB_UNASSIGN"
 msgstr "Unassign"
 
index b7a315de09a854177c4da0f3c9417ccb6524fba0..5b65671582011d77b16a91400ee8faeda474fab4 100644 (file)
@@ -753,6 +753,7 @@ bool _pyMesh::NeedMeshAccess( const Handle(_pyCommand)& theCommand )
         "GetNodeInverseElements","GetShapeID","GetShapeIDForElem","GetElemNbNodes",
         "GetElemNode","IsMediumNode","IsMediumNodeOfAnyElem","ElemNbEdges","ElemNbFaces",
         "IsPoly","IsQuadratic","BaryCenter","GetHypothesisList", "SetAutoColor", "GetAutoColor",
+        "Clear"
         "" }; // <- mark of end
     sameMethods.Insert( names );
   }
index 599d9c6df1488ff3332c2d14194a16384b74a598..1e1b391ac9a702051f04a7b398c7956e9dcbe1c0 100644 (file)
@@ -175,7 +175,7 @@ CORBA::Boolean SMESH_Mesh_i::HasShapeToMesh()
 //=======================================================================
 
 GEOM::GEOM_Object_ptr SMESH_Mesh_i::GetShapeToMesh()
-    throw (SALOME::SALOME_Exception)
+  throw (SALOME::SALOME_Exception)
 {
   Unexpect aCatch(SALOME_SalomeException);
   GEOM::GEOM_Object_var aShapeObj;
@@ -190,6 +190,24 @@ GEOM::GEOM_Object_ptr SMESH_Mesh_i::GetShapeToMesh()
   return aShapeObj._retn();
 }
 
+//================================================================================
+/*!
+ * \brief Remove all nodes and elements
+ */
+//================================================================================
+
+void SMESH_Mesh_i::Clear() throw (SALOME::SALOME_Exception)
+{
+  Unexpect aCatch(SALOME_SalomeException);
+  try {
+    _impl->Clear();
+  }
+  catch(SALOME_Exception & S_ex) {
+    THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
+  }
+  TPythonDump() <<  _this() << ".Clear()";
+}
+
 //=============================================================================
 /*!
  *
index 20cfca213862c2d94353e55458690fbef715da47..e06f88022f9e6bb63bf89c08bbba53910f241c4e 100644 (file)
@@ -74,6 +74,9 @@ public:
   GEOM::GEOM_Object_ptr GetShapeToMesh()
     throw (SALOME::SALOME_Exception);
 
+  void Clear()
+    throw (SALOME::SALOME_Exception);
+
   SMESH::Hypothesis_Status AddHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject,
                                          SMESH::SMESH_Hypothesis_ptr anHyp)
     throw (SALOME::SALOME_Exception);
index 25858311db1f4420ad891f0abbf8a0a82bf3d5cf..dfeeb306c945ae59af77ba3c3472d7833ab50791 100644 (file)
@@ -885,8 +885,18 @@ class Mesh:
             pass
         return ok
 
+    ## Removes all nodes and elements
+    #  @ingroup l2_construct
+    def Clear(self):
+        self.mesh.Clear()
+        if salome.sg.hasDesktop():
+            smeshgui = salome.ImportComponentGUI("SMESH")
+            smeshgui.Init(salome.myStudyId)
+            smeshgui.SetMeshIcon( salome.ObjectToID( self.mesh ), False, True )
+            salome.sg.updateObjBrowser(1)
+
     ## Computes a tetrahedral mesh using AutomaticLength + MEFISTO + NETGEN
-    #  The parameter \a fineness [0,-1] defines mesh fineness
+    #  @param fineness [0,-1] defines mesh fineness
     #  @return True or False
     #  @ingroup l3_algos_basic
     def AutomaticTetrahedralization(self, fineness=0):
@@ -903,7 +913,7 @@ class Mesh:
         return self.Compute()
 
     ## Computes an hexahedral mesh using AutomaticLength + Quadrangle + Hexahedron
-    #  The parameter \a fineness [0,-1] defines mesh fineness
+    #  @param fineness [0,-1] defines mesh fineness
     #  @return True or False
     #  @ingroup l3_algos_basic
     def AutomaticHexahedralization(self, fineness=0):
@@ -3193,129 +3203,100 @@ class Mesh_Triangle(Mesh_Algorithm):
             print "Netgen 1D-2D algo doesn't support this hypothesis"
             return None
 
-    ## Sets a way to define size of mesh elements to generate
-    #  @param thePhysicalMesh is: DefaultSize or Custom
-    #  Parameter of BLSURF algo
+    ## Sets a way to define size of mesh elements to generate.
+    #  @param thePhysicalMesh is: DefaultSize or Custom.
     #  @ingroup l3_hypos_blsurf
     def SetPhysicalMesh(self, thePhysicalMesh=DefaultSize):
-        if self.params == 0:
-            self.Parameters()
-        self.params.SetPhysicalMesh(thePhysicalMesh)
+        # Parameter of BLSURF algo
+        self.Parameters().SetPhysicalMesh(thePhysicalMesh)
 
-    ## Sets size of mesh elements to generate
-    #  Parameter of BLSURF algo
+    ## Sets size of mesh elements to generate.
     #  @ingroup l3_hypos_blsurf
     def SetPhySize(self, theVal):
-        if self.params == 0:
-            self.Parameters()
-        self.params.SetPhySize(theVal)
+        # Parameter of BLSURF algo
+        self.Parameters().SetPhySize(theVal)
 
-    ## Sets lower boundary of mesh element size (PhySize)
-    #  Parameter of BLSURF algo
+    ## Sets lower boundary of mesh element size (PhySize).
     #  @ingroup l3_hypos_blsurf
     def SetPhyMin(self, theVal=-1):
-        if self.params == 0:
-            self.Parameters()
-        self.params.SetPhyMin(theVal)
+        #  Parameter of BLSURF algo
+        self.Parameters().SetPhyMin(theVal)
 
-    ## Sets upper boundary of mesh element size (PhySize)
-    #  Parameter of BLSURF algo
+    ## Sets upper boundary of mesh element size (PhySize).
     #  @ingroup l3_hypos_blsurf
     def SetPhyMax(self, theVal=-1):
-        if self.params == 0:
-            self.Parameters()
-        self.params.SetPhyMax(theVal)
+        #  Parameter of BLSURF algo
+        self.Parameters().SetPhyMax(theVal)
 
-    ## Sets a way to define maximum angular deflection of mesh from CAD model
+    ## Sets a way to define maximum angular deflection of mesh from CAD model.
     #  @param theGeometricMesh is: DefaultGeom or Custom
-    #  Parameter of BLSURF algo
     #  @ingroup l3_hypos_blsurf
     def SetGeometricMesh(self, theGeometricMesh=0):
-        if self.params == 0:
-            self.Parameters()
-        if self.params.GetPhysicalMesh() == 0: theGeometricMesh = 1
+        #  Parameter of BLSURF algo
+        if self.Parameters().GetPhysicalMesh() == 0: theGeometricMesh = 1
         self.params.SetGeometricMesh(theGeometricMesh)
 
-    ## Sets angular deflection (in degrees) of a mesh face from CAD surface
-    #  Parameter of BLSURF algo
+    ## Sets angular deflection (in degrees) of a mesh face from CAD surface.
     #  @ingroup l3_hypos_blsurf
     def SetAngleMeshS(self, theVal=_angleMeshS):
-        if self.params == 0:
-            self.Parameters()
-        if self.params.GetGeometricMesh() == 0: theVal = self._angleMeshS
+        #  Parameter of BLSURF algo
+        if self.Parameters().GetGeometricMesh() == 0: theVal = self._angleMeshS
         self.params.SetAngleMeshS(theVal)
 
-    ## Sets angular deflection (in degrees) of a mesh edge from CAD curve
-    #  Parameter of BLSURF algo
+    ## Sets angular deflection (in degrees) of a mesh edge from CAD curve.
     #  @ingroup l3_hypos_blsurf
     def SetAngleMeshC(self, theVal=_angleMeshS):
-        if self.params == 0:
-            self.Parameters()
-        if self.params.GetGeometricMesh() == 0: theVal = self._angleMeshS
+        #  Parameter of BLSURF algo
+        if self.Parameters().GetGeometricMesh() == 0: theVal = self._angleMeshS
         self.params.SetAngleMeshC(theVal)
 
-    ## Sets lower boundary of mesh element size computed to respect angular deflection
-    #  Parameter of BLSURF algo
+    ## Sets lower boundary of mesh element size computed to respect angular deflection.
     #  @ingroup l3_hypos_blsurf
     def SetGeoMin(self, theVal=-1):
-        if self.params == 0:
-            self.Parameters()
-        self.params.SetGeoMin(theVal)
+        #  Parameter of BLSURF algo
+        self.Parameters().SetGeoMin(theVal)
 
-    ## Sets upper boundary of mesh element size computed to respect angular deflection
-    #  Parameter of BLSURF algo
+    ## Sets upper boundary of mesh element size computed to respect angular deflection.
     #  @ingroup l3_hypos_blsurf
     def SetGeoMax(self, theVal=-1):
-        if self.params == 0:
-            self.Parameters()
-        self.params.SetGeoMax(theVal)
+        #  Parameter of BLSURF algo
+        self.Parameters().SetGeoMax(theVal)
 
-    ## Sets maximal allowed ratio between the lengths of two adjacent edges
-    #  Parameter of BLSURF algo
+    ## Sets maximal allowed ratio between the lengths of two adjacent edges.
     #  @ingroup l3_hypos_blsurf
     def SetGradation(self, theVal=_gradation):
-        if self.params == 0:
-            self.Parameters()
-        if self.params.GetGeometricMesh() == 0: theVal = self._gradation
+        #  Parameter of BLSURF algo
+        if self.Parameters().GetGeometricMesh() == 0: theVal = self._gradation
         self.params.SetGradation(theVal)
 
-    ## Sets topology usage way defining how mesh conformity is assured:
-    # FromCAD, PreProcess or PreProcessPlus
-    # FromCAD - mesh conformity is assured by conformity of a shape
-    # PreProcess or PreProcessPlus - by pre-processing a CAD model
-    #  Parameter of BLSURF algo
+    ## Sets topology usage way.
+    # @param way defines how mesh conformity is assured <ul>
+    # <li>FromCAD - mesh conformity is assured by conformity of a shape</li>
+    # <li>PreProcess or PreProcessPlus - by pre-processing a CAD model</li></ul>
     #  @ingroup l3_hypos_blsurf
     def SetTopology(self, way):
-        if self.params == 0:
-            self.Parameters()
-        self.params.SetTopology(way)
+        #  Parameter of BLSURF algo
+        self.Parameters().SetTopology(way)
 
-    ## To respect geometrical edges or not
-    #  Parameter of BLSURF algo
+    ## To respect geometrical edges or not.
     #  @ingroup l3_hypos_blsurf
     def SetDecimesh(self, toIgnoreEdges=False):
-        if self.params == 0:
-            self.Parameters()
-        self.params.SetDecimesh(toIgnoreEdges)
+        #  Parameter of BLSURF algo
+        self.Parameters().SetDecimesh(toIgnoreEdges)
 
     ## Sets verbosity level in the range 0 to 100.
-    #  Parameter of BLSURF algo
     #  @ingroup l3_hypos_blsurf
     def SetVerbosity(self, level):
-        if self.params == 0:
-            self.Parameters()
-        self.params.SetVerbosity(level)
+        #  Parameter of BLSURF algo
+        self.Parameters().SetVerbosity(level)
 
-    ## Sets advanced option value
-    #  Parameter of BLSURF algo
+    ## Sets advanced option value.
     #  @ingroup l3_hypos_blsurf
-    def SetOptionValue(self, optionName, value):
-        if self.params == 0:
-            self.Parameters()
-        self.params.SetOptionValue(optionName,level)
+    def SetOptionValue(self, optionName, level):
+        #  Parameter of BLSURF algo
+        self.Parameters().SetOptionValue(optionName,level)
 
-    ## Sets QuadAllowed flag
-    #
+    ## Sets QuadAllowed flag.
     #  Only for algoType == NETGEN || NETGEN_2D || BLSURF
     #  @ingroup l3_hypos_netgen l3_hypos_blsurf
     def SetQuadAllowed(self, toAllow=True):
@@ -3330,17 +3311,15 @@ class Mesh_Triangle(Mesh_Algorithm):
                     pass
                 pass
             return
-        if self.params == 0:
-            self.Parameters()
-        if self.params:
+        if self.Parameters():
             self.params.SetQuadAllowed(toAllow)
             return
 
     ## Defines "Netgen 2D Parameters" hypothesis
     #
-    #  Only for algoType == NETGEN
     #  @ingroup l3_hypos_netgen
     def Parameters(self):
+        #  Only for algoType == NETGEN
         if self.params:
             return self.params
         if self.algoType == NETGEN:
@@ -3365,9 +3344,7 @@ class Mesh_Triangle(Mesh_Algorithm):
     #  Only for algoType == NETGEN
     #  @ingroup l3_hypos_netgen
     def SetMaxSize(self, theSize):
-        if self.params == 0:
-            self.Parameters()
-        if self.params is not None:
+        if self.Parameters():
             self.params.SetMaxSize(theSize)
 
     ## Sets SecondOrder flag
@@ -3375,9 +3352,7 @@ class Mesh_Triangle(Mesh_Algorithm):
     #  Only for algoType == NETGEN
     #  @ingroup l3_hypos_netgen
     def SetSecondOrder(self, theVal):
-        if self.params == 0:
-            self.Parameters()
-        if self.params is not None:
+        if self.Parameters():
             self.params.SetSecondOrder(theVal)
 
     ## Sets Optimize flag
@@ -3385,9 +3360,7 @@ class Mesh_Triangle(Mesh_Algorithm):
     #  Only for algoType == NETGEN
     #  @ingroup l3_hypos_netgen
     def SetOptimize(self, theVal):
-        if self.params == 0:
-            self.Parameters()
-        if self.params is not None:
+        if self.Parameters():
             self.params.SetOptimize(theVal)
 
     ## Sets Fineness
@@ -3397,9 +3370,7 @@ class Mesh_Triangle(Mesh_Algorithm):
     #  Only for algoType == NETGEN
     #  @ingroup l3_hypos_netgen
     def SetFineness(self, theFineness):
-        if self.params == 0:
-            self.Parameters()
-        if self.params is not None:
+        if self.Parameters():
             self.params.SetFineness(theFineness)
 
     ## Sets GrowthRate
@@ -3407,9 +3378,7 @@ class Mesh_Triangle(Mesh_Algorithm):
     #  Only for algoType == NETGEN
     #  @ingroup l3_hypos_netgen
     def SetGrowthRate(self, theRate):
-        if self.params == 0:
-            self.Parameters()
-        if self.params is not None:
+        if self.Parameters():
             self.params.SetGrowthRate(theRate)
 
     ## Sets NbSegPerEdge
@@ -3417,9 +3386,7 @@ class Mesh_Triangle(Mesh_Algorithm):
     #  Only for algoType == NETGEN
     #  @ingroup l3_hypos_netgen
     def SetNbSegPerEdge(self, theVal):
-        if self.params == 0:
-            self.Parameters()
-        if self.params is not None:
+        if self.Parameters():
             self.params.SetNbSegPerEdge(theVal)
 
     ## Sets NbSegPerRadius
@@ -3427,9 +3394,7 @@ class Mesh_Triangle(Mesh_Algorithm):
     #  Only for algoType == NETGEN
     #  @ingroup l3_hypos_netgen
     def SetNbSegPerRadius(self, theVal):
-        if self.params == 0:
-            self.Parameters()
-        if self.params is not None:
+        if self.Parameters():
             self.params.SetNbSegPerRadius(theVal)
 
     pass
@@ -3508,6 +3473,8 @@ class Mesh_Tetrahedron(Mesh_Algorithm):
     ## Defines "Netgen 3D Parameters" hypothesis
     #  @ingroup l3_hypos_netgen
     def Parameters(self):
+        if self.params:
+            return self.params
         if (self.algoType == FULL_NETGEN):
             self.params = self.Hypothesis("NETGEN_Parameters", [],
                                           "libNETGENEngine.so", UseExisting=0)
@@ -3524,25 +3491,19 @@ class Mesh_Tetrahedron(Mesh_Algorithm):
     #  Parameter of FULL_NETGEN
     #  @ingroup l3_hypos_netgen
     def SetMaxSize(self, theSize):
-        if self.params == 0:
-            self.Parameters()
-        self.params.SetMaxSize(theSize)
+        self.Parameters().SetMaxSize(theSize)
 
     ## Sets SecondOrder flag
     #  Parameter of FULL_NETGEN
     #  @ingroup l3_hypos_netgen
     def SetSecondOrder(self, theVal):
-        if self.params == 0:
-            self.Parameters()
-        self.params.SetSecondOrder(theVal)
+        self.Parameters().SetSecondOrder(theVal)
 
     ## Sets Optimize flag
     #  Parameter of FULL_NETGEN
     #  @ingroup l3_hypos_netgen
     def SetOptimize(self, theVal):
-        if self.params == 0:
-            self.Parameters()
-        self.params.SetOptimize(theVal)
+        self.Parameters().SetOptimize(theVal)
 
     ## Sets Fineness
     #  @param theFineness is:
@@ -3550,114 +3511,96 @@ class Mesh_Tetrahedron(Mesh_Algorithm):
     #  Parameter of FULL_NETGEN
     #  @ingroup l3_hypos_netgen
     def SetFineness(self, theFineness):
-        if self.params == 0:
-            self.Parameters()
-        self.params.SetFineness(theFineness)
+        self.Parameters().SetFineness(theFineness)
 
     ## Sets GrowthRate
     #  Parameter of FULL_NETGEN
     #  @ingroup l3_hypos_netgen
     def SetGrowthRate(self, theRate):
-        if self.params == 0:
-            self.Parameters()
-        self.params.SetGrowthRate(theRate)
+        self.Parameters().SetGrowthRate(theRate)
 
     ## Sets NbSegPerEdge
     #  Parameter of FULL_NETGEN
     #  @ingroup l3_hypos_netgen
     def SetNbSegPerEdge(self, theVal):
-        if self.params == 0:
-            self.Parameters()
-        self.params.SetNbSegPerEdge(theVal)
+        self.Parameters().SetNbSegPerEdge(theVal)
 
     ## Sets NbSegPerRadius
     #  Parameter of FULL_NETGEN
     #  @ingroup l3_hypos_netgen
     def SetNbSegPerRadius(self, theVal):
-        if self.params == 0:
-            self.Parameters()
-        self.params.SetNbSegPerRadius(theVal)
+        self.Parameters().SetNbSegPerRadius(theVal)
 
     ## To mesh "holes" in a solid or not. Default is to mesh.
-    #  Parameter of GHS3D
     #  @ingroup l3_hypos_ghs3dh
     def SetToMeshHoles(self, toMesh):
-        if self.params == 0: self.Parameters()
-        self.params.SetToMeshHoles(toMesh)
+        #  Parameter of GHS3D
+        self.Parameters().SetToMeshHoles(toMesh)
 
     ## Set Optimization level:
     #   None_Optimization, Light_Optimization, Medium_Optimization, Strong_Optimization.
     #  Default is Medium_Optimization
-    #  Parameter of GHS3D
     #  @ingroup l3_hypos_ghs3dh
     def SetOptimizationLevel(self, level):
-        if self.params == 0: self.Parameters()
-        self.params.SetOptimizationLevel(level)
+        #  Parameter of GHS3D
+        self.Parameters().SetOptimizationLevel(level)
 
     ## Maximal size of memory to be used by the algorithm (in Megabytes).
-    #  Advanced parameter of GHS3D
     #  @ingroup l3_hypos_ghs3dh
     def SetMaximumMemory(self, MB):
-        if self.params == 0: self.Parameters()
-        self.params.SetMaximumMemory(MB)
+        #  Advanced parameter of GHS3D
+        self.Parameters().SetMaximumMemory(MB)
 
     ## Initial size of memory to be used by the algorithm (in Megabytes) in
-    #  automatic memory adjustment mode
-    #  Advanced parameter of GHS3D
+    #  automatic memory adjustment mode.
     #  @ingroup l3_hypos_ghs3dh
     def SetInitialMemory(self, MB):
-        if self.params == 0: self.Parameters()
-        self.params.SetInitialMemory(MB)
+        #  Advanced parameter of GHS3D
+        self.Parameters().SetInitialMemory(MB)
 
-    ## Path to working directory
-    #  Advanced parameter of GHS3D
+    ## Path to working directory.
     #  @ingroup l3_hypos_ghs3dh
     def SetWorkingDirectory(self, path):
-        if self.params == 0: self.Parameters()
-        self.params.SetWorkingDirectory(path)
+        #  Advanced parameter of GHS3D
+        self.Parameters().SetWorkingDirectory(path)
 
-    ## To keep working files or remove them. Log file remains in case of errors anyway
-    #  Advanced parameter of GHS3D
+    ## To keep working files or remove them. Log file remains in case of errors anyway.
     #  @ingroup l3_hypos_ghs3dh
     def SetKeepFiles(self, toKeep):
-        if self.params == 0: self.Parameters()
-        self.params.SetKeepFiles(toKeep)
+        #  Advanced parameter of GHS3D
+        self.Parameters().SetKeepFiles(toKeep)
 
-    ## To set verbose level [0-10]
-    #  0 - no standard output,
-    #  2 - prints the data, quality statistics of the skin and final meshes and
+    ## To set verbose level [0-10]. <ul>
+    #<li> 0 - no standard output,
+    #<li> 2 - prints the data, quality statistics of the skin and final meshes and
     #     indicates when the final mesh is being saved. In addition the software
     #     gives indication regarding the CPU time.
-    # 10 - same as 2 plus the main steps in the computation, quality statistics
+    #<li>10 - same as 2 plus the main steps in the computation, quality statistics
     #     histogram of the skin mesh, quality statistics histogram together with
-    #     the characteristics of the final mesh.
-    #  Advanced parameter of GHS3D
+    #     the characteristics of the final mesh.</ul>
     #  @ingroup l3_hypos_ghs3dh
     def SetVerboseLevel(self, level):
-        if self.params == 0: self.Parameters()
-        self.params.SetVerboseLevel(level)
+        #  Advanced parameter of GHS3D
+        self.Parameters().SetVerboseLevel(level)
 
-    ## To create new nodes
-    #  Advanced parameter of GHS3D
+    ## To create new nodes.
     #  @ingroup l3_hypos_ghs3dh
     def SetToCreateNewNodes(self, toCreate):
-        if self.params == 0: self.Parameters()
-        self.params.SetToCreateNewNodes(toCreate)
+        #  Advanced parameter of GHS3D
+        self.Parameters().SetToCreateNewNodes(toCreate)
 
     ## To use boundary recovery version which tries to create mesh on a very poor
-    #  quality surface mesh
-    #  Advanced parameter of GHS3D
+    #  quality surface mesh.
     #  @ingroup l3_hypos_ghs3dh
     def SetToUseBoundaryRecoveryVersion(self, toUse):
-        if self.params == 0: self.Parameters()
-        self.params.SetToUseBoundaryRecoveryVersion(toUse)
+        #  Advanced parameter of GHS3D
+        self.Parameters().SetToUseBoundaryRecoveryVersion(toUse)
 
-    ## To set hidden/undocumented/advanced options
-    #  Advanced parameter of GHS3D
+    ## Sets command line option as text. 
     #  @ingroup l3_hypos_ghs3dh
     def SetTextOption(self, option):
-        if self.params == 0: self.Parameters()
-        self.params.SetTextOption(option)
+        #  Advanced parameter of GHS3D
+        self.Parameters().SetTextOption(option)
 
 # Public class: Mesh_Hexahedron
 # ------------------------------