2016-12-09 20:34:22 +05:00
|
|
|
|
|
|
|
#ifdef NG_PYTHON
|
|
|
|
|
|
|
|
#include <../general/ngpython.hpp>
|
2019-07-11 19:23:22 +05:00
|
|
|
#include <core/python_ngcore.hpp>
|
2016-12-09 20:34:22 +05:00
|
|
|
#include <stlgeom.hpp>
|
|
|
|
|
2016-12-12 18:22:24 +05:00
|
|
|
#ifdef WIN32
|
|
|
|
#define DLL_HEADER __declspec(dllexport)
|
|
|
|
#endif
|
|
|
|
|
2016-12-09 20:34:22 +05:00
|
|
|
using namespace netgen;
|
|
|
|
namespace netgen
|
|
|
|
{
|
2016-12-12 17:14:47 +05:00
|
|
|
//extern shared_ptr<Mesh> mesh;
|
2016-12-09 20:34:22 +05:00
|
|
|
extern shared_ptr<NetgenGeometry> ng_geometry;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DLL_HEADER void ExportSTL(py::module & m)
|
|
|
|
{
|
2018-04-17 22:37:29 +05:00
|
|
|
py::class_<STLGeometry,shared_ptr<STLGeometry>, NetgenGeometry> (m,"STLGeometry")
|
2016-12-09 20:34:22 +05:00
|
|
|
.def(py::init<>())
|
2018-12-20 21:01:27 +05:00
|
|
|
.def(NGSPickle<STLGeometry>())
|
2018-07-12 19:35:52 +05:00
|
|
|
.def("_visualizationData", [](shared_ptr<STLGeometry> stl_geo)
|
|
|
|
{
|
|
|
|
std::vector<float> vertices;
|
|
|
|
std::vector<int> trigs;
|
|
|
|
std::vector<float> normals;
|
|
|
|
std::vector<float> min = {std::numeric_limits<float>::max(),
|
|
|
|
std::numeric_limits<float>::max(),
|
|
|
|
std::numeric_limits<float>::max()};
|
|
|
|
std::vector<float> max = {std::numeric_limits<float>::lowest(),
|
|
|
|
std::numeric_limits<float>::lowest(),
|
|
|
|
std::numeric_limits<float>::lowest()};
|
|
|
|
std::vector<string> surfnames;
|
|
|
|
|
|
|
|
surfnames.push_back("stl");
|
|
|
|
vertices.reserve(stl_geo->GetNT()*3*3);
|
|
|
|
trigs.reserve(stl_geo->GetNT()*4);
|
|
|
|
normals.reserve(stl_geo->GetNT()*3*3);
|
|
|
|
size_t ii = 0;
|
|
|
|
for(int i = 0; i < stl_geo->GetNT(); i++)
|
|
|
|
{
|
|
|
|
auto& trig = stl_geo->GetTriangle(i+1);
|
|
|
|
for(int k = 0; k < 3; k++)
|
|
|
|
{
|
|
|
|
trigs.push_back(ii++);
|
|
|
|
auto& pnt = stl_geo->GetPoint(trig[k]);
|
|
|
|
for (int l = 0; l < 3; l++)
|
|
|
|
{
|
|
|
|
float val = pnt[l];
|
|
|
|
vertices.push_back(val);
|
|
|
|
min[l] = min2(min[l], val);
|
|
|
|
max[l] = max2(max[l], val);
|
|
|
|
normals.push_back(trig.Normal()[l]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
trigs.push_back(0);
|
|
|
|
}
|
|
|
|
py::gil_scoped_acquire ac;
|
|
|
|
py::dict res;
|
|
|
|
py::list snames;
|
|
|
|
for(auto name : surfnames)
|
|
|
|
snames.append(py::cast(name));
|
|
|
|
res["vertices"] = MoveToNumpy(vertices);
|
|
|
|
res["triangles"] = MoveToNumpy(trigs);
|
|
|
|
res["normals"] = MoveToNumpy(normals);
|
|
|
|
res["surfnames"] = snames;
|
|
|
|
res["min"] = MoveToNumpy(min);
|
|
|
|
res["max"] = MoveToNumpy(max);
|
|
|
|
return res;
|
|
|
|
}, py::call_guard<py::gil_scoped_release>())
|
2016-12-09 20:34:22 +05:00
|
|
|
;
|
2016-12-12 17:14:47 +05:00
|
|
|
m.def("LoadSTLGeometry", FunctionPointer([] (const string & filename)
|
|
|
|
{
|
|
|
|
ifstream ist(filename);
|
|
|
|
return shared_ptr<STLGeometry>(STLGeometry::Load(ist));
|
2018-03-13 02:38:21 +05:00
|
|
|
}),py::call_guard<py::gil_scoped_release>());
|
2016-12-09 20:34:22 +05:00
|
|
|
m.def("GenerateMesh", FunctionPointer([] (shared_ptr<STLGeometry> geo, MeshingParameters ¶m)
|
|
|
|
{
|
|
|
|
auto mesh = make_shared<Mesh>();
|
|
|
|
SetGlobalMesh(mesh);
|
|
|
|
mesh->SetGeometry(geo);
|
|
|
|
ng_geometry = geo;
|
|
|
|
try
|
|
|
|
{
|
|
|
|
geo->GenerateMesh(mesh,param);
|
|
|
|
}
|
|
|
|
catch (NgException ex)
|
|
|
|
{
|
|
|
|
cout << "Caught NgException: " << ex.What() << endl;
|
|
|
|
}
|
|
|
|
return mesh;
|
2018-03-13 02:38:21 +05:00
|
|
|
}),py::call_guard<py::gil_scoped_release>())
|
2016-12-09 20:34:22 +05:00
|
|
|
;
|
|
|
|
}
|
|
|
|
|
2017-09-01 12:33:57 +05:00
|
|
|
PYBIND11_MODULE(libstl, m) {
|
2016-12-09 20:34:22 +05:00
|
|
|
ExportSTL(m);
|
|
|
|
}
|
2016-12-12 17:14:47 +05:00
|
|
|
|
2016-12-09 20:34:22 +05:00
|
|
|
#endif
|