NEW:add move and rotate gizmo in assemble view
Jira: STUDIO-6545 Change-Id: I30ab8155f5288953b36cd9a301ce3596d6edc0c6
This commit is contained in:
parent
0314576089
commit
d9e47bd9a9
|
@ -1276,13 +1276,14 @@ public:
|
||||||
m_assemble_transformation.set_from_transform(transform);
|
m_assemble_transformation.set_from_transform(transform);
|
||||||
}
|
}
|
||||||
void set_assemble_offset(const Vec3d& offset) { m_assemble_transformation.set_offset(offset); }
|
void set_assemble_offset(const Vec3d& offset) { m_assemble_transformation.set_offset(offset); }
|
||||||
|
void set_assemble_rotation(const Vec3d &rotation) { m_assemble_transformation.set_rotation(rotation); }
|
||||||
void rotate_assemble(double angle, const Vec3d& axis) {
|
void rotate_assemble(double angle, const Vec3d& axis) {
|
||||||
m_assemble_transformation.set_rotation(m_assemble_transformation.get_rotation() + Geometry::extract_euler_angles(Eigen::Quaterniond(Eigen::AngleAxisd(angle, axis)).toRotationMatrix()));
|
m_assemble_transformation.set_rotation(m_assemble_transformation.get_rotation() + Geometry::extract_euler_angles(Eigen::Quaterniond(Eigen::AngleAxisd(angle, axis)).toRotationMatrix()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// BBS
|
// BBS
|
||||||
void set_offset_to_assembly(const Vec3d& offset) { m_offset_to_assembly = offset; }
|
void set_offset_to_assembly(const Vec3d& offset) { m_offset_to_assembly = offset; }
|
||||||
Vec3d get_offset_to_assembly() const { return m_offset_to_assembly; }
|
const Vec3d& get_offset_to_assembly() const { return m_offset_to_assembly; }
|
||||||
|
|
||||||
const Vec3d& get_offset() const { return m_transformation.get_offset(); }
|
const Vec3d& get_offset() const { return m_transformation.get_offset(); }
|
||||||
double get_offset(Axis axis) const { return m_transformation.get_offset(axis); }
|
double get_offset(Axis axis) const { return m_transformation.get_offset(axis); }
|
||||||
|
|
|
@ -678,7 +678,7 @@ void GLVolume::set_range(double min_z, double max_z)
|
||||||
|
|
||||||
//BBS: add outline related logic
|
//BBS: add outline related logic
|
||||||
//static unsigned char stencil_data[1284][2944];
|
//static unsigned char stencil_data[1284][2944];
|
||||||
void GLVolume::render(bool with_outline) const
|
void GLVolume::render(bool with_outline, const std::array<float, 4>& body_color) const
|
||||||
{
|
{
|
||||||
if (!is_active)
|
if (!is_active)
|
||||||
return;
|
return;
|
||||||
|
@ -880,7 +880,6 @@ void GLVolume::render(bool with_outline) const
|
||||||
glStencilFunc(GL_NOTEQUAL, 0xff, 0xFF);
|
glStencilFunc(GL_NOTEQUAL, 0xff, 0xFF);
|
||||||
glStencilMask(0x00);
|
glStencilMask(0x00);
|
||||||
float scale = 1.02f;
|
float scale = 1.02f;
|
||||||
std::array<float, 4> body_color = { 1.0f, 1.0f, 1.0f, 1.0f }; //red
|
|
||||||
|
|
||||||
shader->set_uniform("uniform_color", body_color);
|
shader->set_uniform("uniform_color", body_color);
|
||||||
shader->set_uniform("is_outline", true);
|
shader->set_uniform("is_outline", true);
|
||||||
|
@ -1336,8 +1335,13 @@ int GLVolumeCollection::get_selection_support_threshold_angle(bool &enable_suppo
|
||||||
}
|
}
|
||||||
|
|
||||||
//BBS: add outline drawing logic
|
//BBS: add outline drawing logic
|
||||||
void GLVolumeCollection::render(
|
void GLVolumeCollection::render(GLVolumeCollection::ERenderType type,
|
||||||
GLVolumeCollection::ERenderType type, bool disable_cullface, const Transform3d &view_matrix, std::function<bool(const GLVolume &)> filter_func, bool with_outline) const
|
bool disable_cullface,
|
||||||
|
const Transform3d & view_matrix,
|
||||||
|
std::function<bool(const GLVolume &)> filter_func,
|
||||||
|
bool with_outline,
|
||||||
|
const std::array<float, 4> & body_color,
|
||||||
|
bool partly_inside_enable) const
|
||||||
{
|
{
|
||||||
GLVolumeWithIdAndZList to_render = volumes_to_render(volumes, type, view_matrix, filter_func);
|
GLVolumeWithIdAndZList to_render = volumes_to_render(volumes, type, view_matrix, filter_func);
|
||||||
if (to_render.empty())
|
if (to_render.empty())
|
||||||
|
@ -1396,7 +1400,7 @@ void GLVolumeCollection::render(
|
||||||
//shader->set_uniform("print_volume.xy_data", m_render_volume.data);
|
//shader->set_uniform("print_volume.xy_data", m_render_volume.data);
|
||||||
//shader->set_uniform("print_volume.z_data", m_render_volume.zs);
|
//shader->set_uniform("print_volume.z_data", m_render_volume.zs);
|
||||||
|
|
||||||
if (volume.first->partly_inside) {
|
if (volume.first->partly_inside && partly_inside_enable) {
|
||||||
//only partly inside volume need to be painted with boundary check
|
//only partly inside volume need to be painted with boundary check
|
||||||
shader->set_uniform("print_volume.type", static_cast<int>(m_print_volume.type));
|
shader->set_uniform("print_volume.type", static_cast<int>(m_print_volume.type));
|
||||||
shader->set_uniform("print_volume.xy_data", m_print_volume.data);
|
shader->set_uniform("print_volume.xy_data", m_print_volume.data);
|
||||||
|
@ -1427,7 +1431,7 @@ void GLVolumeCollection::render(
|
||||||
glcheck();
|
glcheck();
|
||||||
|
|
||||||
//BBS: add outline related logic
|
//BBS: add outline related logic
|
||||||
volume.first->render(with_outline && volume.first->selected);
|
volume.first->render(with_outline && volume.first->selected, body_color);
|
||||||
|
|
||||||
#if ENABLE_ENVIRONMENT_MAP
|
#if ENABLE_ENVIRONMENT_MAP
|
||||||
if (use_environment_texture)
|
if (use_environment_texture)
|
||||||
|
|
|
@ -497,7 +497,7 @@ public:
|
||||||
void set_convex_hull(TriangleMesh &&convex_hull) { m_convex_hull = std::make_shared<const TriangleMesh>(std::move(convex_hull)); }
|
void set_convex_hull(TriangleMesh &&convex_hull) { m_convex_hull = std::make_shared<const TriangleMesh>(std::move(convex_hull)); }
|
||||||
|
|
||||||
void set_offset_to_assembly(const Vec3d& offset) { m_offset_to_assembly = offset; set_bounding_boxes_as_dirty(); }
|
void set_offset_to_assembly(const Vec3d& offset) { m_offset_to_assembly = offset; set_bounding_boxes_as_dirty(); }
|
||||||
Vec3d get_offset_to_assembly() { return m_offset_to_assembly; }
|
const Vec3d& get_offset_to_assembly() { return m_offset_to_assembly; }
|
||||||
|
|
||||||
int object_idx() const { return this->composite_id.object_id; }
|
int object_idx() const { return this->composite_id.object_id; }
|
||||||
int volume_idx() const { return this->composite_id.volume_id; }
|
int volume_idx() const { return this->composite_id.volume_id; }
|
||||||
|
@ -523,7 +523,8 @@ public:
|
||||||
void set_range(double low, double high);
|
void set_range(double low, double high);
|
||||||
|
|
||||||
//BBS: add outline related logic and add virtual specifier
|
//BBS: add outline related logic and add virtual specifier
|
||||||
virtual void render(bool with_outline = false) const;
|
virtual void render(bool with_outline = false,
|
||||||
|
const std::array<float, 4> &body_color = {1.0f, 1.0f, 1.0f, 1.0f} ) const;
|
||||||
|
|
||||||
//BBS: add simple render function for thumbnail
|
//BBS: add simple render function for thumbnail
|
||||||
void simple_render(GLShaderProgram* shader, ModelObjectPtrs& model_objects, std::vector<std::array<float, 4>>& extruder_colors) const;
|
void simple_render(GLShaderProgram* shader, ModelObjectPtrs& model_objects, std::vector<std::array<float, 4>>& extruder_colors) const;
|
||||||
|
@ -668,7 +669,10 @@ public:
|
||||||
bool disable_cullface,
|
bool disable_cullface,
|
||||||
const Transform3d & view_matrix,
|
const Transform3d & view_matrix,
|
||||||
std::function<bool(const GLVolume &)> filter_func = std::function<bool(const GLVolume &)>(),
|
std::function<bool(const GLVolume &)> filter_func = std::function<bool(const GLVolume &)>(),
|
||||||
bool with_outline = true) const;
|
bool with_outline = true,
|
||||||
|
const std::array<float, 4>& body_color = {1.0f, 1.0f, 1.0f, 1.0f},
|
||||||
|
bool partly_inside_enable =true
|
||||||
|
) const;
|
||||||
|
|
||||||
// Finalize the initialization of the geometry & indices,
|
// Finalize the initialization of the geometry & indices,
|
||||||
// upload the geometry and indices to OpenGL VBO objects
|
// upload the geometry and indices to OpenGL VBO objects
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
#include "libslic3r/Technologies.hpp"
|
#include "libslic3r/Technologies.hpp"
|
||||||
#include "libslic3r/Tesselate.hpp"
|
#include "libslic3r/Tesselate.hpp"
|
||||||
#include "libslic3r/PresetBundle.hpp"
|
#include "libslic3r/PresetBundle.hpp"
|
||||||
#include "slic3r/GUI/3DBed.hpp"
|
|
||||||
#include "slic3r/GUI/3DScene.hpp"
|
#include "slic3r/GUI/3DScene.hpp"
|
||||||
#include "slic3r/GUI/BackgroundSlicingProcess.hpp"
|
#include "slic3r/GUI/BackgroundSlicingProcess.hpp"
|
||||||
#include "slic3r/GUI/GLShader.hpp"
|
#include "slic3r/GUI/GLShader.hpp"
|
||||||
|
@ -1946,6 +1946,9 @@ void GLCanvas3D::render(bool only_init)
|
||||||
/* assemble render*/
|
/* assemble render*/
|
||||||
else if (m_canvas_type == ECanvasType::CanvasAssembleView) {
|
else if (m_canvas_type == ECanvasType::CanvasAssembleView) {
|
||||||
//BBS: add outline logic
|
//BBS: add outline logic
|
||||||
|
if (m_show_world_axes) {
|
||||||
|
m_axes.render();
|
||||||
|
}
|
||||||
_render_objects(GLVolumeCollection::ERenderType::Opaque, !m_gizmos.is_running());
|
_render_objects(GLVolumeCollection::ERenderType::Opaque, !m_gizmos.is_running());
|
||||||
//_render_bed(!camera.is_looking_downward(), show_axes);
|
//_render_bed(!camera.is_looking_downward(), show_axes);
|
||||||
_render_plane();
|
_render_plane();
|
||||||
|
@ -4569,8 +4572,13 @@ void GLCanvas3D::do_move(const std::string& snapshot_type)
|
||||||
// Move instances/volumes
|
// Move instances/volumes
|
||||||
ModelObject* model_object = m_model->objects[object_idx];
|
ModelObject* model_object = m_model->objects[object_idx];
|
||||||
if (model_object != nullptr) {
|
if (model_object != nullptr) {
|
||||||
if (selection_mode == Selection::Instance)
|
if (selection_mode == Selection::Instance) {
|
||||||
|
if (m_canvas_type == GLCanvas3D::ECanvasType::CanvasAssembleView) {
|
||||||
|
model_object->instances[instance_idx]->set_assemble_offset(v->get_instance_offset());
|
||||||
|
} else {
|
||||||
model_object->instances[instance_idx]->set_offset(v->get_instance_offset());
|
model_object->instances[instance_idx]->set_offset(v->get_instance_offset());
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (selection_mode == Selection::Volume) {
|
else if (selection_mode == Selection::Volume) {
|
||||||
if (model_object->volumes[volume_idx]->get_offset() != v->get_volume_offset()) {
|
if (model_object->volumes[volume_idx]->get_offset() != v->get_volume_offset()) {
|
||||||
model_object->volumes[volume_idx]->set_offset(v->get_volume_offset());
|
model_object->volumes[volume_idx]->set_offset(v->get_volume_offset());
|
||||||
|
@ -4677,9 +4685,14 @@ void GLCanvas3D::do_rotate(const std::string& snapshot_type)
|
||||||
ModelObject* model_object = m_model->objects[object_idx];
|
ModelObject* model_object = m_model->objects[object_idx];
|
||||||
if (model_object != nullptr) {
|
if (model_object != nullptr) {
|
||||||
if (selection_mode == Selection::Instance) {
|
if (selection_mode == Selection::Instance) {
|
||||||
|
if (m_canvas_type == GLCanvas3D::ECanvasType::CanvasAssembleView) {
|
||||||
|
model_object->instances[instance_idx]->set_assemble_rotation(v->get_instance_rotation());
|
||||||
|
model_object->instances[instance_idx]->set_assemble_offset(v->get_instance_offset());
|
||||||
|
} else {
|
||||||
model_object->instances[instance_idx]->set_rotation(v->get_instance_rotation());
|
model_object->instances[instance_idx]->set_rotation(v->get_instance_rotation());
|
||||||
model_object->instances[instance_idx]->set_offset(v->get_instance_offset());
|
model_object->instances[instance_idx]->set_offset(v->get_instance_offset());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else if (selection_mode == Selection::Volume) {
|
else if (selection_mode == Selection::Volume) {
|
||||||
if (model_object->volumes[volume_idx]->get_rotation() != v->get_volume_rotation()) {
|
if (model_object->volumes[volume_idx]->get_rotation() != v->get_volume_rotation()) {
|
||||||
model_object->volumes[volume_idx]->set_rotation(v->get_volume_rotation());
|
model_object->volumes[volume_idx]->set_rotation(v->get_volume_rotation());
|
||||||
|
@ -6974,6 +6987,9 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type, bool with
|
||||||
|
|
||||||
GLShaderProgram* shader = wxGetApp().get_shader("gouraud");
|
GLShaderProgram* shader = wxGetApp().get_shader("gouraud");
|
||||||
ECanvasType canvas_type = this->m_canvas_type;
|
ECanvasType canvas_type = this->m_canvas_type;
|
||||||
|
std::array<float, 4> body_color = canvas_type == ECanvasType::CanvasAssembleView ? std::array<float, 4>({1.0f, 1.0f, 0.0f, 1.0f}) ://yellow
|
||||||
|
std::array<float, 4>({1.0f, 1.0f, 1.0f, 1.0f});//white
|
||||||
|
bool partly_inside_enable = canvas_type == ECanvasType::CanvasAssembleView ? false : true;
|
||||||
if (shader != nullptr) {
|
if (shader != nullptr) {
|
||||||
shader->start_using();
|
shader->start_using();
|
||||||
|
|
||||||
|
@ -7009,7 +7025,8 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type, bool with
|
||||||
else {
|
else {
|
||||||
return (m_render_sla_auxiliaries || volume.composite_id.volume_id >= 0);
|
return (m_render_sla_auxiliaries || volume.composite_id.volume_id >= 0);
|
||||||
}
|
}
|
||||||
}, with_outline);
|
},
|
||||||
|
with_outline, body_color, partly_inside_enable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -7042,7 +7059,8 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type, bool with
|
||||||
else {
|
else {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}, with_outline);
|
},
|
||||||
|
with_outline, body_color, partly_inside_enable);
|
||||||
if (m_canvas_type == CanvasAssembleView && m_gizmos.m_assemble_view_data->model_objects_clipper()->get_position() > 0) {
|
if (m_canvas_type == CanvasAssembleView && m_gizmos.m_assemble_view_data->model_objects_clipper()->get_position() > 0) {
|
||||||
const GLGizmosManager& gm = get_gizmos_manager();
|
const GLGizmosManager& gm = get_gizmos_manager();
|
||||||
shader->stop_using();
|
shader->stop_using();
|
||||||
|
@ -7908,6 +7926,7 @@ void GLCanvas3D::_render_return_toolbar()
|
||||||
wxPostEvent(m_canvas, SimpleEvent(EVT_GLVIEWTOOLBAR_3D));
|
wxPostEvent(m_canvas, SimpleEvent(EVT_GLVIEWTOOLBAR_3D));
|
||||||
const_cast<GLGizmosManager *>(&m_gizmos)->reset_all_states();
|
const_cast<GLGizmosManager *>(&m_gizmos)->reset_all_states();
|
||||||
wxGetApp().plater()->get_view3D_canvas3D()->get_gizmos_manager().reset_all_states();
|
wxGetApp().plater()->get_view3D_canvas3D()->get_gizmos_manager().reset_all_states();
|
||||||
|
wxGetApp().plater()->get_view3D_canvas3D()->reload_scene(true);
|
||||||
{
|
{
|
||||||
GLCanvas3D * view_3d = wxGetApp().plater()->get_view3D_canvas3D();
|
GLCanvas3D * view_3d = wxGetApp().plater()->get_view3D_canvas3D();
|
||||||
GLToolbarItem * assembly_item = view_3d->m_assemble_view_toolbar.get_item("assembly_view");
|
GLToolbarItem * assembly_item = view_3d->m_assemble_view_toolbar.get_item("assembly_view");
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
#include "GCodeViewer.hpp"
|
#include "GCodeViewer.hpp"
|
||||||
#include "Camera.hpp"
|
#include "Camera.hpp"
|
||||||
#include "IMToolbar.hpp"
|
#include "IMToolbar.hpp"
|
||||||
|
#include "slic3r/GUI/3DBed.hpp"
|
||||||
#include "libslic3r/Slicing.hpp"
|
#include "libslic3r/Slicing.hpp"
|
||||||
|
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
|
@ -53,7 +53,6 @@ namespace CustomGCode { struct Item; }
|
||||||
|
|
||||||
namespace GUI {
|
namespace GUI {
|
||||||
|
|
||||||
class Bed3D;
|
|
||||||
class PartPlateList;
|
class PartPlateList;
|
||||||
|
|
||||||
#if ENABLE_RETINA_GL
|
#if ENABLE_RETINA_GL
|
||||||
|
@ -609,8 +608,8 @@ private:
|
||||||
|
|
||||||
PrinterTechnology current_printer_technology() const;
|
PrinterTechnology current_printer_technology() const;
|
||||||
|
|
||||||
|
bool m_show_world_axes{false};
|
||||||
|
Bed3D::Axes m_axes;
|
||||||
//BBS:record key botton frequency
|
//BBS:record key botton frequency
|
||||||
int auto_orient_count = 0;
|
int auto_orient_count = 0;
|
||||||
int auto_arrange_count = 0;
|
int auto_arrange_count = 0;
|
||||||
|
@ -773,6 +772,7 @@ public:
|
||||||
|
|
||||||
void set_color_by(const std::string& value);
|
void set_color_by(const std::string& value);
|
||||||
|
|
||||||
|
void set_show_world_axes(bool flag) { m_show_world_axes = flag; }
|
||||||
void refresh_camera_scene_box();
|
void refresh_camera_scene_box();
|
||||||
|
|
||||||
BoundingBoxf3 volumes_bounding_box() const;
|
BoundingBoxf3 volumes_bounding_box() const;
|
||||||
|
|
|
@ -811,10 +811,10 @@ bool AssembleView::init(wxWindow* parent, Bed3D& bed, Model* model, DynamicPrint
|
||||||
m_canvas->enable_assemble_view_toolbar(false);
|
m_canvas->enable_assemble_view_toolbar(false);
|
||||||
m_canvas->enable_return_toolbar(true);
|
m_canvas->enable_return_toolbar(true);
|
||||||
m_canvas->enable_separator_toolbar(false);
|
m_canvas->enable_separator_toolbar(false);
|
||||||
|
m_canvas->set_show_world_axes(true);
|
||||||
// BBS: set volume_selection_mode to Volume
|
// BBS: set volume_selection_mode to Volume
|
||||||
m_canvas->get_selection().set_volume_selection_mode(Selection::Volume);
|
//same to 3d //m_canvas->get_selection().set_volume_selection_mode(Selection::Instance);
|
||||||
m_canvas->get_selection().lock_volume_selection_mode();
|
//m_canvas->get_selection().lock_volume_selection_mode();
|
||||||
|
|
||||||
wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL);
|
wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
main_sizer->Add(m_canvas_widget, 1, wxALL | wxEXPAND, 0);
|
main_sizer->Add(m_canvas_widget, 1, wxALL | wxEXPAND, 0);
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#include "slic3r/GUI/GUI_App.hpp"
|
#include "slic3r/GUI/GUI_App.hpp"
|
||||||
#include "slic3r/GUI/Plater.hpp"
|
#include "slic3r/GUI/Plater.hpp"
|
||||||
#include "slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp"
|
#include "slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp"
|
||||||
|
#include "slic3r/Utils/UndoRedo.hpp"
|
||||||
|
|
||||||
#include "libslic3r/PresetBundle.hpp"
|
#include "libslic3r/PresetBundle.hpp"
|
||||||
#include "libslic3r/MeasureUtils.hpp"
|
#include "libslic3r/MeasureUtils.hpp"
|
||||||
|
@ -1322,7 +1322,8 @@ void GLGizmoMeasure::render_dimensioning()
|
||||||
m_imgui->text(txt);
|
m_imgui->text(txt);
|
||||||
if (m_hit_different_volumes.size() < 2) {
|
if (m_hit_different_volumes.size() < 2) {
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (m_imgui->image_button(ImGui::SliderFloatEditBtnIcon, _L("Edit to scale"))) {
|
if (m_imgui->image_button(ImGui::SliderFloatEditBtnIcon, _L("Edit to scale")) &&
|
||||||
|
wxGetApp().plater()->canvas3D()->get_canvas_type() == GLCanvas3D::ECanvasType::CanvasView3D) {
|
||||||
m_editing_distance = true;
|
m_editing_distance = true;
|
||||||
edit_value = curr_value;
|
edit_value = curr_value;
|
||||||
m_imgui->requires_extra_frame();
|
m_imgui->requires_extra_frame();
|
||||||
|
@ -1345,7 +1346,7 @@ void GLGizmoMeasure::render_dimensioning()
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const double ratio = new_value / old_value;
|
const double ratio = new_value / old_value;
|
||||||
wxGetApp().plater()->take_snapshot(_u8L("Scale"));
|
wxGetApp().plater()->take_snapshot(_u8L("Scale"), UndoRedo::SnapshotType::GizmoAction);
|
||||||
// apply scale
|
// apply scale
|
||||||
TransformationType type;
|
TransformationType type;
|
||||||
type.set_world();
|
type.set_world();
|
||||||
|
@ -2024,7 +2025,7 @@ void GLGizmoMeasure::on_render_input_window(float x, float y, float bottom_limit
|
||||||
distance[2] = m_buffered_distance[2];
|
distance[2] = m_buffered_distance[2];
|
||||||
}
|
}
|
||||||
if (displacement.norm() > 0.0f) {
|
if (displacement.norm() > 0.0f) {
|
||||||
wxGetApp().plater()->take_snapshot(_u8L("MoveInMeasure"));// avoid storing another snapshot
|
wxGetApp().plater()->take_snapshot(_u8L("MoveInMeasure"), UndoRedo::SnapshotType::GizmoAction); // avoid storing another snapshot
|
||||||
selection->set_mode(same_model_object ? Selection::Volume : Selection::Instance);
|
selection->set_mode(same_model_object ? Selection::Volume : Selection::Instance);
|
||||||
auto llo = selection->get_mode();
|
auto llo = selection->get_mode();
|
||||||
if (same_model_object == false) {
|
if (same_model_object == false) {
|
||||||
|
|
|
@ -59,7 +59,9 @@ std::vector<size_t> GLGizmosManager::get_selectable_idxs() const
|
||||||
std::vector<size_t> out;
|
std::vector<size_t> out;
|
||||||
if (m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView) {
|
if (m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView) {
|
||||||
for (size_t i = 0; i < m_gizmos.size(); ++i)
|
for (size_t i = 0; i < m_gizmos.size(); ++i)
|
||||||
if (m_gizmos[i]->get_sprite_id() == (unsigned int)MmuSegmentation)
|
if (m_gizmos[i]->get_sprite_id() == (unsigned int) Move ||
|
||||||
|
m_gizmos[i]->get_sprite_id() == (unsigned int) Rotate ||
|
||||||
|
m_gizmos[i]->get_sprite_id() == (unsigned int) MmuSegmentation)
|
||||||
out.push_back(i);
|
out.push_back(i);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -877,9 +879,21 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt)
|
||||||
}
|
}
|
||||||
else if (is_dragging()) {
|
else if (is_dragging()) {
|
||||||
switch (m_current) {
|
switch (m_current) {
|
||||||
case Move: { m_parent.do_move(("Tool-Move")); break; }
|
case Move: {
|
||||||
case Scale: { m_parent.do_scale(("Tool-Scale")); break; }
|
wxGetApp().plater()->take_snapshot(_u8L("Tool-Move"), UndoRedo::SnapshotType::GizmoAction);
|
||||||
case Rotate: { m_parent.do_rotate(("Tool-Rotate")); break; }
|
m_parent.do_move("");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Scale: {
|
||||||
|
wxGetApp().plater()->take_snapshot(_u8L("Tool-Scale"), UndoRedo::SnapshotType::GizmoAction);
|
||||||
|
m_parent.do_scale("");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Rotate: {
|
||||||
|
wxGetApp().plater()->take_snapshot(_u8L("Tool-Rotate"), UndoRedo::SnapshotType::GizmoAction);
|
||||||
|
m_parent.do_rotate("");
|
||||||
|
break;
|
||||||
|
}
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
//#include "I18N.hpp"
|
//#include "I18N.hpp"
|
||||||
#include "GLGizmosManager.hpp"
|
#include "GLGizmosManager.hpp"
|
||||||
#include "slic3r/GUI/GLCanvas3D.hpp"
|
#include "slic3r/GUI/GLCanvas3D.hpp"
|
||||||
|
|
||||||
#include "slic3r/GUI/GUI_App.hpp"
|
#include "slic3r/GUI/GUI_App.hpp"
|
||||||
|
#include "slic3r/Utils/UndoRedo.hpp"
|
||||||
#include "libslic3r/AppConfig.hpp"
|
#include "libslic3r/AppConfig.hpp"
|
||||||
|
|
||||||
#include "libslic3r/Model.hpp"
|
#include "libslic3r/Model.hpp"
|
||||||
|
@ -275,7 +275,8 @@ void GizmoObjectManipulation::change_position_value(int axis, double value)
|
||||||
Selection& selection = m_glcanvas.get_selection();
|
Selection& selection = m_glcanvas.get_selection();
|
||||||
selection.start_dragging();
|
selection.start_dragging();
|
||||||
selection.translate(position - m_cache.position, selection.requires_local_axes());
|
selection.translate(position - m_cache.position, selection.requires_local_axes());
|
||||||
m_glcanvas.do_move(L("Set Position"));
|
wxGetApp().plater()->take_snapshot(_u8L("Set Position"), UndoRedo::SnapshotType::GizmoAction);
|
||||||
|
m_glcanvas.do_move("");
|
||||||
|
|
||||||
m_cache.position = position;
|
m_cache.position = position;
|
||||||
m_cache.position_rounded(axis) = DBL_MAX;
|
m_cache.position_rounded(axis) = DBL_MAX;
|
||||||
|
@ -305,7 +306,8 @@ void GizmoObjectManipulation::change_rotation_value(int axis, double value)
|
||||||
selection.rotate(
|
selection.rotate(
|
||||||
(M_PI / 180.0) * (transformation_type.absolute() ? rotation : rotation - m_cache.rotation),
|
(M_PI / 180.0) * (transformation_type.absolute() ? rotation : rotation - m_cache.rotation),
|
||||||
transformation_type);
|
transformation_type);
|
||||||
m_glcanvas.do_rotate(L("Set Orientation"));
|
wxGetApp().plater()->take_snapshot(_u8L("Set Orientation"), UndoRedo::SnapshotType::GizmoAction);
|
||||||
|
m_glcanvas.do_rotate("");
|
||||||
|
|
||||||
m_cache.rotation = rotation;
|
m_cache.rotation = rotation;
|
||||||
m_cache.rotation_rounded(axis) = DBL_MAX;
|
m_cache.rotation_rounded(axis) = DBL_MAX;
|
||||||
|
@ -422,7 +424,8 @@ void GizmoObjectManipulation::reset_position_value()
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Copy position values from GLVolumes into Model (ModelInstance / ModelVolume), trigger background processing.
|
// Copy position values from GLVolumes into Model (ModelInstance / ModelVolume), trigger background processing.
|
||||||
m_glcanvas.do_move(L("Reset Position"));
|
wxGetApp().plater()->take_snapshot(_u8L("Reset Position"), UndoRedo::SnapshotType::GizmoAction);
|
||||||
|
m_glcanvas.do_move("");
|
||||||
|
|
||||||
UpdateAndShow(true);
|
UpdateAndShow(true);
|
||||||
}
|
}
|
||||||
|
@ -448,7 +451,8 @@ void GizmoObjectManipulation::reset_rotation_value()
|
||||||
selection.synchronize_unselected_instances(Selection::SYNC_ROTATION_GENERAL);
|
selection.synchronize_unselected_instances(Selection::SYNC_ROTATION_GENERAL);
|
||||||
selection.synchronize_unselected_volumes();
|
selection.synchronize_unselected_volumes();
|
||||||
// Copy rotation values from GLVolumes into Model (ModelInstance / ModelVolume), trigger background processing.
|
// Copy rotation values from GLVolumes into Model (ModelInstance / ModelVolume), trigger background processing.
|
||||||
m_glcanvas.do_rotate(L("Reset Rotation"));
|
wxGetApp().plater()->take_snapshot(_u8L("Reset Rotation"), UndoRedo::SnapshotType::GizmoAction);
|
||||||
|
m_glcanvas.do_rotate("");
|
||||||
|
|
||||||
UpdateAndShow(true);
|
UpdateAndShow(true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3137,11 +3137,13 @@ void Plater::priv::update(unsigned int flags)
|
||||||
// Update the SLAPrint from the current Model, so that the reload_scene()
|
// Update the SLAPrint from the current Model, so that the reload_scene()
|
||||||
// pulls the correct data.
|
// pulls the correct data.
|
||||||
update_status = this->update_background_process(false, flags & (unsigned int)UpdateParams::POSTPONE_VALIDATION_ERROR_MESSAGE);
|
update_status = this->update_background_process(false, flags & (unsigned int)UpdateParams::POSTPONE_VALIDATION_ERROR_MESSAGE);
|
||||||
//BBS TODO reload_scene
|
//BBS reload_scene
|
||||||
|
if (wxGetApp().plater() && wxGetApp().plater()->canvas3D()->get_canvas_type() == GLCanvas3D::ECanvasType::CanvasAssembleView) { // BBS assemble view
|
||||||
|
this->assemble_view->reload_scene(false, flags);
|
||||||
|
} else {
|
||||||
this->view3D->reload_scene(false, flags & (unsigned int) UpdateParams::FORCE_FULL_SCREEN_REFRESH);
|
this->view3D->reload_scene(false, flags & (unsigned int) UpdateParams::FORCE_FULL_SCREEN_REFRESH);
|
||||||
this->preview->reload_print();
|
this->preview->reload_print();
|
||||||
//BBS assemble view
|
}
|
||||||
this->assemble_view->reload_scene(false, flags);
|
|
||||||
|
|
||||||
if (current_panel && q->is_preview_shown()) {
|
if (current_panel && q->is_preview_shown()) {
|
||||||
q->force_update_all_plate_thumbnails();
|
q->force_update_all_plate_thumbnails();
|
||||||
|
|
|
@ -1071,11 +1071,14 @@ void Selection::translate(const Vec3d &displacement, bool local)
|
||||||
else if (translation_type == Volume)
|
else if (translation_type == Volume)
|
||||||
synchronize_unselected_volumes();
|
synchronize_unselected_volumes();
|
||||||
#endif // !DISABLE_INSTANCES_SYNCH
|
#endif // !DISABLE_INSTANCES_SYNCH
|
||||||
|
if (wxGetApp().plater()->canvas3D()->get_canvas_type() != GLCanvas3D::ECanvasType::CanvasAssembleView) {
|
||||||
ensure_not_below_bed();
|
ensure_not_below_bed();
|
||||||
|
}
|
||||||
set_bounding_boxes_dirty();
|
set_bounding_boxes_dirty();
|
||||||
|
if (wxGetApp().plater()->canvas3D()->get_canvas_type() != GLCanvas3D::ECanvasType::CanvasAssembleView) {
|
||||||
wxGetApp().plater()->canvas3D()->requires_check_outside_state();
|
wxGetApp().plater()->canvas3D()->requires_check_outside_state();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Rotate an object around one of the axes. Only one rotation component is expected to be changing.
|
// Rotate an object around one of the axes. Only one rotation component is expected to be changing.
|
||||||
void Selection::rotate(const Vec3d& rotation, TransformationType transformation_type)
|
void Selection::rotate(const Vec3d& rotation, TransformationType transformation_type)
|
||||||
|
@ -1188,8 +1191,10 @@ void Selection::rotate(const Vec3d& rotation, TransformationType transformation_
|
||||||
}
|
}
|
||||||
|
|
||||||
set_bounding_boxes_dirty();
|
set_bounding_boxes_dirty();
|
||||||
|
if (wxGetApp().plater()->canvas3D()->get_canvas_type() != GLCanvas3D::ECanvasType::CanvasAssembleView) {
|
||||||
wxGetApp().plater()->canvas3D()->requires_check_outside_state();
|
wxGetApp().plater()->canvas3D()->requires_check_outside_state();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Selection::flattening_rotate(const Vec3d& normal)
|
void Selection::flattening_rotate(const Vec3d& normal)
|
||||||
{
|
{
|
||||||
|
@ -1303,8 +1308,10 @@ void Selection::scale(const Vec3d& scale, TransformationType transformation_type
|
||||||
|
|
||||||
ensure_on_bed();
|
ensure_on_bed();
|
||||||
set_bounding_boxes_dirty();
|
set_bounding_boxes_dirty();
|
||||||
|
if (wxGetApp().plater()->canvas3D()->get_canvas_type() != GLCanvas3D::ECanvasType::CanvasAssembleView) {
|
||||||
wxGetApp().plater()->canvas3D()->requires_check_outside_state();
|
wxGetApp().plater()->canvas3D()->requires_check_outside_state();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#if ENABLE_ENHANCED_PRINT_VOLUME_FIT
|
#if ENABLE_ENHANCED_PRINT_VOLUME_FIT
|
||||||
void Selection::scale_to_fit_print_volume(const BuildVolume& volume)
|
void Selection::scale_to_fit_print_volume(const BuildVolume& volume)
|
||||||
|
|
Loading…
Reference in New Issue