mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-05-12 14:28:11 +08:00
GCode Preview - Added Custom extrusion role + extended layers range for GCode preview
This commit is contained in:
parent
36601723a2
commit
81eff20ad1
@ -2051,4 +2051,11 @@ sub reset_legend_texture {
|
|||||||
Slic3r::GUI::_3DScene::reset_legend_texture();
|
Slic3r::GUI::_3DScene::reset_legend_texture();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub get_current_print_zs {
|
||||||
|
my ($self) = @_;
|
||||||
|
|
||||||
|
my $count = $self->volumes->get_current_print_zs();
|
||||||
|
return $count;
|
||||||
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -75,7 +75,7 @@ sub new {
|
|||||||
my $combochecklist_features = $self->{combochecklist_features} = Wx::ComboCtrl->new();
|
my $combochecklist_features = $self->{combochecklist_features} = Wx::ComboCtrl->new();
|
||||||
$combochecklist_features->Create($self, -1, "Feature types", wxDefaultPosition, [200, -1], wxCB_READONLY);
|
$combochecklist_features->Create($self, -1, "Feature types", wxDefaultPosition, [200, -1], wxCB_READONLY);
|
||||||
my $feature_text = "Feature types";
|
my $feature_text = "Feature types";
|
||||||
my $feature_items = "Perimeter|External perimeter|Overhang perimeter|Internal infill|Solid infill|Top solid infill|Bridge infill|Gap fill|Skirt|Support material|Support material interface|Wipe tower";
|
my $feature_items = "Perimeter|External perimeter|Overhang perimeter|Internal infill|Solid infill|Top solid infill|Bridge infill|Gap fill|Skirt|Support material|Support material interface|Wipe tower|Custom";
|
||||||
Slic3r::GUI::create_combochecklist($combochecklist_features, $feature_text, $feature_items, 1);
|
Slic3r::GUI::create_combochecklist($combochecklist_features, $feature_text, $feature_items, 1);
|
||||||
|
|
||||||
my $checkbox_travel = $self->{checkbox_travel} = Wx::CheckBox->new($self, -1, "Travel");
|
my $checkbox_travel = $self->{checkbox_travel} = Wx::CheckBox->new($self, -1, "Travel");
|
||||||
@ -251,6 +251,7 @@ sub new {
|
|||||||
'Support material' => '00FF00',
|
'Support material' => '00FF00',
|
||||||
'Support material interface' => '008000',
|
'Support material interface' => '008000',
|
||||||
'Wipe tower' => 'B3E3AB',
|
'Wipe tower' => 'B3E3AB',
|
||||||
|
'Custom' => 'FFFF00',
|
||||||
);
|
);
|
||||||
$self->gcode_preview_data->set_extrusion_paths_colors(\@extrusion_roles_colors);
|
$self->gcode_preview_data->set_extrusion_paths_colors(\@extrusion_roles_colors);
|
||||||
|
|
||||||
@ -318,30 +319,8 @@ sub load_print {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
my $z_idx_low = $self->slider_low->GetValue;
|
# used to set the sliders to the extremes of the current zs range
|
||||||
my $z_idx_high = $self->slider_high->GetValue;
|
$self->{force_sliders_full_range} = 0;
|
||||||
$self->enabled(1);
|
|
||||||
$self->slider_low->SetRange(0, $n_layers - 1);
|
|
||||||
$self->slider_high->SetRange(0, $n_layers - 1);
|
|
||||||
if ($z_idx_high < $n_layers && ($self->single_layer || $z_idx_high != 0)) {
|
|
||||||
# use $z_idx
|
|
||||||
} else {
|
|
||||||
# Out of range. Disable 'single layer' view.
|
|
||||||
$self->single_layer(0);
|
|
||||||
$self->{checkbox_singlelayer}->SetValue(0);
|
|
||||||
$z_idx_low = 0;
|
|
||||||
$z_idx_high = $n_layers - 1;
|
|
||||||
}
|
|
||||||
if ($self->single_layer) {
|
|
||||||
$z_idx_low = $z_idx_high;
|
|
||||||
} elsif ($z_idx_low > $z_idx_high) {
|
|
||||||
$z_idx_low = 0;
|
|
||||||
}
|
|
||||||
$self->slider_low->SetValue($z_idx_low);
|
|
||||||
$self->slider_high->SetValue($z_idx_high);
|
|
||||||
$self->slider_low->Show;
|
|
||||||
$self->slider_high->Show;
|
|
||||||
$self->Layout;
|
|
||||||
|
|
||||||
if ($self->{preferred_color_mode} eq 'tool_or_feature') {
|
if ($self->{preferred_color_mode} eq 'tool_or_feature') {
|
||||||
# It is left to Slic3r to decide whether the print shall be colored by the tool or by the feature.
|
# It is left to Slic3r to decide whether the print shall be colored by the tool or by the feature.
|
||||||
@ -380,16 +359,58 @@ sub load_print {
|
|||||||
}
|
}
|
||||||
$self->show_hide_ui_elements('simple');
|
$self->show_hide_ui_elements('simple');
|
||||||
} else {
|
} else {
|
||||||
|
$self->{force_sliders_full_range} = (scalar(@{$self->canvas->volumes}) == 0) && $self->auto_zoom;
|
||||||
$self->canvas->load_gcode_preview($self->print, $self->gcode_preview_data, \@colors);
|
$self->canvas->load_gcode_preview($self->print, $self->gcode_preview_data, \@colors);
|
||||||
$self->show_hide_ui_elements('full');
|
$self->show_hide_ui_elements('full');
|
||||||
|
|
||||||
|
# recalculates zs and update sliders accordingly
|
||||||
|
$self->{layers_z} = $self->canvas->get_current_print_zs();
|
||||||
|
$n_layers = scalar(@{$self->{layers_z}});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$self->update_sliders($n_layers);
|
||||||
|
|
||||||
if ($self->auto_zoom) {
|
if ($self->auto_zoom) {
|
||||||
$self->canvas->zoom_to_volumes;
|
$self->canvas->zoom_to_volumes;
|
||||||
}
|
}
|
||||||
$self->_loaded(1);
|
$self->_loaded(1);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub update_sliders
|
||||||
|
{
|
||||||
|
my ($self, $n_layers) = @_;
|
||||||
|
|
||||||
|
my $z_idx_low = $self->slider_low->GetValue;
|
||||||
|
my $z_idx_high = $self->slider_high->GetValue;
|
||||||
|
$self->enabled(1);
|
||||||
|
$self->slider_low->SetRange(0, $n_layers - 1);
|
||||||
|
$self->slider_high->SetRange(0, $n_layers - 1);
|
||||||
|
|
||||||
|
if ($self->{force_sliders_full_range}) {
|
||||||
|
$z_idx_low = 0;
|
||||||
|
$z_idx_high = $n_layers - 1;
|
||||||
|
} elsif ($z_idx_high < $n_layers && ($self->single_layer || $z_idx_high != 0)) {
|
||||||
|
# use $z_idx
|
||||||
|
} else {
|
||||||
|
# Out of range. Disable 'single layer' view.
|
||||||
|
$self->single_layer(0);
|
||||||
|
$self->{checkbox_singlelayer}->SetValue(0);
|
||||||
|
$z_idx_low = 0;
|
||||||
|
$z_idx_high = $n_layers - 1;
|
||||||
|
}
|
||||||
|
if ($self->single_layer) {
|
||||||
|
$z_idx_low = $z_idx_high;
|
||||||
|
} elsif ($z_idx_low > $z_idx_high) {
|
||||||
|
$z_idx_low = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$self->slider_low->SetValue($z_idx_low);
|
||||||
|
$self->slider_high->SetValue($z_idx_high);
|
||||||
|
$self->slider_low->Show;
|
||||||
|
$self->slider_high->Show;
|
||||||
$self->set_z_range($self->{layers_z}[$z_idx_low], $self->{layers_z}[$z_idx_high]);
|
$self->set_z_range($self->{layers_z}[$z_idx_low], $self->{layers_z}[$z_idx_high]);
|
||||||
|
$self->Layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub set_z_range
|
sub set_z_range
|
||||||
|
@ -26,6 +26,7 @@ enum ExtrusionRole {
|
|||||||
erSupportMaterial,
|
erSupportMaterial,
|
||||||
erSupportMaterialInterface,
|
erSupportMaterialInterface,
|
||||||
erWipeTower,
|
erWipeTower,
|
||||||
|
erCustom,
|
||||||
// Extrusion role for a collection with multiple extrusion roles.
|
// Extrusion role for a collection with multiple extrusion roles.
|
||||||
erMixed,
|
erMixed,
|
||||||
};
|
};
|
||||||
|
@ -587,6 +587,15 @@ void GCode::_do_export(Print &print, FILE *file, GCodePreviewData *preview_data)
|
|||||||
this->_print_first_layer_bed_temperature(file, print, start_gcode, initial_extruder_id, true);
|
this->_print_first_layer_bed_temperature(file, print, start_gcode, initial_extruder_id, true);
|
||||||
// Set extruder(s) temperature before and after start G-code.
|
// Set extruder(s) temperature before and after start G-code.
|
||||||
this->_print_first_layer_extruder_temperatures(file, print, start_gcode, initial_extruder_id, false);
|
this->_print_first_layer_extruder_temperatures(file, print, start_gcode, initial_extruder_id, false);
|
||||||
|
|
||||||
|
if (m_enable_analyzer)
|
||||||
|
{
|
||||||
|
// adds tag for analyzer
|
||||||
|
char buf[32];
|
||||||
|
sprintf(buf, ";%s%d\n", GCodeAnalyzer::Extrusion_Role_Tag.c_str(), erCustom);
|
||||||
|
_writeln(file, buf);
|
||||||
|
}
|
||||||
|
|
||||||
// Write the custom start G-code
|
// Write the custom start G-code
|
||||||
_writeln(file, start_gcode);
|
_writeln(file, start_gcode);
|
||||||
// Process filament-specific gcode in extruder order.
|
// Process filament-specific gcode in extruder order.
|
||||||
@ -770,6 +779,15 @@ void GCode::_do_export(Print &print, FILE *file, GCodePreviewData *preview_data)
|
|||||||
// Write end commands to file.
|
// Write end commands to file.
|
||||||
_write(file, this->retract());
|
_write(file, this->retract());
|
||||||
_write(file, m_writer.set_fan(false));
|
_write(file, m_writer.set_fan(false));
|
||||||
|
|
||||||
|
if (m_enable_analyzer)
|
||||||
|
{
|
||||||
|
// adds tag for analyzer
|
||||||
|
char buf[32];
|
||||||
|
sprintf(buf, ";%s%d\n", GCodeAnalyzer::Extrusion_Role_Tag.c_str(), erCustom);
|
||||||
|
_writeln(file, buf);
|
||||||
|
}
|
||||||
|
|
||||||
// Process filament-specific gcode in extruder order.
|
// Process filament-specific gcode in extruder order.
|
||||||
if (print.config.single_extruder_multi_material) {
|
if (print.config.single_extruder_multi_material) {
|
||||||
// Process the end_filament_gcode for the active filament only.
|
// Process the end_filament_gcode for the active filament only.
|
||||||
|
@ -150,7 +150,13 @@ void GCodeAnalyzer::_process_gcode_line(GCodeReader&, const GCodeReader::GCodeLi
|
|||||||
{
|
{
|
||||||
// processes 'special' comments contained in line
|
// processes 'special' comments contained in line
|
||||||
if (_process_tags(line))
|
if (_process_tags(line))
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
// DEBUG ONLY: puts the line back into the gcode
|
||||||
|
m_process_output += line.raw() + "\n";
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// sets new start position/extrusion
|
// sets new start position/extrusion
|
||||||
_set_start_position(_get_end_position());
|
_set_start_position(_get_end_position());
|
||||||
|
@ -125,6 +125,7 @@ const GCodePreviewData::Color GCodePreviewData::Extrusion::Default_Extrusion_Rol
|
|||||||
Color(0.0f, 0.5f, 0.0f, 1.0f), // erSupportMaterial
|
Color(0.0f, 0.5f, 0.0f, 1.0f), // erSupportMaterial
|
||||||
Color(0.0f, 0.0f, 0.5f, 1.0f), // erSupportMaterialInterface
|
Color(0.0f, 0.0f, 0.5f, 1.0f), // erSupportMaterialInterface
|
||||||
Color(0.7f, 0.89f, 0.67f, 1.0f), // erWipeTower
|
Color(0.7f, 0.89f, 0.67f, 1.0f), // erWipeTower
|
||||||
|
Color(1.0f, 1.0f, 0.0f, 1.0f), // erCustom
|
||||||
Color(0.0f, 0.0f, 0.0f, 1.0f) // erMixed
|
Color(0.0f, 0.0f, 0.0f, 1.0f) // erMixed
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -144,6 +145,7 @@ const std::string GCodePreviewData::Extrusion::Default_Extrusion_Role_Names[Num_
|
|||||||
"Support material",
|
"Support material",
|
||||||
"Support material interface",
|
"Support material interface",
|
||||||
"Wipe tower",
|
"Wipe tower",
|
||||||
|
"Custom",
|
||||||
"Mixed"
|
"Mixed"
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -360,8 +362,11 @@ GCodePreviewData::LegendItemsList GCodePreviewData::get_legend_items(const std::
|
|||||||
{
|
{
|
||||||
case Extrusion::FeatureType:
|
case Extrusion::FeatureType:
|
||||||
{
|
{
|
||||||
items.reserve(erMixed - erPerimeter + 1);
|
ExtrusionRole first_valid = erPerimeter;
|
||||||
for (unsigned int i = (unsigned int)erPerimeter; i < (unsigned int)erMixed; ++i)
|
ExtrusionRole last_valid = erCustom;
|
||||||
|
|
||||||
|
items.reserve(last_valid - first_valid + 1);
|
||||||
|
for (unsigned int i = (unsigned int)first_valid; i <= (unsigned int)last_valid; ++i)
|
||||||
{
|
{
|
||||||
items.emplace_back(extrusion.role_names[i], extrusion.role_colors[i]);
|
items.emplace_back(extrusion.role_names[i], extrusion.role_colors[i]);
|
||||||
}
|
}
|
||||||
|
@ -450,6 +450,25 @@ void GLVolumeCollection::render_legacy() const
|
|||||||
glDisableClientState(GL_NORMAL_ARRAY);
|
glDisableClientState(GL_NORMAL_ARRAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<double> GLVolumeCollection::get_current_print_zs() const
|
||||||
|
{
|
||||||
|
std::vector<double> print_zs;
|
||||||
|
|
||||||
|
for (GLVolume *vol : this->volumes)
|
||||||
|
{
|
||||||
|
for (coordf_t z : vol->print_zs)
|
||||||
|
{
|
||||||
|
double round_z = (double)round(z * 100000.0f) / 100000.0f;
|
||||||
|
if (std::find(print_zs.begin(), print_zs.end(), round_z) == print_zs.end())
|
||||||
|
print_zs.push_back(round_z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::sort(print_zs.begin(), print_zs.end());
|
||||||
|
|
||||||
|
return print_zs;
|
||||||
|
}
|
||||||
|
|
||||||
// caller is responsible for supplying NO lines with zero length
|
// caller is responsible for supplying NO lines with zero length
|
||||||
static void thick_lines_to_indexed_vertex_array(
|
static void thick_lines_to_indexed_vertex_array(
|
||||||
const Lines &lines,
|
const Lines &lines,
|
||||||
@ -2205,6 +2224,9 @@ void _3DScene::_update_gcode_volumes_visibility(const GCodePreviewData& preview_
|
|||||||
{
|
{
|
||||||
case GCodePreviewVolumeIndex::Extrusion:
|
case GCodePreviewVolumeIndex::Extrusion:
|
||||||
{
|
{
|
||||||
|
if ((ExtrusionRole)s_gcode_preview_volume_index.first_volumes[i].flag == erCustom)
|
||||||
|
volume->zoom_to_volumes = false;
|
||||||
|
|
||||||
volume->is_active = preview_data.extrusion.is_role_flag_set((ExtrusionRole)s_gcode_preview_volume_index.first_volumes[i].flag);
|
volume->is_active = preview_data.extrusion.is_role_flag_set((ExtrusionRole)s_gcode_preview_volume_index.first_volumes[i].flag);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -372,6 +372,9 @@ public:
|
|||||||
|
|
||||||
void set_render_interleaved_only_volumes(const RenderInterleavedOnlyVolumes& render_interleaved_only_volumes) { _render_interleaved_only_volumes = render_interleaved_only_volumes; }
|
void set_render_interleaved_only_volumes(const RenderInterleavedOnlyVolumes& render_interleaved_only_volumes) { _render_interleaved_only_volumes = render_interleaved_only_volumes; }
|
||||||
|
|
||||||
|
// Returns a vector containing the sorted list of all the print_zs of the volumes contained in this collection
|
||||||
|
std::vector<double> get_current_print_zs() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GLVolumeCollection(const GLVolumeCollection &other);
|
GLVolumeCollection(const GLVolumeCollection &other);
|
||||||
GLVolumeCollection& operator=(const GLVolumeCollection &);
|
GLVolumeCollection& operator=(const GLVolumeCollection &);
|
||||||
|
@ -48,7 +48,34 @@ wxSize wxCheckListBoxComboPopup::GetAdjustedSize(int minWidth, int prefHeight, i
|
|||||||
|
|
||||||
void wxCheckListBoxComboPopup::OnKeyEvent(wxKeyEvent& evt)
|
void wxCheckListBoxComboPopup::OnKeyEvent(wxKeyEvent& evt)
|
||||||
{
|
{
|
||||||
// do nothing, but prevents navigation in the list using arrows keys (which is not working properly)
|
// filters out all the keys which are not working properly
|
||||||
|
switch (evt.GetKeyCode())
|
||||||
|
{
|
||||||
|
case WXK_LEFT:
|
||||||
|
case WXK_UP:
|
||||||
|
case WXK_RIGHT:
|
||||||
|
case WXK_DOWN:
|
||||||
|
case WXK_PAGEUP:
|
||||||
|
case WXK_PAGEDOWN:
|
||||||
|
case WXK_END:
|
||||||
|
case WXK_HOME:
|
||||||
|
case WXK_NUMPAD_LEFT:
|
||||||
|
case WXK_NUMPAD_UP:
|
||||||
|
case WXK_NUMPAD_RIGHT:
|
||||||
|
case WXK_NUMPAD_DOWN:
|
||||||
|
case WXK_NUMPAD_PAGEUP:
|
||||||
|
case WXK_NUMPAD_PAGEDOWN:
|
||||||
|
case WXK_NUMPAD_END:
|
||||||
|
case WXK_NUMPAD_HOME:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
evt.Skip();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxCheckListBoxComboPopup::OnCheckListBox(wxCommandEvent& evt)
|
void wxCheckListBoxComboPopup::OnCheckListBox(wxCommandEvent& evt)
|
||||||
|
@ -86,6 +86,10 @@
|
|||||||
int count()
|
int count()
|
||||||
%code{% RETVAL = THIS->volumes.size(); %};
|
%code{% RETVAL = THIS->volumes.size(); %};
|
||||||
|
|
||||||
|
std::vector<double> get_current_print_zs()
|
||||||
|
%code{% RETVAL = THIS->get_current_print_zs(); %};
|
||||||
|
|
||||||
|
|
||||||
void set_range(double low, double high);
|
void set_range(double low, double high);
|
||||||
|
|
||||||
void render_VBOs() const;
|
void render_VBOs() const;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user