mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-16 05:27:50 +00:00
Read the Belt Tilt Only from the Belt G-code Header
Every printer's config block lists belt_slice_rotation_angle (default 45), so the processor marked all G-code as belt G-code: imported flat G-code got the belt view on a belt printer, and the belt-only Z handling in the processor ran for non-belt prints whose config block precedes the body. Take the angle only from outside the config block, where only the belt header writes it.
This commit is contained in:
@@ -3586,6 +3586,7 @@ void GCodeProcessor::reset()
|
|||||||
m_zero_layer_height = 0.0f;
|
m_zero_layer_height = 0.0f;
|
||||||
m_first_layer_height = 0.0f;
|
m_first_layer_height = 0.0f;
|
||||||
m_processing_start_custom_gcode = false;
|
m_processing_start_custom_gcode = false;
|
||||||
|
m_in_config_block = false;
|
||||||
m_g1_line_id = 0;
|
m_g1_line_id = 0;
|
||||||
m_layer_id = 0;
|
m_layer_id = 0;
|
||||||
m_cp_color.reset();
|
m_cp_color.reset();
|
||||||
@@ -4191,9 +4192,20 @@ void GCodeProcessor::process_tags(const std::string_view comment, bool producers
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (boost::starts_with(comment, " CONFIG_BLOCK_START")) {
|
||||||
|
m_in_config_block = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (boost::starts_with(comment, " CONFIG_BLOCK_END")) {
|
||||||
|
m_in_config_block = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Belt printer: derive the physical tilt magnitude from the slicing-rotation
|
// Belt printer: derive the physical tilt magnitude from the slicing-rotation
|
||||||
// angle header comment (used to enable the preview's belt view).
|
// angle header comment (used to enable the preview's belt view). Only the belt
|
||||||
if (boost::starts_with(comment, " belt_slice_rotation_angle = ")) {
|
// header carries it outside the config block; the config block lists the key
|
||||||
|
// for every printer, belt or not.
|
||||||
|
if (!m_in_config_block && boost::starts_with(comment, " belt_slice_rotation_angle = ")) {
|
||||||
try {
|
try {
|
||||||
m_result.belt_tilt_angle = std::abs(std::stof(std::string(comment.substr(29))));
|
m_result.belt_tilt_angle = std::abs(std::stof(std::string(comment.substr(29))));
|
||||||
} catch (...) {}
|
} catch (...) {}
|
||||||
|
|||||||
@@ -1194,6 +1194,7 @@ class Print;
|
|||||||
float m_first_layer_height; // mm
|
float m_first_layer_height; // mm
|
||||||
float m_zero_layer_height; // mm
|
float m_zero_layer_height; // mm
|
||||||
bool m_processing_start_custom_gcode;
|
bool m_processing_start_custom_gcode;
|
||||||
|
bool m_in_config_block;
|
||||||
unsigned int m_g1_line_id;
|
unsigned int m_g1_line_id;
|
||||||
unsigned int m_layer_id;
|
unsigned int m_layer_id;
|
||||||
CpColor m_cp_color;
|
CpColor m_cp_color;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ add_executable(${_TEST_NAME}_tests
|
|||||||
test_extrusion_processor.cpp
|
test_extrusion_processor.cpp
|
||||||
test_fill.cpp
|
test_fill.cpp
|
||||||
test_flow.cpp
|
test_flow.cpp
|
||||||
|
test_gcode_processor.cpp
|
||||||
test_gcode_timing.cpp
|
test_gcode_timing.cpp
|
||||||
test_gcodewriter.cpp
|
test_gcodewriter.cpp
|
||||||
test_model.cpp
|
test_model.cpp
|
||||||
|
|||||||
46
tests/fff_print/test_gcode_processor.cpp
Normal file
46
tests/fff_print/test_gcode_processor.cpp
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
#include <catch2/catch_all.hpp>
|
||||||
|
|
||||||
|
#include "libslic3r/libslic3r.h"
|
||||||
|
#include "libslic3r/GCode/GCodeProcessor.hpp"
|
||||||
|
#include "libslic3r/PrintConfig.hpp"
|
||||||
|
|
||||||
|
#include "test_utils.hpp"
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
using namespace Slic3r;
|
||||||
|
using Catch::Matchers::WithinAbs;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
float processed_belt_tilt(const std::string &gcode)
|
||||||
|
{
|
||||||
|
ScopedTemporaryFile temp(".gcode");
|
||||||
|
{
|
||||||
|
std::ofstream os(temp.string());
|
||||||
|
os << gcode;
|
||||||
|
}
|
||||||
|
GCodeProcessor proc;
|
||||||
|
proc.apply_config(FullPrintConfig{});
|
||||||
|
proc.process_file(temp.string());
|
||||||
|
return proc.get_result().belt_tilt_angle;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr const char *body = "G1 X10 Y10 Z0.2 F3000\nG1 X20 Y10 E1 F1200\n";
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
TEST_CASE("The config block's belt angle does not mark G-code as belt G-code", "[GCodeProcessor][belt]")
|
||||||
|
{
|
||||||
|
// Every printer's config block lists belt_slice_rotation_angle (default 45), belt or not.
|
||||||
|
const std::string gcode = std::string("; CONFIG_BLOCK_START\n; belt_printer = 0\n; belt_slice_rotation_angle = 45\n; CONFIG_BLOCK_END\n") + body;
|
||||||
|
CHECK_THAT(processed_belt_tilt(gcode), WithinAbs(0., 1e-6));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("The belt header's angle marks G-code as belt G-code", "[GCodeProcessor][belt]")
|
||||||
|
{
|
||||||
|
const std::string gcode = std::string("; belt_slice_rotation_angle = -45.0\n") + body +
|
||||||
|
"; CONFIG_BLOCK_START\n; belt_printer = 1\n; belt_slice_rotation_angle = -45\n; CONFIG_BLOCK_END\n";
|
||||||
|
CHECK_THAT(processed_belt_tilt(gcode), WithinAbs(45., 1e-6));
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user