mirror of
https://git.mirrors.martin98.com/https://github.com/slic3r/Slic3r.git
synced 2025-08-15 00:55:53 +08:00
fix fan_speedup_time
* now can split a G1 line to start the fan in the middle. create super_slicer logo from prusa one fix 0-disable for z_step
This commit is contained in:
parent
07be95fb69
commit
05632802c1
68
resources/icons/super_slicer_logo.svg
Normal file
68
resources/icons/super_slicer_logo.svg
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||||
|
sodipodi:docname="super_slicer_logo.svg"
|
||||||
|
id="svg8"
|
||||||
|
version="1.1"
|
||||||
|
viewBox="0 0 800 800"
|
||||||
|
height="800"
|
||||||
|
width="800">
|
||||||
|
<metadata
|
||||||
|
id="metadata14">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs12" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
inkscape:current-layer="svg8"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:cy="444.78766"
|
||||||
|
inkscape:cx="149.49165"
|
||||||
|
inkscape:zoom="0.459375"
|
||||||
|
showgrid="false"
|
||||||
|
id="namedview10"
|
||||||
|
inkscape:window-height="1137"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
guidetolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
objecttolerance="10"
|
||||||
|
borderopacity="1"
|
||||||
|
bordercolor="#666666"
|
||||||
|
pagecolor="#ffffff" />
|
||||||
|
<circle
|
||||||
|
id="circle2"
|
||||||
|
fill="#fff"
|
||||||
|
r="400"
|
||||||
|
cy="400"
|
||||||
|
cx="400" />
|
||||||
|
<path
|
||||||
|
id="path4"
|
||||||
|
fill="#363636"
|
||||||
|
transform="translate(0 0)"
|
||||||
|
d="M599.3,186.8c-93.9-93.9-246.1-93.9-340,0s-93.9,246.1,0,340Z" />
|
||||||
|
<path
|
||||||
|
style="fill:#0066ff;fill-opacity:1"
|
||||||
|
id="path6"
|
||||||
|
fill="#ed6b21"
|
||||||
|
transform="translate(0 0)"
|
||||||
|
d="M202.7,612.5c93.9,93.9,246.1,93.9,340,0s93.9-246.1,0-340" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
@ -59,7 +59,7 @@ group:Advanced
|
|||||||
setting:label_width$10:width$3:sidetext_width$2:seam_angle_cost
|
setting:label_width$10:width$3:sidetext_width$2:seam_angle_cost
|
||||||
setting:label_width$10:width$3:sidetext_width$2:seam_travel_cost
|
setting:label_width$10:width$3:sidetext_width$2:seam_travel_cost
|
||||||
end_line
|
end_line
|
||||||
line:Looping perimeter
|
line:One-loop perimeters
|
||||||
setting:perimeter_loop
|
setting:perimeter_loop
|
||||||
setting:perimeter_loop_seam
|
setting:perimeter_loop_seam
|
||||||
end_line
|
end_line
|
||||||
|
@ -89,6 +89,8 @@ add_library(libslic3r STATIC
|
|||||||
GCode/ThumbnailData.hpp
|
GCode/ThumbnailData.hpp
|
||||||
GCode/CoolingBuffer.cpp
|
GCode/CoolingBuffer.cpp
|
||||||
GCode/CoolingBuffer.hpp
|
GCode/CoolingBuffer.hpp
|
||||||
|
GCode/FanMover.cpp
|
||||||
|
GCode/FanMover.hpp
|
||||||
GCode/PostProcessor.cpp
|
GCode/PostProcessor.cpp
|
||||||
GCode/PostProcessor.hpp
|
GCode/PostProcessor.hpp
|
||||||
# GCode/PressureEqualizer.cpp
|
# GCode/PressureEqualizer.cpp
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include "EdgeGrid.hpp"
|
#include "EdgeGrid.hpp"
|
||||||
#include "Geometry.hpp"
|
#include "Geometry.hpp"
|
||||||
#include "GCode/Analyzer.hpp"
|
#include "GCode/Analyzer.hpp"
|
||||||
|
#include "GCode/FanMover.hpp"
|
||||||
#include "GCode/PrintExtents.hpp"
|
#include "GCode/PrintExtents.hpp"
|
||||||
#include "GCode/WipeTower.hpp"
|
#include "GCode/WipeTower.hpp"
|
||||||
#include "ShortestPath.hpp"
|
#include "ShortestPath.hpp"
|
||||||
@ -1262,6 +1263,7 @@ void GCode::_do_export(Print& print, FILE* file, ThumbnailsGeneratorCallback thu
|
|||||||
m_last_mm3_per_mm = 0.0;
|
m_last_mm3_per_mm = 0.0;
|
||||||
m_last_width = 0.0f;
|
m_last_width = 0.0f;
|
||||||
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
|
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
|
||||||
|
m_fan_mover.release();
|
||||||
#else
|
#else
|
||||||
m_last_mm3_per_mm = GCodeAnalyzer::Default_mm3_per_mm;
|
m_last_mm3_per_mm = GCodeAnalyzer::Default_mm3_per_mm;
|
||||||
m_last_width = GCodeAnalyzer::Default_Width;
|
m_last_width = GCodeAnalyzer::Default_Width;
|
||||||
@ -1840,12 +1842,12 @@ void GCode::_do_export(Print& print, FILE* file, ThumbnailsGeneratorCallback thu
|
|||||||
#endif // ENABLE_GCODE_VIEWER
|
#endif // ENABLE_GCODE_VIEWER
|
||||||
|
|
||||||
// Append full config.
|
// Append full config.
|
||||||
_write(file, "\n");
|
_write(file, "\n", true);
|
||||||
{
|
{
|
||||||
std::string full_config = "";
|
std::string full_config = "";
|
||||||
append_full_config(print, full_config);
|
append_full_config(print, full_config);
|
||||||
if (!full_config.empty())
|
if (!full_config.empty())
|
||||||
_write(file, full_config);
|
_write(file, full_config, true);
|
||||||
}
|
}
|
||||||
print.throw_if_canceled();
|
print.throw_if_canceled();
|
||||||
}
|
}
|
||||||
@ -3661,28 +3663,30 @@ std::string GCode::extrude_support(const ExtrusionEntityCollection &support_fill
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GCode::_post_process(std::string& what) {
|
void GCode::_post_process(std::string& what, bool flush) {
|
||||||
//TODO reactivate it by a way or another
|
|
||||||
#if !ENABLE_GCODE_VIEWER
|
|
||||||
//if enabled, move the fan startup earlier.
|
//if enabled, move the fan startup earlier.
|
||||||
if (this->config().fan_speedup_time.value != 0) {
|
if (this->config().fan_speedup_time.value != 0) {
|
||||||
Slic3r::FanMover fen_post_process(std::abs(this->config().fan_speedup_time.value), this->config().fan_speedup_time.value>0);
|
if (this->m_fan_mover.get() == nullptr)
|
||||||
what = fen_post_process.process_gcode(what);
|
this->m_fan_mover.reset(new Slic3r::FanMover(
|
||||||
|
std::abs(this->config().fan_speedup_time.value),
|
||||||
|
this->config().fan_speedup_time.value > 0,
|
||||||
|
this->config().use_relative_e_distances.value));
|
||||||
|
what = this->m_fan_mover->process_gcode(what, flush);
|
||||||
}
|
}
|
||||||
#endif // !ENABLE_GCODE_VIEWER
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GCode::_write(FILE* file, const char *what)
|
void GCode::_write(FILE* file, const char *what, bool flush /*=false*/)
|
||||||
{
|
{
|
||||||
if (what != nullptr) {
|
if (what != nullptr) {
|
||||||
|
|
||||||
#if ENABLE_GCODE_VIEWER
|
|
||||||
const char* gcode = what;
|
|
||||||
#else
|
|
||||||
//const char * gcode_pp = _post_process(what).c_str();
|
//const char * gcode_pp = _post_process(what).c_str();
|
||||||
std::string str_preproc{ what };
|
std::string str_preproc{ what };
|
||||||
_post_process(str_preproc);
|
_post_process(str_preproc, flush);
|
||||||
|
#if ENABLE_GCODE_VIEWER
|
||||||
|
const char* gcode = str_preproc.c_str();
|
||||||
|
#else
|
||||||
const std::string str_ana = m_analyzer.process_gcode(str_preproc);
|
const std::string str_ana = m_analyzer.process_gcode(str_preproc);
|
||||||
|
|
||||||
// apply analyzer, if enabled
|
// apply analyzer, if enabled
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include "PlaceholderParser.hpp"
|
#include "PlaceholderParser.hpp"
|
||||||
#include "PrintConfig.hpp"
|
#include "PrintConfig.hpp"
|
||||||
#include "GCode/CoolingBuffer.hpp"
|
#include "GCode/CoolingBuffer.hpp"
|
||||||
|
#include "GCode/FanMover.hpp"
|
||||||
#include "GCode/SpiralVase.hpp"
|
#include "GCode/SpiralVase.hpp"
|
||||||
#include "GCode/ToolOrdering.hpp"
|
#include "GCode/ToolOrdering.hpp"
|
||||||
#include "GCode/WipeTower.hpp"
|
#include "GCode/WipeTower.hpp"
|
||||||
@ -464,8 +465,8 @@ private:
|
|||||||
#endif // ENABLE_GCODE_VIEWER
|
#endif // ENABLE_GCODE_VIEWER
|
||||||
|
|
||||||
// Write a string into a file.
|
// Write a string into a file.
|
||||||
void _write(FILE* file, const std::string& what) { this->_write(file, what.c_str()); }
|
void _write(FILE* file, const std::string& what, bool flush = false) { this->_write(file, what.c_str()); }
|
||||||
void _write(FILE* file, const char *what);
|
void _write(FILE* file, const char *what, bool flush = false);
|
||||||
|
|
||||||
// Write a string into a file.
|
// Write a string into a file.
|
||||||
// Add a newline, if the string does not end with a newline already.
|
// Add a newline, if the string does not end with a newline already.
|
||||||
@ -475,8 +476,9 @@ private:
|
|||||||
// Formats and write into a file the given data.
|
// Formats and write into a file the given data.
|
||||||
void _write_format(FILE* file, const char* format, ...);
|
void _write_format(FILE* file, const char* format, ...);
|
||||||
|
|
||||||
//some post-processing on the file, before the analyzer
|
//some post-processing on the file, with their data class
|
||||||
void _post_process(std::string& what);
|
std::unique_ptr<FanMover> m_fan_mover;
|
||||||
|
void _post_process(std::string& what, bool flush = true);
|
||||||
|
|
||||||
std::string _extrude(const ExtrusionPath &path, const std::string &description, double speed = -1);
|
std::string _extrude(const ExtrusionPath &path, const std::string &description, double speed = -1);
|
||||||
std::string _before_extrude(const ExtrusionPath &path, const std::string &description, double speed = -1);
|
std::string _before_extrude(const ExtrusionPath &path, const std::string &description, double speed = -1);
|
||||||
|
@ -712,7 +712,7 @@ std::string CoolingBuffer::apply_layer_cooldown(
|
|||||||
float slowdown_below_layer_time = float(EXTRUDER_CONFIG(slowdown_below_layer_time));
|
float slowdown_below_layer_time = float(EXTRUDER_CONFIG(slowdown_below_layer_time));
|
||||||
float fan_below_layer_time = float(EXTRUDER_CONFIG(fan_below_layer_time));
|
float fan_below_layer_time = float(EXTRUDER_CONFIG(fan_below_layer_time));
|
||||||
//if (EXTRUDER_CONFIG(cooling)) {
|
//if (EXTRUDER_CONFIG(cooling)) {
|
||||||
if (layer_time < slowdown_below_layer_time) {
|
if (layer_time < slowdown_below_layer_time && fan_below_layer_time > 0) {
|
||||||
// Layer time very short. Enable the fan to a full throttle.
|
// Layer time very short. Enable the fan to a full throttle.
|
||||||
fan_speed_new = max_fan_speed;
|
fan_speed_new = max_fan_speed;
|
||||||
} else if (layer_time < fan_below_layer_time) {
|
} else if (layer_time < fan_below_layer_time) {
|
||||||
|
219
src/libslic3r/GCode/FanMover.cpp
Normal file
219
src/libslic3r/GCode/FanMover.cpp
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
#include "FanMover.hpp"
|
||||||
|
|
||||||
|
#include "GCodeReader.hpp"
|
||||||
|
|
||||||
|
/*
|
||||||
|
#include <memory.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <float.h>
|
||||||
|
|
||||||
|
#include "../libslic3r.h"
|
||||||
|
#include "../PrintConfig.hpp"
|
||||||
|
#include "../Utils.hpp"
|
||||||
|
#include "Print.hpp"
|
||||||
|
|
||||||
|
#include <boost/log/trivial.hpp>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace Slic3r {
|
||||||
|
|
||||||
|
const std::string& FanMover::process_gcode(const std::string& gcode, bool flush)
|
||||||
|
{
|
||||||
|
m_process_output = "";
|
||||||
|
|
||||||
|
m_parser.parse_buffer(gcode,
|
||||||
|
[this](GCodeReader& reader, const GCodeReader::GCodeLine& line) { /*m_process_output += line.raw() + "\n";*/ this->_process_gcode_line(reader, line); });
|
||||||
|
|
||||||
|
if (flush) {
|
||||||
|
while (!buffer.empty()) {
|
||||||
|
m_process_output += buffer.back().raw + "\n";
|
||||||
|
buffer.pop_back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_process_output;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_end_of_word(char c) {
|
||||||
|
return c == ' ' || c == '\t' || c == '\r' || c == '\n' || c == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
float get_axis_value(const std::string& line, char axis)
|
||||||
|
{
|
||||||
|
char match[3] = " X";
|
||||||
|
match[1] = axis;
|
||||||
|
|
||||||
|
size_t pos = line.find(match) + 2;
|
||||||
|
size_t end = line.find(' ', pos + 1);
|
||||||
|
// Try to parse the numeric value.
|
||||||
|
const char* c = line.c_str();
|
||||||
|
char* pend = nullptr;
|
||||||
|
double v = strtod(c+ pos, &pend);
|
||||||
|
if (pend != nullptr && is_end_of_word(*pend)) {
|
||||||
|
// The axis value has been parsed correctly.
|
||||||
|
return float(v);
|
||||||
|
}
|
||||||
|
return NAN;
|
||||||
|
}
|
||||||
|
|
||||||
|
void change_axis_value(std::string& line, char axis, const float new_value, const int decimal_digits)
|
||||||
|
{
|
||||||
|
|
||||||
|
std::ostringstream ss;
|
||||||
|
ss << std::fixed << std::setprecision(decimal_digits) << new_value;
|
||||||
|
|
||||||
|
char match[3] = " X";
|
||||||
|
match[1] = axis;
|
||||||
|
|
||||||
|
size_t pos = line.find(match) + 2;
|
||||||
|
size_t end = line.find(' ', pos + 1);
|
||||||
|
line = line.replace(pos, end - pos, ss.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
void FanMover::_process_gcode_line(GCodeReader& reader, const GCodeReader::GCodeLine& line)
|
||||||
|
{
|
||||||
|
// processes 'normal' gcode lines
|
||||||
|
std::string cmd = line.cmd();
|
||||||
|
double time = 0;
|
||||||
|
float fan_speed = -1;
|
||||||
|
if (cmd.length() > 1) {
|
||||||
|
if (line.has_f())
|
||||||
|
current_speed = line.f() / 60.0f;
|
||||||
|
switch (::toupper(cmd[0])) {
|
||||||
|
case 'G':
|
||||||
|
{
|
||||||
|
if (::atoi(&cmd[1]) == 1 || ::atoi(&cmd[1]) == 0) {
|
||||||
|
double distx = line.dist_X(reader);
|
||||||
|
double disty = line.dist_Y(reader);
|
||||||
|
double distz = line.dist_Z(reader);
|
||||||
|
double dist = distx * distx + disty * disty + distz * distz;
|
||||||
|
if (dist > 0) {
|
||||||
|
dist = std::sqrt(dist);
|
||||||
|
time = dist / current_speed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'M':
|
||||||
|
{
|
||||||
|
if (::atoi(&cmd[1]) == 106) {
|
||||||
|
if (line.has_value('S', fan_speed) ) {
|
||||||
|
int nb_M106_erased = 0;
|
||||||
|
if (fan_speed > expected_fan_speed) {
|
||||||
|
time = -1; // don't write!
|
||||||
|
buffer.emplace_front(BufferData("; erased: "+line.raw(), 0, -1));
|
||||||
|
//erase M106 in the buffer -> don't slowdown if you are in the process of step-up.
|
||||||
|
auto it = buffer.begin();
|
||||||
|
int i = 0;
|
||||||
|
while (it != buffer.end()) {
|
||||||
|
if (it->raw.compare(0, 4, "M106") == 0 && it->fan_speed < fan_speed) {
|
||||||
|
//found something that is lower than us -> change is speed by ours and delete us
|
||||||
|
it->fan_speed = fan_speed;
|
||||||
|
std::stringstream ss; ss << "S" << (int)fan_speed;
|
||||||
|
it->raw = std::regex_replace(it->raw, regex_fan_speed, ss.str());
|
||||||
|
nb_M106_erased++;
|
||||||
|
} else {
|
||||||
|
++it;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nb_M106_erased == 0) {
|
||||||
|
//try to split the G1/G0 line to increae precision
|
||||||
|
if (!buffer.empty()) {
|
||||||
|
BufferData& backdata = buffer.back();
|
||||||
|
if (buffer_time_size > nb_seconds_delay * 1.1f && backdata.raw.size() > 2
|
||||||
|
&& backdata.raw[0] == 'G' && backdata.raw[1] == '1' && backdata.raw[2] == ' ') {
|
||||||
|
float percent = (buffer_time_size - nb_seconds_delay) / backdata.time;
|
||||||
|
std::string before = backdata.raw;
|
||||||
|
std::string& after = backdata.raw;
|
||||||
|
if (backdata.dx != 0) {
|
||||||
|
change_axis_value(before, 'X', backdata.x + backdata.dx * percent, 3);
|
||||||
|
}
|
||||||
|
if (backdata.dy != 0) {
|
||||||
|
change_axis_value(before, 'Y', backdata.y + backdata.dy * percent, 3);
|
||||||
|
}
|
||||||
|
if (backdata.dz != 0) {
|
||||||
|
change_axis_value(before, 'Z', backdata.z + backdata.dz * percent, 3);
|
||||||
|
}
|
||||||
|
if (backdata.de != 0) {
|
||||||
|
if (relative_e) {
|
||||||
|
change_axis_value(before, 'E', backdata.de * percent, 5);
|
||||||
|
change_axis_value(after, 'E', backdata.de * (1 - percent), 5);
|
||||||
|
} else {
|
||||||
|
change_axis_value(before, 'E', backdata.e + backdata.de * percent, 5);
|
||||||
|
change_axis_value(after, 'E', backdata.e + backdata.de * (1 - percent), 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_process_output += before + "\n";
|
||||||
|
buffer_time_size -= backdata.time * percent;
|
||||||
|
backdata.time -= backdata.time * percent;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//print it
|
||||||
|
if (with_D_option) {
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << " D" << (uint32_t)(buffer_time_size * 1000) << "\n";
|
||||||
|
m_process_output += line.raw() + ss.str();
|
||||||
|
} else {
|
||||||
|
m_process_output += line.raw() + "\n";
|
||||||
|
}
|
||||||
|
current_fan_speed = fan_speed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//update
|
||||||
|
expected_fan_speed = fan_speed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (time >= 0) {
|
||||||
|
buffer.emplace_front(BufferData(line.raw(), time, fan_speed));
|
||||||
|
BufferData& front = buffer.front();
|
||||||
|
if (line.has(Axis::X)) {
|
||||||
|
front.x = reader.x();
|
||||||
|
front.dx = line.dist_X(reader);
|
||||||
|
}
|
||||||
|
if (line.has(Axis::Y)) {
|
||||||
|
front.y = reader.y();
|
||||||
|
front.dy = line.dist_Y(reader);
|
||||||
|
}
|
||||||
|
if (line.has(Axis::Z)) {
|
||||||
|
front.z = reader.z();
|
||||||
|
front.dz = line.dist_Z(reader);
|
||||||
|
}
|
||||||
|
if (line.has(Axis::E)) {
|
||||||
|
front.e = reader.e();
|
||||||
|
if(relative_e)
|
||||||
|
front.de = line.e();
|
||||||
|
else
|
||||||
|
front.de = line.dist_E(reader);
|
||||||
|
}
|
||||||
|
buffer_time_size += time;
|
||||||
|
}
|
||||||
|
// puts the line back into the gcode
|
||||||
|
//if buffer too big, flush it.
|
||||||
|
if (time > 0) {
|
||||||
|
while (buffer_time_size - buffer.back().time > nb_seconds_delay) {
|
||||||
|
BufferData &backdata = buffer.back();
|
||||||
|
if (backdata.fan_speed < 0 || (int)backdata.fan_speed != (int)current_fan_speed) {
|
||||||
|
buffer_time_size -= backdata.time;
|
||||||
|
m_process_output += backdata.raw + "\n";
|
||||||
|
if (backdata.fan_speed >= 0) {
|
||||||
|
current_fan_speed = backdata.fan_speed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buffer.pop_back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Slic3r
|
||||||
|
|
59
src/libslic3r/GCode/FanMover.hpp
Normal file
59
src/libslic3r/GCode/FanMover.hpp
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
#ifndef slic3r_GCode_FanMover_hpp_
|
||||||
|
#define slic3r_GCode_FanMover_hpp_
|
||||||
|
|
||||||
|
|
||||||
|
#include "../libslic3r.h"
|
||||||
|
#include "../PrintConfig.hpp"
|
||||||
|
#include "../ExtrusionEntity.hpp"
|
||||||
|
|
||||||
|
#include "../Point.hpp"
|
||||||
|
#include "../GCodeReader.hpp"
|
||||||
|
#include <regex>
|
||||||
|
|
||||||
|
namespace Slic3r {
|
||||||
|
|
||||||
|
class BufferData {
|
||||||
|
public:
|
||||||
|
std::string raw;
|
||||||
|
float time;
|
||||||
|
float fan_speed;
|
||||||
|
float x = 0, y = 0, z = 0, e = 0;
|
||||||
|
float dx = 0, dy = 0, dz = 0, de = 0;
|
||||||
|
BufferData(std::string line, float time = 0, float fan_speed = 0) : raw(line), time(time), fan_speed(fan_speed) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class FanMover
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
const std::regex regex_fan_speed;
|
||||||
|
const float nb_seconds_delay;
|
||||||
|
const bool with_D_option;
|
||||||
|
const bool relative_e;
|
||||||
|
|
||||||
|
// in unit/second
|
||||||
|
double current_speed = 1000 / 60.0;;
|
||||||
|
float buffer_time_size = 0;
|
||||||
|
GCodeReader m_parser{};
|
||||||
|
int expected_fan_speed = 0;
|
||||||
|
int current_fan_speed = 0;
|
||||||
|
|
||||||
|
// The output of process_layer()
|
||||||
|
std::list<BufferData> buffer;
|
||||||
|
std::string m_process_output;
|
||||||
|
|
||||||
|
public:
|
||||||
|
FanMover(const float nb_seconds_delay, const bool with_D_option, const bool relative_e)
|
||||||
|
: regex_fan_speed("S[0-9]+"), nb_seconds_delay(nb_seconds_delay), with_D_option(with_D_option), relative_e(relative_e){}
|
||||||
|
|
||||||
|
// Adds the gcode contained in the given string to the analysis and returns it after removing the workcodes
|
||||||
|
const std::string& process_gcode(const std::string& gcode, bool flush);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Processes the given gcode line
|
||||||
|
void _process_gcode_line(GCodeReader& reader, const GCodeReader::GCodeLine& line);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Slic3r
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* slic3r_GCode_FanMover_hpp_ */
|
@ -2068,7 +2068,7 @@ void PrintConfigDef::init_fff_params()
|
|||||||
" It assume infinite acceleration for this time estimation, and only takes into account G1 and G0 moves. Use 0 to deactivate, negative to remove the 'D' option.");
|
" It assume infinite acceleration for this time estimation, and only takes into account G1 and G0 moves. Use 0 to deactivate, negative to remove the 'D' option.");
|
||||||
def->sidetext = L("s");
|
def->sidetext = L("s");
|
||||||
def->mode = comAdvanced;
|
def->mode = comAdvanced;
|
||||||
def->set_default_value(new ConfigOptionFloat(-1));
|
def->set_default_value(new ConfigOptionFloat(-0.5));
|
||||||
|
|
||||||
def = this->add("machine_limits_usage", coEnum);
|
def = this->add("machine_limits_usage", coEnum);
|
||||||
def->label = L("How to apply");
|
def->label = L("How to apply");
|
||||||
@ -3877,7 +3877,7 @@ void PrintConfigDef::init_fff_params()
|
|||||||
"\nPut 0 to disable.");
|
"\nPut 0 to disable.");
|
||||||
def->cli = "z-step=f";
|
def->cli = "z-step=f";
|
||||||
def->sidetext = L("mm");
|
def->sidetext = L("mm");
|
||||||
def->min = 0.0001;
|
def->min = 0;
|
||||||
def->mode = comExpert;
|
def->mode = comExpert;
|
||||||
def->set_default_value(new ConfigOptionFloat(0.005));
|
def->set_default_value(new ConfigOptionFloat(0.005));
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
namespace Slic3r { namespace GUI {
|
namespace Slic3r { namespace GUI {
|
||||||
|
|
||||||
wxString double_to_string(double const value, const int max_precision /*= 4*/)
|
wxString double_to_string(double const value, const int max_precision /*= 8*/)
|
||||||
{
|
{
|
||||||
// Style_NoTrailingZeroes does not work on OSX. It also does not work correctly with some locales on Windows.
|
// Style_NoTrailingZeroes does not work on OSX. It also does not work correctly with some locales on Windows.
|
||||||
// return wxNumberFormatter::ToString(value, max_precision, wxNumberFormatter::Style_NoTrailingZeroes);
|
// return wxNumberFormatter::ToString(value, max_precision, wxNumberFormatter::Style_NoTrailingZeroes);
|
||||||
|
@ -134,7 +134,7 @@ public:
|
|||||||
memDC.SelectObject(bitmap);
|
memDC.SelectObject(bitmap);
|
||||||
|
|
||||||
memDC.SetFont(m_action_font);
|
memDC.SetFont(m_action_font);
|
||||||
memDC.SetTextForeground(wxColour(237, 107, 33));
|
memDC.SetTextForeground(wxColour(0, 102, 255));
|
||||||
memDC.DrawText(text, int(m_scale * 60), int(m_scale * 275));
|
memDC.DrawText(text, int(m_scale * 60), int(m_scale * 275));
|
||||||
|
|
||||||
memDC.SelectObject(wxNullBitmap);
|
memDC.SelectObject(wxNullBitmap);
|
||||||
@ -186,9 +186,9 @@ public:
|
|||||||
BitmapCache bmp_cache;
|
BitmapCache bmp_cache;
|
||||||
int logo_size = lround(width * 0.25);
|
int logo_size = lround(width * 0.25);
|
||||||
#if ENABLE_GCODE_VIEWER
|
#if ENABLE_GCODE_VIEWER
|
||||||
wxBitmap logo_bmp = *bmp_cache.load_svg(wxGetApp().is_editor() ? "prusa_slicer_logo" : "add_gcode", logo_size, logo_size);
|
wxBitmap logo_bmp = *bmp_cache.load_svg(wxGetApp().is_editor() ? "super_slicer_logo" : "add_gcode", logo_size, logo_size);
|
||||||
#else
|
#else
|
||||||
wxBitmap logo_bmp = *bmp_cache.load_svg("prusa_slicer_logo", logo_size, logo_size);
|
wxBitmap logo_bmp = *bmp_cache.load_svg("super_slicer_logo", logo_size, logo_size);
|
||||||
#endif // ENABLE_GCODE_VIEWER
|
#endif // ENABLE_GCODE_VIEWER
|
||||||
|
|
||||||
wxCoord margin = int(m_scale * 20);
|
wxCoord margin = int(m_scale * 20);
|
||||||
@ -761,7 +761,7 @@ bool GUI_App::on_init_inner()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// create splash screen with updated bmp
|
// create splash screen with updated bmp
|
||||||
scrn = new SplashScreen(bmp.IsOk() ? bmp : create_scaled_bitmap("prusa_slicer_logo", nullptr, 400),
|
scrn = new SplashScreen(bmp.IsOk() ? bmp : create_scaled_bitmap("super_slicer_logo", nullptr, 400),
|
||||||
wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_TIMEOUT, 4000, splashscreen_pos);
|
wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_TIMEOUT, 4000, splashscreen_pos);
|
||||||
wxYield();
|
wxYield();
|
||||||
scrn->SetText(_L("Loading configuration..."));
|
scrn->SetText(_L("Loading configuration..."));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user