0021238: EDF 1817 SMESH: GHS3D on quadratic meshes

enhance IsQuadraticSubMesh() for the mesh w/o shape
This commit is contained in:
eap 2011-04-22 16:08:20 +00:00
parent 8aec90a5df
commit 3fb9c77ac1

View File

@ -123,35 +123,50 @@ bool SMESH_MesherHelper::IsQuadraticSubMesh(const TopoDS_Shape& aSh)
int nbOldLinks = myTLinkNodeMap.size(); int nbOldLinks = myTLinkNodeMap.size();
TopExp_Explorer exp( aSh, subType ); if ( !myMesh->HasShapeToMesh() )
for (; exp.More() && myCreateQuadratic; exp.Next()) { {
if ( SMESHDS_SubMesh * subMesh = meshDS->MeshElements( exp.Current() )) { if (( myCreateQuadratic = myMesh->NbFaces( ORDER_QUADRATIC )))
if ( SMDS_ElemIteratorPtr it = subMesh->GetElements() ) { {
while(it->more()) { SMDS_FaceIteratorPtr fIt = meshDS->facesIterator();
const SMDS_MeshElement* e = it->next(); while ( fIt->more() )
if ( e->GetType() != elemType || !e->IsQuadratic() ) { AddTLinks( static_cast< const SMDS_MeshFace* >( fIt->next() ));
myCreateQuadratic = false; }
break; }
} else
else { {
// fill TLinkNodeMap TopExp_Explorer exp( aSh, subType );
switch ( e->NbNodes() ) { TopTools_MapOfShape checkedSubShapes;
case 3: for (; exp.More() && myCreateQuadratic; exp.Next()) {
AddTLinkNode(e->GetNode(0),e->GetNode(1),e->GetNode(2)); break; if ( !checkedSubShapes.Add( exp.Current() ))
case 6: continue; // needed if aSh is compound of solids
AddTLinkNode(e->GetNode(0),e->GetNode(1),e->GetNode(3)); if ( SMESHDS_SubMesh * subMesh = meshDS->MeshElements( exp.Current() )) {
AddTLinkNode(e->GetNode(1),e->GetNode(2),e->GetNode(4)); if ( SMDS_ElemIteratorPtr it = subMesh->GetElements() ) {
AddTLinkNode(e->GetNode(2),e->GetNode(0),e->GetNode(5)); break; while(it->more()) {
case 8: const SMDS_MeshElement* e = it->next();
AddTLinkNode(e->GetNode(0),e->GetNode(1),e->GetNode(4)); if ( e->GetType() != elemType || !e->IsQuadratic() ) {
AddTLinkNode(e->GetNode(1),e->GetNode(2),e->GetNode(5));
AddTLinkNode(e->GetNode(2),e->GetNode(3),e->GetNode(6));
AddTLinkNode(e->GetNode(3),e->GetNode(0),e->GetNode(7));
break;
default:
myCreateQuadratic = false; myCreateQuadratic = false;
break; break;
} }
else {
// fill TLinkNodeMap
switch ( e->NbNodes() ) {
case 3:
AddTLinkNode(e->GetNode(0),e->GetNode(1),e->GetNode(2)); break;
case 6:
AddTLinkNode(e->GetNode(0),e->GetNode(1),e->GetNode(3));
AddTLinkNode(e->GetNode(1),e->GetNode(2),e->GetNode(4));
AddTLinkNode(e->GetNode(2),e->GetNode(0),e->GetNode(5)); break;
case 8:
AddTLinkNode(e->GetNode(0),e->GetNode(1),e->GetNode(4));
AddTLinkNode(e->GetNode(1),e->GetNode(2),e->GetNode(5));
AddTLinkNode(e->GetNode(2),e->GetNode(3),e->GetNode(6));
AddTLinkNode(e->GetNode(3),e->GetNode(0),e->GetNode(7));
break;
default:
myCreateQuadratic = false;
break;
}
}
} }
} }
} }
@ -334,19 +349,21 @@ void SMESH_MesherHelper::AddTLinks(const SMDS_MeshEdge* edge)
*/ */
//================================================================================ //================================================================================
void SMESH_MesherHelper::AddTLinks(const SMDS_MeshFace* face) void SMESH_MesherHelper::AddTLinks(const SMDS_MeshFace* f)
{ {
if ( face->IsQuadratic() ) if ( !f->IsPoly() )
{ switch ( f->NbNodes() ) {
const int nbLinks = face->NbCornerNodes(); case 6:
for ( int i = 0; i < nbLinks; ++i ) AddTLinkNode(f->GetNode(0),f->GetNode(1),f->GetNode(3));
{ AddTLinkNode(f->GetNode(1),f->GetNode(2),f->GetNode(4));
const SMDS_MeshNode* n1 = face->GetNode( i ); AddTLinkNode(f->GetNode(2),f->GetNode(0),f->GetNode(5)); break;
const SMDS_MeshNode* n2 = face->GetNode(( i + 1 ) % nbLinks ); case 8:
const SMDS_MeshNode* n12 = face->GetNode( i + nbLinks ); AddTLinkNode(f->GetNode(0),f->GetNode(1),f->GetNode(4));
AddTLinkNode( n1, n2, n12 ); AddTLinkNode(f->GetNode(1),f->GetNode(2),f->GetNode(5));
AddTLinkNode(f->GetNode(2),f->GetNode(3),f->GetNode(6));
AddTLinkNode(f->GetNode(3),f->GetNode(0),f->GetNode(7));
default:;
} }
}
} }
//================================================================================ //================================================================================