mirror of
https://github.com/QIDITECH/QIDISlicer.git
synced 2026-01-30 23:48:44 +03:00
Merge branch 'master' of https://github.com/QIDITECH/QIDISlicer
This commit is contained in:
@@ -19,6 +19,7 @@
|
|||||||
#include "Polygon.hpp"
|
#include "Polygon.hpp"
|
||||||
//w11
|
//w11
|
||||||
#define NARROW_INFILL_AREA_THRESHOLD 3
|
#define NARROW_INFILL_AREA_THRESHOLD 3
|
||||||
|
#define NARROW_INFILL_AREA_THRESHOLD_MIN 0.5
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
|
|
||||||
//static constexpr const float NarrowInfillAreaThresholdMM = 3.f;
|
//static constexpr const float NarrowInfillAreaThresholdMM = 3.f;
|
||||||
@@ -117,7 +118,8 @@ struct SurfaceFill {
|
|||||||
static bool is_narrow_infill_area(const ExPolygon &expolygon)
|
static bool is_narrow_infill_area(const ExPolygon &expolygon)
|
||||||
{
|
{
|
||||||
ExPolygons offsets = offset_ex(expolygon, -scale_(NARROW_INFILL_AREA_THRESHOLD));
|
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 true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -316,47 +318,31 @@ std::vector<SurfaceFill> group_fills(const Layer &layer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Use ipEnsuring pattern for all internal Solids.
|
// 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
|
//w11
|
||||||
if (layer.object()->config().detect_narrow_internal_solid_infill) {
|
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)
|
if (surface_fills[i].surface.surface_type != stInternalSolid)
|
||||||
continue;
|
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;
|
std::vector<size_t> narrow_expolygons_index;
|
||||||
narrow_expolygons_index.reserve(expolygons_size);
|
narrow_expolygons_index.reserve(expolygons_size);
|
||||||
|
|
||||||
for (size_t j = 0; j < expolygons_size; j++)
|
for (size_t j = 0; j < expolygons_size; j++)
|
||||||
if (is_narrow_infill_area(surface_fills[i].expolygons[j]))
|
if (is_narrow_infill_area(surface_fills[i].expolygons[j]))
|
||||||
narrow_expolygons_index.push_back(j);
|
narrow_expolygons_index.push_back(j);
|
||||||
|
|
||||||
if (narrow_expolygons_index.size() == 0) {
|
if (narrow_expolygons_index.size() == expolygons_size) {
|
||||||
continue;
|
|
||||||
} else if (narrow_expolygons_index.size() == expolygons_size) {
|
|
||||||
// w11
|
|
||||||
// w14
|
|
||||||
surface_fills[i].params.pattern = ipConcentricInternal;
|
surface_fills[i].params.pattern = ipConcentricInternal;
|
||||||
} else {
|
} else {
|
||||||
params = surface_fills[i].params;
|
surface_fills[i].params.pattern = ipEnsuring;
|
||||||
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]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} 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;
|
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.anchor_length_max = surface_fill.params.anchor_length_max;
|
||||||
params.resolution = resolution;
|
params.resolution = resolution;
|
||||||
//w14
|
//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;
|
params.layer_height = layerm.layer()->height;
|
||||||
|
|
||||||
for (ExPolygon &expoly : surface_fill.expolygons) {
|
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);
|
surface_fill.surface.expolygon = std::move(expoly);
|
||||||
Polylines polylines;
|
Polylines polylines;
|
||||||
ThickPolylines thick_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) {
|
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);
|
thick_polylines = f->fill_surface_arachne(&surface_fill.surface, params);
|
||||||
}
|
}
|
||||||
//w14
|
else {
|
||||||
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;
|
|
||||||
polylines = f->fill_surface(&surface_fill.surface, params);
|
polylines = f->fill_surface(&surface_fill.surface, params);
|
||||||
}
|
}
|
||||||
} catch (InfillFailedException &) {
|
} catch (InfillFailedException &) {
|
||||||
|
|||||||
@@ -1093,10 +1093,10 @@ void PerimeterGenerator::add_infill_contour_for_arachne(ExPolygons infill_contou
|
|||||||
for (ExPolygon &ex : infill_contour)
|
for (ExPolygon &ex : infill_contour)
|
||||||
ex.simplify_p(params.scaled_resolution, &inner_pp);
|
ex.simplify_p(params.scaled_resolution, &inner_pp);
|
||||||
ExPolygons inner_union = union_ex(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.;
|
float offset2 = insert + min_perimeter_infill_spacing / 2.;
|
||||||
infill_areas = offset2_ex(inner_union, offset1, offset2);
|
infill_areas = offset2_ex(inner_union, offset1, offset2);
|
||||||
append(out_fill_expolygons, std::move(infill_areas));
|
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()) {
|
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);
|
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