mirror of
https://github.com/QIDITECH/QIDISlicer.git
synced 2026-01-30 15:38:43 +03:00
Merge branch 'master' of https://github.com/QIDITECH/QIDISlicer
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
#include "Polygon.hpp"
|
||||
//w11
|
||||
#define NARROW_INFILL_AREA_THRESHOLD 3
|
||||
#define NARROW_INFILL_AREA_THRESHOLD_MIN 0.5
|
||||
namespace Slic3r {
|
||||
|
||||
//static constexpr const float NarrowInfillAreaThresholdMM = 3.f;
|
||||
@@ -117,7 +118,8 @@ struct SurfaceFill {
|
||||
static bool is_narrow_infill_area(const ExPolygon &expolygon)
|
||||
{
|
||||
ExPolygons offsets = offset_ex(expolygon, -scale_(NARROW_INFILL_AREA_THRESHOLD));
|
||||
if (offsets.empty())
|
||||
ExPolygons offsets_min = offset_ex(expolygon, -scale_(NARROW_INFILL_AREA_THRESHOLD_MIN));
|
||||
if (offsets.empty() && !offsets_min.empty())
|
||||
return true;
|
||||
|
||||
return false;
|
||||
@@ -316,47 +318,31 @@ std::vector<SurfaceFill> group_fills(const Layer &layer)
|
||||
}
|
||||
|
||||
// Use ipEnsuring pattern for all internal Solids.
|
||||
{
|
||||
for (size_t surface_fill_id = 0; surface_fill_id < surface_fills.size(); ++surface_fill_id)
|
||||
if (SurfaceFill &fill = surface_fills[surface_fill_id]; fill.surface.surface_type == stInternalSolid) {
|
||||
fill.params.pattern = ipEnsuring;
|
||||
}
|
||||
}
|
||||
//w11
|
||||
if (layer.object()->config().detect_narrow_internal_solid_infill) {
|
||||
size_t surface_fills_size = surface_fills.size();
|
||||
for (size_t i = 0; i < surface_fills_size; i++) {
|
||||
for (size_t i = 0; i < surface_fills.size(); i++) {
|
||||
if (surface_fills[i].surface.surface_type != stInternalSolid)
|
||||
continue;
|
||||
|
||||
size_t expolygons_size = surface_fills[i].expolygons.size();
|
||||
size_t expolygons_size = surface_fills[i].expolygons.size();
|
||||
std::vector<size_t> narrow_expolygons_index;
|
||||
narrow_expolygons_index.reserve(expolygons_size);
|
||||
|
||||
for (size_t j = 0; j < expolygons_size; j++)
|
||||
if (is_narrow_infill_area(surface_fills[i].expolygons[j]))
|
||||
narrow_expolygons_index.push_back(j);
|
||||
|
||||
if (narrow_expolygons_index.size() == 0) {
|
||||
continue;
|
||||
} else if (narrow_expolygons_index.size() == expolygons_size) {
|
||||
// w11
|
||||
// w14
|
||||
if (narrow_expolygons_index.size() == expolygons_size) {
|
||||
surface_fills[i].params.pattern = ipConcentricInternal;
|
||||
} else {
|
||||
params = surface_fills[i].params;
|
||||
params.pattern = ipConcentricInternal;
|
||||
surface_fills.emplace_back(params);
|
||||
surface_fills.back().region_id = surface_fills[i].region_id;
|
||||
surface_fills.back().surface.surface_type = stInternalSolid;
|
||||
surface_fills.back().surface.thickness = surface_fills[i].surface.thickness;
|
||||
for (size_t j = 0; j < narrow_expolygons_index.size(); j++) {
|
||||
surface_fills.back().expolygons.emplace_back(std::move(surface_fills[i].expolygons[narrow_expolygons_index[j]]));
|
||||
}
|
||||
for (int j = narrow_expolygons_index.size() - 1; j >= 0; j--) {
|
||||
surface_fills[i].expolygons.erase(surface_fills[i].expolygons.begin() + narrow_expolygons_index[j]);
|
||||
}
|
||||
surface_fills[i].params.pattern = ipEnsuring;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (size_t surface_fill_id = 0; surface_fill_id < surface_fills.size(); ++surface_fill_id)
|
||||
if (SurfaceFill &fill = surface_fills[surface_fill_id]; fill.surface.surface_type == stInternalSolid) {
|
||||
fill.params.pattern = ipEnsuring;
|
||||
}
|
||||
}
|
||||
return surface_fills;
|
||||
}
|
||||
@@ -549,7 +535,7 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive:
|
||||
params.anchor_length_max = surface_fill.params.anchor_length_max;
|
||||
params.resolution = resolution;
|
||||
//w14
|
||||
params.use_arachne = (perimeter_generator == PerimeterGeneratorType::Arachne && surface_fill.params.pattern == ipConcentricInternal) || surface_fill.params.pattern == ipEnsuring;
|
||||
params.use_arachne = (perimeter_generator == PerimeterGeneratorType::Arachne && surface_fill.params.pattern == ipConcentric) || surface_fill.params.pattern == ipEnsuring || surface_fill.params.pattern == ipConcentricInternal;
|
||||
params.layer_height = layerm.layer()->height;
|
||||
|
||||
for (ExPolygon &expoly : surface_fill.expolygons) {
|
||||
@@ -558,28 +544,19 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive:
|
||||
surface_fill.surface.expolygon = std::move(expoly);
|
||||
Polylines polylines;
|
||||
ThickPolylines thick_polylines;
|
||||
try {
|
||||
//w14
|
||||
if (this->object()->config().detect_narrow_internal_solid_infill && (surface_fill.params.pattern == ipConcentricInternal || surface_fill.params.pattern == ipEnsuring)) {
|
||||
layerm.region().config().infill_overlap.percent ?
|
||||
f->overlap = layerm.region().config().perimeter_extrusion_width * layerm.region().config().infill_overlap.value / 100 * (-1) :
|
||||
f->overlap = float(layerm.region().config().infill_overlap.value);
|
||||
} else
|
||||
f->overlap = 0;
|
||||
|
||||
try {
|
||||
if (params.use_arachne) {
|
||||
//w14
|
||||
if (surface_fill.params.pattern == ipConcentricInternal) {
|
||||
layerm.region().config().infill_overlap.percent ?
|
||||
f->overlap = layerm.region().config().perimeter_extrusion_width * layerm.region().config().infill_overlap.value / 100 *(-1):
|
||||
f->overlap = float(layerm.region().config().infill_overlap.value);
|
||||
|
||||
} else
|
||||
f->overlap = 0;
|
||||
thick_polylines = f->fill_surface_arachne(&surface_fill.surface, params);
|
||||
}
|
||||
//w14
|
||||
else {
|
||||
if (surface_fill.params.pattern == ipConcentricInternal) {
|
||||
layerm.region().config().infill_overlap.percent ?
|
||||
f->overlap = layerm.region().config().perimeter_extrusion_width *
|
||||
layerm.region().config().infill_overlap.value / 100 * (-1) :
|
||||
f->overlap = float(layerm.region().config().infill_overlap.value);
|
||||
|
||||
} else
|
||||
f->overlap = 0;
|
||||
else {
|
||||
polylines = f->fill_surface(&surface_fill.surface, params);
|
||||
}
|
||||
} catch (InfillFailedException &) {
|
||||
|
||||
@@ -1093,10 +1093,10 @@ void PerimeterGenerator::add_infill_contour_for_arachne(ExPolygons infill_contou
|
||||
for (ExPolygon &ex : infill_contour)
|
||||
ex.simplify_p(params.scaled_resolution, &inner_pp);
|
||||
ExPolygons inner_union = union_ex(inner_pp);
|
||||
float offset1 = -min_perimeter_infill_spacing / 2.;
|
||||
float offset1 = -min_perimeter_infill_spacing / 2.;
|
||||
float offset2 = insert + min_perimeter_infill_spacing / 2.;
|
||||
infill_areas = offset2_ex(inner_union, offset1, offset2);
|
||||
append(out_fill_expolygons, std::move(infill_areas));
|
||||
infill_areas = offset2_ex(inner_union, offset1, offset2);
|
||||
append(out_fill_expolygons, offset2_ex(union_ex(inner_pp), float(-min_perimeter_infill_spacing / 2.), float(insert + min_perimeter_infill_spacing / 2.)));
|
||||
}
|
||||
|
||||
|
||||
@@ -1401,7 +1401,7 @@ void PerimeterGenerator::process_with_one_wall_arachne(
|
||||
}
|
||||
if (params.config.overhangs && upper_slices != nullptr && upper_slices_polygons_cache.empty()) {
|
||||
double upper_nozzle_diameter = params.print_config.nozzle_diameter.get_at(params.config.perimeter_extruder - 1);
|
||||
upper_slices_polygons_cache = offset(*upper_slices, float(scale_(+upper_nozzle_diameter / 2)));
|
||||
upper_slices_polygons_cache = offset(*upper_slices, float(scale_(EPSILON)));
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user