Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Brim overhaul: New features and bug fixes #11678

Merged
merged 16 commits into from
Oct 30, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 11 additions & 61 deletions cura/BuildVolume.py
Original file line number Diff line number Diff line change
Expand Up @@ -810,11 +810,6 @@ def _updateDisallowedAreas(self) -> None:
break
if prime_tower_collision: # Already found a collision.
break
if self._global_container_stack.getProperty("prime_tower_brim_enable", "value") and self._global_container_stack.getProperty("adhesion_type", "value") != "raft":
brim_size = self._calculateBedAdhesionSize(used_extruders, "brim")
# Use 2x the brim size, since we need 1x brim size distance due to the object brim and another
# times the brim due to the brim of the prime tower
prime_tower_areas[extruder_id][area_index] = prime_tower_area.getMinkowskiHull(Polygon.approximatedCircle(2 * brim_size, num_segments = 24))
if not prime_tower_collision:
result_areas[extruder_id].extend(prime_tower_areas[extruder_id])
result_areas_no_brim[extruder_id].extend(prime_tower_areas[extruder_id])
Expand All @@ -840,9 +835,13 @@ def _computeDisallowedAreasPrinted(self, used_extruders):

result = {}
skirt_brim_extruder: ExtruderStack = None
skirt_brim_extruder_nr = self._global_container_stack.getProperty("skirt_brim_extruder_nr", "value")

for extruder in used_extruders:
if int(extruder.getProperty("extruder_nr", "value")) == int(self._global_container_stack.getProperty("skirt_brim_extruder_nr", "value")):
skirt_brim_extruder = extruder
if skirt_brim_extruder_nr == -1:
skirt_brim_extruder = used_extruders[0] # The prime tower brim is always printed with the first extruder
elif int(extruder.getProperty("extruder_nr", "value")) == int(skirt_brim_extruder_nr):
skirt_brim_extruder = extruder
result[extruder.getId()] = []

# Currently, the only normally printed object is the prime tower.
Expand All @@ -856,15 +855,6 @@ def _computeDisallowedAreasPrinted(self, used_extruders):
prime_tower_x = prime_tower_x - machine_width / 2 #Offset by half machine_width and _depth to put the origin in the front-left.
prime_tower_y = prime_tower_y + machine_depth / 2

if skirt_brim_extruder is not None and self._global_container_stack.getProperty("prime_tower_brim_enable", "value") and self._global_container_stack.getProperty("adhesion_type", "value") != "raft":
brim_size = (
skirt_brim_extruder.getProperty("brim_line_count", "value") *
skirt_brim_extruder.getProperty("skirt_brim_line_width", "value") / 100.0 *
skirt_brim_extruder.getProperty("initial_layer_line_width_factor", "value")
)
prime_tower_x -= brim_size
prime_tower_y += brim_size

radius = prime_tower_size / 2
prime_tower_area = Polygon.approximatedCircle(radius, num_segments = 24)
prime_tower_area = prime_tower_area.translate(prime_tower_x - radius, prime_tower_y - radius)
Expand Down Expand Up @@ -1076,7 +1066,7 @@ def _getSettingFromAllExtruders(self, setting_key: str) -> List[Any]:
all_values[i] = 0
return all_values

def _calculateBedAdhesionSize(self, used_extruders, adhesion_override = None):
def _calculateBedAdhesionSize(self, used_extruders):
"""Get the bed adhesion size for the global container stack and used extruders

:param adhesion_override: override adhesion type.
Expand All @@ -1086,52 +1076,12 @@ def _calculateBedAdhesionSize(self, used_extruders, adhesion_override = None):
return None

container_stack = self._global_container_stack
adhesion_type = adhesion_override
if adhesion_type is None:
adhesion_type = container_stack.getProperty("adhesion_type", "value")

# Skirt_brim_line_width is a bit of an odd one out. The primary bit of the skirt/brim is printed
# with the adhesion extruder, but it also prints one extra line by all other extruders. As such, the
# setting does *not* have a limit_to_extruder setting (which means that we can't ask the global extruder what
# the value is.
skirt_brim_extruder_nr = self._global_container_stack.getProperty("skirt_brim_extruder_nr", "value")
try:
skirt_brim_stack = self._global_container_stack.extruderList[int(skirt_brim_extruder_nr)]
except IndexError:
Logger.warning(f"Couldn't find extruder with index '{skirt_brim_extruder_nr}', defaulting to 0 instead.")
skirt_brim_stack = self._global_container_stack.extruderList[0]
skirt_brim_line_width = skirt_brim_stack.getProperty("skirt_brim_line_width", "value")

initial_layer_line_width_factor = skirt_brim_stack.getProperty("initial_layer_line_width_factor", "value")
# Use brim width if brim is enabled OR the prime tower has a brim.
if adhesion_type == "brim":
brim_line_count = skirt_brim_stack.getProperty("brim_line_count", "value")
brim_gap = skirt_brim_stack.getProperty("brim_gap", "value")
bed_adhesion_size = brim_gap + skirt_brim_line_width * brim_line_count * initial_layer_line_width_factor / 100.0

for extruder_stack in used_extruders:
bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0

# We don't create an additional line for the extruder we're printing the brim with.
bed_adhesion_size -= skirt_brim_line_width * initial_layer_line_width_factor / 100.0
elif adhesion_type == "skirt":
skirt_distance = skirt_brim_stack.getProperty("skirt_gap", "value")
skirt_line_count = skirt_brim_stack.getProperty("skirt_line_count", "value")

bed_adhesion_size = skirt_distance + (
skirt_brim_line_width * skirt_line_count) * initial_layer_line_width_factor / 100.0

for extruder_stack in used_extruders:
bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0

# We don't create an additional line for the extruder we're printing the skirt with.
bed_adhesion_size -= skirt_brim_line_width * initial_layer_line_width_factor / 100.0
elif adhesion_type == "raft":
adhesion_type = container_stack.getProperty("adhesion_type", "value")

if adhesion_type == "raft":
bed_adhesion_size = self._global_container_stack.getProperty("raft_margin", "value") # Should refer to the raft extruder if set.
elif adhesion_type == "none":
else: # raft, brim or skirt. Those last two are handled by CuraEngine.
bed_adhesion_size = 0
else:
raise Exception("Unknown bed adhesion type. Did you forget to update the build volume calculations for your new bed adhesion type?")

max_length_available = 0.5 * min(
self._global_container_stack.getProperty("machine_width", "value"),
Expand Down
4 changes: 2 additions & 2 deletions cura/Settings/ExtruderManager.py
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ def getUsedExtruderStacks(self) -> List["ExtruderStack"]:
for extruder_setting in used_adhesion_extruders:
extruder_str_nr = str(global_stack.getProperty(extruder_setting, "value"))
if extruder_str_nr == "-1":
extruder_str_nr = self._application.getMachineManager().defaultExtruderPosition
continue # An optional extruder doesn't force any extruder to be used if it isn't used already
if extruder_str_nr in self.extruderIds:
used_extruder_stack_ids.add(self.extruderIds[extruder_str_nr])

Expand All @@ -298,7 +298,7 @@ def getInitialExtruderNr(self) -> int:
# Starts with the adhesion extruder.
adhesion_type = global_stack.getProperty("adhesion_type", "value")
if adhesion_type in {"skirt", "brim"}:
return global_stack.getProperty("skirt_brim_extruder_nr", "value")
return max(0, int(global_stack.getProperty("skirt_brim_extruder_nr", "value"))) # optional skirt/brim extruder defaults to zero
if adhesion_type == "raft":
return global_stack.getProperty("raft_base_extruder_nr", "value")

Expand Down
2 changes: 0 additions & 2 deletions cura/Settings/ExtruderStack.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,6 @@ def getProperty(self, key: str, property_name: str, context: Optional[PropertyEv

limit_to_extruder = super().getProperty(key, "limit_to_extruder", context)
if limit_to_extruder is not None:
if limit_to_extruder == -1:
limit_to_extruder = int(cura.CuraApplication.CuraApplication.getInstance().getMachineManager().defaultExtruderPosition)
limit_to_extruder = str(limit_to_extruder)

if (limit_to_extruder is not None and limit_to_extruder != "-1") and self.getMetaDataEntry("position") != str(limit_to_extruder):
Expand Down
2 changes: 0 additions & 2 deletions cura/Settings/GlobalStack.py
Original file line number Diff line number Diff line change
Expand Up @@ -226,8 +226,6 @@ def getProperty(self, key: str, property_name: str, context: Optional[PropertyEv
# Handle the "limit_to_extruder" property.
limit_to_extruder = super().getProperty(key, "limit_to_extruder", context)
if limit_to_extruder is not None:
if limit_to_extruder == -1:
limit_to_extruder = int(cura.CuraApplication.CuraApplication.getInstance().getMachineManager().defaultExtruderPosition)
limit_to_extruder = str(limit_to_extruder)
if limit_to_extruder is not None and limit_to_extruder != "-1" and limit_to_extruder in self._extruders:
if super().getProperty(key, "settable_per_extruder", context):
Expand Down
4 changes: 4 additions & 0 deletions plugins/CuraEngineBackend/StartSliceJob.py
Original file line number Diff line number Diff line change
Expand Up @@ -487,6 +487,10 @@ def _buildGlobalSettingsMessage(self, stack: ContainerStack) -> None:
settings["machine_start_gcode"] = self._expandGcodeTokens(settings["machine_start_gcode"], initial_extruder_nr)
settings["machine_end_gcode"] = self._expandGcodeTokens(settings["machine_end_gcode"], initial_extruder_nr)

# Manually add 'nozzle offsetting', since that is a metadata-entry instead for some reason.
# NOTE: This probably needs to be an actual setting at some point.
settings["nozzle_offsetting_for_disallowed_areas"] = CuraApplication.getInstance().getGlobalContainerStack().getMetaDataEntry("nozzle_offsetting_for_disallowed_areas", True)

# Add all sub-messages for each individual setting.
for key, value in settings.items():
setting_message = self._slice_message.getMessage("global_settings").addRepeatedMessage("settings")
Expand Down
47 changes: 29 additions & 18 deletions resources/definitions/fdmprinter.def.json
Original file line number Diff line number Diff line change
Expand Up @@ -4784,7 +4784,6 @@
"default_value": 8.0,
"minimum_value": "0.0",
"maximum_value_warning": "50.0",
"maximum_value": "0.5 * min(machine_width, machine_depth)",
"enabled": "(support_enable or support_meshes_present) and support_brim_enable",
"settable_per_mesh": false,
"settable_per_extruder": true,
Expand All @@ -4799,7 +4798,6 @@
"default_value": 20,
"minimum_value": "0",
"maximum_value_warning": "50 / skirt_brim_line_width",
"maximum_value": "0.5 * min(machine_width, machine_depth) / skirt_brim_line_width",
"value": "math.ceil(support_brim_width / (skirt_brim_line_width * initial_layer_line_width_factor / 100.0))",
"enabled": "(support_enable or support_meshes_present) and support_brim_enable",
"settable_per_mesh": false,
Expand Down Expand Up @@ -5558,10 +5556,11 @@
{
"label": "Skirt/Brim Extruder",
"description": "The extruder train to use for printing the skirt or brim. This is used in multi-extrusion.",
"type": "extruder",
"type": "optional_extruder",
"default_value": "0",
"value": "adhesion_extruder_nr",
"enabled": "extruders_enabled_count > 1 and (resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('prime_tower_brim_enable'))",
"resolve": "'-1' if '-1' in extruderValues('skirt_brim_extruder_nr') else adhesion_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": false
},
Expand Down Expand Up @@ -5613,9 +5612,9 @@
"maximum_value_warning": "10",
"maximum_value": "0.5 * min(machine_width, machine_depth) / skirt_brim_line_width",
"enabled": "resolveOrValue('adhesion_type') == 'skirt'",
"limit_to_extruder": "skirt_brim_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "skirt_brim_extruder_nr"
"settable_per_extruder": true
},
"skirt_gap":
{
Expand All @@ -5627,9 +5626,9 @@
"minimum_value_warning": "max(extruderValues('machine_nozzle_size'))",
"maximum_value_warning": "10",
"enabled": "resolveOrValue('adhesion_type') == 'skirt'",
"limit_to_extruder": "skirt_brim_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "skirt_brim_extruder_nr"
"settable_per_extruder": true
},
"skirt_brim_minimal_length":
{
Expand All @@ -5642,6 +5641,7 @@
"minimum_value_warning": "25",
"maximum_value_warning": "2500",
"enabled": "resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('prime_tower_brim_enable')",
"limit_to_extruder": "skirt_brim_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true
},
Expand All @@ -5654,11 +5654,10 @@
"default_value": 8.0,
"minimum_value": "0.0",
"maximum_value_warning": "50.0",
"maximum_value": "0.5 * min(machine_width, machine_depth)",
"enabled": "resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('prime_tower_brim_enable')",
"limit_to_extruder": "skirt_brim_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "skirt_brim_extruder_nr",
"children":
{
"brim_line_count":
Expand All @@ -5669,12 +5668,11 @@
"default_value": 20,
"minimum_value": "0",
"maximum_value_warning": "50 / skirt_brim_line_width",
"maximum_value": "0.5 * min(machine_width, machine_depth) / skirt_brim_line_width",
"value": "math.ceil(brim_width / (skirt_brim_line_width * initial_layer_line_width_factor / 100.0))",
"enabled": "resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('prime_tower_brim_enable')",
"limit_to_extruder": "skirt_brim_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "skirt_brim_extruder_nr"
"settable_per_extruder": true
}
}
},
Expand All @@ -5688,9 +5686,9 @@
"minimum_value": "0",
"maximum_value_warning": "skirt_brim_line_width",
"enabled": "resolveOrValue('adhesion_type') == 'brim'",
"limit_to_extruder": "skirt_brim_extruder_nr",
"settable_per_mesh": true,
"settable_per_extruder": true,
"limit_to_extruder": "skirt_brim_extruder_nr"
"settable_per_extruder": true
},
"brim_replaces_support":
{
Expand All @@ -5699,9 +5697,9 @@
"type": "bool",
"default_value": true,
"enabled": "resolveOrValue('adhesion_type') == 'brim' and (support_enable or support_meshes_present)",
"limit_to_extruder": "skirt_brim_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "support_infill_extruder_nr"
"settable_per_extruder": true
},
"brim_outside_only":
{
Expand All @@ -5710,9 +5708,22 @@
"type": "bool",
"default_value": true,
"enabled": "resolveOrValue('adhesion_type') == 'brim'",
"limit_to_extruder": "skirt_brim_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "skirt_brim_extruder_nr"
"settable_per_extruder": true
},
"brim_inside_margin":
{
"label": "Brim Inside Avoid Margin",
"description": "If brim is only on outside then parts fully enclosed inside another part will get a brim which might overlap with the internal holes of the outer part. This setting controls how far to stay away from those internal holes. Set to a high value to prevent any brim from being generated for parts enclosed within the holes of other parts.",
"unit": "mm",
"type": "float",
"default_value": 5,
"minimum_value": "0",
"enabled": "resolveOrValue('adhesion_type') == 'brim' and any(extruderValues('brim_outside_only'))",
"limit_to_extruder": "skirt_brim_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"raft_margin":
{
Expand Down
Loading