- TopExp_Explorer exp( aSh, subType );
- for (; exp.More() && myCreateQuadratic; exp.Next()) {
- if ( SMESHDS_SubMesh * subMesh = meshDS->MeshElements( exp.Current() )) {
- if ( SMDS_ElemIteratorPtr it = subMesh->GetElements() ) {
- while(it->more()) {
- const SMDS_MeshElement* e = it->next();
- if ( e->GetType() != elemType || !e->IsQuadratic() ) {
- myCreateQuadratic = false;
- 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:
+ if ( !myMesh->HasShapeToMesh() )
+ {
+ if (( myCreateQuadratic = myMesh->NbFaces( ORDER_QUADRATIC )))
+ {
+ SMDS_FaceIteratorPtr fIt = meshDS->facesIterator();
+ while ( fIt->more() )
+ AddTLinks( static_cast< const SMDS_MeshFace* >( fIt->next() ));
+ }
+ }
+ else
+ {
+ TopExp_Explorer exp( aSh, subType );
+ TopTools_MapOfShape checkedSubShapes;
+ for (; exp.More() && myCreateQuadratic; exp.Next()) {
+ if ( !checkedSubShapes.Add( exp.Current() ))
+ continue; // needed if aSh is compound of solids
+ if ( SMESHDS_SubMesh * subMesh = meshDS->MeshElements( exp.Current() )) {
+ if ( SMDS_ElemIteratorPtr it = subMesh->GetElements() ) {
+ while(it->more()) {
+ const SMDS_MeshElement* e = it->next();
+ if ( e->GetType() != elemType || !e->IsQuadratic() ) {