NEW:support jump to specific layer in preview

Change-Id: Ia2396c3512f521e31e440783e2ce12926f1ddeca
This commit is contained in:
liz.li 2022-11-03 16:56:17 +08:00 committed by Lane.Wei
parent d91fe4e38c
commit 8278be8d26
5 changed files with 176 additions and 30 deletions

View file

@ -2809,11 +2809,21 @@ void GLCanvas3D::on_key(wxKeyEvent& evt)
IMSlider *m_layers_slider = get_gcode_viewer().get_layers_slider(); IMSlider *m_layers_slider = get_gcode_viewer().get_layers_slider();
IMSlider *m_moves_slider = get_gcode_viewer().get_moves_slider(); IMSlider *m_moves_slider = get_gcode_viewer().get_moves_slider();
if (evt.CmdDown() || evt.ShiftDown()) { if (evt.CmdDown() || evt.ShiftDown()) {
if (evt.GetKeyCode() == 'G') {
m_layers_slider->show_go_to_layer(true);
}
IMSlider *m_layers_slider = get_gcode_viewer().get_layers_slider(); IMSlider *m_layers_slider = get_gcode_viewer().get_layers_slider();
IMSlider *m_moves_slider = get_gcode_viewer().get_moves_slider(); IMSlider *m_moves_slider = get_gcode_viewer().get_moves_slider();
if (keyCode == WXK_UP || keyCode == WXK_DOWN) { if (keyCode == WXK_UP || keyCode == WXK_DOWN) {
const int new_pos = keyCode == WXK_UP ? m_layers_slider->GetHigherValue() + 5 : m_layers_slider->GetHigherValue() - 5; int new_pos;
m_layers_slider->SetHigherValue(new_pos); if (m_layers_slider->GetSelection() == ssHigher) {
new_pos = keyCode == WXK_UP ? m_layers_slider->GetHigherValue() + 5 : m_layers_slider->GetHigherValue() - 5;
m_layers_slider->SetHigherValue(new_pos);
}
else if (m_layers_slider->GetSelection() == ssLower) {
new_pos = keyCode == WXK_UP ? m_layers_slider->GetLowerValue() + 5 : m_layers_slider->GetLowerValue() - 5;
m_layers_slider->SetLowerValue(new_pos);
}
if (m_layers_slider->is_one_layer()) m_layers_slider->SetLowerValue(m_layers_slider->GetHigherValue()); if (m_layers_slider->is_one_layer()) m_layers_slider->SetLowerValue(m_layers_slider->GetHigherValue());
// BBS set as dirty, update in render_gcode() // BBS set as dirty, update in render_gcode()
m_layers_slider->set_as_dirty(); m_layers_slider->set_as_dirty();
@ -2825,8 +2835,15 @@ void GLCanvas3D::on_key(wxKeyEvent& evt)
} }
} }
else if (keyCode == WXK_UP || keyCode == WXK_DOWN) { else if (keyCode == WXK_UP || keyCode == WXK_DOWN) {
const int new_pos = keyCode == WXK_UP ? m_layers_slider->GetHigherValue() + 1 : m_layers_slider->GetHigherValue() - 1; int new_pos;
m_layers_slider->SetHigherValue(new_pos); if (m_layers_slider->GetSelection() == ssHigher) {
new_pos = keyCode == WXK_UP ? m_layers_slider->GetHigherValue() + 1 : m_layers_slider->GetHigherValue() - 1;
m_layers_slider->SetHigherValue(new_pos);
}
else if (m_layers_slider->GetSelection() == ssLower) {
new_pos = keyCode == WXK_UP ? m_layers_slider->GetLowerValue() + 1 : m_layers_slider->GetLowerValue() - 1;
m_layers_slider->SetLowerValue(new_pos);
}
if (m_layers_slider->is_one_layer()) m_layers_slider->SetLowerValue(m_layers_slider->GetHigherValue()); if (m_layers_slider->is_one_layer()) m_layers_slider->SetLowerValue(m_layers_slider->GetHigherValue());
// BBS set as dirty, update in render_gcode() // BBS set as dirty, update in render_gcode()
m_layers_slider->set_as_dirty(); m_layers_slider->set_as_dirty();

View file

@ -1223,6 +1223,8 @@ bool IMSlider::render(int canvas_width, int canvas_height)
render_input_custom_gcode(); render_input_custom_gcode();
render_go_to_layer_dialog();
if (is_horizontal()) { if (is_horizontal()) {
float pos_x = std::max(LEFT_MARGIN, 0.2f * canvas_width); float pos_x = std::max(LEFT_MARGIN, 0.2f * canvas_width);
float pos_y = (canvas_height - HORIZONTAL_SLIDER_SIZE.y * m_scale); float pos_y = (canvas_height - HORIZONTAL_SLIDER_SIZE.y * m_scale);
@ -1282,11 +1284,12 @@ void IMSlider::render_input_custom_gcode()
return; return;
ImGuiWrapper& imgui = *wxGetApp().imgui(); ImGuiWrapper& imgui = *wxGetApp().imgui();
static bool move_to_center = true; static bool move_to_center = true;
static bool set_focus_when_appearing = true;
if (move_to_center) { if (move_to_center) {
move_to_center = false;
auto pos_x = wxGetApp().plater()->get_current_canvas3D()->get_canvas_size().get_width() / 2; auto pos_x = wxGetApp().plater()->get_current_canvas3D()->get_canvas_size().get_width() / 2;
auto pos_y = wxGetApp().plater()->get_current_canvas3D()->get_canvas_size().get_height() / 2; auto pos_y = wxGetApp().plater()->get_current_canvas3D()->get_canvas_size().get_height() / 2;
imgui.set_next_window_pos(pos_x, pos_y, ImGuiCond_Always, 0.5f, 0.5f); imgui.set_next_window_pos(pos_x, pos_y, ImGuiCond_Always, 0.5f, 0.5f);
move_to_center = false;
} }
imgui.push_common_window_style(m_scale); imgui.push_common_window_style(m_scale);
@ -1301,6 +1304,10 @@ void IMSlider::render_input_custom_gcode()
| ImGuiWindowFlags_NoScrollWithMouse; | ImGuiWindowFlags_NoScrollWithMouse;
imgui.begin(_u8L("Custom G-code"), windows_flag); imgui.begin(_u8L("Custom G-code"), windows_flag);
imgui.text(_u8L("Enter Custom G-code used on current layer:")); imgui.text(_u8L("Enter Custom G-code used on current layer:"));
if (set_focus_when_appearing) {
ImGui::SetKeyboardFocusHere(0);
set_focus_when_appearing = false;
}
int text_height = 6; int text_height = 6;
ImGui::InputTextMultiline("##text", m_custom_gcode, sizeof(m_custom_gcode), ImVec2(-1, ImGui::GetTextLineHeight() * text_height)); ImGui::InputTextMultiline("##text", m_custom_gcode, sizeof(m_custom_gcode), ImVec2(-1, ImGui::GetTextLineHeight() * text_height));
//text_height = 5; //text_height = 5;
@ -1311,29 +1318,103 @@ void IMSlider::render_input_custom_gcode()
ImGui::NewLine(); ImGui::NewLine();
ImGui::SameLine(ImGui::GetStyle().WindowPadding.x * 14); ImGui::SameLine(ImGui::GetStyle().WindowPadding.x * 14);
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.f / 255.f, 174.f / 255.f, 66.f / 255.f, 1.f)); imgui.push_confirm_button_style();
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(61.f / 255.f, 203.f / 255.f, 115.f / 255.f, 1.f));
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(27.f / 255.f, 136.f / 255.f, 68.f / 255.f, 1.f));
ImGui::PushStyleColor(ImGuiCol_CheckMark, ImVec4(1.f, 1.f, 1.f, 1.f));
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f));
if (imgui.bbl_button(_L("OK"))) { if (imgui.bbl_button(_L("OK"))) {
m_show_custom_gcode_window = false; m_show_custom_gcode_window = false;
add_custom_gcode(m_custom_gcode); add_custom_gcode(m_custom_gcode);
move_to_center = true; move_to_center = true;
set_focus_when_appearing = true;
} }
ImGui::PopStyleColor(5); imgui.pop_confirm_button_style();
ImGui::SameLine(); ImGui::SameLine();
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(255.f / 255.f, 255.f / 255.f, 255.f / 255.f, 1.f)); imgui.push_cancel_button_style();
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(238.f / 255.f, 238.f / 255.f, 238.f / 255.f, 1.f));
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(206.f / 255.f, 206.f / 255.f, 206.f / 255.f, 1.f));
ImGui::PushStyleColor(ImGuiCol_CheckMark, ImVec4(0.f, 0.f, 0.f, 1.f));
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(38.f / 255.0f, 46.f / 255.0f, 48.f / 255.0f, 1.00f));
if (imgui.bbl_button(_L("Cancel"))) { if (imgui.bbl_button(_L("Cancel"))) {
m_show_custom_gcode_window = false; m_show_custom_gcode_window = false;
move_to_center = true; move_to_center = true;
set_focus_when_appearing = true;
} }
ImGui::PopStyleColor(5); imgui.pop_cancel_button_style();
imgui.end();
ImGui::PopStyleVar(3);
imgui.pop_common_window_style();
}
void IMSlider::do_go_to_layer(size_t layer_number) {
clamp((int)layer_number, m_min_value, m_max_value);
GetSelection() == ssLower ? SetLowerValue(layer_number) : SetHigherValue(layer_number);
}
void IMSlider::render_go_to_layer_dialog(){
if (!m_show_go_to_layer_dialog)
return;
ImGuiWrapper& imgui = *wxGetApp().imgui();
static bool move_to_center = true;
static bool set_focus_when_appearing = true;
if (move_to_center) {
auto pos_x = wxGetApp().plater()->get_current_canvas3D()->get_canvas_size().get_width() / 2;
auto pos_y = wxGetApp().plater()->get_current_canvas3D()->get_canvas_size().get_height() / 2;
imgui.set_next_window_pos(pos_x, pos_y, ImGuiCond_Always, 0.5f, 0.5f);
move_to_center = false;
}
imgui.push_common_window_style(m_scale);
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 12.f * m_scale);
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(10, 3) * m_scale);
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(10, 7) * m_scale);
int windows_flag =
ImGuiWindowFlags_NoCollapse
| ImGuiWindowFlags_AlwaysAutoResize
| ImGuiWindowFlags_NoResize
| ImGuiWindowFlags_NoScrollbar
| ImGuiWindowFlags_NoScrollWithMouse;
imgui.begin(_u8L("Go to layer"), windows_flag);
imgui.text(_u8L("Layer number") + " (" + std::to_string(m_min_value) + " - " + std::to_string(m_max_value) + "):");
ImGui::PushItemWidth(210 * m_scale);
if (set_focus_when_appearing) {
ImGui::SetKeyboardFocusHere(0);
set_focus_when_appearing = false;
}
ImGui::InputText("##input_layer_number", m_layer_number, sizeof(m_layer_number));
ImGui::NewLine();
ImGui::SameLine(GImGui->Style.WindowPadding.x * 6);
imgui.push_confirm_button_style();
bool disable_button = false;
if (strlen(m_layer_number) == 0)
disable_button = true;
else {
for (size_t i = 0; i< strlen(m_layer_number); i++)
if (!isdigit(m_layer_number[i]))
disable_button = true;
if (!disable_button && (m_min_value > atoi(m_layer_number) || atoi(m_layer_number) > m_max_value))
disable_button = true;
}
if (disable_button) {
ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true);
imgui.push_button_disable_style();
}
if (imgui.bbl_button(_L("OK"))) {
do_go_to_layer(atoi(m_layer_number));
m_show_go_to_layer_dialog = false;
move_to_center = true;
set_focus_when_appearing = true;
}
if (disable_button) {
ImGui::PopItemFlag();
imgui.pop_button_disable_style();
}
imgui.pop_confirm_button_style();
ImGui::SameLine();
imgui.push_cancel_button_style();
if (imgui.bbl_button(_L("Cancel"))) {
m_show_go_to_layer_dialog = false;
move_to_center = true;
set_focus_when_appearing = true;
}
imgui.pop_cancel_button_style();
imgui.end(); imgui.end();
ImGui::PopStyleVar(3); ImGui::PopStyleVar(3);
@ -1354,8 +1435,11 @@ void IMSlider::render_menu()
if (ImGui::BeginPopup("slider_menu_popup")) { if (ImGui::BeginPopup("slider_menu_popup")) {
if ((m_selection == ssLower && GetLowerValueD() == m_zero_layer_height) || (m_selection == ssHigher && GetHigherValueD() == m_zero_layer_height)) if ((m_selection == ssLower && GetLowerValueD() == m_zero_layer_height) || (m_selection == ssHigher && GetHigherValueD() == m_zero_layer_height))
{ {
menu_item_with_icon(_u8L("Add Pause").c_str(), "", ImVec2(0, 0), 0, false, false); if (menu_item_with_icon(_u8L("Jump to Layer").c_str(), "")) {
}else m_show_go_to_layer_dialog = true;
}
}
else
{ {
if (menu_item_with_icon(_u8L("Add Pause").c_str(), "")) { if (menu_item_with_icon(_u8L("Add Pause").c_str(), "")) {
add_code_as_tick(PausePrint); add_code_as_tick(PausePrint);
@ -1368,6 +1452,9 @@ void IMSlider::render_menu()
add_code_as_tick(Template); add_code_as_tick(Template);
} }
} }
if (menu_item_with_icon(_u8L("Jump to Layer").c_str(), "")) {
m_show_go_to_layer_dialog = true;
}
} }
//BBS render this menu item only when extruder_num > 1 //BBS render this menu item only when extruder_num > 1

View file

@ -261,18 +261,13 @@ public:
void UseDefaultColors(bool def_colors_on) { m_ticks.set_default_colors(def_colors_on); } void UseDefaultColors(bool def_colors_on) { m_ticks.set_default_colors(def_colors_on); }
void add_custom_gcode(std::string custom_gcode);
void add_code_as_tick(Type type, int selected_extruder = -1);
void post_ticks_changed_event(Type type = Custom); void post_ticks_changed_event(Type type = Custom);
bool check_ticks_changed_event(Type type); bool check_ticks_changed_event(Type type);
bool switch_one_layer_mode(); bool switch_one_layer_mode();
void show_go_to_layer(bool show) { m_show_go_to_layer_dialog = show; }
bool render(int canvas_width, int canvas_height); bool render(int canvas_width, int canvas_height);
void render_menu();
void render_input_custom_gcode();
//BBS update scroll value changed //BBS update scroll value changed
bool is_dirty() { return m_dirty; } bool is_dirty() { return m_dirty; }
void set_as_dirty(bool dirty = true) { m_dirty = dirty; } void set_as_dirty(bool dirty = true) { m_dirty = dirty; }
@ -286,10 +281,17 @@ public:
ExtrudersSequence m_extruders_sequence; ExtrudersSequence m_extruders_sequence;
float m_scale = 1.0; float m_scale = 1.0;
void set_scale(float scale = 1.0); void set_scale(float scale = 1.0);
protected: protected:
void add_custom_gcode(std::string custom_gcode);
void add_code_as_tick(Type type, int selected_extruder = -1);
void do_go_to_layer(size_t layer_number);
void correct_lower_value(); void correct_lower_value();
void correct_higher_value(); void correct_higher_value();
bool horizontal_slider(const char* str_id, int* v, int v_min, int v_max, const ImVec2& pos, const ImVec2& size, float scale = 1.0); bool horizontal_slider(const char* str_id, int* v, int v_min, int v_max, const ImVec2& pos, const ImVec2& size, float scale = 1.0);
void render_go_to_layer_dialog();
void render_input_custom_gcode();
void render_menu();
void draw_background(const ImRect& groove); void draw_background(const ImRect& groove);
void draw_colored_band(const ImRect& groove, const ImRect& slideable_region); void draw_colored_band(const ImRect& groove, const ImRect& slideable_region);
void draw_ticks(const ImRect& slideable_region); void draw_ticks(const ImRect& slideable_region);
@ -305,8 +307,6 @@ private:
int get_tick_from_value(double value, bool force_lower_bound = false); int get_tick_from_value(double value, bool force_lower_bound = false);
float get_pos_from_value(int v_min, int v_max, int value, const ImRect& rect); float get_pos_from_value(int v_min, int v_max, int value, const ImRect& rect);
std::string get_color_for_tool_change_tick(std::set<TickCode>::const_iterator it) const; std::string get_color_for_tool_change_tick(std::set<TickCode>::const_iterator it) const;
// Get active extruders for tick. // Get active extruders for tick.
// Means one current extruder for not existing tick OR // Means one current extruder for not existing tick OR
@ -331,6 +331,7 @@ private:
bool m_is_focused = false; bool m_is_focused = false;
bool m_show_menu = false; bool m_show_menu = false;
bool m_show_custom_gcode_window = false; bool m_show_custom_gcode_window = false;
bool m_show_go_to_layer_dialog = false;
bool m_force_mode_apply = true; bool m_force_mode_apply = true;
bool m_enable_action_icon = true; bool m_enable_action_icon = true;
bool m_enable_cog_icon = false; bool m_enable_cog_icon = false;
@ -373,6 +374,7 @@ private:
std::vector<double> m_alternate_values; std::vector<double> m_alternate_values;
char m_custom_gcode[1024] = { 0 }; char m_custom_gcode[1024] = { 0 };
char m_layer_number[64] = { 0 };
}; };
} }

View file

@ -1694,9 +1694,9 @@ void ImGuiWrapper::push_common_window_style(const float scale) {
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 3.0f * scale); ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 3.0f * scale);
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(38 / 255.0f, 46 / 255.0f, 48 / 255.0f, 1.00f)); // 1 ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(38 / 255.0f, 46 / 255.0f, 48 / 255.0f, 1.00f)); // 1
ImGui::PushStyleColor(ImGuiCol_WindowBg, ImGuiWrapper::COL_WINDOW_BG); // 2 ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(1.00f, 1.00f, 1.00f, 1.00f)); // 2
ImGui::PushStyleColor(ImGuiCol_TitleBg, ImGuiWrapper::COL_TITLE_BG); // 3 ImGui::PushStyleColor(ImGuiCol_TitleBg, ImVec4(245 / 255.0f, 245 / 255.0f, 245 / 255.0f, 1.00f)); // 3
ImGui::PushStyleColor(ImGuiCol_TitleBgActive, ImGuiWrapper::COL_TITLE_BG); // 4 ImGui::PushStyleColor(ImGuiCol_TitleBgActive, ImVec4(245 / 255.0f, 245 / 255.0f, 245 / 255.0f, 1.00f)); // 4
ImGui::PushStyleColor(ImGuiCol_Separator, ImGuiWrapper::COL_SEPARATOR); // 5 ImGui::PushStyleColor(ImGuiCol_Separator, ImGuiWrapper::COL_SEPARATOR); // 5
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1.00f, 1.00f, 1.00f, 1.00f)); // 6 ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1.00f, 1.00f, 1.00f, 1.00f)); // 6
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0.00f, 0.68f, 0.26f, 1.00f)); // 7 ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0.00f, 0.68f, 0.26f, 1.00f)); // 7
@ -1714,6 +1714,40 @@ void ImGuiWrapper::pop_common_window_style() {
ImGui::PopStyleVar(5); ImGui::PopStyleVar(5);
} }
void ImGuiWrapper::push_confirm_button_style() {
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.f / 255.f, 174.f / 255.f, 66.f / 255.f, 1.f));
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(61.f / 255.f, 203.f / 255.f, 115.f / 255.f, 1.f));
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(27.f / 255.f, 136.f / 255.f, 68.f / 255.f, 1.f));
ImGui::PushStyleColor(ImGuiCol_CheckMark, ImVec4(1.f, 1.f, 1.f, 1.f));
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f));
}
void ImGuiWrapper::pop_confirm_button_style() {
ImGui::PopStyleColor(5);
}
void ImGuiWrapper::push_cancel_button_style() {
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(255.f / 255.f, 255.f / 255.f, 255.f / 255.f, 1.f));
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(238.f / 255.f, 238.f / 255.f, 238.f / 255.f, 1.f));
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(206.f / 255.f, 206.f / 255.f, 206.f / 255.f, 1.f));
ImGui::PushStyleColor(ImGuiCol_CheckMark, ImVec4(0.f, 0.f, 0.f, 1.f));
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(38.f / 255.0f, 46.f / 255.0f, 48.f / 255.0f, 1.00f));
}
void ImGuiWrapper::pop_cancel_button_style() {
ImGui::PopStyleColor(5);
}
void ImGuiWrapper::push_button_disable_style() {
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(206.f / 255.f, 206.f / 255.f, 206.f / 255.f, 1.f));
ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(206.f / 255.f, 206.f / 255.f, 206.f / 255.f, 1.f));
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f));
}
void ImGuiWrapper::pop_button_disable_style() {
ImGui::PopStyleColor(3);
}
void ImGuiWrapper::init_font(bool compress) void ImGuiWrapper::init_font(bool compress)
{ {
destroy_font(); destroy_font();

View file

@ -194,6 +194,12 @@ public:
static void pop_menu_style(); static void pop_menu_style();
static void push_common_window_style(const float scale); static void push_common_window_style(const float scale);
static void pop_common_window_style(); static void pop_common_window_style();
static void push_confirm_button_style();
static void pop_confirm_button_style();
static void push_cancel_button_style();
static void pop_cancel_button_style();
static void push_button_disable_style();
static void pop_button_disable_style();
//BBS //BBS
static int TOOLBAR_WINDOW_FLAGS; static int TOOLBAR_WINDOW_FLAGS;