diff options
author | supermerill <merill@fr.fr> | 2020-08-23 23:46:31 +0300 |
---|---|---|
committer | supermerill <merill@fr.fr> | 2020-08-23 23:46:31 +0300 |
commit | 884c093075c51940fab8ba52784c07b8dbaadc2e (patch) | |
tree | e04e9c6b08ead8d4a0a0a770295b394849d3337e | |
parent | d02921195f3044f3a17ae8832be6909d08ccd944 (diff) |
key element here is GLCanvas3D "Fixes sinking/flying instances"arbitrary_z
but everything assume it's on bed:
- skirt is buggy (brim also, maybe)
- the max height is as it's on the build plate.
-rw-r--r-- | src/slic3r/GUI/GLCanvas3D.cpp | 74 | ||||
-rw-r--r-- | src/slic3r/GUI/GLCanvas3D.hpp | 2 | ||||
-rw-r--r-- | src/slic3r/GUI/GUI_ObjectManipulation.cpp | 15 | ||||
-rw-r--r-- | src/slic3r/GUI/Plater.cpp | 3 | ||||
-rw-r--r-- | src/slic3r/GUI/Selection.cpp | 44 |
5 files changed, 69 insertions, 69 deletions
diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 2dc83a8af..fbf064592 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2130,16 +2130,16 @@ void GLCanvas3D::delete_selected() m_selection.erase(); } -void GLCanvas3D::ensure_on_bed(unsigned int object_idx) +void GLCanvas3D::ensure_on_bed(int object_idx /*=-1*/) { typedef std::map<std::pair<int, int>, double> InstancesToZMap; InstancesToZMap instances_min_z; for (GLVolume* volume : m_volumes.volumes) { - if ((volume->object_idx() == (int)object_idx) && !volume->is_modifier) + if (((object_idx < 0 && !volume->is_wipe_tower) || volume->object_idx() == (int)object_idx) && !volume->is_modifier) { - double min_z = volume->transformed_convex_hull_bounding_box().min(2); + double min_z = volume->transformed_convex_hull_bounding_box().min.z(); std::pair<int, int> instance = std::make_pair(volume->object_idx(), volume->instance_idx()); InstancesToZMap::iterator it = instances_min_z.find(instance); if (it == instances_min_z.end()) @@ -2153,8 +2153,8 @@ void GLCanvas3D::ensure_on_bed(unsigned int object_idx) { std::pair<int, int> instance = std::make_pair(volume->object_idx(), volume->instance_idx()); InstancesToZMap::iterator it = instances_min_z.find(instance); - if (it != instances_min_z.end()) - volume->set_instance_offset(Z, volume->get_instance_offset(Z) - it->second); + //if (it != instances_min_z.end()) + //volume->set_instance_offset(Z, volume->get_instance_offset(Z) - it->second); } } @@ -3883,13 +3883,15 @@ void GLCanvas3D::do_move(const std::string& snapshot_type) } // Fixes sinking/flying instances - for (const std::pair<int, int>& i : done) - { - ModelObject* m = m_model->objects[i.first]; - Vec3d shift(0.0, 0.0, -m->get_instance_min_z(i.second)); - m_selection.translate(i.first, i.second, shift); - m->translate_instance(i.second, shift); - } + const DynamicPrintConfig* printConfig = wxGetApp().get_tab(Preset::TYPE_PRINT)->get_config(); + if(!printConfig->option<ConfigOptionBool>("allow_empty_layers")->value) + for (const std::pair<int, int>& i : done) + { + ModelObject* m = m_model->objects[i.first]; + Vec3d shift(0.0, 0.0, -m->get_instance_min_z(i.second)); + m_selection.translate(i.first, i.second, shift); + m->translate_instance(i.second, shift); + } if (object_moved) post_event(SimpleEvent(EVT_GLCANVAS_INSTANCE_MOVED)); @@ -3946,13 +3948,15 @@ void GLCanvas3D::do_rotate(const std::string& snapshot_type) } // Fixes sinking/flying instances - for (const std::pair<int, int>& i : done) - { - ModelObject* m = m_model->objects[i.first]; - Vec3d shift(0.0, 0.0, -m->get_instance_min_z(i.second)); - m_selection.translate(i.first, i.second, shift); - m->translate_instance(i.second, shift); - } + const DynamicPrintConfig* printConfig = wxGetApp().get_tab(Preset::TYPE_PRINT)->get_config(); + if (!printConfig->option<ConfigOptionBool>("allow_empty_layers")->value) + for (const std::pair<int, int>& i : done) + { + ModelObject* m = m_model->objects[i.first]; + Vec3d shift(0.0, 0.0, -m->get_instance_min_z(i.second)); + m_selection.translate(i.first, i.second, shift); + m->translate_instance(i.second, shift); + } if (!done.empty()) post_event(SimpleEvent(EVT_GLCANVAS_INSTANCE_ROTATED)); @@ -4003,13 +4007,15 @@ void GLCanvas3D::do_scale(const std::string& snapshot_type) } // Fixes sinking/flying instances - for (const std::pair<int, int>& i : done) - { - ModelObject* m = m_model->objects[i.first]; - Vec3d shift(0.0, 0.0, -m->get_instance_min_z(i.second)); - m_selection.translate(i.first, i.second, shift); - m->translate_instance(i.second, shift); - } + const DynamicPrintConfig* printConfig = wxGetApp().get_tab(Preset::TYPE_PRINT)->get_config(); + if (!printConfig->option<ConfigOptionBool>("allow_empty_layers")->value) + for (const std::pair<int, int>& i : done) + { + ModelObject* m = m_model->objects[i.first]; + Vec3d shift(0.0, 0.0, -m->get_instance_min_z(i.second)); + m_selection.translate(i.first, i.second, shift); + m->translate_instance(i.second, shift); + } if (!done.empty()) post_event(SimpleEvent(EVT_GLCANVAS_INSTANCE_ROTATED)); @@ -4063,13 +4069,15 @@ void GLCanvas3D::do_mirror(const std::string& snapshot_type) } // Fixes sinking/flying instances - for (const std::pair<int, int>& i : done) - { - ModelObject* m = m_model->objects[i.first]; - Vec3d shift(0.0, 0.0, -m->get_instance_min_z(i.second)); - m_selection.translate(i.first, i.second, shift); - m->translate_instance(i.second, shift); - } + const DynamicPrintConfig* printConfig = wxGetApp().get_tab(Preset::TYPE_PRINT)->get_config(); + if (!printConfig->option<ConfigOptionBool>("allow_empty_layers")->value) + for (const std::pair<int, int>& i : done) + { + ModelObject* m = m_model->objects[i.first]; + Vec3d shift(0.0, 0.0, -m->get_instance_min_z(i.second)); + m_selection.translate(i.first, i.second, shift); + m->translate_instance(i.second, shift); + } post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index cfe835e91..6a94ac3c3 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -597,7 +597,7 @@ public: void select_all(); void deselect_all(); void delete_selected(); - void ensure_on_bed(unsigned int object_idx); + void ensure_on_bed(int object_idx = -1); std::vector<double> get_current_print_zs(bool active_only) const; void set_toolpaths_range(double low, double high); diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index 1c3c79fe4..4de1d7b68 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -621,15 +621,15 @@ void ObjectManipulation::update_reset_buttons_visibility() Vec3d scale; double min_z = 0.; - if (selection.is_single_full_instance()) { - rotation = volume->get_instance_rotation(); - scale = volume->get_instance_scaling_factor(); - } - else { + //if (selection.is_single_full_instance()) { + // rotation = volume->get_instance_rotation(); + // scale = volume->get_instance_scaling_factor(); + //} + //else { rotation = volume->get_volume_rotation(); scale = volume->get_volume_scaling_factor(); min_z = get_volume_min_z(volume); - } + //} show_rotation = !rotation.isApprox(Vec3d::Zero()); show_scale = !scale.isApprox(Vec3d::Ones()); show_drop_to_bed = (std::abs(min_z) > EPSILON); @@ -748,11 +748,14 @@ void ObjectManipulation::change_position_value(int axis, double value) Selection& selection = canvas->get_selection(); selection.start_dragging(); selection.translate(position - m_cache.position, selection.requires_local_axes()); + std::cout << "after sel z=" << wxGetApp().plater()->canvas3D()->get_selection().get_volume(0)->get_instance_transformation().get_offset().z() << "\n"; canvas->do_move(L("Set Position")); + std::cout << "after dmove z=" << wxGetApp().plater()->canvas3D()->get_selection().get_volume(0)->get_instance_transformation().get_offset().z() << "\n"; m_cache.position = position; m_cache.position_rounded(axis) = DBL_MAX; this->UpdateAndShow(true); + std::cout << "after updateshow z=" << wxGetApp().plater()->canvas3D()->get_selection().get_volume(0)->get_instance_transformation().get_offset().z() << "\n"; } void ObjectManipulation::change_rotation_value(int axis, double value) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index f88da19f1..1b8cd30fc 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2061,9 +2061,10 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) , main_frame(main_frame) , config(Slic3r::DynamicPrintConfig::new_from_defaults_keys({ // These keys are used by (at least) printconfig::min_object_distance + "allow_empty_layers", "bed_shape", "bed_custom_texture", "bed_custom_model", "complete_objects", - "complete_objects_sort", + "complete_objects_sort", "complete_objects_one_skirt", "duplicate_distance", "extruder_clearance_radius", "skirts", "skirt_distance", "skirt_height", "brim_width", "variable_layer_height", "serial_port", "serial_speed", "host_type", "print_host", diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index 146111f49..4615db0eb 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -1,12 +1,12 @@ #include "libslic3r/libslic3r.h" #include "Selection.hpp" -#include "GLCanvas3D.hpp" #include "GUI_App.hpp" #include "GUI.hpp" #include "GUI_ObjectManipulation.hpp" #include "GUI_ObjectList.hpp" #include "Gizmos/GLGizmoBase.hpp" +#include "GLCanvas3D.hpp" #include "3DScene.hpp" #include "Camera.hpp" @@ -95,7 +95,7 @@ Selection::~Selection() } #endif // ENABLE_RENDER_SELECTION_CENTER -void Selection::set_volumes(GLVolumePtrs* volumes) +void Selection::set_volumes(GLVolumePtrs *volumes) { m_volumes = volumes; update_valid(); @@ -642,9 +642,11 @@ void Selection::translate(const Vec3d& displacement, bool local) return; EMode translation_type = m_mode; + std::cout << "displace=" << displacement.z() << "\n"; for (unsigned int i : m_list) { + std::cout << "4 z=" << wxGetApp().plater()->canvas3D()->get_selection().get_volume(0)->get_instance_transformation().get_offset().z() << "\n"; if ((m_mode == Volume) || (*m_volumes)[i]->is_wipe_tower) { if (local) @@ -667,6 +669,7 @@ void Selection::translate(const Vec3d& displacement, bool local) } } } + std::cout << "5 z=" << wxGetApp().plater()->canvas3D()->get_selection().get_volume(0)->get_instance_transformation().get_offset().z() << "\n"; #if !DISABLE_INSTANCES_SYNCH if (translation_type == Instance) @@ -674,8 +677,9 @@ void Selection::translate(const Vec3d& displacement, bool local) else if (translation_type == Volume) synchronize_unselected_volumes(); #endif // !DISABLE_INSTANCES_SYNCH - + std::cout << "6 z=" << wxGetApp().plater()->canvas3D()->get_selection().get_volume(0)->get_instance_transformation().get_offset().z() << "\n"; this->set_bounding_boxes_dirty(); + std::cout << "7 z=" << wxGetApp().plater()->canvas3D()->get_selection().get_volume(0)->get_instance_transformation().get_offset().z() << "\n"; } // Rotate an object around one of the axes. Only one rotation component is expected to be changing. @@ -989,12 +993,18 @@ void Selection::translate(unsigned int object_idx, const Vec3d& displacement) { if (!m_valid) return; + std::cout << "displace2=" << displacement.z() << "\n"; + for (unsigned int i : m_list) { - GLVolume* v = (*m_volumes)[i]; + GLVolume* v = (*m_volumes)[i]; + if (v->object_idx() == (int)object_idx) + std::cout << "v2_0 z=" << wxGetApp().plater()->canvas3D()->get_selection().get_volume(0)->get_instance_transformation().get_offset().z() << "\n"; if (v->object_idx() == (int)object_idx) v->set_instance_offset(v->get_instance_offset() + displacement); + if (v->object_idx() == (int)object_idx) + std::cout << "v2_1 z=" << wxGetApp().plater()->canvas3D()->get_selection().get_volume(0)->get_instance_transformation().get_offset().z() << "\n"; } std::set<unsigned int> done; // prevent processing volumes twice @@ -1035,6 +1045,7 @@ void Selection::translate(unsigned int object_idx, unsigned int instance_idx, co if (!m_valid) return; + std::cout << "displace3=" << displacement.z() << "\n"; for (unsigned int i : m_list) { GLVolume* v = (*m_volumes)[i]; @@ -2208,30 +2219,7 @@ void Selection::synchronize_unselected_volumes() void Selection::ensure_on_bed() { - typedef std::map<std::pair<int, int>, double> InstancesToZMap; - InstancesToZMap instances_min_z; - - for (GLVolume* volume : *m_volumes) - { - if (!volume->is_wipe_tower && !volume->is_modifier) - { - double min_z = volume->transformed_convex_hull_bounding_box().min(2); - std::pair<int, int> instance = std::make_pair(volume->object_idx(), volume->instance_idx()); - InstancesToZMap::iterator it = instances_min_z.find(instance); - if (it == instances_min_z.end()) - it = instances_min_z.insert(InstancesToZMap::value_type(instance, DBL_MAX)).first; - - it->second = std::min(it->second, min_z); - } - } - - for (GLVolume* volume : *m_volumes) - { - std::pair<int, int> instance = std::make_pair(volume->object_idx(), volume->instance_idx()); - InstancesToZMap::iterator it = instances_min_z.find(instance); - if (it != instances_min_z.end()) - volume->set_instance_offset(Z, volume->get_instance_offset(Z) - it->second); - } + wxGetApp().plater()->canvas3D()->ensure_on_bed(); } bool Selection::is_from_fully_selected_instance(unsigned int volume_idx) const |