mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-17 03:37:54 -06:00
Fixed division by zero when the layer is empty
This commit is contained in:
parent
3e98e2a4bd
commit
2afeea5b6f
1 changed files with 53 additions and 24 deletions
|
@ -200,18 +200,56 @@ static std::pair<Point, Point> clamp_endpoints_by_bounding_box(const BoundingBox
|
||||||
return std::make_pair(start_clamped, end_clamped);
|
return std::make_pair(start_clamped, end_clamped);
|
||||||
}
|
}
|
||||||
|
|
||||||
ExPolygons AvoidCrossingPerimeters2::get_boundary(const Layer &layer)
|
static inline coord_t get_default_perimeter_spacing(const Print &print)
|
||||||
|
{
|
||||||
|
const std::vector<double> &nozzle_diameters = print.config().nozzle_diameter.values;
|
||||||
|
return scale_(*std::max_element(nozzle_diameters.begin(), nozzle_diameters.end()));
|
||||||
|
}
|
||||||
|
|
||||||
|
static coord_t get_perimeter_spacing(const Layer &layer)
|
||||||
{
|
{
|
||||||
size_t regions_count = 0;
|
size_t regions_count = 0;
|
||||||
size_t polygons_count = 0;
|
coord_t perimeter_spacing = 0;
|
||||||
long perimeter_spacing = 0;
|
|
||||||
for (const LayerRegion *layer_region : layer.regions()) {
|
for (const LayerRegion *layer_region : layer.regions()) {
|
||||||
polygons_count += layer_region->slices.surfaces.size();
|
|
||||||
perimeter_spacing += layer_region->flow(frPerimeter).scaled_spacing();
|
perimeter_spacing += layer_region->flow(frPerimeter).scaled_spacing();
|
||||||
++regions_count;
|
++regions_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert(perimeter_spacing >= 0);
|
||||||
|
if (regions_count != 0)
|
||||||
perimeter_spacing /= regions_count;
|
perimeter_spacing /= regions_count;
|
||||||
const long offset = perimeter_spacing / 2;
|
else
|
||||||
|
perimeter_spacing = get_default_perimeter_spacing(*layer.object()->print());
|
||||||
|
return perimeter_spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
static coord_t get_perimeter_spacing_external(const Layer &layer)
|
||||||
|
{
|
||||||
|
size_t regions_count = 0;
|
||||||
|
coord_t perimeter_spacing = 0;
|
||||||
|
for (const PrintObject *object : layer.object()->print()->objects())
|
||||||
|
for (Layer *l : object->layers())
|
||||||
|
if ((layer.print_z - EPSILON) <= l->print_z && l->print_z <= (layer.print_z + EPSILON))
|
||||||
|
for (const LayerRegion *layer_region : l->regions()) {
|
||||||
|
perimeter_spacing += layer_region->flow(frPerimeter).scaled_spacing();
|
||||||
|
++regions_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(perimeter_spacing >= 0);
|
||||||
|
if (regions_count != 0)
|
||||||
|
perimeter_spacing /= regions_count;
|
||||||
|
else
|
||||||
|
perimeter_spacing = get_default_perimeter_spacing(*layer.object()->print());
|
||||||
|
return perimeter_spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
ExPolygons AvoidCrossingPerimeters2::get_boundary(const Layer &layer)
|
||||||
|
{
|
||||||
|
const coord_t perimeter_spacing = get_perimeter_spacing(layer);
|
||||||
|
const coord_t offset = perimeter_spacing / 2;
|
||||||
|
size_t polygons_count = 0;
|
||||||
|
for (const LayerRegion *layer_region : layer.regions())
|
||||||
|
polygons_count += layer_region->slices.surfaces.size();
|
||||||
|
|
||||||
ExPolygons boundary;
|
ExPolygons boundary;
|
||||||
boundary.reserve(polygons_count);
|
boundary.reserve(polygons_count);
|
||||||
|
@ -252,36 +290,27 @@ ExPolygons AvoidCrossingPerimeters2::get_boundary(const Layer &layer)
|
||||||
return final_boundary;
|
return final_boundary;
|
||||||
}
|
}
|
||||||
|
|
||||||
ExPolygons AvoidCrossingPerimeters2::get_boundary_external(const Layer &llayer)
|
ExPolygons AvoidCrossingPerimeters2::get_boundary_external(const Layer &layer)
|
||||||
{
|
{
|
||||||
size_t regions_count = 0;
|
|
||||||
long perimeter_spacing = 0;
|
|
||||||
ExPolygons boundary;
|
ExPolygons boundary;
|
||||||
for (const PrintObject *object : llayer.object()->print()->objects()) {
|
for (const PrintObject *object : layer.object()->print()->objects()) {
|
||||||
ExPolygons polygons_per_obj;
|
ExPolygons polygons_per_obj;
|
||||||
for (Layer *layer : object->layers()) {
|
for (Layer *l : object->layers())
|
||||||
if ((llayer.print_z - EPSILON) <= layer->print_z && layer->print_z <= (llayer.print_z + EPSILON)) {
|
if ((layer.print_z - EPSILON) <= l->print_z && l->print_z <= (layer.print_z + EPSILON))
|
||||||
for (const LayerRegion *layer_region : layer->regions()) {
|
for (const LayerRegion *layer_region : l->regions())
|
||||||
for (const Surface &surface : layer_region->slices.surfaces)
|
for (const Surface &surface : layer_region->slices.surfaces)
|
||||||
polygons_per_obj.emplace_back(surface.expolygon);
|
polygons_per_obj.emplace_back(surface.expolygon);
|
||||||
|
|
||||||
perimeter_spacing += layer_region->flow(frPerimeter).scaled_spacing();
|
|
||||||
++regions_count;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const PrintInstance &instance : object->instances()) {
|
for (const PrintInstance &instance : object->instances()) {
|
||||||
size_t boundary_idx = boundary.size();
|
size_t boundary_idx = boundary.size();
|
||||||
boundary.reserve(boundary.size() + polygons_per_obj.size());
|
boundary.reserve(boundary.size() + polygons_per_obj.size());
|
||||||
boundary.insert(boundary.end(), polygons_per_obj.begin(), polygons_per_obj.end());
|
boundary.insert(boundary.end(), polygons_per_obj.begin(), polygons_per_obj.end());
|
||||||
for (; boundary_idx < boundary.size(); ++boundary_idx)
|
for (; boundary_idx < boundary.size(); ++boundary_idx) boundary[boundary_idx].translate(instance.shift.x(), instance.shift.y());
|
||||||
boundary[boundary_idx].translate(instance.shift.x(), instance.shift.y());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
perimeter_spacing /= regions_count;
|
const coord_t perimeter_spacing = get_perimeter_spacing_external(layer);
|
||||||
const long perimeter_offset = perimeter_spacing / 2;
|
const coord_t perimeter_offset = perimeter_spacing / 2;
|
||||||
|
|
||||||
Polygons contours;
|
Polygons contours;
|
||||||
Polygons holes;
|
Polygons holes;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue