mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-17 05:52:39 +00:00
Belt printers: brim laid onto the tilted belt, with a leading apron
A belt printer slices in a rotated frame, so the belt surface is a tilted
plane rather than the Z=0 bed plane. Each slicing layer touches the belt
only along a narrow strip at its leading edge - about 0.2mm at 45 degrees -
so a part's first layer is really a first line, with almost no contact patch
to hold it down while the belt drags it forward. Brim was hard-disabled on
belt printers, leaving no remedy at all.
Generate the brim on the belt plane instead. The object's belt footprint is
the union over layers of each slice clipped to that layer's contact band; the
brim is offset from it in a "flattened" frame where the shear axis is
stretched by 1/cos(tilt), so ordinary Clipper offsets measure true on-belt
distance. It is emitted as cross-belt lines, one per layer band, anchored to
a fixed fraction of the band so every line shares a nozzle-to-belt clearance
and therefore comes out the same width; flow is matched to the resulting band
pitch, keeping the sheet uniform and gap-free.
Three new controls, all belt-only:
* Leading brim length - extends the brim ahead of the part along the belt,
on every downhill-facing edge of its contact area. This apron necessarily
prints BELOW the object's first layer, since layer 0 is the part's leading
contact, so it needs brim-only bands of its own.
* Extra brim width - widens the brim sideways across the belt only.
* Brim type "Leading edge only" - brim at the part's first belt contact and
nothing after it. Appended last in BrimType so no existing value shifts;
degrades to an outer brim off belt printers, with a warning.
The apron bands are lightweight records rather than a Layer subclass, so no
fabricated Layer::id() can leak into initial-layer temperature selection, the
spiral vase probe, cooling or gradual interpolation. They are generated in
posSupportMaterial because their print_z values must exist before ToolOrdering
is built at psWipeTower, and they are emitted from a short dedicated branch in
process_layer that runs before any layer pointer is dereferenced.
The footprint is closed before offsetting outwards: a belt contact patch is
often a broken-up strip, and the merged offset rings of two islands closer
than 2 x brim_width would otherwise fill the space between them - space that
lies under the part.
Also fixes a pre-existing bug where PrintObject::get_first_layer_bbox()
overwrote a valid bbox with an unassigned one on any belt printer with a brim
configured, because has_brim() was true while make_brim() returned early.
Belt brim is refused alongside the prime tower and spiral vase, and requires
one instance per PrintObject - translating an instance along the belt axis
changes its physical belt-floor Z. Untilted belt printers are unchanged: they
still get no brim, since the plate brim is emitted out of skirt_brim_groups(),
which _make_skirt() never builds for a belt printer.
This commit is contained in:
@@ -508,6 +508,7 @@ static const t_config_enum_values s_keys_map_BrimType = {
|
||||
{"auto_brim", btAutoBrim}, // BBS
|
||||
{"brim_ears", btEar}, // Orca
|
||||
{"painted", btPainted}, // BBS
|
||||
{"leading_edge_only", btLeadingEdgeOnly}, // belt printers
|
||||
};
|
||||
CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(BrimType)
|
||||
|
||||
@@ -1899,6 +1900,45 @@ void PrintConfigDef::init_fff_params()
|
||||
def->mode = comSimple;
|
||||
def->set_default_value(new ConfigOptionFloat(0.));
|
||||
|
||||
def = this->add("leading_brim_length", coFloat);
|
||||
def->label = L("Leading brim length");
|
||||
def->category = L("Support");
|
||||
def->tooltip = L("Belt printers only. Extends the brim AHEAD of the object along the belt, on "
|
||||
"every downhill-facing edge of its contact area - both the object's first "
|
||||
"contact with the belt and any island that lands later. This apron is laid "
|
||||
"onto the belt before the object reaches it, so the leading edge has "
|
||||
"something already stuck down to hold on to.\n\n"
|
||||
"Measured on the belt surface, and added on top of Brim width: the brim "
|
||||
"reaches Brim-object gap + Leading brim length + Brim width ahead of the "
|
||||
"object. Set Brim-object gap to 0, or the apron will not touch the object it "
|
||||
"is meant to anchor.\n\n"
|
||||
"On a tilted belt each layer lays one strip of the brim, so the thickness of "
|
||||
"the resulting brim sheet is set by flow rather than by layer height. Use "
|
||||
"Brim flow ratio to tune it.\n\n"
|
||||
"Set to 0 to disable.");
|
||||
def->sidetext = L("mm"); // millimeters, CIS languages need translation
|
||||
def->min = 0;
|
||||
def->max = 100;
|
||||
def->mode = comAdvanced;
|
||||
def->set_default_value(new ConfigOptionFloat(0.));
|
||||
|
||||
def = this->add("extra_brim_width", coFloat);
|
||||
def->label = L("Extra brim width");
|
||||
def->category = L("Support");
|
||||
def->tooltip = L("Belt printers only. Widens the brim SIDEWAYS, across the belt, without "
|
||||
"extending it further ahead of or behind the object. Use it when a part needs "
|
||||
"more grip along its length than Brim width alone gives.\n\n"
|
||||
"Measured on the belt surface, and added on top of Brim width: the brim "
|
||||
"reaches Brim-object gap + Brim width + Extra brim width to either side of "
|
||||
"the object. To extend the brim ahead of the object instead, use Leading brim "
|
||||
"length.\n\n"
|
||||
"Set to 0 to disable.");
|
||||
def->sidetext = L("mm"); // millimeters, CIS languages need translation
|
||||
def->min = 0;
|
||||
def->max = 100;
|
||||
def->mode = comAdvanced;
|
||||
def->set_default_value(new ConfigOptionFloat(0.));
|
||||
|
||||
def = this->add("brim_type", coEnum);
|
||||
def->label = L("Brim type");
|
||||
def->category = L("Support");
|
||||
@@ -1912,6 +1952,7 @@ void PrintConfigDef::init_fff_params()
|
||||
def->enum_values.emplace_back("inner_only");
|
||||
def->enum_values.emplace_back("outer_and_inner");
|
||||
def->enum_values.emplace_back("no_brim");
|
||||
def->enum_values.emplace_back("leading_edge_only");
|
||||
def->enum_labels.emplace_back(L("Auto"));
|
||||
def->enum_labels.emplace_back(L("Mouse ear"));
|
||||
def->enum_labels.emplace_back(L("Painted"));
|
||||
@@ -1919,6 +1960,7 @@ void PrintConfigDef::init_fff_params()
|
||||
def->enum_labels.emplace_back(L("Inner brim only"));
|
||||
def->enum_labels.emplace_back(L("Outer and inner brim"));
|
||||
def->enum_labels.emplace_back(L("No-brim"));
|
||||
def->enum_labels.emplace_back(L("Leading edge only"));
|
||||
def->mode = comSimple;
|
||||
def->set_default_value(new ConfigOptionEnum<BrimType>(btAutoBrim));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user