X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_subMesh_i.cxx;h=5982ff089b339981cff994dd71183106d91d0dae;hb=b8cc25cce5e1bd0bf006b25d4a53d60c4767114c;hp=a660013ed3b98aca2e1b523398a7c3c2c8bd1056;hpb=c98d9fcd7f02c1f1f5c24dd3e709ed75228d66c4;p=modules%2Fsmesh.git diff --git a/src/SMESH_I/SMESH_subMesh_i.cxx b/src/SMESH_I/SMESH_subMesh_i.cxx index a660013ed..5982ff089 100644 --- a/src/SMESH_I/SMESH_subMesh_i.cxx +++ b/src/SMESH_I/SMESH_subMesh_i.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2020 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 @@ -20,16 +20,19 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses +// SMESH SMESH_I : idl implementation based on 'SMESH' unit's classes // File : SMESH_subMesh_i.cxx // Author : Paul RASCLE, EDF // Module : SMESH // #include "SMESH_subMesh_i.hxx" + +#include "SMESHDS_Mesh.hxx" +#include "SMESHDS_SubMesh.hxx" #include "SMESH_Gen_i.hxx" #include "SMESH_Mesh_i.hxx" -#include "SMESH_PreMeshInfo.hxx" #include "SMESH_MesherHelper.hxx" +#include "SMESH_PreMeshInfo.hxx" #include "Utils_CorbaException.hxx" #include "utilities.h" @@ -78,7 +81,6 @@ SMESH_subMesh_i::SMESH_subMesh_i( PortableServer::POA_ptr thePOA, SMESH_subMesh_i::~SMESH_subMesh_i() { - MESSAGE("SMESH_subMesh_i::~SMESH_subMesh_i"); if ( _preMeshInfo ) delete _preMeshInfo; _preMeshInfo = NULL; } @@ -94,6 +96,8 @@ typedef list TListOfSubMeshes; bool getSubMeshes(::SMESH_subMesh* theSubMesh, TListOfSubMeshes& theSubMeshList) { + if ( !theSubMesh ) + return false; // "invalid sub-mesh" created by SMESH_Gen_i::CopyMeshWithGeom() size_t size = theSubMeshList.size(); // check all child sub-meshes of one complexity, @@ -137,7 +141,6 @@ bool getSubMeshes(::SMESH_subMesh* theSubMesh, //============================================================================= CORBA::Long SMESH_subMesh_i::GetNumberOfElements() - throw (SALOME::SALOME_Exception) { Unexpect aCatch(SALOME_SalomeException); @@ -168,7 +171,6 @@ CORBA::Long SMESH_subMesh_i::GetNumberOfElements() //============================================================================= CORBA::Long SMESH_subMesh_i::GetNumberOfNodes(CORBA::Boolean all) - throw (SALOME::SALOME_Exception) { Unexpect aCatch(SALOME_SalomeException); @@ -216,7 +218,6 @@ CORBA::Long SMESH_subMesh_i::GetNumberOfNodes(CORBA::Boolean all) //============================================================================= SMESH::long_array* SMESH_subMesh_i::GetElementsId() - throw (SALOME::SALOME_Exception) { Unexpect aCatch(SALOME_SalomeException); @@ -261,7 +262,6 @@ SMESH::long_array* SMESH_subMesh_i::GetElementsId() //============================================================================= SMESH::long_array* SMESH_subMesh_i::GetElementsByType( SMESH::ElementType theElemType ) - throw (SALOME::SALOME_Exception) { Unexpect aCatch(SALOME_SalomeException); @@ -347,7 +347,6 @@ SMESH::long_array* SMESH_subMesh_i::GetElementsByType( SMESH::ElementType theEle //============================================================================= SMESH::long_array* SMESH_subMesh_i::GetNodesId() - throw (SALOME::SALOME_Exception) { Unexpect aCatch(SALOME_SalomeException); @@ -362,7 +361,6 @@ SMESH::long_array* SMESH_subMesh_i::GetNodesId() //============================================================================= SMESH::SMESH_Mesh_ptr SMESH_subMesh_i::GetFather() - throw (SALOME::SALOME_Exception) { Unexpect aCatch(SALOME_SalomeException); return _mesh_i->_this(); @@ -385,7 +383,6 @@ CORBA::Long SMESH_subMesh_i::GetId() //======================================================================= GEOM::GEOM_Object_ptr SMESH_subMesh_i::GetSubShape() - throw (SALOME::SALOME_Exception) { Unexpect aCatch(SALOME_SalomeException); GEOM::GEOM_Object_var aShapeObj; @@ -424,7 +421,6 @@ SMESH::long_array* SMESH_subMesh_i::GetIDs() */ //============================================================================= SMESH::ElementType SMESH_subMesh_i::GetElementType( const CORBA::Long id, const bool iselem ) - throw (SALOME::SALOME_Exception) { if ( _preMeshInfo ) _preMeshInfo->FullLoadFromFile(); @@ -483,14 +479,19 @@ SMESH::long_array* SMESH_subMesh_i::GetNbElementsByType() aRes[ SMESH::NODE ] = GetNumberOfNodes(true); ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; - if ( SMESHDS_SubMesh* smDS = aSubMesh->GetSubMeshDS() ) + TListOfSubMeshes smList; + if ( getSubMeshes( aSubMesh, smList )) { - SMDS_ElemIteratorPtr eIt = smDS->GetElements(); - if ( eIt->more() ) - aRes[ eIt->next()->GetType() ] = smDS->NbElements(); + TListOfSubMeshes::iterator smDS = smList.begin(); + for ( ; smDS != smList.end(); ++smDS ) + { + SMDS_ElemIteratorPtr eIt = (*smDS)->GetElements(); + if ( eIt->more() ) + aRes[ eIt->next()->GetType() ] = (*smDS)->NbElements(); + } } } - return aRes._retn(); + return aRes._retn(); } @@ -507,26 +508,37 @@ SMESH::array_of_ElementType* SMESH_subMesh_i::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() ) + + TListOfSubMeshes smList; + if ( getSubMeshes( aSubMesh, smList )) { - SMDS_ElemIteratorPtr eIt = smDS->GetElements(); - if ( eIt->more() ) - { - types->length( 1 ); - types[0] = SMESH::ElementType( eIt->next()->GetType()); - } - else if ( smDS->GetNodes()->more() ) + TListOfSubMeshes::iterator smDS = smList.begin(); + for ( ; smDS != smList.end(); ++smDS ) { - TopoDS_Shape shape = aSubMesh->GetSubShape(); - while ( !shape.IsNull() && shape.ShapeType() == TopAbs_COMPOUND ) + SMDS_ElemIteratorPtr eIt = (*smDS)->GetElements(); + if ( eIt->more() ) { - TopoDS_Iterator it( shape ); - shape = it.More() ? it.Value() : TopoDS_Shape(); + types->length( 1 ); + types[0] = SMESH::ElementType( eIt->next()->GetType()); + break; } - if ( !shape.IsNull() && shape.ShapeType() == TopAbs_VERTEX ) + } + + if ( types->length() == 0 ) + { + for ( smDS = smList.begin(); smDS != smList.end(); ++smDS ) { - types->length( 1 ); - types[0] = SMESH::NODE; + if ( (*smDS)->GetNodes()->more() ) + { + int smID = (*smDS)->GetID(); + TopoDS_Shape shape = (*smDS)->GetParent()->IndexToShape( smID ); + if ( !shape.IsNull() && shape.ShapeType() == TopAbs_VERTEX ) + { + types->length( 1 ); + types[0] = SMESH::NODE; + break; + } + } } } } @@ -564,3 +576,29 @@ SALOMEDS::TMPFile* SMESH_subMesh_i::GetVtkUgStream() SALOMEDS::TMPFile_var SeqFile; return SeqFile._retn(); } + +//======================================================================= +//function : SMESH_Invalid_subMesh_i +//purpose : constructor of "invalid sub-mesh" created by SMESH_Gen_i::CopyMeshWithGeom() +//======================================================================= + +SMESH_Invalid_subMesh_i::SMESH_Invalid_subMesh_i( PortableServer::POA_ptr thePOA, + SMESH_Gen_i* gen_i, + SMESH_Mesh_i* mesh_i, + int localId, + GEOM::GEOM_Object_ptr shape ) + : SALOME::GenericObj_i( thePOA ), + SMESH_subMesh_i( thePOA, gen_i, mesh_i, localId ) +{ + _geom = GEOM::GEOM_Object::_duplicate( shape ); +} + +//======================================================================= +//function : GetSubShape +//purpose : return geometry which is not a sub-shape of the main shape +//======================================================================= + +GEOM::GEOM_Object_ptr SMESH_Invalid_subMesh_i::GetSubShape() +{ + return GEOM::GEOM_Object::_duplicate( _geom ); +}