Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/supermerill/SuperSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsupermerill <merill@fr.fr>2020-08-23 23:46:31 +0300
committersupermerill <merill@fr.fr>2020-08-23 23:46:31 +0300
commit884c093075c51940fab8ba52784c07b8dbaadc2e (patch)
treee04e9c6b08ead8d4a0a0a770295b394849d3337e
parentd02921195f3044f3a17ae8832be6909d08ccd944 (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.cpp74
-rw-r--r--src/slic3r/GUI/GLCanvas3D.hpp2
-rw-r--r--src/slic3r/GUI/GUI_ObjectManipulation.cpp15
-rw-r--r--src/slic3r/GUI/Plater.cpp3
-rw-r--r--src/slic3r/GUI/Selection.cpp44
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