mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2026-03-13 06:46:11 -06:00
* Adaptive Pressure advance options setup * Dynamic PA - PCHIP interpolator code and tests * Integrate dynamic PA with slicing code - emit new PA values per speed change * Link adaptive PA to role change instead of speed change * Adaptive PA - Alpha 2 Reduce the frequency of requested PA changes by introducing a "state" variable. Implement user toggle for adapting PA for external walls for overhangs * Hide adaptive PA for overhangs * Convert Adaptive PA to use volumetric flow model and start preparing for converting to Gcode post processor * Converted Dynamic PA to a post processing filter. Reverted changes in GCode cpp and created tagging mechanism to allow filter to apply PA changes. * Removed adaptive PA for overhangs * Foundations for two dimensional adaptive PA based on acceleration and volumetric flow speed * Minor code cleanup and updating of tooltips * Renaming files for better clarity and generate classes documentation * Update src/libslic3r/PrintConfig.cpp Co-authored-by: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> * Update src/libslic3r/PrintConfig.cpp Co-authored-by: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> * Update src/libslic3r/PrintConfig.cpp Co-authored-by: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> * Introduce average mm3_mm over the length of a multipath for adaptive PA * Updates for multipath handling part 2 * Introduce average mm3_mm over the length of a multipath for adaptive PA * Trigger PA evaluation more frequently to catch edge cases where speed changes across islands of the same feature type. * Updates for multipath handling part 2 * Adaptive PA: Implement average flow estimation on loops * Code formatting * Fix adaptive PA not adapting for small disconnected external wall line segments. * Updated to take max print speed of upcoming feature to calculate new PA value. This is to resolve issue of incorrect PA value used when starting a new feature at an overhang. * Code clean up * Performance tuning * Further performance tuning by reducing use of regex commands in the nested loops and fix bug preventing gcode line output * Further performance tuning and tweaks to stop searching for max speed after the first travel move. * Reduce debug information * Updated debug info * Fix an issue on seams on specific models when wipe before external perimeter was enabled. Also cleanup documentation and add new to-do's * Prepare for adaptive PA for overhangs, fix wipe bug & clean up code and comments * Initial commit for adapting PA when extruding fully overhanging perimeters * Ignore wipe command when identifying current print speed * Option to evaluate adaptive PA on overhang regions in preparation for Klipper experimental option testing * Update to issue PA changes for varying flow conditions within the same feature * Fix bug where adaptive PA was enabled erroneously for role changes and ignoring user's preference. * Refactored some code * More refactoring * Some bug fixes and enabled comments only when verbose g-code is enabled * Introduced dedicated PA option for bridges * Code refactoring to optimise initialisation of PA processor (making it faster). Fix a bug where PA was not always set after a toolchange. Improve general error handling and robustness. * Updates to adaptive PA tooltips * Bridging PA check with Epsilon instead of 0. * Adaptive PA: addressing comments --------- Co-authored-by: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com>
85 lines
3.4 KiB
C++
85 lines
3.4 KiB
C++
// AdaptivePAProcessor.hpp
|
|
// OrcaSlicer
|
|
//
|
|
// Header file for the AdaptivePAProcessor class, responsible for processing G-code layers for the purposes of applying adaptive pressure advance.
|
|
|
|
#ifndef ADAPTIVEPAPROCESSOR_H
|
|
#define ADAPTIVEPAPROCESSOR_H
|
|
|
|
#include <string>
|
|
#include <sstream>
|
|
#include <regex>
|
|
#include <memory>
|
|
#include <map>
|
|
#include <vector>
|
|
#include "AdaptivePAInterpolator.hpp"
|
|
|
|
namespace Slic3r {
|
|
|
|
// Forward declaration of GCode class
|
|
class GCode;
|
|
|
|
/**
|
|
* @brief Class for processing G-code layers with adaptive pressure advance.
|
|
*/
|
|
class AdaptivePAProcessor {
|
|
public:
|
|
/**
|
|
* @brief Constructor for AdaptivePAProcessor.
|
|
*
|
|
* This constructor initializes the AdaptivePAProcessor with a reference to a GCode object.
|
|
* It also initializes the configuration reference, pressure advance interpolation object,
|
|
* and regular expression patterns used for processing the G-code.
|
|
*
|
|
* @param gcodegen A reference to the GCode object that generates the G-code.
|
|
*/
|
|
AdaptivePAProcessor(GCode &gcodegen, const std::vector<unsigned int> &tools_used);
|
|
|
|
/**
|
|
* @brief Processes a layer of G-code and applies adaptive pressure advance.
|
|
*
|
|
* This method processes the G-code for a single layer, identifying the appropriate
|
|
* pressure advance settings and applying them based on the current state and configurations.
|
|
*
|
|
* @param gcode A string containing the G-code for the layer.
|
|
* @return A string containing the processed G-code with adaptive pressure advance applied.
|
|
*/
|
|
std::string process_layer(std::string &&gcode);
|
|
|
|
/**
|
|
* @brief Manually sets adaptive PA internal value.
|
|
*
|
|
* This method manually sets the adaptive PA internally held value.
|
|
* Call this when changing tools or in any other case where the internally assumed last PA value may be incorrect
|
|
*/
|
|
void resetPreviousPA(double PA){ m_last_predicted_pa = PA; };
|
|
|
|
private:
|
|
GCode &m_gcodegen; ///< Reference to the GCode object.
|
|
std::unordered_map<unsigned int, std::unique_ptr<AdaptivePAInterpolator>> m_AdaptivePAInterpolators; ///< Map between Interpolator objects and tool ID's
|
|
const PrintConfig &m_config; ///< Reference to the print configuration.
|
|
double m_last_predicted_pa; ///< Last predicted pressure advance value.
|
|
double m_max_next_feedrate; ///< Maximum feed rate (speed) for the upcomming island. If no speed is found, the previous island speed is used.
|
|
double m_next_feedrate; ///< First feed rate (speed) for the upcomming island.
|
|
double m_current_feedrate; ///< Current, latest feedrate.
|
|
int m_last_extruder_id; ///< Last used extruder ID.
|
|
|
|
std::regex m_pa_change_pattern; ///< Regular expression to detect PA_CHANGE pattern.
|
|
std::regex m_g1_f_pattern; ///< Regular expression to detect G1 F pattern.
|
|
std::smatch m_match; ///< Match results for regular expressions.
|
|
|
|
/**
|
|
* @brief Get the PA interpolator attached to the specified tool ID.
|
|
*
|
|
* This method manually sets the adaptive PA internally held value.
|
|
* Call this when changing tools or in any other case where the internally assumed last PA value may be incorrect
|
|
*
|
|
* @param An integer with the tool ID for which the PA interpolation model is to be returned.
|
|
* @return The Adaptive PA Interpolator object corresponding to that tool.
|
|
*/
|
|
AdaptivePAInterpolator* getInterpolator(unsigned int tool_id);
|
|
};
|
|
|
|
} // namespace Slic3r
|
|
|
|
#endif // ADAPTIVEPAPROCESSOR_H
|