mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-01 04:12:04 +08:00
New gcode visualization integration - Fixed layers ordering in pre-gcode preview
This commit is contained in:
parent
aa9df80013
commit
82fb23fa8e
@ -161,12 +161,9 @@ GCodeInputData convert(const Slic3r::GCodeProcessorResult& result, float travels
|
|||||||
if (curr_type == EMoveType::Travel) {
|
if (curr_type == EMoveType::Travel) {
|
||||||
// for travel moves set the extrusion role
|
// for travel moves set the extrusion role
|
||||||
// which will be used later to select the proper color
|
// which will be used later to select the proper color
|
||||||
if (curr.delta_extruder == 0.0f)
|
extrusion_role = (curr.delta_extruder == 0.0f) ? static_cast<EGCodeExtrusionRole>(ETravelMoveType::Move) :
|
||||||
extrusion_role = static_cast<EGCodeExtrusionRole>(ETravelMoveType::Move);
|
(curr.delta_extruder > 0.0f) ? static_cast<EGCodeExtrusionRole>(ETravelMoveType::Extrude) :
|
||||||
else if (curr.delta_extruder > 0.0f)
|
static_cast<EGCodeExtrusionRole>(ETravelMoveType::Retract);
|
||||||
extrusion_role = static_cast<EGCodeExtrusionRole>(ETravelMoveType::Extrude);
|
|
||||||
else
|
|
||||||
extrusion_role = static_cast<EGCodeExtrusionRole>(ETravelMoveType::Retract);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
extrusion_role = convert(curr.extrusion_role);
|
extrusion_role = convert(curr.extrusion_role);
|
||||||
@ -364,9 +361,16 @@ static void convert_to_vertices(const Slic3r::ExtrusionEntityCollection& extrusi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void convert_brim_skirt_to_vertices(const Slic3r::Print& print, std::vector<PathVertex>& vertices)
|
struct VerticesData
|
||||||
{
|
{
|
||||||
// auto start_time = std::chrono::high_resolution_clock::now();
|
std::vector<PathVertex> vertices;
|
||||||
|
std::vector<float> layers_zs;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void convert_brim_skirt_to_vertices(const Slic3r::Print& print, std::vector<VerticesData>& vertices_data)
|
||||||
|
{
|
||||||
|
vertices_data.emplace_back(VerticesData());
|
||||||
|
VerticesData& data = vertices_data.back();
|
||||||
|
|
||||||
// number of skirt layers
|
// number of skirt layers
|
||||||
size_t total_layer_count = 0;
|
size_t total_layer_count = 0;
|
||||||
@ -382,35 +386,29 @@ static void convert_brim_skirt_to_vertices(const Slic3r::Print& print, std::vect
|
|||||||
// This is not critical as this is just an initial preview.
|
// This is not critical as this is just an initial preview.
|
||||||
const Slic3r::PrintObject* highest_object = *std::max_element(print.objects().begin(), print.objects().end(),
|
const Slic3r::PrintObject* highest_object = *std::max_element(print.objects().begin(), print.objects().end(),
|
||||||
[](auto l, auto r) { return l->layers().size() < r->layers().size(); });
|
[](auto l, auto r) { return l->layers().size() < r->layers().size(); });
|
||||||
std::vector<float> print_zs;
|
data.layers_zs.reserve(skirt_height * 2);
|
||||||
print_zs.reserve(skirt_height * 2);
|
|
||||||
for (size_t i = 0; i < std::min(skirt_height, highest_object->layers().size()); ++i) {
|
for (size_t i = 0; i < std::min(skirt_height, highest_object->layers().size()); ++i) {
|
||||||
print_zs.emplace_back(float(highest_object->layers()[i]->print_z));
|
data.layers_zs.emplace_back(float(highest_object->layers()[i]->print_z));
|
||||||
}
|
}
|
||||||
// Only add skirt for the raft layers.
|
// Only add skirt for the raft layers.
|
||||||
for (size_t i = 0; i < std::min(skirt_height, std::min(highest_object->slicing_parameters().raft_layers(), highest_object->support_layers().size())); ++i) {
|
for (size_t i = 0; i < std::min(skirt_height, std::min(highest_object->slicing_parameters().raft_layers(), highest_object->support_layers().size())); ++i) {
|
||||||
print_zs.emplace_back(float(highest_object->support_layers()[i]->print_z));
|
data.layers_zs.emplace_back(float(highest_object->support_layers()[i]->print_z));
|
||||||
}
|
}
|
||||||
Slic3r::sort_remove_duplicates(print_zs);
|
Slic3r::sort_remove_duplicates(data.layers_zs);
|
||||||
skirt_height = std::min(skirt_height, print_zs.size());
|
skirt_height = std::min(skirt_height, data.layers_zs.size());
|
||||||
print_zs.erase(print_zs.begin() + skirt_height, print_zs.end());
|
data.layers_zs.erase(data.layers_zs.begin() + skirt_height, data.layers_zs.end());
|
||||||
|
|
||||||
for (size_t i = 0; i < skirt_height; ++i) {
|
for (size_t i = 0; i < skirt_height; ++i) {
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
convert_to_vertices(print.brim(), print_zs[i], i, 0, 0, EGCodeExtrusionRole::Skirt, Slic3r::Point(0, 0), vertices);
|
convert_to_vertices(print.brim(), data.layers_zs[i], i, 0, 0, EGCodeExtrusionRole::Skirt, Slic3r::Point(0, 0), data.vertices);
|
||||||
convert_to_vertices(print.skirt(), print_zs[i], i, 0, 0, EGCodeExtrusionRole::Skirt, Slic3r::Point(0, 0), vertices);
|
convert_to_vertices(print.skirt(), data.layers_zs[i], i, 0, 0, EGCodeExtrusionRole::Skirt, Slic3r::Point(0, 0), data.vertices);
|
||||||
}
|
}
|
||||||
|
|
||||||
// auto end_time = std::chrono::high_resolution_clock::now();
|
|
||||||
// std::cout << "convert_brim_skirt: " << std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count() << "ms\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class WipeTowerHelper
|
class WipeTowerHelper
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
WipeTowerHelper(const Slic3r::Print& print)
|
WipeTowerHelper(const Slic3r::Print& print) : m_print(print) {
|
||||||
: m_print(print)
|
|
||||||
{
|
|
||||||
const Slic3r::PrintConfig& config = m_print.config();
|
const Slic3r::PrintConfig& config = m_print.config();
|
||||||
const Slic3r::WipeTowerData& wipe_tower_data = m_print.wipe_tower_data();
|
const Slic3r::WipeTowerData& wipe_tower_data = m_print.wipe_tower_data();
|
||||||
if (wipe_tower_data.priming && config.single_extruder_multi_material_priming) {
|
if (wipe_tower_data.priming && config.single_extruder_multi_material_priming) {
|
||||||
@ -446,9 +444,11 @@ private:
|
|||||||
size_t m_layers_count{ 0 };
|
size_t m_layers_count{ 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
static void convert_wipe_tower_to_vertices(const Slic3r::Print& print, const std::vector<std::string>& str_tool_colors, std::vector<PathVertex>& vertices)
|
static void convert_wipe_tower_to_vertices(const Slic3r::Print& print, const std::vector<std::string>& str_tool_colors,
|
||||||
|
std::vector<VerticesData>& vertices_data)
|
||||||
{
|
{
|
||||||
// auto start_time = std::chrono::high_resolution_clock::now();
|
vertices_data.emplace_back(VerticesData());
|
||||||
|
VerticesData& data = vertices_data.back();
|
||||||
|
|
||||||
WipeTowerHelper wipe_tower_helper(print);
|
WipeTowerHelper wipe_tower_helper(print);
|
||||||
const float angle = wipe_tower_helper.get_angle();
|
const float angle = wipe_tower_helper.get_angle();
|
||||||
@ -457,6 +457,7 @@ static void convert_wipe_tower_to_vertices(const Slic3r::Print& print, const std
|
|||||||
for (size_t item = 0; item < wipe_tower_helper.get_layers_count(); ++item) {
|
for (size_t item = 0; item < wipe_tower_helper.get_layers_count(); ++item) {
|
||||||
const std::vector<Slic3r::WipeTower::ToolChangeResult>& layer = wipe_tower_helper.tool_change(item);
|
const std::vector<Slic3r::WipeTower::ToolChangeResult>& layer = wipe_tower_helper.tool_change(item);
|
||||||
for (const Slic3r::WipeTower::ToolChangeResult& extrusions : layer) {
|
for (const Slic3r::WipeTower::ToolChangeResult& extrusions : layer) {
|
||||||
|
data.layers_zs.emplace_back(extrusions.print_z);
|
||||||
for (size_t i = 1; i < extrusions.extrusions.size(); /*no increment*/) {
|
for (size_t i = 1; i < extrusions.extrusions.size(); /*no increment*/) {
|
||||||
const Slic3r::WipeTower::Extrusion& e = extrusions.extrusions[i];
|
const Slic3r::WipeTower::Extrusion& e = extrusions.extrusions[i];
|
||||||
if (e.width == 0.0f) {
|
if (e.width == 0.0f) {
|
||||||
@ -496,13 +497,12 @@ static void convert_wipe_tower_to_vertices(const Slic3r::Print& print, const std
|
|||||||
}
|
}
|
||||||
|
|
||||||
convert_lines_to_vertices(lines, widths, heights, extrusions.print_z, item, static_cast<size_t>(e.tool), 0,
|
convert_lines_to_vertices(lines, widths, heights, extrusions.print_z, item, static_cast<size_t>(e.tool), 0,
|
||||||
EGCodeExtrusionRole::WipeTower, lines.front().a == lines.back().b, vertices);
|
EGCodeExtrusionRole::WipeTower, lines.front().a == lines.back().b, data.vertices);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// auto end_time = std::chrono::high_resolution_clock::now();
|
Slic3r::sort_remove_duplicates(data.layers_zs);
|
||||||
// std::cout << "convert_wipe_tower: " << std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count() << "ms\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class ObjectHelper
|
class ObjectHelper
|
||||||
@ -615,14 +615,8 @@ private:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ObjectData
|
|
||||||
{
|
|
||||||
std::vector<PathVertex> vertices;
|
|
||||||
std::vector<float> layers_zs;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void convert_object_to_vertices(const Slic3r::PrintObject& object, const std::vector<std::string>& str_tool_colors,
|
static void convert_object_to_vertices(const Slic3r::PrintObject& object, const std::vector<std::string>& str_tool_colors,
|
||||||
const std::vector<Slic3r::CustomGCode::Item>& color_print_values, size_t extruders_count, ObjectData& data)
|
const std::vector<Slic3r::CustomGCode::Item>& color_print_values, size_t extruders_count, VerticesData& data)
|
||||||
{
|
{
|
||||||
const bool has_perimeters = object.is_step_done(Slic3r::posPerimeters);
|
const bool has_perimeters = object.is_step_done(Slic3r::posPerimeters);
|
||||||
const bool has_infill = object.is_step_done(Slic3r::posInfill);
|
const bool has_infill = object.is_step_done(Slic3r::posInfill);
|
||||||
@ -697,36 +691,14 @@ static void convert_object_to_vertices(const Slic3r::PrintObject& object, const
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void convert_objects_to_vertices(const Slic3r::SpanOfConstPtrs<Slic3r::PrintObject>& objects, const std::vector<std::string>& str_tool_colors,
|
static void convert_objects_to_vertices(const Slic3r::SpanOfConstPtrs<Slic3r::PrintObject>& objects, const std::vector<std::string>& str_tool_colors,
|
||||||
const std::vector<Slic3r::CustomGCode::Item>& color_print_values, size_t extruders_count, std::vector<PathVertex>& vertices)
|
const std::vector<Slic3r::CustomGCode::Item>& color_print_values, size_t extruders_count, std::vector<VerticesData>& data)
|
||||||
{
|
{
|
||||||
// auto start_time = std::chrono::high_resolution_clock::now();
|
|
||||||
|
|
||||||
// extract vertices and layers zs object by object
|
// extract vertices and layers zs object by object
|
||||||
std::vector<ObjectData> objects_data(objects.size());
|
data.reserve(data.size() + objects.size());
|
||||||
for (size_t i = 0; i < objects.size(); ++i) {
|
for (size_t i = 0; i < objects.size(); ++i) {
|
||||||
convert_object_to_vertices(*objects[i], str_tool_colors, color_print_values, extruders_count, objects_data[i]);
|
data.emplace_back(VerticesData());
|
||||||
|
convert_object_to_vertices(*objects[i], str_tool_colors, color_print_values, extruders_count, data.back());
|
||||||
}
|
}
|
||||||
|
|
||||||
// collect layers zs
|
|
||||||
std::vector<float> layers;
|
|
||||||
for (const ObjectData& data : objects_data) {
|
|
||||||
layers.reserve(layers.size() + data.layers_zs.size());
|
|
||||||
std::copy(data.layers_zs.begin(), data.layers_zs.end(), std::back_inserter(layers));
|
|
||||||
}
|
|
||||||
Slic3r::sort_remove_duplicates(layers);
|
|
||||||
|
|
||||||
// collect extracted vertices layer by layer
|
|
||||||
float min_z = 0.0f;
|
|
||||||
for (float z : layers) {
|
|
||||||
for (ObjectData& data : objects_data) {
|
|
||||||
std::copy_if(data.vertices.begin(), data.vertices.end(), std::back_inserter(vertices),
|
|
||||||
[min_z, z](const PathVertex& v) { return min_z < v.position[2] && v.position[2] <= z; });
|
|
||||||
}
|
|
||||||
min_z = z;
|
|
||||||
}
|
|
||||||
|
|
||||||
// auto end_time = std::chrono::high_resolution_clock::now();
|
|
||||||
// std::cout << "convert_objects: " << std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count() << "ms\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// mapping from Slic3r::Print to libvgcode::GCodeInputData
|
// mapping from Slic3r::Print to libvgcode::GCodeInputData
|
||||||
@ -734,15 +706,33 @@ GCodeInputData convert(const Slic3r::Print& print, const std::vector<std::string
|
|||||||
const std::vector<Slic3r::CustomGCode::Item>& color_print_values, size_t extruders_count)
|
const std::vector<Slic3r::CustomGCode::Item>& color_print_values, size_t extruders_count)
|
||||||
{
|
{
|
||||||
GCodeInputData ret;
|
GCodeInputData ret;
|
||||||
|
std::vector<VerticesData> data;
|
||||||
if (print.is_step_done(Slic3r::psSkirtBrim) && (print.has_skirt() || print.has_brim()))
|
if (print.is_step_done(Slic3r::psSkirtBrim) && (print.has_skirt() || print.has_brim()))
|
||||||
convert_brim_skirt_to_vertices(print, ret.vertices);
|
// extract vertices and layers zs from skirt/brim
|
||||||
|
convert_brim_skirt_to_vertices(print, data);
|
||||||
if (!print.wipe_tower_data().tool_changes.empty() && print.is_step_done(Slic3r::psWipeTower))
|
if (!print.wipe_tower_data().tool_changes.empty() && print.is_step_done(Slic3r::psWipeTower))
|
||||||
convert_wipe_tower_to_vertices(print, str_tool_colors, ret.vertices);
|
// extract vertices and layers zs from wipe tower
|
||||||
|
convert_wipe_tower_to_vertices(print, str_tool_colors, data);
|
||||||
|
// extract vertices and layers zs from objects
|
||||||
|
convert_objects_to_vertices(print.objects(), str_tool_colors, color_print_values, extruders_count, data);
|
||||||
|
|
||||||
convert_objects_to_vertices(print.objects(), str_tool_colors, color_print_values, extruders_count, ret.vertices);
|
// collect layers zs
|
||||||
|
std::vector<float> layers;
|
||||||
|
for (const VerticesData& d : data) {
|
||||||
|
layers.reserve(layers.size() + d.layers_zs.size());
|
||||||
|
std::copy(d.layers_zs.begin(), d.layers_zs.end(), std::back_inserter(layers));
|
||||||
|
}
|
||||||
|
Slic3r::sort_remove_duplicates(layers);
|
||||||
|
|
||||||
|
// collect extracted vertices layer by layer
|
||||||
|
float min_z = 0.0f;
|
||||||
|
for (float z : layers) {
|
||||||
|
for (const VerticesData& d : data) {
|
||||||
|
std::copy_if(d.vertices.begin(), d.vertices.end(), std::back_inserter(ret.vertices),
|
||||||
|
[min_z, z](const PathVertex& v) { return min_z < v.position[2] && v.position[2] <= z; });
|
||||||
|
}
|
||||||
|
min_z = z;
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user