Experiment: Added a rectilinear monotonic infill without perimeter

connection lines for top / bottom infill patterns.
Co-authored-by: lane.wei <lane.wei@bambulab.com>
This commit is contained in:
Vojtech Bubnik 2023-01-06 18:31:48 +01:00
parent 617747acb3
commit f7f763300e
6 changed files with 42 additions and 18 deletions

View File

@ -110,6 +110,11 @@ struct SurfaceFill {
SurfaceFillParams params; SurfaceFillParams params;
}; };
static inline bool fill_type_monotonic(InfillPattern pattern)
{
return pattern == ipMonotonic || pattern == ipMonotonicLines;
}
std::vector<SurfaceFill> group_fills(const Layer &layer) std::vector<SurfaceFill> group_fills(const Layer &layer)
{ {
std::vector<SurfaceFill> surface_fills; std::vector<SurfaceFill> surface_fills;
@ -138,7 +143,7 @@ std::vector<SurfaceFill> group_fills(const Layer &layer)
//FIXME for non-thick bridges, shall we allow a bottom surface pattern? //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_top() ? region_config.top_fill_pattern.value : region_config.bottom_fill_pattern.value) : (surface.is_top() ? region_config.top_fill_pattern.value : region_config.bottom_fill_pattern.value) :
region_config.top_fill_pattern == ipMonotonic ? ipMonotonic : ipRectilinear; fill_type_monotonic(region_config.top_fill_pattern) ? ipMonotonic : ipRectilinear;
} else if (params.density <= 0) } else if (params.density <= 0)
continue; continue;
@ -279,7 +284,7 @@ std::vector<SurfaceFill> group_fills(const Layer &layer)
if (internal_solid_fill == nullptr) { if (internal_solid_fill == nullptr) {
// Produce another solid fill. // Produce another solid fill.
params.extruder = layerm.region().extruder(frSolidInfill); params.extruder = layerm.region().extruder(frSolidInfill);
params.pattern = layerm.region().config().top_fill_pattern == ipMonotonic ? ipMonotonic : ipRectilinear; params.pattern = fill_type_monotonic(layerm.region().config().top_fill_pattern) ? ipMonotonic : ipRectilinear;
params.density = 100.f; params.density = 100.f;
params.extrusion_role = ExtrusionRole::InternalInfill; params.extrusion_role = ExtrusionRole::InternalInfill;
params.angle = float(Geometry::deg2rad(layerm.region().config().fill_angle.value)); params.angle = float(Geometry::deg2rad(layerm.region().config().fill_angle.value));

View File

@ -37,6 +37,7 @@ Fill* Fill::new_from_type(const InfillPattern type)
case ipRectilinear: return new FillRectilinear(); case ipRectilinear: return new FillRectilinear();
case ipAlignedRectilinear: return new FillAlignedRectilinear(); case ipAlignedRectilinear: return new FillAlignedRectilinear();
case ipMonotonic: return new FillMonotonic(); case ipMonotonic: return new FillMonotonic();
case ipMonotonicLines: return new FillMonotonicLines();
case ipLine: return new FillLine(); case ipLine: return new FillLine();
case ipGrid: return new FillGrid(); case ipGrid: return new FillGrid();
case ipTriangles: return new FillTriangles(); case ipTriangles: return new FillTriangles();

View File

@ -2970,7 +2970,18 @@ Polylines FillMonotonic::fill_surface(const Surface *surface, const FillParams &
params2.monotonic = true; params2.monotonic = true;
Polylines polylines_out; Polylines polylines_out;
if (! fill_surface_by_lines(surface, params2, 0.f, 0.f, polylines_out)) if (! fill_surface_by_lines(surface, params2, 0.f, 0.f, polylines_out))
BOOST_LOG_TRIVIAL(error) << "FillMonotonous::fill_surface() failed to fill a region."; BOOST_LOG_TRIVIAL(error) << "FillMonotonic::fill_surface() failed to fill a region.";
return polylines_out;
}
Polylines FillMonotonicLines::fill_surface(const Surface *surface, const FillParams &params)
{
FillParams params2 = params;
params2.monotonic = true;
params2.anchor_length_max = 0.0f;
Polylines polylines_out;
if (! fill_surface_by_lines(surface, params2, 0.f, 0.f, polylines_out))
BOOST_LOG_TRIVIAL(error) << "FillMonotonicLines::fill_surface() failed to fill a region.";
return polylines_out; return polylines_out;
} }

View File

@ -49,6 +49,15 @@ public:
bool no_sort() const override { return true; } bool no_sort() const override { return true; }
}; };
class FillMonotonicLines : public FillRectilinear
{
public:
Fill* clone() const override { return new FillMonotonicLines(*this); }
~FillMonotonicLines() override = default;
Polylines fill_surface(const Surface *surface, const FillParams &params) override;
bool no_sort() const override { return true; }
};
class FillGrid : public FillRectilinear class FillGrid : public FillRectilinear
{ {
public: public:

View File

@ -96,6 +96,7 @@ CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(FuzzySkinType)
static const t_config_enum_values s_keys_map_InfillPattern { static const t_config_enum_values s_keys_map_InfillPattern {
{ "rectilinear", ipRectilinear }, { "rectilinear", ipRectilinear },
{ "monotonic", ipMonotonic }, { "monotonic", ipMonotonic },
{ "monotoniclines", ipMonotonicLines },
{ "alignedrectilinear", ipAlignedRectilinear }, { "alignedrectilinear", ipAlignedRectilinear },
{ "grid", ipGrid }, { "grid", ipGrid },
{ "triangles", ipTriangles }, { "triangles", ipTriangles },
@ -769,20 +770,17 @@ void PrintConfigDef::init_fff_params()
def->tooltip = L("Fill pattern for top infill. This only affects the top visible layer, and not its adjacent solid shells."); def->tooltip = L("Fill pattern for top infill. This only affects the top visible layer, and not its adjacent solid shells.");
def->cli = "top-fill-pattern|external-fill-pattern|solid-fill-pattern"; def->cli = "top-fill-pattern|external-fill-pattern|solid-fill-pattern";
def->enum_keys_map = &ConfigOptionEnum<InfillPattern>::get_enum_values(); def->enum_keys_map = &ConfigOptionEnum<InfillPattern>::get_enum_values();
def->enum_values.push_back("rectilinear"); def->set_enum_values({
def->enum_values.push_back("monotonic"); { "rectilinear", L("Rectilinear") },
def->enum_values.push_back("alignedrectilinear"); { "monotonic", L("Monotonic") },
def->enum_values.push_back("concentric"); { "monotoniclines", L("Monotonic Lines") },
def->enum_values.push_back("hilbertcurve"); { "alignedrectilinear", L("Aligned Rectilinear") },
def->enum_values.push_back("archimedeanchords"); { "concentric", L("Concentric") },
def->enum_values.push_back("octagramspiral"); { "hilbertcurve", L("Hilbert Curve") },
def->enum_labels.push_back(L("Rectilinear")); { "archimedeanchords", L("Archimedean Chords") },
def->enum_labels.push_back(L("Monotonic")); { "octagramspiral", L("Octagram Spiral") }
def->enum_labels.push_back(L("Aligned Rectilinear")); });
def->enum_labels.push_back(L("Concentric"));
def->enum_labels.push_back(L("Hilbert Curve"));
def->enum_labels.push_back(L("Archimedean Chords"));
def->enum_labels.push_back(L("Octagram Spiral"));
// solid_fill_pattern is an obsolete equivalent to top_fill_pattern/bottom_fill_pattern. // solid_fill_pattern is an obsolete equivalent to top_fill_pattern/bottom_fill_pattern.
def->aliases = { "solid_fill_pattern", "external_fill_pattern" }; def->aliases = { "solid_fill_pattern", "external_fill_pattern" };
def->set_default_value(new ConfigOptionEnum<InfillPattern>(ipMonotonic)); def->set_default_value(new ConfigOptionEnum<InfillPattern>(ipMonotonic));

View File

@ -57,7 +57,7 @@ enum class FuzzySkinType {
}; };
enum InfillPattern : int { enum InfillPattern : int {
ipRectilinear, ipMonotonic, ipAlignedRectilinear, ipGrid, ipTriangles, ipStars, ipCubic, ipLine, ipConcentric, ipHoneycomb, ip3DHoneycomb, ipRectilinear, ipMonotonic, ipMonotonicLines, ipAlignedRectilinear, ipGrid, ipTriangles, ipStars, ipCubic, ipLine, ipConcentric, ipHoneycomb, ip3DHoneycomb,
ipGyroid, ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral, ipAdaptiveCubic, ipSupportCubic, ipSupportBase, ipGyroid, ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral, ipAdaptiveCubic, ipSupportCubic, ipSupportBase,
ipLightning, ipLightning,
ipCount, ipCount,