csg2d - no bc in vertex, handle maxh

This commit is contained in:
Matthias Hochsteger 2020-08-25 10:29:38 +02:00
parent 671566ef31
commit b14178b352
3 changed files with 49 additions and 20 deletions

View File

@ -98,7 +98,8 @@ Vertex * Vertex :: Insert(Point<2> p, double lam)
current = current->next; current = current->next;
auto pre = current->prev; auto pre = current->prev;
vnew->bc = pre->bc; if(lam > -1.0)
vnew->info = pre->info;
pre->next = vnew.get(); pre->next = vnew.get();
vnew->prev = pre; vnew->prev = pre;
@ -1148,7 +1149,7 @@ void CreateResult(Solid2d & sp, Solid2d & sr, bool UNION)
auto & vnew = R.AppendVertex(*V); auto & vnew = R.AppendVertex(*V);
if ((status == EXIT) ^ UNION) if ((status == EXIT) ^ UNION)
{ {
vnew.bc = V->bc; vnew.info = V->info;
if(V->spline) if(V->spline)
vnew.spline = *V->spline; vnew.spline = *V->spline;
else else
@ -1166,7 +1167,7 @@ void CreateResult(Solid2d & sp, Solid2d & sr, bool UNION)
} }
else else
vnew.spline = nullopt; vnew.spline = nullopt;
vnew.bc = V->bc; vnew.info = V->info;
V->is_intersection = false; // mark visited vertices V->is_intersection = false; // mark visited vertices
} }
if(V == I) if(V == I)
@ -1338,11 +1339,8 @@ Solid2d :: Solid2d(const Array<std::variant<Point<2>, EdgeInfo>> & points, strin
if(v->info.bc==BC_DEFAULT) if(v->info.bc==BC_DEFAULT)
v->info.bc = bc; v->info.bc = bc;
v->bc = v->info.bc;
if(v->info.control_point) if(v->info.control_point)
{
v->spline = Spline(*v, *v->info.control_point, *v->next); v->spline = Spline(*v, *v->info.control_point, *v->next);
}
} }
polys.Append(l); polys.Append(l);
@ -1472,6 +1470,7 @@ shared_ptr<netgen::SplineGeometry2d> CSG2d :: GenerateSplineGeometry()
int bc; int bc;
int p2; int p2;
double weight; double weight;
double maxh = 1e99;
}; };
auto geo = std::make_shared<netgen::SplineGeometry2d>(); auto geo = std::make_shared<netgen::SplineGeometry2d>();
@ -1575,11 +1574,13 @@ shared_ptr<netgen::SplineGeometry2d> CSG2d :: GenerateSplineGeometry()
ls.p2 = pi2; ls.p2 = pi2;
ls.weight = weight; ls.weight = weight;
if(bcmap.count(p0.bc)==0) if(bcmap.count(p0.info.bc)==0)
bcmap[p0.bc] = bcmap.size()+1; bcmap[p0.info.bc] = bcmap.size()+1;
if(ls.bc==0 || p0.bc != BC_DEFAULT) if(ls.bc==0 || p0.info.bc != BC_DEFAULT)
ls.bc = bcmap[p0.bc]; ls.bc = bcmap[p0.info.bc];
ls.maxh = min(ls.maxh, p0.info.maxh);
if(li!=ri) if(li!=ri)
{ {
@ -1619,7 +1620,7 @@ shared_ptr<netgen::SplineGeometry2d> CSG2d :: GenerateSplineGeometry()
seg->bc = ls.bc; seg->bc = ls.bc;
seg->reffak = 1; seg->reffak = 1;
seg->copyfrom = -1; seg->copyfrom = -1;
seg->hmax = 1e99; seg->hmax = ls.maxh;
geo->AppendSegment(seg); geo->AppendSegment(seg);
} }
return geo; return geo;

View File

@ -88,7 +88,7 @@ struct EdgeInfo
if(other.bc != BC_DEFAULT) if(other.bc != BC_DEFAULT)
bc = other.bc; bc = other.bc;
if(other.maxh != MAXH_DEFAULT) if(other.maxh != MAXH_DEFAULT)
maxh = other.maxh; maxh = min(maxh, other.maxh);
} }
}; };
@ -107,8 +107,6 @@ struct Vertex : Point<2>
IntersectionLabel label = NONE; // type of intersection vertex IntersectionLabel label = NONE; // type of intersection vertex
EntryExitLabel enex = NEITHER; // entry/exit "flag" EntryExitLabel enex = NEITHER; // entry/exit "flag"
string bc = "";
// 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;
@ -413,7 +411,7 @@ struct Loop
Vertex & AppendVertex(const Vertex & v) Vertex & AppendVertex(const Vertex & v)
{ {
auto & vnew = Append( static_cast<Point<2>>(v), true ); auto & vnew = Append( static_cast<Point<2>>(v), true );
vnew.bc = v.bc; vnew.info = v.info;
if(v.spline) if(v.spline)
vnew.spline = *v.spline; vnew.spline = *v.spline;
return vnew; return vnew;
@ -545,7 +543,7 @@ struct Loop
void SetBC(string bc) void SetBC(string bc)
{ {
for(auto v : Vertices(ALL)) for(auto v : Vertices(ALL))
v->bc = bc; v->info.bc = bc;
} }
size_t Size() const size_t Size() const
@ -617,6 +615,28 @@ struct Solid2d
{ {
return RotateRad( ang/180.*M_PI ); return RotateRad( ang/180.*M_PI );
} }
Solid2d & BC(string bc)
{
for(auto & p : polys)
for(auto v : p.Vertices(ALL))
v->info.bc = bc;
return *this;
}
Solid2d & Maxh(double maxh)
{
for(auto & p : polys)
for(auto v : p.Vertices(ALL))
v->info.maxh = maxh;
return *this;
}
Solid2d & Mat(string mat)
{
name = mat;
return *this;
}
}; };

View File

@ -400,10 +400,18 @@ 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>>, std::string, std::string>(), py::arg("points"), py::arg("mat")=MAT_DEFAULT, py::arg("bc")=BC_DEFAULT)
.def_readwrite("name", &Solid2d::name)
.def("__mul__", [](Solid2d & self, Solid2d & other) { return self*other; }) .def(py::self+py::self)
.def("__add__", [](Solid2d & self, Solid2d & other) { return self+other; }) .def(py::self-py::self)
.def("__sub__", [](Solid2d & self, Solid2d & other) { return self-other; }) .def(py::self*py::self)
.def(py::self+=py::self)
.def(py::self-=py::self)
.def(py::self*=py::self)
.def("Mat", &Solid2d::Mat)
.def("BC", &Solid2d::BC)
.def("Maxh", &Solid2d::Maxh)
.def("Copy", [](Solid2d & self) -> Solid2d { return self; }) .def("Copy", [](Solid2d & self) -> Solid2d { return self; })
.def("Move", &Solid2d::Move) .def("Move", &Solid2d::Move)
.def("Scale", &Solid2d::Scale) .def("Scale", &Solid2d::Scale)