214{
215#ifdef _DEBUG
217#endif
218
219
220 config.option("sla_print_settings_id", true);
221 config.option("sla_material_settings_id", true);
222 config.option("printer_settings_id", true);
223
229
230
232 auto update_apply_status = [&apply_status](bool invalidated)
234 if (! (print_diff.empty() && printer_diff.empty() && material_diff.empty() && object_diff.empty()))
235 update_apply_status(false);
236
237
239
240
241 bool invalidate_all_model_objects = false;
242 if (! print_diff.empty())
244 if (! printer_diff.empty())
246 if (! material_diff.empty())
248
249
250
251 if (! placeholder_parser_diff.empty()) {
252
254
256 m_placeholder_parser.set(
"material_preset", config.option(
"sla_material_settings_id")->clone());
258 }
259
260
263
265
267
269
270 struct ModelObjectStatus {
273 Old,
275 Moved,
276 Deleted,
277 };
278 ModelObjectStatus(ObjectID
id, Status status =
Unknown) : id(id), status(status) {}
279 ObjectID id;
281
282 bool operator<(
const ModelObjectStatus &rhs)
const {
return id < rhs.id; }
283 };
284 std::set<ModelObjectStatus> model_object_status;
285
286
287 if (
model.id() !=
m_model.id() || invalidate_all_model_objects) {
288
289
294 update_apply_status(object->invalidate_all_steps());
295 delete object;
296 }
299 for (
const ModelObject *model_object :
m_model.objects)
301 } else {
303
304 for (
const ModelObject *model_object :
m_model.objects)
307
309 for (
const ModelObject *model_object :
m_model.objects)
311 for (
size_t i =
m_model.objects.size(); i <
model.objects.size(); ++ i) {
313 m_model.objects.emplace_back(ModelObject::new_copy(*
model.objects[i]));
315 }
316 } else {
317
318
321
322 std::vector<ModelObject*> model_objects_old(std::move(
m_model.objects));
325 auto by_id_lower = [](const ModelObject *lhs, const ModelObject *rhs){ return lhs->id() < rhs->id(); };
326 std::sort(model_objects_old.begin(), model_objects_old.end(), by_id_lower);
327 for (
const ModelObject *mobj :
model.objects) {
328 auto it = std::lower_bound(model_objects_old.begin(), model_objects_old.end(), mobj, by_id_lower);
329 if (it == model_objects_old.end() || (*it)->id() != mobj->id()) {
330
331 m_model.objects.emplace_back(ModelObject::new_copy(*mobj));
334 } else {
335
336 m_model.objects.emplace_back(*it);
338 }
339 }
340 bool deleted_any = false;
341 for (ModelObject *&model_object : model_objects_old) {
342 if (model_object_status.find(ModelObjectStatus(model_object->id())) == model_object_status.end()) {
344 deleted_any = true;
345 } else
346
347 model_object = nullptr;
348 }
349 if (deleted_any) {
350
351 std::vector<SLAPrintObject*> print_objects_old = std::move(
m_objects);
353 m_objects.reserve(print_objects_old.size());
355 auto it_status = model_object_status.find(ModelObjectStatus(print_object->model_object()->id()));
356 assert(it_status != model_object_status.end());
358 update_apply_status(print_object->invalidate_all_steps());
359 delete print_object;
360 } else
362 }
363 for (ModelObject *model_object : model_objects_old)
364 delete model_object;
365 }
366 }
367 }
368
369
370 struct PrintObjectStatus {
373 Deleted,
374 Reused,
376 };
377 PrintObjectStatus(SLAPrintObject *print_object, Status status =
Unknown) :
378 id(print_object->model_object()->id()),
379 print_object(print_object),
380 trafo(print_object->trafo()),
381 status(status) {}
382 PrintObjectStatus(ObjectID
id) : id(id), print_object(nullptr), trafo(
Transform3d::Identity()), status(
Unknown) {}
383
384 ObjectID id;
385
386 SLAPrintObject *print_object;
387
390
391 bool operator<(
const PrintObjectStatus &rhs)
const {
return id < rhs.id; }
392 };
393 std::multiset<PrintObjectStatus> print_object_status;
395 print_object_status.emplace(PrintObjectStatus(print_object));
396
397
398 std::vector<SLAPrintObject*> print_objects_new;
399 print_objects_new.reserve(std::max(
m_objects.size(),
m_model.objects.size()));
400 bool new_objects = false;
401 for (
size_t idx_model_object = 0; idx_model_object <
model.objects.size(); ++ idx_model_object) {
402 ModelObject &model_object = *
m_model.objects[idx_model_object];
403 auto it_status = model_object_status.find(ModelObjectStatus(model_object.id()));
404 assert(it_status != model_object_status.end());
406
407 auto it_print_object_status = print_object_status.end();
409
411 const ModelObject &model_object_new = *
model.objects[idx_model_object];
412 it_print_object_status = print_object_status.lower_bound(PrintObjectStatus(model_object.id()));
413 if (it_print_object_status != print_object_status.end() && it_print_object_status->id != model_object.id())
414 it_print_object_status = print_object_status.end();
415
417 bool sla_trafo_differs =
418 model_object.instances.empty() != model_object_new.instances.empty() ||
419 (! model_object.instances.empty() &&
421 model_object.instances.front()->is_left_handed() != model_object_new.instances.front()->is_left_handed()));
422 if (model_parts_differ || sla_trafo_differs) {
423
424 if (it_print_object_status != print_object_status.end()) {
425 update_apply_status(it_print_object_status->print_object->invalidate_all_steps());
427 }
428
429 model_object.assign_copy(model_object_new);
430 } else {
431
432 bool object_config_changed = ! model_object.config.timestamp_matches(model_object_new.config);
433 if (object_config_changed)
434 model_object.config.assign_config(model_object_new.config);
435 if (! object_diff.empty() || object_config_changed) {
437 new_config.apply(model_object.config.get(), true);
438 if (it_print_object_status != print_object_status.end()) {
440 if (!
diff.empty()) {
441 update_apply_status(it_print_object_status->print_object->invalidate_state_by_config_options(
diff));
442 it_print_object_status->print_object->config_apply_only(new_config,
diff,
true);
443 }
444 }
445 }
446
449 if ((old_user_modified && ! new_user_modified) ||
450 (! old_user_modified && new_user_modified) ||
451 (new_user_modified && model_object.sla_support_points != model_object_new.sla_support_points)) {
452 if (it_print_object_status != print_object_status.end())
453 update_apply_status(it_print_object_status->print_object->invalidate_step(
slaposSupportPoints));
454
455 model_object.sla_support_points = model_object_new.sla_support_points;
456 }
457 model_object.sla_points_status = model_object_new.sla_points_status;
458
459
460 if (model_object.sla_drain_holes != model_object_new.sla_drain_holes)
461 {
462 model_object.sla_drain_holes = model_object_new.sla_drain_holes;
463 update_apply_status(it_print_object_status->print_object->invalidate_step(
slaposDrillHoles));
464 }
465
466
467 model_object.name = model_object_new.name;
468 model_object.input_file = model_object_new.input_file;
469 model_object.clear_instances();
470 model_object.instances.reserve(model_object_new.instances.size());
471 for (const ModelInstance *model_instance : model_object_new.instances) {
472 model_object.instances.emplace_back(new ModelInstance(*model_instance));
473 model_object.instances.back()->set_model_object(&model_object);
474 }
475 }
476 }
477
478 std::vector<SLAPrintObject::Instance> new_instances =
sla_instances(model_object);
480
481 if (new_instances.empty()) {
483 } else {
484 if (new_instances != it_print_object_status->print_object->instances()) {
485
486 it_print_object_status->print_object->set_instances(new_instances);
488 }
489 print_objects_new.emplace_back(it_print_object_status->print_object);
491 }
492 } else if (! new_instances.empty()) {
494
495
496
497 print_object->set_trafo(
sla_trafo(model_object), model_object.instances.front()->is_left_handed());
498
499 print_object->set_instances(std::move(new_instances));
500
502 print_object->config_apply(model_object.config.get(), true);
503 print_objects_new.emplace_back(print_object);
504 new_objects = true;
505 }
506 }
507
512
513 for (auto &pos : print_object_status)
515 update_apply_status(
pos.print_object->invalidate_all_steps());
516 delete pos.print_object;
517 }
518 if (new_objects)
519 update_apply_status(false);
520 }
521
525 }
526
527#ifdef _DEBUG
529#endif
530
533}
@ Unknown
Definition PresetBundle.hpp:42
static bool operator<(wxColour const &l, wxColour const &r)
Definition StateColor.cpp:11
bool invalidate_all_steps()
Definition PrintBase.hpp:622
void call_cancel_callback()
Definition PrintBase.hpp:540
ApplyStatus
Definition PrintBase.hpp:410
@ APPLY_STATUS_UNCHANGED
Definition PrintBase.hpp:412
@ APPLY_STATUS_CHANGED
Definition PrintBase.hpp:415
@ APPLY_STATUS_INVALIDATED
Definition PrintBase.hpp:417
const Model & model() const
Definition PrintBase.hpp:420
DynamicPrintConfig m_full_print_config
Definition PrintBase.hpp:562
Model m_model
Definition PrintBase.hpp:561
PlaceholderParser m_placeholder_parser
Definition PrintBase.hpp:564
bool invalidate_step(SLAPrintStep st)
Definition SLAPrint.cpp:703
SLAPrinterConfig m_printer_config
Definition SLAPrint.hpp:568
friend SLAPrintObject
Definition SLAPrint.hpp:598
bool invalidate_state_by_config_options(const std::vector< t_config_option_key > &opt_keys, bool &invalidate_all_model_objects)
Definition SLAPrint.cpp:826
SLAPrintConfig m_print_config
Definition SLAPrint.hpp:567
PrintObjects m_objects
Definition SLAPrint.hpp:572
SLAPrintObjectConfig m_default_object_config
Definition SLAPrint.hpp:570
Transform3d sla_trafo(const ModelObject &model_object) const
Definition SLAPrint.cpp:155
std::vector< PrintLayer > m_printer_input
Definition SLAPrint.hpp:576
SLAArchive * m_printer
Definition SLAPrint.hpp:579
SLAPrintStatistics m_print_statistics
Definition SLAPrint.hpp:582
SLAMaterialConfig m_material_config
Definition SLAPrint.hpp:569
@ Status
Definition PluginSort.hpp:19
Vec3d pos(const Pt &p)
Definition ReprojectPointsOnMesh.hpp:16
@ UserModified
Definition SupportPoint.hpp:17
void check_model_ids_validity(const Model &model)
Definition Model.cpp:4375
bool model_object_list_extended(const Model &model_old, const Model &model_new)
Definition Model.cpp:4187
void check_model_ids_equal(const Model &model1, const Model &model2)
Definition Model.cpp:4399
Eigen::Transform< double, 3, Eigen::Affine, Eigen::DontAlign > Transform3d
Definition Point.hpp:96
@ MODEL_PART
Definition Model.hpp:357
std::vector< std::string > t_config_option_keys
Definition Config.hpp:97
@ New
Definition CadDocument.hpp:31
@ slaposSupportPoints
Definition SLAPrint.hpp:46
@ slaposDrillHoles
Definition SLAPrint.hpp:44
static std::vector< SLAPrintObject::Instance > sla_instances(const ModelObject &model_object)
Definition SLAPrint.cpp:185
bool model_volume_list_changed(const ModelObject &model_object_old, const ModelObject &model_object_new, TypeFilterFn type_filter)
Definition Model.cpp:4198
@ slapsMergeSlicesAndEval
Definition SLAPrint.hpp:37
bool model_object_list_equal(const Model &model_old, const Model &model_new)
Definition Model.cpp:4175
Slic3r::Polygons diff(const Slic3r::Polygon &subject, const Slic3r::Polygon &clip, ApplySafetyOffset do_safety_offset)
Definition ClipperUtils.cpp:731
@ lock
Definition GLGizmoEmboss.cpp:209
@ New
Definition PrintApply.cpp:486
@ Old
Definition PrintApply.cpp:485
@ Moved
Definition PrintApply.cpp:487
@ Deleted
Definition PrintApply.cpp:488
@ Deleted
Definition PrintApply.cpp:549
@ Reused
Definition PrintApply.cpp:550
@ Unknown
Definition PrintApply.cpp:548