From c22ec2dcc2cbdf867f1446a1c542877412dd26fd Mon Sep 17 00:00:00 2001 From: Christopher Lackner Date: Mon, 29 Jul 2019 07:11:57 +0200 Subject: [PATCH] meshingparameters from python as in gui --- libsrc/csg/python_csg.cpp | 9 ++++++--- libsrc/geom2d/python_geom2d.cpp | 14 +++++++++----- libsrc/meshing/python_mesh.cpp | 17 +++++++++++------ libsrc/meshing/python_mesh.hpp | 4 +--- libsrc/occ/python_occ.cpp | 8 +++++--- libsrc/stlgeom/python_stl.cpp | 8 +++++--- python/csg.py | 1 + python/geom2d.py | 1 + python/meshing.py | 21 +++++++++++++++++++++ python/occ.py | 1 + python/stl.py | 1 + 11 files changed, 62 insertions(+), 23 deletions(-) diff --git a/libsrc/csg/python_csg.cpp b/libsrc/csg/python_csg.cpp index 2a2ca033..7319d8e7 100644 --- a/libsrc/csg/python_csg.cpp +++ b/libsrc/csg/python_csg.cpp @@ -694,12 +694,14 @@ However, when r = 0, the top part becomes a point(tip) and meshing fails! res["max"] = MoveToNumpy(max); return res; }, py::call_guard()) - .def("GenerateMesh", [](shared_ptr geo, py::kwargs kwargs) + .def("GenerateMesh", [](shared_ptr geo, + MeshingParameters* pars, py::kwargs kwargs) { MeshingParameters mp; + if(pars) mp = *pars; { py::gil_scoped_acquire aq; - mp = CreateMPfromKwargs(kwargs); + CreateMPfromKwargs(mp, kwargs); } auto mesh = make_shared(); SetGlobalMesh (mesh); @@ -708,7 +710,8 @@ However, when r = 0, the top part becomes a point(tip) and meshing fails! geo->FindIdenticSurfaces(1e-8 * geo->MaxSize()); geo->GenerateMesh (mesh, mp); return mesh; - }, meshingparameter_description.c_str(), + }, py::arg("mp") = nullptr, + meshingparameter_description.c_str(), py::call_guard()) ; diff --git a/libsrc/geom2d/python_geom2d.cpp b/libsrc/geom2d/python_geom2d.cpp index 49e8ae9b..f0e56598 100644 --- a/libsrc/geom2d/python_geom2d.cpp +++ b/libsrc/geom2d/python_geom2d.cpp @@ -363,12 +363,15 @@ DLL_HEADER void ExportGeom2d(py::module &m) //cout << i << " : " << self.splines[i]->GetPoint(0.1) << " , " << self.splines[i]->GetPoint(0.5) << endl; } })) - .def("GenerateMesh", [](shared_ptr self, py::kwargs kwargs) + // If we change to c++17 this can become optional + .def("GenerateMesh", [](shared_ptr self, + MeshingParameters* pars, py::kwargs kwargs) { MeshingParameters mp; + if(pars) mp = *pars; { py::gil_scoped_acquire aq; - mp = CreateMPfromKwargs(kwargs); + CreateMPfromKwargs(mp, kwargs); } auto mesh = make_shared(); mesh->SetGeometry(self); @@ -376,9 +379,10 @@ DLL_HEADER void ExportGeom2d(py::module &m) ng_geometry = self; self->GenerateMesh(mesh, mp); return mesh; - }, py::call_guard(), - meshingparameter_description.c_str()) - ; + }, py::arg("mp") = nullptr, + py::call_guard(), + meshingparameter_description.c_str()) + ; } diff --git a/libsrc/meshing/python_mesh.cpp b/libsrc/meshing/python_mesh.cpp index 2c42d537..598ca9a3 100644 --- a/libsrc/meshing/python_mesh.cpp +++ b/libsrc/meshing/python_mesh.cpp @@ -857,12 +857,14 @@ DLL_HEADER void ExportNetgenMeshing(py::module &m) self.SetMaxHDomain(maxh); }) .def ("GenerateVolumeMesh", - [](Mesh & self, py::kwargs kwargs) + [](Mesh & self, MeshingParameters* pars, + py::kwargs kwargs) { MeshingParameters mp; + if(pars) mp = *pars; { py::gil_scoped_acquire acquire; - mp = CreateMPfromKwargs(kwargs); + CreateMPfromKwargs(mp, kwargs); } MeshVolume (mp, self); OptimizeVolume (mp, self); @@ -1024,12 +1026,15 @@ DLL_HEADER void ExportNetgenMeshing(py::module &m) .def(py::init<>()) .def(py::init([](py::kwargs kwargs) { - return CreateMPfromKwargs(kwargs); + MeshingParameters mp; + CreateMPfromKwargs(mp, kwargs); + return mp; }), meshingparameter_description.c_str()) .def("__str__", &ToString) - .def_property("maxh", - FunctionPointer ([](const MP & mp ) { return mp.maxh; }), - FunctionPointer ([](MP & mp, double maxh) { return mp.maxh = maxh; })) + .def_property("maxh", [](const MP & mp ) { return mp.maxh; }, + [](MP & mp, double maxh) { return mp.maxh = maxh; }) + .def_property("grading", [](const MP & mp ) { return mp.grading; }, + [](MP & mp, double grading) { return mp.grading = grading; }) .def("RestrictH", FunctionPointer ([](MP & mp, double x, double y, double z, double h) { diff --git a/libsrc/meshing/python_mesh.hpp b/libsrc/meshing/python_mesh.hpp index 98762684..bbe75a97 100644 --- a/libsrc/meshing/python_mesh.hpp +++ b/libsrc/meshing/python_mesh.hpp @@ -80,9 +80,8 @@ elsizeweight: float = 0.2 )delimiter"; - inline MeshingParameters CreateMPfromKwargs(py::kwargs kwargs) + inline void CreateMPfromKwargs(MeshingParameters& mp, py::kwargs kwargs) { - MeshingParameters mp; if(kwargs.contains("optimize3d")) mp.optimize3d = py::cast(kwargs["optimize3d"]); if(kwargs.contains("optsteps3d")) @@ -165,6 +164,5 @@ elsizeweight: float = 0.2 mp.inverttrigs = py::cast(kwargs["inverttrigs"]); if(kwargs.contains("autozrefine")) mp.autozrefine = py::cast(kwargs["autozrefine"]); - return mp; } } // namespace netgen diff --git a/libsrc/occ/python_occ.cpp b/libsrc/occ/python_occ.cpp index 971c7730..311fd78c 100644 --- a/libsrc/occ/python_occ.cpp +++ b/libsrc/occ/python_occ.cpp @@ -124,12 +124,14 @@ DLL_HEADER void ExportNgOCC(py::module &m) res["max"] = MoveToNumpy(max); return res; }, py::call_guard()) - .def("GenerateMesh", [](shared_ptr geo, py::kwargs kwargs) + .def("GenerateMesh", [](shared_ptr geo, + MeshingParameters* pars, py::kwargs kwargs) { MeshingParameters mp; + if(pars) mp = *pars; { py::gil_scoped_acquire aq; - mp = CreateMPfromKwargs(kwargs); + CreateMPfromKwargs(mp, kwargs); } auto mesh = make_shared(); SetGlobalMesh(mesh); @@ -137,7 +139,7 @@ DLL_HEADER void ExportNgOCC(py::module &m) ng_geometry = geo; geo->GenerateMesh(mesh,mp); return mesh; - }, + }, py::arg("mp") = nullptr, py::call_guard(), meshingparameter_description.c_str()) ; diff --git a/libsrc/stlgeom/python_stl.cpp b/libsrc/stlgeom/python_stl.cpp index 113f6ef6..39a52273 100644 --- a/libsrc/stlgeom/python_stl.cpp +++ b/libsrc/stlgeom/python_stl.cpp @@ -78,12 +78,14 @@ DLL_HEADER void ExportSTL(py::module & m) res["max"] = MoveToNumpy(max); return res; }, py::call_guard()) - .def("GenerateMesh", [] (shared_ptr geo, py::kwargs kwargs) + .def("GenerateMesh", [] (shared_ptr geo, + MeshingParameters* pars, py::kwargs kwargs) { MeshingParameters mp; + if(pars) mp = *pars; { py::gil_scoped_acquire aq; - mp = CreateMPfromKwargs(kwargs); + CreateMPfromKwargs(mp, kwargs); } auto mesh = make_shared(); SetGlobalMesh(mesh); @@ -91,7 +93,7 @@ DLL_HEADER void ExportSTL(py::module & m) ng_geometry = geo; geo->GenerateMesh(mesh,mp); return mesh; - }, + }, py::arg("mp") = nullptr, py::call_guard(), meshingparameter_description.c_str()) ; diff --git a/python/csg.py b/python/csg.py index b53201d7..f6b37f1c 100644 --- a/python/csg.py +++ b/python/csg.py @@ -1,5 +1,6 @@ from .libngpy._csg import * from .libngpy._meshing import Pnt, Vec, Trafo +from .meshing import meshsize try: from . import csgvis diff --git a/python/geom2d.py b/python/geom2d.py index e5ade0be..8af508b1 100644 --- a/python/geom2d.py +++ b/python/geom2d.py @@ -1,4 +1,5 @@ from .libngpy._geom2d import SplineGeometry +from .meshing import meshsize unit_square = SplineGeometry() _pnts = [ (0,0), (1,0), (1,1), (0,1) ] diff --git a/python/meshing.py b/python/meshing.py index 7312d686..5fbebdf4 100644 --- a/python/meshing.py +++ b/python/meshing.py @@ -1 +1,22 @@ from .libngpy._meshing import * + +class _MeshsizeObject: + pass + +meshsize = _MeshsizeObject() + +meshsize.very_coarse = MeshingParameters(curvaturesafety=1, + segmentsperedge=0.3, + grading=0.7) +meshsize.coarse = MeshingParameters(curvaturesafety=1.5, + segmentsperedge=0.5, + grading=0.5) +meshsize.moderate = MeshingParameters(curvaturesafety=2, + segmentsperedge=1, + grading=0.3) +meshsize.fine = MeshingParameters(curvaturesafety=3, + segmentsperedge=2, + grading=0.2) +meshsize.very_fine = MeshingParameters(curvaturesafety=5, + segmentsperedge=3, + grading=0.1) diff --git a/python/occ.py b/python/occ.py index f4764182..f10a8611 100644 --- a/python/occ.py +++ b/python/occ.py @@ -1 +1,2 @@ from .libngpy._NgOCC import * +from .meshing import meshsize diff --git a/python/stl.py b/python/stl.py index 66304d1b..40f4421a 100644 --- a/python/stl.py +++ b/python/stl.py @@ -1 +1,2 @@ from netgen.libngpy._stl import * +from .meshing import meshsize