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=02c2664f0807b56dfc86344d499473ab5a34c96d;hp=19a483dcbac6cddf72da1859d0f73e71325c77f6;hb=44cfe3f661cf16b7253c2635368807ea332a4cc5;hpb=fc5cad90e2d4767d932d4a9cada3790eb844e6ab diff --git a/src/SMESH_I/SMESH_subMesh_i.cxx b/src/SMESH_I/SMESH_subMesh_i.cxx index 19a483dcb..02c2664f0 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-2015 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 @@ -35,8 +35,9 @@ #include "OpUtil.hxx" #include "Utils_ExceptHandlers.hxx" -#include #include +#include +#include using namespace std; @@ -99,50 +100,87 @@ bool getSubMeshes(::SMESH_subMesh* theSubMesh, 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(); - switch ( aShape.ShapeType() ) + 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() ) { - case TopAbs_SOLID: { - // add submesh of solid itself - aSubMeshDS = aMeshDS->MeshElements( aShape ); - if ( aSubMeshDS ) + // 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 ) + { + // 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(); + } + } + } + + 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() ) { - aSubMeshDS = aMeshDS->MeshElements( exp.Current() ); - if ( aSubMeshDS ) + if ( exp.More() ) + if (( aSubMeshDS = aMeshDS->MeshElements( exp.Current() ))) theSubMeshList.push_back( aSubMeshDS ); - } break; } case TopAbs_WIRE: case TopAbs_COMPOUND: - case TopAbs_COMPSOLID: { + 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 ( ::SMESH_subMesh* aSubMesh = aMesh->GetSubMeshContaining( it.Value() )) - getSubMeshes( aSubMesh, theSubMeshList ); // add found submesh or explore deeper + 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() ); } } - // return only unique submeshes - set smSet; - TListOfSubMeshes::iterator sm = theSubMeshList.begin(); - while ( sm != theSubMeshList.end() ) { - if ( !smSet.insert( *sm ).second ) - sm = theSubMeshList.erase( sm ); - else - ++sm; - } + // return only unique sub-meshes + set smSet( theSubMeshList.begin(), theSubMeshList.end() ); + theSubMeshList.assign( smSet.begin(), smSet.end() ); break; } default: @@ -607,3 +645,14 @@ 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(); +}