From 54d95073e18f1aca5c8e031c6b14e930c84f320e Mon Sep 17 00:00:00 2001 From: eap Date: Wed, 4 Sep 2019 20:50:22 +0300 Subject: [PATCH] IPAL54157: Empty bounding box of a non-empty mesh --- src/SMESH_I/SMESH_Measurements_i.cxx | 34 ++++++++++++++++++---------- src/SMESH_SWIG/smeshBuilder.py | 9 +++++++- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/SMESH_I/SMESH_Measurements_i.cxx b/src/SMESH_I/SMESH_Measurements_i.cxx index 37278a3de..704e9549b 100644 --- a/src/SMESH_I/SMESH_Measurements_i.cxx +++ b/src/SMESH_I/SMESH_Measurements_i.cxx @@ -151,7 +151,8 @@ static SMESHDS_Mesh* getMesh(SMESH::SMESH_IDSource_ptr theSource) { if (!CORBA::is_nil( theSource )) { - SMESH_Mesh_i* anImplPtr = DownCast(theSource->GetMesh()); + SMESH::SMESH_Mesh_var mesh = theSource->GetMesh(); + SMESH_Mesh_i* anImplPtr = DownCast( 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( 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); + } } } } diff --git a/src/SMESH_SWIG/smeshBuilder.py b/src/SMESH_SWIG/smeshBuilder.py index 35f4ddfd0..afa315b9b 100644 --- a/src/SMESH_SWIG/smeshBuilder.py +++ b/src/SMESH_SWIG/smeshBuilder.py @@ -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 `