mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-17 01:55:54 +08:00
Pillar creation restored but only in branchingtree
This commit is contained in:
parent
a20cf5521d
commit
f028bfe680
@ -26,7 +26,10 @@ class BranchingTreeBuilder: public branchingtree::Builder {
|
|||||||
rtree<PointIndexEl, boost::geometry::index::rstar<16, 4> /* ? */>
|
rtree<PointIndexEl, boost::geometry::index::rstar<16, 4> /* ? */>
|
||||||
m_pillar_index;
|
m_pillar_index;
|
||||||
|
|
||||||
std::vector<branchingtree::Node> m_pillars;
|
std::vector<branchingtree::Node> m_pillars; // to put an index over them
|
||||||
|
|
||||||
|
// cache succesfull ground connections
|
||||||
|
std::map<size_t, GroundConnection> m_gnd_connections;
|
||||||
|
|
||||||
// Scaling of the input value 'widening_factor:<0, 1>' to produce resonable
|
// Scaling of the input value 'widening_factor:<0, 1>' to produce resonable
|
||||||
// widening behaviour
|
// widening behaviour
|
||||||
@ -182,6 +185,13 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool is_valid() const override { return !m_builder.ctl().stopcondition(); }
|
bool is_valid() const override { return !m_builder.ctl().stopcondition(); }
|
||||||
|
|
||||||
|
|
||||||
|
void group_pillars()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
bool BranchingTreeBuilder::add_bridge(const branchingtree::Node &from,
|
bool BranchingTreeBuilder::add_bridge(const branchingtree::Node &from,
|
||||||
@ -251,31 +261,15 @@ bool BranchingTreeBuilder::add_ground_bridge(const branchingtree::Node &from,
|
|||||||
get_radius(to));
|
get_radius(to));
|
||||||
|
|
||||||
if (conn) {
|
if (conn) {
|
||||||
build_ground_connection(m_builder, m_sm, conn);
|
// build_ground_connection(m_builder, m_sm, conn);
|
||||||
Junction connlast = conn.path.back();
|
Junction connlast = conn.path.back();
|
||||||
branchingtree::Node n{connlast.pos.cast<float>(), float(connlast.r)};
|
branchingtree::Node n{connlast.pos.cast<float>(), float(connlast.r)};
|
||||||
n.left = from.id;
|
n.left = from.id;
|
||||||
m_pillars.emplace_back(n);
|
m_pillars.emplace_back(n);
|
||||||
m_pillar_index.insert({n.pos, m_pillars.size() - 1});
|
m_pillar_index.insert({n.pos, m_pillars.size() - 1});
|
||||||
|
m_gnd_connections[m_pillars.size() - 1] = conn;
|
||||||
|
|
||||||
ret = true;
|
ret = true;
|
||||||
|
|
||||||
// Vec3d endp = cjunc? cjunc->pos : j.pos;
|
|
||||||
// double R = cjunc? cjunc->r : j.r;
|
|
||||||
// Vec3d dir = cjunc? Vec3d((j.pos - cjunc->pos).normalized()) : DOWN;
|
|
||||||
// auto plr = create_ground_pillar(ex_tbb, m_builder, m_sm, endp, dir, R, get_radius(to));
|
|
||||||
|
|
||||||
// if (plr.second >= 0) {
|
|
||||||
// m_builder.add_junction(endp, R);
|
|
||||||
// if (cjunc) {
|
|
||||||
// m_builder.add_diffbridge(j.pos, endp, j.r, R);
|
|
||||||
// branchingtree::Node n{cjunc->pos.cast<float>(), float(R)};
|
|
||||||
// n.left = from.id;
|
|
||||||
// m_pillars.emplace_back(n);
|
|
||||||
// m_pillar_index.insert({n.pos, m_pillars.size() - 1});
|
|
||||||
// }
|
|
||||||
|
|
||||||
// ret = true;
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const auto &resnode = m_pillars[result->second];
|
const auto &resnode = m_pillars[result->second];
|
||||||
@ -381,6 +375,8 @@ void create_branching_tree(SupportTreeBuilder &builder, const SupportableMesh &s
|
|||||||
BranchingTreeBuilder vbuilder{builder, sm, nodes};
|
BranchingTreeBuilder vbuilder{builder, sm, nodes};
|
||||||
branchingtree::build_tree(nodes, vbuilder);
|
branchingtree::build_tree(nodes, vbuilder);
|
||||||
|
|
||||||
|
vbuilder.group_pillars();
|
||||||
|
|
||||||
for (size_t id : vbuilder.unroutable_pinheads())
|
for (size_t id : vbuilder.unroutable_pinheads())
|
||||||
builder.head(id).invalidate();
|
builder.head(id).invalidate();
|
||||||
|
|
||||||
|
@ -344,15 +344,21 @@ bool DefaultSupportTree::create_ground_pillar(const Junction &hjp,
|
|||||||
const Vec3d &sourcedir,
|
const Vec3d &sourcedir,
|
||||||
long head_id)
|
long head_id)
|
||||||
{
|
{
|
||||||
auto [ret, pillar_id] = sla::create_ground_pillar(suptree_ex_policy,
|
long pillar_id = SupportTreeNode::ID_UNSET;
|
||||||
m_builder, m_sm, hjp,
|
|
||||||
sourcedir, hjp.r, head_id);
|
auto conn = sla::find_pillar_route(suptree_ex_policy, m_sm, hjp, sourcedir, hjp.r);
|
||||||
|
if (conn)
|
||||||
|
pillar_id = build_ground_connection(m_builder, m_sm, conn);
|
||||||
|
|
||||||
|
// auto [ret, pillar_id] = sla::create_ground_pillar(suptree_ex_policy,
|
||||||
|
// m_builder, m_sm, hjp,
|
||||||
|
// sourcedir, hjp.r, head_id);
|
||||||
|
|
||||||
if (pillar_id >= 0) // Save the pillar endpoint in the spatial index
|
if (pillar_id >= 0) // Save the pillar endpoint in the spatial index
|
||||||
m_pillar_index.guarded_insert(m_builder.pillar(pillar_id).endpt,
|
m_pillar_index.guarded_insert(m_builder.pillar(pillar_id).endpt,
|
||||||
unsigned(pillar_id));
|
unsigned(pillar_id));
|
||||||
|
|
||||||
return ret;
|
return bool(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DefaultSupportTree::add_pinheads()
|
void DefaultSupportTree::add_pinheads()
|
||||||
|
@ -652,7 +652,6 @@ struct GroundConnection {
|
|||||||
|
|
||||||
template<class Ex>
|
template<class Ex>
|
||||||
GroundConnection find_pillar_route(Ex policy,
|
GroundConnection find_pillar_route(Ex policy,
|
||||||
// SupportTreeBuilder &builder,
|
|
||||||
const SupportableMesh &sm,
|
const SupportableMesh &sm,
|
||||||
const Junction &source,
|
const Junction &source,
|
||||||
const Vec3d &sourcedir,
|
const Vec3d &sourcedir,
|
||||||
@ -661,7 +660,6 @@ GroundConnection find_pillar_route(Ex policy,
|
|||||||
GroundConnection ret;
|
GroundConnection ret;
|
||||||
|
|
||||||
Vec3d jp = source.pos, endp = jp, dir = sourcedir;
|
Vec3d jp = source.pos, endp = jp, dir = sourcedir;
|
||||||
// long pillar_id = SupportTreeNode::ID_UNSET;
|
|
||||||
bool can_add_base = false/*, non_head = false*/;
|
bool can_add_base = false/*, non_head = false*/;
|
||||||
|
|
||||||
double gndlvl = 0.; // The Z level where pedestals should be
|
double gndlvl = 0.; // The Z level where pedestals should be
|
||||||
@ -694,18 +692,13 @@ GroundConnection find_pillar_route(Ex policy,
|
|||||||
sm.cfg.head_back_radius_mm);
|
sm.cfg.head_back_radius_mm);
|
||||||
|
|
||||||
if (diffbr && diffbr->endp.z() > jp_gnd) {
|
if (diffbr && diffbr->endp.z() > jp_gnd) {
|
||||||
// auto &br = builder.add_diffbridge(*diffbr);
|
|
||||||
// if (head_id >= 0)
|
|
||||||
// builder.head(head_id).bridge_id = br.id;
|
|
||||||
ret.path.emplace_back(source);
|
ret.path.emplace_back(source);
|
||||||
endp = diffbr->endp;
|
endp = diffbr->endp;
|
||||||
radius = diffbr->end_r;
|
radius = diffbr->end_r;
|
||||||
// builder.add_junction(endp, radius);
|
|
||||||
ret.path.emplace_back(endp, radius);
|
ret.path.emplace_back(endp, radius);
|
||||||
// non_head = true;
|
|
||||||
dir = diffbr->get_dir();
|
dir = diffbr->get_dir();
|
||||||
eval_limits();
|
eval_limits();
|
||||||
} else return ret;//return {false, pillar_id};
|
} else return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sm.cfg.object_elevation_mm < EPSILON)
|
if (sm.cfg.object_elevation_mm < EPSILON)
|
||||||
@ -760,28 +753,18 @@ GroundConnection find_pillar_route(Ex policy,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (t > 0.) { // Need to make additional bridge
|
if (t > 0.) { // Need to make additional bridge
|
||||||
// const Bridge& br = builder.add_bridge(endp, nexp, radius);
|
|
||||||
// if (head_id >= 0)
|
|
||||||
// builder.head(head_id).bridge_id = br.id;
|
|
||||||
|
|
||||||
// builder.add_junction(nexp, radius);
|
|
||||||
ret.path.emplace_back(nexp, radius);
|
ret.path.emplace_back(nexp, radius);
|
||||||
endp = nexp;
|
endp = nexp;
|
||||||
// non_head = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Vec3d gp = to_floor(endp);
|
Vec3d gp = to_floor(endp);
|
||||||
double h = endp.z() - gp.z();
|
|
||||||
|
|
||||||
// pillar_id = head_id >= 0 && !non_head ? builder.add_pillar(head_id, h) :
|
|
||||||
// builder.add_pillar(gp, h, radius, end_radius);
|
|
||||||
ret.end_radius = end_radius;
|
ret.end_radius = end_radius;
|
||||||
|
|
||||||
if (can_add_base) {
|
if (can_add_base) {
|
||||||
ret.pillar_base = Pedestal{gp, h, sm.cfg.base_height_mm, sm.cfg.base_radius_mm};
|
ret.pillar_base =
|
||||||
// builder.add_pillar_base(pillar_id, sm.cfg.base_height_mm,
|
Pedestal{gp, sm.cfg.base_height_mm, sm.cfg.base_radius_mm, end_radius};
|
||||||
// sm.cfg.base_radius_mm);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret; //{true, pillar_id};
|
return ret; //{true, pillar_id};
|
||||||
@ -806,7 +789,15 @@ inline long build_ground_connection(SupportTreeBuilder &builder,
|
|||||||
auto gp = conn.path.back().pos;
|
auto gp = conn.path.back().pos;
|
||||||
gp.z() = ground_level(sm);
|
gp.z() = ground_level(sm);
|
||||||
double h = conn.path.back().pos.z() - gp.z();
|
double h = conn.path.back().pos.z() - gp.z();
|
||||||
ret = builder.add_pillar(gp, h, conn.path.back().r, conn.end_radius);
|
|
||||||
|
// TODO: does not work yet
|
||||||
|
// if (conn.path.back().id < 0) {
|
||||||
|
// // this is a head
|
||||||
|
// long head_id = std::abs(conn.path.back().id);
|
||||||
|
// ret = builder.add_pillar(head_id, h);
|
||||||
|
// } else
|
||||||
|
ret = builder.add_pillar(gp, h, conn.path.back().r, conn.end_radius);
|
||||||
|
|
||||||
if (conn.pillar_base)
|
if (conn.pillar_base)
|
||||||
builder.add_pillar_base(ret, conn.pillar_base->height, conn.pillar_base->r_bottom);
|
builder.add_pillar_base(ret, conn.pillar_base->height, conn.pillar_base->r_bottom);
|
||||||
|
|
||||||
@ -846,19 +837,16 @@ GroundConnection find_ground_connection(
|
|||||||
|
|
||||||
if (std::isinf(tdown)) {
|
if (std::isinf(tdown)) {
|
||||||
ret.path.emplace_back(j);
|
ret.path.emplace_back(j);
|
||||||
if (d > 0) {
|
Vec3d endp = hjp + d * dir;
|
||||||
Vec3d endp = hjp + d * dir;
|
double bridge_ratio = d / (d + (endp.z() - sm.emesh.ground_level()));
|
||||||
double bridge_ratio = d / (d + (endp.z() - sm.emesh.ground_level()));
|
double pill_r = r + bridge_ratio * (end_r - r);
|
||||||
double pill_r = r + bridge_ratio * (end_r - r);
|
|
||||||
|
|
||||||
// ret.path.emplace_back(endp, pill_r);
|
auto route = find_pillar_route(policy, sm, {endp, pill_r}, dir, end_r);
|
||||||
auto route = find_pillar_route(policy, sm, {endp, pill_r}, dir, end_r);
|
for (auto &j : route.path)
|
||||||
for (auto &j : route.path)
|
ret.path.emplace_back(j);
|
||||||
ret.path.emplace_back(j);
|
|
||||||
|
|
||||||
ret.pillar_base = route.pillar_base;
|
ret.pillar_base = route.pillar_base;
|
||||||
ret.end_radius = end_r;
|
ret.end_radius = end_r;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user