mirror of
https://git.mirrors.martin98.com/https://github.com/slic3r/Slic3r.git
synced 2025-08-15 11:45:56 +08:00
bugfix #47
This commit is contained in:
parent
891744be35
commit
cd9e99da25
@ -49,9 +49,9 @@ protected:
|
|||||||
ExtrusionRole rolePass[3];
|
ExtrusionRole rolePass[3];
|
||||||
InfillPattern fillPattern[3];
|
InfillPattern fillPattern[3];
|
||||||
|
|
||||||
void FillSmooth::performSingleFill(const int idx, ExtrusionEntityCollection &eecroot, const Surface &srf_source,
|
void performSingleFill(const int idx, ExtrusionEntityCollection &eecroot, const Surface &srf_source,
|
||||||
const FillParams ¶ms, const double volume);
|
const FillParams ¶ms, const double volume);
|
||||||
void FillSmooth::fillExPolygon(const int idx, ExtrusionEntityCollection &eec, const Surface &srf_to_fill,
|
void fillExPolygon(const int idx, ExtrusionEntityCollection &eec, const Surface &srf_to_fill,
|
||||||
const FillParams ¶ms, const double volume);
|
const FillParams ¶ms, const double volume);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ public:
|
|||||||
static double distance_to_squared(const Point &point, const Point &a, const Point &b);
|
static double distance_to_squared(const Point &point, const Point &a, const Point &b);
|
||||||
static double distance_to(const Point &point, const Point &a, const Point &b) { return sqrt(distance_to_squared(point, a, b)); }
|
static double distance_to(const Point &point, const Point &a, const Point &b) { return sqrt(distance_to_squared(point, a, b)); }
|
||||||
Point point_at(double distance) const;
|
Point point_at(double distance) const;
|
||||||
coord_t Line::dot(Line &l2) const { return vector().dot(l2.vector()); }
|
coord_t dot(const Line &l2) const { return vector().dot(l2.vector()); }
|
||||||
void extend_end(double distance) { Line line = *this; line.reverse(); this->b = line.point_at(-distance); }
|
void extend_end(double distance) { Line line = *this; line.reverse(); this->b = line.point_at(-distance); }
|
||||||
void extend_start(double distance) { this->a = this->point_at(-distance); }
|
void extend_start(double distance) { this->a = this->point_at(-distance); }
|
||||||
|
|
||||||
|
@ -667,13 +667,13 @@ ExPolygons fit_to_size(ExPolygon polygon_to_cover, ExPolygon polygon_to_check, c
|
|||||||
ExPolygon polygon_reduced = try_fit_to_size(polygon_to_cover, polygon_to_check, allowedPoints);
|
ExPolygon polygon_reduced = try_fit_to_size(polygon_to_cover, polygon_to_check, allowedPoints);
|
||||||
while (!diff_ex(polygon_to_cover, polygon_reduced).empty()){
|
while (!diff_ex(polygon_to_cover, polygon_reduced).empty()){
|
||||||
//not enough, use a bigger offset
|
//not enough, use a bigger offset
|
||||||
float percent_coverage = polygon_reduced.area() / growing_area.area();
|
float percent_coverage = (float)(polygon_reduced.area() / growing_area.area());
|
||||||
float next_coverage = percent_coverage + (percent_coverage - current_coverage) * 4;
|
float next_coverage = percent_coverage + (percent_coverage - current_coverage) * 4;
|
||||||
previous_offset = current_offset;
|
previous_offset = current_offset;
|
||||||
current_offset *= 2;
|
current_offset *= 2;
|
||||||
if (next_coverage < 0.1) current_offset *= 2;
|
if (next_coverage < 0.1) current_offset *= 2;
|
||||||
//create the bigger polygon and test it
|
//create the bigger polygon and test it
|
||||||
ExPolygons bigger_polygon = offset_ex(polygon_to_check, current_offset);
|
ExPolygons bigger_polygon = offset_ex(polygon_to_check, (float)current_offset);
|
||||||
if (bigger_polygon.size() != 1) {
|
if (bigger_polygon.size() != 1) {
|
||||||
// Error, growing a single polygon result in many/no other => fallback to full coverage
|
// Error, growing a single polygon result in many/no other => fallback to full coverage
|
||||||
return ExPolygons({ growing_area });
|
return ExPolygons({ growing_area });
|
||||||
@ -691,7 +691,7 @@ ExPolygons fit_to_size(ExPolygon polygon_to_cover, ExPolygon polygon_to_check, c
|
|||||||
uint32_t nb_opti_max = 6;
|
uint32_t nb_opti_max = 6;
|
||||||
for (uint32_t i = 0; i < nb_opti_max; ++i){
|
for (uint32_t i = 0; i < nb_opti_max; ++i){
|
||||||
coord_t new_offset = (previous_offset + current_offset) / 2;
|
coord_t new_offset = (previous_offset + current_offset) / 2;
|
||||||
ExPolygons bigger_polygon = offset_ex(polygon_to_check, new_offset);
|
ExPolygons bigger_polygon = offset_ex(polygon_to_check, (float)new_offset);
|
||||||
if (bigger_polygon.size() != 1) {
|
if (bigger_polygon.size() != 1) {
|
||||||
//Warn, growing a single polygon result in many/no other, use previous good result
|
//Warn, growing a single polygon result in many/no other, use previous good result
|
||||||
break;
|
break;
|
||||||
@ -756,12 +756,12 @@ void PrintObject::tag_under_bridge() {
|
|||||||
ExPolygons intersect =
|
ExPolygons intersect =
|
||||||
offset2_ex(
|
offset2_ex(
|
||||||
intersection_ex(sparse_polys, { upp.expolygon }, true)
|
intersection_ex(sparse_polys, { upp.expolygon }, true)
|
||||||
, -layerm->flow(frInfill).scaled_width(), layerm->flow(frInfill).scaled_width());
|
, (float)-layerm->flow(frInfill).scaled_width(), (float)layerm->flow(frInfill).scaled_width());
|
||||||
if (!intersect.empty()) {
|
if (!intersect.empty()) {
|
||||||
|
|
||||||
if (layerm->region()->config().infill_dense_algo == dfaEnlarged) {
|
if (layerm->region()->config().infill_dense_algo == dfaEnlarged) {
|
||||||
//expand the area a bit
|
//expand the area a bit
|
||||||
intersect = offset_ex(intersect, scale_(layerm->region()->config().bridged_infill_margin));
|
intersect = offset_ex(intersect, (float)scale_(layerm->region()->config().bridged_infill_margin));
|
||||||
} else if (layerm->region()->config().infill_dense_algo == dfaAutoNotFull
|
} else if (layerm->region()->config().infill_dense_algo == dfaAutoNotFull
|
||||||
|| layerm->region()->config().infill_dense_algo == dfaAutomatic){
|
|| layerm->region()->config().infill_dense_algo == dfaAutomatic){
|
||||||
|
|
||||||
@ -778,15 +778,15 @@ void PrintObject::tag_under_bridge() {
|
|||||||
ExPolygons cover_intersect;
|
ExPolygons cover_intersect;
|
||||||
for (ExPolygon &expoly_tocover : intersect) {
|
for (ExPolygon &expoly_tocover : intersect) {
|
||||||
ExPolygons temp = (fit_to_size(expoly_tocover, expoly_tocover,
|
ExPolygons temp = (fit_to_size(expoly_tocover, expoly_tocover,
|
||||||
diff_ex(offset_ex(layerm->fill_no_overlap_expolygons, layerm->flow(frInfill).scaled_width()),
|
diff_ex(offset_ex(layerm->fill_no_overlap_expolygons, (float)layerm->flow(frInfill).scaled_width()),
|
||||||
offset_ex(layerm->fill_no_overlap_expolygons, -layerm->flow(frInfill).scaled_width())),
|
offset_ex(layerm->fill_no_overlap_expolygons, (float)-layerm->flow(frInfill).scaled_width())),
|
||||||
surf.expolygon,
|
surf.expolygon,
|
||||||
4 * layerm->flow(frInfill).scaled_width(), 0.01));
|
4 * layerm->flow(frInfill).scaled_width(), 0.01f));
|
||||||
cover_intersect.insert(cover_intersect.end(), temp.begin(), temp.end());
|
cover_intersect.insert(cover_intersect.end(), temp.begin(), temp.end());
|
||||||
}
|
}
|
||||||
intersect = offset2_ex(cover_intersect,
|
intersect = offset2_ex(cover_intersect,
|
||||||
-layerm->flow(frInfill).scaled_width(),
|
(float)-layerm->flow(frInfill).scaled_width(),
|
||||||
layerm->flow(frInfill).scaled_width() * 2);
|
(float)layerm->flow(frInfill).scaled_width() * 2);
|
||||||
} else {
|
} else {
|
||||||
intersect.clear();
|
intersect.clear();
|
||||||
}
|
}
|
||||||
@ -794,8 +794,8 @@ void PrintObject::tag_under_bridge() {
|
|||||||
if (!intersect.empty()) {
|
if (!intersect.empty()) {
|
||||||
ExPolygons sparse_surfaces = offset2_ex(
|
ExPolygons sparse_surfaces = offset2_ex(
|
||||||
diff_ex(sparse_polys, intersect, true),
|
diff_ex(sparse_polys, intersect, true),
|
||||||
-layerm->flow(frInfill).scaled_width(),
|
(float)-layerm->flow(frInfill).scaled_width(),
|
||||||
layerm->flow(frInfill).scaled_width());
|
(float)layerm->flow(frInfill).scaled_width());
|
||||||
ExPolygons dense_surfaces = diff_ex(sparse_polys, sparse_surfaces, true);
|
ExPolygons dense_surfaces = diff_ex(sparse_polys, sparse_surfaces, true);
|
||||||
//assign (copy)
|
//assign (copy)
|
||||||
sparse_polys = std::move(sparse_surfaces);
|
sparse_polys = std::move(sparse_surfaces);
|
||||||
@ -1906,7 +1906,7 @@ end:
|
|||||||
|
|
||||||
void PrintObject::_offsetHoles(float hole_delta, LayerRegion *layerm) {
|
void PrintObject::_offsetHoles(float hole_delta, LayerRegion *layerm) {
|
||||||
if (hole_delta != 0.f) {
|
if (hole_delta != 0.f) {
|
||||||
ExPolygons& polys = to_expolygons(std::move(layerm->slices.surfaces));
|
ExPolygons polys = to_expolygons(std::move(layerm->slices.surfaces));
|
||||||
ExPolygons new_polys;
|
ExPolygons new_polys;
|
||||||
for (ExPolygon ex_poly : polys) {
|
for (ExPolygon ex_poly : polys) {
|
||||||
ExPolygon new_ex_poly(ex_poly);
|
ExPolygon new_ex_poly(ex_poly);
|
||||||
@ -2318,7 +2318,7 @@ void PrintObject::discover_horizontal_shells()
|
|||||||
// Insert a solid internal layer. Mark stInternal surfaces as stInternalSolid or stInternalBridge.
|
// Insert a solid internal layer. Mark stInternal surfaces as stInternalSolid or stInternalBridge.
|
||||||
SurfaceType type = (region_config.fill_density == 100) ? (stPosInternal | stDensSolid) : (stPosInternal | stDensSolid | stModBridge);
|
SurfaceType type = (region_config.fill_density == 100) ? (stPosInternal | stDensSolid) : (stPosInternal | stDensSolid | stModBridge);
|
||||||
for (Surface &surface : layerm->fill_surfaces.surfaces)
|
for (Surface &surface : layerm->fill_surfaces.surfaces)
|
||||||
if (surface.surface_type == stPosInternal | stDensSparse)
|
if (surface.surface_type == (stPosInternal | stDensSparse))
|
||||||
surface.surface_type = type;
|
surface.surface_type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2355,8 +2355,8 @@ void PrintObject::discover_horizontal_shells()
|
|||||||
continue;
|
continue;
|
||||||
// Slic3r::debugf "Layer %d has %s surfaces\n", $i, ($type == S_TYPE_TOP) ? 'top' : 'bottom';
|
// Slic3r::debugf "Layer %d has %s surfaces\n", $i, ($type == S_TYPE_TOP) ? 'top' : 'bottom';
|
||||||
|
|
||||||
size_t solid_layers = (type & stPosTop == stPosTop) ? region_config.top_solid_layers.value : region_config.bottom_solid_layers.value;
|
size_t solid_layers = ((type & stPosTop) == stPosTop) ? region_config.top_solid_layers.value : region_config.bottom_solid_layers.value;
|
||||||
for (int n = (type & stPosTop == stPosTop) ? i - 1 : i + 1; std::abs(n - i) < solid_layers; (type & stPosTop == stPosTop) ? --n : ++n) {
|
for (int n = ((type & stPosTop) == stPosTop) ? (i - 1) : (i + 1); std::abs(n - i) < solid_layers; ((type & stPosTop) == stPosTop) ? (--n) : (++n)) {
|
||||||
if (n < 0 || n >= int(m_layers.size()))
|
if (n < 0 || n >= int(m_layers.size()))
|
||||||
continue;
|
continue;
|
||||||
// Slic3r::debugf " looking for neighbors on layer %d...\n", $n;
|
// Slic3r::debugf " looking for neighbors on layer %d...\n", $n;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user