From 95a58b5ecfaaf32f9c4a7d2689ab72f8f9331b68 Mon Sep 17 00:00:00 2001 From: eap Date: Wed, 3 Jul 2013 16:04:07 +0000 Subject: [PATCH] 0020976: EDF 1471 SMESH: New ergonomy to display quality controls + virtual SMESH::long_array* GetNbElementsByType(); --- src/SMESH_I/SMESH_Group_i.cxx | 27 ++++++++- src/SMESH_I/SMESH_Group_i.hxx | 14 +++-- src/SMESH_I/SMESH_subMesh_i.cxx | 100 +++++++++++++++++--------------- src/SMESH_I/SMESH_subMesh_i.hxx | 8 ++- 4 files changed, 92 insertions(+), 57 deletions(-) diff --git a/src/SMESH_I/SMESH_Group_i.cxx b/src/SMESH_I/SMESH_Group_i.cxx index 20da6c040..d5c06b37c 100644 --- a/src/SMESH_I/SMESH_Group_i.cxx +++ b/src/SMESH_I/SMESH_Group_i.cxx @@ -677,9 +677,9 @@ void SMESH_GroupBase_i::SetColorNumber(CORBA::Long color) } //============================================================================= -/*! - * Returns statistic of mesh elements - * Result array of number enityties +/* + * Returns number of mesh elements of each \a SMESH::EntityType + * Result array of number of elements per \a SMESH::EntityType * Inherited from SMESH_IDSource */ //============================================================================= @@ -706,6 +706,27 @@ SMESH::long_array* SMESH_GroupBase_i::GetMeshInfo() return aRes._retn(); } +//============================================================================= +/* + * Returns number of mesh elements of each \a ElementType + */ +//============================================================================= + +SMESH::long_array* SMESH_GroupBase_i::GetNbElementsByType() +{ + SMESH::long_array_var aRes = new SMESH::long_array(); + aRes->length(SMESH::NB_ELEMENT_TYPES); + for (int i = 0; i < SMESH::NB_ELEMENT_TYPES; i++) + aRes[ i ] = 0; + + if ( myPreMeshInfo ) + aRes[ GetType() ] = myPreMeshInfo->NbElements( SMDSAbs_ElementType( GetType() )); + else + aRes[ GetType() ] = Size(); + + return aRes._retn(); +} + //======================================================================= //function : GetIDs //purpose : Returns ids of members diff --git a/src/SMESH_I/SMESH_Group_i.hxx b/src/SMESH_I/SMESH_Group_i.hxx index ad4522a0a..152abd53c 100644 --- a/src/SMESH_I/SMESH_Group_i.hxx +++ b/src/SMESH_I/SMESH_Group_i.hxx @@ -72,15 +72,19 @@ class SMESH_I_EXPORT SMESH_GroupBase_i: virtual SMESH::SMESH_Mesh_ptr GetMesh(); /*! - * Returns statistic of mesh elements - * Result array of number enityties + * Returns number of mesh elements of each \a EntityType + * Result array of number of elements per \a EntityType * Inherited from SMESH_IDSource */ virtual SMESH::long_array* GetMeshInfo(); - - // Inherited from SMESH_IDSource interface + /*! + * Returns number of mesh elements of each \a ElementType + */ + virtual SMESH::long_array* GetNbElementsByType(); + /*! + * Returns a sequence of all element IDs + */ virtual SMESH::long_array* GetIDs(); - /*! * Returns types of elements it contains * Inherited from SMESH_IDSource interface diff --git a/src/SMESH_I/SMESH_subMesh_i.cxx b/src/SMESH_I/SMESH_subMesh_i.cxx index 21dfcc2e6..30c8cc52a 100644 --- a/src/SMESH_I/SMESH_subMesh_i.cxx +++ b/src/SMESH_I/SMESH_subMesh_i.cxx @@ -207,53 +207,29 @@ CORBA::Long SMESH_subMesh_i::GetNumberOfNodes(CORBA::Boolean all) ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); - set nodeIds; - - // nodes are bound to shell instead of solid - TListOfSubMeshes smList; - if ( all && getSubMeshes( aSubMesh, smList )) + if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() ) { - TListOfSubMeshes::iterator sm = smList.begin(); - for ( ; sm != smList.end(); ++sm ) - { - SMDS_ElemIteratorPtr eIt = (*sm)->GetElements(); - if ( eIt->more() ) { - while ( eIt->more() ) { - const SMDS_MeshElement* anElem = eIt->next(); - SMDS_ElemIteratorPtr nIt = anElem->nodesIterator(); - while ( nIt->more() ) - nodeIds.insert( nIt->next()->GetID() ); - } - } else { - SMDS_NodeIteratorPtr nIt = (*sm)->GetNodes(); - while ( nIt->more() ) - nodeIds.insert( nIt->next()->GetID() ); - } - } - return nodeIds.size(); + // sub-mesh on a geom group, always return all nodes + return aSubMeshDS->NbNodes(); } - - if ( aSubMeshDS == NULL ) - return 0; - - if ( all ) { // all nodes of submesh elements - SMDS_ElemIteratorPtr eIt = aSubMeshDS->GetElements(); - if ( eIt->more() ) { - while ( eIt->more() ) { - const SMDS_MeshElement* anElem = eIt->next(); - SMDS_ElemIteratorPtr nIt = anElem->nodesIterator(); - while ( nIt->more() ) - nodeIds.insert( nIt->next()->GetID() ); - } - } else { - SMDS_NodeIteratorPtr nIt = aSubMeshDS->GetNodes(); - while ( nIt->more() ) - nodeIds.insert( nIt->next()->GetID() ); + if ( aSubMeshDS && !all ) + { + // return anything we have + return aSubMeshDS->NbNodes(); + } + if ( all ) // get nodes from aSubMesh and all child sub-meshes + { + int nbNodes = 0; + SMESH_subMeshIteratorPtr smIt = aSubMesh->getDependsOnIterator( /*includeSelf=*/true ); + while ( smIt->more() ) + { + aSubMesh = smIt->next(); + if (( aSubMeshDS = aSubMesh->GetSubMeshDS() )) + nbNodes += aSubMeshDS->NbNodes(); } - return nodeIds.size(); } - return aSubMeshDS->NbNodes(); + return aSubMeshDS ? aSubMeshDS->NbNodes() : 0; } //============================================================================= @@ -508,14 +484,13 @@ SMESH::ElementType SMESH_subMesh_i::GetElementType( const CORBA::Long id, const return GetFather()->GetElementType( id, iselem ); } - //============================================================================= -/*! - * Returns statistic of mesh elements - * Result array of number enityties - * Inherited from SMESH_IDSource +/* + * Returns number of mesh elements of each \a EntityType + * @return array of number of elements per \a EntityType */ //============================================================================= + SMESH::long_array* SMESH_subMesh_i::GetMeshInfo() { if ( _preMeshInfo ) @@ -540,6 +515,37 @@ SMESH::long_array* SMESH_subMesh_i::GetMeshInfo() return aRes._retn(); } +//======================================================================= +/* + * Returns number of mesh elements of each \a ElementType + */ +//======================================================================= + +SMESH::long_array* SMESH_subMesh_i::GetNbElementsByType() +{ + SMESH::long_array_var aRes = new SMESH::long_array(); + aRes->length(SMESH::NB_ELEMENT_TYPES); + for (int i = 0; i < SMESH::NB_ELEMENT_TYPES; i++) + if ( _preMeshInfo ) + aRes[ i ] = _preMeshInfo->NbElements( SMDSAbs_ElementType( i )); + else + aRes[ i ] = 0; + + if ( !_preMeshInfo ) + { + aRes[ SMESH::NODE ] = GetNumberOfNodes(true); + + ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; + if ( SMESHDS_SubMesh* smDS = aSubMesh->GetSubMeshDS() ) + { + SMDS_ElemIteratorPtr eIt = smDS->GetElements(); + if ( eIt->more() ) + aRes[ eIt->next()->GetType() ] = smDS->NbElements(); + } + } + return aRes._retn(); +} + //======================================================================= //function : GetTypes diff --git a/src/SMESH_I/SMESH_subMesh_i.hxx b/src/SMESH_I/SMESH_subMesh_i.hxx index adacb074c..5282620dd 100644 --- a/src/SMESH_I/SMESH_subMesh_i.hxx +++ b/src/SMESH_I/SMESH_subMesh_i.hxx @@ -88,11 +88,15 @@ public: */ virtual SMESH::long_array* GetIDs(); /*! - * Returns statistic of mesh elements - * Result array of number enityties + * Returns number of mesh elements of each \a EntityType + * Result array of number of elements per \a EntityType * Inherited from SMESH_IDSource */ virtual SMESH::long_array* GetMeshInfo(); + /*! + * Returns number of mesh elements of each \a ElementType + */ + virtual SMESH::long_array* GetNbElementsByType(); /*! * Returns types of elements it contains */ -- 2.30.2