[occ] allow giving explicit edge partition

This commit is contained in:
Christopher Lackner 2024-03-27 14:55:29 +01:00
parent a4b2b46c0e
commit bfcd77ff9c
3 changed files with 30 additions and 1 deletions

View File

@ -476,6 +476,20 @@ namespace netgen
static Timer tdivide("Divide Edges"); static Timer tdivide("Divide Edges");
RegionTimer rt(tdivide); RegionTimer rt(tdivide);
// -------------------- DivideEdge ----------------- // -------------------- DivideEdge -----------------
if(properties.partition)
{
points.SetSize(properties.partition->Size());
params.SetSize(properties.partition->Size()+2);
params[0] = 0.0;
params.Last() = 1.0;
for(auto i : Range(properties.partition->Size()))
{
params[i+1] = (*properties.partition)[i];
points[i] = GetPoint(params[i+1]);
}
return;
}
tdivedgesections.Start(); tdivedgesections.Start();
auto layer = properties.layer; auto layer = properties.layer;
double safety = 0.5*(1.-mparam.grading); double safety = 0.5*(1.-mparam.grading);

View File

@ -27,10 +27,12 @@ namespace netgen
double hpref = 0; // number of hp refinement levels (will be multiplied by factor later) double hpref = 0; // number of hp refinement levels (will be multiplied by factor later)
int layer = 1; int layer = 1;
optional<bool> quad_dominated; optional<bool> quad_dominated;
optional<Array<double>> partition;
void Merge(const ShapeProperties & prop2) void Merge(const ShapeProperties & prop2)
{ {
if (!name && prop2.name) name = prop2.name; if (!name && prop2.name) name = prop2.name;
if (!col && prop2.col) col = prop2.col; if (!col && prop2.col) col = prop2.col;
if (!partition && prop2.partition) partition = prop2.partition;
maxh = min2(maxh, prop2.maxh); maxh = min2(maxh, prop2.maxh);
hpref = max2(hpref, prop2.hpref); hpref = max2(hpref, prop2.hpref);
if(!quad_dominated.has_value()) quad_dominated = prop2.quad_dominated; if(!quad_dominated.has_value()) quad_dominated = prop2.quad_dominated;

View File

@ -1398,7 +1398,20 @@ DLL_HEADER void ExportNgOCCShapes(py::module &m)
return tuple(s0, s1); return tuple(s0, s1);
}, },
"parameter interval of curve") "parameter interval of curve")
.def_property("partition",
[](TopoDS_Shape & self) -> optional<Array<double>>
{
if (OCCGeometry::HaveProperties(self))
return OCCGeometry::GetProperties(self).partition;
return nullopt;
},
[](TopoDS_Shape &self, py::array_t<double> val)
{
Array<double> partition(val.size());
for(auto i : Range(partition))
partition[i] = val.at(i);
OCCGeometry::GetProperties(self).partition = std::move(partition);
})
.def("Split", [](const TopoDS_Edge& self, py::args args) .def("Split", [](const TopoDS_Edge& self, py::args args)
{ {