Salome HOME
[bos #20282] EDF 22320 - general compute fails
authoreap <eap@opencascade.com>
Fri, 20 Nov 2020 08:26:59 +0000 (11:26 +0300)
committereap <eap@opencascade.com>
Fri, 20 Nov 2020 08:26:59 +0000 (11:26 +0300)
   Correct tree icon of partially computed sub-mesh

src/SMESH/SMESH_subMesh.cxx
src/SMESH/SMESH_subMesh.hxx
src/SMESH_I/SMESH_Gen_i_1.cxx

index 4f8a56e85dd514adf445166b51dcc141e6826082..4f9955cf3000d6258458fe1ab6b7c139ed86ac6f 100644 (file)
@@ -272,6 +272,42 @@ bool SMESH_subMesh::IsMeshComputed() const
   return false;
 }
 
   return false;
 }
 
+//================================================================================
+/*!
+ * \brief Check if any upper level sub-shape is not computed.
+ *        Used to update a sub-mesh icon
+ */
+//================================================================================
+
+bool SMESH_subMesh::IsComputedPartially() const
+{
+  SMESH_subMeshIteratorPtr smIt = getDependsOnIterator(/*includeSelf=*/true,
+                                                       /*SolidFirst=*/true);
+  bool allComputed = true;
+  TopAbs_ShapeEnum readyType = TopAbs_VERTEX; // max value
+  while ( smIt->more() && allComputed )
+  {
+    SMESH_subMesh* sm = smIt->next();
+
+    if ( sm->GetSubShape().ShapeType() > readyType )
+      break; // lower dimension -> stop
+    if ( sm->GetComputeState() != SMESH_subMesh::NOT_READY )
+      readyType = sm->GetSubShape().ShapeType();
+
+    switch ( sm->GetComputeState() )
+    {
+    case SMESH_subMesh::READY_TO_COMPUTE:
+    case SMESH_subMesh::FAILED_TO_COMPUTE:
+      allComputed = false;// sm->IsMeshComputed();
+      break;
+    case SMESH_subMesh::NOT_READY:
+    case SMESH_subMesh::COMPUTE_OK:
+      continue;
+    }
+  }
+  return !allComputed;
+}
+
 //=============================================================================
 /*!
  * Return true if all sub-meshes have been meshed
 //=============================================================================
 /*!
  * Return true if all sub-meshes have been meshed
index 6b610ea1d9c8f11aa1024279f198c404fdfa8a97..a2eef50b11898393fc29623c061129fdfbe58f6d 100644 (file)
@@ -257,6 +257,9 @@ public:
   bool IsMeshComputed() const;
   // check if _subMeshDS contains mesh elements unless _alwaysComputed==true
 
   bool IsMeshComputed() const;
   // check if _subMeshDS contains mesh elements unless _alwaysComputed==true
 
+  bool IsComputedPartially() const;
+  // check if any upper level sub-shape is not computed
+
   /*!
    * \brief Set sub-shapes that are allowed to compute at once by a multidimensional algo
    */
   /*!
    * \brief Set sub-shapes that are allowed to compute at once by a multidimensional algo
    */
index d7d61bcafd70381b50a07fb5ca2d8194e28289cd..a667ba59fcb13a21528c624c0b2f42204b09992e 100644 (file)
@@ -1009,8 +1009,23 @@ void SMESH_Gen_i::UpdateIcons( SMESH::SMESH_Mesh_ptr theMesh )
         {
           SMESH::array_of_ElementType_var elemTypes = idSrc->GetTypes();
           isEmpty = ( elemTypes->length() == 0 );
         {
           SMESH::array_of_ElementType_var elemTypes = idSrc->GetTypes();
           isEmpty = ( elemTypes->length() == 0 );
+
+          if ( !isEmpty )
+          {
+            // check if all sub-shapes of sub-mesh on group are computed
+            // (pb: "Compute sub-mesh" menu is missing if a sub-mesh is partially computed)
+            SMESH::SMESH_subMesh_var subMesh = SMESH::SMESH_subMesh::_narrow( obj );
+            if ( !subMesh->_is_nil() )
+              if ( SMESH_subMesh* sm = mesh_i->GetImpl().GetSubMeshContaining( subMesh->GetId() ))
+                if ( sm->IsComputedPartially() )
+                {
+                  SetPixMap( so, "ICON_SMESH_TREE_MESH_PARTIAL" );
+                  continue;
+                }
+          }
         }
       }
         }
       }
+
       if ( isEmpty )
         SetPixMap( so, "ICON_SMESH_TREE_MESH_WARN");
       else if ( !isGroup )
       if ( isEmpty )
         SetPixMap( so, "ICON_SMESH_TREE_MESH_WARN");
       else if ( !isGroup )
@@ -1019,8 +1034,9 @@ void SMESH_Gen_i::UpdateIcons( SMESH::SMESH_Mesh_ptr theMesh )
         SetPixMap( so, "ICON_SMESH_TREE_GROUP_ON_FILTER" );
       else
         SetPixMap( so, "ICON_SMESH_TREE_GROUP" );
         SetPixMap( so, "ICON_SMESH_TREE_GROUP_ON_FILTER" );
       else
         SetPixMap( so, "ICON_SMESH_TREE_GROUP" );
-    }
-  }
+
+    } // loop on sub-meshes or groups
+  } // loop on roots
 }
 
 //=======================================================================
 }
 
 //=======================================================================