+ const SMDS_MeshNode* nodes[] = { n1, n2, n3 };
+ for(int i = 0; i < 3; i++)
+ {
+ shape = GetSubShapeByNode( nodes[i], meshDS );
+ if ( shape.IsNull() ) break;
+ if ( shape.ShapeType() == TopAbs_SOLID )
+ {
+ solidID = nodes[i]->getshapeId();
+ shapeType = TopAbs_SOLID;
+ break;
+ }
+ if ( shape.ShapeType() == TopAbs_FACE )
+ {
+ faceID = nodes[i]->getshapeId();
+ itMapWithIdFace = faceId2nbNodes.insert( std::make_pair( faceID, 0 ) ).first;
+ itMapWithIdFace->second++;
+ }
+ else
+ {
+ PShapeIteratorPtr it = GetAncestors(shape, *GetMesh(), TopAbs_FACE );
+ while ( const TopoDS_Shape* face = it->next() )
+ {
+ faceID = meshDS->ShapeToIndex( *face );
+ itMapWithIdFace = faceId2nbNodes.insert( std::make_pair( faceID, 0 ) ).first;
+ itMapWithIdFace->second++;
+ }
+ }
+ }
+ }
+ if ( solidID < 1 && !faceId2nbNodes.empty() ) // SOLID not found
+ {
+ // find ID of the FACE the four corner nodes belong to
+ itMapWithIdFace = faceId2nbNodes.begin();
+ for ( ; itMapWithIdFace != faceId2nbNodes.end(); ++itMapWithIdFace)
+ {
+ if ( itMapWithIdFace->second == 3 )
+ {
+ shapeType = TopAbs_FACE;
+ faceID = (*itMapWithIdFace).first;
+ break;
+ }
+ }
+ }
+
+ TopoDS_Face F;
+ gp_XY uvAvg;
+ bool badTria=false;
+
+ if ( shapeType == TopAbs_FACE )
+ {
+ F = TopoDS::Face( meshDS->IndexToShape( faceID ));
+ bool check;
+ gp_XY uv1 = GetNodeUV( F, n1, n23, &check );
+ gp_XY uv2 = GetNodeUV( F, n2, n31, &check );
+ gp_XY uv3 = GetNodeUV( F, n3, n12, &check );
+ gp_XY uv12 = GetNodeUV( F, n12, n3, &check );
+ gp_XY uv23 = GetNodeUV( F, n23, n1, &check );
+ gp_XY uv31 = GetNodeUV( F, n31, n2, &check );
+ uvAvg = GetCenterUV( uv1,uv2,uv3, uv12,uv23,uv31, &badTria );
+ if ( badTria )
+ force3d = false;
+ }
+
+ // Create a central node
+
+ gp_Pnt P;
+ if ( !F.IsNull() && !force3d )
+ {
+ TopLoc_Location loc;
+ Handle( Geom_Surface ) S = BRep_Tool::Surface( F, loc );
+ P = S->Value( uvAvg.X(), uvAvg.Y() ).Transformed( loc );
+ centralNode = meshDS->AddNode( P.X(), P.Y(), P.Z() );
+ // if ( mySetElemOnShape ) node is not elem!
+ meshDS->SetNodeOnFace( centralNode, faceID, uvAvg.X(), uvAvg.Y() );
+ }
+ else // ( force3d || F.IsNull() )
+ {
+ P = ( SMESH_TNodeXYZ( n12 ) +
+ SMESH_TNodeXYZ( n23 ) +
+ SMESH_TNodeXYZ( n31 ) ) / 3;
+ centralNode = meshDS->AddNode( P.X(), P.Y(), P.Z() );
+
+ if ( !F.IsNull() ) // force3d