mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-08 23:46:24 -06:00
Enhancement: Adaptive Pressure advance (#5609)
* 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>
This commit is contained in:
parent
543a1e5c37
commit
529c44d8e3
15 changed files with 1067 additions and 15 deletions
76
src/libslic3r/GCode/PchipInterpolatorHelper.hpp
Normal file
76
src/libslic3r/GCode/PchipInterpolatorHelper.hpp
Normal file
|
@ -0,0 +1,76 @@
|
|||
// PchipInterpolatorHelper.hpp
|
||||
// OrcaSlicer
|
||||
//
|
||||
// Header file for the PchipInterpolatorHelper class, responsible for performing Piecewise Cubic Hermite Interpolating Polynomial (PCHIP) interpolation on given data points.
|
||||
|
||||
#ifndef PCHIPINTERPOLATORHELPER_HPP
|
||||
#define PCHIPINTERPOLATORHELPER_HPP
|
||||
|
||||
#include <vector>
|
||||
|
||||
/**
|
||||
* @class PchipInterpolatorHelper
|
||||
* @brief A helper class to perform Piecewise Cubic Hermite Interpolating Polynomial (PCHIP) interpolation.
|
||||
*/
|
||||
class PchipInterpolatorHelper {
|
||||
public:
|
||||
/**
|
||||
* @brief Default constructor.
|
||||
*/
|
||||
PchipInterpolatorHelper() = default;
|
||||
|
||||
/**
|
||||
* @brief Constructs the PCHIP interpolator with given data points.
|
||||
* @param x The x-coordinates of the data points.
|
||||
* @param y The y-coordinates of the data points.
|
||||
*/
|
||||
PchipInterpolatorHelper(const std::vector<double>& x, const std::vector<double>& y);
|
||||
|
||||
/**
|
||||
* @brief Sets the data points for the interpolator.
|
||||
* @param x The x-coordinates of the data points.
|
||||
* @param y The y-coordinates of the data points.
|
||||
* @throw std::invalid_argument if x and y have different sizes or if they contain fewer than two points.
|
||||
*/
|
||||
void setData(const std::vector<double>& x, const std::vector<double>& y);
|
||||
|
||||
/**
|
||||
* @brief Interpolates the value at a given point.
|
||||
* @param xi The x-coordinate at which to interpolate.
|
||||
* @return The interpolated y-coordinate.
|
||||
*/
|
||||
double interpolate(double xi) const;
|
||||
|
||||
private:
|
||||
std::vector<double> x_; ///< The x-coordinates of the data points.
|
||||
std::vector<double> y_; ///< The y-coordinates of the data points.
|
||||
std::vector<double> h_; ///< The differences between successive x-coordinates.
|
||||
std::vector<double> delta_; ///< The slopes of the segments between successive data points.
|
||||
std::vector<double> d_; ///< The derivatives at the data points.
|
||||
|
||||
/**
|
||||
* @brief Computes the PCHIP coefficients.
|
||||
*/
|
||||
void computePCHIP();
|
||||
|
||||
/**
|
||||
* @brief Sorts the data points by x-coordinate.
|
||||
*/
|
||||
void sortData();
|
||||
|
||||
/**
|
||||
* @brief Computes the difference between successive x-coordinates.
|
||||
* @param i The index of the x-coordinate.
|
||||
* @return The difference between x_[i+1] and x_[i].
|
||||
*/
|
||||
double h(int i) const { return x_[i+1] - x_[i]; }
|
||||
|
||||
/**
|
||||
* @brief Computes the slope of the segment between successive data points.
|
||||
* @param i The index of the segment.
|
||||
* @return The slope of the segment between y_[i] and y_[i+1].
|
||||
*/
|
||||
double delta(int i) const { return (y_[i+1] - y_[i]) / h(i); }
|
||||
};
|
||||
|
||||
#endif // PCHIPINTERPOLATORHELPER_HPP
|
Loading…
Add table
Add a link
Reference in a new issue