+ if ( isCommonLocalSize ) // compute common local size in ngMeshes[0]
+ {
+ //list< SMESH_subMesh* > meshedSM[4]; --> all sub-shapes are added to occgeoComm
+ aMesher.PrepareOCCgeometry( occgeoComm, aShape, aMesh );//, meshedSM );
+
+ // local size set at MESHCONST_ANALYSE step depends on
+ // minh, face_maxh, grading and curvaturesafety; find minh if not set by the user
+ if ( !_hypParameters || netgen::mparam.minh < DBL_MIN )
+ {
+ if ( !_hypParameters )
+ netgen::mparam.maxh = occgeoComm.GetBoundingBox().Diam() / 3.;
+ netgen::mparam.minh = aMesher.GetDefaultMinSize( aShape, netgen::mparam.maxh );
+ }
+ // set local size depending on curvature and NOT closeness of EDGEs
+ netgen::occparam.resthcloseedgeenable = false;
+ //netgen::occparam.resthcloseedgefac = 1.0 + netgen::mparam.grading;
+ occgeoComm.face_maxh = netgen::mparam.maxh;
+ netgen::OCCSetLocalMeshSize( occgeoComm, *ngMeshes[0] );
+ occgeoComm.emap.Clear();
+ occgeoComm.vmap.Clear();
+
+ // set local size according to size of existing segments
+ const double factor = netgen::occparam.resthcloseedgefac;
+ TopTools_IndexedMapOfShape edgeMap;
+ TopExp::MapShapes( aMesh.GetShapeToMesh(), TopAbs_EDGE, edgeMap );
+ for ( int iE = 1; iE <= edgeMap.Extent(); ++iE )
+ {
+ const TopoDS_Shape& edge = edgeMap( iE );
+ if ( SMESH_Algo::isDegenerated( TopoDS::Edge( edge ))/* ||
+ helper.IsSubShape( edge, aShape )*/)
+ continue;
+ SMESHDS_SubMesh* smDS = meshDS->MeshElements( edge );
+ if ( !smDS ) continue;
+ SMDS_ElemIteratorPtr segIt = smDS->GetElements();
+ while ( segIt->more() )
+ {
+ const SMDS_MeshElement* seg = segIt->next();
+ SMESH_TNodeXYZ n1 = seg->GetNode(0);
+ SMESH_TNodeXYZ n2 = seg->GetNode(1);
+ gp_XYZ p = 0.5 * ( n1 + n2 );
+ netgen::Point3d pi(p.X(), p.Y(), p.Z());
+ ngMeshes[0]->RestrictLocalH( pi, factor * ( n1 - n2 ).Modulus() );
+ }
+ }
+ }
+ netgen::mparam.uselocalh = toOptimize; // restore as it is used at surface optimization