Updated DoubleSlider band. Added smart color selection for M600
This commit is contained in:
parent
c4a62819f4
commit
72852ffab5
6 changed files with 136 additions and 22 deletions
|
@ -5296,13 +5296,13 @@ void GLCanvas3D::_load_gcode_extrusion_paths(const GCodePreviewData& preview_dat
|
||||||
}
|
}
|
||||||
case GCodePreviewData::Extrusion::ColorPrint:
|
case GCodePreviewData::Extrusion::ColorPrint:
|
||||||
{
|
{
|
||||||
// int color_cnt = (int)tool_colors.size() / 4;
|
int color_cnt = (int)tool_colors.size() / 4;
|
||||||
|
|
||||||
// int val = int(value);
|
// int val = int(value);
|
||||||
// while (val >= color_cnt)
|
// while (val >= color_cnt)
|
||||||
// val -= color_cnt;
|
// val -= color_cnt;
|
||||||
|
|
||||||
unsigned int val = unsigned int(value) >= INT_MAX ? tool_colors.size()*4 - 1 : value;
|
int val = value > color_cnt ? color_cnt - 1 : value;
|
||||||
|
|
||||||
GCodePreviewData::Color color;
|
GCodePreviewData::Color color;
|
||||||
::memcpy((void*)color.rgba, (const void*)(tool_colors.data() + val * 4), 4 * sizeof(float));
|
::memcpy((void*)color.rgba, (const void*)(tool_colors.data() + val * 4), 4 * sizeof(float));
|
||||||
|
|
|
@ -887,12 +887,13 @@ void Preview::load_print_as_fff(bool keep_z_range)
|
||||||
// set color print values, if it si selected "ColorPrint" view type
|
// set color print values, if it si selected "ColorPrint" view type
|
||||||
if (m_gcode_preview_data->extrusion.view_type == GCodePreviewData::Extrusion::ColorPrint)
|
if (m_gcode_preview_data->extrusion.view_type == GCodePreviewData::Extrusion::ColorPrint)
|
||||||
{
|
{
|
||||||
colors = wxGetApp().plater()->get_extruder_colors_from_plater_config();
|
|
||||||
color_print_values = wxGetApp().plater()->model().custom_gcode_per_height;
|
color_print_values = wxGetApp().plater()->model().custom_gcode_per_height;
|
||||||
|
/* colors = wxGetApp().plater()->get_extruder_colors_from_plater_config();
|
||||||
|
|
||||||
for (const Model::CustomGCode& code : color_print_values)
|
for (const Model::CustomGCode& code : color_print_values)
|
||||||
if (code.gcode == "M600")
|
if (code.gcode == "M600")
|
||||||
colors.push_back(code.color);
|
colors.push_back(code.color);*/
|
||||||
|
colors = wxGetApp().plater()->get_colors_for_color_print();
|
||||||
colors.push_back("#808080"); // gray color for pause print or custom G-code
|
colors.push_back("#808080"); // gray color for pause print or custom G-code
|
||||||
|
|
||||||
if (gcode_preview_data_valid)
|
if (gcode_preview_data_valid)
|
||||||
|
|
|
@ -4995,6 +4995,17 @@ std::vector<std::string> Plater::get_extruder_colors_from_plater_config() const
|
||||||
return extruder_colors;
|
return extruder_colors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> Plater::get_colors_for_color_print() const
|
||||||
|
{
|
||||||
|
std::vector<std::string> colors = get_extruder_colors_from_plater_config();
|
||||||
|
|
||||||
|
for (const Model::CustomGCode& code : p->model.custom_gcode_per_height)
|
||||||
|
if (code.gcode == "M600")
|
||||||
|
colors.push_back(code.color);
|
||||||
|
|
||||||
|
return colors;
|
||||||
|
}
|
||||||
|
|
||||||
wxString Plater::get_project_filename(const wxString& extension) const
|
wxString Plater::get_project_filename(const wxString& extension) const
|
||||||
{
|
{
|
||||||
return p->get_project_filename(extension);
|
return p->get_project_filename(extension);
|
||||||
|
|
|
@ -221,6 +221,7 @@ public:
|
||||||
void on_activate();
|
void on_activate();
|
||||||
const DynamicPrintConfig* get_plater_config() const;
|
const DynamicPrintConfig* get_plater_config() const;
|
||||||
std::vector<std::string> get_extruder_colors_from_plater_config() const;
|
std::vector<std::string> get_extruder_colors_from_plater_config() const;
|
||||||
|
std::vector<std::string> get_colors_for_color_print() const;
|
||||||
|
|
||||||
void update_object_menu();
|
void update_object_menu();
|
||||||
|
|
||||||
|
|
|
@ -2644,12 +2644,12 @@ void DoubleSlider::render()
|
||||||
// //higher slider:
|
// //higher slider:
|
||||||
// draw_thumb(dc, higher_pos, ssHigher);
|
// draw_thumb(dc, higher_pos, ssHigher);
|
||||||
|
|
||||||
// draw both sliders
|
|
||||||
draw_thumbs(dc, lower_pos, higher_pos);
|
|
||||||
|
|
||||||
//draw color print ticks
|
//draw color print ticks
|
||||||
draw_ticks(dc);
|
draw_ticks(dc);
|
||||||
|
|
||||||
|
// draw both sliders
|
||||||
|
draw_thumbs(dc, lower_pos, higher_pos);
|
||||||
|
|
||||||
//draw lock/unlock
|
//draw lock/unlock
|
||||||
draw_one_layer_icon(dc);
|
draw_one_layer_icon(dc);
|
||||||
|
|
||||||
|
@ -2827,6 +2827,18 @@ void DoubleSlider::draw_ticks(wxDC& dc)
|
||||||
dc.DrawLine(mid - 14, pos/* - 1*/, mid - 9, pos/* - 1*/);
|
dc.DrawLine(mid - 14, pos/* - 1*/, mid - 9, pos/* - 1*/);
|
||||||
is_horizontal() ? dc.DrawLine(pos, mid+14, pos, mid+9) :
|
is_horizontal() ? dc.DrawLine(pos, mid+14, pos, mid+9) :
|
||||||
dc.DrawLine(mid + 14, pos/* - 1*/, mid + 9, pos/* - 1*/);
|
dc.DrawLine(mid + 14, pos/* - 1*/, mid + 9, pos/* - 1*/);
|
||||||
|
|
||||||
|
// Draw icon for "Pause print" or "Extruder change"
|
||||||
|
if (tick.gcode != "M600" && tick.gcode != "tool_change")
|
||||||
|
{
|
||||||
|
wxBitmap icon = create_scaled_bitmap(nullptr, tick.gcode == "M601" ? "pause_add.png" : "add_gcode");
|
||||||
|
|
||||||
|
wxCoord x_draw, y_draw;
|
||||||
|
is_horizontal() ? x_draw = pos - 0.5 * m_tick_icon_dim : y_draw = pos - 0.5 * m_tick_icon_dim;
|
||||||
|
is_horizontal() ? y_draw = mid + 22 : x_draw = mid + 22 ;
|
||||||
|
|
||||||
|
dc.DrawBitmap(icon, x_draw, y_draw);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2853,7 +2865,7 @@ void DoubleSlider::draw_colored_band(wxDC& dc)
|
||||||
|
|
||||||
// #ys_FIXME_COLOR
|
// #ys_FIXME_COLOR
|
||||||
// if (m_ticks.empty()) {
|
// if (m_ticks.empty()) {
|
||||||
if (m_ticks_.empty()) {
|
/*if (m_ticks_.empty()) {
|
||||||
dc.SetPen(GetParent()->GetBackgroundColour());
|
dc.SetPen(GetParent()->GetBackgroundColour());
|
||||||
dc.SetBrush(GetParent()->GetBackgroundColour());
|
dc.SetBrush(GetParent()->GetBackgroundColour());
|
||||||
dc.DrawRectangle(main_band);
|
dc.DrawRectangle(main_band);
|
||||||
|
@ -2886,6 +2898,37 @@ void DoubleSlider::draw_colored_band(wxDC& dc)
|
||||||
dc.SetBrush(clr);
|
dc.SetBrush(clr);
|
||||||
dc.DrawRectangle(main_band);
|
dc.DrawRectangle(main_band);
|
||||||
i++;
|
i++;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
auto draw_band = [](wxDC& dc, const wxColour& clr, const wxRect& band_rc) {
|
||||||
|
dc.SetPen(clr);
|
||||||
|
dc.SetBrush(clr);
|
||||||
|
dc.DrawRectangle(band_rc);
|
||||||
|
};
|
||||||
|
|
||||||
|
const std::vector<std::string>& colors = Slic3r::GUI::wxGetApp().plater()->get_extruder_colors_from_plater_config();
|
||||||
|
int colors_cnt = colors.size();
|
||||||
|
|
||||||
|
const wxColour bg_clr = GetParent()->GetBackgroundColour();
|
||||||
|
|
||||||
|
wxColour clr = m_state == msSingleExtruder ? wxColour(colors[0]) : bg_clr;
|
||||||
|
draw_band(dc, clr, main_band);
|
||||||
|
|
||||||
|
size_t i = 1;
|
||||||
|
for (auto tick : m_ticks_)
|
||||||
|
{
|
||||||
|
if ( (m_state == msSingleExtruder && tick.gcode != "M600") ||
|
||||||
|
(m_state == msMultiExtruderWholePrint && tick.gcode != "tool_change") )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const wxCoord pos = get_position_from_value(tick.tick);
|
||||||
|
is_horizontal() ? main_band.SetLeft(SLIDER_MARGIN + pos) :
|
||||||
|
main_band.SetBottom(pos - 1);
|
||||||
|
|
||||||
|
clr = (m_state == msMultiExtruderWholePrint && tick.color.empty()) ? bg_clr :
|
||||||
|
m_state == msMultiExtruderWholePrint ? wxColour(colors[std::min<int>(colors_cnt - 1, tick.extruder-1)]) : wxColour(tick.color);
|
||||||
|
draw_band(dc, clr, main_band);
|
||||||
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3166,11 +3209,13 @@ wxString DoubleSlider::get_tooltip(IconFocus icon_focus)
|
||||||
const int tick = m_selection == ssLower ? m_lower_value : m_higher_value;
|
const int tick = m_selection == ssLower ? m_lower_value : m_higher_value;
|
||||||
const auto tick_code_it = m_ticks_.find(tick);
|
const auto tick_code_it = m_ticks_.find(tick);
|
||||||
tooltip = tick_code_it == m_ticks_.end() ? _(L("Add color change")) :
|
tooltip = tick_code_it == m_ticks_.end() ? _(L("Add color change")) :
|
||||||
tick_code_it->gcode == "M600" ? _(L("Delete color change")) :
|
// tick_code_it->gcode == "M600" ? _(L("Delete color change")) :
|
||||||
|
tick_code_it->gcode == "M600" ? ( m_state == msSingleExtruder ? _(L("Delete color change")) :
|
||||||
|
from_u8((boost::format(_utf8(L("Delete color change for Extruder %1%"))) % tick_code_it->extruder).str()) ):
|
||||||
tick_code_it->gcode == "M601" ? _(L("Delete pause")) :
|
tick_code_it->gcode == "M601" ? _(L("Delete pause")) :
|
||||||
tick_code_it->gcode == "tool_change" ? ( m_state == msSingleExtruder ? _(L("Delete color change")) :
|
tick_code_it->gcode == "tool_change" ? //( m_state == msSingleExtruder ? _(L("Delete color change")) :
|
||||||
from_u8((boost::format(_utf8(L("Delete extruder change to \"%1%\""))) % tick_code_it->extruder).str()) ) :
|
from_u8((boost::format(_utf8(L("Delete extruder change to \"%1%\""))) % tick_code_it->extruder).str()) /*) */:
|
||||||
from_u8((boost::format(_utf8(L("Delete \"%1%\" code"))) % tick_code_it->gcode).str());
|
from_u8((boost::format(_utf8(L("Delete \"%1%\" code"))) % tick_code_it->gcode).str());
|
||||||
}
|
}
|
||||||
|
|
||||||
return tooltip;
|
return tooltip;
|
||||||
|
@ -3441,12 +3486,19 @@ void DoubleSlider::OnRightDown(wxMouseEvent& event)
|
||||||
// if on this Y doesn't exist tick
|
// if on this Y doesn't exist tick
|
||||||
// #ys_FIXME_COLOR
|
// #ys_FIXME_COLOR
|
||||||
// if (m_ticks.find(tick) == m_ticks.end())
|
// if (m_ticks.find(tick) == m_ticks.end())
|
||||||
if (m_ticks_.find(tick) == m_ticks_.end())
|
auto it = m_ticks_.find(tick);
|
||||||
|
if (it == m_ticks_.end())
|
||||||
{
|
{
|
||||||
// show context menu on OnRightUp()
|
// show context menu on OnRightUp()
|
||||||
m_show_context_menu = true;
|
m_show_context_menu = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (it->gcode == "M600")
|
||||||
|
{
|
||||||
|
// show "Edit color" or "Delete color change" menu on OnRightUp()
|
||||||
|
m_show_edit_color_menu = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
detect_selected_slider(event.GetLogicalPosition(dc));
|
detect_selected_slider(event.GetLogicalPosition(dc));
|
||||||
|
@ -3469,15 +3521,17 @@ void DoubleSlider::OnRightDown(wxMouseEvent& event)
|
||||||
int DoubleSlider::get_extruder_for_tick(int tick)
|
int DoubleSlider::get_extruder_for_tick(int tick)
|
||||||
{
|
{
|
||||||
int extruder = 0;
|
int extruder = 0;
|
||||||
if (!m_ticks_.empty()) {
|
if (m_ticks_.empty())
|
||||||
auto tick_code_it = m_ticks_.lower_bound(tick);
|
return 0;
|
||||||
if (tick_code_it != m_ticks_.begin()) {
|
|
||||||
--tick_code_it;
|
auto it = m_ticks_.lower_bound(tick);
|
||||||
extruder = tick_code_it->extruder;
|
while (it != m_ticks_.begin()) {
|
||||||
}
|
--it;
|
||||||
|
if(it->gcode == "tool_change")
|
||||||
|
return it->extruder;
|
||||||
}
|
}
|
||||||
|
|
||||||
return extruder;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DoubleSlider::OnRightUp(wxMouseEvent& event)
|
void DoubleSlider::OnRightUp(wxMouseEvent& event)
|
||||||
|
@ -3535,6 +3589,19 @@ void DoubleSlider::OnRightUp(wxMouseEvent& event)
|
||||||
|
|
||||||
m_show_context_menu = false;
|
m_show_context_menu = false;
|
||||||
}
|
}
|
||||||
|
else if (m_show_edit_color_menu) {
|
||||||
|
wxMenu menu;
|
||||||
|
|
||||||
|
append_menu_item(&menu, wxID_ANY, _(L("Edit color")), "",
|
||||||
|
[this](wxCommandEvent&) { edit_color(); }, "change_extruder", &menu);
|
||||||
|
|
||||||
|
append_menu_item(&menu, wxID_ANY, _(L("Delete color change")), "",
|
||||||
|
[this](wxCommandEvent&) { action_tick(taDel); }, "colorchange_delete_off.png", &menu);
|
||||||
|
|
||||||
|
Slic3r::GUI::wxGetApp().plater()->PopupMenu(&menu);
|
||||||
|
|
||||||
|
m_show_edit_color_menu = false;
|
||||||
|
}
|
||||||
|
|
||||||
Refresh();
|
Refresh();
|
||||||
Update();
|
Update();
|
||||||
|
@ -3561,7 +3628,7 @@ static std::string get_new_color(const std::string& color)
|
||||||
void DoubleSlider::add_code(std::string code, int selected_extruder/* = -1*/)
|
void DoubleSlider::add_code(std::string code, int selected_extruder/* = -1*/)
|
||||||
{
|
{
|
||||||
const int tick = m_selection == ssLower ? m_lower_value : m_higher_value;
|
const int tick = m_selection == ssLower ? m_lower_value : m_higher_value;
|
||||||
// if on this Y doesn't exist tick
|
// if on this Z doesn't exist tick
|
||||||
auto it = m_ticks_.find(tick);
|
auto it = m_ticks_.find(tick);
|
||||||
if (it == m_ticks_.end())
|
if (it == m_ticks_.end())
|
||||||
{
|
{
|
||||||
|
@ -3569,7 +3636,20 @@ void DoubleSlider::add_code(std::string code, int selected_extruder/* = -1*/)
|
||||||
if (code == "M600")
|
if (code == "M600")
|
||||||
{
|
{
|
||||||
std::vector<std::string> colors = Slic3r::GUI::wxGetApp().plater()->get_extruder_colors_from_plater_config();
|
std::vector<std::string> colors = Slic3r::GUI::wxGetApp().plater()->get_extruder_colors_from_plater_config();
|
||||||
color = get_new_color(colors[selected_extruder > 0 ? selected_extruder-1 : 0]);
|
|
||||||
|
if (m_state == msSingleExtruder && !m_ticks_.empty()) {
|
||||||
|
auto before_tick_it = std::lower_bound(m_ticks_.begin(), m_ticks_.end(), tick);
|
||||||
|
if (before_tick_it == m_ticks_.begin())
|
||||||
|
color = colors[0];
|
||||||
|
else {
|
||||||
|
--before_tick_it;
|
||||||
|
color = before_tick_it->color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
color = colors[selected_extruder > 0 ? selected_extruder-1 : 0];
|
||||||
|
|
||||||
|
color = get_new_color(color);
|
||||||
if (color.empty())
|
if (color.empty())
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -3606,6 +3686,25 @@ void DoubleSlider::add_code(std::string code, int selected_extruder/* = -1*/)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DoubleSlider::edit_color()
|
||||||
|
{
|
||||||
|
const int tick = m_selection == ssLower ? m_lower_value : m_higher_value;
|
||||||
|
// if on this Z exists tick
|
||||||
|
std::set<TICK_CODE>::iterator it = m_ticks_.find(tick);
|
||||||
|
if (it != m_ticks_.end())
|
||||||
|
{
|
||||||
|
std::string color = get_new_color(it->color);
|
||||||
|
if (color.empty())
|
||||||
|
return;
|
||||||
|
TICK_CODE changed_tick = *it;
|
||||||
|
changed_tick.color = color;
|
||||||
|
m_ticks_.erase(it);
|
||||||
|
m_ticks_.insert(changed_tick);
|
||||||
|
|
||||||
|
wxPostEvent(this->GetParent(), wxCommandEvent(wxCUSTOMEVT_TICKSCHANGED));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void DoubleSlider::change_extruder(int extruder)
|
void DoubleSlider::change_extruder(int extruder)
|
||||||
{
|
{
|
||||||
const int tick = m_selection == ssLower ? m_lower_value : m_higher_value;
|
const int tick = m_selection == ssLower ? m_lower_value : m_higher_value;
|
||||||
|
|
|
@ -854,6 +854,7 @@ public:
|
||||||
int get_extruder_for_tick(int tick);
|
int get_extruder_for_tick(int tick);
|
||||||
void OnRightUp(wxMouseEvent& event);
|
void OnRightUp(wxMouseEvent& event);
|
||||||
void add_code(std::string code, int selected_extruder = -1);
|
void add_code(std::string code, int selected_extruder = -1);
|
||||||
|
void edit_color();
|
||||||
void change_extruder(int extruder);
|
void change_extruder(int extruder);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -922,6 +923,7 @@ private:
|
||||||
bool m_is_one_layer_icon_focesed = false;
|
bool m_is_one_layer_icon_focesed = false;
|
||||||
bool m_is_enabled_tick_manipulation = true;
|
bool m_is_enabled_tick_manipulation = true;
|
||||||
bool m_show_context_menu = false;
|
bool m_show_context_menu = false;
|
||||||
|
bool m_show_edit_color_menu = false;
|
||||||
bool m_suppress_add_code = false;
|
bool m_suppress_add_code = false;
|
||||||
ManipulationState m_state = msSingleExtruder;
|
ManipulationState m_state = msSingleExtruder;
|
||||||
wxString m_custom_gcode = wxEmptyString;
|
wxString m_custom_gcode = wxEmptyString;
|
||||||
|
|
Loading…
Reference in a new issue