From 85fcc6843e0c182affad67ab904cc50a1c9362f2 Mon Sep 17 00:00:00 2001 From: Bryn Lloyd Date: Fri, 1 Mar 2019 16:40:28 +0100 Subject: [PATCH] expose stl meshing options (algorithm for auto-detecting feature edges) --- nglib/nglib.cpp | 94 +++++++++++++++++++++++++++++++++++++++++++++---- nglib/nglib.h | 57 +++++++++++++++++++++++++++--- 2 files changed, 139 insertions(+), 12 deletions(-) diff --git a/nglib/nglib.cpp b/nglib/nglib.cpp index e17fc2fb..df3447a0 100644 --- a/nglib/nglib.cpp +++ b/nglib/nglib.cpp @@ -392,7 +392,7 @@ namespace nglib et = NG_TET; break; // for the compiler } if (domain) - *domain = el.GetIndex(); + *domain = el.GetIndex(); return et; } @@ -490,7 +490,7 @@ namespace nglib seg[1] = pi2; seg.domin = domain_in; seg.domout = domain_out; - m->AddSegment(seg); + m->AddSegment(seg); } @@ -694,6 +694,16 @@ namespace nglib } + DLL_HEADER void Ng_STL_DeleteGeometry (Ng_STL_Geometry * geom) + { + if (geom) + { + STLGeometry* geometry = (STLGeometry*)geom; + geometry->Clear(); + delete geometry; + geometry = NULL; + } + } // after adding triangles (and edges) initialize @@ -724,7 +734,8 @@ namespace nglib // automatically generates edges: DLL_HEADER Ng_Result Ng_STL_MakeEdges (Ng_STL_Geometry * geom, Ng_Mesh* mesh, - Ng_Meshing_Parameters * mp) + Ng_Meshing_Parameters * mp, + Ng_STL_Parameters * stlp) { STLGeometry* stlgeometry = (STLGeometry*)geom; Mesh* me = (Mesh*)mesh; @@ -734,6 +745,7 @@ namespace nglib // object //MeshingParameters mparam; mp->Transfer_Parameters(); + if (stlp) stlp->Transfer_Parameters(); me -> SetGlobalH (mparam.maxh); me -> SetLocalH (stlgeometry->GetBoundingBox().PMin() - Vec3d(10, 10, 10), @@ -769,7 +781,8 @@ namespace nglib // generates mesh, empty mesh be already created. DLL_HEADER Ng_Result Ng_STL_GenerateSurfaceMesh (Ng_STL_Geometry * geom, Ng_Mesh* mesh, - Ng_Meshing_Parameters * mp) + Ng_Meshing_Parameters * mp, + Ng_STL_Parameters * stlp) { STLGeometry* stlgeometry = (STLGeometry*)geom; Mesh* me = (Mesh*)mesh; @@ -779,6 +792,7 @@ namespace nglib // object //MeshingParameters mparam; mp->Transfer_Parameters(); + if (stlp) stlp->Transfer_Parameters(); /* @@ -1135,6 +1149,72 @@ namespace nglib mparam.checkoverlap = check_overlap; mparam.checkoverlappingboundary = check_overlapping_boundary; } + + + + DLL_HEADER Ng_STL_Parameters :: Ng_STL_Parameters() + { + yangle = 30; + contyangle = 20; + + chartangle = 10; // original = 15 + outerchartangle = 80; // original = 70; + + usesearchtree = 0; + + atlasminh = 1.0; // original = 1E-4 + + resthatlasenable = 1; + resthatlasfac = 2; + + resthchartdistenable = 1; + resthchartdistfac = 0.3; // original = 1.2 + + resthedgeangleenable = 0; + resthedgeanglefac = 1; + + resthsurfmeshcurvenable = 1; + resthsurfmeshcurvfac = 1; + + resthlinelengthenable = 1; + resthlinelengthfac = 0.2; // original = 0.5 + + resthcloseedgefac = 1; + resthcloseedgeenable = 1; + } + + + + DLL_HEADER void Ng_STL_Parameters :: Transfer_Parameters() + { + stlparam.yangle = yangle; + stlparam.contyangle = contyangle; + + stlparam.chartangle = chartangle; + stlparam.outerchartangle = outerchartangle; + + stlparam.usesearchtree = usesearchtree; + + stlparam.atlasminh = atlasminh; + + stlparam.resthatlasenable = resthatlasenable; + stlparam.resthatlasfac = resthatlasfac; + + stlparam.resthchartdistenable = resthchartdistenable; + stlparam.resthchartdistfac = resthchartdistfac; + + stlparam.resthedgeangleenable = resthedgeangleenable; + stlparam.resthedgeanglefac = resthedgeanglefac; + + stlparam.resthsurfmeshcurvenable = resthsurfmeshcurvenable; + stlparam.resthsurfmeshcurvfac = resthsurfmeshcurvfac; + + stlparam.resthlinelengthenable = resthlinelengthenable; + stlparam.resthlinelengthfac = resthlinelengthfac; + + stlparam.resthcloseedgeenable = resthcloseedgeenable; + stlparam.resthcloseedgefac = resthcloseedgefac; + } // ------------------ End - Meshing Parameters related functions -------------------- @@ -1151,7 +1231,7 @@ namespace nglib DLL_HEADER void Ng_2D_Generate_SecondOrder(Ng_Geometry_2D * geom, - Ng_Mesh * mesh) + Ng_Mesh * mesh) { ( (SplineGeometry2d*)geom ) -> GetRefinement().MakeSecondOrder( * (Mesh*) mesh ); } @@ -1160,7 +1240,7 @@ namespace nglib DLL_HEADER void Ng_STL_Generate_SecondOrder(Ng_STL_Geometry * geom, - Ng_Mesh * mesh) + Ng_Mesh * mesh) { ((STLGeometry*)geom)->GetRefinement().MakeSecondOrder(*(Mesh*) mesh); } @@ -1169,7 +1249,7 @@ namespace nglib DLL_HEADER void Ng_CSG_Generate_SecondOrder (Ng_CSG_Geometry * geom, - Ng_Mesh * mesh) + Ng_Mesh * mesh) { ((CSGeometry*)geom)->GetRefinement().MakeSecondOrder(*(Mesh*) mesh); } diff --git a/nglib/nglib.h b/nglib/nglib.h index d87e305c..2c2b0544 100644 --- a/nglib/nglib.h +++ b/nglib/nglib.h @@ -23,8 +23,8 @@ // Philippose - 14.02.2009 // Modifications for creating a DLL in Windows -#ifdef WIN32 - #ifdef NGLIB_EXPORTS || nglib_EXPORTS +#if defined(WIN32) + #if defined(NGLIB_EXPORTS) || defined(nglib_EXPORTS) #define DLL_HEADER __declspec(dllexport) #else #define DLL_HEADER __declspec(dllimport) @@ -183,6 +183,49 @@ public: }; +class DLL_HEADER Ng_STL_Parameters +{ +public: + // Algorithm may be somewhat like Canny edge detector + // on mesh? + double yangle; // 30 + double contyangle; // 30 + + // I think this is used to split surface into patches/charts, + //which are flattened to use 2d meshing routines. + double chartangle; // 15 + double outerchartangle; // 70 + + int usesearchtree; // 0 + + double atlasminh; // 1e-4 + + // Factors which influence the local mesh size + // as a relation to some metric, e.g. curvature, + // line length, etc. + // TODO: document each of these properly + int resthatlasenable; // 1 + double resthatlasfac; // 2 + + int resthchartdistenable; // 1 + double resthchartdistfac; // 0.3 + + int resthedgeangleenable; // 0 + double resthedgeanglefac; // 1 + + int resthsurfmeshcurvenable; // 0 + double resthsurfmeshcurvfac; // 0.5 + + int resthlinelengthenable; // 1 + double resthlinelengthfac; // 0.5 + + int resthcloseedgeenable; // 1 + double resthcloseedgefac; // 1.0 + + Ng_STL_Parameters(); + + void Transfer_Parameters(); +}; // *** Functions Exported by this Library ************* @@ -620,7 +663,9 @@ DLL_HEADER Ng_STL_Geometry * Ng_STL_LoadGeometry (const char * filename, int bin // generate new STL Geometry DLL_HEADER Ng_STL_Geometry * Ng_STL_NewGeometry (); - + + +DLL_HEADER void Ng_STL_DeleteGeometry (Ng_STL_Geometry * geom); // fills STL Geometry // positive orientation @@ -639,13 +684,15 @@ DLL_HEADER Ng_Result Ng_STL_InitSTLGeometry (Ng_STL_Geometry * geom); // automatically generates edges: DLL_HEADER Ng_Result Ng_STL_MakeEdges (Ng_STL_Geometry * geom, Ng_Mesh* mesh, - Ng_Meshing_Parameters * mp); + Ng_Meshing_Parameters * mp, + Ng_STL_Parameters * stlp = nullptr); // generates mesh, empty mesh must be already created. DLL_HEADER Ng_Result Ng_STL_GenerateSurfaceMesh (Ng_STL_Geometry * geom, Ng_Mesh * mesh, - Ng_Meshing_Parameters * mp); + Ng_Meshing_Parameters * mp, + Ng_STL_Parameters * stlp = nullptr); #ifdef ACIS