mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-05-25 07:39:25 +08:00
Merge remote-tracking branch 'origin/main' into CURA-11947_improve_multimaterial_raft
This commit is contained in:
commit
cd40d51564
2
.github/workflows/installers.yml
vendored
2
.github/workflows/installers.yml
vendored
@ -93,7 +93,7 @@ jobs:
|
|||||||
enterprise: ${{ github.event.inputs.enterprise == 'true' }}
|
enterprise: ${{ github.event.inputs.enterprise == 'true' }}
|
||||||
staging: ${{ github.event.inputs.staging == 'true' }}
|
staging: ${{ github.event.inputs.staging == 'true' }}
|
||||||
architecture: X64
|
architecture: X64
|
||||||
operating_system: ubuntu-22.04
|
operating_system: self-hosted-Ubuntu22-X64
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
macos-installer:
|
macos-installer:
|
||||||
|
5
.github/workflows/linux.yml
vendored
5
.github/workflows/linux.yml
vendored
@ -34,10 +34,11 @@ on:
|
|||||||
operating_system:
|
operating_system:
|
||||||
description: 'OS'
|
description: 'OS'
|
||||||
required: true
|
required: true
|
||||||
default: 'ubuntu-22.04'
|
default: 'self-hosted-Ubuntu22-X64'
|
||||||
type: choice
|
type: choice
|
||||||
options:
|
options:
|
||||||
- ubuntu-22.04
|
- ubuntu-22.04
|
||||||
|
- self-hosted-Ubuntu22-X64
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
linux-installer:
|
linux-installer:
|
||||||
@ -49,4 +50,4 @@ jobs:
|
|||||||
staging: ${{ inputs.staging }}
|
staging: ${{ inputs.staging }}
|
||||||
architecture: ${{ inputs.architecture }}
|
architecture: ${{ inputs.architecture }}
|
||||||
operating_system: ${{ inputs.operating_system }}
|
operating_system: ${{ inputs.operating_system }}
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
@ -2,6 +2,7 @@ checks:
|
|||||||
diagnostic-mesh-file-extension: true
|
diagnostic-mesh-file-extension: true
|
||||||
diagnostic-mesh-file-size: true
|
diagnostic-mesh-file-size: true
|
||||||
diagnostic-definition-redundant-override: true
|
diagnostic-definition-redundant-override: true
|
||||||
|
diagnostic-definition-experimental-setting: true
|
||||||
diagnostic-resources-macos-app-directory-name: true
|
diagnostic-resources-macos-app-directory-name: true
|
||||||
diagnostic-incorrect-formula: true
|
diagnostic-incorrect-formula: true
|
||||||
diagnostic-resource-file-deleted: true
|
diagnostic-resource-file-deleted: true
|
||||||
|
@ -14,10 +14,10 @@ def getLinter(file: Path, settings: dict) -> Optional[List[Linter]]:
|
|||||||
if not file.exists():
|
if not file.exists():
|
||||||
return [Directory(file, settings)]
|
return [Directory(file, settings)]
|
||||||
|
|
||||||
if ".inst" in file.suffixes and ".cfg" in file.suffixes:
|
if ".inst" in file.suffixes and file.suffixes[-1] == ".cfg":
|
||||||
return [Directory(file, settings), Profile(file, settings), Formulas(file, settings)]
|
return [Directory(file, settings), Profile(file, settings), Formulas(file, settings)]
|
||||||
|
|
||||||
if ".def" in file.suffixes and ".json" in file.suffixes:
|
if ".def" in file.suffixes and file.suffixes[-1] == ".json":
|
||||||
if file.stem in ("fdmprinter.def", "fdmextruder.def"):
|
if file.stem in ("fdmprinter.def", "fdmextruder.def"):
|
||||||
return [Formulas(file, settings)]
|
return [Formulas(file, settings)]
|
||||||
return [Directory(file, settings), Definition(file, settings), Formulas(file, settings)]
|
return [Directory(file, settings), Definition(file, settings), Formulas(file, settings)]
|
||||||
|
@ -13,8 +13,11 @@ class Definition(Linter):
|
|||||||
def __init__(self, file: Path, settings: dict) -> None:
|
def __init__(self, file: Path, settings: dict) -> None:
|
||||||
super().__init__(file, settings)
|
super().__init__(file, settings)
|
||||||
self._definitions = {}
|
self._definitions = {}
|
||||||
|
self._definition_name = None
|
||||||
|
self._experimental_settings = []
|
||||||
self._loadDefinitionFiles(file)
|
self._loadDefinitionFiles(file)
|
||||||
self._content = self._file.read_text()
|
self._content = self._file.read_text()
|
||||||
|
self._loadExperimentalSettings()
|
||||||
self._loadBasePrinterSettings()
|
self._loadBasePrinterSettings()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@ -32,6 +35,10 @@ class Definition(Linter):
|
|||||||
for check in self.checkMaterialTemperature():
|
for check in self.checkMaterialTemperature():
|
||||||
yield check
|
yield check
|
||||||
|
|
||||||
|
if self._settings["checks"].get("diagnostic-definition-experimental-setting", False):
|
||||||
|
for check in self.checkExperimentalSetting():
|
||||||
|
yield check
|
||||||
|
|
||||||
# Add other which will yield Diagnostic's
|
# Add other which will yield Diagnostic's
|
||||||
# TODO: A check to determine if the user set value is with the min and max value defined in the parent and doesn't trigger a warning
|
# TODO: A check to determine if the user set value is with the min and max value defined in the parent and doesn't trigger a warning
|
||||||
# TODO: A check if the key exist in the first place
|
# TODO: A check if the key exist in the first place
|
||||||
@ -41,9 +48,8 @@ class Definition(Linter):
|
|||||||
|
|
||||||
def checkRedefineOverride(self) -> Iterator[Diagnostic]:
|
def checkRedefineOverride(self) -> Iterator[Diagnostic]:
|
||||||
""" Checks if definition file overrides its parents settings with the same value. """
|
""" Checks if definition file overrides its parents settings with the same value. """
|
||||||
definition_name = list(self._definitions.keys())[0]
|
definition = self._definitions[self._definition_name]
|
||||||
definition = self._definitions[definition_name]
|
if "overrides" in definition and self._definition_name not in ("fdmprinter", "fdmextruder"):
|
||||||
if "overrides" in definition and definition_name not in ("fdmprinter", "fdmextruder"):
|
|
||||||
for key, value_dict in definition["overrides"].items():
|
for key, value_dict in definition["overrides"].items():
|
||||||
is_redefined, child_key, child_value, parent, inherited_by= self._isDefinedInParent(key, value_dict, definition['inherits'])
|
is_redefined, child_key, child_value, parent, inherited_by= self._isDefinedInParent(key, value_dict, definition['inherits'])
|
||||||
if is_redefined:
|
if is_redefined:
|
||||||
@ -71,9 +77,8 @@ class Definition(Linter):
|
|||||||
|
|
||||||
def checkMaterialTemperature(self) -> Iterator[Diagnostic]:
|
def checkMaterialTemperature(self) -> Iterator[Diagnostic]:
|
||||||
"""Checks if definition file has material tremperature defined within them"""
|
"""Checks if definition file has material tremperature defined within them"""
|
||||||
definition_name = list(self._definitions.keys())[0]
|
definition = self._definitions[self._definition_name]
|
||||||
definition = self._definitions[definition_name]
|
if "overrides" in definition and self._definition_name not in ("fdmprinter", "fdmextruder"):
|
||||||
if "overrides" in definition and definition_name not in ("fdmprinter", "fdmextruder"):
|
|
||||||
for key, value_dict in definition["overrides"].items():
|
for key, value_dict in definition["overrides"].items():
|
||||||
if "temperature" in key and "material" in key:
|
if "temperature" in key and "material" in key:
|
||||||
|
|
||||||
@ -97,6 +102,22 @@ class Definition(Linter):
|
|||||||
replacements=replacements
|
replacements=replacements
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def checkExperimentalSetting(self) -> Iterator[Diagnostic]:
|
||||||
|
"""Checks if definition uses experimental settings"""
|
||||||
|
definition = self._definitions[self._definition_name]
|
||||||
|
if "overrides" in definition and self._definition_name not in ("fdmprinter", "fdmextruder"):
|
||||||
|
for setting in definition["overrides"]:
|
||||||
|
if setting in self._experimental_settings:
|
||||||
|
redefined = re.compile(setting)
|
||||||
|
found = redefined.search(self._content)
|
||||||
|
yield Diagnostic(
|
||||||
|
file=self._file,
|
||||||
|
diagnostic_name="diagnostic-definition-experimental-setting",
|
||||||
|
message=f"Setting {setting} is still experimental and should not be used in default profiles",
|
||||||
|
level="Warning",
|
||||||
|
offset=found.span(0)[0]
|
||||||
|
)
|
||||||
|
|
||||||
def _loadDefinitionFiles(self, definition_file) -> None:
|
def _loadDefinitionFiles(self, definition_file) -> None:
|
||||||
""" Loads definition file contents into self._definitions. Also load parent definition if it exists. """
|
""" Loads definition file contents into self._definitions. Also load parent definition if it exists. """
|
||||||
definition_name = Path(definition_file.stem).stem
|
definition_name = Path(definition_file.stem).stem
|
||||||
@ -104,6 +125,9 @@ class Definition(Linter):
|
|||||||
if not definition_file.exists() or definition_name in self._definitions:
|
if not definition_file.exists() or definition_name in self._definitions:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if self._definition_name is None:
|
||||||
|
self._definition_name = definition_name
|
||||||
|
|
||||||
# Load definition file into dictionary
|
# Load definition file into dictionary
|
||||||
self._definitions[definition_name] = json.loads(definition_file.read_text())
|
self._definitions[definition_name] = json.loads(definition_file.read_text())
|
||||||
|
|
||||||
@ -152,6 +176,12 @@ class Definition(Linter):
|
|||||||
return self._isDefinedInParent(key, value_dict, parent["inherits"])
|
return self._isDefinedInParent(key, value_dict, parent["inherits"])
|
||||||
return False, None, None, None, None
|
return False, None, None, None, None
|
||||||
|
|
||||||
|
def _loadExperimentalSettings(self):
|
||||||
|
try:
|
||||||
|
self._experimental_settings = self._definitions[self.base_def]["settings"]["experimental"]["children"].keys()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
def _loadBasePrinterSettings(self):
|
def _loadBasePrinterSettings(self):
|
||||||
settings = {}
|
settings = {}
|
||||||
for k, v in self._definitions[self.base_def]["settings"].items():
|
for k, v in self._definitions[self.base_def]["settings"].items():
|
||||||
|
@ -146,12 +146,13 @@ class Formulas(Linter):
|
|||||||
|
|
||||||
available_sections = ["values"]
|
available_sections = ["values"]
|
||||||
for section in available_sections:
|
for section in available_sections:
|
||||||
options = config.options(section)
|
if config.has_section(section):
|
||||||
for option in options:
|
options = config.options(section)
|
||||||
values ={}
|
for option in options:
|
||||||
values["value"] = config.get(section, option)
|
values ={}
|
||||||
overrides[option] = values
|
values["value"] = config.get(section, option)
|
||||||
file_data["overrides"]= overrides# Process the value here
|
overrides[option] = values
|
||||||
|
file_data["overrides"]= overrides# Process the value here
|
||||||
|
|
||||||
return file_data
|
return file_data
|
||||||
|
|
||||||
|
@ -37,6 +37,6 @@ class Profile(Linter):
|
|||||||
config = ConfigParser()
|
config = ConfigParser()
|
||||||
config.read([self._file])
|
config.read([self._file])
|
||||||
name_of_profile = config.get("general", "name")
|
name_of_profile = config.get("general", "name")
|
||||||
redefined = re.compile(name_of_profile)
|
redefined = re.compile(re.escape(name_of_profile))
|
||||||
found = redefined.search(self._content)
|
found = redefined.search(self._content)
|
||||||
return name_of_profile, found
|
return name_of_profile, found
|
||||||
|
@ -1342,6 +1342,15 @@
|
|||||||
"limit_to_extruder": "wall_0_extruder_nr",
|
"limit_to_extruder": "wall_0_extruder_nr",
|
||||||
"settable_per_mesh": true
|
"settable_per_mesh": true
|
||||||
},
|
},
|
||||||
|
"z_seam_on_vertex":
|
||||||
|
{
|
||||||
|
"label": "Z Seam On Vertex",
|
||||||
|
"description": "Place the z-seam on a polygon vertex. Switching this off can place the seam between vertices as well. (Keep in mind that this won't override the restrictions on placing the seam on an unsupported overhang.)",
|
||||||
|
"type": "bool",
|
||||||
|
"default_value": true,
|
||||||
|
"settable_per_mesh": true,
|
||||||
|
"enabled": "z_seam_type == 'back' or z_seam_type == 'shortest'"
|
||||||
|
},
|
||||||
"z_seam_position":
|
"z_seam_position":
|
||||||
{
|
{
|
||||||
"label": "Z Seam Position",
|
"label": "Z Seam Position",
|
||||||
@ -8222,6 +8231,19 @@
|
|||||||
"default_value": 90,
|
"default_value": 90,
|
||||||
"settable_per_mesh": true
|
"settable_per_mesh": true
|
||||||
},
|
},
|
||||||
|
"seam_overhang_angle":
|
||||||
|
{
|
||||||
|
"label": "Seam Overhanging Wall Angle",
|
||||||
|
"description": "Try to prevent seams on walls that overhang more than this angle. When the value is 90, no walls will be treated as overhanging.",
|
||||||
|
"unit": "\u00b0",
|
||||||
|
"type": "float",
|
||||||
|
"minimum_value": "0",
|
||||||
|
"minimum_value_warning": "2",
|
||||||
|
"maximum_value": "90",
|
||||||
|
"default_value": 90,
|
||||||
|
"value": "wall_overhang_angle",
|
||||||
|
"settable_per_mesh": true
|
||||||
|
},
|
||||||
"wall_overhang_speed_factor":
|
"wall_overhang_speed_factor":
|
||||||
{
|
{
|
||||||
"label": "Overhanging Wall Speed",
|
"label": "Overhanging Wall Speed",
|
||||||
|
@ -41,6 +41,7 @@ xy_offset_layer_0
|
|||||||
hole_xy_offset
|
hole_xy_offset
|
||||||
hole_xy_offset_max_diameter
|
hole_xy_offset_max_diameter
|
||||||
z_seam_type
|
z_seam_type
|
||||||
|
z_seam_on_vertex
|
||||||
z_seam_position
|
z_seam_position
|
||||||
z_seam_x
|
z_seam_x
|
||||||
z_seam_y
|
z_seam_y
|
||||||
|
Loading…
x
Reference in New Issue
Block a user