From 44cfe3f661cf16b7253c2635368807ea332a4cc5 Mon Sep 17 00:00:00 2001 From: eap Date: Fri, 4 Sep 2015 20:35:06 +0300 Subject: [PATCH] IPAL52650: Convert to quadratic fails on an ellipsoid. IPAL52659: Pattern file is not readable IPAL18558: Wrong information of the created sub-mesh is shown. --- src/SMESH/SMESH_MesherHelper.cxx | 4 +- src/SMESH/SMESH_Pattern.cxx | 10 +--- src/SMESH_I/SMESH_subMesh_i.cxx | 84 +++++++++++++++++++++++--------- 3 files changed, 66 insertions(+), 32 deletions(-) diff --git a/src/SMESH/SMESH_MesherHelper.cxx b/src/SMESH/SMESH_MesherHelper.cxx index 8efefaf47..6ed52110d 100644 --- a/src/SMESH/SMESH_MesherHelper.cxx +++ b/src/SMESH/SMESH_MesherHelper.cxx @@ -1610,8 +1610,10 @@ const SMDS_MeshNode* SMESH_MesherHelper::GetMediumNode(const SMDS_MeshNode* n1, { F = TopoDS::Face(meshDS->IndexToShape( faceID = pos.first )); uv[0] = GetNodeUV(F,n1,n2, force3d ? 0 : &uvOK[0]); - if ( HasDegeneratedEdges() && !force3d ) // IPAL52850 (degen VERTEX not at singularity) + if (( !force3d ) && + ( HasDegeneratedEdges() || GetSurface( F )->HasSingularities( 1e-7 ))) { + // IPAL52850 (degen VERTEX not at singularity) // project middle point to a surface SMESH_TNodeXYZ p1( n1 ), p2( n2 ); gp_Pnt pMid = 0.5 * ( p1 + p2 ); diff --git a/src/SMESH/SMESH_Pattern.cxx b/src/SMESH/SMESH_Pattern.cxx index 5db170d7b..f92b56bf9 100644 --- a/src/SMESH/SMESH_Pattern.cxx +++ b/src/SMESH/SMESH_Pattern.cxx @@ -103,7 +103,7 @@ inline int getInt( const char * theSring ) int val = strtol( theSring, &ptr, 10 ); if ( ptr == theSring || // there must not be neither '.' nor ',' nor 'E' ... - (*ptr != ' ' && *ptr != '\n' && *ptr != '\0')) + (*ptr != ' ' && *ptr != '\n' && *ptr != '\0' && *ptr != '\r')) return -1; return val; @@ -3554,13 +3554,7 @@ void SMESH_Pattern:: myPolyElems.reserve( myIdsOnBoundary.size() ); // make a set of refined elements - TIDSortedElemSet avoidSet, elemSet; - std::vector::iterator itv = myElements.begin(); - for(; itv!=myElements.end(); itv++) { - const SMDS_MeshElement* el = (*itv); - avoidSet.insert( el ); - } - //avoidSet.insert( myElements.begin(), myElements.end() ); + TIDSortedElemSet elemSet, avoidSet( myElements.begin(), myElements.end() ); map< TNodeSet, list< list< int > > >::iterator indListIt, nn_IdList; diff --git a/src/SMESH_I/SMESH_subMesh_i.cxx b/src/SMESH_I/SMESH_subMesh_i.cxx index 2562e8543..02c2664f0 100644 --- a/src/SMESH_I/SMESH_subMesh_i.cxx +++ b/src/SMESH_I/SMESH_subMesh_i.cxx @@ -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: -- 2.30.2