}
//=============================================================================
-/*!
- * 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
*/
//=============================================================================
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
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
::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId];
SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS();
- set<int> 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;
}
//=============================================================================
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 )
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