Salome HOME
IPAL54157: Empty bounding box of a non-empty mesh
authoreap <eap@opencascade.com>
Wed, 4 Sep 2019 17:50:22 +0000 (20:50 +0300)
committereap <eap@opencascade.com>
Wed, 4 Sep 2019 17:50:22 +0000 (20:50 +0300)
src/SMESH_I/SMESH_Measurements_i.cxx
src/SMESH_SWIG/smeshBuilder.py

index 37278a3de698e7dbf448b2c145ec301099584959..704e9549b1d2a3d071a00c324901b488950441fa 100644 (file)
@@ -151,7 +151,8 @@ static SMESHDS_Mesh* getMesh(SMESH::SMESH_IDSource_ptr theSource)
 {
   if (!CORBA::is_nil( theSource ))
   {
-    SMESH_Mesh_i* anImplPtr = DownCast<SMESH_Mesh_i*>(theSource->GetMesh());
+    SMESH::SMESH_Mesh_var mesh = theSource->GetMesh();
+    SMESH_Mesh_i* anImplPtr = DownCast<SMESH_Mesh_i*>( mesh );
     if (anImplPtr)
       return anImplPtr->GetImpl().GetMeshDS();
   }
@@ -287,19 +288,28 @@ static void enlargeBoundingBox(const SMESH::SMESH_IDSource_ptr theObject,
   const SMESHDS_Mesh* aMesh = getMesh( theObject );
   if ( !aMesh )
     return;
-  SMESH::array_of_ElementType_var types = theObject->GetTypes();
-  SMESH::long_array_var     aElementsId = theObject->GetIDs();
-  // here we assume that type of all IDs defined by first type in array
-  const bool isNode = isNodeType( types );
-  for(int i = 0, n = aElementsId->length(); i < n; i++)
+
+  if ( DownCast<SMESH_Mesh_i*>( theObject )) // theObject is mesh
   {
-    if (isNode)
-      enlargeBoundingBox( aMesh->FindNode( aElementsId[i] ), theMeasure);
-    else
+    for (SMDS_NodeIteratorPtr aNodeIter = aMesh->nodesIterator(); aNodeIter->more(); )
+      enlargeBoundingBox( aNodeIter->next(), theMeasure);
+  }
+  else
+  {
+    SMESH::array_of_ElementType_var types = theObject->GetTypes();
+    SMESH::long_array_var     aElementsId = theObject->GetIDs();
+    // here we assume that type of all IDs defined by first type in array
+    const bool isNode = isNodeType( types );
+    for(int i = 0, n = aElementsId->length(); i < n; i++)
     {
-      if ( const SMDS_MeshElement* elem = aMesh->FindElement( aElementsId[i] ))
-        for (SMDS_NodeIteratorPtr aNodeIter = elem->nodeIterator(); aNodeIter->more(); )
-          enlargeBoundingBox( aNodeIter->next(), theMeasure);
+      if (isNode)
+        enlargeBoundingBox( aMesh->FindNode( aElementsId[i] ), theMeasure);
+      else
+      {
+        if ( const SMDS_MeshElement* elem = aMesh->FindElement( aElementsId[i] ))
+          for (SMDS_NodeIteratorPtr aNodeIter = elem->nodeIterator(); aNodeIter->more(); )
+            enlargeBoundingBox( aNodeIter->next(), theMeasure);
+      }
     }
   }
 }
index 35f4ddfd0d1f09be3ee4abb772bb6ad47bb01438..afa315b9bf416f38174e40f4819503fc1bd89d0d 100644 (file)
@@ -2072,7 +2072,14 @@ class Mesh(metaclass = MeshMeta):
 
     def SetMeshOrder(self, submeshes):
         """
-        Set order in which concurrent sub-meshes should be meshed
+        Set priority of sub-meshes. It works in two ways:
+        
+        * For sub-meshes with assigned algorithms of same dimension generating mesh of
+          *several dimensions*, it sets the order in which the sub-meshes are computed.
+        * For the rest sub-meshes, it sets the order in which the sub-meshes are checked
+          when looking for meshing parameters to apply to a sub-shape. To impose the 
+          order in which sub-meshes with uni-dimensional algorithms are computed, 
+          call **submesh.Compute()** in a desired order.
 
         Parameters:
                 submeshes: list of lists of :class:`sub-meshes <SMESH.SMESH_subMesh>`