mirror of
https://git.mirrors.martin98.com/https://github.com/bambulab/BambuStudio.git
synced 2025-09-29 11:23:14 +08:00
ENH:add auto contour and hole params for filaments
Jira: none Signed-off-by: qing.zhang <qing.zhang@bambulab.com> Change-Id: I4389d64e82773081cbab5601eb0d5aec5473096e
This commit is contained in:
parent
1cde0b844a
commit
b2fa093993
@ -94,6 +94,36 @@
|
|||||||
"Bambu Lab H2D 0.6 nozzle",
|
"Bambu Lab H2D 0.6 nozzle",
|
||||||
"Bambu Lab H2D 0.8 nozzle"
|
"Bambu Lab H2D 0.8 nozzle"
|
||||||
],
|
],
|
||||||
|
"counter_coef_1": [
|
||||||
|
"0"
|
||||||
|
],
|
||||||
|
"counter_coef_2": [
|
||||||
|
"3860"
|
||||||
|
],
|
||||||
|
"counter_coef_3": [
|
||||||
|
"-32000"
|
||||||
|
],
|
||||||
|
"hole_coef_1": [
|
||||||
|
"0"
|
||||||
|
],
|
||||||
|
"hole_coef_2": [
|
||||||
|
"-8000"
|
||||||
|
],
|
||||||
|
"hole_coef_3": [
|
||||||
|
"135000"
|
||||||
|
],
|
||||||
|
"counter_limit_min": [
|
||||||
|
"-35000"
|
||||||
|
],
|
||||||
|
"counter_limit_max": [
|
||||||
|
"33000"
|
||||||
|
],
|
||||||
|
"hole_limit_min": [
|
||||||
|
"88000"
|
||||||
|
],
|
||||||
|
"hole_limit_max": [
|
||||||
|
"220000"
|
||||||
|
],
|
||||||
"filament_start_gcode": [
|
"filament_start_gcode": [
|
||||||
"; filament start gcode\nM145 P1 ; set airduct mode to heating mode\n"
|
"; filament start gcode\nM145 P1 ; set airduct mode to heating mode\n"
|
||||||
],
|
],
|
||||||
|
@ -103,6 +103,36 @@
|
|||||||
"compatible_printers": [
|
"compatible_printers": [
|
||||||
"Bambu Lab H2D 0.4 nozzle"
|
"Bambu Lab H2D 0.4 nozzle"
|
||||||
],
|
],
|
||||||
|
"counter_coef_1": [
|
||||||
|
"0"
|
||||||
|
],
|
||||||
|
"counter_coef_2": [
|
||||||
|
"6500"
|
||||||
|
],
|
||||||
|
"counter_coef_3": [
|
||||||
|
"-32000"
|
||||||
|
],
|
||||||
|
"hole_coef_1": [
|
||||||
|
"0"
|
||||||
|
],
|
||||||
|
"hole_coef_2": [
|
||||||
|
"-8000"
|
||||||
|
],
|
||||||
|
"hole_coef_3": [
|
||||||
|
"135000"
|
||||||
|
],
|
||||||
|
"counter_limit_min": [
|
||||||
|
"-35000"
|
||||||
|
],
|
||||||
|
"counter_limit_max": [
|
||||||
|
"33000"
|
||||||
|
],
|
||||||
|
"hole_limit_min": [
|
||||||
|
"88000"
|
||||||
|
],
|
||||||
|
"hole_limit_max": [
|
||||||
|
"220000"
|
||||||
|
],
|
||||||
"filament_start_gcode": [
|
"filament_start_gcode": [
|
||||||
"; filament start gcode\nM145 P0 ; set airduct mode to cooling mode\nM142 P1 R35 S40 U0.3 V0.5 ; set chamber autocooling"
|
"; filament start gcode\nM145 P0 ; set airduct mode to cooling mode\nM142 P1 R35 S40 U0.3 V0.5 ; set chamber autocooling"
|
||||||
],
|
],
|
||||||
|
@ -100,6 +100,36 @@
|
|||||||
"compatible_printers": [
|
"compatible_printers": [
|
||||||
"Bambu Lab H2D 0.4 nozzle"
|
"Bambu Lab H2D 0.4 nozzle"
|
||||||
],
|
],
|
||||||
|
"counter_coef_1": [
|
||||||
|
"0"
|
||||||
|
],
|
||||||
|
"counter_coef_2": [
|
||||||
|
"5650"
|
||||||
|
],
|
||||||
|
"counter_coef_3": [
|
||||||
|
"-20200"
|
||||||
|
],
|
||||||
|
"hole_coef_1": [
|
||||||
|
"0"
|
||||||
|
],
|
||||||
|
"hole_coef_2": [
|
||||||
|
"-12100"
|
||||||
|
],
|
||||||
|
"hole_coef_3": [
|
||||||
|
"145000"
|
||||||
|
],
|
||||||
|
"counter_limit_min": [
|
||||||
|
"-35000"
|
||||||
|
],
|
||||||
|
"counter_limit_max": [
|
||||||
|
"30000"
|
||||||
|
],
|
||||||
|
"hole_limit_min": [
|
||||||
|
"88000"
|
||||||
|
],
|
||||||
|
"hole_limit_max": [
|
||||||
|
"220000"
|
||||||
|
],
|
||||||
"filament_start_gcode": [
|
"filament_start_gcode": [
|
||||||
"; filament start gcode\nM145 P0 ; set airduct mode to cooling mode\nM142 P1 R35 S40 U0.3 V0.5 ; set chamber autocooling"
|
"; filament start gcode\nM145 P0 ; set airduct mode to cooling mode\nM142 P1 R35 S40 U0.3 V0.5 ; set chamber autocooling"
|
||||||
],
|
],
|
||||||
|
@ -98,6 +98,36 @@
|
|||||||
"Bambu Lab H2D 0.4 nozzle",
|
"Bambu Lab H2D 0.4 nozzle",
|
||||||
"Bambu Lab H2D 0.6 nozzle"
|
"Bambu Lab H2D 0.6 nozzle"
|
||||||
],
|
],
|
||||||
|
"counter_coef_1": [
|
||||||
|
"0"
|
||||||
|
],
|
||||||
|
"counter_coef_2": [
|
||||||
|
"8000"
|
||||||
|
],
|
||||||
|
"counter_coef_3": [
|
||||||
|
"-51000"
|
||||||
|
],
|
||||||
|
"hole_coef_1": [
|
||||||
|
"0"
|
||||||
|
],
|
||||||
|
"hole_coef_2": [
|
||||||
|
"-8000"
|
||||||
|
],
|
||||||
|
"hole_coef_3": [
|
||||||
|
"201150"
|
||||||
|
],
|
||||||
|
"counter_limit_min": [
|
||||||
|
"-35000"
|
||||||
|
],
|
||||||
|
"counter_limit_max": [
|
||||||
|
"33000"
|
||||||
|
],
|
||||||
|
"hole_limit_min": [
|
||||||
|
"88000"
|
||||||
|
],
|
||||||
|
"hole_limit_max": [
|
||||||
|
"220000"
|
||||||
|
],
|
||||||
"filament_start_gcode": [
|
"filament_start_gcode": [
|
||||||
"; filament start gcode\nM145 P0 ; set airduct mode to cooling mode\nM142 P1 R35 S40 U0.3 V0.5 ; set chamber autocooling"
|
"; filament start gcode\nM145 P0 ; set airduct mode to cooling mode\nM142 P1 R35 S40 U0.3 V0.5 ; set chamber autocooling"
|
||||||
],
|
],
|
||||||
|
@ -88,6 +88,36 @@
|
|||||||
"compatible_printers": [
|
"compatible_printers": [
|
||||||
"Bambu Lab H2D 0.4 nozzle"
|
"Bambu Lab H2D 0.4 nozzle"
|
||||||
],
|
],
|
||||||
|
"counter_coef_1": [
|
||||||
|
"0"
|
||||||
|
],
|
||||||
|
"counter_coef_2": [
|
||||||
|
"7500"
|
||||||
|
],
|
||||||
|
"counter_coef_3": [
|
||||||
|
"-52000"
|
||||||
|
],
|
||||||
|
"hole_coef_1": [
|
||||||
|
"0"
|
||||||
|
],
|
||||||
|
"hole_coef_2": [
|
||||||
|
"-10250"
|
||||||
|
],
|
||||||
|
"hole_coef_3": [
|
||||||
|
"197450"
|
||||||
|
],
|
||||||
|
"counter_limit_min": [
|
||||||
|
"-35000"
|
||||||
|
],
|
||||||
|
"counter_limit_max": [
|
||||||
|
"33000"
|
||||||
|
],
|
||||||
|
"hole_limit_min": [
|
||||||
|
"88000"
|
||||||
|
],
|
||||||
|
"hole_limit_max": [
|
||||||
|
"220000"
|
||||||
|
],
|
||||||
"filament_start_gcode": [
|
"filament_start_gcode": [
|
||||||
"; filament start gcode\nM145 P0 ; set airduct mode to cooling mode\nM142 P1 R35 S40 U0.3 V0.5 ; set chamber autocooling"
|
"; filament start gcode\nM145 P0 ; set airduct mode to cooling mode\nM142 P1 R35 S40 U0.3 V0.5 ; set chamber autocooling"
|
||||||
],
|
],
|
||||||
|
@ -192,6 +192,42 @@
|
|||||||
"textured_plate_temp_initial_layer": [
|
"textured_plate_temp_initial_layer": [
|
||||||
"60"
|
"60"
|
||||||
],
|
],
|
||||||
|
"counter_coef_1": [
|
||||||
|
"0"
|
||||||
|
],
|
||||||
|
"counter_coef_2": [
|
||||||
|
"25000"
|
||||||
|
],
|
||||||
|
"counter_coef_3": [
|
||||||
|
"-110000"
|
||||||
|
],
|
||||||
|
"hole_coef_1": [
|
||||||
|
"0"
|
||||||
|
],
|
||||||
|
"hole_coef_2": [
|
||||||
|
"-25000"
|
||||||
|
],
|
||||||
|
"hole_coef_3": [
|
||||||
|
"280000"
|
||||||
|
],
|
||||||
|
"counter_limit_min": [
|
||||||
|
"-40000"
|
||||||
|
],
|
||||||
|
"counter_limit_max": [
|
||||||
|
"50000"
|
||||||
|
],
|
||||||
|
"hole_limit_min": [
|
||||||
|
"80000"
|
||||||
|
],
|
||||||
|
"hole_limit_max": [
|
||||||
|
"250000"
|
||||||
|
],
|
||||||
|
"circle_compensation_speed": [
|
||||||
|
"200"
|
||||||
|
],
|
||||||
|
"diameter_limit": [
|
||||||
|
"50"
|
||||||
|
],
|
||||||
"compatible_printers": [],
|
"compatible_printers": [],
|
||||||
"impact_strength_z":["10"],
|
"impact_strength_z":["10"],
|
||||||
"filament_start_gcode": [
|
"filament_start_gcode": [
|
||||||
|
@ -133,5 +133,6 @@
|
|||||||
"wipe_tower_no_sparse_layers": "0",
|
"wipe_tower_no_sparse_layers": "0",
|
||||||
"xy_contour_compensation": "0",
|
"xy_contour_compensation": "0",
|
||||||
"xy_hole_compensation": "0",
|
"xy_hole_compensation": "0",
|
||||||
"z_direction_outwall_speed_continuous": "0"
|
"z_direction_outwall_speed_continuous": "0",
|
||||||
|
"enable_circle_compensation": "0"
|
||||||
}
|
}
|
@ -5298,7 +5298,7 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
|
|||||||
speed = m_config.inner_wall_speed.get_at(cur_extruder_index());
|
speed = m_config.inner_wall_speed.get_at(cur_extruder_index());
|
||||||
//reset speed by auto compensation speed
|
//reset speed by auto compensation speed
|
||||||
if(set_holes_and_compensation_speed) {
|
if(set_holes_and_compensation_speed) {
|
||||||
speed = m_config.circle_compensation_speed;
|
speed = m_config.circle_compensation_speed.get_at(cur_extruder_index());
|
||||||
}else if (m_config.detect_overhang_wall && m_config.smooth_speed_discontinuity_area && path.smooth_speed != 0)
|
}else if (m_config.detect_overhang_wall && m_config.smooth_speed_discontinuity_area && path.smooth_speed != 0)
|
||||||
speed = path.smooth_speed;
|
speed = path.smooth_speed;
|
||||||
else if (m_config.enable_overhang_speed.get_at(cur_extruder_index())) {
|
else if (m_config.enable_overhang_speed.get_at(cur_extruder_index())) {
|
||||||
@ -5310,7 +5310,7 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
|
|||||||
speed = m_config.outer_wall_speed.get_at(cur_extruder_index());
|
speed = m_config.outer_wall_speed.get_at(cur_extruder_index());
|
||||||
// reset speed by auto compensation speed
|
// reset speed by auto compensation speed
|
||||||
if (set_holes_and_compensation_speed) {
|
if (set_holes_and_compensation_speed) {
|
||||||
speed = m_config.circle_compensation_speed;
|
speed = m_config.circle_compensation_speed.get_at(cur_extruder_index());
|
||||||
} else if (m_config.detect_overhang_wall && m_config.smooth_speed_discontinuity_area && path.smooth_speed != 0)
|
} else if (m_config.detect_overhang_wall && m_config.smooth_speed_discontinuity_area && path.smooth_speed != 0)
|
||||||
speed = path.smooth_speed;
|
speed = path.smooth_speed;
|
||||||
else if (m_config.enable_overhang_speed.get_at(cur_extruder_index())) {
|
else if (m_config.enable_overhang_speed.get_at(cur_extruder_index())) {
|
||||||
|
@ -141,13 +141,12 @@ ExPolygons Layer::merged(float offset_scaled) const
|
|||||||
// Here the perimeters are created cummulatively for all layer regions sharing the same parameters influencing the perimeters.
|
// Here the perimeters are created cummulatively for all layer regions sharing the same parameters influencing the perimeters.
|
||||||
// The perimeter paths and the thin fills (ExtrusionEntityCollection) are assigned to the first compatible layer region.
|
// The perimeter paths and the thin fills (ExtrusionEntityCollection) are assigned to the first compatible layer region.
|
||||||
// The resulting fill surface is split back among the originating regions.
|
// The resulting fill surface is split back among the originating regions.
|
||||||
void Layer::make_perimeters()
|
void Layer::make_perimeters(const AutoContourHolesCompensationParams &auto_contour_holes_compensation_params)
|
||||||
{
|
{
|
||||||
BOOST_LOG_TRIVIAL(trace) << "Generating perimeters for layer " << this->id();
|
BOOST_LOG_TRIVIAL(trace) << "Generating perimeters for layer " << this->id();
|
||||||
|
|
||||||
// keep track of regions whose perimeters we have already generated
|
// keep track of regions whose perimeters we have already generated
|
||||||
std::vector<unsigned char> done(m_regions.size(), false);
|
std::vector<unsigned char> done(m_regions.size(), false);
|
||||||
|
|
||||||
for (LayerRegionPtrs::iterator layerm = m_regions.begin(); layerm != m_regions.end(); ++ layerm)
|
for (LayerRegionPtrs::iterator layerm = m_regions.begin(); layerm != m_regions.end(); ++ layerm)
|
||||||
if ((*layerm)->slices.empty()) {
|
if ((*layerm)->slices.empty()) {
|
||||||
(*layerm)->perimeters.clear();
|
(*layerm)->perimeters.clear();
|
||||||
@ -199,7 +198,7 @@ void Layer::make_perimeters()
|
|||||||
(*layerm)->fill_surfaces.surfaces.clear();
|
(*layerm)->fill_surfaces.surfaces.clear();
|
||||||
if (this->object()->config().enable_circle_compensation) {
|
if (this->object()->config().enable_circle_compensation) {
|
||||||
SurfaceCollection copy_slices = (*layerm)->slices;
|
SurfaceCollection copy_slices = (*layerm)->slices;
|
||||||
(*layerm)->auto_circle_compensation(copy_slices);
|
(*layerm)->auto_circle_compensation(copy_slices, auto_contour_holes_compensation_params);
|
||||||
(*layerm)->make_perimeters(copy_slices, &(*layerm)->fill_surfaces, &(*layerm)->fill_no_overlap_expolygons, this->loop_nodes);
|
(*layerm)->make_perimeters(copy_slices, &(*layerm)->fill_surfaces, &(*layerm)->fill_no_overlap_expolygons, this->loop_nodes);
|
||||||
} else
|
} else
|
||||||
(*layerm)->make_perimeters((*layerm)->slices, &(*layerm)->fill_surfaces, &(*layerm)->fill_no_overlap_expolygons, this->loop_nodes);
|
(*layerm)->make_perimeters((*layerm)->slices, &(*layerm)->fill_surfaces, &(*layerm)->fill_no_overlap_expolygons, this->loop_nodes);
|
||||||
@ -228,7 +227,7 @@ void Layer::make_perimeters()
|
|||||||
//BBS
|
//BBS
|
||||||
ExPolygons fill_no_overlap;
|
ExPolygons fill_no_overlap;
|
||||||
if (this->object()->config().enable_circle_compensation)
|
if (this->object()->config().enable_circle_compensation)
|
||||||
layerm_config->auto_circle_compensation(new_slices);
|
layerm_config->auto_circle_compensation(new_slices, auto_contour_holes_compensation_params);
|
||||||
layerm_config->make_perimeters(new_slices, &fill_surfaces, &fill_no_overlap, this->loop_nodes);
|
layerm_config->make_perimeters(new_slices, &fill_surfaces, &fill_no_overlap, this->loop_nodes);
|
||||||
|
|
||||||
// assign fill_surfaces to each layer
|
// assign fill_surfaces to each layer
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include "SurfaceCollection.hpp"
|
#include "SurfaceCollection.hpp"
|
||||||
#include "ExtrusionEntityCollection.hpp"
|
#include "ExtrusionEntityCollection.hpp"
|
||||||
#include "RegionExpansion.hpp"
|
#include "RegionExpansion.hpp"
|
||||||
|
#include <libslic3r/Print.hpp>
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ public:
|
|||||||
void slices_to_fill_surfaces_clipped();
|
void slices_to_fill_surfaces_clipped();
|
||||||
void prepare_fill_surfaces();
|
void prepare_fill_surfaces();
|
||||||
//BBS
|
//BBS
|
||||||
void auto_circle_compensation(SurfaceCollection &slices);
|
void auto_circle_compensation(SurfaceCollection &slices, const AutoContourHolesCompensationParams &auto_contour_holes_compensation_params);
|
||||||
void make_perimeters(const SurfaceCollection &slices, SurfaceCollection* fill_surfaces, ExPolygons* fill_no_overlap, std::vector<LoopNode> &loop_nodes);
|
void make_perimeters(const SurfaceCollection &slices, SurfaceCollection* fill_surfaces, ExPolygons* fill_no_overlap, std::vector<LoopNode> &loop_nodes);
|
||||||
void process_external_surfaces(const Layer *lower_layer, const Polygons *lower_layer_covered);
|
void process_external_surfaces(const Layer *lower_layer, const Polygons *lower_layer_covered);
|
||||||
double infill_area_threshold() const;
|
double infill_area_threshold() const;
|
||||||
@ -182,7 +182,7 @@ public:
|
|||||||
for (const LayerRegion *layerm : m_regions) if (layerm->slices.any_bottom_contains(item)) return true;
|
for (const LayerRegion *layerm : m_regions) if (layerm->slices.any_bottom_contains(item)) return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
void make_perimeters();
|
void make_perimeters(const AutoContourHolesCompensationParams &auto_contour_holes_compensation_params);
|
||||||
//BBS
|
//BBS
|
||||||
void calculate_perimeter_continuity(std::vector<LoopNode> &prev_nodes);
|
void calculate_perimeter_continuity(std::vector<LoopNode> &prev_nodes);
|
||||||
|
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
#include <boost/log/trivial.hpp>
|
#include <boost/log/trivial.hpp>
|
||||||
|
static const double max_deviation = 0.5 * 1e6;
|
||||||
|
static const double max_variance = 500 * 1e6;
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
|
|
||||||
@ -64,27 +66,25 @@ void LayerRegion::slices_to_fill_surfaces_clipped()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LayerRegion::auto_circle_compensation(SurfaceCollection& slices)
|
void LayerRegion::auto_circle_compensation(SurfaceCollection& slices, const AutoContourHolesCompensationParams &auto_contour_holes_compensation_params)
|
||||||
{
|
{
|
||||||
const PrintObjectConfig &object_config = this->layer()->object()->config();
|
int filament_idx = this->region().config().wall_filament;
|
||||||
double max_deviation = object_config.max_deviation * 1e6;
|
|
||||||
double max_variance = object_config.max_variance * 1e6;
|
|
||||||
double limited_speed = object_config.circle_compensation_speed;
|
|
||||||
|
|
||||||
double counter_speed_coef = object_config.counter_coef_1 / 1e6;
|
double limited_speed = auto_contour_holes_compensation_params.circle_compensation_speed[filament_idx];
|
||||||
double counter_diameter_coef = object_config.counter_coef_2 / 1e6;
|
double counter_speed_coef = auto_contour_holes_compensation_params.counter_speed_coef[filament_idx] / 1e6;
|
||||||
double counter_compensate_coef = object_config.counter_coef_3;
|
double counter_diameter_coef = auto_contour_holes_compensation_params.counter_diameter_coef[filament_idx] / 1e6;
|
||||||
|
double counter_compensate_coef = auto_contour_holes_compensation_params.counter_compensate_coef[filament_idx];
|
||||||
|
|
||||||
double hole_speed_coef = object_config.hole_coef_1 / 1e6;
|
double hole_speed_coef = auto_contour_holes_compensation_params.hole_speed_coef[filament_idx] / 1e6;
|
||||||
double hole_diameter_coef = object_config.hole_coef_2 / 1e6;
|
double hole_diameter_coef = auto_contour_holes_compensation_params.hole_diameter_coef[filament_idx] / 1e6;
|
||||||
double hole_compensate_coef = object_config.hole_coef_3;
|
double hole_compensate_coef = auto_contour_holes_compensation_params.hole_compensate_coef[filament_idx];
|
||||||
|
|
||||||
double counter_limit_min_value = object_config.counter_limit_min;
|
double counter_limit_min_value = auto_contour_holes_compensation_params.counter_limit_min_value[filament_idx];
|
||||||
double counter_limit_max_value = object_config.counter_limit_max;
|
double counter_limit_max_value = auto_contour_holes_compensation_params.counter_limit_max_value[filament_idx];
|
||||||
double hole_limit_min_value = object_config.hole_limit_min;
|
double hole_limit_min_value = auto_contour_holes_compensation_params.hole_limit_min_value[filament_idx];
|
||||||
double hole_limit_max_value = object_config.hole_limit_max;
|
double hole_limit_max_value = auto_contour_holes_compensation_params.hole_limit_max_value[filament_idx];
|
||||||
|
|
||||||
double diameter_limit_value = object_config.diameter_limit;
|
double diameter_limit_value = auto_contour_holes_compensation_params.diameter_limit[filament_idx];
|
||||||
|
|
||||||
for (Surface &surface : slices.surfaces) {
|
for (Surface &surface : slices.surfaces) {
|
||||||
Point center;
|
Point center;
|
||||||
|
@ -880,7 +880,7 @@ static std::vector<std::string> s_Preset_print_options {
|
|||||||
"top_surface_line_width", "support_line_width", "infill_wall_overlap", "bridge_flow",
|
"top_surface_line_width", "support_line_width", "infill_wall_overlap", "bridge_flow",
|
||||||
"elefant_foot_compensation", "xy_contour_compensation", "xy_hole_compensation", "resolution", "enable_prime_tower",
|
"elefant_foot_compensation", "xy_contour_compensation", "xy_hole_compensation", "resolution", "enable_prime_tower",
|
||||||
"prime_tower_width", "prime_tower_brim_width", "prime_tower_outer_first", "prime_tower_skip_points", "prime_volume",
|
"prime_tower_width", "prime_tower_brim_width", "prime_tower_outer_first", "prime_tower_skip_points", "prime_volume",
|
||||||
"enable_circle_compensation", "circle_compensation_speed", "max_deviation", "max_variance",
|
"enable_circle_compensation", "circle_compensation_speed",
|
||||||
"counter_coef_1", "counter_coef_2", "counter_coef_3", "hole_coef_1", "hole_coef_2", "hole_coef_3",
|
"counter_coef_1", "counter_coef_2", "counter_coef_3", "hole_coef_1", "hole_coef_2", "hole_coef_3",
|
||||||
"counter_limit_min", "counter_limit_max", "hole_limit_min", "hole_limit_max", "diameter_limit",
|
"counter_limit_min", "counter_limit_max", "hole_limit_min", "hole_limit_max", "diameter_limit",
|
||||||
"wipe_tower_no_sparse_layers", "compatible_printers", "compatible_printers_condition", "inherits",
|
"wipe_tower_no_sparse_layers", "compatible_printers", "compatible_printers_condition", "inherits",
|
||||||
|
@ -1699,7 +1699,7 @@ void Print::process(std::unordered_map<std::string, long long>* slice_time, bool
|
|||||||
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": total object counts %1% in current print, need to slice %2%")%m_objects.size()%need_slicing_objects.size();
|
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": total object counts %1% in current print, need to slice %2%")%m_objects.size()%need_slicing_objects.size();
|
||||||
BOOST_LOG_TRIVIAL(info) << "Starting the slicing process." << log_memory_info();
|
BOOST_LOG_TRIVIAL(info) << "Starting the slicing process." << log_memory_info();
|
||||||
|
|
||||||
|
const AutoContourHolesCompensationParams &auto_contour_holes_compensation_params = AutoContourHolesCompensationParams(m_config);
|
||||||
if (!use_cache) {
|
if (!use_cache) {
|
||||||
|
|
||||||
if (slice_time) {
|
if (slice_time) {
|
||||||
@ -1709,7 +1709,7 @@ void Print::process(std::unordered_map<std::string, long long>* slice_time, bool
|
|||||||
|
|
||||||
for (PrintObject* obj : m_objects) {
|
for (PrintObject* obj : m_objects) {
|
||||||
if (need_slicing_objects.count(obj) != 0) {
|
if (need_slicing_objects.count(obj) != 0) {
|
||||||
obj->make_perimeters();
|
obj->make_perimeters(auto_contour_holes_compensation_params);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (obj->set_started(posSlice))
|
if (obj->set_started(posSlice))
|
||||||
@ -1805,7 +1805,7 @@ void Print::process(std::unordered_map<std::string, long long>* slice_time, bool
|
|||||||
obj->set_done(posDetectOverhangsForLift);
|
obj->set_done(posDetectOverhangsForLift);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
obj->make_perimeters();
|
obj->make_perimeters(auto_contour_holes_compensation_params);
|
||||||
obj->infill();
|
obj->infill();
|
||||||
obj->ironing();
|
obj->ironing();
|
||||||
obj->generate_support_material();
|
obj->generate_support_material();
|
||||||
|
@ -297,6 +297,41 @@ private:
|
|||||||
size_t m_ref_cnt{ 0 };
|
size_t m_ref_cnt{ 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct AutoContourHolesCompensationParams
|
||||||
|
{
|
||||||
|
AutoContourHolesCompensationParams(const PrintConfig &config)
|
||||||
|
{
|
||||||
|
counter_speed_coef = config.counter_coef_1.values;
|
||||||
|
counter_diameter_coef = config.counter_coef_2.values;
|
||||||
|
counter_compensate_coef = config.counter_coef_3.values;
|
||||||
|
hole_speed_coef = config.hole_coef_1.values;
|
||||||
|
hole_diameter_coef = config.hole_coef_2.values;
|
||||||
|
hole_compensate_coef = config.hole_coef_3.values;
|
||||||
|
counter_limit_min_value = config.counter_limit_min.values;
|
||||||
|
counter_limit_max_value = config.counter_limit_max.values;
|
||||||
|
hole_limit_min_value = config.hole_limit_min.values;
|
||||||
|
hole_limit_max_value = config.hole_limit_max.values;
|
||||||
|
circle_compensation_speed = config.circle_compensation_speed.values;
|
||||||
|
diameter_limit = config.diameter_limit.values;
|
||||||
|
}
|
||||||
|
// BBS: params for auto contour and holes compensation
|
||||||
|
std::vector<double> counter_speed_coef;
|
||||||
|
std::vector<double> counter_diameter_coef;
|
||||||
|
std::vector<double> counter_compensate_coef;
|
||||||
|
|
||||||
|
std::vector<double> hole_speed_coef;
|
||||||
|
std::vector<double> hole_diameter_coef;
|
||||||
|
std::vector<double> hole_compensate_coef;
|
||||||
|
|
||||||
|
std::vector<double> counter_limit_min_value;
|
||||||
|
std::vector<double> counter_limit_max_value;
|
||||||
|
std::vector<double> hole_limit_min_value;
|
||||||
|
std::vector<double> hole_limit_max_value;
|
||||||
|
|
||||||
|
std::vector<double> circle_compensation_speed;
|
||||||
|
std::vector<double> diameter_limit;
|
||||||
|
};
|
||||||
|
|
||||||
class PrintObject : public PrintObjectBaseWithState<Print, PrintObjectStep, posCount>
|
class PrintObject : public PrintObjectBaseWithState<Print, PrintObjectStep, posCount>
|
||||||
{
|
{
|
||||||
private: // Prevents erroneous use by other classes.
|
private: // Prevents erroneous use by other classes.
|
||||||
@ -478,7 +513,7 @@ private:
|
|||||||
static PrintObjectConfig object_config_from_model_object(const PrintObjectConfig &default_object_config, const ModelObject &object, size_t num_extruders, std::vector<int>& variant_index);
|
static PrintObjectConfig object_config_from_model_object(const PrintObjectConfig &default_object_config, const ModelObject &object, size_t num_extruders, std::vector<int>& variant_index);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void make_perimeters();
|
void make_perimeters(const AutoContourHolesCompensationParams &auto_contour_holes_compensation_params);
|
||||||
void prepare_infill();
|
void prepare_infill();
|
||||||
void infill();
|
void infill();
|
||||||
void ironing();
|
void ironing();
|
||||||
|
@ -4182,91 +4182,78 @@ void PrintConfigDef::init_fff_params()
|
|||||||
def->mode = comAdvanced;
|
def->mode = comAdvanced;
|
||||||
def->set_default_value(new ConfigOptionBool(false));
|
def->set_default_value(new ConfigOptionBool(false));
|
||||||
|
|
||||||
def = this->add("circle_compensation_speed", coFloat);
|
def = this->add("circle_compensation_speed", coFloats);
|
||||||
def->label = L("Circle Compensation Speed");
|
def->label = L("Circle Compensation Speed");
|
||||||
def->tooltip = L("circle_compensation_speed");
|
def->tooltip = L("circle_compensation_speed");
|
||||||
def->sidetext = L("mm/s");
|
def->sidetext = L("mm/s");
|
||||||
def->min = 0;
|
def->min = 0;
|
||||||
def->set_default_value(new ConfigOptionFloat(200));
|
def->set_default_value(new ConfigOptionFloats{200});
|
||||||
|
|
||||||
def = this->add("max_deviation", coFloat);
|
def = this->add("counter_coef_1", coFloats);
|
||||||
def->label = L("Deviation");
|
|
||||||
def->tooltip = L("max_deviation");
|
|
||||||
def->sidetext = L("mm");
|
|
||||||
def->min = 0;
|
|
||||||
def->set_default_value(new ConfigOptionFloat(0.5));
|
|
||||||
|
|
||||||
def = this->add("max_variance", coFloat);
|
|
||||||
def->label = L("Variance");
|
|
||||||
def->tooltip = L("max_variance");
|
|
||||||
def->min = 0;
|
|
||||||
def->set_default_value(new ConfigOptionFloat(500));
|
|
||||||
|
|
||||||
def = this->add("counter_coef_1", coFloat);
|
|
||||||
def->label = L("Counter Coef 1");
|
def->label = L("Counter Coef 1");
|
||||||
def->tooltip = L("counter_coef_1");
|
def->tooltip = L("counter_coef_1");
|
||||||
def->sidetext = L("/1e6");
|
def->sidetext = L("/1e6");
|
||||||
def->set_default_value(new ConfigOptionFloat(0));
|
def->set_default_value(new ConfigOptionFloats{0});
|
||||||
|
|
||||||
def = this->add("counter_coef_2", coFloat);
|
def = this->add("counter_coef_2", coFloats);
|
||||||
def->label = L("Counter Coef 2");
|
def->label = L("Contour Coef 2");
|
||||||
def->tooltip = L("counter_coef_2");
|
def->tooltip = L("counter_coef_2");
|
||||||
def->sidetext = L("/1e6");
|
def->sidetext = L("/1e6");
|
||||||
def->set_default_value(new ConfigOptionFloat(25000));
|
def->set_default_value(new ConfigOptionFloats{25000});
|
||||||
|
|
||||||
def = this->add("counter_coef_3", coFloat);
|
def = this->add("counter_coef_3", coFloats);
|
||||||
def->label = L("Counter Coef 3");
|
def->label = L("Contour Coef 3");
|
||||||
def->tooltip = L("counter_coef_3");
|
def->tooltip = L("counter_coef_3");
|
||||||
def->sidetext = L("/1e6");
|
def->sidetext = L("/1e6");
|
||||||
def->set_default_value(new ConfigOptionFloat(-110000));
|
def->set_default_value(new ConfigOptionFloats{-110000});
|
||||||
|
|
||||||
def = this->add("hole_coef_1", coFloat);
|
def = this->add("hole_coef_1", coFloats);
|
||||||
def->label = L("Hole Coef 1");
|
def->label = L("Hole Coef 1");
|
||||||
def->tooltip = L("hole_coef_1");
|
def->tooltip = L("hole_coef_1");
|
||||||
def->sidetext = L("/1e6");
|
def->sidetext = L("/1e6");
|
||||||
def->set_default_value(new ConfigOptionFloat(0));
|
def->set_default_value(new ConfigOptionFloats{0});
|
||||||
|
|
||||||
def = this->add("hole_coef_2", coFloat);
|
def = this->add("hole_coef_2", coFloats);
|
||||||
def->label = L("Hole Coef 2");
|
def->label = L("Hole Coef 2");
|
||||||
def->tooltip = L("hole_coef_2");
|
def->tooltip = L("hole_coef_2");
|
||||||
def->sidetext = L("/1e6");
|
def->sidetext = L("/1e6");
|
||||||
def->set_default_value(new ConfigOptionFloat(-25000));
|
def->set_default_value(new ConfigOptionFloats{-25000});
|
||||||
|
|
||||||
def = this->add("hole_coef_3", coFloat);
|
def = this->add("hole_coef_3", coFloats);
|
||||||
def->label = L("Hole Coef 3");
|
def->label = L("Hole Coef 3");
|
||||||
def->tooltip = L("hole_coef_3");
|
def->tooltip = L("hole_coef_3");
|
||||||
def->sidetext = L("/1e6");
|
def->sidetext = L("/1e6");
|
||||||
def->set_default_value(new ConfigOptionFloat(280000));
|
def->set_default_value(new ConfigOptionFloats{280000});
|
||||||
|
|
||||||
def = this->add("counter_limit_min", coFloat);
|
def = this->add("counter_limit_min", coFloats);
|
||||||
def->label = L("Counter limit min");
|
def->label = L("Contour limit min");
|
||||||
def->tooltip = L("counter_limit_min");
|
def->tooltip = L("counter_limit_min");
|
||||||
def->sidetext = L("/1e6");
|
def->sidetext = L("/1e6");
|
||||||
def->set_default_value(new ConfigOptionFloat(-40000));
|
def->set_default_value(new ConfigOptionFloats{-40000});
|
||||||
|
|
||||||
def = this->add("counter_limit_max", coFloat);
|
def = this->add("counter_limit_max", coFloats);
|
||||||
def->label = L("Counter limit max");
|
def->label = L("Contour limit max");
|
||||||
def->tooltip = L("counter_limit_max");
|
def->tooltip = L("counter_limit_max");
|
||||||
def->sidetext = L("/1e6");
|
def->sidetext = L("/1e6");
|
||||||
def->set_default_value(new ConfigOptionFloat(50000));
|
def->set_default_value(new ConfigOptionFloats{50000});
|
||||||
|
|
||||||
def = this->add("hole_limit_min", coFloat);
|
def = this->add("hole_limit_min", coFloats);
|
||||||
def->label = L("Hole limit min");
|
def->label = L("Hole limit min");
|
||||||
def->tooltip = L("hole_limit_min");
|
def->tooltip = L("hole_limit_min");
|
||||||
def->sidetext = L("/1e6");
|
def->sidetext = L("/1e6");
|
||||||
def->set_default_value(new ConfigOptionFloat(80000));
|
def->set_default_value(new ConfigOptionFloats{80000});
|
||||||
|
|
||||||
def = this->add("hole_limit_max", coFloat);
|
def = this->add("hole_limit_max", coFloats);
|
||||||
def->label = L("Hole limit max");
|
def->label = L("Hole limit max");
|
||||||
def->tooltip = L("hole_limit_max");
|
def->tooltip = L("hole_limit_max");
|
||||||
def->sidetext = L("/1e6");
|
def->sidetext = L("/1e6");
|
||||||
def->set_default_value(new ConfigOptionFloat(250000));
|
def->set_default_value(new ConfigOptionFloats{250000});
|
||||||
|
|
||||||
def = this->add("diameter_limit", coFloat);
|
def = this->add("diameter_limit", coFloats);
|
||||||
def->label = L("Diameter limit");
|
def->label = L("Diameter limit");
|
||||||
def->tooltip = L("diameter_limit");
|
def->tooltip = L("diameter_limit");
|
||||||
def->sidetext = L("mm");
|
def->sidetext = L("mm");
|
||||||
def->set_default_value(new ConfigOptionFloat(50));
|
def->set_default_value(new ConfigOptionFloats{50});
|
||||||
|
|
||||||
def = this->add("flush_volumes_vector", coFloats);
|
def = this->add("flush_volumes_vector", coFloats);
|
||||||
// BBS: remove _L()w
|
// BBS: remove _L()w
|
||||||
|
@ -828,20 +828,6 @@ PRINT_CONFIG_CLASS_DEFINE(
|
|||||||
((ConfigOptionFloat, xy_contour_compensation))
|
((ConfigOptionFloat, xy_contour_compensation))
|
||||||
//BBS auto hole contour compensation
|
//BBS auto hole contour compensation
|
||||||
((ConfigOptionBool, enable_circle_compensation))
|
((ConfigOptionBool, enable_circle_compensation))
|
||||||
((ConfigOptionFloat, circle_compensation_speed))
|
|
||||||
((ConfigOptionFloat, max_deviation))
|
|
||||||
((ConfigOptionFloat, max_variance))
|
|
||||||
((ConfigOptionFloat, counter_coef_1))
|
|
||||||
((ConfigOptionFloat, counter_coef_2))
|
|
||||||
((ConfigOptionFloat, counter_coef_3))
|
|
||||||
((ConfigOptionFloat, hole_coef_1))
|
|
||||||
((ConfigOptionFloat, hole_coef_2))
|
|
||||||
((ConfigOptionFloat, hole_coef_3))
|
|
||||||
((ConfigOptionFloat, counter_limit_min))
|
|
||||||
((ConfigOptionFloat, counter_limit_max))
|
|
||||||
((ConfigOptionFloat, hole_limit_min))
|
|
||||||
((ConfigOptionFloat, hole_limit_max))
|
|
||||||
((ConfigOptionFloat, diameter_limit))
|
|
||||||
((ConfigOptionBool, flush_into_objects))
|
((ConfigOptionBool, flush_into_objects))
|
||||||
// BBS
|
// BBS
|
||||||
((ConfigOptionBool, flush_into_infill))
|
((ConfigOptionBool, flush_into_infill))
|
||||||
@ -1239,8 +1225,19 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE(
|
|||||||
((ConfigOptionBool, exclude_object))
|
((ConfigOptionBool, exclude_object))
|
||||||
((ConfigOptionPercents, filament_shrink))
|
((ConfigOptionPercents, filament_shrink))
|
||||||
((ConfigOptionFloats, grab_length))
|
((ConfigOptionFloats, grab_length))
|
||||||
)
|
//BBS
|
||||||
|
((ConfigOptionFloats, circle_compensation_speed))
|
||||||
|
((ConfigOptionFloats, diameter_limit))
|
||||||
|
((ConfigOptionFloats, counter_coef_1))
|
||||||
|
((ConfigOptionFloats, counter_coef_2))
|
||||||
|
((ConfigOptionFloats, counter_coef_3))
|
||||||
|
((ConfigOptionFloats, hole_coef_1))
|
||||||
|
((ConfigOptionFloats, hole_coef_2))
|
||||||
|
((ConfigOptionFloats, hole_coef_3))
|
||||||
|
((ConfigOptionFloats, counter_limit_min))
|
||||||
|
((ConfigOptionFloats, counter_limit_max))
|
||||||
|
((ConfigOptionFloats, hole_limit_min))
|
||||||
|
((ConfigOptionFloats, hole_limit_max)))
|
||||||
// This object is mapped to Perl as Slic3r::Config::Full.
|
// This object is mapped to Perl as Slic3r::Config::Full.
|
||||||
PRINT_CONFIG_CLASS_DERIVED_DEFINE0(
|
PRINT_CONFIG_CLASS_DERIVED_DEFINE0(
|
||||||
FullPrintConfig,
|
FullPrintConfig,
|
||||||
|
@ -316,7 +316,7 @@ std::vector<std::set<int>> PrintObject::detect_extruder_geometric_unprintables()
|
|||||||
// 1) Merges typed region slices into stInternal type.
|
// 1) Merges typed region slices into stInternal type.
|
||||||
// 2) Increases an "extra perimeters" counter at region slices where needed.
|
// 2) Increases an "extra perimeters" counter at region slices where needed.
|
||||||
// 3) Generates perimeters, gap fills and fill regions (fill regions of type stInternal).
|
// 3) Generates perimeters, gap fills and fill regions (fill regions of type stInternal).
|
||||||
void PrintObject::make_perimeters()
|
void PrintObject::make_perimeters(const AutoContourHolesCompensationParams &auto_contour_holes_compensation_params)
|
||||||
{
|
{
|
||||||
// prerequisites
|
// prerequisites
|
||||||
this->slice();
|
this->slice();
|
||||||
@ -410,10 +410,10 @@ void PrintObject::make_perimeters()
|
|||||||
BOOST_LOG_TRIVIAL(debug) << "Generating perimeters in parallel - start";
|
BOOST_LOG_TRIVIAL(debug) << "Generating perimeters in parallel - start";
|
||||||
tbb::parallel_for(
|
tbb::parallel_for(
|
||||||
tbb::blocked_range<size_t>(0, m_layers.size()),
|
tbb::blocked_range<size_t>(0, m_layers.size()),
|
||||||
[this](const tbb::blocked_range<size_t>& range) {
|
[this, auto_contour_holes_compensation_params](const tbb::blocked_range<size_t>& range) {
|
||||||
for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) {
|
for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) {
|
||||||
m_print->throw_if_canceled();
|
m_print->throw_if_canceled();
|
||||||
m_layers[layer_idx]->make_perimeters();
|
m_layers[layer_idx]->make_perimeters(auto_contour_holes_compensation_params);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@ -922,21 +922,7 @@ bool PrintObject::invalidate_state_by_config_options(
|
|||||||
|| opt_key == "initial_layer_line_width"
|
|| opt_key == "initial_layer_line_width"
|
||||||
|| opt_key == "inner_wall_line_width"
|
|| opt_key == "inner_wall_line_width"
|
||||||
|| opt_key == "infill_wall_overlap"
|
|| opt_key == "infill_wall_overlap"
|
||||||
|| opt_key == "enable_circle_compensation"
|
|| opt_key == "enable_circle_compensation") {
|
||||||
|| opt_key == "circle_compensation_speed"
|
|
||||||
|| opt_key == "max_deviation"
|
|
||||||
|| opt_key == "max_variance"
|
|
||||||
|| opt_key == "counter_coef_1"
|
|
||||||
|| opt_key == "counter_coef_2"
|
|
||||||
|| opt_key == "counter_coef_3"
|
|
||||||
|| opt_key == "hole_coef_1"
|
|
||||||
|| opt_key == "hole_coef_2"
|
|
||||||
|| opt_key == "hole_coef_3"
|
|
||||||
|| opt_key == "counter_limit_min"
|
|
||||||
|| opt_key == "counter_limit_max"
|
|
||||||
|| opt_key == "hole_limit_min"
|
|
||||||
|| opt_key == "hole_limit_max"
|
|
||||||
|| opt_key == "diameter_limit") {
|
|
||||||
steps.emplace_back(posPerimeters);
|
steps.emplace_back(posPerimeters);
|
||||||
} else if (opt_key == "gap_infill_speed" || opt_key == "filter_out_gap_fill") {
|
} else if (opt_key == "gap_infill_speed" || opt_key == "filter_out_gap_fill") {
|
||||||
// Return true if gap-fill speed has changed from zero value to non-zero or from non-zero value to zero.
|
// Return true if gap-fill speed has changed from zero value to non-zero or from non-zero value to zero.
|
||||||
|
@ -730,8 +730,6 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, in
|
|||||||
toggle_line("interlocking_boundary_avoidance", use_beam_interlocking);
|
toggle_line("interlocking_boundary_avoidance", use_beam_interlocking);
|
||||||
|
|
||||||
bool enable_auto_hole_and_contour_compensation = config->opt_bool("enable_circle_compensation");
|
bool enable_auto_hole_and_contour_compensation = config->opt_bool("enable_circle_compensation");
|
||||||
for (auto el : {"max_deviation", "max_variance", "circle_compensation_speed", "counter_coef_1", "counter_coef_2", "counter_coef_3", "hole_coef_1", "hole_coef_2", "hole_coef_3", "counter_limit_min", "counter_limit_max", "hole_limit_min", "hole_limit_max", "diameter_limit"})
|
|
||||||
toggle_line(el, enable_auto_hole_and_contour_compensation);
|
|
||||||
toggle_field("xy_hole_compensation", !enable_auto_hole_and_contour_compensation);
|
toggle_field("xy_hole_compensation", !enable_auto_hole_and_contour_compensation);
|
||||||
toggle_field("xy_contour_compensation", !enable_auto_hole_and_contour_compensation);
|
toggle_field("xy_contour_compensation", !enable_auto_hole_and_contour_compensation);
|
||||||
}
|
}
|
||||||
|
@ -2037,20 +2037,6 @@ void TabPrint::build()
|
|||||||
optgroup->append_single_option_line("xy_contour_compensation", "xy-hole-contour-compensation");
|
optgroup->append_single_option_line("xy_contour_compensation", "xy-hole-contour-compensation");
|
||||||
optgroup->append_single_option_line("elefant_foot_compensation", "parameter/elephant-foot");
|
optgroup->append_single_option_line("elefant_foot_compensation", "parameter/elephant-foot");
|
||||||
optgroup->append_single_option_line("enable_circle_compensation");
|
optgroup->append_single_option_line("enable_circle_compensation");
|
||||||
optgroup->append_single_option_line("circle_compensation_speed");
|
|
||||||
optgroup->append_single_option_line("max_deviation");
|
|
||||||
optgroup->append_single_option_line("max_variance");
|
|
||||||
optgroup->append_single_option_line("counter_coef_1");
|
|
||||||
optgroup->append_single_option_line("counter_coef_2");
|
|
||||||
optgroup->append_single_option_line("counter_coef_3");
|
|
||||||
optgroup->append_single_option_line("hole_coef_1");
|
|
||||||
optgroup->append_single_option_line("hole_coef_2");
|
|
||||||
optgroup->append_single_option_line("hole_coef_3");
|
|
||||||
optgroup->append_single_option_line("counter_limit_min");
|
|
||||||
optgroup->append_single_option_line("counter_limit_max");
|
|
||||||
optgroup->append_single_option_line("hole_limit_min");
|
|
||||||
optgroup->append_single_option_line("hole_limit_max");
|
|
||||||
optgroup->append_single_option_line("diameter_limit");
|
|
||||||
optgroup->append_single_option_line("precise_z_height");
|
optgroup->append_single_option_line("precise_z_height");
|
||||||
|
|
||||||
optgroup = page->new_optgroup(L("Ironing"), L"param_ironing");
|
optgroup = page->new_optgroup(L("Ironing"), L"param_ironing");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user