From 22c42b9844bf54728be54fd029d06a20fddd01bd Mon Sep 17 00:00:00 2001 From: EiNSTeiN- Date: Sat, 1 Jul 2023 18:02:12 -0400 Subject: [PATCH] Add functional nonplanar code ported from https://github.com/DrEricEbert/Slic3r_NonPlanar_Slicing --- src/libslic3r/CMakeLists.txt | 4 + src/libslic3r/ExPolygon.cpp | 2 +- src/libslic3r/ExtrusionEntity.hpp | 9 + src/libslic3r/ExtrusionEntityCollection.cpp | 15 + src/libslic3r/ExtrusionEntityCollection.hpp | 1 + src/libslic3r/ExtrusionRole.cpp | 8 + src/libslic3r/ExtrusionRole.hpp | 6 + src/libslic3r/Fill/Fill.cpp | 34 +- src/libslic3r/GCode.cpp | 154 +++++++-- src/libslic3r/GCode.hpp | 3 + src/libslic3r/GCodeWriter.cpp | 8 +- src/libslic3r/GCodeWriter.hpp | 2 +- src/libslic3r/Geometry.cpp | 70 ++++ src/libslic3r/Geometry.hpp | 17 + src/libslic3r/Layer.cpp | 56 +++- src/libslic3r/Layer.hpp | 22 ++ src/libslic3r/LayerRegion.cpp | 253 +++++++++++++- src/libslic3r/MultiPoint.cpp | 20 ++ src/libslic3r/MultiPoint.hpp | 1 + src/libslic3r/NonplanarFacet.cpp | 72 ++++ src/libslic3r/NonplanarFacet.hpp | 39 +++ src/libslic3r/NonplanarSurface.cpp | 240 +++++++++++++ src/libslic3r/NonplanarSurface.hpp | 54 +++ src/libslic3r/Point.hpp | 3 + src/libslic3r/Polygon.cpp | 2 +- src/libslic3r/Polyline.cpp | 26 ++ src/libslic3r/Polyline.hpp | 4 + src/libslic3r/Preset.cpp | 1 + src/libslic3r/Print.hpp | 18 +- src/libslic3r/PrintConfig.cpp | 27 ++ src/libslic3r/PrintConfig.hpp | 4 + src/libslic3r/PrintObject.cpp | 354 ++++++++++++++++++-- src/libslic3r/PrintObjectSlice.cpp | 124 ++++++- src/libslic3r/SupportSpotsGenerator.cpp | 4 +- src/libslic3r/Surface.cpp | 10 +- src/libslic3r/Surface.hpp | 29 +- src/libslic3r/SurfaceCollection.hpp | 2 + src/slic3r/GUI/GCodeViewer.cpp | 2 + src/slic3r/GUI/Tab.cpp | 6 + tests/data/nonplanar/wave_cube.stl | Bin 0 -> 779984 bytes 40 files changed, 1611 insertions(+), 95 deletions(-) create mode 100644 src/libslic3r/NonplanarFacet.cpp create mode 100644 src/libslic3r/NonplanarFacet.hpp create mode 100644 src/libslic3r/NonplanarSurface.cpp create mode 100644 src/libslic3r/NonplanarSurface.hpp create mode 100644 tests/data/nonplanar/wave_cube.stl diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 0de0b4e51..f749221d7 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -221,6 +221,10 @@ set(SLIC3R_SOURCES MutablePriorityQueue.hpp NormalUtils.cpp NormalUtils.hpp + NonplanarFacet.cpp + NonplanarFacet.hpp + NonplanarSurface.cpp + NonplanarSurface.hpp NSVGUtils.cpp NSVGUtils.hpp ObjectID.cpp diff --git a/src/libslic3r/ExPolygon.cpp b/src/libslic3r/ExPolygon.cpp index 19489bddb..863ce7f12 100644 --- a/src/libslic3r/ExPolygon.cpp +++ b/src/libslic3r/ExPolygon.cpp @@ -418,7 +418,7 @@ bool has_duplicate_points(const ExPolygons &expolys) { #if 1 // Check globally. -#if 0 +#if 1 // Detect duplicates by sorting with quicksort. It is quite fast, but ankerl::unordered_dense is around 1/4 faster. Points allpts; allpts.reserve(count_points(expolys)); diff --git a/src/libslic3r/ExtrusionEntity.hpp b/src/libslic3r/ExtrusionEntity.hpp index 277ac7824..8affb8d26 100644 --- a/src/libslic3r/ExtrusionEntity.hpp +++ b/src/libslic3r/ExtrusionEntity.hpp @@ -10,6 +10,8 @@ #include #include +#include + namespace Slic3r { class ExPolygon; @@ -67,6 +69,8 @@ public: float width; // Height of the extrusion, used for visualization purposes. float height; + /// distance to surface layer in nonplanar extrusions -1.0 if not part of nonplanar extrusion + float distance_to_top = -1.0; ExtrusionPath(ExtrusionRole role) : mm3_per_mm(-1), width(-1), height(-1), m_role(role) {} ExtrusionPath(ExtrusionRole role, double mm3_per_mm, float width, float height) : mm3_per_mm(mm3_per_mm), width(width), height(height), m_role(role) {} @@ -122,6 +126,11 @@ private: ExtrusionRole m_role; }; +class ExtrusionPath3 : public ExtrusionPath +{ + Polyline3 polyline; +}; + class ExtrusionPathOriented : public ExtrusionPath { public: diff --git a/src/libslic3r/ExtrusionEntityCollection.cpp b/src/libslic3r/ExtrusionEntityCollection.cpp index 55167861c..d44701542 100644 --- a/src/libslic3r/ExtrusionEntityCollection.cpp +++ b/src/libslic3r/ExtrusionEntityCollection.cpp @@ -1,5 +1,7 @@ #include "ExtrusionEntityCollection.hpp" #include "ShortestPath.hpp" +#include "BoundingBox.hpp" +#include "SVG.hpp" #include #include #include @@ -152,4 +154,17 @@ double ExtrusionEntityCollection::min_mm3_per_mm() const return min_mm3_per_mm; } +void ExtrusionEntityCollection::export_to_svg(const char *path) const +{ + BoundingBox bbox; + for (const ExtrusionEntity *entity : this->entities) + bbox.merge(get_extents(entity->as_polylines())); + + SVG svg(path, bbox); + for (const ExtrusionEntity *entity : this->entities) + svg.draw(entity->as_polylines(), "black", scale_(0.1f)); + + svg.Close(); +} + } diff --git a/src/libslic3r/ExtrusionEntityCollection.hpp b/src/libslic3r/ExtrusionEntityCollection.hpp index 676bdd891..0024f4bbe 100644 --- a/src/libslic3r/ExtrusionEntityCollection.hpp +++ b/src/libslic3r/ExtrusionEntityCollection.hpp @@ -124,6 +124,7 @@ public: ExtrusionEntityCollection flatten(bool preserve_ordering = false) const; double min_mm3_per_mm() const override; double total_volume() const override { double volume=0.; for (const auto& ent : entities) volume+=ent->total_volume(); return volume; } + void export_to_svg(const char *path) const; // Following methods shall never be called on an ExtrusionEntityCollection. Polyline as_polyline() const override { diff --git a/src/libslic3r/ExtrusionRole.cpp b/src/libslic3r/ExtrusionRole.cpp index a7ec31949..6d9484a3d 100644 --- a/src/libslic3r/ExtrusionRole.cpp +++ b/src/libslic3r/ExtrusionRole.cpp @@ -19,7 +19,9 @@ GCodeExtrusionRole extrusion_role_to_gcode_extrusion_role(ExtrusionRole role) } if (role == ExtrusionRole::InternalInfill) return GCodeExtrusionRole::InternalInfill; if (role == ExtrusionRole::SolidInfill) return GCodeExtrusionRole::SolidInfill; + if (role == ExtrusionRole::SolidInfillNonplanar) return GCodeExtrusionRole::SolidInfillNonplanar; if (role == ExtrusionRole::TopSolidInfill) return GCodeExtrusionRole::TopSolidInfill; + if (role == ExtrusionRole::TopSolidInfillNonplanar) return GCodeExtrusionRole::TopSolidInfillNonplanar; if (role == ExtrusionRole::Ironing) return GCodeExtrusionRole::Ironing; if (role == ExtrusionRole::BridgeInfill) return GCodeExtrusionRole::BridgeInfill; if (role == ExtrusionRole::GapFill) return GCodeExtrusionRole::GapFill; @@ -40,7 +42,9 @@ std::string gcode_extrusion_role_to_string(GCodeExtrusionRole role) case GCodeExtrusionRole::OverhangPerimeter : return L("Overhang perimeter"); case GCodeExtrusionRole::InternalInfill : return L("Internal infill"); case GCodeExtrusionRole::SolidInfill : return L("Solid infill"); + case GCodeExtrusionRole::SolidInfillNonplanar : return L("Nonplanar solid infill"); case GCodeExtrusionRole::TopSolidInfill : return L("Top solid infill"); + case GCodeExtrusionRole::TopSolidInfillNonplanar : return L("Nonplanar top solid infill"); case GCodeExtrusionRole::Ironing : return L("Ironing"); case GCodeExtrusionRole::BridgeInfill : return L("Bridge infill"); case GCodeExtrusionRole::GapFill : return L("Gap fill"); @@ -66,8 +70,12 @@ GCodeExtrusionRole string_to_gcode_extrusion_role(const std::string_view role) return GCodeExtrusionRole::InternalInfill; else if (role == L("Solid infill")) return GCodeExtrusionRole::SolidInfill; + else if (role == L("Nonplanar solid infill")) + return GCodeExtrusionRole::SolidInfill; else if (role == L("Top solid infill")) return GCodeExtrusionRole::TopSolidInfill; + else if (role == L("Nonplanar top solid infill")) + return GCodeExtrusionRole::TopSolidInfillNonplanar; else if (role == L("Ironing")) return GCodeExtrusionRole::Ironing; else if (role == L("Bridge infill")) diff --git a/src/libslic3r/ExtrusionRole.hpp b/src/libslic3r/ExtrusionRole.hpp index 986c139a2..04f7d94e2 100644 --- a/src/libslic3r/ExtrusionRole.hpp +++ b/src/libslic3r/ExtrusionRole.hpp @@ -26,6 +26,7 @@ enum class ExtrusionRoleModifier : uint16_t { Solid, Ironing, Bridge, + Nonplanar, // 3) Special types // Indicator that the extrusion role was mixed from multiple differing extrusion roles, // for example from Support and SupportInterface. @@ -55,9 +56,11 @@ struct ExtrusionRole : public ExtrusionRoleModifiers static constexpr const ExtrusionRoleModifiers InternalInfill{ ExtrusionRoleModifier::Infill }; // Solid internal infill. static constexpr const ExtrusionRoleModifiers SolidInfill{ ExtrusionRoleModifier::Infill | ExtrusionRoleModifier::Solid }; + static constexpr const ExtrusionRoleModifiers SolidInfillNonplanar{ ExtrusionRoleModifier::Infill | ExtrusionRoleModifier::Solid | ExtrusionRoleModifier::Nonplanar }; // Top solid infill (visible). //FIXME why there is no bottom solid infill type? static constexpr const ExtrusionRoleModifiers TopSolidInfill{ ExtrusionRoleModifier::Infill | ExtrusionRoleModifier::Solid | ExtrusionRoleModifier::External }; + static constexpr const ExtrusionRoleModifiers TopSolidInfillNonplanar{ ExtrusionRoleModifier::Infill | ExtrusionRoleModifier::Solid | ExtrusionRoleModifier::External | ExtrusionRoleModifier::Nonplanar }; // Ironing infill at the top surfaces. static constexpr const ExtrusionRoleModifiers Ironing{ ExtrusionRoleModifier::Infill | ExtrusionRoleModifier::Solid | ExtrusionRoleModifier::Ironing | ExtrusionRoleModifier::External }; // Visible bridging infill at the bottom of an object. @@ -84,6 +87,7 @@ struct ExtrusionRole : public ExtrusionRoleModifiers bool is_solid_infill() const { return this->is_infill() && this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::Solid); } bool is_external() const { return this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::External); } bool is_bridge() const { return this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::Bridge); } + bool is_nonplanar() const { return this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::Nonplanar); } bool is_support() const { return this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::Support); } bool is_support_base() const { return this->is_support() && ! this->is_external(); } @@ -108,7 +112,9 @@ enum class GCodeExtrusionRole : uint8_t { OverhangPerimeter, InternalInfill, SolidInfill, + SolidInfillNonplanar, TopSolidInfill, + TopSolidInfillNonplanar, Ironing, BridgeInfill, GapFill, diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index 499e7b85a..eb213900a 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -2,6 +2,8 @@ #include #include +#include "SVG.hpp" + #include "../ClipperUtils.hpp" #include "../Geometry.hpp" #include "../Layer.hpp" @@ -144,7 +146,7 @@ std::vector group_fills(const Layer &layer) if (surface.is_solid()) { params.density = 100.f; //FIXME for non-thick bridges, shall we allow a bottom surface pattern? - params.pattern = (surface.is_external() && ! is_bridge) ? + params.pattern = (surface.is_external() && ! is_bridge && !surface.is_nonplanar()) ? (surface.is_top() ? region_config.top_fill_pattern.value : region_config.bottom_fill_pattern.value) : fill_type_monotonic(region_config.top_fill_pattern) ? ipMonotonic : ipRectilinear; } else if (params.density <= 0) @@ -154,7 +156,10 @@ std::vector group_fills(const Layer &layer) is_bridge ? ExtrusionRole::BridgeInfill : (surface.is_solid() ? - (surface.is_top() ? ExtrusionRole::TopSolidInfill : ExtrusionRole::SolidInfill) : + (surface.is_top() ? + (surface.is_nonplanar() ? ExtrusionRole::TopSolidInfillNonplanar : ExtrusionRole::TopSolidInfill) : + (surface.is_nonplanar() ? ExtrusionRole::SolidInfillNonplanar : ExtrusionRole::SolidInfill) + ) : ExtrusionRole::InternalInfill); params.bridge_angle = float(surface.bridge_angle); params.angle = float(Geometry::deg2rad(region_config.fill_angle.value)); @@ -252,7 +257,7 @@ std::vector group_fills(const Layer &layer) if (! surface_fill.expolygons.empty()) { distance_between_surfaces = std::max(distance_between_surfaces, surface_fill.params.flow.scaled_spacing()); append((surface_fill.surface.surface_type == stInternalVoid) ? voids : surfaces_polygons, to_polygons(surface_fill.expolygons)); - if (surface_fill.surface.surface_type == stInternalSolid) + if (surface_fill.surface.is_internal_solid()) region_internal_infill = (int)surface_fill.region_id; if (surface_fill.surface.is_solid()) region_solid_infill = (int)surface_fill.region_id; @@ -281,10 +286,10 @@ std::vector group_fills(const Layer &layer) region_id = region_some_infill; const LayerRegion& layerm = *layer.regions()[region_id]; for (SurfaceFill &surface_fill : surface_fills) - if (surface_fill.surface.surface_type == stInternalSolid && std::abs(layer.height - surface_fill.params.flow.height()) < EPSILON) { - internal_solid_fill = &surface_fill; - break; - } + if ((surface_fill.surface.is_internal_solid()) && std::abs(layer.height - surface_fill.params.flow.height()) < EPSILON) { + internal_solid_fill = &surface_fill; + break; + } if (internal_solid_fill == nullptr) { // Produce another solid fill. params.extruder = layerm.region().extruder(frSolidInfill); @@ -309,7 +314,7 @@ std::vector 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) { + if (SurfaceFill &fill = surface_fills[surface_fill_id]; fill.surface.is_internal_solid()) { fill.params.pattern = ipEnsuring; } } @@ -449,10 +454,12 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: #ifdef SLIC3R_DEBUG_SLICE_PROCESSING { static int iRun = 0; - export_group_fills_to_svg(debug_out_path("Layer-fill_surfaces-10_fill-final-%d.svg", iRun ++).c_str(), surface_fills); + export_group_fills_to_svg(debug_out_path("Layer-%d-fill_surfaces-10_fill-final-%d.svg", id(), iRun ++).c_str(), surface_fills); } #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ + BOOST_LOG_TRIVIAL(trace) << "make_fills: found " << surface_fills.size() << " surfaces to fill for layer " << id(); + size_t first_object_layer_id = this->object()->get_layer(0)->id(); for (SurfaceFill &surface_fill : surface_fills) { // Create the filler object. @@ -519,6 +526,7 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: else polylines = f->fill_surface(&surface_fill.surface, params); } catch (InfillFailedException &) { + BOOST_LOG_TRIVIAL(trace) << "make_fills: InfillFailedException!"; } if (!polylines.empty() || !thick_polylines.empty()) { // calculate actual flow from spacing (which might have been adjusted by the infill @@ -562,7 +570,9 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: flow_mm3_per_mm, float(flow_width), surface_fill.params.flow.height()); } insert_fills_into_islands(*this, uint32_t(surface_fill.region_id), fill_begin, uint32_t(layerm.fills().size())); - } + } else { + BOOST_LOG_TRIVIAL(trace) << "make_fills: no infill was generated for layer " << id(); + } } } @@ -854,7 +864,7 @@ void Layer::make_ironing() polygons_append(polys, surface.expolygon); } else { for (const Surface &surface : ironing_params.layerm->slices()) - if (surface.surface_type == stTop || (iron_everything && surface.surface_type == stBottom)) + if (surface.is_top() || (iron_everything && surface.surface_type == stBottom)) // stBottomBridge is not being ironed on purpose, as it would likely destroy the bridges. polygons_append(polys, surface.expolygon); } @@ -862,7 +872,7 @@ void Layer::make_ironing() // Add solid fill surfaces. This may not be ideal, as one will not iron perimeters touching these // solid fill surfaces, but it is likely better than nothing. for (const Surface &surface : ironing_params.layerm->fill_surfaces()) - if (surface.surface_type == stInternalSolid) + if (surface.is_internal_solid()) polygons_append(infills, surface.expolygon); } } diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 1f306c83c..d5919f552 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -2459,7 +2459,10 @@ void GCode::process_layer_single_object( }; ExtrusionEntitiesPtr temp_fill_extrusions; - if (const Layer *layer = layer_to_print.object_layer; layer) + if (const Layer *layer = layer_to_print.object_layer; layer) { +#ifdef SLIC3R_DEBUG_SLICE_PROCESSING + layer->export_lslices_polygons_to_svg_debug("process_gcode_layer"); +#endif for (size_t idx : layer->lslice_indices_sorted_by_print_order) { const LayerSlice &lslice = layer->lslices_ex[idx]; auto extrude_infill_range = [&]( @@ -2472,15 +2475,25 @@ void GCode::process_layer_single_object( for (auto it_fill_range = it_fill_ranges_begin; it_fill_range != it_fill_ranges_end; ++ it_fill_range) { assert(it_fill_range->region() == it_fill_ranges_begin->region()); for (uint32_t fill_id : *it_fill_range) { - assert(dynamic_cast(fills.entities[fill_id])); - if (auto *eec = static_cast(fills.entities[fill_id]); - (eec->role() == ExtrusionRole::Ironing) == ironing && shall_print_this_extrusion_collection(eec, region)) { + auto *eec = static_cast(fills.entities[fill_id]); + assert(eec); + if ((eec->role() == ExtrusionRole::Ironing) == ironing && shall_print_this_extrusion_collection(eec, region)) { +#ifdef SLIC3R_DEBUG_SLICE_PROCESSING + static int extrude_infill_range_run = 0; + eec->export_to_svg(debug_out_path("Layer-%d_gcode-extrude_infill_range-shall-be-printed-%u.svg", layerm.layer()->id(), extrude_infill_range_run++).c_str()); +#endif if (eec->can_reverse()) // Flatten the infill collection for better path planning. - for (auto *ee : eec->entities) + for (auto *ee : eec->entities) { temp_fill_extrusions.emplace_back(ee); + } else temp_fill_extrusions.emplace_back(eec); + } else { +#ifdef SLIC3R_DEBUG_SLICE_PROCESSING + static int iRun = 0; + eec->export_to_svg(debug_out_path("Layer-%d_gcode-extrude_infill_range-shall-not-be-printed-%u.svg", layerm.layer()->id(), iRun++).c_str()); +#endif } } } @@ -2491,17 +2504,30 @@ void GCode::process_layer_single_object( // Will parallel access of initial G-code preview to these extrusions while reordering them at backend cause issues? chain_and_reorder_extrusion_entities(temp_fill_extrusions, &m_last_pos); const auto extrusion_name = ironing ? "ironing"sv : "infill"sv; - for (const ExtrusionEntity *fill : temp_fill_extrusions) + for (const ExtrusionEntity *fill : temp_fill_extrusions) { if (auto *eec = dynamic_cast(fill); eec) { - for (const ExtrusionEntity *ee : eec->chained_path_from(m_last_pos).entities) + for (const ExtrusionEntity *ee : eec->chained_path_from(m_last_pos).entities) { +#ifdef SLIC3R_DEBUG_SLICE_PROCESSING + static int iRun = 0; + eec->export_to_svg(debug_out_path("Layer-%d_gcode-extrude_infill_range-collection-%u.svg", layerm.layer()->id(), iRun++).c_str()); +#endif gcode += this->extrude_entity(*ee, extrusion_name); - } else + } + } else { +#ifdef SLIC3R_DEBUG_SLICE_PROCESSING + static int iRun = 0; + export_to_svg(debug_out_path("Layer-%d_gcode-extrude_infill_range-entity-%u.svg", layerm.layer()->id(), iRun++).c_str(), + fill->as_polyline(), get_extents(layerm.slices().surfaces), scale_(0.1f)); +#endif gcode += this->extrude_entity(*fill, extrusion_name); + } + } } }; //FIXME order islands? // Sequential tool path ordering of multiple parts within the same object, aka. perimeter tracking (#5511) + BOOST_LOG_TRIVIAL(trace) << "Generating GCode for layer " << layer->id() << " - slice " << idx << " has " << lslice.islands.size() << " islands"; for (const LayerIsland &island : lslice.islands) { auto process_perimeters = [&]() { const LayerRegion &layerm = *layer->get_region(island.perimeters.region()); @@ -2510,9 +2536,13 @@ void GCode::process_layer_single_object( const PrintRegion ®ion = print.get_print_region(layerm.region().print_region_id()); bool first = true; for (uint32_t perimeter_id : island.perimeters) { - assert(dynamic_cast(layerm.perimeters().entities[perimeter_id])); - if (const auto *eec = static_cast(layerm.perimeters().entities[perimeter_id]); - shall_print_this_extrusion_collection(eec, region)) { + const auto *eec = static_cast(layerm.perimeters().entities[perimeter_id]); + assert(eec); + if (shall_print_this_extrusion_collection(eec, region)) { +#ifdef SLIC3R_DEBUG_SLICE_PROCESSING + static int iRun = 0; + eec->export_to_svg(debug_out_path("Layer-%d_gcode-process_perimeters-%u.svg", layerm.layer()->id(), iRun++).c_str()); +#endif // This may not apply to Arachne, but maybe the Arachne gap fill should disable reverse as well? // assert(! eec->can_reverse()); if (first) { @@ -2520,8 +2550,14 @@ void GCode::process_layer_single_object( init_layer_delayed(); m_config.apply(region.config()); } - for (const ExtrusionEntity *ee : *eec) + for (const ExtrusionEntity *ee : *eec) { gcode += this->extrude_entity(*ee, comment_perimeter, -1.); + } + } else { +#ifdef SLIC3R_DEBUG_SLICE_PROCESSING + static int iRun = 0; + eec->export_to_svg(debug_out_path("Layer-%d_gcode-process_perimeters-not-printed-%u.svg", layerm.layer()->id(), iRun++).c_str()); +#endif } } }; @@ -2535,6 +2571,7 @@ void GCode::process_layer_single_object( it = it_end; } }; + BOOST_LOG_TRIVIAL(trace) << "Generating GCode for layer " << layer->id() << " island - " << island.fills.size() << " fills, " << island.perimeters.size() << " perimeters."; if (print.config().infill_first) { process_infill(); process_perimeters(); @@ -2558,6 +2595,7 @@ void GCode::process_layer_single_object( } } } + } if (! first && this->config().gcode_label_objects) gcode += std::string("; stop printing object ") + print_object.model_object()->name + " id:" + std::to_string(object_id) + " copy " + std::to_string(print_instance.instance_id) + "\n"; } @@ -2793,6 +2831,11 @@ std::string GCode::extrude_multi_path(ExtrusionMultiPath multipath, const std::s std::string GCode::extrude_entity(const ExtrusionEntity &entity, const std::string_view description, double speed) { +#ifdef SLIC3R_DEBUG_SLICE_PROCESSING + static int extrude_infill_range_run = 0; + export_to_svg(debug_out_path("gcode-extrude_entity-%u.svg", extrude_infill_range_run++).c_str(), + entity.as_polyline(), get_extents(entity.as_polyline()), scale_(0.1f)); +#endif if (const ExtrusionPath* path = dynamic_cast(&entity)) return this->extrude_path(*path, description, speed); else if (const ExtrusionMultiPath* multipath = dynamic_cast(&entity)) @@ -2943,7 +2986,7 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string_view de acceleration = m_config.first_layer_acceleration_over_raft.value; } else if (m_config.bridge_acceleration.value > 0 && path.role().is_bridge()) { acceleration = m_config.bridge_acceleration.value; - } else if (m_config.top_solid_infill_acceleration > 0 && path.role() == ExtrusionRole::TopSolidInfill) { + } else if (m_config.top_solid_infill_acceleration > 0 && (path.role() == ExtrusionRole::TopSolidInfill || path.role() == ExtrusionRole::TopSolidInfillNonplanar)) { acceleration = m_config.top_solid_infill_acceleration.value; } else if (m_config.solid_infill_acceleration > 0 && path.role().is_solid_infill()) { acceleration = m_config.solid_infill_acceleration.value; @@ -2976,9 +3019,9 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string_view de speed = m_config.get_abs_value("bridge_speed"); } else if (path.role() == ExtrusionRole::InternalInfill) { speed = m_config.get_abs_value("infill_speed"); - } else if (path.role() == ExtrusionRole::SolidInfill) { + } else if (path.role() == ExtrusionRole::SolidInfill || path.role() == ExtrusionRole::SolidInfillNonplanar) { speed = m_config.get_abs_value("solid_infill_speed"); - } else if (path.role() == ExtrusionRole::TopSolidInfill) { + } else if (path.role() == ExtrusionRole::TopSolidInfill || path.role() == ExtrusionRole::TopSolidInfillNonplanar) { speed = m_config.get_abs_value("top_solid_infill_speed"); } else if (path.role() == ExtrusionRole::Ironing) { speed = m_config.get_abs_value("ironing_speed"); @@ -3118,15 +3161,15 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string_view de comment = description; comment += description_bridge; } - Vec2d prev = this->point_to_gcode_quantized(path.polyline.points.front()); + Vec3d prev3 = this->point3_to_gcode_quantized(path.polyline.points.front()); auto it = path.polyline.points.begin(); auto end = path.polyline.points.end(); for (++ it; it != end; ++ it) { - Vec2d p = this->point_to_gcode_quantized(*it); - const double line_length = (p - prev).norm(); + Vec3d p3 = this->point3_to_gcode_quantized(*it); + const double line_length = (p3 - prev3).norm(); path_length += line_length; - gcode += m_writer.extrude_to_xy(p, e_per_mm * line_length, comment); - prev = p; + gcode += m_writer.extrude_to_xyz(p3, e_per_mm * line_length, comment); + prev3 = p3; } } else { std::string marked_comment; @@ -3138,13 +3181,13 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string_view de double last_set_fan_speed = new_points[0].fan_speed; gcode += m_writer.set_speed(last_set_speed, "", cooling_marker_setspeed_comments); gcode += "\n;_SET_FAN_SPEED" + std::to_string(int(last_set_fan_speed)) + "\n"; - Vec2d prev = this->point_to_gcode_quantized(new_points[0].p); + Vec3d prev3 = this->point3_to_gcode_quantized(new_points[0].p); for (size_t i = 1; i < new_points.size(); i++) { const ProcessedPoint &processed_point = new_points[i]; - Vec2d p = this->point_to_gcode_quantized(processed_point.p); - const double line_length = (p - prev).norm(); - gcode += m_writer.extrude_to_xy(p, e_per_mm * line_length, marked_comment); - prev = p; + Vec3d p3 = this->point3_to_gcode_quantized(processed_point.p); + const double line_length = (p3 - prev3).norm(); + gcode += m_writer.extrude_to_xyz(p3, e_per_mm * line_length, marked_comment); + prev3 = p3; double new_speed = processed_point.speed * 60.0; if (last_set_speed != new_speed) { gcode += m_writer.set_speed(new_speed, "", cooling_marker_setspeed_comments); @@ -3186,6 +3229,8 @@ std::string GCode::travel_to(const Point &point, ExtrusionRole role, std::string // check whether a straight travel move would need retraction bool needs_retraction = this->needs_retraction(travel, role); + // check whether we need to move to a different z layer + bool needs_zmove = this->needs_zmove(travel); // check whether wipe could be disabled without causing visible stringing bool could_be_wipe_disabled = false; // Save state of use_external_mp_once for the case that will be needed to call twice m_avoid_crossing_perimeters.travel_to. @@ -3232,10 +3277,20 @@ std::string GCode::travel_to(const Point &point, ExtrusionRole role, std::string // use G1 because we rely on paths being straight (G0 may make round paths) if (travel.size() >= 2) { + // Move Z up if necessary + if (needs_zmove) { + gcode += m_writer.travel_to_z(this->layer()->print_z, "Move up for non planar extrusion"); + } + gcode += m_writer.set_travel_acceleration((unsigned int)(m_config.travel_acceleration.value + 0.5)); - for (size_t i = 1; i < travel.size(); ++ i) - gcode += m_writer.travel_to_xy(this->point_to_gcode(travel.points[i]), comment); + for (size_t i = 1; i < travel.size(); ++ i) { + if (needs_zmove) { + gcode += m_writer.travel_to_xyz(this->point3_to_gcode(travel.points[i]), comment); + } else { + gcode += m_writer.travel_to_xy(this->point_to_gcode(travel.points[i]), comment); + } + } if (! GCodeWriter::supports_separate_travel_acceleration(config().gcode_flavor)) { // In case that this flavor does not support separate print and travel acceleration, @@ -3243,8 +3298,18 @@ std::string GCode::travel_to(const Point &point, ExtrusionRole role, std::string gcode += m_writer.set_travel_acceleration((unsigned int)(m_config.travel_acceleration.value + 0.5)); } + if (needs_zmove) { + float move_z = unscale(point.nonplanar_z); + if(point.nonplanar_z == -1) { + move_z = this->layer()->print_z; + } + gcode += m_writer.travel_to_z(move_z, "Move down for non planar extrusion"); + } + this->set_last_pos(travel.points.back()); } + + return gcode; } @@ -3287,6 +3352,24 @@ bool GCode::needs_retraction(const Polyline &travel, ExtrusionRole role) return true; } +bool +GCode::needs_zmove(const Polyline &travel) +{ + if (travel.length() < scale_(1.0)) { + // skip zmove if the move is shorter 1 mm + return false; + } + + //check if any point in travel is below the layer z + for (Point p : travel.points) + { + if ((p.nonplanar_z != -1) && (p.nonplanar_z < scale_(this->layer()->print_z))) + return true; + } + + return false; +} + std::string GCode::retract(bool toolchange) { std::string gcode; @@ -3421,12 +3504,28 @@ Vec2d GCode::point_to_gcode(const Point &point) const return unscaled(point) + m_origin - extruder_offset; } +// convert a model-space scaled point into G-code coordinates +Vec3d GCode::point3_to_gcode(const Point &point) const +{ + Vec2d extruder_offset = EXTRUDER_CONFIG(extruder_offset); + double p_x = unscaled(point.x()) + m_origin.x() - extruder_offset.x(); + double p_y = unscaled(point.y()) + m_origin.y() - extruder_offset.y(); + double p_z = point.nonplanar_z == -1 ? this->layer()->print_z : unscale(point.nonplanar_z); + return { p_x, p_y, p_z }; +} + Vec2d GCode::point_to_gcode_quantized(const Point &point) const { Vec2d p = this->point_to_gcode(point); return { GCodeFormatter::quantize_xyzf(p.x()), GCodeFormatter::quantize_xyzf(p.y()) }; } +Vec3d GCode::point3_to_gcode_quantized(const Point &point) const +{ + Vec3d p = this->point3_to_gcode(point); + return { GCodeFormatter::quantize_xyzf(p.x()), GCodeFormatter::quantize_xyzf(p.y()), GCodeFormatter::quantize_xyzf(p.z()) }; +} + // convert a model-space scaled point into G-code coordinates Point GCode::gcode_to_point(const Vec2d &point) const { @@ -3435,7 +3534,6 @@ Point GCode::gcode_to_point(const Vec2d &point) const // This function may be called at the very start from toolchange G-code when the extruder is not assigned yet. pt += m_config.extruder_offset.get_at(extruder->id()); return scaled(pt); - } } // namespace Slic3r diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 346ececba..9f918bbcd 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -166,8 +166,10 @@ public: const Point& last_pos() const { return m_last_pos; } // Convert coordinates of the active object to G-code coordinates, possibly adjusted for extruder offset. Vec2d point_to_gcode(const Point &point) const; + Vec3d point3_to_gcode(const Point &point) const; // Convert coordinates of the active object to G-code coordinates, possibly adjusted for extruder offset and quantized to G-code resolution. Vec2d point_to_gcode_quantized(const Point &point) const; + Vec3d point3_to_gcode_quantized(const Point &point) const; Point gcode_to_point(const Vec2d &point) const; const FullPrintConfig &config() const { return m_config; } const Layer* layer() const { return m_layer; } @@ -326,6 +328,7 @@ private: std::string travel_to(const Point &point, ExtrusionRole role, std::string comment); bool needs_retraction(const Polyline &travel, ExtrusionRole role = ExtrusionRole::None); + bool needs_zmove(const Polyline &travel); std::string retract(bool toolchange = false); std::string unretract() { return m_writer.unlift() + m_writer.unretract(); } std::string set_extruder(unsigned int extruder_id, double print_z); diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index 9c330c38e..f0e43aaf6 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -274,7 +274,7 @@ std::string GCodeWriter::travel_to_xyz(const Vec3d &point, const std::string &co // FIXME: This function was not being used when travel_speed_z was separated (bd6badf). // Calculation of feedrate was not updated accordingly. If you want to use // this function, fix it first. - std::terminate(); + // std::terminate(); /* If target Z is lower than current Z but higher than nominal Z we don't perform the Z move but we only move in the XY plane and @@ -360,16 +360,16 @@ std::string GCodeWriter::extrude_to_xy(const Vec2d &point, double dE, const std: return w.string(); } -#if 0 +#if 1 std::string GCodeWriter::extrude_to_xyz(const Vec3d &point, double dE, const std::string &comment) { m_pos = point; m_lifted = 0; - m_extruder->extrude(dE); + //m_extruder->extrude(dE); GCodeG1Formatter w; w.emit_xyz(point); - w.emit_e(m_extrusion_axis, m_extruder->E()); + w.emit_e(m_extrusion_axis, m_extruder->extrude(dE).second); w.emit_comment(this->config.gcode_comments, comment); return w.string(); } diff --git a/src/libslic3r/GCodeWriter.hpp b/src/libslic3r/GCodeWriter.hpp index 0d376cb15..56b0cafc9 100644 --- a/src/libslic3r/GCodeWriter.hpp +++ b/src/libslic3r/GCodeWriter.hpp @@ -62,7 +62,7 @@ public: std::string travel_to_z(double z, const std::string &comment = std::string()); bool will_move_z(double z) const; std::string extrude_to_xy(const Vec2d &point, double dE, const std::string &comment = std::string()); -// std::string extrude_to_xyz(const Vec3d &point, double dE, const std::string &comment = std::string()); + std::string extrude_to_xyz(const Vec3d &point, double dE, const std::string &comment = std::string()); std::string retract(bool before_wipe = false); std::string retract_for_toolchange(bool before_wipe = false); std::string unretract(); diff --git a/src/libslic3r/Geometry.cpp b/src/libslic3r/Geometry.cpp index f2860ea8e..09ef54215 100644 --- a/src/libslic3r/Geometry.cpp +++ b/src/libslic3r/Geometry.cpp @@ -746,4 +746,74 @@ bool trafos_differ_in_rotation_by_z_and_mirroring_by_xy_only(const Transform3d & return std::abs(d * d) < EPSILON * lx2 * ly2; } +bool +Point_in_triangle(Vec2f pt, Vec2f v1, Vec2f v2, Vec2f v3) +{ + //Check if point is right of every edge + if (sign(pt, v1, v2) <= 0.0f) return false; + if (sign(pt, v2, v3) <= 0.0f) return false; + if (sign(pt, v3, v1) <= 0.0f) return false; + + return true; +} + +//https://graphics.stanford.edu/~mdfisher/Code/Engine/Plane.cpp.html +coord_t +Project_point_on_plane(Vec3f v1, Vec3f n, Point pt) +{ + //if no intersection leave point unchanged (should never happen) + if(n.z() == 0) { + return -1; + } + + //unscale point for calculations + float px = unscale(pt.x()); + float py = unscale(pt.y()); + float pz = 0; + + //Calculate space plane + float d = -(v1.x() * n.x() + v1.y() * n.y() + v1.z() * n.z()); + + float u = -(n.x() * px + n.y() * py + n.z() * pz + d) / n.z(); + + //scale up again + return scale_(u); +} + +// http://paulbourke.net/geometry/pointlineplane/index.html +Vec3d* +Line_intersection(Vec3d p1, Vec3d p2, Point p3, Point p4) { + + float denom = ((p4.y() - p3.y())*(p2.x() - p1.x())) - + ((p4.x() - p3.x())*(p2.y() - p1.y())); + + float nume_a = ((p4.x() - p3.x())*(p1.y() - p3.y())) - + ((p4.y() - p3.y())*(p1.x() - p3.x())); + + float nume_b = ((p2.x() - p1.x())*(p1.y() - p3.y())) - + ((p2.y() - p1.y())*(p1.x() - p3.x())); + + if(denom == 0.0f) + { + return NULL; + } + + float ua = nume_a / denom; + float ub = nume_b / denom; + + if(ua >= 0.0f && ua <= 1.0f && ub >= 0.0f && ub <= 1.0f) + { + // Get the intersection point anc calculate z component + Vec3d* ret = new Vec3d(); + ret->x() = p1.x() + ua*(p2.x() - p1.x()); + ret->y() = p1.y() + ua*(p2.y() - p1.y()); + ret->z() = p1.z() - ((sqrt((p1.x()-ret->x())*(p1.x()-ret->x()) + (p1.y()-ret->y())*(p1.y()-ret->y())) + / sqrt((p1.x()-p2.x())*(p1.x()-p2.x()) + (p1.y()-p2.y())*(p1.y()-p2.y()))) + * (p1.z() - p2.z())); + return ret; + } + + return NULL; +} + }} // namespace Slic3r::Geometry diff --git a/src/libslic3r/Geometry.hpp b/src/libslic3r/Geometry.hpp index 9d04bb7eb..806f04095 100644 --- a/src/libslic3r/Geometry.hpp +++ b/src/libslic3r/Geometry.hpp @@ -529,6 +529,23 @@ Vec<3, T> spheric_to_dir(const Pair &v) return spheric_to_dir(plr, azm); } +inline float sign(Vec2f p1, Vec2f p2, Vec2f p3) +{ + return (p1.x() - p3.x()) * (p2.y() - p3.y()) - (p2.x() - p3.x()) * (p1.y() - p3.y()); +} + +bool Point_in_triangle(Vec2f pt, Vec2f v1, Vec2f v2, Vec2f v3); + +//https://graphics.stanford.edu/~mdfisher/Code/Engine/Plane.cpp.html +coord_t Project_point_on_plane(Vec3f v1, Vec3f n, Point pt); + +// http://paulbourke.net/geometry/pointlineplane/index.html +Vec3d *Line_intersection(Vec3d p1, Vec3d p2, Point p3, Point p4); + +inline float triangle_surface(Point p1, Point p2, Point p3) { + return 0.5 * ((p2.x()-p1.x()) * (p3.y()-p1.y()) - (p2.y()-p1.y()) * (p3.x()-p1.x())); +} + } } // namespace Slicer::Geometry #endif diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index 9d658841c..c5d578e58 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -54,6 +54,8 @@ void Layer::make_slices() } // lslices are sorted by topological order from outside to inside from the clipper union used above this->lslices = slices; + + BOOST_LOG_TRIVIAL(trace) << "make_slices layer " << id() << " found " << slices.size() << " slices"; } this->lslice_indices_sorted_by_print_order = chain_expolygons(this->lslices); @@ -1066,7 +1068,7 @@ void Layer::export_region_slices_to_svg(const char *path) const void Layer::export_region_slices_to_svg_debug(const char *name) const { static size_t idx = 0; - this->export_region_slices_to_svg(debug_out_path("Layer-slices-%s-%d.svg", name, idx ++).c_str()); + this->export_region_slices_to_svg(debug_out_path("Layer-%d-slices-%s-%d.svg", id(), name, idx ++).c_str()); } void Layer::export_region_fill_surfaces_to_svg(const char *path) const @@ -1092,7 +1094,57 @@ void Layer::export_region_fill_surfaces_to_svg(const char *path) const void Layer::export_region_fill_surfaces_to_svg_debug(const char *name) const { static size_t idx = 0; - this->export_region_fill_surfaces_to_svg(debug_out_path("Layer-fill_surfaces-%s-%d.svg", name, idx ++).c_str()); + this->export_region_fill_surfaces_to_svg(debug_out_path("Layer-%d-fill_surfaces-%s-%d.svg", id(), name, idx ++).c_str()); +} + +void Layer::export_lslices_polygons_to_svg(const char *path) const +{ + BoundingBox bbox; + for (const auto *region : m_regions) + for (const auto &surface : region->slices()) + bbox.merge(get_extents(surface.expolygon)); + + SVG svg(path, bbox); + for (int i = 0; i< lslices.size(); i++) + svg.draw(lslices[i], "black", 1.0); + svg.Close(); +} + +// Export to "out/Layer-%name-%idx.svg" with an increasing index with every export. +void Layer::export_lslices_polygons_to_svg_debug(const char *name) const +{ + static size_t idx = 0; + this->export_lslices_polygons_to_svg(debug_out_path("Layer-%d-lslice_polygons-%s-%d.svg", id(), name, idx ++).c_str()); +} + +void +LayerRegion::remove_nonplanar_slices(SurfaceCollection topNonplanar) { + Surfaces layerm_slices_surfaces(m_slices.surfaces); + + //save previously detected nonplanar surfaces + SurfaceCollection polyNonplanar; + for(Surface s : m_slices.surfaces) { + if (s.is_nonplanar()) { + polyNonplanar.surfaces.push_back(s); + } + } + + // clear internal surfaces + m_slices.clear(); + + // append internal surfaces again without the found topNonplanar surfaces + m_slices.append( + diff_ex( + union_ex(layerm_slices_surfaces), + topNonplanar.surfaces, + ApplySafetyOffset::No), + stInternal + ); +} + +void +LayerRegion::append_top_nonplanar_slices(SurfaceCollection topNonplanar) { + m_slices.append(std::move(topNonplanar)); } BoundingBox get_extents(const LayerRegion &layer_region) diff --git a/src/libslic3r/Layer.hpp b/src/libslic3r/Layer.hpp index 5cfdf9cfa..c2e5eed9a 100644 --- a/src/libslic3r/Layer.hpp +++ b/src/libslic3r/Layer.hpp @@ -7,6 +7,7 @@ #include "Flow.hpp" #include "SurfaceCollection.hpp" #include "ExtrusionEntityCollection.hpp" +#include "NonplanarSurface.hpp" #include @@ -132,6 +133,9 @@ public: // ordered collection of extrusion paths to fill surfaces // (this collection contains only ExtrusionEntityCollection objects) [[nodiscard]] const ExtrusionEntityCollection& fills() const { return m_fills; } + + // Vector of nonplanar_surfaces which are homed in this layer + [[nodiscard]] const NonplanarSurfaces& nonplanar_surfaces() const { return m_nonplanar_surfaces; } Flow flow(FlowRole role) const; Flow flow(FlowRole role, double layer_height) const; @@ -167,6 +171,20 @@ public: // Is there any valid extrusion assigned to this LayerRegion? bool has_extrusions() const { return ! this->perimeters().empty() || ! this->fills().empty(); } + //append a new nonplanar surface to the list skip if already in list + void append_nonplanar_surface(NonplanarSurface& surface); + // Projects the paths of a collection regarding the structure of a stl mesh + void project_nonplanar_extrusion(ExtrusionEntityCollection* collection); + /// Projects nonplanar surfaces downwards regarding the structure of the stl mesh. + void project_nonplanar_surfaces(); + ///project a nonplanar path + void project_nonplanar_path(ExtrusionPath* path); + ///sets the z coordinates correctly for all points TODO move to generation of points + void correct_z_on_path(ExtrusionPath *path); + // + void remove_nonplanar_slices(SurfaceCollection topNonplanar); + void append_top_nonplanar_slices(SurfaceCollection topNonplanar); + protected: friend class Layer; friend class PrintObject; @@ -225,6 +243,8 @@ private: // (this collection contains only ExtrusionEntityCollection objects) ExtrusionEntityCollection m_fills; + NonplanarSurfaces m_nonplanar_surfaces; + // collection of expolygons representing the bridged areas (thus not // needing support material) // Polygons bridged; @@ -379,9 +399,11 @@ public: void export_region_slices_to_svg(const char *path) const; void export_region_fill_surfaces_to_svg(const char *path) const; + void export_lslices_polygons_to_svg(const char *name) const; // Export to "out/LayerRegion-name-%d.svg" with an increasing index with every export. void export_region_slices_to_svg_debug(const char *name) const; void export_region_fill_surfaces_to_svg_debug(const char *name) const; + void export_lslices_polygons_to_svg_debug(const char *name) const; // Is there any valid extrusion assigned to this LayerRegion? virtual bool has_extrusions() const { for (auto layerm : m_regions) if (layerm->has_extrusions()) return true; return false; } diff --git a/src/libslic3r/LayerRegion.cpp b/src/libslic3r/LayerRegion.cpp index 73f225c57..2f466aef2 100644 --- a/src/libslic3r/LayerRegion.cpp +++ b/src/libslic3r/LayerRegion.cpp @@ -463,10 +463,16 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly Surfaces tops = expand_merge_surfaces(m_fill_surfaces.surfaces, stTop, shells, RegionExpansionParameters::build(expansion_top, expansion_step, max_nr_expansion_steps), sparse, expansion_params_into_sparse_infill, closing_radius); + Surfaces nonplanarTops = expand_merge_surfaces(m_fill_surfaces.surfaces, stTopNonplanar, shells, + RegionExpansionParameters::build(expansion_top, expansion_step, max_nr_expansion_steps), + sparse, expansion_params_into_sparse_infill, closing_radius); + Surfaces nonplanarInternals = expand_merge_surfaces(m_fill_surfaces.surfaces, stInternalSolidNonplanar, shells, + RegionExpansionParameters::build(expansion_top, expansion_step, max_nr_expansion_steps), + sparse, expansion_params_into_sparse_infill, closing_radius); // m_fill_surfaces.remove_types({ stBottomBridge, stBottom, stTop, stInternal, stInternalSolid }); m_fill_surfaces.clear(); - reserve_more(m_fill_surfaces.surfaces, shells.size() + sparse.size() + bridges.size() + bottoms.size() + tops.size()); + reserve_more(m_fill_surfaces.surfaces, shells.size() + sparse.size() + bridges.size() + bottoms.size() + tops.size() + nonplanarTops.size() + nonplanarInternals.size()); { Surface solid_templ(stInternalSolid, {}); solid_templ.thickness = layer_thickness; @@ -480,6 +486,8 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly m_fill_surfaces.append(std::move(bridges.surfaces)); m_fill_surfaces.append(std::move(bottoms)); m_fill_surfaces.append(std::move(tops)); + m_fill_surfaces.append(std::move(nonplanarTops)); + m_fill_surfaces.append(std::move(nonplanarInternals)); #ifdef SLIC3R_DEBUG_SLICE_PROCESSING export_region_fill_surfaces_to_svg_debug("4_process_external_surfaces-final"); @@ -876,7 +884,7 @@ void LayerRegion::export_region_slices_to_svg_debug(const char *name) const { static std::map idx_map; size_t &idx = idx_map[name]; - this->export_region_slices_to_svg(debug_out_path("LayerRegion-slices-%s-%d.svg", name, idx ++).c_str()); + this->export_region_slices_to_svg(debug_out_path("LayerRegion-%d-slices-%s-%d.svg", layer()->id(), name, idx ++).c_str()); } void LayerRegion::export_region_fill_surfaces_to_svg(const char *path) const @@ -903,7 +911,246 @@ void LayerRegion::export_region_fill_surfaces_to_svg_debug(const char *name) con { static std::map idx_map; size_t &idx = idx_map[name]; - this->export_region_fill_surfaces_to_svg(debug_out_path("LayerRegion-fill_surfaces-%s-%d.svg", name, idx ++).c_str()); + this->export_region_fill_surfaces_to_svg(debug_out_path("LayerRegion-%d-fill_surfaces-%s-%d.svg", layer()->id(), name, idx ++).c_str()); +} + +void +LayerRegion::append_nonplanar_surface(NonplanarSurface& surface) +{ + for(auto & s : m_nonplanar_surfaces){ + if (s == surface){ + return; + } + } + m_nonplanar_surfaces.push_back(surface); +} + +void +LayerRegion::project_nonplanar_extrusion(ExtrusionEntityCollection *collection) +{ + for (auto& entity : collection->entities) { + if (ExtrusionLoop* loop = dynamic_cast(entity)) { + BOOST_LOG_TRIVIAL(trace) << "Projecting extrusion loop with " << loop->paths.size() << " paths"; + + for(auto& path : loop->paths) { + project_nonplanar_path(&path); + correct_z_on_path(&path); + } + +#ifdef SLIC3R_DEBUG_SLICE_PROCESSING + { + static int iRun = 0; + export_to_svg(debug_out_path("Layer-%d_project_extrusion_loop-%u-after.svg", layer()->id(), iRun ++).c_str(), + loop->as_polyline(), get_extents(this->slices().surfaces), scale_(0.1f)); + } +#endif + } else if (ExtrusionMultiPath* multipath = dynamic_cast(entity)) { + BOOST_LOG_TRIVIAL(trace) << "Projecting extrusion multipath with " << multipath->paths.size() << " paths"; + + for (auto& path : multipath->paths) { + project_nonplanar_path(&path); + correct_z_on_path(&path); + } +#ifdef SLIC3R_DEBUG_SLICE_PROCESSING + { + static int iRun = 0; + export_to_svg(debug_out_path("Layer-%d_project_extrusion_multipath-%u-after.svg", layer()->id(), iRun ++).c_str(), + multipath->as_polyline(), get_extents(this->slices().surfaces), scale_(0.1f)); + } +#endif + } else if (ExtrusionPath* path = dynamic_cast(entity)) { + BOOST_LOG_TRIVIAL(trace) << "Projecting 1 extrusion path"; + + project_nonplanar_path(path); + correct_z_on_path(path); +#ifdef SLIC3R_DEBUG_SLICE_PROCESSING + { + static int iRun = 0; + export_to_svg(debug_out_path("Layer-%d_project_extrusion_path-%u-after.svg", layer()->id(), iRun ++).c_str(), + path->as_polyline(), get_extents(this->slices().surfaces), scale_(0.1f)); + } +#endif + } else { + BOOST_LOG_TRIVIAL(trace) << "Unknown entity class " << typeid(entity).name(); + assert(false); + } + } +} + +void +LayerRegion::project_nonplanar_surfaces() +{ + // skip if there are no nonplanar_surfaces on this LayerRegion + if (m_nonplanar_surfaces.size() == 0) { + return; + } + + BOOST_LOG_TRIVIAL(trace) << "Projecting " << m_nonplanar_surfaces.size() << " nonplanar surfaces for region " << + region().print_region_id() << " and layer " << layer()->id() << " (z = " << layer()->print_z << ")"; + + // for all perimeters do path projection + BOOST_LOG_TRIVIAL(trace) << "Projecting " << m_perimeters.size() << " nonplanar perimeters"; + for (auto& col : m_perimeters.entities) { + ExtrusionEntityCollection* collection = dynamic_cast(col); + this->project_nonplanar_extrusion(collection); + } + + // and all fill paths do path projection + BOOST_LOG_TRIVIAL(trace) << "Projecting " << m_fills.size() << " nonplanar fills"; + for (auto& col : m_fills.entities) { + ExtrusionEntityCollection* collection = dynamic_cast(col); + this->project_nonplanar_extrusion(collection); + } +} + +//Sorting functions for soring of paths +bool +greaterX(const Vec3d &a, const Vec3d &b) +{ + return (a.x() < b.x()); +} + +bool +smallerX(const Vec3d &a, const Vec3d &b) +{ + return (a.x() > b.x()); +} + +bool +greaterY(const Vec3d &a, const Vec3d &b) +{ + return (a.y() < b.y()); +} + +bool +smallerY(const Vec3d &a, const Vec3d &b) +{ + return (a.y() > b.y()); +} + +void +LayerRegion::project_nonplanar_path(ExtrusionPath *path) +{ + //First check all points and project them regarding the triangle mesh + for (Point& point : path->polyline.points) { + for (auto& surface : m_nonplanar_surfaces) { + float distance_to_top = surface.stats.max.z - this->layer()->print_z; + for(auto& facet : surface.mesh) { + // skip if point is outside of the bounding box of the triangle + if (unscale(point).x() < std::min({facet.second.vertex[0].x, facet.second.vertex[1].x, facet.second.vertex[2].x}) || + unscale(point).x() > std::max({facet.second.vertex[0].x, facet.second.vertex[1].x, facet.second.vertex[2].x}) || + unscale(point).y() < std::min({facet.second.vertex[0].y, facet.second.vertex[1].y, facet.second.vertex[2].y}) || + unscale(point).y() > std::max({facet.second.vertex[0].y, facet.second.vertex[1].y, facet.second.vertex[2].y})) + { + continue; + } + + //check if point is inside of Triangle + if (Slic3r::Geometry::Point_in_triangle( + Vec2f(unscale(point).x(), unscale(point).y()), + Vec2f(facet.second.vertex[0].x, facet.second.vertex[0].y), + Vec2f(facet.second.vertex[1].x, facet.second.vertex[1].y), + Vec2f(facet.second.vertex[2].x, facet.second.vertex[2].y)) + && (facet.second.normal.z != 0)) + { + coord_t z = Slic3r::Geometry::Project_point_on_plane(Vec3f(facet.second.vertex[0].x,facet.second.vertex[0].y,facet.second.vertex[0].z), + Vec3f(facet.second.normal.x,facet.second.normal.y,facet.second.normal.z), + point); + + //Shift down when on lower layer + point.nonplanar_z = z - scale_(distance_to_top); + //break; + } + } + } + } + + // Then check all line intersections, cut line on intersection and project new point + std::vector::size_type size = path->polyline.points.size(); + for (std::vector::size_type i = 0; i < size-1; ++i) + { + Pointf3s intersections; + // check against every facet if lines intersect + for (auto& surface : m_nonplanar_surfaces) { + float distance_to_top = surface.stats.max.z - this->layer()->print_z; + for(auto& facet : surface.mesh) { + for(int j= 0; j < 3; j++) { + // TODO precheck for faster computation + Vec3d p1 = Vec3d(scale_(facet.second.vertex[j].x), scale_(facet.second.vertex[j].y), scale_(facet.second.vertex[j].z)); + Vec3d p2 = Vec3d(scale_(facet.second.vertex[(j+1) % 3].x), scale_(facet.second.vertex[(j+1) % 3].y), scale_(facet.second.vertex[(j+1) % 3].z)); + Vec3d* p = Slic3r::Geometry::Line_intersection(p1, p2, path->polyline.points[i], path->polyline.points[i+1]); + + if (p) { + // add distance to top for every added point + p->z() = p->z() - scale_(distance_to_top); + intersections.push_back(*p); + } + } + } + } + + // Stop if no intersections are found + if (intersections.size() == 0) continue; + + // sort found intersectons if there are more than 1 + if ( intersections.size() > 1 ){ + if (abs(path->polyline.points[i+1].x() - path->polyline.points[i].x()) >= abs(path->polyline.points[i+1].y() - path->polyline.points[i].y()) ) { + // sort by X + if(path->polyline.points[i].x() < path->polyline.points[i+1].x()) { + std::sort(intersections.begin(), intersections.end(), smallerX); + }else { + std::sort(intersections.begin(), intersections.end(), greaterX); + } + } else { + // sort by Y + if(path->polyline.points[i].y() < path->polyline.points[i+1].y()) { + std::sort(intersections.begin(), intersections.end(), smallerY); + }else { + std::sort(intersections.begin(), intersections.end(), greaterY); + } + } + } + + // remove duplicates + Pointf3s::iterator point = intersections.begin(); + while (point != intersections.end()-1) { + bool delete_point = false; + Pointf3s::iterator point2 = point; + ++point2; + //compare with next point if they are the same, delete current point + if ((*point).x() == (*point2).x() && (*point).y() == (*point2).y()) { + //remove duplicate point + delete_point = true; + point = intersections.erase(point); + } + //continue loop when no point is removed. Otherwise the new point is set while deleting the old one. + if (!delete_point) { + ++point; + } + } + + //insert new points into array + for (Vec3d p : intersections) + { + Point *pt = new Point(p.x(), p.y()); + pt->nonplanar_z = p.z(); + path->polyline.points.insert(path->polyline.points.begin()+i+1, *pt); + } + + //modifiy array boundary + i = i + intersections.size(); + size = size + intersections.size(); + } +} + +void +LayerRegion::correct_z_on_path(ExtrusionPath *path) +{ + for (Point& point : path->polyline.points) { + if(point.nonplanar_z == -1) { + point.nonplanar_z = scale_(this->layer()->print_z); + } + } } } diff --git a/src/libslic3r/MultiPoint.cpp b/src/libslic3r/MultiPoint.cpp index fb4727abe..d0c680b42 100644 --- a/src/libslic3r/MultiPoint.cpp +++ b/src/libslic3r/MultiPoint.cpp @@ -103,8 +103,28 @@ bool MultiPoint::remove_duplicate_points() return false; } +bool +MultiPoint::needs_zmove(const Points &pts) +{ + coord_t z = -1; + //check if any point in travel is below the layer z + for (Point p : pts) + { + if(z == -1) { + z = p.nonplanar_z; + } + else if ((p.nonplanar_z != -1) && (p.nonplanar_z != z)) + return true; + } + + return false; +} + Points MultiPoint::douglas_peucker(const Points &pts, const double tolerance) { + if(MultiPoint::needs_zmove(pts)) + return pts; + Points result_pts; auto tolerance_sq = int64_t(sqr(tolerance)); if (! pts.empty()) { diff --git a/src/libslic3r/MultiPoint.hpp b/src/libslic3r/MultiPoint.hpp index 62b53255b..20980c31e 100644 --- a/src/libslic3r/MultiPoint.hpp +++ b/src/libslic3r/MultiPoint.hpp @@ -81,6 +81,7 @@ public: } } + static bool needs_zmove(const Points &pts); static Points douglas_peucker(const Points &points, const double tolerance); static Points visivalingam(const Points& pts, const double& tolerance); diff --git a/src/libslic3r/NonplanarFacet.cpp b/src/libslic3r/NonplanarFacet.cpp new file mode 100644 index 000000000..fbc953e76 --- /dev/null +++ b/src/libslic3r/NonplanarFacet.cpp @@ -0,0 +1,72 @@ +#include "NonplanarFacet.hpp" + +namespace Slic3r { + +void +NonplanarFacet::calculate_stats() { + //calculate min and max values + this->stats.min.x = this->vertex[0].x; + this->stats.min.y = this->vertex[0].y; + this->stats.min.z = this->vertex[0].z; + this->stats.max.x = this->vertex[0].x; + this->stats.max.y = this->vertex[0].y; + this->stats.max.z = this->vertex[0].z; + for(int j = 1; j < 3; j++) { + this->stats.min.x = std::min(this->stats.min.x, this->vertex[j].x); + this->stats.min.y = std::min(this->stats.min.y, this->vertex[j].y); + this->stats.min.z = std::min(this->stats.min.z, this->vertex[j].z); + this->stats.max.x = std::max(this->stats.max.x, this->vertex[j].x); + this->stats.max.y = std::max(this->stats.max.y, this->vertex[j].y); + this->stats.max.z = std::max(this->stats.max.z, this->vertex[j].z); + } +} + +void +NonplanarFacet::translate(float x, float y, float z) +{ + //translate facet + for(int j = 0; j < 3; j++) { + this->vertex[j].x += x; + this->vertex[j].y += y; + this->vertex[j].z += z; + } + + //translate min and max values + this->stats.min.x += x; + this->stats.min.y += y; + this->stats.min.z += z; + this->stats.max.x += x; + this->stats.max.y += y; + this->stats.max.z += z; +} + +void +NonplanarFacet::scale(float versor[3]) +{ + //scale facet + for(int j = 0; j < 3; j++) { + this->vertex[j].x *= versor[0]; + this->vertex[j].y *= versor[1]; + this->vertex[j].z *= versor[2]; + } + + //scale min and max values + this->stats.min.x *= versor[0]; + this->stats.min.y *= versor[1]; + this->stats.min.z *= versor[2]; + this->stats.max.x *= versor[0]; + this->stats.max.y *= versor[1]; + this->stats.max.z *= versor[2]; +} + +float +NonplanarFacet::calculate_surface_area() +{ + return Slic3r::Geometry::triangle_surface( + Point(this->vertex[0].x, this->vertex[0].y), + Point(this->vertex[1].x, this->vertex[1].y), + Point(this->vertex[2].x, this->vertex[2].y) + ); +} + +} diff --git a/src/libslic3r/NonplanarFacet.hpp b/src/libslic3r/NonplanarFacet.hpp new file mode 100644 index 000000000..c38d5addd --- /dev/null +++ b/src/libslic3r/NonplanarFacet.hpp @@ -0,0 +1,39 @@ +#ifndef slic3r_NonplanarFacet_hpp_ +#define slic3r_NonplanarFacet_hpp_ + +#include "libslic3r.h" +#include "Geometry.hpp" + +namespace Slic3r { + +typedef struct { + float x; + float y; + float z; +} facet_vertex; + +typedef struct { + facet_vertex max; + facet_vertex min; +} facet_stats; + +class NonplanarFacet +{ + public: + facet_vertex vertex[3]; + facet_vertex normal; + int neighbor[3]; + facet_stats stats; + bool marked = false; + + NonplanarFacet() {}; + ~NonplanarFacet() {}; + void calculate_stats(); + void translate(float x, float y, float z); + void scale(float versor[3]); + float calculate_surface_area(); + +}; +}; + +#endif \ No newline at end of file diff --git a/src/libslic3r/NonplanarSurface.cpp b/src/libslic3r/NonplanarSurface.cpp new file mode 100644 index 000000000..5d212e1d9 --- /dev/null +++ b/src/libslic3r/NonplanarSurface.cpp @@ -0,0 +1,240 @@ +#include "NonplanarSurface.hpp" + +namespace Slic3r { + +NonplanarSurface::NonplanarSurface(std::map &_mesh) +{ + this->mesh = _mesh; + this->calculate_stats(); +} + +bool +NonplanarSurface::operator==(const NonplanarSurface& other) const { + return (stats.min.x == other.stats.min.x && + stats.min.y == other.stats.min.y && + stats.min.z == other.stats.min.z && + stats.max.x == other.stats.max.x && + stats.max.y == other.stats.max.y && + stats.max.z == other.stats.max.z); +} + +void +NonplanarSurface::calculate_stats() +{ + //calculate min and max values + this->stats.min.x = 10000000; + this->stats.min.y = 10000000; + this->stats.min.z = 10000000; + this->stats.max.x = -10000000; + this->stats.max.y = -10000000; + this->stats.max.z = -10000000; + for(auto& facet : this->mesh) { + this->stats.min.x = std::min(this->stats.min.x, facet.second.stats.min.x); + this->stats.min.y = std::min(this->stats.min.y, facet.second.stats.min.y); + this->stats.min.z = std::min(this->stats.min.z, facet.second.stats.min.z); + this->stats.max.x = std::max(this->stats.max.x, facet.second.stats.max.x); + this->stats.max.y = std::max(this->stats.max.y, facet.second.stats.max.y); + this->stats.max.z = std::max(this->stats.max.z, facet.second.stats.max.z); + } +} + +void +NonplanarSurface::translate(float x, float y, float z) +{ + //translate all facets + for(auto& facet : this->mesh) { + facet.second.translate(x, y, z); + } + + //translate min and max values + this->stats.min.x += x; + this->stats.min.y += y; + this->stats.min.z += z; + this->stats.max.x += x; + this->stats.max.y += y; + this->stats.max.z += z; +} + +void +NonplanarSurface::scale(float factor) +{ + float versor[3]; + versor[0] = factor; + versor[1] = factor; + versor[2] = factor; + this->scale(versor); +} + +void +NonplanarSurface::scale(float versor[3]) +{ + //scale all facets + for(auto& facet : this->mesh) { + facet.second.scale(versor); + } + + //scale min and max values + this->stats.min.x *= versor[0]; + this->stats.min.y *= versor[1]; + this->stats.min.z *= versor[2]; + this->stats.max.x *= versor[0]; + this->stats.max.y *= versor[1]; + this->stats.max.z *= versor[2]; +} + +void +NonplanarSurface::rotate_z(float angle) { + double radian_angle = (angle / 180.0) * 3.1415927; + double c = cos(radian_angle); + double s = sin(radian_angle); + + for(auto& facet : this->mesh) { + for(int j = 0; j < 3; j++) { + double xold = facet.second.vertex[j].x; + double yold = facet.second.vertex[j].y; + facet.second.vertex[j].x = c * xold - s * yold; + facet.second.vertex[j].y = s * xold + c * yold; + } + facet.second.calculate_stats(); + } + + this->calculate_stats(); +} + +void +NonplanarSurface::debug_output() +{ + std::cout << "Facets(" << this->mesh.size() << "): (min:X:" << this->stats.min.x << " Y:" << this->stats.min.y << " Z:" << this->stats.min.z << + " max:X:" << this->stats.max.x << " Y:" << this->stats.max.y << " Z:" << this->stats.max.z << ")" << + "Height " << this->stats.max.z - this->stats.min.z << std::endl; + for(auto& facet : this->mesh) { + std::cout << "triangle: (" << facet.first << ")(" << facet.second.marked << ") "; + std::cout << " (" << (180*std::acos(facet.second.normal.z))/3.14159265 << "°)"; + + std::cout << " | V0:"; + std::cout << " X:"<< facet.second.vertex[0].x; + std::cout << " Y:"<< facet.second.vertex[0].y; + std::cout << " Z:"<< facet.second.vertex[0].z; + + std::cout << " | V1:"; + std::cout << " X:"<< facet.second.vertex[1].x; + std::cout << " Y:"<< facet.second.vertex[1].y; + std::cout << " Z:"<< facet.second.vertex[1].z; + + std::cout << " | V2:"; + std::cout << " X:"<< facet.second.vertex[2].x; + std::cout << " Y:"<< facet.second.vertex[2].y; + std::cout << " Z:"<< facet.second.vertex[2].z; + + std::cout << " | Normal:"; + std::cout << " X:"<< facet.second.normal.x; + std::cout << " Y:"<< facet.second.normal.y; + std::cout << " Z:"<< facet.second.normal.z; + + //TODO check if neighbors exist + // stl_neighbors* neighbors = mesh.stl.neighbors_start + facet.first; + std::cout << " | Neighbors:"; + std::cout << " 0:"<< facet.second.neighbor[0]; + std::cout << " 1:"<< facet.second.neighbor[1]; + std::cout << " 2:"<< facet.second.neighbor[2]; + std::cout << std::endl; + } +} + +NonplanarSurfaces +NonplanarSurface::group_surfaces() +{ + std::pair begin = *this->mesh.begin(); + this->mark_neighbor_surfaces(begin.first); + NonplanarSurface newSurface; + for (std::map::iterator it=this->mesh.begin(); it!=this->mesh.end();) { + if((*it).second.marked == false) { + newSurface.mesh[(*it).first] = (*it).second; + it = this->mesh.erase(it); + } + else { + ++it; + } + } + this->calculate_stats(); + if (newSurface.mesh.size() == 0) { + //return only this + NonplanarSurfaces nonplanar_surfaces; + nonplanar_surfaces.push_back(*this); + return nonplanar_surfaces; + } + else { + //return union of this and recursion + NonplanarSurfaces nonplanar_surfaces = newSurface.group_surfaces(); + nonplanar_surfaces.push_back(*this); + return nonplanar_surfaces; + } +} + +void +NonplanarSurface::mark_neighbor_surfaces(int id) +{ + //if already marked return + if(this->mesh.find(id) == this->mesh.end() || this->mesh[id].marked == true) return; + //mark this facet + this->mesh[id].marked = true; + //mark all neighbors + for(int j = 0; j < 3; j++) { + this->mark_neighbor_surfaces(this->mesh[id].neighbor[j]); + } +} + +bool +NonplanarSurface::check_max_printing_height(float height) +{ + if ((this->stats.max.z - this->stats.min.z) > height ) { + std::cout << "Surface removed: printheight too heigh (" << (this->stats.max.z - this->stats.min.z) << " mm)" << '\n'; + return true; + } else { + return false; + } +} + +bool +NonplanarSurface::check_surface_area() +{ + //calculate surface area of nonplanar surface. + float area = 0.0f; + for(auto& facet : this->mesh) { + area += facet.second.calculate_surface_area(); + } + if (area < 20.0f) { + std::cout << "Surface removed: area too small (" << area << " mm²)" << '\n'; + return true; + } else { + return false; + } +} + +void +NonplanarSurface::check_printable_surfaces(float max_angle) +{ + //TODO do something +} + +/* this will return scaled ExPolygons */ +ExPolygons +NonplanarSurface::horizontal_projection() const +{ + Polygons pp; + pp.reserve(this->mesh.size()); + for(auto& facet : this->mesh) { + Polygon p; + p.points.resize(3); + p.points[0] = Point(scale_(facet.second.vertex[0].x), scale_(facet.second.vertex[0].y)); + p.points[1] = Point(scale_(facet.second.vertex[1].x), scale_(facet.second.vertex[1].y)); + p.points[2] = Point(scale_(facet.second.vertex[2].x), scale_(facet.second.vertex[2].y)); + p.make_counter_clockwise(); // do this after scaling, as winding order might change while doing that + pp.push_back(p); + } + + // the offset factor was tuned using groovemount.stl + return union_ex(offset(pp, scale_(0.01))); +} + +} \ No newline at end of file diff --git a/src/libslic3r/NonplanarSurface.hpp b/src/libslic3r/NonplanarSurface.hpp new file mode 100644 index 000000000..fd832fbc8 --- /dev/null +++ b/src/libslic3r/NonplanarSurface.hpp @@ -0,0 +1,54 @@ +#ifndef slic3r_NonplanarSurface_hpp_ +#define slic3r_NonplanarSurface_hpp_ + +#include "libslic3r.h" +#include "NonplanarFacet.hpp" +#include "Point.hpp" +#include "Polygon.hpp" +#include "ExPolygon.hpp" +#include "Geometry.hpp" +#include "ClipperUtils.hpp" + +namespace Slic3r { + +typedef struct { + float x; + float y; + float z; +} mesh_vertex; + +typedef struct { + mesh_vertex max; + mesh_vertex min; +} mesh_stats; + +class NonplanarSurface; + +typedef std::vector NonplanarSurfaces; + +class NonplanarSurface +{ + public: + std::map mesh; + mesh_stats stats; + NonplanarSurface() {}; + ~NonplanarSurface() {}; + NonplanarSurface(std::map &_mesh); + bool operator==(const NonplanarSurface& other) const; + void calculate_stats(); + void translate(float x, float y, float z); + void scale(float factor); + void scale(float versor[3]); + void rotate_z(float angle); + void debug_output(); + NonplanarSurfaces group_surfaces(); + void mark_neighbor_surfaces(int id); + bool check_max_printing_height(float height); + void check_printable_surfaces(float max_angle); + bool check_surface_area(); + ExPolygons horizontal_projection() const; + +}; +}; + +#endif \ No newline at end of file diff --git a/src/libslic3r/Point.hpp b/src/libslic3r/Point.hpp index c4b821ca6..d15428373 100644 --- a/src/libslic3r/Point.hpp +++ b/src/libslic3r/Point.hpp @@ -159,11 +159,14 @@ class Point : public Vec2crd public: using coord_type = coord_t; + coord_t nonplanar_z { -1 }; + Point() : Vec2crd(0, 0) {} Point(int32_t x, int32_t y) : Vec2crd(coord_t(x), coord_t(y)) {} Point(int64_t x, int64_t y) : Vec2crd(coord_t(x), coord_t(y)) {} Point(double x, double y) : Vec2crd(coord_t(std::round(x)), coord_t(std::round(y))) {} Point(const Point &rhs) { *this = rhs; } + Point(Vec3crd &p) : Vec2crd(p.x(), p.y()) {} explicit Point(const Vec2d& rhs) : Vec2crd(coord_t(std::round(rhs.x())), coord_t(std::round(rhs.y()))) {} // This constructor allows you to construct Point from Eigen expressions template diff --git a/src/libslic3r/Polygon.cpp b/src/libslic3r/Polygon.cpp index 88ac1b03f..5ba07e711 100644 --- a/src/libslic3r/Polygon.cpp +++ b/src/libslic3r/Polygon.cpp @@ -402,7 +402,7 @@ bool has_duplicate_points(const Polygons &polys) { #if 1 // Check globally. -#if 0 +#if 1 // Detect duplicates by sorting with quicksort. It is quite fast, but ankerl::unordered_dense is around 1/4 faster. Points allpts; allpts.reserve(count_points(polys)); diff --git a/src/libslic3r/Polyline.cpp b/src/libslic3r/Polyline.cpp index 5261a8cfc..ec7732ccf 100644 --- a/src/libslic3r/Polyline.cpp +++ b/src/libslic3r/Polyline.cpp @@ -4,6 +4,7 @@ #include "ExPolygon.hpp" #include "Line.hpp" #include "Polygon.hpp" +#include "SVG.hpp" #include #include @@ -332,4 +333,29 @@ Lines3 Polyline3::lines() const return lines; } +bool export_to_svg(const char *path, const Polyline &polyline, BoundingBox bbox, const float stroke_width) +{ + SVG svg(path, bbox); + svg.draw(polyline, "black", stroke_width); + svg.Close(); + return true; +} + +bool export_to_svg(const char *path, const Polylines &polylines, BoundingBox bbox, const float stroke_width) +{ + SVG svg(path, bbox); + svg.draw(polylines, "black", stroke_width); + svg.Close(); + return true; +} + +bool export_to_svg(const char *path, const ThickPolylines &polylines, BoundingBox bbox, const float stroke_width) +{ + SVG svg(path, bbox); + svg.draw(polylines, "black", stroke_width); + svg.Close(); + return true; +} + + } diff --git a/src/libslic3r/Polyline.hpp b/src/libslic3r/Polyline.hpp index 703e50cfa..adee699d2 100644 --- a/src/libslic3r/Polyline.hpp +++ b/src/libslic3r/Polyline.hpp @@ -234,6 +234,10 @@ public: typedef std::vector Polylines3; +extern bool export_to_svg(const char *path, const Polyline &polyline, BoundingBox bbox, const float stroke_width = 1.f); +extern bool export_to_svg(const char *path, const Polylines &polylines, BoundingBox bbox, const float stroke_width = 1.f); +extern bool export_to_svg(const char *path, const ThickPolylines &polylines, BoundingBox bbox, const float stroke_width = 1.f); + } #endif diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index f42b3f770..67e6c43c1 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -432,6 +432,7 @@ static std::vector s_Preset_print_options { "ironing", "ironing_type", "ironing_flowrate", "ironing_speed", "ironing_spacing", "max_print_speed", "max_volumetric_speed", "avoid_crossing_perimeters_max_detour", "fuzzy_skin", "fuzzy_skin_thickness", "fuzzy_skin_point_dist", + "use_nonplanar_layers", "nonplanar_layers_angle", "nonplanar_layers_height", "max_volumetric_extrusion_rate_slope_positive", "max_volumetric_extrusion_rate_slope_negative", "perimeter_speed", "small_perimeter_speed", "external_perimeter_speed", "infill_speed", "solid_infill_speed", "enable_dynamic_overhang_speeds", "overhang_speed_0", "overhang_speed_1", "overhang_speed_2", "overhang_speed_3", diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 059491951..70df5e55a 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -17,6 +17,8 @@ #include "GCode/ThumbnailData.hpp" #include "GCode/GCodeProcessor.hpp" #include "MultiMaterialSegmentation.hpp" +#include "NonplanarSurface.hpp" +#include "NonplanarFacet.hpp" #include "libslic3r.h" @@ -67,7 +69,9 @@ enum PrintStep : unsigned int { enum PrintObjectStep : unsigned int { posSlice, posPerimeters, posPrepareInfill, - posInfill, posIroning, posSupportSpotsSearch, posSupportMaterial, posEstimateCurledExtrusions, posCount, + posInfill, posIroning, posSupportSpotsSearch, + posSupportMaterial, posNonplanarProjection, posEstimateCurledExtrusions, + posCount, }; // A PrintRegion object represents a group of volumes to print @@ -264,6 +268,8 @@ public: coord_t height() const { return m_size.z(); } // Centering offset of the sliced mesh from the scaled and rotated mesh of the model. const Point& center_offset() const { return m_center_offset; } + // + NonplanarSurfaces nonplanar_surfaces() { return m_nonplanar_surfaces; } bool has_brim() const { return this->config().brim_type != btNoBrim @@ -378,8 +384,16 @@ private: void estimate_curled_extrusions(); void slice_volumes(); + void make_slices(); + void lslices_were_updated(); // Has any support (not counting the raft). void detect_surfaces_type(); + void merge_nonplanar_surfaces(); + void debug_svg_print(); + bool check_nonplanar_collisions(NonplanarSurface &surface); + void project_nonplanar_surfaces(); + void find_nonplanar_surfaces(); + void detect_nonplanar_surfaces(); void process_external_surfaces(); void discover_vertical_shells(); void bridge_over_infill(); @@ -414,6 +428,8 @@ private: // so that next call to make_perimeters() performs a union() before computing loops bool m_typed_slices = false; + NonplanarSurfaces m_nonplanar_surfaces; + std::pair m_adaptive_fill_octrees; FillLightning::GeneratorPtr m_lightning_generator; }; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 3da804066..ce53e5bed 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1369,6 +1369,33 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloat(0.8)); + + def = this->add("use_nonplanar_layers", coBool); + def->label = L("Use nonplanar layers"); + def->category = L("Nonplanar layers"); + def->tooltip = L("Generate nonplanar layers on top of the object"); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(false)); + + def = this->add("nonplanar_layers_angle", coFloat); + def->label = L("Maximum nonplanar angle"); + def->category = L("Nonplanar layers"); + def->tooltip = L("The maximum angle the printer can print without collisions."); + def->sidetext = L("°"); + def->min = 0; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(10.0)); + + def = this->add("nonplanar_layers_height", coFloat); + def->label = L("Maximum nonplanar height"); + def->category = L("Nonplanar layers"); + def->tooltip = L("The maximum height the printer can print without collisions."); + def->sidetext = L("mm"); + def->min = 0; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(10.0)); + + def = this->add("gap_fill_enabled", coBool); def->label = L("Fill gaps"); def->category = L("Layers and Perimeters"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 54a835fe7..ff88997c4 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -562,6 +562,10 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionBool, thick_bridges)) ((ConfigOptionFloat, xy_size_compensation)) ((ConfigOptionBool, wipe_into_objects)) + + ((ConfigOptionBool, use_nonplanar_layers)) + ((ConfigOptionFloat, nonplanar_layers_angle)) + ((ConfigOptionFloat, nonplanar_layers_height)) ) PRINT_CONFIG_CLASS_DEFINE( diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index ff7906da0..1877c34e4 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -33,6 +33,7 @@ #include "TriangleSelectorWrapper.hpp" #include "format.hpp" #include "libslic3r.h" +#include "SVG.hpp" #include #include @@ -53,6 +54,7 @@ #include #include +#include #include #include @@ -178,6 +180,8 @@ void PrintObject::make_perimeters() } m_typed_slices = false; } + + this->detect_nonplanar_surfaces(); // compare each layer to the one below, and mark those slices needing // one additional inner perimeter, like the top of domed objects- @@ -275,16 +279,17 @@ void PrintObject::prepare_infill() m_print->set_status(30, _u8L("Preparing infill")); - if (m_typed_slices) { - // To improve robustness of detect_surfaces_type() when reslicing (working with typed slices), see GH issue #7442. - // The preceding step (perimeter generator) only modifies extra_perimeters and the extra perimeters are only used by discover_vertical_shells() - // with more than a single region. If this step does not use Surface::extra_perimeters or Surface::extra_perimeters is always zero, it is safe - // to reset to the untyped slices before re-runnning detect_surfaces_type(). - for (Layer* layer : m_layers) { - layer->restore_untyped_slices_no_extra_perimeters(); - m_print->throw_if_canceled(); - } - } + // if (m_typed_slices) { + // // To improve robustness of detect_surfaces_type() when reslicing (working with typed slices), see GH issue #7442. + // // The preceding step (perimeter generator) only modifies extra_perimeters and the extra perimeters are only used by discover_vertical_shells() + // // with more than a single region. If this step does not use Surface::extra_perimeters or Surface::extra_perimeters is always zero, it is safe + // // to reset to the untyped slices before re-runnning detect_surfaces_type(). + // for (Layer* layer : m_layers) { + // layer->restore_untyped_slices_no_extra_perimeters(); + // m_print->throw_if_canceled(); + // } + // this->detect_nonplanar_surfaces(); + // } // This will assign a type (top/bottom/internal) to $layerm->slices. // Then the classifcation of $layerm->slices is transfered onto @@ -434,6 +439,9 @@ void PrintObject::infill() } } ); + + this->project_nonplanar_surfaces(); + m_print->throw_if_canceled(); BOOST_LOG_TRIVIAL(debug) << "Filling layers in parallel - end"; /* we could free memory now, but this would make this step not idempotent @@ -792,6 +800,13 @@ bool PrintObject::invalidate_state_by_config_options( steps.emplace_back(posInfill); steps.emplace_back(posSupportMaterial); } + } else if ( + opt_key == "use_nonplanar_layers" + || opt_key == "nonplanar_layers_angle" + || opt_key == "nonplanar_layers_height") { + // steps.emplace_back(posPerimeters); + // steps.emplace_back(posInfill); + steps.emplace_back(posSlice); } else if ( opt_key == "perimeter_generator" || opt_key == "wall_transition_length" @@ -899,6 +914,8 @@ void PrintObject::cleanup() // stBottomBridge - Part of a region, which is not fully supported, but it hangs in the air, or it hangs losely on a support or a raft. // stBottom - Part of a region, which is not supported by the same region, but it is supported either by another region, or by a soluble interface layer. // stInternal - Part of a region, which is supported by the same region type. +// stTopNonplanar - +// stInternalSolidNonplanar - // If a part of a region is of stBottom and stTop, the stBottom wins. void PrintObject::detect_surfaces_type() { @@ -952,6 +969,22 @@ void PrintObject::detect_surfaces_type() // collapse very narrow parts (using the safety offset in the diff is not enough) float offset = layerm->flow(frExternalPerimeter).scaled_width() / 10.f; + //Find mark nonplanar surfaces + Surfaces nonplanar_surfaces; + for(auto& surface : layerm->nonplanar_surfaces()) { + surfaces_append( + nonplanar_surfaces, + intersection_ex(surface.horizontal_projection(), union_ex(layerm->slices().surfaces)), + (surface.stats.max.z <= layer->slice_z + layer->height ? stTopNonplanar : stInternalSolidNonplanar) + ); + BOOST_LOG_TRIVIAL(trace) << "Detecting solid surfaces - layer " << (idx_layer+1) << "/" << m_layers.size() << " is " << + (surface.stats.max.z <= layer->slice_z + layer->height ? "top nonplanar" : "internal nonplanar") << + ", surface max z=" << surface.stats.max.z << ", slice_z=" << layer->slice_z << ", layer height=" << layer->height; + } + + //remove non planar surfaces form all surfaces to get planar surfaces + ExPolygons planar_surfaces = diff_ex(layerm->slices().surfaces, nonplanar_surfaces, ApplySafetyOffset::Yes); + // find top surfaces (difference between current surfaces // of current layer and upper one) Surfaces top; @@ -959,13 +992,11 @@ void PrintObject::detect_surfaces_type() ExPolygons upper_slices = interface_shells ? diff_ex(layerm->slices().surfaces, upper_layer->m_regions[region_id]->slices().surfaces, ApplySafetyOffset::Yes) : diff_ex(layerm->slices().surfaces, upper_layer->lslices, ApplySafetyOffset::Yes); - surfaces_append(top, opening_ex(upper_slices, offset), stTop); + surfaces_append(top, diff_ex(opening_ex(upper_slices, offset), nonplanar_surfaces, ApplySafetyOffset::Yes), stTop); } else { // if no upper layer, all surfaces of this one are solid // we clone surfaces because we're going to clear the slices collection - top = layerm->slices().surfaces; - for (Surface &surface : top) - surface.surface_type = stTop; + surfaces_append(top, union_ex(planar_surfaces), stTop); } // Find bottom surfaces (difference between current surfaces of current layer and lower one). @@ -984,7 +1015,11 @@ void PrintObject::detect_surfaces_type() surfaces_append( bottom, opening_ex( - diff_ex(layerm->slices().surfaces, lower_layer->lslices, ApplySafetyOffset::Yes), + diff_ex( + diff_ex(layerm->slices().surfaces, lower_layer->lslices, ApplySafetyOffset::Yes), + nonplanar_surfaces, + ApplySafetyOffset::Yes + ), offset), surface_type_bottom_other); // if user requested internal shells, we need to identify surfaces @@ -996,8 +1031,11 @@ void PrintObject::detect_surfaces_type() bottom, opening_ex( diff_ex( - intersection(layerm->slices().surfaces, lower_layer->lslices), // supported - lower_layer->m_regions[region_id]->slices().surfaces, + diff_ex( + intersection(layerm->slices().surfaces, lower_layer->lslices), // supported + lower_layer->m_regions[region_id]->slices().surfaces, + ApplySafetyOffset::Yes), + nonplanar_surfaces, ApplySafetyOffset::Yes), offset), stBottom); @@ -1029,6 +1067,7 @@ void PrintObject::detect_surfaces_type() std::vector> expolygons_with_attributes; expolygons_with_attributes.emplace_back(std::make_pair(union_ex(top), SVG::ExPolygonAttributes("green"))); expolygons_with_attributes.emplace_back(std::make_pair(union_ex(bottom), SVG::ExPolygonAttributes("brown"))); + expolygons_with_attributes.emplace_back(std::make_pair(union_ex(nonplanar_surfaces), SVG::ExPolygonAttributes("red"))); expolygons_with_attributes.emplace_back(std::make_pair(to_expolygons(layerm->slices().surfaces), SVG::ExPolygonAttributes("black"))); SVG::export_expolygons(debug_out_path("1_detect_surfaces_type_%d_region%d-layer_%f.svg", iRun ++, region_id, layer->print_z).c_str(), expolygons_with_attributes); } @@ -1045,13 +1084,15 @@ void PrintObject::detect_surfaces_type() // find internal surfaces (difference between top/bottom surfaces and others) { - Polygons topbottom = to_polygons(top); - polygons_append(topbottom, to_polygons(bottom)); - surfaces_append(surfaces_out, diff_ex(surfaces_prev, topbottom), stInternal); + Polygons solid_surfaces = to_polygons(top); + polygons_append(solid_surfaces, to_polygons(bottom)); + polygons_append(solid_surfaces, to_polygons(nonplanar_surfaces)); + surfaces_append(surfaces_out, diff_ex(surfaces_prev, solid_surfaces), stInternal); } surfaces_append(surfaces_out, std::move(top)); surfaces_append(surfaces_out, std::move(bottom)); + surfaces_append(surfaces_out, std::move(nonplanar_surfaces)); // Slic3r::debugf " layer %d has %d bottom, %d top and %d internal surfaces\n", // $layerm->layer->id, scalar(@bottom), scalar(@top), scalar(@internal) if $Slic3r::debug; @@ -1101,6 +1142,240 @@ void PrintObject::detect_surfaces_type() m_typed_slices = true; } +bool +PrintObject::check_nonplanar_collisions(NonplanarSurface &surface) +{ + for (size_t region_id = 0; region_id < this->num_printing_regions(); ++ region_id) { + Polygons collider; + Polygons nonplanar_polygon = to_polygons(surface.horizontal_projection()); + //check each layer + for (size_t idx_layer = 0; idx_layer < m_layers.size(); ++ idx_layer) { + m_print->throw_if_canceled(); + // BOOST_LOG_TRIVIAL(trace) << "Check nonplanar collisions for region " << region_id << " and layer " << layer->print_z; + Layer *layer = m_layers[idx_layer]; + LayerRegion *layerm = layer->m_regions[region_id]; + + //skip if below minimum nonplanar surface + if (surface.stats.min.z-layer->height > layer->slice_z) continue; + //break if above nonplanar surface + if (surface.stats.max.z < layer->slice_z) break; + + float angle_rad = m_config.nonplanar_layers_angle.value * 3.14159265/180.0; + float angle_offset = scale_(layer->height*std::sin(1.57079633-angle_rad)/std::sin(angle_rad)); + + //debug + // SVG svg("svg/collider" + std::to_string(layer->id()) + ".svg"); + // svg.draw(layerm_slices_surfaces, "blue"); + // svg.draw(union_ex(diff(collider,nonplanar_polygon)), "red", 0.7f); + // svg.draw_outline(collider); + // svg.arrows = false; + // svg.Close(); + + //check if current surface collides with previous collider + ExPolygons collisions = union_ex(intersection(layerm->slices().surfaces, diff(collider, nonplanar_polygon))); + + if (!collisions.empty()){ + double area = 0; + for (auto& c : collisions){ + area += c.area(); + } + + //collsion found abort when area > 1.0 mm² + if (1.0 < unscale(unscale(area))) { + std::cout << "Surface removed: collision on layer " << layer->print_z << "mm (" << unscale(unscale(area)) << " mm²)" << '\n'; + return true; + } + } + + if (layer->upper_layer != NULL) { + Layer* upper_layer = layer->upper_layer; + LayerRegion *upper_layerm = upper_layer->m_regions[region_id]; + //merge the ofsetted surface to the collider + collider= offset( + union_( + intersection( + diff_ex(layerm->slices().surfaces, upper_layerm->slices().surfaces, ApplySafetyOffset::No), + nonplanar_polygon, + ApplySafetyOffset::No), + collider), + angle_offset); + } + } + } + + return false; +} + +void +PrintObject::detect_nonplanar_surfaces() +{ + //skip if not active + if(!m_config.use_nonplanar_layers.value) return; + + bool moved_surfaces = false; + + for (size_t region_id = 0; region_id < this->num_printing_regions(); ++ region_id) { + m_print->throw_if_canceled(); + BOOST_LOG_TRIVIAL(trace) << "detect_nonplanar_surfaces for region " << region_id; + const PrintRegion ®ion = this->printing_region(region_id); + + //repeat detection for every nonplanar_surface + for (auto& nonplanar_surface: this->nonplanar_surfaces()) { + float distance_to_top = 0.0f; + for (int shell_thickness = 0; region.config().top_solid_layers > shell_thickness; ++shell_thickness){ + //search home layer where the area is projected to + for (LayerPtrs::reverse_iterator home_layer_it = this->m_layers.rbegin(); home_layer_it != this->m_layers.rend(); ++home_layer_it){ + Layer* home_layer = *home_layer_it; + LayerRegion &home_layerm = *home_layer->m_regions[region_id]; + //continue if home layer is not maximum height of nonplanar_surface - the desired distance to the top of the surface for more than one top solid layer + if (home_layer->slice_z > nonplanar_surface.stats.max.z - distance_to_top) continue; + + //process layers + for (LayerPtrs::iterator layer_it = this->m_layers.begin(); layer_it != this->m_layers.end(); ++layer_it){ + Layer* layer = *layer_it; + LayerRegion &layerm = *layer->m_regions[region_id]; + + //skip if below minimum nonplanar surface and below the last possible surface layer + if (nonplanar_surface.stats.min.z-layer->height-distance_to_top > layer->slice_z) continue; + //break if above home layer + if (home_layer->slice_z < layer->slice_z) break; + //skip if bottom layer because we dont want to project the bottom layers up + if (layer->lower_layer == NULL) continue; + + BOOST_LOG_TRIVIAL(trace) << "detect_nonplanar_surfaces for region " << region_id << " and layer " << layer->print_z; + + Surfaces layerm_slices_surfaces = layerm.slices().surfaces; + SurfaceCollection topNonplanar; + if (layer->upper_layer != NULL) { + //append layers where nothing is above + Layer* upper_layer = layer->upper_layer; + LayerRegion &upper_layerm = *upper_layer->m_regions[region_id]; + Surfaces upper_surfaces = upper_layerm.slices().surfaces; + topNonplanar.append( + intersection_ex( + nonplanar_surface.horizontal_projection(), + union_ex( + diff_ex( + layerm_slices_surfaces, + upper_surfaces, + ApplySafetyOffset::No)), + ApplySafetyOffset::No), + (shell_thickness == 0 ? stTopNonplanar : stInternalSolidNonplanar), + distance_to_top + ); + + // append layers where nonplanar areas with a lower distance_to_top are above + SurfaceCollection upper_nonplanar; + for (auto& s : upper_surfaces){ + if (s.is_nonplanar() && s.distance_to_top < distance_to_top) { + upper_nonplanar.surfaces.push_back(s); + } + } + if (upper_nonplanar.size() > 0) + topNonplanar.append( + intersection_ex( + nonplanar_surface.horizontal_projection(), + to_expolygons(upper_nonplanar.surfaces), + ApplySafetyOffset::No), + (shell_thickness == 0 ? stTopNonplanar : stInternalSolidNonplanar), + distance_to_top + ); + } + else { + topNonplanar.append( + intersection_ex( + nonplanar_surface.horizontal_projection(), + union_ex(to_expolygons(layerm_slices_surfaces)), + ApplySafetyOffset::No), + (shell_thickness == 0 ? stTopNonplanar : stInternalSolidNonplanar), + distance_to_top + ); + } + + if (topNonplanar.size() > 0) { + // layerm.export_region_slices_to_svg_debug("home_layer_append-layerm"); + // home_layerm.export_region_slices_to_svg_debug("home_layer_append-home_layerm"); + + BOOST_LOG_TRIVIAL(trace) << "Removing " << topNonplanar.size() << " nonplanar surfaces from layer " << layer->print_z; + + layerm.remove_nonplanar_slices(topNonplanar); + + BOOST_LOG_TRIVIAL(trace) << "Adding " << topNonplanar.size() << " nonplanar surfaces to layer " << home_layer->print_z; + + // move nonplanar surfaces to home layer + home_layerm.append_top_nonplanar_slices(topNonplanar); + + //save nonplanar_surface to home_layers nonplanar_surface list + home_layerm.append_nonplanar_surface(nonplanar_surface); + + moved_surfaces = true; + } + } + + //increase distance to the top layer + distance_to_top += home_layer->height; + break; + } + } + } + } + + if(moved_surfaces) { + // After changing a layer's slices, we must rebuild its lslices into islands + this->make_slices(); + this->lslices_were_updated(); + } + + // Debugging output. +#ifdef SLIC3R_DEBUG_SLICE_PROCESSING + for (size_t region_id = 0; region_id < this->num_printing_regions(); ++ region_id) { + for (const Layer *layer : m_layers) { + LayerRegion *layerm = layer->m_regions[region_id]; + layerm->export_region_slices_to_svg_debug("0_detect_nonplanar_surfaces"); + layerm->export_region_fill_surfaces_to_svg_debug("0_detect_nonplanar_surfaces"); + } // for each layer + } // for each region +#endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ + + //set typed_slices to true to force merge + m_typed_slices = true; +} + +void +PrintObject::project_nonplanar_surfaces() +{ + if(!m_config.use_nonplanar_layers.value) return; + + //TODO check when steps should be invalidated + if (is_step_done(posNonplanarProjection)) return; + set_started(posNonplanarProjection); + + for (size_t region_id = 0; region_id < this->num_printing_regions(); ++region_id) { + BOOST_LOG_TRIVIAL(debug) << "Processing nonplanar surfaces for region " << region_id << " in parallel - start"; + tbb::parallel_for( + tbb::blocked_range(0, m_layers.size()), + [this, region_id](const tbb::blocked_range& range) { + PRINT_OBJECT_TIME_LIMIT_MILLIS(PRINT_OBJECT_TIME_LIMIT_DEFAULT); + for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { + m_print->throw_if_canceled(); + LayerRegion *layerm = m_layers[idx_layer]->m_regions[region_id]; + + BOOST_LOG_TRIVIAL(trace) << "Processing nonplanar surfaces for region " << region_id << " and layer " << \ + idx_layer << " (z = " << layerm->layer()->print_z << ")"; + + layerm->project_nonplanar_surfaces(); +#ifdef SLIC3R_DEBUG_SLICE_PROCESSING + layerm->export_region_fill_surfaces_to_svg_debug("11_project_nonplanar_surfaces-final"); +#endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ + } // for each layer of a region + }); + } + + BOOST_LOG_TRIVIAL(debug) << "Processing nonplanar surfaces - end"; + + set_done(posNonplanarProjection); +} + void PrintObject::process_external_surfaces() { BOOST_LOG_TRIVIAL(info) << "Processing external surfaces..." << log_memory_info(); @@ -1223,6 +1498,7 @@ void PrintObject::discover_vertical_shells() [this, &cache_top_botom_regions](const tbb::blocked_range& range) { PRINT_OBJECT_TIME_LIMIT_MILLIS(PRINT_OBJECT_TIME_LIMIT_DEFAULT); const std::initializer_list surfaces_bottom { stBottom, stBottomBridge }; + const std::initializer_list surfaces_top { stTop, stTopNonplanar }; const size_t num_regions = this->num_printing_regions(); for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { m_print->throw_if_canceled(); @@ -1239,7 +1515,7 @@ void PrintObject::discover_vertical_shells() LayerRegion &layerm = *layer.m_regions[region_id]; float top_bottom_expansion = float(layerm.flow(frSolidInfill).scaled_spacing()) * top_bottom_expansion_coeff; // Top surfaces. - append(cache.top_surfaces, offset(layerm.slices().filter_by_type(stTop), top_bottom_expansion)); + append(cache.top_surfaces, offset(layerm.slices().filter_by_types(surfaces_top), top_bottom_expansion)); // append(cache.top_surfaces, offset(layerm.fill_surfaces().filter_by_type(stTop), top_bottom_expansion)); // Bottom surfaces. append(cache.bottom_surfaces, offset(layerm.slices().filter_by_types(surfaces_bottom), top_bottom_expansion)); @@ -1297,6 +1573,7 @@ void PrintObject::discover_vertical_shells() [this, region_id, &cache_top_botom_regions](const tbb::blocked_range& range) { PRINT_OBJECT_TIME_LIMIT_MILLIS(PRINT_OBJECT_TIME_LIMIT_DEFAULT); const std::initializer_list surfaces_bottom { stBottom, stBottomBridge }; + const std::initializer_list surfaces_top { stTop, stTopNonplanar }; for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { m_print->throw_if_canceled(); Layer &layer = *m_layers[idx_layer]; @@ -1304,7 +1581,7 @@ void PrintObject::discover_vertical_shells() float top_bottom_expansion = float(layerm.flow(frSolidInfill).scaled_spacing()) * top_bottom_expansion_coeff; // Top surfaces. auto &cache = cache_top_botom_regions[idx_layer]; - cache.top_surfaces = offset(layerm.slices().filter_by_type(stTop), top_bottom_expansion); + cache.top_surfaces = offset(layerm.slices().filter_by_types(surfaces_top), top_bottom_expansion); // append(cache.top_surfaces, offset(layerm.fill_surfaces().filter_by_type(stTop), top_bottom_expansion)); // Bottom surfaces. cache.bottom_surfaces = offset(layerm.slices().filter_by_types(surfaces_bottom), top_bottom_expansion); @@ -1485,7 +1762,7 @@ void PrintObject::discover_vertical_shells() svg.draw(shell_ex, "blue", 0.5); svg.draw_outline(shell_ex, "black", "blue", scale_(0.05)); svg.Close(); - } + } { Slic3r::SVG svg(debug_out_path("discover_vertical_shells-internalvoid-wshell-%d.svg", debug_idx), get_extents(shell)); svg.draw(layerm->fill_surfaces().filter_by_type(stInternalVoid), "yellow", 0.5); @@ -1493,7 +1770,7 @@ void PrintObject::discover_vertical_shells() svg.draw(shell_ex, "blue", 0.5); svg.draw_outline(shell_ex, "black", "blue", scale_(0.05)); svg.Close(); - } + } { Slic3r::SVG svg(debug_out_path("discover_vertical_shells-internalsolid-wshell-%d.svg", debug_idx), get_extents(shell)); svg.draw(layerm->fill_surfaces().filter_by_type(stInternalSolid), "yellow", 0.5); @@ -1501,18 +1778,32 @@ void PrintObject::discover_vertical_shells() svg.draw(shell_ex, "blue", 0.5); svg.draw_outline(shell_ex, "black", "blue", scale_(0.05)); svg.Close(); - } + } + { + Slic3r::SVG svg(debug_out_path("discover_vertical_shells-internalsolidnonplanar-wshell-%d.svg", debug_idx), get_extents(shell)); + svg.draw(layerm->fill_surfaces().filter_by_type(stInternalSolidNonplanar), "yellow", 0.5); + svg.draw_outline(layerm->fill_surfaces().filter_by_type(stInternalSolidNonplanar), "black", "blue", scale_(0.05)); + svg.draw(shell_ex, "blue", 0.5); + svg.draw_outline(shell_ex, "black", "blue", scale_(0.05)); + svg.Close(); + } + { + Slic3r::SVG svg(debug_out_path("discover_vertical_shells-holes-wshell-%d.svg", debug_idx), get_extents(shell)); + svg.draw_outline(to_expolygons(holes), "black", "blue", scale_(0.05)); + svg.Close(); + } #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ // Trim the shells region by the internal & internal void surfaces. - const Polygons polygonsInternal = to_polygons(layerm->fill_surfaces().filter_by_types({ stInternal, stInternalVoid, stInternalSolid })); + const Polygons polygonsInternal = to_polygons(layerm->fill_surfaces().filter_by_types({ stInternal, stInternalVoid, stInternalSolid, stInternalSolidNonplanar })); + const Polygons polygonsInternalNonplanar = to_polygons(layerm->fill_surfaces().filter_by_type(stInternalSolidNonplanar)); shell = intersection(shell, polygonsInternal, ApplySafetyOffset::Yes); polygons_append(shell, diff(polygonsInternal, holes)); if (shell.empty()) continue; // Append the internal solids, so they will be merged with the new ones. - polygons_append(shell, to_polygons(layerm->fill_surfaces().filter_by_type(stInternalSolid))); + polygons_append(shell, to_polygons(layerm->fill_surfaces().filter_by_types({ stInternalSolid, stInternalSolidNonplanar }))); // These regions will be filled by a rectilinear full infill. Currently this type of infill // only fills regions, which fit at least a single line. To avoid gaps in the sparse infill, @@ -1560,7 +1851,8 @@ void PrintObject::discover_vertical_shells() if (regularized_shell.empty()) continue; - ExPolygons new_internal_solid = intersection_ex(polygonsInternal, regularized_shell); + ExPolygons new_internal_solid = intersection_ex(diff_ex(polygonsInternal, polygonsInternalNonplanar), regularized_shell); + ExPolygons new_internal_solid_nonplanar = intersection_ex(polygonsInternalNonplanar, regularized_shell); #ifdef SLIC3R_DEBUG_SLICE_PROCESSING { Slic3r::SVG svg(debug_out_path("discover_vertical_shells-regularized-%d.svg", debug_idx), get_extents(shell_before)); @@ -1583,14 +1875,16 @@ void PrintObject::discover_vertical_shells() SVG::export_expolygons(debug_out_path("discover_vertical_shells-new_internal-%d.svg", debug_idx), get_extents(shell), new_internal, "black", "blue", scale_(0.05)); SVG::export_expolygons(debug_out_path("discover_vertical_shells-new_internal_void-%d.svg", debug_idx), get_extents(shell), new_internal_void, "black", "blue", scale_(0.05)); SVG::export_expolygons(debug_out_path("discover_vertical_shells-new_internal_solid-%d.svg", debug_idx), get_extents(shell), new_internal_solid, "black", "blue", scale_(0.05)); + SVG::export_expolygons(debug_out_path("discover_vertical_shells-new_internal_solid_nonplanar-%d.svg", debug_idx), get_extents(shell), new_internal_solid_nonplanar, "black", "blue", scale_(0.05)); } #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ // Assign resulting internal surfaces to layer. - layerm->m_fill_surfaces.keep_types({ stTop, stBottom, stBottomBridge }); + layerm->m_fill_surfaces.keep_types({ stTop, stTopNonplanar, stBottom, stBottomBridge }); layerm->m_fill_surfaces.append(new_internal, stInternal); layerm->m_fill_surfaces.append(new_internal_void, stInternalVoid); layerm->m_fill_surfaces.append(new_internal_solid, stInternalSolid); + layerm->m_fill_surfaces.append(new_internal_solid_nonplanar, stInternalSolidNonplanar); } // for each layer }); m_print->throw_if_canceled(); @@ -1688,7 +1982,7 @@ void PrintObject::bridge_over_infill() unsupported_area = diff(unsupported_area, lower_layer_solids); for (const LayerRegion *region : layer->regions()) { - SurfacesPtr region_internal_solids = region->fill_surfaces().filter_by_type(stInternalSolid); + SurfacesPtr region_internal_solids = region->fill_surfaces().filter_by_types({stInternalSolid, stInternalSolidNonplanar}); for (const Surface *s : region_internal_solids) { Polygons unsupported = intersection(to_polygons(s->expolygon), unsupported_area); // The following flag marks those surfaces, which overlap with unuspported area, but at least part of them is supported. diff --git a/src/libslic3r/PrintObjectSlice.cpp b/src/libslic3r/PrintObjectSlice.cpp index 6f6080cb8..74ddef783 100644 --- a/src/libslic3r/PrintObjectSlice.cpp +++ b/src/libslic3r/PrintObjectSlice.cpp @@ -5,6 +5,7 @@ #include "MultiMaterialSegmentation.hpp" #include "Print.hpp" #include "ShortestPath.hpp" +#include "AABBMesh.hpp" #include @@ -518,6 +519,14 @@ void PrintObject::slice() if (! warning.empty()) BOOST_LOG_TRIVIAL(info) << warning; #endif + this->lslices_were_updated(); + if (m_layers.empty()) + throw Slic3r::SlicingError("No layers were detected. You might want to repair your STL file(s) or check their size or thickness and retry.\n"); + this->set_done(posSlice); +} + +void PrintObject::lslices_were_updated() +{ // Update bounding boxes, back up raw slices of complex models. tbb::parallel_for( tbb::blocked_range(0, m_layers.size()), @@ -541,9 +550,6 @@ void PrintObject::slice() Layer::build_up_down_graph(*m_layers[layer_idx - 1], *m_layers[layer_idx]); } }); - if (m_layers.empty()) - throw Slic3r::SlicingError("No layers were detected. You might want to repair your STL file(s) or check their size or thickness and retry.\n"); - this->set_done(posSlice); } template @@ -708,7 +714,7 @@ void PrintObject::slice_volumes() m_layers[layer_id]->regions()[region_id]->m_slices.append(std::move(by_layer[layer_id]), stInternal); } region_slices.clear(); - + BOOST_LOG_TRIVIAL(debug) << "Slicing volumes - removing top empty layers"; while (! m_layers.empty()) { const Layer *layer = m_layers.back(); @@ -740,7 +746,16 @@ void PrintObject::slice_volumes() apply_mm_segmentation(*this, [print]() { print->throw_if_canceled(); }); } + this->find_nonplanar_surfaces(); + this->make_slices(); + + BOOST_LOG_TRIVIAL(debug) << "Slicing volumes - end"; +} + +void PrintObject::make_slices() +{ + const Print *print = this->print(); BOOST_LOG_TRIVIAL(debug) << "Slicing volumes - make_slices in parallel - begin"; { // Compensation value, scaled. Only applying the negative scaling here, as the positive scaling has already been applied during slicing. @@ -802,6 +817,7 @@ void PrintObject::slice_volumes() layer->m_regions[region_id]->trim_surfaces(trimming); } } + // Merge all regions' slices to get islands sorted topologically, chain them by a shortest path in separate index list layer->make_slices(); } @@ -822,6 +838,106 @@ void PrintObject::slice_volumes() BOOST_LOG_TRIVIAL(debug) << "Slicing volumes - make_slices in parallel - end"; } +void +PrintObject::find_nonplanar_surfaces() +{ + //skip if not active + if(!m_config.use_nonplanar_layers.value) { + BOOST_LOG_TRIVIAL(debug) << "Find nonplanar surfaces - disabled"; + return; + } + + BOOST_LOG_TRIVIAL(info) << "Find nonplanar surfaces - start"; + + //Itterate over all model volumes + const ModelVolumePtrs volumes = this->model_object()->volumes; + for (ModelVolumePtrs::const_iterator it = volumes.begin(); it != volumes.end(); ++ it) { + //only check non modifier volumes + if (! (*it)->is_modifier()) { + const TriangleMesh tmesh = (*it)->mesh(); + AABBMesh mesh(tmesh, true); + std::map facets; + + // store all meshes with slope <= nonplanar_layers_angle in map. Map is necessary to keep facet ID + for (int face_id = 0; face_id < mesh.indices().size(); ++ face_id) { + auto &face = mesh.indices(face_id); + Vec3d normal = mesh.normal_by_face_id(face_id); + + //TODO check if normals exist + if (normal.z() >= std::cos(m_config.nonplanar_layers_angle.value * 3.14159265/180.0)) { + //copy facet + NonplanarFacet new_facet; + new_facet.normal.x = normal.x(); + new_facet.normal.y = normal.y(); + new_facet.normal.z = normal.z(); + + Vec3i neighbor = mesh.face_neighbor_index()[face_id]; + its_triangle vertex = its_triangle_vertices(*mesh.get_triangle_mesh(), face_id); + for (int j=0; j<=2 ;j++) { + new_facet.vertex[j].x = vertex[j].x(); + new_facet.vertex[j].y = vertex[j].y(); + new_facet.vertex[j].z = vertex[j].z(); + new_facet.neighbor[j] = neighbor[j]; + } + new_facet.calculate_stats(); + facets[face_id] = new_facet; + } + } + + // create nonplanar surface from facets + NonplanarSurface nf = NonplanarSurface(facets); + BOOST_LOG_TRIVIAL(trace) << "Find nonplanar surfaces - moving surfaces by z=" << -tmesh.stats().min.z(); + nf.translate(0, 0, -tmesh.stats().min.z()); + + // group surfaces and attach all nonplanar surfaces to the PrintObject + m_nonplanar_surfaces = nf.group_surfaces(); + + // check if surfaces maintain maximum printing height, if not, erase it + for (NonplanarSurfaces::iterator it = m_nonplanar_surfaces.begin(); it!=m_nonplanar_surfaces.end();) { + if((*it).check_max_printing_height(m_config.nonplanar_layers_height.value)) { + it = m_nonplanar_surfaces.erase(it); + }else { + it++; + } + } + + // check if surfaces area is not too small + for (NonplanarSurfaces::iterator it = m_nonplanar_surfaces.begin(); it!=m_nonplanar_surfaces.end();) { + if((*it).check_surface_area()) { + it = m_nonplanar_surfaces.erase(it); + }else { + it++; + } + } + + // check if surfaces areas collide + for (NonplanarSurfaces::iterator it = m_nonplanar_surfaces.begin(); it!=m_nonplanar_surfaces.end();) { + if(check_nonplanar_collisions((*it))) { + it = m_nonplanar_surfaces.erase(it); + } else { + it++; + } + } + + //nf.debug_output(); + +#ifdef SLIC3R_DEBUG_SLICE_PROCESSING + for (size_t id = 0; id < m_nonplanar_surfaces.size(); ++ id) { + auto& surface = m_nonplanar_surfaces[id]; + Surfaces surfaces; + surfaces_append(surfaces, surface.horizontal_projection(), SurfaceType::stTopNonplanar); + SurfaceCollection c(surfaces); + c.export_to_svg(debug_out_path("0_find_nonplanar_surface-%d.svg", id).c_str(), true); + } +#endif + + BOOST_LOG_TRIVIAL(info) << "Find nonplanar surfaces - found " << m_nonplanar_surfaces.size() << " in " << (*it)->name; + } + } + + BOOST_LOG_TRIVIAL(info) << "Find nonplanar surfaces - end"; +} + std::vector PrintObject::slice_support_volumes(const ModelVolumeType model_volume_type) const { auto it_volume = this->model_object()->volumes.begin(); diff --git a/src/libslic3r/SupportSpotsGenerator.cpp b/src/libslic3r/SupportSpotsGenerator.cpp index 8936830f2..b0f2d0d34 100644 --- a/src/libslic3r/SupportSpotsGenerator.cpp +++ b/src/libslic3r/SupportSpotsGenerator.cpp @@ -243,9 +243,9 @@ float get_flow_width(const LayerRegion *region, ExtrusionRole role) if (role == ExtrusionRole::ExternalPerimeter) return region->flow(FlowRole::frExternalPerimeter).width(); if (role == ExtrusionRole::GapFill) return region->flow(FlowRole::frInfill).width(); if (role == ExtrusionRole::Perimeter) return region->flow(FlowRole::frPerimeter).width(); - if (role == ExtrusionRole::SolidInfill) return region->flow(FlowRole::frSolidInfill).width(); + if (role == ExtrusionRole::SolidInfill || role == ExtrusionRole::SolidInfillNonplanar) return region->flow(FlowRole::frSolidInfill).width(); if (role == ExtrusionRole::InternalInfill) return region->flow(FlowRole::frInfill).width(); - if (role == ExtrusionRole::TopSolidInfill) return region->flow(FlowRole::frTopSolidInfill).width(); + if (role == ExtrusionRole::TopSolidInfill || role == ExtrusionRole::TopSolidInfillNonplanar) return region->flow(FlowRole::frTopSolidInfill).width(); // default return region->flow(FlowRole::frPerimeter).width(); } diff --git a/src/libslic3r/Surface.cpp b/src/libslic3r/Surface.cpp index 58ac7294c..fbef74ac2 100644 --- a/src/libslic3r/Surface.cpp +++ b/src/libslic3r/Surface.cpp @@ -35,10 +35,12 @@ const char* surface_type_to_color_name(const SurfaceType surface_type) { switch (surface_type) { case stTop: return "rgb(255,0,0)"; // "red"; + case stTopNonplanar: return "rgb(166,2,255)"; // "purple"; case stBottom: return "rgb(0,255,0)"; // "green"; case stBottomBridge: return "rgb(0,0,255)"; // "blue"; case stInternal: return "rgb(255,255,128)"; // yellow case stInternalSolid: return "rgb(255,0,255)"; // magenta + case stInternalSolidNonplanar: return "rgb(255,133,2)"; // orange case stInternalBridge: return "rgb(0,255,255)"; case stInternalVoid: return "rgb(128,128,128)"; case stPerimeter: return "rgb(128,0,0)"; // maroon @@ -48,7 +50,7 @@ const char* surface_type_to_color_name(const SurfaceType surface_type) Point export_surface_type_legend_to_svg_box_size() { - return Point(scale_(1.+10.*8.), scale_(3.)); + return Point(scale_(1.+16.*8.), scale_(3.)); } void export_surface_type_legend_to_svg(SVG &svg, const Point &pos) @@ -57,11 +59,13 @@ void export_surface_type_legend_to_svg(SVG &svg, const Point &pos) coord_t pos_x0 = pos(0) + scale_(1.); coord_t pos_x = pos_x0; coord_t pos_y = pos(1) + scale_(1.5); - coord_t step_x = scale_(10.); + coord_t step_x = scale_(16.); svg.draw_legend(Point(pos_x, pos_y), "perimeter" , surface_type_to_color_name(stPerimeter)); pos_x += step_x; svg.draw_legend(Point(pos_x, pos_y), "top" , surface_type_to_color_name(stTop)); pos_x += step_x; + svg.draw_legend(Point(pos_x, pos_y), "top nonplanar" , surface_type_to_color_name(stTopNonplanar)); + pos_x += step_x; svg.draw_legend(Point(pos_x, pos_y), "bottom" , surface_type_to_color_name(stBottom)); pos_x += step_x; svg.draw_legend(Point(pos_x, pos_y), "bottom bridge" , surface_type_to_color_name(stBottomBridge)); @@ -74,6 +78,8 @@ void export_surface_type_legend_to_svg(SVG &svg, const Point &pos) pos_x += step_x; svg.draw_legend(Point(pos_x, pos_y), "internal solid" , surface_type_to_color_name(stInternalSolid)); pos_x += step_x; + svg.draw_legend(Point(pos_x, pos_y), "internal solid nonplanar" , surface_type_to_color_name(stInternalSolidNonplanar)); + pos_x += step_x; svg.draw_legend(Point(pos_x, pos_y), "internal bridge", surface_type_to_color_name(stInternalBridge)); pos_x += step_x; svg.draw_legend(Point(pos_x, pos_y), "internal void" , surface_type_to_color_name(stInternalVoid)); diff --git a/src/libslic3r/Surface.hpp b/src/libslic3r/Surface.hpp index 1f352e977..3b82c52ed 100644 --- a/src/libslic3r/Surface.hpp +++ b/src/libslic3r/Surface.hpp @@ -24,6 +24,10 @@ enum SurfaceType { stInternalVoid, // Inner/outer perimeters. stPerimeter, + // + stTopNonplanar, + // + stInternalSolidNonplanar, // Number of SurfaceType enums. stCount, }; @@ -37,6 +41,7 @@ public: unsigned short thickness_layers { 1 }; // in layers double bridge_angle { -1. }; // in radians, ccw, 0 = East, only 0+ (negative means undefined) unsigned short extra_perimeters { 0 }; + float distance_to_top { 0 }; Surface(const Slic3r::Surface &rhs) : surface_type(rhs.surface_type), expolygon(rhs.expolygon), @@ -67,6 +72,7 @@ public: thickness_layers = rhs.thickness_layers; bridge_angle = rhs.bridge_angle; extra_perimeters = rhs.extra_perimeters; + distance_to_top = rhs.distance_to_top; return *this; } @@ -78,6 +84,7 @@ public: thickness_layers = rhs.thickness_layers; bridge_angle = rhs.bridge_angle; extra_perimeters = rhs.extra_perimeters; + distance_to_top = rhs.distance_to_top; return *this; } @@ -86,12 +93,14 @@ public: void clear() { expolygon.clear(); } // The following methods do not test for stPerimeter. - bool is_top() const { return this->surface_type == stTop; } + bool is_top() const { return this->surface_type == stTop || this->surface_type == stTopNonplanar; } bool is_bottom() const { return this->surface_type == stBottom || this->surface_type == stBottomBridge; } bool is_bridge() const { return this->surface_type == stBottomBridge || this->surface_type == stInternalBridge; } bool is_external() const { return this->is_top() || this->is_bottom(); } bool is_internal() const { return ! this->is_external(); } - bool is_solid() const { return this->is_external() || this->surface_type == stInternalSolid || this->surface_type == stInternalBridge; } + bool is_internal_solid() const { return this->surface_type == stInternalSolid || this->surface_type == stInternalSolidNonplanar; } + bool is_solid() const { return this->is_external() || this->surface_type == stInternalSolid || this->surface_type == stInternalSolidNonplanar || this->surface_type == stInternalBridge; } + bool is_nonplanar() const { return this->surface_type == stTopNonplanar || this->surface_type == stInternalSolidNonplanar; } }; typedef std::vector Surfaces; @@ -228,9 +237,20 @@ inline void polygons_append(Polygons &dst, SurfacesPtr &&src) inline void surfaces_append(Surfaces &dst, const ExPolygons &src, SurfaceType surfaceType) { dst.reserve(dst.size() + src.size()); - for (const ExPolygon &expoly : src) + for (const ExPolygon &expoly : src) { dst.emplace_back(Surface(surfaceType, expoly)); + } } +inline void surfaces_append(Surfaces &dst, const ExPolygons &src, SurfaceType surfaceType, float distance_to_top) +{ + dst.reserve(dst.size() + src.size()); + for (const ExPolygon &expoly : src) { + Surface s = Surface(surfaceType, expoly); + s.distance_to_top = distance_to_top; + dst.emplace_back(s); + } +} + inline void surfaces_append(Surfaces &dst, const ExPolygons &src, const Surface &surfaceTempl) { dst.reserve(dst.size() + number_polygons(src)); @@ -278,7 +298,8 @@ inline bool surfaces_could_merge(const Surface &s1, const Surface &s2) s1.surface_type == s2.surface_type && s1.thickness == s2.thickness && s1.thickness_layers == s2.thickness_layers && - s1.bridge_angle == s2.bridge_angle; + s1.bridge_angle == s2.bridge_angle && + s1.distance_to_top == s2.distance_to_top; } class SVG; diff --git a/src/libslic3r/SurfaceCollection.hpp b/src/libslic3r/SurfaceCollection.hpp index 0f62875b2..5491909b8 100644 --- a/src/libslic3r/SurfaceCollection.hpp +++ b/src/libslic3r/SurfaceCollection.hpp @@ -68,9 +68,11 @@ public: void append(const SurfaceCollection &coll) { this->append(coll.surfaces); } void append(SurfaceCollection &&coll) { this->append(std::move(coll.surfaces)); } void append(const ExPolygons &src, SurfaceType surfaceType) { surfaces_append(this->surfaces, src, surfaceType); } + void append(const ExPolygons &src, SurfaceType surfaceType, float distance_to_top) { surfaces_append(this->surfaces, src, surfaceType, distance_to_top); } void append(const ExPolygons &src, const Surface &surfaceTempl) { surfaces_append(this->surfaces, src, surfaceTempl); } void append(const Surfaces &src) { surfaces_append(this->surfaces, src); } void append(ExPolygons &&src, SurfaceType surfaceType) { surfaces_append(this->surfaces, std::move(src), surfaceType); } + void append(ExPolygons &&src, SurfaceType surfaceType, float distance_to_top) { surfaces_append(this->surfaces, std::move(src), surfaceType, distance_to_top); } void append(ExPolygons &&src, const Surface &surfaceTempl) { surfaces_append(this->surfaces, std::move(src), surfaceTempl); } void append(Surfaces &&src) { surfaces_append(this->surfaces, std::move(src)); } diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index ed4713737..d65dcdb9c 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -569,7 +569,9 @@ const std::array(GCodeExtrusionRole::Count)> GCod { 0.12f, 0.12f, 1.00f, 1.0f }, // GCodeExtrusionRole::OverhangPerimeter { 0.69f, 0.19f, 0.16f, 1.0f }, // GCodeExtrusionRole::InternalInfill { 0.59f, 0.33f, 0.80f, 1.0f }, // GCodeExtrusionRole::SolidInfill + { 0.75f, 0.12f, 0.45f, 1.0f }, // GCodeExtrusionRole::SolidInfillNonplanar { 0.94f, 0.25f, 0.25f, 1.0f }, // GCodeExtrusionRole::TopSolidInfill + { 0.32f, 0.12f, 0.45f, 1.0f }, // GCodeExtrusionRole::TopSolidInfillNonplanar { 1.00f, 0.55f, 0.41f, 1.0f }, // GCodeExtrusionRole::Ironing { 0.30f, 0.50f, 0.73f, 1.0f }, // GCodeExtrusionRole::BridgeInfill { 1.00f, 1.00f, 1.00f, 1.0f }, // GCodeExtrusionRole::GapFill diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index ad93afa87..35a08b70d 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1459,6 +1459,12 @@ void TabPrint::build() optgroup->append_single_option_line("fuzzy_skin_thickness", category_path + "fuzzy-skin-thickness"); optgroup->append_single_option_line("fuzzy_skin_point_dist", category_path + "fuzzy-skin-point-distance"); + optgroup = page->new_optgroup(L("Nonplanar layers (experimental)")); + category_path = "nonplanar-layers_19282821/#"; + optgroup->append_single_option_line("use_nonplanar_layers", category_path + "use-nonplanar-layers"); + optgroup->append_single_option_line("nonplanar_layers_angle", category_path + "nonplanar-layers-height"); + optgroup->append_single_option_line("nonplanar_layers_height", category_path + "nonplanar-layers-height"); + page = add_options_page(L("Infill"), "infill"); category_path = "infill_42#"; optgroup = page->new_optgroup(L("Infill")); diff --git a/tests/data/nonplanar/wave_cube.stl b/tests/data/nonplanar/wave_cube.stl new file mode 100644 index 0000000000000000000000000000000000000000..c9238b6478d508e5122b32818286abdbba8c58b8 GIT binary patch literal 779984 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%0AE= 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