Arrange: Fix local arrange in SLA mode

This commit is contained in:
Martin Šach 2024-11-19 09:47:34 +01:00 committed by Lukas Matena
parent e588d80e23
commit 4f7366045e
2 changed files with 30 additions and 15 deletions

View File

@ -497,12 +497,14 @@ class ArrangeableSLAPrintObject : public Arrangeable
const SLAPrintObject *m_po;
Arrangeable *m_arrbl;
Transform3d m_inst_trafo;
std::optional<int> m_bed_constraint;
public:
ArrangeableSLAPrintObject(const SLAPrintObject *po,
Arrangeable *arrbl,
const std::optional<int> bed_constraint,
const Transform3d &inst_tr = Transform3d::Identity())
: m_po{po}, m_arrbl{arrbl}, m_inst_trafo{inst_tr}
: m_po{po}, m_arrbl{arrbl}, m_inst_trafo{inst_tr}, m_bed_constraint(bed_constraint)
{}
ObjectID id() const override { return m_arrbl->id(); }
@ -524,6 +526,8 @@ public:
return m_arrbl->assign_bed(bedidx);
}
std::optional<int> bed_constraint() const override { return m_bed_constraint; }
bool is_printable() const override { return m_arrbl->is_printable(); }
bool is_selected() const override { return m_arrbl->is_selected(); }
int priority() const override { return m_arrbl->priority(); }

View File

@ -623,22 +623,28 @@ void ArrangeableSLAPrint::for_each_arrangeable_(Self &&self, Fn &&fn)
InstPos pos;
for (auto *obj : self.m_model->objects) {
for (auto *inst : obj->instances) {
ArrangeableModelInstance ainst{inst, self.m_vbed_handler.get(),
self.m_selmask.get(), pos, std::nullopt};
if (!self.m_considered_instances || should_include_instance(inst->id(), *self.m_considered_instances)) {
ArrangeableModelInstance ainst{inst, self.m_vbed_handler.get(),
self.m_selmask.get(), pos, get_bed_constraint(inst->id(), self.m_bed_constraints)};
auto obj_id = inst->get_object()->id();
const SLAPrintObject *po =
self.m_slaprint->get_print_object_by_model_object_id(obj_id);
auto obj_id = inst->get_object()->id();
const SLAPrintObject *po =
self.m_slaprint->get_print_object_by_model_object_id(obj_id);
if (po) {
auto &vbh = self.m_vbed_handler;
auto phtr = vbh->get_physical_bed_trafo(vbh->get_bed_index(VBedPlaceableMI{*inst}));
ArrangeableSLAPrintObject ainst_po{po, &ainst, phtr * inst->get_matrix()};
fn(ainst_po);
} else {
fn(ainst);
if (po) {
auto &vbh = self.m_vbed_handler;
auto phtr = vbh->get_physical_bed_trafo(vbh->get_bed_index(VBedPlaceableMI{*inst}));
ArrangeableSLAPrintObject ainst_po{
po,
&ainst,
get_bed_constraint(inst->id(), self.m_bed_constraints),
phtr * inst->get_matrix()
};
fn(ainst_po);
} else {
fn(ainst);
}
}
++pos.inst_idx;
}
pos.inst_idx = 0;
@ -682,7 +688,12 @@ void ArrangeableSLAPrint::visit_arrangeable_(Self &&self, const ObjectID &id, Fn
if (po) {
auto &vbh = self.m_vbed_handler;
auto phtr = vbh->get_physical_bed_trafo(vbh->get_bed_index(VBedPlaceableMI{*inst}));
ArrangeableSLAPrintObject ainst_po{po, &ainst, phtr * inst->get_matrix()};
ArrangeableSLAPrintObject ainst_po{
po,
&ainst,
get_bed_constraint(inst->id(), self.m_bed_constraints),
phtr * inst->get_matrix()
};
fn(ainst_po);
} else {
fn(ainst);