X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_subMesh_i.cxx;h=5982ff089b339981cff994dd71183106d91d0dae;hp=ee9117e2cae0528bd925a1dbe019ea5f7e8151b5;hb=HEAD;hpb=7a65c9fad427b1ccba6b9ccae612296e5092a324 diff --git a/src/SMESH_I/SMESH_subMesh_i.cxx b/src/SMESH_I/SMESH_subMesh_i.cxx index ee9117e2c..f5a74eb67 100644 --- a/src/SMESH_I/SMESH_subMesh_i.cxx +++ b/src/SMESH_I/SMESH_subMesh_i.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2024 CEA, EDF, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -20,14 +20,18 @@ // 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_MesherHelper.hxx" #include "SMESH_PreMeshInfo.hxx" #include "Utils_CorbaException.hxx" @@ -35,8 +39,6 @@ #include "OpUtil.hxx" #include "Utils_ExceptHandlers.hxx" -#include -#include #include using namespace std; @@ -79,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; } @@ -95,98 +96,41 @@ 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(); - SMESH_Mesh* aMesh = theSubMesh->GetFather(); - SMESHDS_Mesh* aMeshDS = aMesh->GetMeshDS(); - SMESHDS_SubMesh* aSubMeshDS = theSubMesh->GetSubMeshDS(); - ::SMESH_subMesh* sm; - - // nodes can be bound to either vertex, edge, face or solid_or_shell - TopoDS_Shape aShape = theSubMesh->GetSubShape(); - TopAbs_ShapeEnum aShapeType = aShape.ShapeType(); - - // IPAL18558: Wrong information of the created sub-mesh is shown. (Sub-mesh on a FACE - // with only 1D algo assigned - // Find dimension of sub-meshes to return as highest dimension of the assigned algorithm - if ( theSubMesh->IsEmpty() && !theSubMesh->GetAlgo() ) + // check all child sub-meshes of one complexity, + // if no elements found and no algo assigned, go to children of lower complexity + + TopoDS_Shape shape = theSubMesh->GetSubShape(); + TopAbs_ShapeEnum mainType = SMESH_MesherHelper::GetGroupType( shape, /*noCompound=*/true ); + TopAbs_ShapeEnum shapeType = shape.ShapeType(); + bool elementsFound = false; + bool algoFound = false; + SMESH_subMeshIteratorPtr smIt = theSubMesh->getDependsOnIterator(/*includeSelf=*/true, + /*complexFirst=*/true); + while ( smIt->more() ) { - // on father sub-meshes, check presence of an algo which will mesh this sub-mesh - // even if no algo is assigned to this sub-mesh - bool topAlgoPresent = false; - TopTools_ListIteratorOfListOfShape ancestors( aMesh->GetAncestors( aShape )); - for ( ; ancestors.More() && !topAlgoPresent; ancestors.Next() ) - if (( sm = aMesh->GetSubMeshContaining( ancestors.Value() ))) - topAlgoPresent = ( sm->GetAlgo() && !sm->GetAlgo()->NeedDiscreteBoundary() ); - - if ( !topAlgoPresent ) + ::SMESH_subMesh* sm = smIt->next(); + if ( sm->GetSubShape().ShapeType() != shapeType ) { - // look for a sub-mesh with an algo - SMESH_subMeshIteratorPtr smIt = - theSubMesh->getDependsOnIterator(/*includeSelf=*/false, /*complexShapeFirst=*/true); - TopAbs_ShapeEnum algoShape = TopAbs_SHAPE; - while ( smIt->more() && algoShape == TopAbs_SHAPE ) - { - sm = smIt->next(); - if ( sm->GetAlgo() ) - algoShape = sm->GetSubShape().ShapeType(); - } - if ( algoShape != TopAbs_SHAPE ) - { - // return all sub-meshes on this shape type - smIt = theSubMesh->getDependsOnIterator(/*includeSelf=*/false, /*complexShapeFirst=*/true); - while ( smIt->more() ) - { - sm = smIt->next(); - if ( sm->GetSubShape().ShapeType() == algoShape && sm->GetSubMeshDS() ) - theSubMeshList.push_back( sm->GetSubMeshDS() ); - } - return size < theSubMeshList.size(); - } + if ( elementsFound || algoFound ) + break; + if ( sm->GetSubShape().ShapeType() == TopAbs_VERTEX && + mainType != TopAbs_VERTEX ) + break; } - } - - switch ( aShapeType ) - { - case TopAbs_SOLID: - { - // add sub-mesh of solid itself - if (( aSubMeshDS = aMeshDS->MeshElements( aShape ))) - theSubMeshList.push_back( aSubMeshDS ); - - // and of the first shell - TopExp_Explorer exp( aShape, TopAbs_SHELL ); - if ( exp.More() ) - if (( aSubMeshDS = aMeshDS->MeshElements( exp.Current() ))) - theSubMeshList.push_back( aSubMeshDS ); - break; - } - case TopAbs_WIRE: - case TopAbs_COMPOUND: - case TopAbs_COMPSOLID: - { - // call getSubMeshes() for sub-shapes - list shapeList; - shapeList.push_back( aShape ); - list::iterator sh = shapeList.begin(); - for ( ; sh != shapeList.end(); ++sh ) { - for ( TopoDS_Iterator it( *sh ); it.More(); it.Next() ) { - if (( sm = aMesh->GetSubMeshContaining( it.Value() ))) - getSubMeshes( sm, theSubMeshList ); // add found sub-mesh or explore deeper - else - // no submesh for a compound inside compound - shapeList.push_back( it.Value() ); - } + shapeType = sm->GetSubShape().ShapeType(); + if ( !sm->IsEmpty() ) + { + elementsFound = true; + theSubMeshList.push_back( sm->GetSubMeshDS() ); } - // return only unique sub-meshes - set smSet( theSubMeshList.begin(), theSubMeshList.end() ); - theSubMeshList.assign( smSet.begin(), smSet.end() ); - break; - } - default: - if ( aSubMeshDS ) - theSubMeshList.push_back( aSubMeshDS ); + if ( sm->GetAlgo() ) + algoFound = true; } + return size < theSubMeshList.size(); } @@ -196,8 +140,7 @@ bool getSubMeshes(::SMESH_subMesh* theSubMesh, */ //============================================================================= -CORBA::Long SMESH_subMesh_i::GetNumberOfElements() - throw (SALOME::SALOME_Exception) +SMESH::smIdType SMESH_subMesh_i::GetNumberOfElements() { Unexpect aCatch(SALOME_SalomeException); @@ -208,13 +151,11 @@ CORBA::Long SMESH_subMesh_i::GetNumberOfElements() return 0; ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; - SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); - int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0; + SMESH::smIdType nbElems = 0; - // volumes are bound to shell TListOfSubMeshes smList; - if ( nbElems == 0 && getSubMeshes( aSubMesh, smList )) + if ( getSubMeshes( aSubMesh, smList )) { TListOfSubMeshes::iterator sm = smList.begin(); for ( ; sm != smList.end(); ++sm ) @@ -229,8 +170,7 @@ CORBA::Long SMESH_subMesh_i::GetNumberOfElements() */ //============================================================================= -CORBA::Long SMESH_subMesh_i::GetNumberOfNodes(CORBA::Boolean all) - throw (SALOME::SALOME_Exception) +SMESH::smIdType SMESH_subMesh_i::GetNumberOfNodes(CORBA::Boolean all) { Unexpect aCatch(SALOME_SalomeException); @@ -257,7 +197,7 @@ CORBA::Long SMESH_subMesh_i::GetNumberOfNodes(CORBA::Boolean all) } if ( all ) // get nodes from aSubMesh and all child sub-meshes { - int nbNodes = 0; + SMESH::smIdType nbNodes = 0; SMESH_subMeshIteratorPtr smIt = aSubMesh->getDependsOnIterator( /*includeSelf=*/true ); while ( smIt->more() ) { @@ -277,12 +217,11 @@ CORBA::Long SMESH_subMesh_i::GetNumberOfNodes(CORBA::Boolean all) */ //============================================================================= -SMESH::long_array* SMESH_subMesh_i::GetElementsId() - throw (SALOME::SALOME_Exception) +SMESH::smIdType_array* SMESH_subMesh_i::GetElementsId() { Unexpect aCatch(SALOME_SalomeException); - SMESH::long_array_var aResult = new SMESH::long_array(); + SMESH::smIdType_array_var aResult = new SMESH::smIdType_array(); if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() ) return aResult._retn(); @@ -291,15 +230,10 @@ SMESH::long_array* SMESH_subMesh_i::GetElementsId() _preMeshInfo->FullLoadFromFile(); ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; - SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); - int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0; + SMESH::smIdType nbElems = 0; TListOfSubMeshes smList; - if ( nbElems ) - smList.push_back( aSubMeshDS ); - - // volumes are bound to shell - if ( nbElems == 0 && getSubMeshes( aSubMesh, smList )) + if ( getSubMeshes( aSubMesh, smList )) { TListOfSubMeshes::iterator sm = smList.begin(); for ( ; sm != smList.end(); ++sm ) @@ -327,12 +261,11 @@ SMESH::long_array* SMESH_subMesh_i::GetElementsId() */ //============================================================================= -SMESH::long_array* SMESH_subMesh_i::GetElementsByType( SMESH::ElementType theElemType ) - throw (SALOME::SALOME_Exception) +SMESH::smIdType_array* SMESH_subMesh_i::GetElementsByType( SMESH::ElementType theElemType ) { Unexpect aCatch(SALOME_SalomeException); - SMESH::long_array_var aResult = new SMESH::long_array(); + SMESH::smIdType_array_var aResult = new SMESH::smIdType_array(); if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() ) return aResult._retn(); @@ -341,15 +274,14 @@ SMESH::long_array* SMESH_subMesh_i::GetElementsByType( SMESH::ElementType theEle _preMeshInfo->FullLoadFromFile(); ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; - SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); - // PAL5440, return all nodes belonging to elements of submesh - set nodeIds; - int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0; + // PAL5440, return all nodes belonging to elements of the sub-mesh + set nodeIds; + smIdType nbElems = 0; // volumes may be bound to shell instead of solid TListOfSubMeshes smList; - if ( nbElems == 0 && getSubMeshes( aSubMesh, smList )) + if ( getSubMeshes( aSubMesh, smList )) { TListOfSubMeshes::iterator sm = smList.begin(); for ( ; sm != smList.end(); ++sm ) @@ -375,29 +307,6 @@ SMESH::long_array* SMESH_subMesh_i::GetElementsByType( SMESH::ElementType theEle nbElems += (*sm)->NbElements(); } } - aSubMeshDS = 0; - } - else - { - if ( nbElems ) - smList.push_back( aSubMeshDS ); - } - - if ( theElemType == SMESH::NODE && aSubMeshDS ) - { - 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 ( theElemType == SMESH::NODE ) @@ -408,7 +317,7 @@ SMESH::long_array* SMESH_subMesh_i::GetElementsByType( SMESH::ElementType theEle int i = 0, n = aResult->length(); if ( theElemType == SMESH::NODE && !nodeIds.empty() ) { - set::iterator idIt = nodeIds.begin(); + set::iterator idIt = nodeIds.begin(); for ( ; i < n && idIt != nodeIds.end() ; i++, idIt++ ) aResult[i] = *idIt; } @@ -417,8 +326,7 @@ SMESH::long_array* SMESH_subMesh_i::GetElementsByType( SMESH::ElementType theEle TListOfSubMeshes::iterator sm = smList.begin(); for ( i = 0; sm != smList.end(); sm++ ) { - aSubMeshDS = *sm; - SMDS_ElemIteratorPtr anIt = aSubMeshDS->GetElements(); + SMDS_ElemIteratorPtr anIt = (*sm)->GetElements(); while ( i < n && anIt->more() ) { const SMDS_MeshElement* anElem = anIt->next(); if ( theElemType == SMESH::ALL || anElem->GetType() == (SMDSAbs_ElementType)theElemType ) @@ -438,12 +346,11 @@ SMESH::long_array* SMESH_subMesh_i::GetElementsByType( SMESH::ElementType theEle */ //============================================================================= -SMESH::long_array* SMESH_subMesh_i::GetNodesId() - throw (SALOME::SALOME_Exception) +SMESH::smIdType_array* SMESH_subMesh_i::GetNodesId() { Unexpect aCatch(SALOME_SalomeException); - SMESH::long_array_var aResult = GetElementsByType( SMESH::NODE ); + SMESH::smIdType_array_var aResult = GetElementsByType( SMESH::NODE ); return aResult._retn(); } @@ -451,10 +358,9 @@ SMESH::long_array* SMESH_subMesh_i::GetNodesId() /*! * */ -//============================================================================= +//========error:===================================================================== SMESH::SMESH_Mesh_ptr SMESH_subMesh_i::GetFather() - throw (SALOME::SALOME_Exception) { Unexpect aCatch(SALOME_SalomeException); return _mesh_i->_this(); @@ -477,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; @@ -505,7 +410,7 @@ GEOM::GEOM_Object_ptr SMESH_subMesh_i::GetSubShape() * */ //============================================================================= -SMESH::long_array* SMESH_subMesh_i::GetIDs() +SMESH::smIdType_array* SMESH_subMesh_i::GetIDs() { return GetElementsId(); } @@ -515,8 +420,7 @@ SMESH::long_array* SMESH_subMesh_i::GetIDs() * */ //============================================================================= -SMESH::ElementType SMESH_subMesh_i::GetElementType( const CORBA::Long id, const bool iselem ) - throw (SALOME::SALOME_Exception) +SMESH::ElementType SMESH_subMesh_i::GetElementType( const SMESH::smIdType id, const bool iselem ) { if ( _preMeshInfo ) _preMeshInfo->FullLoadFromFile(); @@ -530,12 +434,12 @@ SMESH::ElementType SMESH_subMesh_i::GetElementType( const CORBA::Long id, const */ //============================================================================= -SMESH::long_array* SMESH_subMesh_i::GetMeshInfo() +SMESH::smIdType_array* SMESH_subMesh_i::GetMeshInfo() { if ( _preMeshInfo ) return _preMeshInfo->GetMeshInfo(); - SMESH::long_array_var aRes = new SMESH::long_array(); + SMESH::smIdType_array_var aRes = new SMESH::smIdType_array(); aRes->length(SMESH::Entity_Last); for (int i = SMESH::Entity_Node; i < SMESH::Entity_Last; i++) aRes[i] = 0; @@ -560,9 +464,9 @@ SMESH::long_array* SMESH_subMesh_i::GetMeshInfo() */ //======================================================================= -SMESH::long_array* SMESH_subMesh_i::GetNbElementsByType() +SMESH::smIdType_array* SMESH_subMesh_i::GetNbElementsByType() { - SMESH::long_array_var aRes = new SMESH::long_array(); + SMESH::smIdType_array_var aRes = new SMESH::smIdType_array(); aRes->length(SMESH::NB_ELEMENT_TYPES); for (int i = 0; i < SMESH::NB_ELEMENT_TYPES; i++) if ( _preMeshInfo ) @@ -575,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(); } @@ -599,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() ) + TListOfSubMeshes::iterator smDS = smList.begin(); + for ( ; smDS != smList.end(); ++smDS ) { - 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 ) + 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; + } + } } } } @@ -656,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 ); +}