mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-12-27 18:00:34 +05:00
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:
parent
18e7b9c752
commit
44cfe3f661
@ -1610,8 +1610,10 @@ const SMDS_MeshNode* SMESH_MesherHelper::GetMediumNode(const SMDS_MeshNode* n1,
|
|||||||
{
|
{
|
||||||
F = TopoDS::Face(meshDS->IndexToShape( faceID = pos.first ));
|
F = TopoDS::Face(meshDS->IndexToShape( faceID = pos.first ));
|
||||||
uv[0] = GetNodeUV(F,n1,n2, force3d ? 0 : &uvOK[0]);
|
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
|
// project middle point to a surface
|
||||||
SMESH_TNodeXYZ p1( n1 ), p2( n2 );
|
SMESH_TNodeXYZ p1( n1 ), p2( n2 );
|
||||||
gp_Pnt pMid = 0.5 * ( p1 + p2 );
|
gp_Pnt pMid = 0.5 * ( p1 + p2 );
|
||||||
|
@ -103,7 +103,7 @@ inline int getInt( const char * theSring )
|
|||||||
int val = strtol( theSring, &ptr, 10 );
|
int val = strtol( theSring, &ptr, 10 );
|
||||||
if ( ptr == theSring ||
|
if ( ptr == theSring ||
|
||||||
// there must not be neither '.' nor ',' nor 'E' ...
|
// there must not be neither '.' nor ',' nor 'E' ...
|
||||||
(*ptr != ' ' && *ptr != '\n' && *ptr != '\0'))
|
(*ptr != ' ' && *ptr != '\n' && *ptr != '\0' && *ptr != '\r'))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
@ -3554,13 +3554,7 @@ void SMESH_Pattern::
|
|||||||
myPolyElems.reserve( myIdsOnBoundary.size() );
|
myPolyElems.reserve( myIdsOnBoundary.size() );
|
||||||
|
|
||||||
// make a set of refined elements
|
// make a set of refined elements
|
||||||
TIDSortedElemSet avoidSet, elemSet;
|
TIDSortedElemSet elemSet, avoidSet( myElements.begin(), myElements.end() );
|
||||||
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() );
|
|
||||||
|
|
||||||
map< TNodeSet, list< list< int > > >::iterator indListIt, nn_IdList;
|
map< TNodeSet, list< list< int > > >::iterator indListIt, nn_IdList;
|
||||||
|
|
||||||
|
@ -35,8 +35,9 @@
|
|||||||
#include "OpUtil.hxx"
|
#include "OpUtil.hxx"
|
||||||
#include "Utils_ExceptHandlers.hxx"
|
#include "Utils_ExceptHandlers.hxx"
|
||||||
|
|
||||||
#include <TopoDS_Iterator.hxx>
|
|
||||||
#include <TopExp_Explorer.hxx>
|
#include <TopExp_Explorer.hxx>
|
||||||
|
#include <TopTools_ListIteratorOfListOfShape.hxx>
|
||||||
|
#include <TopoDS_Iterator.hxx>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
@ -99,50 +100,87 @@ bool getSubMeshes(::SMESH_subMesh* theSubMesh,
|
|||||||
SMESH_Mesh* aMesh = theSubMesh->GetFather();
|
SMESH_Mesh* aMesh = theSubMesh->GetFather();
|
||||||
SMESHDS_Mesh* aMeshDS = aMesh->GetMeshDS();
|
SMESHDS_Mesh* aMeshDS = aMesh->GetMeshDS();
|
||||||
SMESHDS_SubMesh* aSubMeshDS = theSubMesh->GetSubMeshDS();
|
SMESHDS_SubMesh* aSubMeshDS = theSubMesh->GetSubMeshDS();
|
||||||
|
::SMESH_subMesh* sm;
|
||||||
|
|
||||||
// nodes can be bound to either vertex, edge, face or solid_or_shell
|
// nodes can be bound to either vertex, edge, face or solid_or_shell
|
||||||
TopoDS_Shape aShape = theSubMesh->GetSubShape();
|
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: {
|
// on father sub-meshes, check presence of an algo which will mesh this sub-mesh
|
||||||
// add submesh of solid itself
|
// even if no algo is assigned to this sub-mesh
|
||||||
aSubMeshDS = aMeshDS->MeshElements( aShape );
|
bool topAlgoPresent = false;
|
||||||
if ( aSubMeshDS )
|
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 );
|
theSubMeshList.push_back( aSubMeshDS );
|
||||||
|
|
||||||
// and of the first shell
|
// and of the first shell
|
||||||
TopExp_Explorer exp( aShape, TopAbs_SHELL );
|
TopExp_Explorer exp( aShape, TopAbs_SHELL );
|
||||||
if ( exp.More() ) {
|
if ( exp.More() )
|
||||||
aSubMeshDS = aMeshDS->MeshElements( exp.Current() );
|
if (( aSubMeshDS = aMeshDS->MeshElements( exp.Current() )))
|
||||||
if ( aSubMeshDS )
|
|
||||||
theSubMeshList.push_back( aSubMeshDS );
|
theSubMeshList.push_back( aSubMeshDS );
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TopAbs_WIRE:
|
case TopAbs_WIRE:
|
||||||
case TopAbs_COMPOUND:
|
case TopAbs_COMPOUND:
|
||||||
case TopAbs_COMPSOLID: {
|
case TopAbs_COMPSOLID:
|
||||||
|
{
|
||||||
// call getSubMeshes() for sub-shapes
|
// call getSubMeshes() for sub-shapes
|
||||||
list<TopoDS_Shape> shapeList;
|
list<TopoDS_Shape> shapeList;
|
||||||
shapeList.push_back( aShape );
|
shapeList.push_back( aShape );
|
||||||
list<TopoDS_Shape>::iterator sh = shapeList.begin();
|
list<TopoDS_Shape>::iterator sh = shapeList.begin();
|
||||||
for ( ; sh != shapeList.end(); ++sh ) {
|
for ( ; sh != shapeList.end(); ++sh ) {
|
||||||
for ( TopoDS_Iterator it( *sh ); it.More(); it.Next() ) {
|
for ( TopoDS_Iterator it( *sh ); it.More(); it.Next() ) {
|
||||||
if ( ::SMESH_subMesh* aSubMesh = aMesh->GetSubMeshContaining( it.Value() ))
|
if (( sm = aMesh->GetSubMeshContaining( it.Value() )))
|
||||||
getSubMeshes( aSubMesh, theSubMeshList ); // add found submesh or explore deeper
|
getSubMeshes( sm, theSubMeshList ); // add found sub-mesh or explore deeper
|
||||||
else
|
else
|
||||||
// no submesh for a compound inside compound
|
// no submesh for a compound inside compound
|
||||||
shapeList.push_back( it.Value() );
|
shapeList.push_back( it.Value() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// return only unique submeshes
|
// return only unique sub-meshes
|
||||||
set<SMESHDS_SubMesh*> smSet;
|
set<SMESHDS_SubMesh*> smSet( theSubMeshList.begin(), theSubMeshList.end() );
|
||||||
TListOfSubMeshes::iterator sm = theSubMeshList.begin();
|
theSubMeshList.assign( smSet.begin(), smSet.end() );
|
||||||
while ( sm != theSubMeshList.end() ) {
|
|
||||||
if ( !smSet.insert( *sm ).second )
|
|
||||||
sm = theSubMeshList.erase( sm );
|
|
||||||
else
|
|
||||||
++sm;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
Loading…
Reference in New Issue
Block a user