+ if ( proxyMesh && proxyMesh->GetProxySubMesh( geomFace ))
+ {
+ // if a proxy sub-mesh contains temporary faces, then these faces
+ // should be used to mesh only one SOLID
+ bool hasTmp = false;
+ smDS = proxyMesh->GetSubMesh( geomFace );
+ SMDS_ElemIteratorPtr faces = smDS->GetElements();
+ while ( faces->more() )
+ {
+ const SMDS_MeshElement* f = faces->next();
+ if ( proxyMesh->IsTemporary( f ))
+ {
+ hasTmp = true;
+ std::vector<const SMDS_MeshNode*> fNodes( f->begin_nodes(), f->end_nodes() );
+ std::vector<const SMDS_MeshElement*> vols;
+ if ( _mesh->GetMeshDS()->GetElementsByNodes( fNodes, vols, SMDSAbs_Volume ) == 1 )
+ {
+ int geomID = vols[0]->getshapeId();
+ const TopoDS_Shape& solid = helper.GetMeshDS()->IndexToShape( geomID );
+ if ( !solid.IsNull() )
+ solidID1 = occgeom.somap.FindIndex ( solid );
+ solidID2 = 0;
+ break;
+ }
+ }
+ }
+ // exclude faces generated by NETGEN from computation of 3D mesh
+ const int fID = occgeom.fmap.FindIndex( geomFace );
+ if ( !hasTmp ) // shrunk mesh
+ {
+ // move netgen points according to moved nodes
+ SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator(/*includeSelf=*/true);
+ while ( smIt->more() )
+ {
+ SMESH_subMesh* sub = smIt->next();
+ if ( !sub->GetSubMeshDS() ) continue;
+ SMDS_NodeIteratorPtr nodeIt = sub->GetSubMeshDS()->GetNodes();
+ while ( nodeIt->more() )
+ {
+ const SMDS_MeshNode* n = nodeIt->next();
+ int ngID = ngNodeId( n, ngMesh, nodeNgIdMap );
+ netgen::MeshPoint& ngPoint = ngMesh.Point( ngID );
+ ngPoint(0) = n->X();
+ ngPoint(1) = n->Y();
+ ngPoint(2) = n->Z();
+ }
+ }
+ // remove faces near boundary to avoid their overlapping
+ // with shrunk faces
+ for ( int i = 1; i <= ngMesh.GetNSE(); ++i )
+ {
+ const netgen::Element2d& elem = ngMesh.SurfaceElement(i);
+ if ( elem.GetIndex() == fID )
+ {
+ for ( int iN = 0; iN < elem.GetNP(); ++iN )
+ if ( ngMesh[ elem[ iN ]].Type() != netgen::SURFACEPOINT )
+ {
+ ngMesh.DeleteSurfaceElement( i );
+ break;
+ }
+ }
+ }
+ }
+ //if ( hasTmp )
+ {
+ faceNgID++;
+ ngMesh.AddFaceDescriptor( netgen::FaceDescriptor( faceNgID,/*solid1=*/0,/*solid2=*/0,0 ));
+ for (int i = 1; i <= ngMesh.GetNSE(); ++i )
+ {
+ const netgen::Element2d& elem = ngMesh.SurfaceElement(i);
+ if ( elem.GetIndex() == fID )
+ const_cast< netgen::Element2d& >( elem ).SetIndex( faceNgID );
+ }
+ }
+ }