add PointInfo for csg2d for maxh and name in points

This commit is contained in:
Christopher Lackner 2020-10-19 16:32:42 +02:00
parent ce3f3429d4
commit 39be1fd3c9
4 changed files with 45 additions and 10 deletions

View File

@ -1171,8 +1171,10 @@ next_P: ;
// add duplicate vertices to P and Q // add duplicate vertices to P and Q
auto V_P = I_P->Insert(*I_P, I_P->lam); auto V_P = I_P->Insert(*I_P, I_P->lam);
V_P->spline = I_P->spline; V_P->spline = I_P->spline;
V_P->pinfo = I_P->pinfo;
auto V_Q = I_Q->Insert(*I_Q, I_Q->lam); auto V_Q = I_Q->Insert(*I_Q, I_Q->lam);
V_Q->spline = I_Q->spline; V_Q->spline = I_Q->spline;
V_Q->pinfo = I_Q->pinfo;
// link vertices correctly // link vertices correctly
if (sP*sQ > 0) { // same local orientation if (sP*sQ > 0) { // same local orientation
@ -1580,7 +1582,7 @@ bool Loop :: IsInside( Point<2> r ) const
} }
Solid2d :: Solid2d(const Array<std::variant<Point<2>, EdgeInfo>> & points, string name_, string bc) Solid2d :: Solid2d(const Array<std::variant<Point<2>, EdgeInfo, PointInfo>> & points, string name_, string bc)
: name(name_) : name(name_)
{ {
Loop l; Loop l;
@ -1590,6 +1592,8 @@ Solid2d :: Solid2d(const Array<std::variant<Point<2>, EdgeInfo>> & points, strin
l.Append(*point, true); l.Append(*point, true);
if(auto edge_info = std::get_if<EdgeInfo>(&v)) if(auto edge_info = std::get_if<EdgeInfo>(&v))
l.first->prev->info.Assign( *edge_info ); l.first->prev->info.Assign( *edge_info );
if(auto point_info = std::get_if<PointInfo>(&v))
l.first->pinfo.Assign(*point_info);
} }
for(auto v : l.Vertices(ALL)) for(auto v : l.Vertices(ALL))
@ -1849,17 +1853,20 @@ shared_ptr<netgen::SplineGeometry2d> CSG2d :: GenerateSplineGeometry()
}; };
t_points.Start(); t_points.Start();
auto insertPoint = [&](Point<2> p ) auto insertPoint = [&](const Vertex& p )
{ {
int pi = getPoint(p); int pi = getPoint(p);
if(pi==-1) if(pi==-1)
{ {
// not found -> insert to tree // not found -> insert to tree
netgen::GeomPoint<2> gp(p); netgen::GeomPoint<2> gp(p);
gp.name = "default";
geo->geompoints.Append(gp); geo->geompoints.Append(gp);
pi = geo->geompoints.Size()-1;
ptree.Insert(p,p,geo->geompoints.Size()-1); ptree.Insert(p,p,geo->geompoints.Size()-1);
} }
geo->geompoints[pi].hmax = min2(geo->geompoints[pi].hmax, p.pinfo.maxh);
if(p.pinfo.name != POINT_NAME_DEFAULT)
geo->geompoints[pi].name = p.pinfo.name;
}; };
for(auto & s : solids) for(auto & s : solids)

View File

@ -65,6 +65,7 @@ enum IteratorType
}; };
inline constexpr const double MAXH_DEFAULT{1e99}; inline constexpr const double MAXH_DEFAULT{1e99};
inline const string POINT_NAME_DEFAULT{""};
inline const string BC_DEFAULT{""}; inline const string BC_DEFAULT{""};
inline const string MAT_DEFAULT{""}; inline const string MAT_DEFAULT{""};
@ -93,6 +94,24 @@ struct EdgeInfo
} }
}; };
struct PointInfo
{
double maxh = MAXH_DEFAULT;
string name = POINT_NAME_DEFAULT;
PointInfo() = default;
PointInfo(const PointInfo& other) = default;
PointInfo(double amaxh) : maxh(amaxh) {}
PointInfo(string aname) : name(aname) {}
PointInfo(double amaxh, string aname) : maxh(amaxh), name(aname) {}
void Assign(const PointInfo& other)
{
maxh = min(maxh, other.maxh);
if(other.name != POINT_NAME_DEFAULT)
name = other.name;
}
};
struct Vertex : Point<2> struct Vertex : Point<2>
{ {
Vertex (Point<2> p) : Point<2>(p) {} Vertex (Point<2> p) : Point<2>(p) {}
@ -100,6 +119,7 @@ struct Vertex : Point<2>
{ {
spline = v.spline; spline = v.spline;
info = v.info; info = v.info;
pinfo = v.pinfo;
is_source = true; is_source = true;
} }
@ -117,6 +137,7 @@ struct Vertex : Point<2>
// In case the edge this - next is curved, store the spline information here // In case the edge this - next is curved, store the spline information here
optional<Spline> spline = nullopt; optional<Spline> spline = nullopt;
EdgeInfo info; EdgeInfo info;
PointInfo pinfo;
DLL_HEADER Vertex * Insert(Point<2> p, double lam = -1.0); DLL_HEADER Vertex * Insert(Point<2> p, double lam = -1.0);
@ -455,6 +476,7 @@ struct Loop
{ {
auto & vnew = Append( static_cast<Point<2>>(v), true ); auto & vnew = Append( static_cast<Point<2>>(v), true );
vnew.info = v.info; vnew.info = v.info;
vnew.pinfo = v.pinfo;
if(v.spline) if(v.spline)
vnew.spline = *v.spline; vnew.spline = *v.spline;
if(bbox) if(bbox)
@ -628,7 +650,7 @@ struct Solid2d
Solid2d() = default; Solid2d() = default;
Solid2d(string name_) : name(name_) {} Solid2d(string name_) : name(name_) {}
DLL_HEADER Solid2d(const Array<std::variant<Point<2>, EdgeInfo>> & points, string name_=MAT_DEFAULT, string bc_=BC_DEFAULT); DLL_HEADER Solid2d(const Array<std::variant<Point<2>, EdgeInfo, PointInfo>> & points, string name_=MAT_DEFAULT, string bc_=BC_DEFAULT);
Solid2d(Solid2d && other) = default; Solid2d(Solid2d && other) = default;
Solid2d(const Solid2d & other) = default; Solid2d(const Solid2d & other) = default;

View File

@ -399,7 +399,7 @@ DLL_HEADER void ExportGeom2d(py::module &m)
py::class_<Solid2d>(m, "Solid2d") py::class_<Solid2d>(m, "Solid2d")
.def(py::init<>()) .def(py::init<>())
.def(py::init<Array<std::variant<Point<2>, EdgeInfo>>, std::string, std::string>(), py::arg("points"), py::arg("mat")=MAT_DEFAULT, py::arg("bc")=BC_DEFAULT) .def(py::init<Array<std::variant<Point<2>, EdgeInfo, PointInfo>>, std::string, std::string>(), py::arg("points"), py::arg("mat")=MAT_DEFAULT, py::arg("bc")=BC_DEFAULT)
.def(py::self+py::self) .def(py::self+py::self)
.def(py::self-py::self) .def(py::self-py::self)
@ -431,10 +431,10 @@ DLL_HEADER void ExportGeom2d(py::module &m)
{ {
using P = Point<2>; using P = Point<2>;
return { { return { {
p0, bottom ? *bottom : bc, p0, EdgeInfo{bottom ? *bottom : bc},
P{p1[0],p0[1]}, right ? *right : bc, P{p1[0],p0[1]}, EdgeInfo {right ? *right : bc},
p1, top ? *top : bc, p1, EdgeInfo {top ? *top : bc},
P{p0[0],p1[1]}, left ? *left : bc, P{p0[0],p1[1]}, EdgeInfo {left ? *left : bc},
}, mat}; }, mat};
}, },
"pmin"_a, "pmax"_a, "mat"_a=MAT_DEFAULT, "bc"_a=BC_DEFAULT, "pmin"_a, "pmax"_a, "mat"_a=MAT_DEFAULT, "bc"_a=BC_DEFAULT,
@ -475,6 +475,12 @@ DLL_HEADER void ExportGeom2d(py::module &m)
.def(py::init<string>(), py::arg("bc")) .def(py::init<string>(), py::arg("bc"))
.def(py::init<optional<Point<2>>, double, string>(), py::arg("control_point")=nullopt, py::arg("maxh")=MAXH_DEFAULT, py::arg("bc")=BC_DEFAULT) .def(py::init<optional<Point<2>>, double, string>(), py::arg("control_point")=nullopt, py::arg("maxh")=MAXH_DEFAULT, py::arg("bc")=BC_DEFAULT)
; ;
py::class_<PointInfo>(m, "PointInfo")
.def(py::init<>())
.def(py::init<double>(), "maxh"_a)
.def(py::init<string>(), "name"_a)
.def(py::init<double, string>(), "maxh"_a, "name"_a)
;
} }
PYBIND11_MODULE(libgeom2d, m) { PYBIND11_MODULE(libgeom2d, m) {

View File

@ -1,4 +1,4 @@
from .libngpy._geom2d import SplineGeometry, Solid2d, CSG2d, Rectangle, Circle, EdgeInfo from .libngpy._geom2d import SplineGeometry, Solid2d, CSG2d, Rectangle, Circle, EdgeInfo, PointInfo
from .meshing import meshsize from .meshing import meshsize
unit_square = SplineGeometry() unit_square = SplineGeometry()