mirror of
https://github.com/QIDITECH/QIDISlicer.git
synced 2026-01-30 15:38:43 +03:00
update gap infill
This commit is contained in:
@@ -228,14 +228,14 @@ std::vector<SurfaceFill> group_fills(const Layer &layer)
|
||||
fill.expolygons.emplace_back(std::move(fill.surface.expolygon));
|
||||
//w21
|
||||
fill.region_id_group.push_back(region_id);
|
||||
fill.no_overlap_expolygons = layerm.fill_no_overlap_expolygons();
|
||||
fill.no_overlap_expolygons = layerm.fill_no_overlap_expolygons;
|
||||
} else {
|
||||
//w21
|
||||
fill.expolygons.emplace_back(surface.expolygon);
|
||||
auto t = find(fill.region_id_group.begin(), fill.region_id_group.end(), region_id);
|
||||
if (t == fill.region_id_group.end()) {
|
||||
fill.region_id_group.push_back(region_id);
|
||||
fill.no_overlap_expolygons = union_ex(fill.no_overlap_expolygons, layerm.fill_no_overlap_expolygons());
|
||||
fill.no_overlap_expolygons = union_ex(fill.no_overlap_expolygons, layerm.fill_no_overlap_expolygons);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -495,6 +495,8 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive:
|
||||
const Slic3r::BoundingBox bbox = this->object()->bounding_box();
|
||||
const auto resolution = this->object()->print()->config().gcode_resolution.value;
|
||||
const auto perimeter_generator = this->object()->config().perimeter_generator;
|
||||
//w21
|
||||
float filter_gap_infill_value = this->object()->config().filter_top_gap_infill;
|
||||
|
||||
#ifdef SLIC3R_DEBUG_SLICE_PROCESSING
|
||||
{
|
||||
@@ -578,6 +580,9 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive:
|
||||
try {
|
||||
if (params.use_arachne) {
|
||||
thick_polylines = f->fill_surface_arachne(&surface_fill.surface, params);
|
||||
//w21
|
||||
//if (f->layer_id % 2 == 0 && surface_fill.params.pattern == ipConcentricInternal)
|
||||
// std::reverse(thick_polylines.begin(), thick_polylines.end());
|
||||
}
|
||||
else {
|
||||
polylines = f->fill_surface(&surface_fill.surface, params);
|
||||
@@ -664,7 +669,8 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive:
|
||||
}),
|
||||
polylines.end());
|
||||
|
||||
variable_width_gap(polylines, ExtrusionRole::GapFill, surface_fill.params.flow, gap_fill.entities);
|
||||
variable_width_gap(polylines, ExtrusionRole::GapFill, surface_fill.params.flow, gap_fill.entities,filter_gap_infill_value);
|
||||
|
||||
eec->append(std::move(gap_fill.entities));
|
||||
}
|
||||
}
|
||||
@@ -715,7 +721,7 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive:
|
||||
#endif
|
||||
}
|
||||
//w21
|
||||
void Layer::variable_width_gap(const ThickPolylines &polylines, ExtrusionRole role, const Flow &flow, std::vector<ExtrusionEntity *> &out)
|
||||
void Layer::variable_width_gap(const ThickPolylines &polylines, ExtrusionRole role, const Flow &flow, std::vector<ExtrusionEntity *> &out,const float filter_gap_infill_value)
|
||||
{
|
||||
const float tolerance = float(scale_(0.05));
|
||||
for (const ThickPolyline &p : polylines) {
|
||||
@@ -726,7 +732,11 @@ void Layer::variable_width_gap(const ThickPolylines &polylines, ExtrusionRole ro
|
||||
}
|
||||
else {
|
||||
for (ExtrusionPath &path : paths) {
|
||||
if (path.length() >= scale_(flow.nozzle_diameter()/2.0) || path.width() >= scale_(flow.nozzle_diameter()/2.0))
|
||||
if (filter_gap_infill_value != 0) {
|
||||
if (path.length() >= scale_(filter_gap_infill_value) || path.width() >= scale_(filter_gap_infill_value))
|
||||
out.emplace_back(new ExtrusionPath(std::move(path)));
|
||||
}
|
||||
else
|
||||
out.emplace_back(new ExtrusionPath(std::move(path)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -654,7 +654,7 @@ void Layer::make_perimeters()
|
||||
fill_expolygons_ranges.clear();
|
||||
surfaces_to_merge.clear();
|
||||
//w21
|
||||
fill_no_overlap_expolygons.clear();
|
||||
//fill_no_overlap_expolygons.clear();
|
||||
|
||||
// find compatible regions
|
||||
layer_region_ids.clear();
|
||||
@@ -696,7 +696,7 @@ void Layer::make_perimeters()
|
||||
|
||||
if (layer_region_ids.size() == 1) { // optimization
|
||||
//w21
|
||||
(*layerm)->make_perimeters((*layerm)->slices(), perimeter_and_gapfill_ranges, fill_expolygons, fill_expolygons_ranges,fill_no_overlap_expolygons);
|
||||
(*layerm)->make_perimeters((*layerm)->slices(), perimeter_and_gapfill_ranges, fill_expolygons, fill_expolygons_ranges,(*layerm)->fill_no_overlap_expolygons);
|
||||
this->sort_perimeters_into_islands((*layerm)->slices(), region_id, perimeter_and_gapfill_ranges, std::move(fill_expolygons), fill_expolygons_ranges, layer_region_ids);
|
||||
} else {
|
||||
SurfaceCollection new_slices;
|
||||
@@ -732,7 +732,8 @@ void Layer::make_perimeters()
|
||||
}
|
||||
// make perimeters
|
||||
//w21
|
||||
layerm_config->make_perimeters(new_slices, perimeter_and_gapfill_ranges, fill_expolygons, fill_expolygons_ranges,fill_no_overlap_expolygons);
|
||||
ExPolygons fill_no_overlap;
|
||||
layerm_config->make_perimeters(new_slices, perimeter_and_gapfill_ranges, fill_expolygons, fill_expolygons_ranges,fill_no_overlap);
|
||||
this->sort_perimeters_into_islands(new_slices, region_id_config, perimeter_and_gapfill_ranges, std::move(fill_expolygons), fill_expolygons_ranges, layer_region_ids);
|
||||
//w21
|
||||
if (!new_slices.surfaces.empty()) {
|
||||
@@ -743,7 +744,7 @@ void Layer::make_perimeters()
|
||||
layer.m_fill_expolygons = std::move(expp);
|
||||
if (!layer.m_fill_expolygons.empty()) {
|
||||
layer.m_fill_surfaces.set(std::move(layer.m_fill_expolygons), layer.slices().surfaces.front());
|
||||
layer.m_fill_no_overlap_expolygons = intersection_ex(layer.slices().surfaces, fill_no_overlap_expolygons);
|
||||
layer.fill_no_overlap_expolygons = intersection_ex(layer.slices().surfaces, fill_no_overlap);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -133,7 +133,7 @@ public:
|
||||
// (this collection contains only ExtrusionEntityCollection objects)
|
||||
[[nodiscard]] const ExtrusionEntityCollection& fills() const { return m_fills; }
|
||||
//w21
|
||||
[[nodiscard]] const ExPolygons &fill_no_overlap_expolygons() const { return m_fill_expolygons; }
|
||||
ExPolygons fill_no_overlap_expolygons;
|
||||
|
||||
Flow flow(FlowRole role) const;
|
||||
Flow flow(FlowRole role, double layer_height) const;
|
||||
@@ -393,7 +393,7 @@ public:
|
||||
virtual bool has_extrusions() const { for (auto layerm : m_regions) if (layerm->has_extrusions()) return true; return false; }
|
||||
// virtual bool has_extrusions() const { for (const LayerSlice &lslice : lslices_ex) if (lslice.has_extrusions()) return true; return false; }
|
||||
//w21
|
||||
void variable_width_gap(const ThickPolylines &polylines, ExtrusionRole role, const Flow &flow, std::vector<ExtrusionEntity *> &out);
|
||||
void variable_width_gap(const ThickPolylines &polylines, ExtrusionRole role, const Flow &flow, std::vector<ExtrusionEntity *> &out,const float filter_gap_infill_value);
|
||||
ExtrusionPaths thick_polyline_to_extrusion_paths(const ThickPolyline &thick_polyline,ExtrusionRole role,const Flow & flow,const float tolerance);
|
||||
|
||||
protected:
|
||||
|
||||
@@ -1367,7 +1367,7 @@ void PerimeterGenerator::process_arachne(
|
||||
}
|
||||
}
|
||||
//w21
|
||||
append(out_fill_no_overlap, offset2_ex(union_ex(pp),float(-min_perimeter_infill_spacing / 2.), float(inset + min_perimeter_infill_spacing / 2.)));
|
||||
append(out_fill_no_overlap, offset2_ex(union_ex(pp),float(-min_perimeter_infill_spacing / 2.), float( min_perimeter_infill_spacing / 2.)));
|
||||
append(out_fill_expolygons, std::move(infill_areas));
|
||||
}
|
||||
|
||||
|
||||
@@ -479,6 +479,8 @@ static std::vector<std::string> s_Preset_print_options {
|
||||
, "top_one_wall_type"
|
||||
//w17
|
||||
,"top_area_threshold"
|
||||
//w21
|
||||
,"filter_top_gap_infill"
|
||||
};
|
||||
|
||||
static std::vector<std::string> s_Preset_filament_options {
|
||||
|
||||
@@ -3684,6 +3684,15 @@ void PrintConfigDef::init_fff_params()
|
||||
def->mode = comExpert;
|
||||
def->set_default_value(new ConfigOptionBool(true));
|
||||
|
||||
//w21
|
||||
def = this->add("filter_top_gap_infill", coFloat);
|
||||
def->label = L("Filter out tiny top gaps infill");
|
||||
def->category = L("Infill");
|
||||
def->tooltip = L("Filter out gaps smaller than the threshold specified. This setting affact top surface's gap infill");
|
||||
def->min = 0;
|
||||
def->mode = comExpert;
|
||||
def->set_default_value(new ConfigOptionFloat(0));
|
||||
|
||||
}
|
||||
|
||||
void PrintConfigDef::init_extruder_option_keys()
|
||||
|
||||
@@ -595,6 +595,8 @@ PRINT_CONFIG_CLASS_DEFINE(
|
||||
((ConfigOptionEnum<TopOneWallType>, top_one_wall_type))
|
||||
//w17
|
||||
((ConfigOptionPercent, top_area_threshold))
|
||||
//w21
|
||||
((ConfigOptionFloat, filter_top_gap_infill))
|
||||
)
|
||||
|
||||
PRINT_CONFIG_CLASS_DEFINE(
|
||||
|
||||
@@ -1509,6 +1509,8 @@ void TabPrint::build()
|
||||
optgroup->append_single_option_line("infill_first");
|
||||
//w11
|
||||
optgroup->append_single_option_line("detect_narrow_internal_solid_infill");
|
||||
//w21
|
||||
optgroup->append_single_option_line("filter_top_gap_infill");
|
||||
|
||||
page = add_options_page(L("Skirt and brim"), "skirt+brim");
|
||||
category_path = "skirt-and-brim_133969#";
|
||||
|
||||
Reference in New Issue
Block a user