X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_subMesh_i.cxx;h=ac64d86ad9ef83f867a07c05297571559956d147;hb=bd39d7c3ed2581f5b6eaf6dca1cb581f767c8f50;hp=3dab3db5b2731fac89f3d37d86171ffcbd37c607;hpb=bd8f1aee7c78f7d2eb82bd4fec5e08c9e3d280ce;p=modules%2Fsmesh.git diff --git a/src/SMESH_I/SMESH_subMesh_i.cxx b/src/SMESH_I/SMESH_subMesh_i.cxx index 3dab3db5b..ac64d86ad 100644 --- a/src/SMESH_I/SMESH_subMesh_i.cxx +++ b/src/SMESH_I/SMESH_subMesh_i.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -6,7 +6,7 @@ // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -207,53 +207,30 @@ 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 nbNodes; } - return aSubMeshDS->NbNodes(); + return aSubMeshDS ? aSubMeshDS->NbNodes() : 0; } //============================================================================= @@ -485,30 +462,6 @@ GEOM::GEOM_Object_ptr SMESH_subMesh_i::GetSubShape() return aShapeObj._retn(); } -//============================================================================= -/*! - * - */ -//============================================================================= -SALOME_MED::FAMILY_ptr SMESH_subMesh_i::GetFamily() - throw (SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - if ( _preMeshInfo ) - _preMeshInfo->FullLoadFromFile(); - SALOME_MED::MESH_var MEDMesh = GetFather()->GetMEDMesh(); - - SALOME_MED::Family_array_var families = - MEDMesh->getFamilies(SALOME_MED::MED_NODE); - - for ( int i = 0; i < families->length(); i++ ) { - if ( families[i]->getIdentifier() == ( _localId ) ) - return families[i]; - } - - return SALOME_MED::FAMILY::_nil(); -} - //============================================================================= /*! * @@ -532,14 +485,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 ) @@ -564,6 +516,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