mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-14 06:26:06 +08:00
Merge branch 'master' into fs_emboss
This commit is contained in:
commit
bc825ec7d7
@ -1,231 +1,242 @@
|
|||||||
min_slic3r_version = 2.6.0-alpha1
|
min_slic3r_version = 2.6.0-alpha5
|
||||||
1.7.0-alpha0 Added profiles for Print With Smile filaments.
|
1.7.0-alpha2 Updated compatibility condition in some filament profiles (Prusa XL).
|
||||||
1.6.0-alpha2 Added profile for Prusament PETG Carbon Fiber and Fiberthree F3 PA-GF30 Pro. Updated acceleration settings for Prusa MINI.
|
1.7.0-alpha1 Added profiles for Original Prusa XL. Added filament profile for Prusament PETG Tungsten 75%.
|
||||||
1.6.0-alpha1 Updated FW version notification. Decreased min layer time for PLA.
|
min_slic3r_version = 2.6.0-alpha1
|
||||||
1.6.0-alpha0 Default top fill set to monotonic lines. Updated infill/perimeter overlap values. Updated output filename format. Enabled dynamic overhang speeds.
|
1.7.0-alpha0 Added profiles for Print With Smile filaments.
|
||||||
min_slic3r_version = 2.5.0-alpha0
|
1.6.0-alpha2 Added profile for Prusament PETG Carbon Fiber and Fiberthree F3 PA-GF30 Pro. Updated acceleration settings for Prusa MINI.
|
||||||
1.5.7 Added filament profile for Prusament PETG Carbon Fiber and Fiberthree F3 PA-GF30 Pro.
|
1.6.0-alpha1 Updated FW version notification. Decreased min layer time for PLA.
|
||||||
1.5.6 Updated FW version notification (MK2.5/MK3 family). Added filament profile for Kimya PEBA-S.
|
1.6.0-alpha0 Default top fill set to monotonic lines. Updated infill/perimeter overlap values. Updated output filename format. Enabled dynamic overhang speeds.
|
||||||
1.5.5 Added new Prusament Resin material profiles. Enabled g-code thumbnails for MK2.5 family printers.
|
min_slic3r_version = 2.5.1-rc0
|
||||||
1.5.4 Added material profiles for Prusament Resin BioBased60.
|
1.6.2 Updated compatibility condition in some filament profiles (Prusa XL).
|
||||||
1.5.3 Added filament profiles for ColorFabb VarioShore TPU, FormFutura PP, NinjaTek NinjaFlex/Cheetah TPU and for multiple Eolas Prints filaments. Updated bridging settings in 50um and 70um profiles.
|
1.6.1 Added filament profile for Prusament PETG Tungsten 75%. Updated Prusa XL profiles.
|
||||||
1.5.2 Added SLA material profiles.
|
1.6.0 Added Original Prusa XL profiles. Updated acceleration settings for Prusa MINI. Updated infill/perimeter overlap values.
|
||||||
1.5.1 Renamed filament type "NYLON" to "PA". Updated Adura X profile. Updated PETG fan settings for Prusa MINI (removed fan ramp up).
|
min_slic3r_version = 2.5.0-alpha0
|
||||||
1.5.0 Updated arachne parameters. Added profiles for Jessie filaments.
|
1.5.8 Added filament profile for Prusament PETG Tungsten 75%. Updated FW version notification.
|
||||||
1.5.0-alpha1 Added filament profile for Prusament PA11 Carbon Fiber. Added profiles for multiple 3D-Fuel filaments.
|
1.5.7 Added filament profile for Prusament PETG Carbon Fiber and Fiberthree F3 PA-GF30 Pro.
|
||||||
1.5.0-alpha0 Added parameters for Arachne perimeter generator. Changed default seam position. Updated output filename format.
|
1.5.6 Updated FW version notification (MK2.5/MK3 family). Added filament profile for Kimya PEBA-S.
|
||||||
min_slic3r_version = 2.4.0-rc
|
1.5.5 Added new Prusament Resin material profiles. Enabled g-code thumbnails for MK2.5 family printers.
|
||||||
1.4.9 Updated FW version notification.
|
1.5.4 Added material profiles for Prusament Resin BioBased60.
|
||||||
1.4.8 Added filament and SLA material profiles. Updated settings.
|
1.5.3 Added filament profiles for ColorFabb VarioShore TPU, FormFutura PP, NinjaTek NinjaFlex/Cheetah TPU and for multiple Eolas Prints filaments. Updated bridging settings in 50um and 70um profiles.
|
||||||
1.4.7 Added filament profile for Prusament PA11 Carbon Fiber. Added profiles for multiple 3D-Fuel filaments.
|
1.5.2 Added SLA material profiles.
|
||||||
1.4.6 Added SLA materials. Updated filament profiles.
|
1.5.1 Renamed filament type "NYLON" to "PA". Updated Adura X profile. Updated PETG fan settings for Prusa MINI (removed fan ramp up).
|
||||||
1.4.5 Added MMU2/S profiles for 0.25mm nozzle. Updated FW version. Enabled g-code thumbnails for MK3 family printers. Updated end g-code.
|
1.5.0 Updated arachne parameters. Added profiles for Jessie filaments.
|
||||||
1.4.4 Added multiple Fiberlogy filament profiles. Updated Extrudr filament profiles.
|
1.5.0-alpha1 Added filament profile for Prusament PA11 Carbon Fiber. Added profiles for multiple 3D-Fuel filaments.
|
||||||
1.4.3 Added new filament profiles and SLA materials.
|
1.5.0-alpha0 Added parameters for Arachne perimeter generator. Changed default seam position. Updated output filename format.
|
||||||
1.4.2 Added SLA material profiles.
|
min_slic3r_version = 2.4.0-rc
|
||||||
1.4.1 Updated firmware version.
|
1.4.10 Updated FW version notification.
|
||||||
1.4.0 Updated for the PrusaSlicer 2.4.0-rc release. Updated SLA material colors.
|
1.4.9 Updated FW version notification.
|
||||||
min_slic3r_version = 2.4.0-beta2
|
1.4.8 Added filament and SLA material profiles. Updated settings.
|
||||||
1.4.0-beta3 Added material profiles for Prusament Resins.
|
1.4.7 Added filament profile for Prusament PA11 Carbon Fiber. Added profiles for multiple 3D-Fuel filaments.
|
||||||
1.4.0-beta2 Added SLA material colors. Updated BASF filament profiles.
|
1.4.6 Added SLA materials. Updated filament profiles.
|
||||||
min_slic3r_version = 2.4.0-beta0
|
1.4.5 Added MMU2/S profiles for 0.25mm nozzle. Updated FW version. Enabled g-code thumbnails for MK3 family printers. Updated end g-code.
|
||||||
1.4.0-beta1 Updated pad wall slope angle for SLA printers. Updated Filatech Filacarbon profile for Prusa MINI.
|
1.4.4 Added multiple Fiberlogy filament profiles. Updated Extrudr filament profiles.
|
||||||
1.4.0-beta0 Added multiple Filatech and BASF filament profiles. Added material profiles for SL1S.
|
1.4.3 Added new filament profiles and SLA materials.
|
||||||
min_slic3r_version = 2.4.0-alpha0
|
1.4.2 Added SLA material profiles.
|
||||||
1.4.0-alpha8 Added material profiles for Prusament Resin. Detect bridging perimeters enabled by default.
|
1.4.1 Updated firmware version.
|
||||||
1.4.0-alpha7 Updated brim_separation value. Updated Prusa MINI end g-code. Added Filamentworld filament profiles.
|
1.4.0 Updated for the PrusaSlicer 2.4.0-rc release. Updated SLA material colors.
|
||||||
1.4.0-alpha6 Added nozzle priming after M600. Added nozzle diameter checks for 0.8 nozzle printer profiles. Updated FW version. Increased number of top solid infill layers (0.2 layer height).
|
min_slic3r_version = 2.4.0-beta2
|
||||||
1.4.0-alpha5 Added multiple add:north and Extrudr filament profiles. Updated support head settings (SL1S).
|
1.4.0-beta3 Added material profiles for Prusament Resins.
|
||||||
1.4.0-alpha4 Decreased Area Fill (SL1S).
|
1.4.0-beta2 Added SLA material colors. Updated BASF filament profiles.
|
||||||
1.4.0-alpha3 Updated SL1S tilt times.
|
min_slic3r_version = 2.4.0-beta0
|
||||||
1.4.0-alpha2 Updated Prusa MINI machine limits.
|
1.4.0-beta1 Updated pad wall slope angle for SLA printers. Updated Filatech Filacarbon profile for Prusa MINI.
|
||||||
1.4.0-alpha1 Added new SL1S resin profiles.
|
1.4.0-beta0 Added multiple Filatech and BASF filament profiles. Added material profiles for SL1S.
|
||||||
1.4.0-alpha0 Bumped up config version.
|
min_slic3r_version = 2.4.0-alpha0
|
||||||
1.3.0-alpha2 Added SL1S SPEED profiles.
|
1.4.0-alpha8 Added material profiles for Prusament Resin. Detect bridging perimeters enabled by default.
|
||||||
1.3.0-alpha1 Added Prusament PCCF. Increased travel acceleration for Prusa MINI. Updated start g-code for Prusa MINI. Added multiple add:north and Extrudr filament profiles. Updated Z travel speed values.
|
1.4.0-alpha7 Updated brim_separation value. Updated Prusa MINI end g-code. Added Filamentworld filament profiles.
|
||||||
1.3.0-alpha0 Disabled thick bridges, updated support settings.
|
1.4.0-alpha6 Added nozzle priming after M600. Added nozzle diameter checks for 0.8 nozzle printer profiles. Updated FW version. Increased number of top solid infill layers (0.2 layer height).
|
||||||
min_slic3r_version = 2.3.2-alpha0
|
1.4.0-alpha5 Added multiple add:north and Extrudr filament profiles. Updated support head settings (SL1S).
|
||||||
1.3.8 Updated FW version notification.
|
1.4.0-alpha4 Decreased Area Fill (SL1S).
|
||||||
1.3.7 Updated firmware version.
|
1.4.0-alpha3 Updated SL1S tilt times.
|
||||||
1.3.6 Updated firmware version.
|
1.4.0-alpha2 Updated Prusa MINI machine limits.
|
||||||
1.3.5 Added material profiles for Prusament Resins.
|
1.4.0-alpha1 Added new SL1S resin profiles.
|
||||||
1.3.4 Added material profiles for new Prusament Resins. Added profiles for multiple BASF filaments.
|
1.4.0-alpha0 Bumped up config version.
|
||||||
1.3.3 Added multiple profiles for Filatech filaments. Added material profiles for SL1S SPEED. Updated SLA print settings.
|
1.3.0-alpha2 Added SL1S SPEED profiles.
|
||||||
1.3.2 Added material profiles for Prusament Resin.
|
1.3.0-alpha1 Added Prusament PCCF. Increased travel acceleration for Prusa MINI. Updated start g-code for Prusa MINI. Added multiple add:north and Extrudr filament profiles. Updated Z travel speed values.
|
||||||
1.3.1 Added multiple add:north and Extrudr filament profiles. Updated support head settings (SL1S).
|
1.3.0-alpha0 Disabled thick bridges, updated support settings.
|
||||||
1.3.0 Added SL1S SPEED profiles.
|
min_slic3r_version = 2.3.2-alpha0
|
||||||
min_slic3r_version = 2.3.0-rc1
|
1.3.9 Updated FW version notification.
|
||||||
1.2.13 Updated FW version notification.
|
1.3.8 Updated FW version notification.
|
||||||
1.2.12 Updated firmware version.
|
1.3.7 Updated firmware version.
|
||||||
1.2.11 Updated firmware version.
|
1.3.6 Updated firmware version.
|
||||||
1.2.10 Added multiple profiles for Filatech filaments. Updated SLA print settings (pad wall slope angle).
|
1.3.5 Added material profiles for Prusament Resins.
|
||||||
1.2.9 Added material profiles for Prusament Resin.
|
1.3.4 Added material profiles for new Prusament Resins. Added profiles for multiple BASF filaments.
|
||||||
1.2.8 Added multiple add:north and Extrudr filament profiles.
|
1.3.3 Added multiple profiles for Filatech filaments. Added material profiles for SL1S SPEED. Updated SLA print settings.
|
||||||
1.2.7 Updated "Prusament PC Blend Carbon Fiber" profile for Prusa MINI.
|
1.3.2 Added material profiles for Prusament Resin.
|
||||||
1.2.6 Added filament profile for "Prusament PC Blend Carbon Fiber".
|
1.3.1 Added multiple add:north and Extrudr filament profiles. Updated support head settings (SL1S).
|
||||||
1.2.5 Updated firmware version. Added filament profiles. Various improvements.
|
1.3.0 Added SL1S SPEED profiles.
|
||||||
1.2.4 Updated cost/density values in filament settings. Various changes in print settings.
|
min_slic3r_version = 2.3.0-rc1
|
||||||
1.2.3 Updated firmware version. Updated end g-code in MMU2 printer profiles.
|
1.2.14 Updated FW version notification.
|
||||||
1.2.2 Added Prusament PVB filament profile. Added 0.8mm nozzle profiles.
|
1.2.13 Updated FW version notification.
|
||||||
1.2.1 Updated FW version for MK2.5 family printers.
|
1.2.12 Updated firmware version.
|
||||||
1.2.0 Added full_fan_speed_layer value for PETG. Increased support interface spacing for 0.6mm nozzle profiles. Updated firmware version.
|
1.2.11 Updated firmware version.
|
||||||
min_slic3r_version = 2.3.0-beta2
|
1.2.10 Added multiple profiles for Filatech filaments. Updated SLA print settings (pad wall slope angle).
|
||||||
1.2.0-beta1 Updated end g-code. Added full_fan_speed_layer values.
|
1.2.9 Added material profiles for Prusament Resin.
|
||||||
min_slic3r_version = 2.3.0-beta0
|
1.2.8 Added multiple add:north and Extrudr filament profiles.
|
||||||
1.2.0-beta0 Adjusted infill anchor limits. Added filament spool weights.
|
1.2.7 Updated "Prusament PC Blend Carbon Fiber" profile for Prusa MINI.
|
||||||
min_slic3r_version = 2.3.0-alpha4
|
1.2.6 Added filament profile for "Prusament PC Blend Carbon Fiber".
|
||||||
1.2.0-alpha1 Renamed MK3S and MINI printer profiles. Updated end g-code (MINI). Added new SLA materials and filament profiles.
|
1.2.5 Updated firmware version. Added filament profiles. Various improvements.
|
||||||
1.2.0-alpha0 Added filament spool weights
|
1.2.4 Updated cost/density values in filament settings. Various changes in print settings.
|
||||||
min_slic3r_version = 2.2.0-alpha3
|
1.2.3 Updated firmware version. Updated end g-code in MMU2 printer profiles.
|
||||||
1.1.17 Updated FW version notification.
|
1.2.2 Added Prusament PVB filament profile. Added 0.8mm nozzle profiles.
|
||||||
1.1.16 Updated firmware version.
|
1.2.1 Updated FW version for MK2.5 family printers.
|
||||||
1.1.15 Updated firmware version.
|
1.2.0 Added full_fan_speed_layer value for PETG. Increased support interface spacing for 0.6mm nozzle profiles. Updated firmware version.
|
||||||
1.1.14 Updated firmware version.
|
min_slic3r_version = 2.3.0-beta2
|
||||||
1.1.13 Updated firmware version. Updated end g-code in MMU2 printer profiles.
|
1.2.0-beta1 Updated end g-code. Added full_fan_speed_layer values.
|
||||||
1.1.12 Added Prusament PVB filament profile. Added 0.8mm nozzle profiles.
|
min_slic3r_version = 2.3.0-beta0
|
||||||
1.1.11 Renamed MK3S and MINI printer profiles. Updated end g-code (MINI). Added new SLA materials and filament profiles.
|
1.2.0-beta0 Adjusted infill anchor limits. Added filament spool weights.
|
||||||
1.1.10 Updated firmware version.
|
min_slic3r_version = 2.3.0-alpha4
|
||||||
1.1.9 Updated K values in filament profiles (linear advance). Added new filament profiles and SLA materials.
|
1.2.0-alpha1 Renamed MK3S and MINI printer profiles. Updated end g-code (MINI). Added new SLA materials and filament profiles.
|
||||||
1.1.8 Updated start/end g-code scripts for MK3 family printer profiles (reduced extruder motor current for some print profiles). Added new filament and SLA material profiles.
|
1.2.0-alpha0 Added filament spool weights
|
||||||
1.1.7 Updated end g-code for MMU2 Single printer profiles. Added/updated filament and SLA material profiles.
|
min_slic3r_version = 2.2.0-alpha3
|
||||||
1.1.6 Updated firmware version for MK2.5/S and MK3/S.
|
1.1.17 Updated FW version notification.
|
||||||
1.1.5 Updated MMU1 specific retraction settings for Prusament PC Blend
|
1.1.16 Updated firmware version.
|
||||||
1.1.4 Added Prusament PC Blend filament profile.
|
1.1.15 Updated firmware version.
|
||||||
1.1.3 Added SLA material and filament profile
|
1.1.14 Updated firmware version.
|
||||||
1.1.2 Added renamed_from fields for PETG filaments to indicate that they were renamed from PET.
|
1.1.13 Updated firmware version. Updated end g-code in MMU2 printer profiles.
|
||||||
1.1.1 Added Verbatim and Fiberlogy PETG filament profiles. Updated auto cooling settings for ABS.
|
1.1.12 Added Prusament PVB filament profile. Added 0.8mm nozzle profiles.
|
||||||
1.1.1-beta Updated for PrusaSlicer 2.2.0-beta
|
1.1.11 Renamed MK3S and MINI printer profiles. Updated end g-code (MINI). Added new SLA materials and filament profiles.
|
||||||
1.1.1-alpha4 Extended list of default filaments to be installed, top/bottom_solid_min_thickness defined, infill_acceleration changed etc
|
1.1.10 Updated firmware version.
|
||||||
1.1.1-alpha3 Print bed textures are now configurable from the Preset Bundle. Requires PrusaSlicer 2.2.0-alpha3 and newer.
|
1.1.9 Updated K values in filament profiles (linear advance). Added new filament profiles and SLA materials.
|
||||||
# The following line (max_slic3r_version) forces the users of PrusaSlicer 2.2.0-alpha3 and newer to update the profiles to 1.1.1-alpha3 and newer,
|
1.1.8 Updated start/end g-code scripts for MK3 family printer profiles (reduced extruder motor current for some print profiles). Added new filament and SLA material profiles.
|
||||||
# so they will see the print bed.
|
1.1.7 Updated end g-code for MMU2 Single printer profiles. Added/updated filament and SLA material profiles.
|
||||||
max_slic3r_version = 2.2.0-alpha2
|
1.1.6 Updated firmware version for MK2.5/S and MK3/S.
|
||||||
min_slic3r_version = 2.2.0-alpha0
|
1.1.5 Updated MMU1 specific retraction settings for Prusament PC Blend
|
||||||
1.1.1-alpha2 Bumped up config version, so our in house customer will get updated profiles.
|
1.1.4 Added Prusament PC Blend filament profile.
|
||||||
1.1.0 Filament aliases, Creality profiles and other goodies for PrusaSlicer 2.2.0-alpha0
|
1.1.3 Added SLA material and filament profile
|
||||||
min_slic3r_version = 2.1.1-beta0
|
1.1.2 Added renamed_from fields for PETG filaments to indicate that they were renamed from PET.
|
||||||
1.0.13 Updated FW version notification.
|
1.1.1 Added Verbatim and Fiberlogy PETG filament profiles. Updated auto cooling settings for ABS.
|
||||||
1.0.12 Updated firmware version.
|
1.1.1-beta Updated for PrusaSlicer 2.2.0-beta
|
||||||
1.0.11 Updated firmware version.
|
1.1.1-alpha4 Extended list of default filaments to be installed, top/bottom_solid_min_thickness defined, infill_acceleration changed etc
|
||||||
1.0.10 Updated firmware version for MK2.5/S and MK3/S.
|
1.1.1-alpha3 Print bed textures are now configurable from the Preset Bundle. Requires PrusaSlicer 2.2.0-alpha3 and newer.
|
||||||
1.0.9 Updated firmware version for MK2.5/S and MK3/S.
|
# The following line (max_slic3r_version) forces the users of PrusaSlicer 2.2.0-alpha3 and newer to update the profiles to 1.1.1-alpha3 and newer,
|
||||||
1.0.8 Various changes in FFF profiles, new filaments/materials added. See changelog.
|
# so they will see the print bed.
|
||||||
1.0.7 Updated layer height limits for MINI
|
max_slic3r_version = 2.2.0-alpha2
|
||||||
1.0.6 Added Prusa MINI profiles
|
min_slic3r_version = 2.2.0-alpha0
|
||||||
min_slic3r_version = 2.1.0-alpha0
|
1.1.1-alpha2 Bumped up config version, so our in house customer will get updated profiles.
|
||||||
1.0.5 Added SLA materials
|
1.1.0 Filament aliases, Creality profiles and other goodies for PrusaSlicer 2.2.0-alpha0
|
||||||
1.0.4 Updated firmware version and 0.25mm nozzle profiles
|
min_slic3r_version = 2.1.1-beta0
|
||||||
1.0.3 Added filament profiles
|
1.0.13 Updated FW version notification.
|
||||||
1.0.2 Added SLA materials
|
1.0.12 Updated firmware version.
|
||||||
1.0.1 Updated MK3 firmware version check to 3.8.0, new soluble support profiles for 0.6mm nozzle diameter MMU2S printers.
|
1.0.11 Updated firmware version.
|
||||||
1.0.0 Updated end G-code for the MMU2 profiles to lift the extruder at the end of print. Wipe tower bridging distance was made smaller for soluble supports.
|
1.0.10 Updated firmware version for MK2.5/S and MK3/S.
|
||||||
1.0.0-beta1 Updated color for the ASA filaments to differ from the other filaments. Single extruder printers now have no extruder color assigned, obects and toolpaths will be colored with the color of the active filament.
|
1.0.9 Updated firmware version for MK2.5/S and MK3/S.
|
||||||
1.0.0-beta0 Printer model checks in start G-codes, ASA filament profiles, limits on min / max SL1 exposition times
|
1.0.8 Various changes in FFF profiles, new filaments/materials added. See changelog.
|
||||||
1.0.0-alpha2 Printer model and nozzle diameter check
|
1.0.7 Updated layer height limits for MINI
|
||||||
1.0.0-alpha1 Added Prusament ASA profile
|
1.0.6 Added Prusa MINI profiles
|
||||||
1.0.0-alpha0 Filament specific retract for PET and similar copolymers, and for FLEX
|
min_slic3r_version = 2.1.0-alpha0
|
||||||
min_slic3r_version = 1.42.0-alpha6
|
1.0.5 Added SLA materials
|
||||||
0.8.11 Updated firmware version.
|
1.0.4 Updated firmware version and 0.25mm nozzle profiles
|
||||||
0.8.10 Updated firmware version.
|
1.0.3 Added filament profiles
|
||||||
0.8.9 Updated firmware version for MK2.5/S and MK3/S.
|
1.0.2 Added SLA materials
|
||||||
0.8.8 Updated firmware version for MK2.5/S and MK3/S.
|
1.0.1 Updated MK3 firmware version check to 3.8.0, new soluble support profiles for 0.6mm nozzle diameter MMU2S printers.
|
||||||
0.8.7 Updated firmware version
|
1.0.0 Updated end G-code for the MMU2 profiles to lift the extruder at the end of print. Wipe tower bridging distance was made smaller for soluble supports.
|
||||||
0.8.6 Updated firmware version for MK2.5/S and MK3/S
|
1.0.0-beta1 Updated color for the ASA filaments to differ from the other filaments. Single extruder printers now have no extruder color assigned, obects and toolpaths will be colored with the color of the active filament.
|
||||||
0.8.5 Updated SL1 printer and material settings
|
1.0.0-beta0 Printer model checks in start G-codes, ASA filament profiles, limits on min / max SL1 exposition times
|
||||||
0.8.4 Added Prusament ASA profile
|
1.0.0-alpha2 Printer model and nozzle diameter check
|
||||||
0.8.3 FW version and SL1 materials update
|
1.0.0-alpha1 Added Prusament ASA profile
|
||||||
0.8.2 FFF and SL1 settings update
|
1.0.0-alpha0 Filament specific retract for PET and similar copolymers, and for FLEX
|
||||||
0.8.1 Output settings and SLA materials update
|
min_slic3r_version = 1.42.0-alpha6
|
||||||
0.8.0 Updated for the PrusaSlicer 2.0.0 final release
|
0.8.11 Updated firmware version.
|
||||||
0.8.0-rc2 Updated firmware versions for MK2.5/S and MK3/S
|
0.8.10 Updated firmware version.
|
||||||
0.8.0-rc1 Updated SLA profiles
|
0.8.9 Updated firmware version for MK2.5/S and MK3/S.
|
||||||
0.8.0-rc Updated for the PrusaSlicer 2.0.0-rc release
|
0.8.8 Updated firmware version for MK2.5/S and MK3/S.
|
||||||
0.8.0-beta4 Updated SLA profiles
|
0.8.7 Updated firmware version
|
||||||
0.8.0-beta3 Updated SLA profiles
|
0.8.6 Updated firmware version for MK2.5/S and MK3/S
|
||||||
0.8.0-beta2 Updated SLA profiles
|
0.8.5 Updated SL1 printer and material settings
|
||||||
0.8.0-beta1 Updated SLA profiles
|
0.8.4 Added Prusament ASA profile
|
||||||
0.8.0-beta Updated SLA profiles
|
0.8.3 FW version and SL1 materials update
|
||||||
0.8.0-alpha9 Updated SLA and FFF profiles
|
0.8.2 FFF and SL1 settings update
|
||||||
0.8.0-alpha8 Updated SLA profiles
|
0.8.1 Output settings and SLA materials update
|
||||||
0.8.0-alpha7 Updated SLA profiles
|
0.8.0 Updated for the PrusaSlicer 2.0.0 final release
|
||||||
0.8.0-alpha6 Updated SLA profiles
|
0.8.0-rc2 Updated firmware versions for MK2.5/S and MK3/S
|
||||||
min_slic3r_version = 1.42.0-alpha
|
0.8.0-rc1 Updated SLA profiles
|
||||||
0.8.0-alpha Updated SLA profiles
|
0.8.0-rc Updated for the PrusaSlicer 2.0.0-rc release
|
||||||
0.4.0-alpha4 Updated SLA profiles
|
0.8.0-beta4 Updated SLA profiles
|
||||||
0.4.0-alpha3 Update of SLA profiles
|
0.8.0-beta3 Updated SLA profiles
|
||||||
0.4.0-alpha2 First SLA profiles
|
0.8.0-beta2 Updated SLA profiles
|
||||||
min_slic3r_version = 1.41.3-alpha
|
0.8.0-beta1 Updated SLA profiles
|
||||||
0.4.12 Updated firmware version for MK2.5/S and MK3/S.
|
0.8.0-beta Updated SLA profiles
|
||||||
0.4.11 Updated firmware version for MK2.5/S and MK3/S.
|
0.8.0-alpha9 Updated SLA and FFF profiles
|
||||||
0.4.10 Updated firmware version
|
0.8.0-alpha8 Updated SLA profiles
|
||||||
0.4.9 Updated firmware version for MK2.5/S and MK3/S
|
0.8.0-alpha7 Updated SLA profiles
|
||||||
0.4.8 MK2.5/3/S FW update
|
0.8.0-alpha6 Updated SLA profiles
|
||||||
0.4.7 MK2/S/MMU FW update
|
min_slic3r_version = 1.42.0-alpha
|
||||||
0.4.6 Updated firmware versions for MK2.5/S and MK3/S
|
0.8.0-alpha Updated SLA profiles
|
||||||
0.4.5 Enabled remaining time support for MK2/S/MMU1
|
0.4.0-alpha4 Updated SLA profiles
|
||||||
0.4.4 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt
|
0.4.0-alpha3 Update of SLA profiles
|
||||||
0.4.3 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt
|
0.4.0-alpha2 First SLA profiles
|
||||||
0.4.2 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt
|
min_slic3r_version = 1.41.3-alpha
|
||||||
0.4.1 New MK2.5S and MK3S FW versions
|
0.4.12 Updated firmware version for MK2.5/S and MK3/S.
|
||||||
0.4.0 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt
|
0.4.11 Updated firmware version for MK2.5/S and MK3/S.
|
||||||
min_slic3r_version = 1.41.1
|
0.4.10 Updated firmware version
|
||||||
0.3.11 Updated firmware version for MK2.5/S and MK3/S.
|
0.4.9 Updated firmware version for MK2.5/S and MK3/S
|
||||||
0.3.10 Updated firmware version
|
0.4.8 MK2.5/3/S FW update
|
||||||
0.3.9 Updated firmware version for MK2.5/S and MK3/S
|
0.4.7 MK2/S/MMU FW update
|
||||||
0.3.8 MK2.5/3/S FW update
|
0.4.6 Updated firmware versions for MK2.5/S and MK3/S
|
||||||
0.3.7 MK2/S/MMU FW update
|
0.4.5 Enabled remaining time support for MK2/S/MMU1
|
||||||
0.3.6 Updated firmware versions for MK2.5 and MK3
|
0.4.4 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt
|
||||||
0.3.5 New MK2.5 and MK3 FW versions
|
0.4.3 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt
|
||||||
0.3.4 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt
|
0.4.2 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt
|
||||||
0.3.3 Prusament PETG released
|
0.4.1 New MK2.5S and MK3S FW versions
|
||||||
0.3.2 New MK2.5 and MK3 FW versions
|
0.4.0 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt
|
||||||
0.3.1 New MK2.5 and MK3 FW versions
|
min_slic3r_version = 1.41.1
|
||||||
0.3.0 New MK2.5 and MK3 FW version
|
0.3.11 Updated firmware version for MK2.5/S and MK3/S.
|
||||||
min_slic3r_version = 1.41.0-alpha
|
0.3.10 Updated firmware version
|
||||||
0.2.9 New MK2.5 and MK3 FW versions
|
0.3.9 Updated firmware version for MK2.5/S and MK3/S
|
||||||
0.2.8 New MK2.5 and MK3 FW version
|
0.3.8 MK2.5/3/S FW update
|
||||||
min_slic3r_version = 1.41.1
|
0.3.7 MK2/S/MMU FW update
|
||||||
0.2.7 New MK2.5 and MK3 FW version
|
0.3.6 Updated firmware versions for MK2.5 and MK3
|
||||||
0.2.6 Added MMU2 MK2.5 settings
|
0.3.5 New MK2.5 and MK3 FW versions
|
||||||
min_slic3r_version = 1.41.0-alpha
|
0.3.4 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt
|
||||||
0.2.5 Prusament is out - added prusament settings
|
0.3.3 Prusament PETG released
|
||||||
0.2.4 Added soluble support profiles for MMU2
|
0.3.2 New MK2.5 and MK3 FW versions
|
||||||
0.2.3 Added materials for MMU2 single mode, edited MK3 xy stealth feedrate limit
|
0.3.1 New MK2.5 and MK3 FW versions
|
||||||
0.2.2 Edited MMU2 Single mode purge line
|
0.3.0 New MK2.5 and MK3 FW version
|
||||||
0.2.1 Added PET and BVOH settings for MMU2
|
min_slic3r_version = 1.41.0-alpha
|
||||||
0.2.0-beta5 Fixed MMU1 ramming parameters
|
0.2.9 New MK2.5 and MK3 FW versions
|
||||||
0.2.0-beta4 Added filament loading speed at start, increased minimal purge on wipe tower
|
0.2.8 New MK2.5 and MK3 FW version
|
||||||
0.2.0-beta3 Edited ramming parameters and filament cooling moves for MMU2
|
min_slic3r_version = 1.41.1
|
||||||
0.2.0-beta2 Edited first layer speed and wipe tower position
|
0.2.7 New MK2.5 and MK3 FW version
|
||||||
0.2.0-beta Removed limit on the MK3MMU2 height, added legacy M204 S T format to the MK2 profiles
|
0.2.6 Added MMU2 MK2.5 settings
|
||||||
0.2.0-alpha8 Added filament_load/unload_time for the PLA/ABS MMU2 filament presets.
|
min_slic3r_version = 1.41.0-alpha
|
||||||
0.2.0-alpha7 Vojtech's fix the incorrect *MK3* references
|
0.2.5 Prusament is out - added prusament settings
|
||||||
0.2.0-alpha6 Jindra's way to fix the 0.2.0-alpha5 version
|
0.2.4 Added soluble support profiles for MMU2
|
||||||
0.2.0-alpha5 Bumped up firmware versions for MK2.5/MK3 to 3.3.1, disabled priming areas for MK3MMU2
|
0.2.3 Added materials for MMU2 single mode, edited MK3 xy stealth feedrate limit
|
||||||
0.2.0-alpha4 Extended the custom start/end G-codes of the MMU2.0 printers for no priming towers.
|
0.2.2 Edited MMU2 Single mode purge line
|
||||||
0.2.0-alpha3 Adjusted machine limits for time estimates, added filament density and cost
|
0.2.1 Added PET and BVOH settings for MMU2
|
||||||
0.2.0-alpha2 Renamed the key MK3SMMU to MK3MMU2, added a generic PLA MMU2 material
|
0.2.0-beta5 Fixed MMU1 ramming parameters
|
||||||
0.2.0-alpha1 added initial profiles for the i3 MK3 Multi Material Upgrade 2.0
|
0.2.0-beta4 Added filament loading speed at start, increased minimal purge on wipe tower
|
||||||
0.2.0-alpha moved machine limits from the start G-code to the new print profile parameters
|
0.2.0-beta3 Edited ramming parameters and filament cooling moves for MMU2
|
||||||
min_slic3r_version = 1.40.0
|
0.2.0-beta2 Edited first layer speed and wipe tower position
|
||||||
0.1.18 Updated firmware version
|
0.2.0-beta Removed limit on the MK3MMU2 height, added legacy M204 S T format to the MK2 profiles
|
||||||
0.1.17 Updated firmware version for MK2.5/S and MK3/S
|
0.2.0-alpha8 Added filament_load/unload_time for the PLA/ABS MMU2 filament presets.
|
||||||
0.1.16 MK2.5/3/S FW update
|
0.2.0-alpha7 Vojtech's fix the incorrect *MK3* references
|
||||||
0.1.15 MK2/S/MMU FW update
|
0.2.0-alpha6 Jindra's way to fix the 0.2.0-alpha5 version
|
||||||
0.1.14 Updated firmware versions for MK2.5 and MK3
|
0.2.0-alpha5 Bumped up firmware versions for MK2.5/MK3 to 3.3.1, disabled priming areas for MK3MMU2
|
||||||
0.1.13 New MK2.5 and MK3 FW versions
|
0.2.0-alpha4 Extended the custom start/end G-codes of the MMU2.0 printers for no priming towers.
|
||||||
0.1.12 New MK2.5 and MK3 FW versions
|
0.2.0-alpha3 Adjusted machine limits for time estimates, added filament density and cost
|
||||||
0.1.11 fw version changed to 3.3.1
|
0.2.0-alpha2 Renamed the key MK3SMMU to MK3MMU2, added a generic PLA MMU2 material
|
||||||
0.1.10 MK3 jerk and acceleration update
|
0.2.0-alpha1 added initial profiles for the i3 MK3 Multi Material Upgrade 2.0
|
||||||
0.1.9 edited support extrusion width for 0.25 and 0.6 nozzles
|
0.2.0-alpha moved machine limits from the start G-code to the new print profile parameters
|
||||||
0.1.8 extrusion width for 0,25, 0.6 and variable layer height fixes
|
min_slic3r_version = 1.40.0
|
||||||
0.1.7 Fixed errors in 0.25mm and 0.6mm profiles
|
0.1.18 Updated firmware version
|
||||||
0.1.6 Split the MK2.5 profile from the MK2S
|
0.1.17 Updated firmware version for MK2.5/S and MK3/S
|
||||||
min_slic3r_version = 1.40.0-beta
|
0.1.16 MK2.5/3/S FW update
|
||||||
0.1.5 fixed printer_variant fields for the i3 MK3 0.25 and 0.6mm nozzles
|
0.1.15 MK2/S/MMU FW update
|
||||||
0.1.4 edited fw version, added z-raise after print
|
0.1.14 Updated firmware versions for MK2.5 and MK3
|
||||||
min_slic3r_version = 1.40.0-alpha
|
0.1.13 New MK2.5 and MK3 FW versions
|
||||||
0.1.3 Fixed an incorrect position of the max_print_height parameter
|
0.1.12 New MK2.5 and MK3 FW versions
|
||||||
0.1.2 Wipe tower changes
|
0.1.11 fw version changed to 3.3.1
|
||||||
0.1.1 Minor print speed adjustments
|
0.1.10 MK3 jerk and acceleration update
|
||||||
0.1.0 Initial
|
0.1.9 edited support extrusion width for 0.25 and 0.6 nozzles
|
||||||
|
0.1.8 extrusion width for 0,25, 0.6 and variable layer height fixes
|
||||||
|
0.1.7 Fixed errors in 0.25mm and 0.6mm profiles
|
||||||
|
0.1.6 Split the MK2.5 profile from the MK2S
|
||||||
|
min_slic3r_version = 1.40.0-beta
|
||||||
|
0.1.5 fixed printer_variant fields for the i3 MK3 0.25 and 0.6mm nozzles
|
||||||
|
0.1.4 edited fw version, added z-raise after print
|
||||||
|
min_slic3r_version = 1.40.0-alpha
|
||||||
|
0.1.3 Fixed an incorrect position of the max_print_height parameter
|
||||||
|
0.1.2 Wipe tower changes
|
||||||
|
0.1.1 Minor print speed adjustments
|
||||||
|
0.1.0 Initial
|
||||||
|
File diff suppressed because it is too large
Load Diff
BIN
resources/profiles/PrusaResearch/XL_thumbnail.png
Normal file
BIN
resources/profiles/PrusaResearch/XL_thumbnail.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 63 KiB |
123
resources/profiles/PrusaResearch/xl.svg
Normal file
123
resources/profiles/PrusaResearch/xl.svg
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="360mm" height="360mm" viewBox="0 0 1020.5 1020.5">
|
||||||
|
<rect width="1020.5" height="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 5.7px;"/>
|
||||||
|
<g>
|
||||||
|
<rect width="1020.5" height="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="992.1" x2="1020.5" y2="992.1" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="954" y1="963.8" x2="1020.5" y2="963.8" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="963.8" x2="576.3" y2="963.8" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="935.4" x2="1020.5" y2="935.4" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="907.1" x2="1020.5" y2="907.1" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="878.7" x2="1020.5" y2="878.7" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="850.4" x2="1020.5" y2="850.4" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="822" x2="1020.5" y2="822" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="793.7" x2="1020.5" y2="793.7" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="765.4" x2="1020.5" y2="765.4" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="737" x2="1020.5" y2="737" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="708.7" x2="1020.5" y2="708.7" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="680.3" x2="1020.5" y2="680.3" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="652" x2="1020.5" y2="652" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="623.6" x2="1020.5" y2="623.6" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="595.3" x2="1020.5" y2="595.3" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="566.9" x2="1020.5" y2="566.9" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="538.6" x2="1020.5" y2="538.6" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="510.2" x2="1020.5" y2="510.2" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="481.9" x2="1020.5" y2="481.9" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="453.5" x2="1020.5" y2="453.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="425.2" x2="1020.5" y2="425.2" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="396.9" x2="1020.5" y2="396.9" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="368.5" x2="1020.5" y2="368.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="340.2" x2="1020.5" y2="340.2" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="311.8" x2="1020.5" y2="311.8" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="283.5" x2="1020.5" y2="283.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="255.1" x2="1020.5" y2="255.1" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="226.8" x2="1020.5" y2="226.8" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="198.4" x2="1020.5" y2="198.4" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="170.1" x2="1020.5" y2="170.1" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="141.7" x2="1020.5" y2="141.7" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="113.4" x2="1020.5" y2="113.4" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="85" x2="1020.5" y2="85" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="56.7" x2="1020.5" y2="56.7" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line y1="28.3" x2="1020.5" y2="28.3" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="992.1" x2="992.1" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="963.8" x2="963.8" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="935.4" y1="984.3" x2="935.4" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="935.4" x2="935.4" y2="944.9" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="907.1" y1="984.3" x2="907.1" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="907.1" x2="907.1" y2="944.9" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="878.8" y1="984.3" x2="878.7" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="878.7" x2="878.7" y2="944.9" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="850.5" y1="984.3" x2="850.4" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="850.4" x2="850.4" y2="944.9" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="822.1" y1="984.3" x2="822" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="822" x2="822" y2="944.9" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="793.8" y1="984.3" x2="793.7" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="793.7" x2="793.7" y2="944.9" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="765.4" x2="765.4" y2="935.4" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="737" y1="984.2" x2="737" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="737" x2="737" y2="944.9" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="708.7" y1="984.2" x2="708.7" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="708.7" x2="708.7" y2="944.9" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="680.3" y1="984.2" x2="680.3" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="680.3" x2="680.3" y2="944.9" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="652" y1="984.2" x2="652" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="652" x2="652" y2="944.9" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="623.6" y1="984.2" x2="623.6" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="623.6" x2="623.6" y2="944.9" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="595.3" y1="984.2" x2="595.3" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="595.3" x2="595.3" y2="944.9" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="566.9" x2="566.9" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="538.6" x2="538.6" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="510.2" x2="510.2" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="481.9" x2="481.9" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="453.5" x2="453.5" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="425.2" x2="425.2" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="396.9" x2="396.9" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="368.5" x2="368.5" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="340.2" x2="340.2" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="311.8" x2="311.8" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="283.5" x2="283.5" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="255.1" x2="255.1" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="226.8" x2="226.8" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="198.4" x2="198.4" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="170.1" x2="170.1" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="141.7" x2="141.7" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="113.4" x2="113.4" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="85" x2="85" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="56.7" x2="56.7" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
<line x1="28.3" x2="28.3" y2="1020.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"/>
|
||||||
|
</g>
|
||||||
|
<rect y="765.4" width="255.1" height="255.1" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"/>
|
||||||
|
<rect x="255.1" y="765.4" width="255.1" height="255.1" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"/>
|
||||||
|
<polyline points="765.4 992.1 765.4 1020.5 510.2 1020.5 510.2 765.4 765.4 765.4 765.4 935.4" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"/>
|
||||||
|
<polyline points="765.4 944.9 765.4 765.4 1020.5 765.4 1020.5 1020.5 765.4 1020.5 765.4 984.2" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"/>
|
||||||
|
<rect y="510.2" width="255.1" height="255.1" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"/>
|
||||||
|
<rect x="255.1" y="510.2" width="255.1" height="255.1" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"/>
|
||||||
|
<rect x="510.2" y="510.2" width="255.1" height="255.1" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"/>
|
||||||
|
<rect x="765.4" y="510.2" width="255.1" height="255.1" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"/>
|
||||||
|
<rect y="255.1" width="255.1" height="255.1" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"/>
|
||||||
|
<rect x="255.1" y="255.1" width="255.1" height="255.1" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"/>
|
||||||
|
<rect x="510.2" y="255.1" width="255.1" height="255.1" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"/>
|
||||||
|
<rect x="765.4" y="255.1" width="255.1" height="255.1" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"/>
|
||||||
|
<rect width="255.1" height="255.1" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"/>
|
||||||
|
<rect x="255.1" width="255.1" height="255.1" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"/>
|
||||||
|
<rect x="510.2" width="255.1" height="255.1" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"/>
|
||||||
|
<rect x="765.4" width="255.1" height="255.1" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"/>
|
||||||
|
<g>
|
||||||
|
<path d="m584.3,964.3c0-1.9.3-3.7.9-5.3.6-1.7,1.4-3.1,2.5-4.3,1.1-1.2,2.4-2.2,4-2.9,1.6-.7,3.3-1,5.3-1s3.8.3,5.3,1c1.6.7,2.9,1.7,4,2.9,1.1,1.2,1.9,2.7,2.5,4.3.6,1.7.9,3.4.9,5.3s-.3,3.6-.9,5.2c-.6,1.6-1.4,3-2.5,4.2-1.1,1.2-2.4,2.1-4,2.8-1.6.7-3.3,1-5.3,1s-3.8-.3-5.3-1c-1.6-.7-2.9-1.6-4-2.8-1.1-1.2-1.9-2.6-2.5-4.2-.6-1.6-.9-3.4-.9-5.2Zm5.7,0c0,1.1.1,2.1.4,3.2s.7,1.9,1.2,2.8c.6.8,1.3,1.5,2.2,2,.9.5,2,.7,3.2.7s2.4-.2,3.2-.7c.9-.5,1.6-1.1,2.2-2,.6-.8,1-1.7,1.2-2.8s.4-2.1.4-3.2-.1-2.2-.4-3.3c-.3-1.1-.7-2-1.2-2.8s-1.3-1.5-2.2-2c-.9-.5-2-.7-3.2-.7s-2.4.2-3.2.7c-.9.5-1.6,1.2-2.2,2-.6.8-1,1.8-1.2,2.8-.3,1.1-.4,2.1-.4,3.3Z" style="fill: #fff;"/>
|
||||||
|
<path d="m613.4,951.3h13.9c1.2,0,2.2.2,3.1.6.9.4,1.7.9,2.4,1.5.7.6,1.2,1.4,1.5,2.3.3.9.5,1.8.5,2.7,0,1.5-.3,2.8-1,3.9-.6,1.1-1.7,1.9-3.1,2.5h0c.7.3,1.3.6,1.7,1,.5.4.8.9,1.1,1.4.3.6.5,1.1.6,1.8.1.6.2,1.3.3,1.9,0,.4,0,.9,0,1.4,0,.6,0,1.1.1,1.7,0,.6.2,1.1.3,1.6.1.5.3,1,.6,1.3h-5.7c-.2-.4-.3-.9-.4-1.3,0-.5-.2-1-.2-1.5,0-.5-.1-1.1-.1-1.7,0-.6,0-1.1-.2-1.6-.2-1.3-.6-2.3-1.2-3-.6-.6-1.6-.9-3.1-.9h-5.7v10h-5.7v-25.7Zm5.7,11.6h6.2c1.3,0,2.2-.3,2.9-.9.7-.6,1-1.5,1-2.8s-.3-2.2-1-2.7c-.7-.6-1.6-.8-2.9-.8h-6.2v7.2Z" style="fill: #fff;"/>
|
||||||
|
<path d="m639.4,951.3h5.7v25.7h-5.7v-25.7Z" style="fill: #fff;"/>
|
||||||
|
<path d="m668.6,974.1c-1,1.3-2.1,2.2-3.3,2.7-1.2.5-2.5.8-3.7.8-2,0-3.8-.3-5.3-1-1.6-.7-2.9-1.6-4-2.8-1.1-1.2-1.9-2.6-2.5-4.2-.6-1.6-.9-3.4-.9-5.2s.3-3.7.9-5.3c.6-1.7,1.4-3.1,2.5-4.3,1.1-1.2,2.4-2.2,4-2.9,1.6-.7,3.3-1,5.3-1s2.6.2,3.8.6c1.2.4,2.3,1,3.3,1.7,1,.8,1.8,1.7,2.5,2.8s1.1,2.4,1.2,3.9h-5.4c-.3-1.4-1-2.5-2-3.2-1-.7-2.1-1.1-3.5-1.1s-2.4.2-3.2.7c-.9.5-1.6,1.2-2.2,2-.6.8-1,1.8-1.2,2.8-.3,1.1-.4,2.1-.4,3.3s.1,2.1.4,3.2.7,1.9,1.2,2.8c.6.8,1.3,1.5,2.2,2,.9.5,2,.7,3.2.7,1.8,0,3.3-.5,4.3-1.4,1-.9,1.6-2.3,1.8-4.1h-5.7v-4.2h10.8v13.9h-3.6l-.6-2.9Z" style="fill: #fff;"/>
|
||||||
|
<path d="m677.4,951.3h5.7v25.7h-5.7v-25.7Z" style="fill: #fff;"/>
|
||||||
|
<path d="m688,951.3h5.6l10.7,17.2h0v-17.2h5.3v25.7h-5.7l-10.7-17.2h0v17.2h-5.3v-25.7Z" style="fill: #fff;"/>
|
||||||
|
<path d="m721.7,951.3h5.8l9.6,25.7h-5.9l-1.9-5.7h-9.6l-2,5.7h-5.7l9.8-25.7Zm-.5,15.8h6.7l-3.2-9.4h0l-3.3,9.4Z" style="fill: #fff;"/>
|
||||||
|
<path d="m739.3,951.3h5.7v21h12.5v4.8h-18.2v-25.7Z" style="fill: #fff;"/>
|
||||||
|
<path d="m770.7,951.3h11.6c1.6,0,3,.2,4.1.7s2,1.1,2.8,1.9c.7.8,1.2,1.7,1.5,2.6.3,1,.5,2,.5,3s-.2,2.1-.5,3.1c-.3,1-.8,1.9-1.5,2.6-.7.8-1.6,1.4-2.8,1.9s-2.5.7-4.1.7h-5.9v9.2h-5.7v-25.7Zm5.7,12.1h4.4c.6,0,1.3,0,1.9-.1.6,0,1.1-.3,1.6-.6.5-.3.8-.7,1.1-1.2.3-.5.4-1.2.4-2s-.1-1.5-.4-2c-.3-.5-.6-.9-1.1-1.2-.5-.3-1-.5-1.6-.6-.6,0-1.2-.1-1.9-.1h-4.4v7.7Z" style="fill: #fff;"/>
|
||||||
|
<path d="m794.7,951.3h13.9c1.2,0,2.2.2,3.1.6.9.4,1.7.9,2.4,1.5.7.6,1.2,1.4,1.5,2.3.3.9.5,1.8.5,2.7,0,1.5-.3,2.8-1,3.9-.6,1.1-1.7,1.9-3.1,2.5h0c.7.3,1.3.6,1.7,1,.5.4.8.9,1.1,1.4.3.6.5,1.1.6,1.8.1.6.2,1.3.3,1.9,0,.4,0,.9,0,1.4,0,.6,0,1.1.1,1.7,0,.6.2,1.1.3,1.6.1.5.3,1,.6,1.3h-5.7c-.2-.4-.3-.9-.4-1.3s-.2-1-.2-1.5c0-.5-.1-1.1-.1-1.7,0-.6,0-1.1-.2-1.6-.2-1.3-.6-2.3-1.2-3-.6-.6-1.6-.9-3.1-.9h-5.7v10h-5.7v-25.7Zm5.7,11.6h6.2c1.3,0,2.2-.3,2.9-.9.7-.6,1-1.5,1-2.8s-.3-2.2-1-2.7c-.7-.6-1.6-.8-2.9-.8h-6.2v7.2Z" style="fill: #fff;"/>
|
||||||
|
<path d="m842.5,967.3c0,3.5-1,6.1-2.9,7.8-1.9,1.7-4.6,2.6-8.1,2.6s-6.2-.8-8.1-2.5c-1.9-1.7-2.9-4.3-2.9-7.8v-16h5.7v16c0,.7,0,1.4.2,2.1s.4,1.3.8,1.8c.4.5.9.9,1.6,1.3.7.3,1.6.5,2.8.5,2,0,3.4-.5,4.2-1.4.8-.9,1.2-2.3,1.2-4.2v-16h5.7v16Z" style="fill: #fff;"/>
|
||||||
|
<path d="m851.2,968.5c0,.9.2,1.6.5,2.2.3.6.7,1.1,1.2,1.5.5.4,1.1.6,1.8.8.7.2,1.4.3,2.2.3s1,0,1.6-.1c.6,0,1.1-.2,1.6-.5s.9-.6,1.3-1c.3-.4.5-1,.5-1.6s-.2-1.3-.7-1.7c-.4-.4-1-.8-1.7-1.1-.7-.3-1.5-.6-2.4-.8-.9-.2-1.8-.4-2.8-.7-1-.2-1.9-.5-2.8-.9-.9-.3-1.7-.8-2.4-1.3-.7-.6-1.3-1.2-1.7-2.1-.4-.8-.7-1.8-.7-3s.3-2.5.8-3.4c.6-1,1.3-1.8,2.2-2.4.9-.6,1.9-1.1,3.1-1.4,1.2-.3,2.3-.5,3.5-.5s2.6.2,3.9.5c1.2.3,2.3.8,3.3,1.5,1,.7,1.7,1.5,2.3,2.6.6,1,.8,2.3.8,3.8h-5.5c0-.8-.2-1.4-.5-1.9s-.6-.9-1.1-1.2c-.5-.3-1-.5-1.6-.6-.6-.1-1.2-.2-1.9-.2s-.9,0-1.4.1c-.5,0-.9.3-1.2.5-.4.2-.7.5-.9.9-.2.4-.4.8-.4,1.4s0,.9.3,1.2c.2.3.6.6,1.1.8.6.3,1.3.5,2.3.8,1,.3,2.3.6,3.9,1,.3,0,.7.2,1.2.3.5.1,1,.3,1.6.5.6.2,1.1.5,1.7.9.6.4,1.1.8,1.5,1.3.5.5.8,1.2,1.1,1.9.3.7.4,1.6.4,2.5s-.2,2.3-.7,3.3c-.5,1-1.1,1.9-2,2.6-.9.7-2,1.3-3.3,1.7-1.3.4-2.9.6-4.6.6s-2.8-.2-4.1-.5c-1.3-.4-2.5-.9-3.5-1.7-1-.7-1.8-1.7-2.4-2.8-.6-1.2-.9-2.5-.9-4.1h5.5Z" style="fill: #fff;"/>
|
||||||
|
<path d="m877.7,951.3h5.8l9.6,25.7h-5.9l-1.9-5.7h-9.6l-2,5.7h-5.7l9.8-25.7Zm-.5,15.8h6.7l-3.2-9.4h0l-3.3,9.4Z" style="fill: #fff;"/>
|
||||||
|
<path d="m911.7,963.6l-8.3-12.2h6.6l5,8.2,5.2-8.2h6.2l-8.2,12.3,9,13.4h-6.7l-5.6-8.9-5.7,8.9h-6.4l9-13.5Z" style="fill: #fff;"/>
|
||||||
|
<path d="m929.4,951.3h5.7v21h12.5v4.8h-18.2v-25.7Z" style="fill: #fff;"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 17 KiB |
BIN
resources/profiles/PrusaResearch/xl_bed.stl
Normal file
BIN
resources/profiles/PrusaResearch/xl_bed.stl
Normal file
Binary file not shown.
@ -789,10 +789,11 @@ std::string CoolingBuffer::apply_layer_cooldown(
|
|||||||
}
|
}
|
||||||
#undef EXTRUDER_CONFIG
|
#undef EXTRUDER_CONFIG
|
||||||
bridge_fan_control = bridge_fan_speed > fan_speed_new;
|
bridge_fan_control = bridge_fan_speed > fan_speed_new;
|
||||||
} else {
|
} else { // fan disabled
|
||||||
bridge_fan_control = false;
|
bridge_fan_control = false;
|
||||||
bridge_fan_speed = 0;
|
bridge_fan_speed = 0;
|
||||||
fan_speed_new = 0;
|
fan_speed_new = 0;
|
||||||
|
custom_fan_speed_limits.second = 0;
|
||||||
}
|
}
|
||||||
if (fan_speed_new != m_fan_speed) {
|
if (fan_speed_new != m_fan_speed) {
|
||||||
m_fan_speed = fan_speed_new;
|
m_fan_speed = fan_speed_new;
|
||||||
|
@ -291,22 +291,24 @@ Surfaces expand_bridges_detect_orientations(
|
|||||||
uint32_t src_id = it->src_id;
|
uint32_t src_id = it->src_id;
|
||||||
for (++ it; it != bridge_expansions.end() && it->src_id == src_id; ++ it) ;
|
for (++ it; it != bridge_expansions.end() && it->src_id == src_id; ++ it) ;
|
||||||
}
|
}
|
||||||
for (uint32_t bridge_id = 0; bridge_id < uint32_t(bridges.size()); ++ bridge_id) {
|
for (uint32_t bridge_id = 0; bridge_id < uint32_t(bridges.size()); ++ bridge_id)
|
||||||
acc.clear();
|
if (group_id(bridge_id) == bridge_id) {
|
||||||
for (uint32_t bridge_id2 = bridge_id; bridge_id2 < uint32_t(bridges.size()); ++ bridge_id2)
|
// Head of the group.
|
||||||
if (group_id(bridge_id) == bridge_id) {
|
acc.clear();
|
||||||
append(acc, to_polygons(std::move(bridges[bridge_id2].expolygon)));
|
for (uint32_t bridge_id2 = bridge_id; bridge_id2 < uint32_t(bridges.size()); ++ bridge_id2)
|
||||||
auto it_bridge_expansion = bridges[bridge_id2].bridge_expansion_begin;
|
if (group_id(bridge_id2) == bridge_id) {
|
||||||
assert(it_bridge_expansion == bridge_expansions.end() || it_bridge_expansion->src_id == bridge_id2);
|
append(acc, to_polygons(std::move(bridges[bridge_id2].expolygon)));
|
||||||
for (; it_bridge_expansion != bridge_expansions.end() && it_bridge_expansion->src_id == bridge_id2; ++ it_bridge_expansion)
|
auto it_bridge_expansion = bridges[bridge_id2].bridge_expansion_begin;
|
||||||
append(acc, to_polygons(std::move(it_bridge_expansion->expolygon)));
|
assert(it_bridge_expansion == bridge_expansions.end() || it_bridge_expansion->src_id == bridge_id2);
|
||||||
}
|
for (; it_bridge_expansion != bridge_expansions.end() && it_bridge_expansion->src_id == bridge_id2; ++ it_bridge_expansion)
|
||||||
//FIXME try to be smart and pick the best bridging angle for all?
|
append(acc, to_polygons(std::move(it_bridge_expansion->expolygon)));
|
||||||
templ.bridge_angle = bridges[bridge_id].angle;
|
}
|
||||||
// without safety offset, artifacts are generated (GH #2494)
|
//FIXME try to be smart and pick the best bridging angle for all?
|
||||||
for (ExPolygon &ex : union_safety_offset_ex(acc))
|
templ.bridge_angle = bridges[bridge_id].angle;
|
||||||
out.emplace_back(templ, std::move(ex));
|
// without safety offset, artifacts are generated (GH #2494)
|
||||||
}
|
for (ExPolygon &ex : union_safety_offset_ex(acc))
|
||||||
|
out.emplace_back(templ, std::move(ex));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clip the shells by the expanded bridges.
|
// Clip the shells by the expanded bridges.
|
||||||
|
@ -14,11 +14,13 @@
|
|||||||
#include "GCode/WipeTower.hpp"
|
#include "GCode/WipeTower.hpp"
|
||||||
#include "Utils.hpp"
|
#include "Utils.hpp"
|
||||||
#include "BuildVolume.hpp"
|
#include "BuildVolume.hpp"
|
||||||
|
#include "format.hpp"
|
||||||
|
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
#include <string>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
#include <boost/filesystem/path.hpp>
|
#include <boost/filesystem/path.hpp>
|
||||||
#include <boost/format.hpp>
|
#include <boost/format.hpp>
|
||||||
@ -1171,23 +1173,68 @@ void Print::alert_when_supports_needed()
|
|||||||
auto issue_to_alert_message = [](SupportSpotsGenerator::SupportPointCause cause, bool critical) {
|
auto issue_to_alert_message = [](SupportSpotsGenerator::SupportPointCause cause, bool critical) {
|
||||||
std::string message;
|
std::string message;
|
||||||
switch (cause) {
|
switch (cause) {
|
||||||
case SupportSpotsGenerator::SupportPointCause::LongBridge: message = L("long bridging extrusions"); break;
|
//TRN Alert when support is needed. Describes that the model has long bridging extrusions which may print badly
|
||||||
case SupportSpotsGenerator::SupportPointCause::FloatingBridgeAnchor: message = L("floating bridge anchors"); break;
|
case SupportSpotsGenerator::SupportPointCause::LongBridge: message = L("Long bridging extrusions"); break;
|
||||||
|
//TRN Alert when support is needed. Describes bridge anchors/turns in the air, which will definitely print badly
|
||||||
|
case SupportSpotsGenerator::SupportPointCause::FloatingBridgeAnchor: message = L("Floating bridge anchors"); break;
|
||||||
case SupportSpotsGenerator::SupportPointCause::FloatingExtrusion:
|
case SupportSpotsGenerator::SupportPointCause::FloatingExtrusion:
|
||||||
if (critical) {
|
if (critical) {
|
||||||
message = L("collapsing overhang");
|
//TRN Alert when support is needed. Describes that the print has large overhang area which will print badly or not print at all.
|
||||||
|
message = L("Collapsing overhang");
|
||||||
} else {
|
} else {
|
||||||
message = L("loose extrusions");
|
//TRN Alert when support is needed. Describes extrusions that are not supported enough and come out curled or loose.
|
||||||
|
message = L("Loose extrusions");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SupportSpotsGenerator::SupportPointCause::SeparationFromBed: message = L("low bed adhesion"); break;
|
//TRN Alert when support is needed. Describes that the print has low bed adhesion and may became loose.
|
||||||
case SupportSpotsGenerator::SupportPointCause::UnstableFloatingPart: message = L("floating object part"); break;
|
case SupportSpotsGenerator::SupportPointCause::SeparationFromBed: message = L("Low bed adhesion"); break;
|
||||||
case SupportSpotsGenerator::SupportPointCause::WeakObjectPart: message = L("thin fragile section"); break;
|
//TRN Alert when support is needed. Describes that the object has part that is not connected to the bed and will not print at all without supports.
|
||||||
|
case SupportSpotsGenerator::SupportPointCause::UnstableFloatingPart: message = L("Floating object part"); break;
|
||||||
|
//TRN Alert when support is needed. Describes that the object has thin part that may brake during printing
|
||||||
|
case SupportSpotsGenerator::SupportPointCause::WeakObjectPart: message = L("Thin fragile part"); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return message;
|
return message;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// TRN this translation rule is used to translate lists of uknown size on single line. The first argument is element of the list,
|
||||||
|
// the second argument may be element or rest of the list. For most languages, this does not need translation, but some use different
|
||||||
|
// separator than comma and some use blank space in front of the separator.
|
||||||
|
auto single_line_list_rule = L("%1%, %2%");
|
||||||
|
auto multiline_list_rule = "%1%\n%2%";
|
||||||
|
|
||||||
|
auto elements_to_translated_list = [](const std::vector<std::string> &translated_elements, std::string expansion_rule) {
|
||||||
|
if (expansion_rule.find("%1%") == expansion_rule.npos || expansion_rule.find("%2%") == expansion_rule.npos) {
|
||||||
|
BOOST_LOG_TRIVIAL(error) << "INCORRECT EXPANSION RULE FOR LIST TRANSLATION: " << expansion_rule
|
||||||
|
<< " - IT SHOULD CONTAIN %1% and %2%!";
|
||||||
|
expansion_rule = "%1% %2%";
|
||||||
|
}
|
||||||
|
if (translated_elements.size() == 0) {
|
||||||
|
return std::string{};
|
||||||
|
}
|
||||||
|
if (translated_elements.size() == 1) {
|
||||||
|
return translated_elements.front();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string translated_list = expansion_rule;
|
||||||
|
for (int i = 0; i < translated_elements.size() - 1; i++) {
|
||||||
|
auto first_elem = translated_list.find("%1%");
|
||||||
|
assert(first_elem != translated_list.npos);
|
||||||
|
translated_list.replace(first_elem, 3, translated_elements[i]);
|
||||||
|
|
||||||
|
// expand the translated list by another application of the same rule
|
||||||
|
auto second_elem = translated_list.find("%2%");
|
||||||
|
assert(second_elem != translated_list.npos);
|
||||||
|
if (i < translated_elements.size() - 2) {
|
||||||
|
translated_list.replace(second_elem, 3, expansion_rule);
|
||||||
|
} else {
|
||||||
|
translated_list.replace(second_elem, 3, translated_elements[i + 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return translated_list;
|
||||||
|
};
|
||||||
|
|
||||||
// vector of pairs of object and its issues, where each issue is a pair of type and critical flag
|
// vector of pairs of object and its issues, where each issue is a pair of type and critical flag
|
||||||
std::vector<std::pair<const PrintObject *, std::vector<std::pair<SupportSpotsGenerator::SupportPointCause, bool>>>> objects_isssues;
|
std::vector<std::pair<const PrintObject *, std::vector<std::pair<SupportSpotsGenerator::SupportPointCause, bool>>>> objects_isssues;
|
||||||
|
|
||||||
@ -1207,45 +1254,58 @@ void Print::alert_when_supports_needed()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool recommend_brim = false;
|
bool recommend_brim = false;
|
||||||
std::map<std::pair<SupportSpotsGenerator::SupportPointCause, bool>, std::vector<const PrintObject *>> po_by_support_issues;
|
std::map<std::pair<SupportSpotsGenerator::SupportPointCause, bool>, std::vector<const PrintObject *>> po_by_support_issues;
|
||||||
for (const auto &obj : objects_isssues) {
|
for (const auto &obj : objects_isssues) {
|
||||||
for (const auto &issue : obj.second) {
|
for (const auto &issue : obj.second) {
|
||||||
po_by_support_issues[issue].push_back(obj.first);
|
po_by_support_issues[issue].push_back(obj.first);
|
||||||
if (issue.first == SupportSpotsGenerator::SupportPointCause::SeparationFromBed && !obj.first->has_brim()){
|
if (issue.first == SupportSpotsGenerator::SupportPointCause::SeparationFromBed && !obj.first->has_brim()) {
|
||||||
recommend_brim = true;
|
recommend_brim = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto message = L("Detected print stability issues") + ": \n";
|
std::vector<std::pair<std::string, std::vector<std::string>>> message_elements;
|
||||||
if (objects_isssues.size() > po_by_support_issues.size()) {
|
if (objects_isssues.size() > po_by_support_issues.size()) {
|
||||||
// there are more objects than causes, group by issues
|
// there are more objects than causes, group by issues
|
||||||
for (const auto &issue : po_by_support_issues) {
|
for (const auto &issue : po_by_support_issues) {
|
||||||
message += "\n" + issue_to_alert_message(issue.first.first, issue.first.second) + " >> ";
|
auto &pair = message_elements.emplace_back(issue_to_alert_message(issue.first.first, issue.first.second),
|
||||||
|
std::vector<std::string>{});
|
||||||
for (const auto &obj : issue.second) {
|
for (const auto &obj : issue.second) {
|
||||||
message += obj->m_model_object->name + ", ";
|
pair.second.push_back(obj->m_model_object->name);
|
||||||
}
|
}
|
||||||
message.pop_back();
|
|
||||||
message.pop_back(); // remove ,
|
|
||||||
message += ".\n";
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// more causes than objects, group by objects
|
// more causes than objects, group by objects
|
||||||
for (const auto &obj : objects_isssues) {
|
for (const auto &obj : objects_isssues) {
|
||||||
message += "\n" + L("Object") + " " + obj.first->model_object()->name + " << ";
|
auto &pair = message_elements.emplace_back(obj.first->model_object()->name, std::vector<std::string>{});
|
||||||
for (const auto &issue : obj.second) {
|
for (const auto &issue : obj.second) {
|
||||||
message += issue_to_alert_message(issue.first, issue.second) + ", ";
|
pair.second.push_back(issue_to_alert_message(issue.first, issue.second));
|
||||||
}
|
}
|
||||||
message.pop_back();
|
|
||||||
message.pop_back(); // remove ,
|
|
||||||
message += ".\n";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool brim_or_supp = recommend_brim && po_by_support_issues.size() < 2;
|
// first, gather sublements into single line list, store in first subelement
|
||||||
auto brim_part = " " + (brim_or_supp ? L("or") : L("and")) + " " + L("brim");
|
for (auto &pair : message_elements) {
|
||||||
message += "\n" + L("Consider enabling supports") + (recommend_brim ? brim_part : "") + ".";
|
pair.second.front() = elements_to_translated_list(pair.second, single_line_list_rule);
|
||||||
|
}
|
||||||
|
|
||||||
|
// then gather elements to create multiline list
|
||||||
|
std::vector<std::string> lines = {};
|
||||||
|
for (auto &pair : message_elements) {
|
||||||
|
lines.push_back(""); // empty line for readability
|
||||||
|
lines.push_back(pair.first);
|
||||||
|
lines.push_back(pair.second.front());
|
||||||
|
}
|
||||||
|
|
||||||
|
lines.push_back("");
|
||||||
|
lines.push_back(L("Consider enabling supports."));
|
||||||
|
if (recommend_brim) {
|
||||||
|
lines.push_back(L("Also consider enabling brim."));
|
||||||
|
}
|
||||||
|
|
||||||
|
// TRN Alert message for detected print issues. first argument is a list of detected issues.
|
||||||
|
auto message = Slic3r::format(L("Detected print stability issues:\n%1%"), elements_to_translated_list(lines, multiline_list_rule));
|
||||||
|
|
||||||
if (objects_isssues.size() > 0) {
|
if (objects_isssues.size() > 0) {
|
||||||
this->active_step_add_warning(PrintStateBase::WarningLevel::NON_CRITICAL, message);
|
this->active_step_add_warning(PrintStateBase::WarningLevel::NON_CRITICAL, message);
|
||||||
|
@ -1627,7 +1627,7 @@ void PrintObject::bridge_over_infill()
|
|||||||
contains_only_lightning = false;
|
contains_only_lightning = false;
|
||||||
}
|
}
|
||||||
Polygons fill_polys = to_polygons(region->fill_expolygons());
|
Polygons fill_polys = to_polygons(region->fill_expolygons());
|
||||||
unsupported_area = union_(unsupported_area, expand(fill_polys, spacing));
|
unsupported_area.insert(unsupported_area.end(), fill_polys.begin(), fill_polys.end());
|
||||||
for (const Surface &surface : region->fill_surfaces()) {
|
for (const Surface &surface : region->fill_surfaces()) {
|
||||||
if (surface.surface_type != stInternal || region->region().config().fill_density.value == 100) {
|
if (surface.surface_type != stInternal || region->region().config().fill_density.value == 100) {
|
||||||
Polygons p = to_polygons(surface.expolygon);
|
Polygons p = to_polygons(surface.expolygon);
|
||||||
@ -1635,9 +1635,10 @@ void PrintObject::bridge_over_infill()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
unsupported_area = closing(unsupported_area, SCALED_EPSILON);
|
||||||
|
|
||||||
lower_layer_solids = expand(lower_layer_solids, 4 * spacing);
|
lower_layer_solids = expand(lower_layer_solids, 4 * spacing);
|
||||||
unsupported_area = shrink(unsupported_area, 5 * spacing);
|
unsupported_area = shrink(unsupported_area, 4 * spacing);
|
||||||
unsupported_area = diff(unsupported_area, lower_layer_solids);
|
unsupported_area = diff(unsupported_area, lower_layer_solids);
|
||||||
|
|
||||||
for (const LayerRegion *region : layer->regions()) {
|
for (const LayerRegion *region : layer->regions()) {
|
||||||
@ -1647,18 +1648,25 @@ void PrintObject::bridge_over_infill()
|
|||||||
bool partially_supported = area(unsupported) < area(to_polygons(s->expolygon)) - EPSILON;
|
bool partially_supported = area(unsupported) < area(to_polygons(s->expolygon)) - EPSILON;
|
||||||
if (!unsupported.empty() && (!partially_supported || area(unsupported) > 5 * 5 * spacing * spacing)) {
|
if (!unsupported.empty() && (!partially_supported || area(unsupported) > 5 * 5 * spacing * spacing)) {
|
||||||
Polygons worth_bridging = intersection(to_polygons(s->expolygon), expand(unsupported, 5 * spacing));
|
Polygons worth_bridging = intersection(to_polygons(s->expolygon), expand(unsupported, 5 * spacing));
|
||||||
for (Polygon p : diff(to_polygons(s->expolygon), worth_bridging)) {
|
for (const Polygon& p : diff(to_polygons(s->expolygon), expand(worth_bridging, spacing))) {
|
||||||
if (p.area() < region->flow(frSolidInfill, true).scaled_spacing() * scale_(12.0)) {
|
auto area = p.area();
|
||||||
|
if (area < spacing * scale_(12.0) && area > spacing * spacing) {
|
||||||
worth_bridging.push_back(p);
|
worth_bridging.push_back(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
worth_bridging = intersection(closing(worth_bridging, 3 * region->flow(frSolidInfill, true).scaled_spacing()), s->expolygon);
|
worth_bridging = intersection(closing(worth_bridging, 2 * spacing), s->expolygon);
|
||||||
candidate_surfaces.push_back(CandidateSurface(s, lidx, worth_bridging, region, 0, contains_only_lightning));
|
candidate_surfaces.push_back(CandidateSurface(s, lidx, worth_bridging, region, 0, contains_only_lightning));
|
||||||
|
|
||||||
#ifdef DEBUG_BRIDGE_OVER_INFILL
|
#ifdef DEBUG_BRIDGE_OVER_INFILL
|
||||||
debug_draw(std::to_string(lidx) + "_candidate_surface_" + std::to_string(area(s->expolygon)),
|
debug_draw(std::to_string(lidx) + "_candidate_surface_" + std::to_string(area(s->expolygon)),
|
||||||
to_lines(region->layer()->lslices), to_lines(s->expolygon), to_lines(worth_bridging),
|
to_lines(region->layer()->lslices), to_lines(s->expolygon), to_lines(worth_bridging),
|
||||||
to_lines(unsupported_area));
|
to_lines(unsupported_area));
|
||||||
|
#endif
|
||||||
|
#ifdef DEBUG_BRIDGE_OVER_INFILL
|
||||||
|
debug_draw(std::to_string(lidx) + "_candidate_processing_" + std::to_string(area(s->expolygon)),
|
||||||
|
to_lines(unsupported), to_lines(intersection(to_polygons(s->expolygon), expand(unsupported, 5 * spacing))),
|
||||||
|
to_lines(diff(to_polygons(s->expolygon), expand(worth_bridging, spacing))),
|
||||||
|
to_lines(unsupported_area));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1711,7 +1719,7 @@ void PrintObject::bridge_over_infill()
|
|||||||
|
|
||||||
// cluster layers by depth needed for thick bridges. Each cluster is to be processed by single thread sequentially, so that bridges cannot appear one on another
|
// cluster layers by depth needed for thick bridges. Each cluster is to be processed by single thread sequentially, so that bridges cannot appear one on another
|
||||||
std::vector<std::vector<size_t>> clustered_layers_for_threads;
|
std::vector<std::vector<size_t>> clustered_layers_for_threads;
|
||||||
float target_flow_height_factor = 0.5;
|
float target_flow_height_factor = 0.75;
|
||||||
{
|
{
|
||||||
std::vector<size_t> layers_with_candidates;
|
std::vector<size_t> layers_with_candidates;
|
||||||
std::map<size_t, Polygons> layer_area_covered_by_candidates;
|
std::map<size_t, Polygons> layer_area_covered_by_candidates;
|
||||||
@ -1765,9 +1773,9 @@ void PrintObject::bridge_over_infill()
|
|||||||
|
|
||||||
// LAMBDA to gather areas with sparse infill deep enough that we can fit thick bridges there.
|
// LAMBDA to gather areas with sparse infill deep enough that we can fit thick bridges there.
|
||||||
auto gather_areas_w_depth = [target_flow_height_factor](const PrintObject *po, int lidx, float target_flow_height) {
|
auto gather_areas_w_depth = [target_flow_height_factor](const PrintObject *po, int lidx, float target_flow_height) {
|
||||||
// Gather lower layers sparse infill areas, to depth defined by used bridge flow
|
// Gather layers sparse infill areas, to depth defined by used bridge flow
|
||||||
Polygons lower_layers_sparse_infill{};
|
ExPolygons layers_sparse_infill{};
|
||||||
Polygons not_sparse_infill{};
|
ExPolygons not_sparse_infill{};
|
||||||
double bottom_z = po->get_layer(lidx)->print_z - target_flow_height * target_flow_height_factor - EPSILON;
|
double bottom_z = po->get_layer(lidx)->print_z - target_flow_height * target_flow_height_factor - EPSILON;
|
||||||
for (int i = int(lidx) - 1; i >= 0; --i) {
|
for (int i = int(lidx) - 1; i >= 0; --i) {
|
||||||
// Stop iterating if layer is lower than bottom_z.
|
// Stop iterating if layer is lower than bottom_z.
|
||||||
@ -1778,19 +1786,19 @@ void PrintObject::bridge_over_infill()
|
|||||||
for (const LayerRegion *region : layer->regions()) {
|
for (const LayerRegion *region : layer->regions()) {
|
||||||
bool has_low_density = region->region().config().fill_density.value < 100;
|
bool has_low_density = region->region().config().fill_density.value < 100;
|
||||||
for (const Surface &surface : region->fill_surfaces()) {
|
for (const Surface &surface : region->fill_surfaces()) {
|
||||||
if (surface.surface_type == stInternal && has_low_density) {
|
if ((surface.surface_type == stInternal && has_low_density) || surface.surface_type == stInternalVoid ) {
|
||||||
Polygons p = to_polygons(surface.expolygon);
|
layers_sparse_infill.push_back(surface.expolygon);
|
||||||
lower_layers_sparse_infill.insert(lower_layers_sparse_infill.end(), p.begin(), p.end());
|
|
||||||
} else {
|
} else {
|
||||||
Polygons p = to_polygons(surface.expolygon);
|
not_sparse_infill.push_back(surface.expolygon);
|
||||||
not_sparse_infill.insert(not_sparse_infill.end(), p.begin(), p.end());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
lower_layers_sparse_infill = union_(lower_layers_sparse_infill);
|
|
||||||
}
|
}
|
||||||
|
layers_sparse_infill = union_ex(layers_sparse_infill);
|
||||||
return diff(lower_layers_sparse_infill, not_sparse_infill);
|
layers_sparse_infill = closing_ex(layers_sparse_infill, SCALED_EPSILON);
|
||||||
|
not_sparse_infill = union_ex(not_sparse_infill);
|
||||||
|
not_sparse_infill = closing_ex(not_sparse_infill, SCALED_EPSILON);
|
||||||
|
return diff(layers_sparse_infill, not_sparse_infill);
|
||||||
};
|
};
|
||||||
|
|
||||||
// LAMBDA do determine optimal bridging angle
|
// LAMBDA do determine optimal bridging angle
|
||||||
@ -1927,7 +1935,7 @@ void PrintObject::bridge_over_infill()
|
|||||||
});
|
});
|
||||||
if (maybe_below_anchor != anchors_intersections.rend()) {
|
if (maybe_below_anchor != anchors_intersections.rend()) {
|
||||||
section.a = maybe_below_anchor->first;
|
section.a = maybe_below_anchor->first;
|
||||||
section.a.y() -= bridging_flow.scaled_width() * (0.5 + 1.0);
|
section.a.y() -= bridging_flow.scaled_width() * (0.5 + 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto maybe_upper_anchor = std::upper_bound(anchors_intersections.begin(), anchors_intersections.end(), section.b,
|
auto maybe_upper_anchor = std::upper_bound(anchors_intersections.begin(), anchors_intersections.end(), section.b,
|
||||||
@ -1936,7 +1944,7 @@ void PrintObject::bridge_over_infill()
|
|||||||
});
|
});
|
||||||
if (maybe_upper_anchor != anchors_intersections.end()) {
|
if (maybe_upper_anchor != anchors_intersections.end()) {
|
||||||
section.b = maybe_upper_anchor->first;
|
section.b = maybe_upper_anchor->first;
|
||||||
section.b.y() += bridging_flow.scaled_width() * (0.5 + 1.0);
|
section.b.y() += bridging_flow.scaled_width() * (0.5 + 0.5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2032,7 +2040,8 @@ void PrintObject::bridge_over_infill()
|
|||||||
};
|
};
|
||||||
|
|
||||||
tbb::parallel_for(tbb::blocked_range<size_t>(0, clustered_layers_for_threads.size()), [po = static_cast<const PrintObject *>(this),
|
tbb::parallel_for(tbb::blocked_range<size_t>(0, clustered_layers_for_threads.size()), [po = static_cast<const PrintObject *>(this),
|
||||||
&surfaces_by_layer, &clustered_layers_for_threads,
|
target_flow_height_factor, &surfaces_by_layer,
|
||||||
|
&clustered_layers_for_threads,
|
||||||
gather_areas_w_depth, &infill_lines,
|
gather_areas_w_depth, &infill_lines,
|
||||||
determine_bridging_angle,
|
determine_bridging_angle,
|
||||||
construct_anchored_polygon](
|
construct_anchored_polygon](
|
||||||
@ -2058,12 +2067,13 @@ void PrintObject::bridge_over_infill()
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Gather deep infill areas, where thick bridges fit
|
// Gather deep infill areas, where thick bridges fit
|
||||||
coordf_t thick_bridges_depth = surfaces_by_layer[lidx].front().region->flow(frSolidInfill, true).height();
|
coordf_t spacing = surfaces_by_layer[lidx].front().region->flow(frSolidInfill, true).scaled_spacing();
|
||||||
Polygons deep_infill_area = gather_areas_w_depth(po, lidx, thick_bridges_depth * 0.5);
|
coordf_t target_flow_height = surfaces_by_layer[lidx].front().region->flow(frSolidInfill, true).height() * target_flow_height_factor;
|
||||||
|
Polygons deep_infill_area = gather_areas_w_depth(po, lidx, target_flow_height);
|
||||||
|
|
||||||
// Now also remove area that has been already filled on lower layers by bridging expansion - For this
|
// Now also remove area that has been already filled on lower layers by bridging expansion - For this
|
||||||
// reason we did the clustering of layers per thread.
|
// reason we did the clustering of layers per thread.
|
||||||
double bottom_z = layer->print_z - thick_bridges_depth - EPSILON;
|
double bottom_z = layer->print_z - target_flow_height - EPSILON;
|
||||||
if (job_idx > 0) {
|
if (job_idx > 0) {
|
||||||
for (int lower_job_idx = job_idx - 1; lower_job_idx >= 0; lower_job_idx--) {
|
for (int lower_job_idx = job_idx - 1; lower_job_idx >= 0; lower_job_idx--) {
|
||||||
size_t lower_layer_idx = clustered_layers_for_threads[cluster_idx][lower_job_idx];
|
size_t lower_layer_idx = clustered_layers_for_threads[cluster_idx][lower_job_idx];
|
||||||
@ -2078,30 +2088,54 @@ void PrintObject::bridge_over_infill()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
deep_infill_area = expand(deep_infill_area, spacing);
|
||||||
|
|
||||||
// Now gather expansion polygons - internal infill on current layer, from which we can cut off anchors
|
// Now gather expansion polygons - internal infill on current layer, from which we can cut off anchors
|
||||||
Polygons expansion_area;
|
Polygons expansion_area;
|
||||||
|
Polygons total_fill_area;
|
||||||
for (const LayerRegion *region : layer->regions()) {
|
for (const LayerRegion *region : layer->regions()) {
|
||||||
auto polys = to_polygons(region->fill_surfaces().filter_by_type(stInternal));
|
Polygons internal_polys = to_polygons(region->fill_surfaces().filter_by_type(stInternal));
|
||||||
expansion_area.insert(expansion_area.end(), polys.begin(), polys.end());
|
expansion_area.insert(expansion_area.end(), internal_polys.begin(), internal_polys.end());
|
||||||
|
Polygons fill_polys = to_polygons(region->fill_expolygons());
|
||||||
|
total_fill_area.insert(total_fill_area.end(), fill_polys.begin(), fill_polys.end());
|
||||||
}
|
}
|
||||||
expansion_area = closing(expansion_area, SCALED_EPSILON);
|
total_fill_area = closing(total_fill_area, SCALED_EPSILON);
|
||||||
expansion_area = intersection(expansion_area, deep_infill_area);
|
expansion_area = closing(expansion_area, SCALED_EPSILON);
|
||||||
Polylines anchors = intersection_pl(infill_lines[lidx - 1], expansion_area);
|
expansion_area = intersection(expansion_area, deep_infill_area);
|
||||||
|
Polylines anchors = intersection_pl(infill_lines[lidx - 1], expansion_area);
|
||||||
|
|
||||||
|
#ifdef DEBUG_BRIDGE_OVER_INFILL
|
||||||
|
debug_draw(std::to_string(lidx) + "_" + std::to_string(cluster_idx) + "_" + std::to_string(job_idx) + "_" +
|
||||||
|
"_total_area",
|
||||||
|
to_lines(total_fill_area), to_lines(expansion_area), to_lines(deep_infill_area), to_lines(anchors));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
std::vector<CandidateSurface> expanded_surfaces;
|
std::vector<CandidateSurface> expanded_surfaces;
|
||||||
expanded_surfaces.reserve(surfaces_by_layer[lidx].size());
|
expanded_surfaces.reserve(surfaces_by_layer[lidx].size());
|
||||||
for (const CandidateSurface &candidate : surfaces_by_layer[lidx]) {
|
for (const CandidateSurface &candidate : surfaces_by_layer[lidx]) {
|
||||||
const Flow &flow = candidate.region->bridging_flow(frSolidInfill, true);
|
const Flow &flow = candidate.region->bridging_flow(frSolidInfill, true);
|
||||||
Polygons area_to_be_bridge = intersection(candidate.new_polys, deep_infill_area);
|
Polygons area_to_be_bridge = expand(candidate.new_polys, flow.scaled_spacing());
|
||||||
|
area_to_be_bridge = intersection(area_to_be_bridge, deep_infill_area);
|
||||||
|
Polygons limiting_area = union_(area_to_be_bridge, expansion_area);
|
||||||
|
|
||||||
if (area_to_be_bridge.empty())
|
if (area_to_be_bridge.empty())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
area_to_be_bridge = expand(area_to_be_bridge, flow.scaled_spacing());
|
Polylines boundary_plines = to_polylines(expand(total_fill_area, 1.3 * flow.scaled_spacing()));
|
||||||
Polygons boundary_area = union_(expansion_area, area_to_be_bridge);
|
{
|
||||||
Polylines boundary_plines = to_polylines(boundary_area);
|
Polylines limiting_plines = to_polylines(expand(limiting_area, 0.3*flow.spacing()));
|
||||||
|
boundary_plines.insert(boundary_plines.end(), limiting_plines.begin(), limiting_plines.end());
|
||||||
double bridging_angle = 0;
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG_BRIDGE_OVER_INFILL
|
||||||
|
int r = rand();
|
||||||
|
debug_draw(std::to_string(lidx) + "_" + std::to_string(cluster_idx) + "_" + std::to_string(job_idx) + "_" +
|
||||||
|
"_anchors_" + std::to_string(r),
|
||||||
|
to_lines(area_to_be_bridge), to_lines(boundary_plines), to_lines(anchors), to_lines(expansion_area));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
double bridging_angle = 0;
|
||||||
if (!anchors.empty()) {
|
if (!anchors.empty()) {
|
||||||
bridging_angle = determine_bridging_angle(area_to_be_bridge, to_lines(anchors),
|
bridging_angle = determine_bridging_angle(area_to_be_bridge, to_lines(anchors),
|
||||||
candidate.region->region().config().fill_pattern.value);
|
candidate.region->region().config().fill_pattern.value);
|
||||||
@ -2133,15 +2167,14 @@ void PrintObject::bridge_over_infill()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bridging_area = intersection(bridging_area, boundary_area);
|
|
||||||
bridging_area = opening(bridging_area, flow.scaled_spacing());
|
bridging_area = opening(bridging_area, flow.scaled_spacing());
|
||||||
|
bridging_area = intersection(bridging_area, limiting_area);
|
||||||
|
bridging_area = intersection(bridging_area, total_fill_area);
|
||||||
expansion_area = diff(expansion_area, bridging_area);
|
expansion_area = diff(expansion_area, bridging_area);
|
||||||
|
|
||||||
#ifdef DEBUG_BRIDGE_OVER_INFILL
|
#ifdef DEBUG_BRIDGE_OVER_INFILL
|
||||||
debug_draw(std::to_string(lidx) + "_" + std::to_string(cluster_idx) + "_" + std::to_string(job_idx) +
|
debug_draw(std::to_string(lidx) + "_" + std::to_string(cluster_idx) + "_" + std::to_string(job_idx) + "_" + "_expanded_bridging" + std::to_string(r),
|
||||||
"_expanded_bridging",
|
to_lines(layer->lslices), to_lines(boundary_plines), to_lines(candidate.new_polys), to_lines(bridging_area));
|
||||||
to_lines(layer->lslices), to_lines(boundary_plines), to_lines(candidate.new_polys),
|
|
||||||
to_lines(bridging_area));
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
expanded_surfaces.push_back(CandidateSurface(candidate.original_surface, candidate.layer_index, bridging_area,
|
expanded_surfaces.push_back(CandidateSurface(candidate.original_surface, candidate.layer_index, bridging_area,
|
||||||
|
@ -166,11 +166,11 @@ ArchiveViewCtrl::~ArchiveViewCtrl()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FileArchiveDialog::FileArchiveDialog(wxWindow* parent_window, mz_zip_archive* archive, std::vector<boost::filesystem::path>& selected_paths)
|
FileArchiveDialog::FileArchiveDialog(wxWindow* parent_window, mz_zip_archive* archive, std::vector<std::pair<boost::filesystem::path, size_t>>& selected_paths_w_size)
|
||||||
: DPIDialog(parent_window, wxID_ANY, _(L("Archive preview")), wxDefaultPosition,
|
: DPIDialog(parent_window, wxID_ANY, _(L("Archive preview")), wxDefaultPosition,
|
||||||
wxSize(45 * wxGetApp().em_unit(), 40 * wxGetApp().em_unit()),
|
wxSize(45 * wxGetApp().em_unit(), 40 * wxGetApp().em_unit()),
|
||||||
wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxMAXIMIZE_BOX)
|
wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxMAXIMIZE_BOX)
|
||||||
, m_selected_paths (selected_paths)
|
, m_selected_paths_w_size (selected_paths_w_size)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
wxGetApp().UpdateDarkUI(this);
|
wxGetApp().UpdateDarkUI(this);
|
||||||
@ -213,7 +213,7 @@ FileArchiveDialog::FileArchiveDialog(wxWindow* parent_window, mz_zip_archive* ar
|
|||||||
const std::regex pattern_drop(".*[.](stl|obj|amf|3mf|prusa|step|stp)", std::regex::icase);
|
const std::regex pattern_drop(".*[.](stl|obj|amf|3mf|prusa|step|stp)", std::regex::icase);
|
||||||
mz_uint num_entries = mz_zip_reader_get_num_files(archive);
|
mz_uint num_entries = mz_zip_reader_get_num_files(archive);
|
||||||
mz_zip_archive_file_stat stat;
|
mz_zip_archive_file_stat stat;
|
||||||
std::vector<boost::filesystem::path> filtered_entries;
|
std::vector<std::pair<boost::filesystem::path, size_t>> filtered_entries; // second is unzipped size
|
||||||
for (mz_uint i = 0; i < num_entries; ++i) {
|
for (mz_uint i = 0; i < num_entries; ++i) {
|
||||||
if (mz_zip_reader_file_stat(archive, i, &stat)) {
|
if (mz_zip_reader_file_stat(archive, i, &stat)) {
|
||||||
std::string extra(1024, 0);
|
std::string extra(1024, 0);
|
||||||
@ -232,22 +232,25 @@ FileArchiveDialog::FileArchiveDialog(wxWindow* parent_window, mz_zip_archive* ar
|
|||||||
// filter out MACOS specific hidden files
|
// filter out MACOS specific hidden files
|
||||||
if (boost::algorithm::starts_with(path.string(), "__MACOSX"))
|
if (boost::algorithm::starts_with(path.string(), "__MACOSX"))
|
||||||
continue;
|
continue;
|
||||||
filtered_entries.emplace_back(std::move(path));
|
filtered_entries.emplace_back(std::move(path), stat.m_uncomp_size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// sorting files will help adjust_stack function to not create multiple same folders
|
// sorting files will help adjust_stack function to not create multiple same folders
|
||||||
std::sort(filtered_entries.begin(), filtered_entries.end(), [](const boost::filesystem::path& p1, const boost::filesystem::path& p2){ return p1.string() > p2.string(); });
|
std::sort(filtered_entries.begin(), filtered_entries.end(), [](const std::pair<boost::filesystem::path, size_t>& p1, const std::pair<boost::filesystem::path, size_t>& p2){ return p1.first.string() < p2.first.string(); });
|
||||||
size_t entry_count = 0;
|
size_t entry_count = 0;
|
||||||
size_t depth = 1;
|
size_t depth = 1;
|
||||||
for (const boost::filesystem::path& path : filtered_entries)
|
for (const auto& entry : filtered_entries)
|
||||||
{
|
{
|
||||||
|
const boost::filesystem::path& path = entry.first;
|
||||||
std::shared_ptr<ArchiveViewNode> parent(nullptr);
|
std::shared_ptr<ArchiveViewNode> parent(nullptr);
|
||||||
|
|
||||||
depth = std::max(depth, adjust_stack(path, stack));
|
depth = std::max(depth, adjust_stack(path, stack));
|
||||||
if (!stack.empty())
|
if (!stack.empty())
|
||||||
parent = stack.back();
|
parent = stack.back();
|
||||||
if (std::regex_match(path.extension().string(), pattern_drop)) { // this leaves out non-compatible files
|
if (std::regex_match(path.extension().string(), pattern_drop)) { // this leaves out non-compatible files
|
||||||
m_avc->get_model()->AddFile(parent, boost::nowide::widen(path.filename().string()), false)->set_fullpath(/*std::move(path)*/path); // filename string to wstring?
|
std::shared_ptr<ArchiveViewNode> new_node = m_avc->get_model()->AddFile(parent, boost::nowide::widen(path.filename().string()), false);
|
||||||
|
new_node->set_fullpath(/*std::move(path)*/path); // filename string to wstring?
|
||||||
|
new_node->set_size(entry.second);
|
||||||
entry_count++;
|
entry_count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -305,12 +308,12 @@ void FileArchiveDialog::on_open_button()
|
|||||||
wxDataViewItemArray top_items;
|
wxDataViewItemArray top_items;
|
||||||
m_avc->get_model()->GetChildren(wxDataViewItem(nullptr), top_items);
|
m_avc->get_model()->GetChildren(wxDataViewItem(nullptr), top_items);
|
||||||
|
|
||||||
std::function<void(ArchiveViewNode*)> deep_fill = [&paths = m_selected_paths, &deep_fill](ArchiveViewNode* node){
|
std::function<void(ArchiveViewNode*)> deep_fill = [&paths = m_selected_paths_w_size, &deep_fill](ArchiveViewNode* node){
|
||||||
if (node == nullptr)
|
if (node == nullptr)
|
||||||
return;
|
return;
|
||||||
if (node->get_children().empty()) {
|
if (node->get_children().empty()) {
|
||||||
if (node->get_toggle())
|
if (node->get_toggle())
|
||||||
paths.emplace_back(node->get_fullpath());
|
paths.emplace_back(node->get_fullpath(), node->get_size());
|
||||||
} else {
|
} else {
|
||||||
for (std::shared_ptr<ArchiveViewNode> child : node->get_children())
|
for (std::shared_ptr<ArchiveViewNode> child : node->get_children())
|
||||||
deep_fill(child.get());
|
deep_fill(child.get());
|
||||||
|
@ -33,6 +33,8 @@ public:
|
|||||||
void set_is_folder(bool is_folder) { m_folder = is_folder; }
|
void set_is_folder(bool is_folder) { m_folder = is_folder; }
|
||||||
void set_fullpath(boost::filesystem::path path) { m_fullpath = path; }
|
void set_fullpath(boost::filesystem::path path) { m_fullpath = path; }
|
||||||
boost::filesystem::path get_fullpath() const { return m_fullpath; }
|
boost::filesystem::path get_fullpath() const { return m_fullpath; }
|
||||||
|
void set_size(size_t size) { m_size = size; }
|
||||||
|
size_t get_size() const { return m_size; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
wxString m_name;
|
wxString m_name;
|
||||||
@ -43,6 +45,7 @@ private:
|
|||||||
bool m_folder { false };
|
bool m_folder { false };
|
||||||
boost::filesystem::path m_fullpath;
|
boost::filesystem::path m_fullpath;
|
||||||
bool m_container { false };
|
bool m_container { false };
|
||||||
|
size_t m_size { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
class ArchiveViewModel : public wxDataViewModel
|
class ArchiveViewModel : public wxDataViewModel
|
||||||
@ -100,7 +103,7 @@ protected:
|
|||||||
class FileArchiveDialog : public DPIDialog
|
class FileArchiveDialog : public DPIDialog
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FileArchiveDialog(wxWindow* parent_window, mz_zip_archive* archive, std::vector<boost::filesystem::path>& selected_paths);
|
FileArchiveDialog(wxWindow* parent_window, mz_zip_archive* archive, std::vector<std::pair<boost::filesystem::path, size_t>>& selected_paths_w_size);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void on_dpi_changed(const wxRect& suggested_rect) override;
|
void on_dpi_changed(const wxRect& suggested_rect) override;
|
||||||
@ -109,7 +112,9 @@ protected:
|
|||||||
void on_all_button();
|
void on_all_button();
|
||||||
void on_none_button();
|
void on_none_button();
|
||||||
|
|
||||||
std::vector<boost::filesystem::path>& m_selected_paths;
|
// chosen files are written into this vector and returned to caller via reference.
|
||||||
|
// path in archive and decompressed size. The size can be used to distinguish between files with same path.
|
||||||
|
std::vector<std::pair<boost::filesystem::path,size_t>>& m_selected_paths_w_size;
|
||||||
ArchiveViewCtrl* m_avc;
|
ArchiveViewCtrl* m_avc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -5558,96 +5558,98 @@ bool Plater::preview_zip_archive(const boost::filesystem::path& archive_path)
|
|||||||
std::string err_msg = GUI::format(_utf8("Loading of a zip archive on path %1% has failed."), archive_path.string());
|
std::string err_msg = GUI::format(_utf8("Loading of a zip archive on path %1% has failed."), archive_path.string());
|
||||||
throw Slic3r::FileIOError(err_msg);
|
throw Slic3r::FileIOError(err_msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
mz_uint num_entries = mz_zip_reader_get_num_files(&archive);
|
mz_uint num_entries = mz_zip_reader_get_num_files(&archive);
|
||||||
|
|
||||||
mz_zip_archive_file_stat stat;
|
mz_zip_archive_file_stat stat;
|
||||||
|
// selected_paths contains paths and its uncompressed size. The size is used to distinguish between files with same path.
|
||||||
std::vector<fs::path> selected_paths;
|
std::vector<std::pair<fs::path, size_t>> selected_paths;
|
||||||
|
|
||||||
FileArchiveDialog dlg(static_cast<wxWindow*>(wxGetApp().mainframe), &archive, selected_paths);
|
FileArchiveDialog dlg(static_cast<wxWindow*>(wxGetApp().mainframe), &archive, selected_paths);
|
||||||
if (dlg.ShowModal() == wxID_OK)
|
if (dlg.ShowModal() == wxID_OK)
|
||||||
{
|
{
|
||||||
std::string archive_path_string = archive_path.string();
|
std::string archive_path_string = archive_path.string();
|
||||||
archive_path_string = archive_path_string.substr(0, archive_path_string.size() - 4);
|
archive_path_string = archive_path_string.substr(0, archive_path_string.size() - 4);
|
||||||
|
|
||||||
fs::path archive_dir(wxStandardPaths::Get().GetTempDir().utf8_str().data());
|
fs::path archive_dir(wxStandardPaths::Get().GetTempDir().utf8_str().data());
|
||||||
|
|
||||||
|
for (auto& path_w_size : selected_paths) {
|
||||||
|
const fs::path& path = path_w_size.first;
|
||||||
|
size_t size = path_w_size.second;
|
||||||
|
// find path in zip archive
|
||||||
|
for (mz_uint i = 0; i < num_entries; ++i) {
|
||||||
|
if (mz_zip_reader_file_stat(&archive, i, &stat)) {
|
||||||
|
if (size != stat.m_uncomp_size) // size must fit
|
||||||
|
continue;
|
||||||
|
wxString wname = boost::nowide::widen(stat.m_filename);
|
||||||
|
std::string name = boost::nowide::narrow(wname);
|
||||||
|
fs::path archive_path(name);
|
||||||
|
|
||||||
for (mz_uint i = 0; i < num_entries; ++i) {
|
std::string extra(1024, 0);
|
||||||
if (mz_zip_reader_file_stat(&archive, i, &stat)) {
|
size_t extra_size = mz_zip_reader_get_filename_from_extra(&archive, i, extra.data(), extra.size());
|
||||||
wxString wname = boost::nowide::widen(stat.m_filename);
|
if (extra_size > 0) {
|
||||||
std::string name = boost::nowide::narrow(wname);
|
archive_path = fs::path(extra.substr(0, extra_size));
|
||||||
fs::path archive_path(name);
|
name = archive_path.string();
|
||||||
|
}
|
||||||
|
|
||||||
std::string extra(1024, 0);
|
if (archive_path.empty())
|
||||||
size_t extra_size = mz_zip_reader_get_filename_from_extra(&archive, i, extra.data(), extra.size());
|
continue;
|
||||||
if (extra_size > 0) {
|
if (path != archive_path)
|
||||||
archive_path = fs::path(extra.substr(0, extra_size));
|
continue;
|
||||||
name = archive_path.string();
|
// decompressing
|
||||||
}
|
try
|
||||||
|
{
|
||||||
|
std::replace(name.begin(), name.end(), '\\', '/');
|
||||||
|
// rename if file exists
|
||||||
|
std::string filename = path.filename().string();
|
||||||
|
std::string extension = boost::filesystem::extension(path);
|
||||||
|
std::string just_filename = filename.substr(0, filename.size() - extension.size());
|
||||||
|
std::string final_filename = just_filename;
|
||||||
|
|
||||||
if (archive_path.empty())
|
size_t version = 0;
|
||||||
continue;
|
while (fs::exists(archive_dir / (final_filename + extension)))
|
||||||
for (const auto& path : selected_paths) {
|
|
||||||
if (path == archive_path) {
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
std::replace(name.begin(), name.end(), '\\', '/');
|
++version;
|
||||||
// rename if file exists
|
final_filename = just_filename + "(" + std::to_string(version) + ")";
|
||||||
std::string filename = path.filename().string();
|
|
||||||
std::string extension = boost::filesystem::extension(path);
|
|
||||||
std::string just_filename = filename.substr(0, filename.size() - extension.size());
|
|
||||||
std::string final_filename = just_filename;
|
|
||||||
|
|
||||||
size_t version = 0;
|
|
||||||
while (fs::exists(archive_dir / (final_filename + extension)))
|
|
||||||
{
|
|
||||||
++version;
|
|
||||||
final_filename = just_filename + "(" + std::to_string(version) + ")";
|
|
||||||
}
|
|
||||||
filename = final_filename + extension;
|
|
||||||
fs::path final_path = archive_dir / filename;
|
|
||||||
|
|
||||||
std::string buffer((size_t)stat.m_uncomp_size, 0);
|
|
||||||
mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0);
|
|
||||||
if (res == 0) {
|
|
||||||
wxString error_log = GUI::format_wxstr(_L("Failed to unzip file to %1%: %2% "), final_path.string(), mz_zip_get_error_string(mz_zip_get_last_error(&archive)));
|
|
||||||
BOOST_LOG_TRIVIAL(error) << error_log;
|
|
||||||
show_error(nullptr, error_log);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
fs::fstream file(final_path, std::ios::out | std::ios::binary | std::ios::trunc);
|
|
||||||
file.write(buffer.c_str(), buffer.size());
|
|
||||||
file.close();
|
|
||||||
if (!fs::exists(final_path)) {
|
|
||||||
wxString error_log = GUI::format_wxstr(_L("Failed to find unzipped file at %1%. Unzipping of file has failed."), final_path.string());
|
|
||||||
BOOST_LOG_TRIVIAL(error) << error_log;
|
|
||||||
show_error(nullptr, error_log);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
BOOST_LOG_TRIVIAL(info) << "Unzipped " << final_path;
|
|
||||||
|
|
||||||
if (!boost::algorithm::iends_with(filename, ".3mf") && !boost::algorithm::iends_with(filename, ".amf")) {
|
|
||||||
non_project_paths.emplace_back(final_path);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// if 3mf - read archive headers to find project file
|
|
||||||
if ((boost::algorithm::iends_with(filename, ".3mf") && !is_project_3mf(final_path.string())) ||
|
|
||||||
(boost::algorithm::iends_with(filename, ".amf") && !boost::algorithm::iends_with(filename, ".zip.amf"))) {
|
|
||||||
non_project_paths.emplace_back(final_path);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
project_paths.emplace_back(final_path);
|
|
||||||
}
|
}
|
||||||
catch (const std::exception& e)
|
filename = final_filename + extension;
|
||||||
{
|
fs::path final_path = archive_dir / filename;
|
||||||
// ensure the zip archive is closed and rethrow the exception
|
std::string buffer((size_t)stat.m_uncomp_size, 0);
|
||||||
close_zip_reader(&archive);
|
// Decompress action. We already has correct file index in stat structure.
|
||||||
throw Slic3r::FileIOError(e.what());
|
mz_bool res = mz_zip_reader_extract_to_mem(&archive, stat.m_file_index, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0);
|
||||||
|
if (res == 0) {
|
||||||
|
wxString error_log = GUI::format_wxstr(_L("Failed to unzip file to %1%: %2% "), final_path.string(), mz_zip_get_error_string(mz_zip_get_last_error(&archive)));
|
||||||
|
BOOST_LOG_TRIVIAL(error) << error_log;
|
||||||
|
show_error(nullptr, error_log);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
// write buffer to file
|
||||||
|
fs::fstream file(final_path, std::ios::out | std::ios::binary | std::ios::trunc);
|
||||||
|
file.write(buffer.c_str(), buffer.size());
|
||||||
|
file.close();
|
||||||
|
if (!fs::exists(final_path)) {
|
||||||
|
wxString error_log = GUI::format_wxstr(_L("Failed to find unzipped file at %1%. Unzipping of file has failed."), final_path.string());
|
||||||
|
BOOST_LOG_TRIVIAL(error) << error_log;
|
||||||
|
show_error(nullptr, error_log);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
BOOST_LOG_TRIVIAL(info) << "Unzipped " << final_path;
|
||||||
|
if (!boost::algorithm::iends_with(filename, ".3mf") && !boost::algorithm::iends_with(filename, ".amf")) {
|
||||||
|
non_project_paths.emplace_back(final_path);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// if 3mf - read archive headers to find project file
|
||||||
|
if ((boost::algorithm::iends_with(filename, ".3mf") && !is_project_3mf(final_path.string())) ||
|
||||||
|
(boost::algorithm::iends_with(filename, ".amf") && !boost::algorithm::iends_with(filename, ".zip.amf"))) {
|
||||||
|
non_project_paths.emplace_back(final_path);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
project_paths.emplace_back(final_path);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
catch (const std::exception& e)
|
||||||
|
{
|
||||||
|
// ensure the zip archive is closed and rethrow the exception
|
||||||
|
close_zip_reader(&archive);
|
||||||
|
throw Slic3r::FileIOError(e.what());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1135,4 +1135,16 @@ void PrusaConnect::set_http_post_header_args(Http& http, PrintHostPostUploadActi
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxString PrusaConnect::get_test_ok_msg() const
|
||||||
|
{
|
||||||
|
return _(L("Connection to PrusaConnect works correctly."));
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString PrusaConnect::get_test_failed_msg(wxString& msg) const
|
||||||
|
{
|
||||||
|
return GUI::from_u8((boost::format("%s: %s")
|
||||||
|
% _utf8(L("Could not connect to PrusaConnect"))
|
||||||
|
% std::string(msg.ToUTF8())).str());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -130,8 +130,11 @@ class PrusaConnect : public PrusaLink
|
|||||||
public:
|
public:
|
||||||
PrusaConnect(DynamicPrintConfig* config);
|
PrusaConnect(DynamicPrintConfig* config);
|
||||||
~PrusaConnect() override = default;
|
~PrusaConnect() override = default;
|
||||||
|
wxString get_test_ok_msg() const override;
|
||||||
|
wxString get_test_failed_msg(wxString& msg) const override;
|
||||||
PrintHostPostUploadActions get_post_upload_actions() const override { return PrintHostPostUploadAction::StartPrint | PrintHostPostUploadAction::QueuePrint; }
|
PrintHostPostUploadActions get_post_upload_actions() const override { return PrintHostPostUploadAction::StartPrint | PrintHostPostUploadAction::QueuePrint; }
|
||||||
const char* get_name() const override { return "PrusaConnect"; }
|
const char* get_name() const override { return "PrusaConnect"; }
|
||||||
|
bool get_storage(wxArrayString& storage_path, wxArrayString& storage_name) const override { return false; }
|
||||||
protected:
|
protected:
|
||||||
void set_http_post_header_args(Http& http, PrintHostPostUploadAction post_action) const override;
|
void set_http_post_header_args(Http& http, PrintHostPostUploadAction post_action) const override;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user