IPAL52650: Convert to quadratic fails on an ellipsoid.

IPAL52659: Pattern file is not readable
IPAL18558: Wrong information of the created sub-mesh is shown.
This commit is contained in:
eap 2015-09-04 20:35:06 +03:00
parent 18e7b9c752
commit 44cfe3f661
3 changed files with 66 additions and 32 deletions

View File

@ -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 );

View File

@ -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<const SMDS_MeshElement*>::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;

View File

@ -35,8 +35,9 @@
#include "OpUtil.hxx"
#include "Utils_ExceptHandlers.hxx"
#include <TopoDS_Iterator.hxx>
#include <TopExp_Explorer.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopoDS_Iterator.hxx>
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() )
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<TopoDS_Shape> shapeList;
shapeList.push_back( aShape );
list<TopoDS_Shape>::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<SMESHDS_SubMesh*> 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<SMESHDS_SubMesh*> smSet( theSubMeshList.begin(), theSubMeshList.end() );
theSubMeshList.assign( smSet.begin(), smSet.end() );
break;
}
default: