mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-12 17:27:52 -06:00
Objects colored by extruder color
This commit is contained in:
parent
1e185dacc4
commit
76beaa6421
9 changed files with 118 additions and 2 deletions
|
@ -1677,6 +1677,11 @@ sub draw_warning {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub update_volumes_colors_by_extruder {
|
||||||
|
my ($self, $config) = @_;
|
||||||
|
$self->volumes->update_colors_by_extruder($config);
|
||||||
|
}
|
||||||
|
|
||||||
sub opengl_info
|
sub opengl_info
|
||||||
{
|
{
|
||||||
my ($self, %params) = @_;
|
my ($self, %params) = @_;
|
||||||
|
|
|
@ -216,6 +216,8 @@ sub reload_scene {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$self->update_volumes_colors_by_extruder($self->{config});
|
||||||
|
|
||||||
# checks for geometry outside the print volume to render it accordingly
|
# checks for geometry outside the print volume to render it accordingly
|
||||||
if (scalar @{$self->volumes} > 0)
|
if (scalar @{$self->volumes} > 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -247,6 +247,7 @@ sub _update {
|
||||||
$self->{cut_options}{z},
|
$self->{cut_options}{z},
|
||||||
[@expolygons],
|
[@expolygons],
|
||||||
);
|
);
|
||||||
|
$self->{canvas}->update_volumes_colors_by_extruder($self->GetParent->{config});
|
||||||
$self->{canvas}->Render;
|
$self->{canvas}->Render;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -162,6 +162,7 @@ sub new {
|
||||||
$canvas->load_object($self->{model_object}, undef, undef, [0]);
|
$canvas->load_object($self->{model_object}, undef, undef, [0]);
|
||||||
$canvas->set_auto_bed_shape;
|
$canvas->set_auto_bed_shape;
|
||||||
$canvas->SetSize([500,700]);
|
$canvas->SetSize([500,700]);
|
||||||
|
$canvas->update_volumes_colors_by_extruder($self->GetParent->GetParent->GetParent->{config});
|
||||||
$canvas->zoom_to_volumes;
|
$canvas->zoom_to_volumes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "../../libslic3r/GCode/PreviewData.hpp"
|
#include "../../libslic3r/GCode/PreviewData.hpp"
|
||||||
#include "../../libslic3r/Print.hpp"
|
#include "../../libslic3r/Print.hpp"
|
||||||
#include "../../libslic3r/Slicing.hpp"
|
#include "../../libslic3r/Slicing.hpp"
|
||||||
|
#include "../../slic3r/GUI/PresetBundle.hpp"
|
||||||
#include "GCode/Analyzer.hpp"
|
#include "GCode/Analyzer.hpp"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -381,6 +382,15 @@ std::vector<int> GLVolumeCollection::load_object(
|
||||||
std::vector<int> volumes_idx;
|
std::vector<int> volumes_idx;
|
||||||
for (int volume_idx = 0; volume_idx < int(model_object->volumes.size()); ++ volume_idx) {
|
for (int volume_idx = 0; volume_idx < int(model_object->volumes.size()); ++ volume_idx) {
|
||||||
const ModelVolume *model_volume = model_object->volumes[volume_idx];
|
const ModelVolume *model_volume = model_object->volumes[volume_idx];
|
||||||
|
|
||||||
|
int extruder_id = -1;
|
||||||
|
if (!model_volume->modifier)
|
||||||
|
{
|
||||||
|
extruder_id = model_volume->config.has("extruder") ? model_volume->config.option("extruder")->getInt() : 0;
|
||||||
|
if (extruder_id == 0)
|
||||||
|
extruder_id = model_object->config.has("extruder") ? model_object->config.option("extruder")->getInt() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
for (int instance_idx : instance_idxs) {
|
for (int instance_idx : instance_idxs) {
|
||||||
const ModelInstance *instance = model_object->instances[instance_idx];
|
const ModelInstance *instance = model_object->instances[instance_idx];
|
||||||
TriangleMesh mesh = model_volume->mesh;
|
TriangleMesh mesh = model_volume->mesh;
|
||||||
|
@ -410,8 +420,14 @@ std::vector<int> GLVolumeCollection::load_object(
|
||||||
v.drag_group_id = obj_idx * 1000;
|
v.drag_group_id = obj_idx * 1000;
|
||||||
else if (drag_by == "instance")
|
else if (drag_by == "instance")
|
||||||
v.drag_group_id = obj_idx * 1000 + instance_idx;
|
v.drag_group_id = obj_idx * 1000 + instance_idx;
|
||||||
if (! model_volume->modifier)
|
|
||||||
|
if (!model_volume->modifier)
|
||||||
|
{
|
||||||
v.layer_height_texture = layer_height_texture;
|
v.layer_height_texture = layer_height_texture;
|
||||||
|
if (extruder_id != -1)
|
||||||
|
v.extruder_id = extruder_id;
|
||||||
|
}
|
||||||
|
v.is_modifier = model_volume->modifier;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -438,6 +454,7 @@ int GLVolumeCollection::load_wipe_tower_preview(
|
||||||
v.composite_id = obj_idx * 1000000;
|
v.composite_id = obj_idx * 1000000;
|
||||||
v.select_group_id = obj_idx * 1000000;
|
v.select_group_id = obj_idx * 1000000;
|
||||||
v.drag_group_id = obj_idx * 1000;
|
v.drag_group_id = obj_idx * 1000;
|
||||||
|
v.is_wipe_tower = true;
|
||||||
return int(this->volumes.size() - 1);
|
return int(this->volumes.size() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -642,6 +659,83 @@ void GLVolumeCollection::update_outside_state(const DynamicPrintConfig* config,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GLVolumeCollection::update_colors_by_extruder(const DynamicPrintConfig* config)
|
||||||
|
{
|
||||||
|
static const float inv_255 = 1.0f / 255.0f;
|
||||||
|
|
||||||
|
struct Color
|
||||||
|
{
|
||||||
|
std::string text;
|
||||||
|
unsigned char rgb[3];
|
||||||
|
|
||||||
|
Color()
|
||||||
|
: text("")
|
||||||
|
{
|
||||||
|
rgb[0] = 255;
|
||||||
|
rgb[1] = 255;
|
||||||
|
rgb[2] = 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
void set(const std::string& text, unsigned char* rgb)
|
||||||
|
{
|
||||||
|
this->text = text;
|
||||||
|
::memcpy((void*)this->rgb, (const void*)rgb, 3 * sizeof(unsigned char));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (config == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const ConfigOptionStrings* extruders_opt = dynamic_cast<const ConfigOptionStrings*>(config->option("extruder_colour"));
|
||||||
|
if (extruders_opt == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const ConfigOptionStrings* filamemts_opt = dynamic_cast<const ConfigOptionStrings*>(config->option("filament_colour"));
|
||||||
|
if (filamemts_opt == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
unsigned int colors_count = std::max((unsigned int)extruders_opt->values.size(), (unsigned int)filamemts_opt->values.size());
|
||||||
|
if (colors_count == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::vector<Color> colors(colors_count);
|
||||||
|
|
||||||
|
unsigned char rgb[3];
|
||||||
|
for (unsigned int i = 0; i < colors_count; ++i)
|
||||||
|
{
|
||||||
|
const std::string& txt_color = config->opt_string("extruder_colour", i);
|
||||||
|
if (PresetBundle::parse_color(txt_color, rgb))
|
||||||
|
{
|
||||||
|
colors[i].set(txt_color, rgb);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const std::string& txt_color = config->opt_string("filament_colour", i);
|
||||||
|
if (PresetBundle::parse_color(txt_color, rgb))
|
||||||
|
colors[i].set(txt_color, rgb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (GLVolume* volume : volumes)
|
||||||
|
{
|
||||||
|
if ((volume == nullptr) || volume->is_modifier || volume->is_wipe_tower)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int extruder_id = volume->extruder_id - 1;
|
||||||
|
if ((extruder_id < 0) || ((unsigned int)colors.size() <= extruder_id))
|
||||||
|
extruder_id = 0;
|
||||||
|
|
||||||
|
const Color& color = colors[extruder_id];
|
||||||
|
if (!color.text.empty())
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 3; ++i)
|
||||||
|
{
|
||||||
|
volume->color[i] = (float)color.rgb[i] * inv_255;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<double> GLVolumeCollection::get_current_print_zs() const
|
std::vector<double> GLVolumeCollection::get_current_print_zs() const
|
||||||
{
|
{
|
||||||
// Collect layer top positions of all volumes.
|
// Collect layer top positions of all volumes.
|
||||||
|
|
|
@ -246,12 +246,15 @@ public:
|
||||||
composite_id(-1),
|
composite_id(-1),
|
||||||
select_group_id(-1),
|
select_group_id(-1),
|
||||||
drag_group_id(-1),
|
drag_group_id(-1),
|
||||||
|
extruder_id(0),
|
||||||
selected(false),
|
selected(false),
|
||||||
is_active(true),
|
is_active(true),
|
||||||
zoom_to_volumes(true),
|
zoom_to_volumes(true),
|
||||||
outside_printer_detection_enabled(true),
|
outside_printer_detection_enabled(true),
|
||||||
is_outside(false),
|
is_outside(false),
|
||||||
hover(false),
|
hover(false),
|
||||||
|
is_modifier(false),
|
||||||
|
is_wipe_tower(false),
|
||||||
tverts_range(0, size_t(-1)),
|
tverts_range(0, size_t(-1)),
|
||||||
qverts_range(0, size_t(-1))
|
qverts_range(0, size_t(-1))
|
||||||
{
|
{
|
||||||
|
@ -287,6 +290,8 @@ public:
|
||||||
int select_group_id;
|
int select_group_id;
|
||||||
// An ID for group dragging. It may be the same for all meshes of all object instances, or for just a single object instance.
|
// An ID for group dragging. It may be the same for all meshes of all object instances, or for just a single object instance.
|
||||||
int drag_group_id;
|
int drag_group_id;
|
||||||
|
// An ID containing the extruder ID (used to select color).
|
||||||
|
int extruder_id;
|
||||||
// Is this object selected?
|
// Is this object selected?
|
||||||
bool selected;
|
bool selected;
|
||||||
// Whether or not this volume is active for rendering
|
// Whether or not this volume is active for rendering
|
||||||
|
@ -299,6 +304,10 @@ public:
|
||||||
bool is_outside;
|
bool is_outside;
|
||||||
// Boolean: Is mouse over this object?
|
// Boolean: Is mouse over this object?
|
||||||
bool hover;
|
bool hover;
|
||||||
|
// Wheter or not this volume has been generated from a modifier
|
||||||
|
bool is_modifier;
|
||||||
|
// Wheter or not this volume has been generated from the wipe tower
|
||||||
|
bool is_wipe_tower;
|
||||||
|
|
||||||
// Interleaved triangles & normals with indexed triangles & quads.
|
// Interleaved triangles & normals with indexed triangles & quads.
|
||||||
GLIndexedVertexArray indexed_vertex_array;
|
GLIndexedVertexArray indexed_vertex_array;
|
||||||
|
@ -417,6 +426,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void update_outside_state(const DynamicPrintConfig* config, bool all_inside);
|
void update_outside_state(const DynamicPrintConfig* config, bool all_inside);
|
||||||
|
void update_colors_by_extruder(const DynamicPrintConfig* config);
|
||||||
|
|
||||||
// Returns a vector containing the sorted list of all the print_zs of the volumes contained in this collection
|
// 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;
|
std::vector<double> get_current_print_zs() const;
|
||||||
|
|
|
@ -788,7 +788,7 @@ static inline int hex_digit_to_int(const char c)
|
||||||
(c >= 'a' && c <= 'f') ? int(c - 'a') + 10 : -1;
|
(c >= 'a' && c <= 'f') ? int(c - 'a') + 10 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool parse_color(const std::string &scolor, unsigned char *rgb_out)
|
bool PresetBundle::parse_color(const std::string &scolor, unsigned char *rgb_out)
|
||||||
{
|
{
|
||||||
rgb_out[0] = rgb_out[1] = rgb_out[2] = 0;
|
rgb_out[0] = rgb_out[1] = rgb_out[2] = 0;
|
||||||
if (scolor.size() != 7 || scolor.front() != '#')
|
if (scolor.size() != 7 || scolor.front() != '#')
|
||||||
|
|
|
@ -98,6 +98,8 @@ public:
|
||||||
// preset if the current print or filament preset is not compatible.
|
// preset if the current print or filament preset is not compatible.
|
||||||
void update_compatible_with_printer(bool select_other_if_incompatible);
|
void update_compatible_with_printer(bool select_other_if_incompatible);
|
||||||
|
|
||||||
|
static bool parse_color(const std::string &scolor, unsigned char *rgb_out);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Load print, filament & printer presets from a config. If it is an external config, then the name is extracted from the external path.
|
// Load print, filament & printer presets from a config. If it is an external config, then the name is extracted from the external path.
|
||||||
// and the external config is just referenced, not stored into user profile directory.
|
// and the external config is just referenced, not stored into user profile directory.
|
||||||
|
|
|
@ -105,6 +105,7 @@
|
||||||
|
|
||||||
void set_print_box(float min_x, float min_y, float min_z, float max_x, float max_y, float max_z);
|
void set_print_box(float min_x, float min_y, float min_z, float max_x, float max_y, float max_z);
|
||||||
void update_outside_state(DynamicPrintConfig* config, bool all_inside);
|
void update_outside_state(DynamicPrintConfig* config, bool all_inside);
|
||||||
|
void update_colors_by_extruder(DynamicPrintConfig* config);
|
||||||
|
|
||||||
bool move_volume_up(int idx)
|
bool move_volume_up(int idx)
|
||||||
%code%{
|
%code%{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue