+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+ return GetFather()->GetElementType( id, iselem );
+}
+
+//=============================================================================
+/*
+ * 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 _preMeshInfo->GetMeshInfo();
+
+ SMESH::long_array_var aRes = new SMESH::long_array();
+ aRes->length(SMESH::Entity_Last);
+ for (int i = SMESH::Entity_Node; i < SMESH::Entity_Last; i++)
+ aRes[i] = 0;
+
+ // get number of nodes
+ aRes[ SMESH::Entity_Node ] = GetNumberOfNodes(true);
+
+ ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId];
+
+ // get statistic from child sub-meshes
+ TListOfSubMeshes smList;
+ if ( getSubMeshes( aSubMesh, smList ) )
+ for ( TListOfSubMeshes::iterator sm = smList.begin(); sm != smList.end(); ++sm )
+ SMESH_Mesh_i::CollectMeshInfo( (*sm)->GetElements(), aRes );
+
+ 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
+//purpose : Returns types of elements it contains
+//=======================================================================
+
+SMESH::array_of_ElementType* SMESH_subMesh_i::GetTypes()
+{
+ if ( _preMeshInfo )
+ return _preMeshInfo->GetTypes();
+
+ SMESH::array_of_ElementType_var types = new SMESH::array_of_ElementType;
+
+ ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId];
+ if ( SMESHDS_SubMesh* smDS = aSubMesh->GetSubMeshDS() )
+ {
+ SMDS_ElemIteratorPtr eIt = smDS->GetElements();
+ if ( eIt->more() )
+ {
+ types->length( 1 );
+ types[0] = SMESH::ElementType( eIt->next()->GetType());
+ }
+ else if ( smDS->GetNodes()->more() )
+ {
+ TopoDS_Shape shape = aSubMesh->GetSubShape();
+ while ( !shape.IsNull() && shape.ShapeType() == TopAbs_COMPOUND )
+ {
+ TopoDS_Iterator it( shape );
+ shape = it.More() ? it.Value() : TopoDS_Shape();
+ }
+ if ( !shape.IsNull() && shape.ShapeType() == TopAbs_VERTEX )
+ {
+ types->length( 1 );
+ types[0] = SMESH::NODE;
+ }
+ }
+ }
+ return types._retn();
+}
+
+//=======================================================================
+//function : GetMesh
+//purpose : interface SMESH_IDSource
+//=======================================================================
+
+SMESH::SMESH_Mesh_ptr SMESH_subMesh_i::GetMesh()
+{
+ return GetFather();
+}
+
+//=======================================================================
+//function : IsMeshInfoCorrect
+//purpose : * Returns false if GetMeshInfo() returns incorrect information that may
+// * happen if mesh data is not yet fully loaded from the file of study.
+//=======================================================================
+
+bool SMESH_subMesh_i::IsMeshInfoCorrect()
+{
+ return _preMeshInfo ? _preMeshInfo->IsMeshInfoCorrect() : true;
+}
+
+//=======================================================================
+//function : GetVtkUgStream
+//purpose : Return data vtk unstructured grid (not implemented)
+//=======================================================================
+
+SALOMEDS::TMPFile* SMESH_subMesh_i::GetVtkUgStream()
+{
+ SALOMEDS::TMPFile_var SeqFile;
+ return SeqFile._retn();