From d45cd9ae88f00b0d4cc3e6746c32a8c16f2fcc71 Mon Sep 17 00:00:00 2001 From: eap Date: Tue, 15 Mar 2016 15:59:11 +0300 Subject: [PATCH] 53057: NETGEN-1D2D3D issues "Ignored" warning for faces of a sub-mesh This case also reveals the following bugs: 1) SMESH_MesherHelper::IsReversedSubMesh() incorrectly works on a coarsely meshed disk 2) Addition of NETGEN-1D2D3D removes already computed faces of a sub-mesh on a group of FACEs (SMESH_subMesh::cleanDependsOn()) 3) Volumes are shown, instead of faces, when displaying a sub-mesh on a SOLID with only a 2D algo assigned to the sub-mesh (SMESH_subMesh_i.cxx) --- src/SMESH/SMESH_MesherHelper.cxx | 4 ++++ src/SMESH/SMESH_subMesh.cxx | 17 +++++++-------- src/SMESH_I/SMESH_subMesh_i.cxx | 37 +++++++++++++++++++++----------- 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/SMESH/SMESH_MesherHelper.cxx b/src/SMESH/SMESH_MesherHelper.cxx index 3703a7215..40016a488 100644 --- a/src/SMESH/SMESH_MesherHelper.cxx +++ b/src/SMESH/SMESH_MesherHelper.cxx @@ -2904,6 +2904,10 @@ bool SMESH_MesherHelper::IsReversedSubMesh (const TopoDS_Face& theFace) bool ok = true; double u0 = GetNodeU( TopoDS::Edge( E ), nn[0], nn[1], &ok ); double u1 = GetNodeU( TopoDS::Edge( E ), nn[1], nn[0], &ok ); + // check that the 2 nodes are connected with a segment (IPAL53055) + // if ( SMESHDS_SubMesh* sm = GetMeshDS()->MeshElements( E )) + // if ( sm->NbElements() > 0 && !GetMeshDS()->FindEdge( nn[0], nn[1] )) + // ok = false; if ( ok ) { isReversed = ( u0 > u1 ); diff --git a/src/SMESH/SMESH_subMesh.cxx b/src/SMESH/SMESH_subMesh.cxx index 38a445708..f395b7986 100644 --- a/src/SMESH/SMESH_subMesh.cxx +++ b/src/SMESH/SMESH_subMesh.cxx @@ -1217,8 +1217,6 @@ void SMESH_subMesh::cleanDependsOn( SMESH_Algo* algoRequiringCleaning/*=0*/ ) } else if ( algoRequiringCleaning && algoRequiringCleaning->SupportSubmeshes() ) { - SMESHDS_Mesh* meshDS = _father->GetMeshDS(); - // find sub-meshes to keep elements on set< SMESH_subMesh* > smToKeep; TopAbs_ShapeEnum prevShapeType = TopAbs_SHAPE; @@ -1242,13 +1240,14 @@ void SMESH_subMesh::cleanDependsOn( SMESH_Algo* algoRequiringCleaning/*=0*/ ) } if ( !keepSubMeshes ) { - // look for an algo assigned to sm - bool algoFound = false; - const list& hyps = meshDS->GetHypothesis( sm->_subShape ); - list::const_iterator h = hyps.begin(); - for ( ; ( !algoFound && h != hyps.end() ); ++h ) - algoFound = ((*h)->GetType() != SMESHDS_Hypothesis::PARAM_ALGO ); - keepSubMeshes = algoFound; + // look for a local algo used to mesh sm + TopoDS_Shape algoShape = SMESH_MesherHelper::GetShapeOfHypothesis + ( algoRequiringCleaning, _subShape, _father ); + SMESH_HypoFilter moreLocalAlgo; + moreLocalAlgo.Init( SMESH_HypoFilter::IsMoreLocalThan( algoShape, *_father )); + moreLocalAlgo.And ( SMESH_HypoFilter::IsAlgo() ); + bool localAlgoFound = _father->GetHypothesis( sm->_subShape, moreLocalAlgo, true ); + keepSubMeshes = localAlgoFound; } // remember all sub-meshes of sm if ( keepSubMeshes ) diff --git a/src/SMESH_I/SMESH_subMesh_i.cxx b/src/SMESH_I/SMESH_subMesh_i.cxx index ee9117e2c..bc0fa18c8 100644 --- a/src/SMESH_I/SMESH_subMesh_i.cxx +++ b/src/SMESH_I/SMESH_subMesh_i.cxx @@ -107,9 +107,10 @@ bool getSubMeshes(::SMESH_subMesh* theSubMesh, 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 + // with only 1D algo assigned) // Find dimension of sub-meshes to return as highest dimension of the assigned algorithm - if ( theSubMesh->IsEmpty() && !theSubMesh->GetAlgo() ) + if (( theSubMesh->IsEmpty() || ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() )) && + ( !theSubMesh->GetAlgo() )) { // 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 @@ -121,20 +122,22 @@ bool getSubMeshes(::SMESH_subMesh* theSubMesh, if ( !topAlgoPresent ) { - // look for a sub-mesh with an algo - SMESH_subMeshIteratorPtr smIt = - theSubMesh->getDependsOnIterator(/*includeSelf=*/false, /*complexShapeFirst=*/true); + // find max dimension of an assigned algo TopAbs_ShapeEnum algoShape = TopAbs_SHAPE; - while ( smIt->more() && algoShape == TopAbs_SHAPE ) - { - sm = smIt->next(); - if ( sm->GetAlgo() ) - algoShape = sm->GetSubShape().ShapeType(); - } + const std::list & hyps = aMesh->GetHypothesisList( aShape ); + std::list ::const_iterator hypIt = hyps.begin(); + for ( ; hypIt != hyps.end(); ++hypIt ) + if ( const SMESH_Algo* algo = dynamic_cast< const SMESH_Algo* >( *hypIt )) + switch ( algo->GetDim() ) { + case 1: algoShape = TopAbs_EDGE; break; + case 2: algoShape = TopAbs_FACE; break; + case 3: algoShape = TopAbs_SOLID; break; + case 0: algoShape = TopAbs_VERTEX; break; + } if ( algoShape != TopAbs_SHAPE ) { - // return all sub-meshes on this shape type - smIt = theSubMesh->getDependsOnIterator(/*includeSelf=*/false, /*complexShapeFirst=*/true); + // return all sub-meshes on this dimension + SMESH_subMeshIteratorPtr smIt = theSubMesh->getDependsOnIterator(/*includeSelf=*/false); while ( smIt->more() ) { sm = smIt->next(); @@ -209,6 +212,8 @@ CORBA::Long SMESH_subMesh_i::GetNumberOfElements() ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); + if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() ) + aSubMeshDS = 0; int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0; @@ -244,6 +249,8 @@ CORBA::Long SMESH_subMesh_i::GetNumberOfNodes(CORBA::Boolean all) } ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); + if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() ) + aSubMeshDS = 0; if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() ) { @@ -292,6 +299,8 @@ SMESH::long_array* SMESH_subMesh_i::GetElementsId() ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); + if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() ) + aSubMeshDS = 0; int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0; TListOfSubMeshes smList; @@ -342,6 +351,8 @@ SMESH::long_array* SMESH_subMesh_i::GetElementsByType( SMESH::ElementType theEle ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); + if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() ) + aSubMeshDS = 0; // PAL5440, return all nodes belonging to elements of submesh set nodeIds;