Salome HOME
0022107: EDF 2502 SMESH: Publish the result of show bad mesh in a group
authoreap <eap@opencascade.com>
Tue, 21 May 2013 09:09:04 +0000 (09:09 +0000)
committereap <eap@opencascade.com>
Tue, 21 May 2013 09:09:04 +0000 (09:09 +0000)
doc/salome/gui/SMESH/images/meshcomputationfail.png
doc/salome/gui/SMESH/images/show_bad_mesh.png
doc/salome/gui/SMESH/input/constructing_meshes.doc
doc/salome/gui/SMESH/input/smesh_migration.doc
doc/salome/gui/SMESH/input/smeshpy_interface.doc
src/SMESHGUI/SMESHGUI_ComputeDlg.cxx
src/SMESHGUI/SMESHGUI_ComputeDlg.h
src/SMESHGUI/SMESH_msg_en.ts

index 61f3a433aea52615f49c56dbc3a78c5106f1d11b..8d09dbaa59d4a52706684e38e9bc1d55c6aeef22 100644 (file)
Binary files a/doc/salome/gui/SMESH/images/meshcomputationfail.png and b/doc/salome/gui/SMESH/images/meshcomputationfail.png differ
index 17dfb38ad8171103586769d4cf197b39ca1e1ea6..9c17681d4c2987f40a3c8840df6ce0168e71e8ed 100644 (file)
Binary files a/doc/salome/gui/SMESH/images/show_bad_mesh.png and b/doc/salome/gui/SMESH/images/show_bad_mesh.png differ
index af5cd24e736583573dc7515c79f5586216beb1c6..126dcfbd905327f434bf7a67510cfbad5307c210 100644 (file)
@@ -22,8 +22,10 @@ written in Python.
   <li>In the \b Mesh menu select <b>Create Mesh</b> or click <em>"Create
       Mesh"</em> button in the toolbar. 
 
+    <center>
     \image html image32.png
     <em>"Create Mesh" button</em>
+    </center>
 
     The following dialog box will appear: 
 
@@ -62,21 +64,27 @@ written in Python.
     mesh in the Object Browser and click "Select" button near \b Geometry
     field (if the name of the object has not yet appeared in \b Geometry field).
 
+    <center>
     \image html image120.png
     <em>"Select" button</em>
+    </center>
 
     Now you can define 3D Algorithm and 3D Hypotheses, which will be
     applied to the solids of your geometrical object. Click the <em>"Add
       Hypothesis"</em>  button to add a hypothesis.
 
+    <center>
     \image html image121.png
     <em>"Add Hypothesis" button</em>
+    </center>
 
     Click the <em>"Edit Hypothesis"</em> button to change the values for the
     current hypothesis.
 
+    <center>
     \image html image122.png
     <em>"Edit Hypothesis" button</em>
+    </center>
 
     Most standard 2D and 3D algorithms can work without hypotheses
     using some default parameters. The use of additional hypotheses
@@ -90,7 +98,8 @@ written in Python.
     the higher dimension algorithm. 
 
     Some algorithms generate mesh of several dimensions, while others
-    produce mesh of only one dimension. In the latter case there must be one Algorithm and zero or several
+    produce mesh of only one dimension. In the latter case there must
+    be one Algorithm and zero or several
     Hypotheses for each dimension of your object, otherwise you will
     not get any mesh at all. Of course, if you wish to mesh a face,
     which is a 2D object, you do not need to define a 3D Algorithm and
@@ -99,9 +108,11 @@ written in Python.
     In the <b>Object Browser</b> the structure of the new mesh will be
     displayed as follows:
 
-      \image html image88.jpg
+    <center>
+    \image html image88.jpg
+    </center>
 
-    It contains:
+    It contains: 
     <ul>
       <li>a reference to the geometrical object on the basis of
         which the mesh has been constructed;</li> 
@@ -152,8 +163,10 @@ For this, select the mesh in the Object Browser. From the \b Mesh menu
 select \b Preview or click "Preview" button in the toolbar or activate
 "Preview" item from the pop-up menu.
 
+<center>
 \image html mesh_precompute.png
 <em>"Preview" button</em>
+</center>
 
 Select <b>1D mesh</b> or <b>2D mesh</b> preview mode in the Preview dialog. 
 
@@ -265,33 +278,29 @@ the hypotheses are assigned. For this, select your mesh in
 the <b>Object Browser</b>. From the \b Mesh menu select \b Compute or
 click "Compute" button of the toolbar.
 
+<center>
 \image html image28.png
 <em>"Compute" button</em>
+</center>
 
-The Mesh Computation information box appears.
+After the mesh computation finishes, the Mesh Computation information
+box appears. In case of a success, the box shows
+information on number of entities of different types in the mesh.
 
 \image html meshcomputationsucceed.png
 
 If the mesh computation failed, the information about the cause of the
-failure is provided.
+failure is provided in \b Errors table.
 
 \image html meshcomputationfail.png
 
 After you select the error, <b>Show Sub-shape</b> button allows
-visualizing in magenta the geometrical entity that causes it.
+visualizing in magenta the geometrical entity that causes the error.
 
 \image html failed_computation.png 
 <em>3D algorithm failed to compute mesh on a box shown using <b>Show
     Sub-shape</b> button</em>
 
-
-\note Mesh Computation Information box does not appear if you set
-"Mesh computation/Show a computation result notification" preference 
-to the "Never" value. This option gives the possibility to control mesh
-computation reporting. There are the following possibilities: always
-show the information box, show only if an error occurs or never. 
-By default, the information box is always shown after mesh computation operation.
-
 <b>Publish Sub-shape</b> button publishes the sub-shape, whose meshing
 has failed, in GEOM component as a child of the mesh geometry, which
 allows analyzing the problem geometry and creating a submesh on it in
@@ -305,9 +314,20 @@ or/and hidden by other mesh elements. They can be seen after
 switching the mesh to Wireframe visualization mode or switching off
 the visualization of faces and volumes (if any).
 
+<b>Bad Mesh to Group</b> button creates groups of the bad mesh entities,
+thus allowing you for more comfortable analysis of these entities.
+
 \image html show_bad_mesh.png
-<em>Too close nodes causing meshing failure are shown in magenta using <b>Show
+<em>Edges bounding a hole in the surface are shown in magenta using <b>Show
     bad Mesh</b> button</em>
+
+\note Mesh Computation Information box does not appear if you set
+"Mesh computation/Show a computation result notification" preference 
+to the "Never" value. This option gives the possibility to control mesh
+computation reporting. There are the following possibilities: always
+show the information box, show only if an error occurs or never. 
+By default, the information box is always shown after mesh computation operation.
+
 <br><br>
 
 \anchor use_existing_anchor
@@ -320,13 +340,13 @@ this, there exist two algorithms: <b>Use existing edges</b> and <b>Use
   existing faces</b>.
 For example, you want to use standard algorithms to generate 1D and 3D
 meshes and to create 2D mesh by your python code. Then you
-<ul>
-  <li> create a mesh object, assign a 1D algorithm,</li>
-  <li> invoke \b Compute command, which computes a 1D mesh,</li>
+<ol>
+  <li> create a mesh object, assign an 1D algorithm,</li>
+  <li> invoke \b Compute command, which computes an 1D mesh,</li>
   <li> assign <b>Use existing faces</b> and a 3D algorithm,</li>
   <li> run your python code, which creates a 2D mesh,</li>
   <li> invoke \b Compute command, which computes a 3D mesh.</li>
-</ul>
+</ol>
 
 Consider trying a sample script demonstrating the usage of 
 \ref tui_use_existing_faces "Use existing faces" algorithm for
index e14640e8ba40f2bfe651cdde716a341daa5a5786..4c3c811e57025cbd04ab8567be159af7462420a4 100644 (file)
@@ -12,7 +12,7 @@
 \n Scripts generated for SALOME 6 and older versions must be adapted to work in SALOME 7.2 with full functionality.
 \n The compatibility mode allows old scripts to work in almost all cases, but with a warning.
 
-See also <li>\subpage geompy_migration_page</li>
+See also \subpage geompy_migration_page
 
 <b>Salome initialisation must always be done as shown below</b>
 \n (<em>salome_init()</em> can be invoked safely several times):
index 583eb1a8fb98b0dcd3e01d961464ec01795fff37..c690fb7efd8e5eb4a8e28a6a46877f627734233c 100644 (file)
@@ -13,7 +13,7 @@ in the \ref smeshBuilder and \ref StdMeshersBuilder Python packages.
 
 \n With SALOME 7.2, the Python interface for %Mesh has been slightly modified to offer new functionality,
 \n You may have to modify your scripts generated with SALOME 6 or older versions.
-\n Please see <li>\ref smesh_migration_page</li>
+\n Please see \ref smesh_migration_page
 
 Class \ref smeshBuilder.smeshBuilder "smeshBuilder" provides an interface to create and handle
 meshes. It can be used to create an empty mesh or to import mesh from the data file.
index c0a256911692c369a87c6b4384b2717b3334295c..2d236261798dd734b4cf79ad13ea39322fca0fcc 100644 (file)
@@ -61,6 +61,8 @@
 #include <SALOMEDSClient_SObject.hxx>
 #include <SALOMEDS_wrap.hxx>
 
+#include CORBA_SERVER_HEADER(SMESH_Group)
+
 // OCCT includes
 #include <BRep_Tool.hxx>
 #include <TopExp.hxx>
@@ -460,10 +462,12 @@ namespace SMESH
     foreach( range, selRanges )
     {
       for ( int row = range.topRow(); row <= range.bottomRow(); ++row )
-        rows.append( row );
+        if ( !rows.count( row ))
+             rows.append( row );
     }
     if ( rows.isEmpty() && table->currentRow() > -1 )
-      rows.append( table->currentRow() );
+      if ( !rows.count( table->currentRow() ))
+        rows.append( table->currentRow() );
 
     return rows.count();
   }
@@ -553,6 +557,7 @@ QFrame* SMESHGUI_ComputeDlg::createMainFrame (QWidget* theParent, bool ForEval)
   myShowBtn      = new QPushButton(tr("SHOW_SHAPE"), myCompErrorGroup);
   myPublishBtn   = new QPushButton(tr("PUBLISH_SHAPE"), myCompErrorGroup);
   myBadMeshBtn   = new QPushButton(tr("SHOW_BAD_MESH"), myCompErrorGroup);
+  myBadMeshToGroupBtn = new QPushButton(tr("GROUP_OF_BAD_MESH"), myCompErrorGroup);
 
   //myTable->setReadOnly( true ); // VSR: check
   myTable->setEditTriggers( QAbstractItemView::NoEditTriggers );
@@ -577,11 +582,12 @@ QFrame* SMESHGUI_ComputeDlg::createMainFrame (QWidget* theParent, bool ForEval)
   QGridLayout* grpLayout = new QGridLayout(myCompErrorGroup);
   grpLayout->setSpacing(SPACING);
   grpLayout->setMargin(MARGIN);
-  grpLayout->addWidget( myWarningLabel, 0, 0, 1, 4 );
-  grpLayout->addWidget( myTable,        1, 0, 1, 4 );
-  grpLayout->addWidget( myShowBtn,      2, 0 );
-  grpLayout->addWidget( myPublishBtn,   2, 1 );
-  grpLayout->addWidget( myBadMeshBtn,   2, 2 );
+  grpLayout->addWidget( myWarningLabel,      0, 0, 1, 4 );
+  grpLayout->addWidget( myTable,             1, 0, 1, 4 );
+  grpLayout->addWidget( myShowBtn,           2, 0 );
+  grpLayout->addWidget( myPublishBtn,        2, 1 );
+  grpLayout->addWidget( myBadMeshBtn,        2, 2 );
+  grpLayout->addWidget( myBadMeshToGroupBtn, 2, 3 );
   grpLayout->setColumnStretch( 3, 1 );
 
   // Hypothesis definition errors
@@ -1068,11 +1074,14 @@ void SMESHGUI_BaseComputeOp::showComputeResult( const bool theMemoryLack,
       tbl->resizeColumnToContents( COL_SHAPE );
       tbl->setWordWrap( true );
 
-      if ( hasBadMesh )
+      if ( hasBadMesh ) {
         aCompDlg->myBadMeshBtn->show();
-      else
+        aCompDlg->myBadMeshToGroupBtn->show();
+      }
+      else {
         aCompDlg->myBadMeshBtn->hide();
-
+        aCompDlg->myBadMeshToGroupBtn->hide();
+      }
       tbl->setCurrentCell(0,0);
       currentCellChanged(); // to update buttons
     }
@@ -1189,6 +1198,43 @@ void SMESHGUI_BaseComputeOp::onShowBadMesh()
   }
 }
 
+//================================================================================
+/*!
+ * \brief create groups of bad mesh elements preventing computation of a submesh of current row
+ */
+//================================================================================
+
+void SMESHGUI_BaseComputeOp::onGroupOfBadMesh()
+{
+  QList<int> rows;
+  SMESH::getSelectedRows( table(), rows );
+  int row;
+  foreach ( row, rows )
+  {
+    bool hasBadMesh = ( !table()->item(row, COL_BAD_MESH)->text().isEmpty() );
+    if ( hasBadMesh ) {
+      int     curSub = table()->item(rows.front(), COL_SHAPEID)->text().toInt();
+      QString grName = table()->item(rows.front(), COL_SHAPE)->text();
+      if ( grName.isEmpty() ) grName = "bad mesh";
+      else                    grName = "bad mesh of " + grName;
+      SMESH::SMESH_Gen_var gen = getSMESHGUI()->GetSMESHGen();
+      SMESH::ListOfGroups_var groups
+        ( gen->MakeGroupsOfBadInputElements(myMesh,curSub,grName.toLatin1().data()) );
+      update( UF_ObjBrowser | UF_Model );
+      if( LightApp_Application* anApp = dynamic_cast<LightApp_Application*>( application() ))
+      {
+        QStringList anEntryList;
+        for ( size_t i = 0; i < groups->length(); ++i )
+          if ( _PTR(SObject) so = SMESH::FindSObject( groups[i] ))
+            anEntryList.append( so->GetID().c_str() );
+
+        if ( !anEntryList.isEmpty())
+          anApp->browseObjects( anEntryList, true, false );
+      }
+    }
+  }
+}
+
 //================================================================================
 /*!
  * \brief SLOT called when a selected cell in table() changed
@@ -1287,9 +1333,10 @@ SMESHGUI_ComputeDlg* SMESHGUI_BaseComputeOp::computeDlg() const
     SMESHGUI_BaseComputeOp* me = (SMESHGUI_BaseComputeOp*)this;
     me->myCompDlg = new SMESHGUI_ComputeDlg( desktop(), false );
     // connect signals and slots
-    connect(myCompDlg->myShowBtn,    SIGNAL (clicked()), SLOT(onPreviewShape()));
-    connect(myCompDlg->myPublishBtn, SIGNAL (clicked()), SLOT(onPublishShape()));
-    connect(myCompDlg->myBadMeshBtn, SIGNAL (clicked()), SLOT(onShowBadMesh()));
+    connect(myCompDlg->myShowBtn,           SIGNAL (clicked()), SLOT(onPreviewShape()));
+    connect(myCompDlg->myPublishBtn,        SIGNAL (clicked()), SLOT(onPublishShape()));
+    connect(myCompDlg->myBadMeshBtn,        SIGNAL (clicked()), SLOT(onShowBadMesh()));
+    connect(myCompDlg->myBadMeshToGroupBtn, SIGNAL (clicked()), SLOT(onGroupOfBadMesh()));
 
     QTableWidget* aTable = me->table();
     connect(aTable, SIGNAL(itemSelectionChanged()), SLOT(currentCellChanged()));
index 4c4198cb1f1ca29e62901282c86fdd046a5d2e86..81a09f85760563b424a8353e8bb0f5aeffd1894a 100644 (file)
@@ -99,6 +99,7 @@ protected slots:
   void                           onPreviewShape();
   void                           onPublishShape();
   void                           onShowBadMesh();
+  void                           onGroupOfBadMesh();
   void                           currentCellChanged();
 
 private:
@@ -226,6 +227,7 @@ protected:
   QPushButton*                 myShowBtn;
   QPushButton*                 myPublishBtn;
   QPushButton*                 myBadMeshBtn;
+  QPushButton*                 myBadMeshToGroupBtn;
 
   SMESHGUI_MeshInfosBox*       myBriefInfo;
   SMESHGUI_MeshInfosBox*       myFullInfo;
index ff2a72abd1339b5e5cb278214c39ad2ceec878cd..25b69aa828259ced8127fff606e66db166ff4528 100644 (file)
@@ -4604,6 +4604,10 @@ Please, create VTK viewer and try again</translation>
         <source>SHOW_BAD_MESH</source>
         <translation>Show bad Mesh</translation>
     </message>
+    <message>
+        <source>GROUP_OF_BAD_MESH</source>
+        <translation>Bad Mesh to Group</translation>
+    </message>
 </context>
 <context>
     <name>SMESHGUI_PrecomputeDlg</name>
@@ -5496,15 +5500,15 @@ Please enter correct value and try again</translation>
         <translation>OCTA12</translation>
     </message>
     <message>
-        <source>ENTITY_TYPE_21</source>
+        <source>ENTITY_TYPE_22</source>
         <translation>POLYEDRE</translation>
     </message>
     <message>
-        <source>ENTITY_TYPE_22</source>
+        <source>ENTITY_TYPE_23</source>
         <translation>QPOLYEDRE</translation>
     </message>
     <message>
-        <source>ENTITY_TYPE_23</source>
+        <source>ENTITY_TYPE_24</source>
         <translation>BALL</translation>
     </message>
     <message>