mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-07-29 13:52:07 +00:00
Add instances (#6237)
* Add instances * - Added a new menu item for converting instances to objects, --------- Co-authored-by: SoftFever <softfeverever@gmail.com>
This commit is contained in:
@@ -169,16 +169,35 @@ void FillBedJob::prepare()
|
||||
ModelInstance *mi = model_object->instances[sel_id];
|
||||
ArrangePolygon template_ap = get_instance_arrange_poly(mi, global_config);
|
||||
|
||||
for (int i = 0; i < needed_items; ++i) {
|
||||
int obj_idx;
|
||||
double offset_base, offset;
|
||||
bool was_one_instance;
|
||||
if (m_instances) {
|
||||
obj_idx = m_plater->get_selected_object_idx();
|
||||
offset_base = m_plater->canvas3D()->get_size_proportional_to_max_bed_size(0.05);
|
||||
offset = offset_base;
|
||||
was_one_instance = model_object->instances.size()==1;
|
||||
}
|
||||
|
||||
for (int i = 0; i < needed_items; ++i, offset += offset_base) {
|
||||
ArrangePolygon ap = template_ap;
|
||||
ap.poly = m_selected.front().poly;
|
||||
ap.bed_idx = PartPlateList::MAX_PLATES_COUNT;
|
||||
ap.itemid = -1;
|
||||
ap.setter = [this, mi](const ArrangePolygon &p) {
|
||||
ap.setter = [this, mi, offset](const ArrangePolygon &p) {
|
||||
ModelObject *mo = m_plater->model().objects[m_object_idx];
|
||||
ModelObject* newObj = m_plater->model().add_object(*mo);
|
||||
newObj->name = mo->name +" "+ std::to_string(p.itemid);
|
||||
for (ModelInstance *newInst : newObj->instances) { newInst->apply_arrange_result(p.translation.cast<double>(), p.rotation); }
|
||||
ModelObject *obj;
|
||||
if (m_instances) {
|
||||
ModelInstance* model_instance = mo->instances.back();
|
||||
Vec3d offset_vec = model_instance->get_offset() + Vec3d(offset, offset, 0.0);
|
||||
mo->add_instance(offset_vec, model_instance->get_scaling_factor(), model_instance->get_rotation(), model_instance->get_mirror());
|
||||
obj = mo;
|
||||
} else {
|
||||
ModelObject* newObj = m_plater->model().add_object(*mo);
|
||||
newObj->name = mo->name +" "+ std::to_string(p.itemid);
|
||||
obj = newObj;
|
||||
}
|
||||
for (ModelInstance *newInst : obj->instances) { newInst->apply_arrange_result(p.translation.cast<double>(), p.rotation); }
|
||||
//m_plater->sidebar().obj_list()->paste_objects_into_list({m_plater->model().objects.size()-1});
|
||||
};
|
||||
m_selected.emplace_back(ap);
|
||||
@@ -256,7 +275,7 @@ void FillBedJob::process(Ctl &ctl)
|
||||
_u8L("Bed filling done."));
|
||||
}
|
||||
|
||||
FillBedJob::FillBedJob() : m_plater{wxGetApp().plater()} {}
|
||||
FillBedJob::FillBedJob(bool instances) : m_plater{wxGetApp().plater()}, m_instances{instances} {}
|
||||
|
||||
void FillBedJob::finalize(bool canceled, std::exception_ptr &eptr)
|
||||
{
|
||||
@@ -323,6 +342,10 @@ void FillBedJob::finalize(bool canceled, std::exception_ptr &eptr)
|
||||
//model_object->ensure_on_bed();
|
||||
//BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << ": model_object->ensure_on_bed()";
|
||||
|
||||
if (m_instances && wxGetApp().app_config->get("auto_arrange") == "true") {
|
||||
m_plater->set_prepare_state(Job::PREPARE_STATE_MENU);
|
||||
m_plater->arrange();
|
||||
}
|
||||
m_plater->update();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,12 +26,14 @@ class FillBedJob : public Job
|
||||
int m_status_range = 0;
|
||||
Plater *m_plater;
|
||||
|
||||
bool m_instances;
|
||||
|
||||
public:
|
||||
|
||||
void prepare();
|
||||
void process(Ctl &ctl) override;
|
||||
|
||||
FillBedJob();
|
||||
FillBedJob(bool instances = false);
|
||||
|
||||
int status_range() const
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user