diff --git a/libsrc/geom2d/genmesh2d.cpp b/libsrc/geom2d/genmesh2d.cpp index 88bf3104..59405dc1 100644 --- a/libsrc/geom2d/genmesh2d.cpp +++ b/libsrc/geom2d/genmesh2d.cpp @@ -308,55 +308,50 @@ namespace netgen void SplineGeometry2d :: CopyEdgeMesh (int from, int to, Mesh & mesh, Point3dTree & searchtree) { - // const int D = 2; - - NgArray mappoints (mesh.GetNP()); - NgArray param (mesh.GetNP()); - mappoints = -1; + Array mappoints (mesh.GetNP()); + Array param (mesh.GetNP()); + mappoints = PointIndex::INVALID; param = 0; Point3d pmin, pmax; mesh.GetBox (pmin, pmax); double diam2 = Dist2(pmin, pmax); - if (printmessage_importance>0) - cout << "copy edge, from = " << from << " to " << to << endl; + PrintMessage(3, string("Copy edge, from ") + ToString(from) + " to " + ToString(to)); - for (int i = 1; i <= mesh.GetNSeg(); i++) + for (const auto& seg : mesh.LineSegments()) { - const Segment & seg = mesh.LineSegment(i); if (seg.edgenr == from) { - mappoints.Elem(seg[0]) = 1; - param.Elem(seg[0]) = seg.epgeominfo[0].dist; + mappoints[seg[0]] = 1; + param[seg[0]] = seg.epgeominfo[0].dist; - mappoints.Elem(seg[1]) = 1; - param.Elem(seg[1]) = seg.epgeominfo[1].dist; + mappoints[seg[1]] = 1; + param[seg[1]] = seg.epgeominfo[1].dist; } } bool mapped = false; - for (int i = 1; i <= mappoints.Size(); i++) + for (auto i : Range(mappoints)) { - if (mappoints.Get(i) != -1) + if (mappoints[i].IsValid()) { - Point<2> newp = splines.Get(to)->GetPoint (param.Get(i)); + Point<2> newp = splines.Get(to)->GetPoint (param[i]); Point<3> newp3 (newp(0), newp(1), 0); - int npi = -1; + PointIndex npi = PointIndex::INVALID; - for (PointIndex pi = PointIndex::BASE; - pi < mesh.GetNP()+PointIndex::BASE; pi++) + for (auto pi : Range(mesh.Points())) if (Dist2 (mesh.Point(pi), newp3) < 1e-12 * diam2) npi = pi; - if (npi == -1) + if (!npi.IsValid()) { npi = mesh.AddPoint (newp3); searchtree.Insert (newp3, npi); } - mappoints.Elem(i) = npi; + mappoints[i] = npi; mesh.GetIdentifications().Add (i, npi, to); mapped = true; @@ -375,15 +370,15 @@ namespace netgen Segment nseg; nseg.edgenr = to; nseg.si = GetSpline(to-1).bc; // splines.Get(to)->bc; - nseg[0] = mappoints.Get(seg[0]); - nseg[1] = mappoints.Get(seg[1]); + nseg[0] = mappoints[seg[0]]; + nseg[1] = mappoints[seg[1]]; nseg.domin = GetSpline(to-1).leftdom; nseg.domout = GetSpline(to-1).rightdom; nseg.epgeominfo[0].edgenr = to; - nseg.epgeominfo[0].dist = param.Get(seg[0]); + nseg.epgeominfo[0].dist = param[seg[0]]; nseg.epgeominfo[1].edgenr = to; - nseg.epgeominfo[1].dist = param.Get(seg[1]); + nseg.epgeominfo[1].dist = param[seg[1]]; mesh.AddSegment (nseg); } } diff --git a/libsrc/geom2d/python_geom2d.cpp b/libsrc/geom2d/python_geom2d.cpp index f0e56598..e2089d3e 100644 --- a/libsrc/geom2d/python_geom2d.cpp +++ b/libsrc/geom2d/python_geom2d.cpp @@ -62,33 +62,27 @@ DLL_HEADER void ExportGeom2d(py::module &m) }), py::arg("x"), py::arg("y"), py::arg("maxh") = 1e99, py::arg("hpref")=0, py::arg("name")="") .def("Append", FunctionPointer([](SplineGeometry2d &self, py::list segment, int leftdomain, int rightdomain, - py::object bc, py::object copy, double maxh, double hpref) + optional> bc, optional copy, double maxh, + double hpref) { - py::extract segtype(segment[0]); + auto segtype = py::cast(segment[0]); SplineSegExt * seg; - if (segtype().compare("line") == 0) + if (segtype == "line") { - py::extract point_index1(segment[1]); - py::extract point_index2(segment[2]); - //point_index1.check() - - LineSeg<2> * l = new LineSeg<2>(self.GetPoint(point_index1()), self.GetPoint(point_index2())); + LineSeg<2> * l = new LineSeg<2>(self.GetPoint(py::cast(segment[1])), + self.GetPoint(py::cast(segment[2]))); seg = new SplineSegExt(*l); } - else if (segtype().compare("spline3") == 0) + else if (segtype == "spline3") { - py::extract point_index1(segment[1]); - py::extract point_index2(segment[2]); - py::extract point_index3(segment[3]); - - SplineSeg3<2> * seg3 = new SplineSeg3<2>(self.GetPoint(point_index1()), self.GetPoint(point_index2()), self.GetPoint(point_index3())); + SplineSeg3<2> * seg3 = new SplineSeg3<2>(self.GetPoint(py::cast(segment[1])), + self.GetPoint(py::cast(segment[2])), + self.GetPoint(py::cast(segment[3]))); seg = new SplineSegExt(*seg3); } else - { - cout << "Appended segment is not a line or a spline3" << endl; - } + throw Exception("Appended segment is not a line or a spline3"); seg->leftdom = leftdomain; seg->rightdom = rightdomain; seg->hmax = maxh; @@ -96,23 +90,27 @@ DLL_HEADER void ExportGeom2d(py::module &m) seg->hpref_right = hpref; seg->reffak = 1; seg->copyfrom = -1; - if (py::extract(copy).check()) - seg->copyfrom = py::extract(copy)()+1; - - if (py::extract(bc).check()) - seg->bc = py::extract(bc)(); - else if (py::extract(bc).check()) + if (copy.has_value()) + seg->copyfrom = *copy+1; + + if (bc.has_value()) { - string bcname = py::extract(bc)(); - seg->bc = self.GetNSplines()+1; - self.SetBCName(seg->bc, bcname); + if(auto intptr = get_if(&*bc); intptr) + seg->bc = *intptr; + else + { + auto bcname = get_if(&*bc); + seg->bc = self.GetNSplines() + 1; + self.SetBCName(seg->bc, *bcname); + } } else seg->bc = self.GetNSplines()+1; self.AppendSegment(seg); return self.GetNSplines()-1; }), py::arg("point_indices"), py::arg("leftdomain") = 1, py::arg("rightdomain") = py::int_(0), - py::arg("bc")=NGDummyArgument(), py::arg("copy")=NGDummyArgument(), py::arg("maxh")=1e99, py::arg("hpref")=0) + py::arg("bc")=nullopt, py::arg("copy")=nullopt, py::arg("maxh")=1e99, + py::arg("hpref")=0) .def("AppendSegment", FunctionPointer([](SplineGeometry2d &self, py::list point_indices, int leftdomain, int rightdomain) @@ -132,6 +130,8 @@ DLL_HEADER void ExportGeom2d(py::module &m) seg = new SplineSegExt(*seg3); } + else + throw Exception("Can only append segments with 2 or 3 points!"); seg->leftdom = leftdomain; seg->rightdom = rightdomain; seg->hmax = 1e99;