mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-13 22:35:51 +08:00
Merge branch 'master' into fs_emboss
This commit is contained in:
commit
bc825ec7d7
@ -1,9 +1,17 @@
|
||||
min_slic3r_version = 2.6.0-alpha5
|
||||
1.7.0-alpha2 Updated compatibility condition in some filament profiles (Prusa XL).
|
||||
1.7.0-alpha1 Added profiles for Original Prusa XL. Added filament profile for Prusament PETG Tungsten 75%.
|
||||
min_slic3r_version = 2.6.0-alpha1
|
||||
1.7.0-alpha0 Added profiles for Print With Smile filaments.
|
||||
1.6.0-alpha2 Added profile for Prusament PETG Carbon Fiber and Fiberthree F3 PA-GF30 Pro. Updated acceleration settings for Prusa MINI.
|
||||
1.6.0-alpha1 Updated FW version notification. Decreased min layer time for PLA.
|
||||
1.6.0-alpha0 Default top fill set to monotonic lines. Updated infill/perimeter overlap values. Updated output filename format. Enabled dynamic overhang speeds.
|
||||
min_slic3r_version = 2.5.1-rc0
|
||||
1.6.2 Updated compatibility condition in some filament profiles (Prusa XL).
|
||||
1.6.1 Added filament profile for Prusament PETG Tungsten 75%. Updated Prusa XL profiles.
|
||||
1.6.0 Added Original Prusa XL profiles. Updated acceleration settings for Prusa MINI. Updated infill/perimeter overlap values.
|
||||
min_slic3r_version = 2.5.0-alpha0
|
||||
1.5.8 Added filament profile for Prusament PETG Tungsten 75%. Updated FW version notification.
|
||||
1.5.7 Added filament profile for Prusament PETG Carbon Fiber and Fiberthree F3 PA-GF30 Pro.
|
||||
1.5.6 Updated FW version notification (MK2.5/MK3 family). Added filament profile for Kimya PEBA-S.
|
||||
1.5.5 Added new Prusament Resin material profiles. Enabled g-code thumbnails for MK2.5 family printers.
|
||||
@ -15,6 +23,7 @@ min_slic3r_version = 2.5.0-alpha0
|
||||
1.5.0-alpha1 Added filament profile for Prusament PA11 Carbon Fiber. Added profiles for multiple 3D-Fuel filaments.
|
||||
1.5.0-alpha0 Added parameters for Arachne perimeter generator. Changed default seam position. Updated output filename format.
|
||||
min_slic3r_version = 2.4.0-rc
|
||||
1.4.10 Updated FW version notification.
|
||||
1.4.9 Updated FW version notification.
|
||||
1.4.8 Added filament and SLA material profiles. Updated settings.
|
||||
1.4.7 Added filament profile for Prusament PA11 Carbon Fiber. Added profiles for multiple 3D-Fuel filaments.
|
||||
@ -45,6 +54,7 @@ min_slic3r_version = 2.4.0-alpha0
|
||||
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.0-alpha0 Disabled thick bridges, updated support settings.
|
||||
min_slic3r_version = 2.3.2-alpha0
|
||||
1.3.9 Updated FW version notification.
|
||||
1.3.8 Updated FW version notification.
|
||||
1.3.7 Updated firmware version.
|
||||
1.3.6 Updated firmware version.
|
||||
@ -55,6 +65,7 @@ min_slic3r_version = 2.3.2-alpha0
|
||||
1.3.1 Added multiple add:north and Extrudr filament profiles. Updated support head settings (SL1S).
|
||||
1.3.0 Added SL1S SPEED profiles.
|
||||
min_slic3r_version = 2.3.0-rc1
|
||||
1.2.14 Updated FW version notification.
|
||||
1.2.13 Updated FW version notification.
|
||||
1.2.12 Updated firmware version.
|
||||
1.2.11 Updated firmware version.
|
||||
|
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
|
||||
bridge_fan_control = bridge_fan_speed > fan_speed_new;
|
||||
} else {
|
||||
} else { // fan disabled
|
||||
bridge_fan_control = false;
|
||||
bridge_fan_speed = 0;
|
||||
fan_speed_new = 0;
|
||||
custom_fan_speed_limits.second = 0;
|
||||
}
|
||||
if (fan_speed_new != m_fan_speed) {
|
||||
m_fan_speed = fan_speed_new;
|
||||
|
@ -291,10 +291,12 @@ Surfaces expand_bridges_detect_orientations(
|
||||
uint32_t src_id = it->src_id;
|
||||
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)
|
||||
if (group_id(bridge_id) == bridge_id) {
|
||||
// Head of the group.
|
||||
acc.clear();
|
||||
for (uint32_t bridge_id2 = bridge_id; bridge_id2 < uint32_t(bridges.size()); ++ bridge_id2)
|
||||
if (group_id(bridge_id) == bridge_id) {
|
||||
if (group_id(bridge_id2) == bridge_id) {
|
||||
append(acc, to_polygons(std::move(bridges[bridge_id2].expolygon)));
|
||||
auto it_bridge_expansion = bridges[bridge_id2].bridge_expansion_begin;
|
||||
assert(it_bridge_expansion == bridge_expansions.end() || it_bridge_expansion->src_id == bridge_id2);
|
||||
|
@ -14,11 +14,13 @@
|
||||
#include "GCode/WipeTower.hpp"
|
||||
#include "Utils.hpp"
|
||||
#include "BuildVolume.hpp"
|
||||
#include "format.hpp"
|
||||
|
||||
#include <float.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <limits>
|
||||
#include <string>
|
||||
#include <unordered_set>
|
||||
#include <boost/filesystem/path.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) {
|
||||
std::string message;
|
||||
switch (cause) {
|
||||
case SupportSpotsGenerator::SupportPointCause::LongBridge: message = L("long bridging extrusions"); break;
|
||||
case SupportSpotsGenerator::SupportPointCause::FloatingBridgeAnchor: message = L("floating bridge anchors"); break;
|
||||
//TRN Alert when support is needed. Describes that the model has long bridging extrusions which may print badly
|
||||
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:
|
||||
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 {
|
||||
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;
|
||||
case SupportSpotsGenerator::SupportPointCause::SeparationFromBed: message = L("low bed adhesion"); break;
|
||||
case SupportSpotsGenerator::SupportPointCause::UnstableFloatingPart: message = L("floating object part"); break;
|
||||
case SupportSpotsGenerator::SupportPointCause::WeakObjectPart: message = L("thin fragile section"); break;
|
||||
//TRN Alert when support is needed. Describes that the print has low bed adhesion and may became loose.
|
||||
case SupportSpotsGenerator::SupportPointCause::SeparationFromBed: message = L("Low bed adhesion"); 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;
|
||||
};
|
||||
|
||||
// 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
|
||||
std::vector<std::pair<const PrintObject *, std::vector<std::pair<SupportSpotsGenerator::SupportPointCause, bool>>>> objects_isssues;
|
||||
|
||||
@ -1212,40 +1259,53 @@ void Print::alert_when_supports_needed()
|
||||
for (const auto &obj : objects_isssues) {
|
||||
for (const auto &issue : obj.second) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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()) {
|
||||
// there are more objects than causes, group by 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) {
|
||||
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 {
|
||||
// more causes than objects, group by objects
|
||||
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) {
|
||||
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;
|
||||
auto brim_part = " " + (brim_or_supp ? L("or") : L("and")) + " " + L("brim");
|
||||
message += "\n" + L("Consider enabling supports") + (recommend_brim ? brim_part : "") + ".";
|
||||
// first, gather sublements into single line list, store in first subelement
|
||||
for (auto &pair : message_elements) {
|
||||
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) {
|
||||
this->active_step_add_warning(PrintStateBase::WarningLevel::NON_CRITICAL, message);
|
||||
|
@ -1627,7 +1627,7 @@ void PrintObject::bridge_over_infill()
|
||||
contains_only_lightning = false;
|
||||
}
|
||||
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()) {
|
||||
if (surface.surface_type != stInternal || region->region().config().fill_density.value == 100) {
|
||||
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);
|
||||
unsupported_area = shrink(unsupported_area, 5 * spacing);
|
||||
unsupported_area = shrink(unsupported_area, 4 * spacing);
|
||||
unsupported_area = diff(unsupported_area, lower_layer_solids);
|
||||
|
||||
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;
|
||||
if (!unsupported.empty() && (!partially_supported || area(unsupported) > 5 * 5 * spacing * spacing)) {
|
||||
Polygons worth_bridging = intersection(to_polygons(s->expolygon), expand(unsupported, 5 * spacing));
|
||||
for (Polygon p : diff(to_polygons(s->expolygon), worth_bridging)) {
|
||||
if (p.area() < region->flow(frSolidInfill, true).scaled_spacing() * scale_(12.0)) {
|
||||
for (const Polygon& p : diff(to_polygons(s->expolygon), expand(worth_bridging, spacing))) {
|
||||
auto area = p.area();
|
||||
if (area < spacing * scale_(12.0) && area > spacing * spacing) {
|
||||
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));
|
||||
|
||||
#ifdef DEBUG_BRIDGE_OVER_INFILL
|
||||
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(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
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
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::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.
|
||||
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
|
||||
Polygons lower_layers_sparse_infill{};
|
||||
Polygons not_sparse_infill{};
|
||||
// Gather layers sparse infill areas, to depth defined by used bridge flow
|
||||
ExPolygons layers_sparse_infill{};
|
||||
ExPolygons not_sparse_infill{};
|
||||
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) {
|
||||
// Stop iterating if layer is lower than bottom_z.
|
||||
@ -1778,19 +1786,19 @@ void PrintObject::bridge_over_infill()
|
||||
for (const LayerRegion *region : layer->regions()) {
|
||||
bool has_low_density = region->region().config().fill_density.value < 100;
|
||||
for (const Surface &surface : region->fill_surfaces()) {
|
||||
if (surface.surface_type == stInternal && has_low_density) {
|
||||
Polygons p = to_polygons(surface.expolygon);
|
||||
lower_layers_sparse_infill.insert(lower_layers_sparse_infill.end(), p.begin(), p.end());
|
||||
if ((surface.surface_type == stInternal && has_low_density) || surface.surface_type == stInternalVoid ) {
|
||||
layers_sparse_infill.push_back(surface.expolygon);
|
||||
} else {
|
||||
Polygons p = to_polygons(surface.expolygon);
|
||||
not_sparse_infill.insert(not_sparse_infill.end(), p.begin(), p.end());
|
||||
not_sparse_infill.push_back(surface.expolygon);
|
||||
}
|
||||
}
|
||||
}
|
||||
lower_layers_sparse_infill = union_(lower_layers_sparse_infill);
|
||||
}
|
||||
|
||||
return diff(lower_layers_sparse_infill, not_sparse_infill);
|
||||
layers_sparse_infill = union_ex(layers_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
|
||||
@ -1927,7 +1935,7 @@ void PrintObject::bridge_over_infill()
|
||||
});
|
||||
if (maybe_below_anchor != anchors_intersections.rend()) {
|
||||
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,
|
||||
@ -1936,7 +1944,7 @@ void PrintObject::bridge_over_infill()
|
||||
});
|
||||
if (maybe_upper_anchor != anchors_intersections.end()) {
|
||||
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),
|
||||
&surfaces_by_layer, &clustered_layers_for_threads,
|
||||
target_flow_height_factor, &surfaces_by_layer,
|
||||
&clustered_layers_for_threads,
|
||||
gather_areas_w_depth, &infill_lines,
|
||||
determine_bridging_angle,
|
||||
construct_anchored_polygon](
|
||||
@ -2058,12 +2067,13 @@ void PrintObject::bridge_over_infill()
|
||||
});
|
||||
|
||||
// Gather deep infill areas, where thick bridges fit
|
||||
coordf_t thick_bridges_depth = surfaces_by_layer[lidx].front().region->flow(frSolidInfill, true).height();
|
||||
Polygons deep_infill_area = gather_areas_w_depth(po, lidx, thick_bridges_depth * 0.5);
|
||||
coordf_t spacing = surfaces_by_layer[lidx].front().region->flow(frSolidInfill, true).scaled_spacing();
|
||||
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
|
||||
// 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) {
|
||||
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];
|
||||
@ -2078,28 +2088,52 @@ 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
|
||||
Polygons expansion_area;
|
||||
Polygons total_fill_area;
|
||||
for (const LayerRegion *region : layer->regions()) {
|
||||
auto polys = to_polygons(region->fill_surfaces().filter_by_type(stInternal));
|
||||
expansion_area.insert(expansion_area.end(), polys.begin(), polys.end());
|
||||
Polygons internal_polys = to_polygons(region->fill_surfaces().filter_by_type(stInternal));
|
||||
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());
|
||||
}
|
||||
total_fill_area = closing(total_fill_area, SCALED_EPSILON);
|
||||
expansion_area = closing(expansion_area, SCALED_EPSILON);
|
||||
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;
|
||||
expanded_surfaces.reserve(surfaces_by_layer[lidx].size());
|
||||
for (const CandidateSurface &candidate : surfaces_by_layer[lidx]) {
|
||||
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())
|
||||
continue;
|
||||
|
||||
area_to_be_bridge = expand(area_to_be_bridge, flow.scaled_spacing());
|
||||
Polygons boundary_area = union_(expansion_area, area_to_be_bridge);
|
||||
Polylines boundary_plines = to_polylines(boundary_area);
|
||||
Polylines boundary_plines = to_polylines(expand(total_fill_area, 1.3 * flow.scaled_spacing()));
|
||||
{
|
||||
Polylines limiting_plines = to_polylines(expand(limiting_area, 0.3*flow.spacing()));
|
||||
boundary_plines.insert(boundary_plines.end(), limiting_plines.begin(), limiting_plines.end());
|
||||
}
|
||||
|
||||
#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()) {
|
||||
@ -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 = intersection(bridging_area, limiting_area);
|
||||
bridging_area = intersection(bridging_area, total_fill_area);
|
||||
expansion_area = diff(expansion_area, bridging_area);
|
||||
|
||||
#ifdef DEBUG_BRIDGE_OVER_INFILL
|
||||
debug_draw(std::to_string(lidx) + "_" + std::to_string(cluster_idx) + "_" + std::to_string(job_idx) +
|
||||
"_expanded_bridging",
|
||||
to_lines(layer->lslices), to_lines(boundary_plines), to_lines(candidate.new_polys),
|
||||
to_lines(bridging_area));
|
||||
debug_draw(std::to_string(lidx) + "_" + std::to_string(cluster_idx) + "_" + std::to_string(job_idx) + "_" + "_expanded_bridging" + std::to_string(r),
|
||||
to_lines(layer->lslices), to_lines(boundary_plines), to_lines(candidate.new_polys), to_lines(bridging_area));
|
||||
#endif
|
||||
|
||||
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,
|
||||
wxSize(45 * wxGetApp().em_unit(), 40 * wxGetApp().em_unit()),
|
||||
wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxMAXIMIZE_BOX)
|
||||
, m_selected_paths (selected_paths)
|
||||
, m_selected_paths_w_size (selected_paths_w_size)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
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);
|
||||
mz_uint num_entries = mz_zip_reader_get_num_files(archive);
|
||||
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) {
|
||||
if (mz_zip_reader_file_stat(archive, i, &stat)) {
|
||||
std::string extra(1024, 0);
|
||||
@ -232,22 +232,25 @@ FileArchiveDialog::FileArchiveDialog(wxWindow* parent_window, mz_zip_archive* ar
|
||||
// filter out MACOS specific hidden files
|
||||
if (boost::algorithm::starts_with(path.string(), "__MACOSX"))
|
||||
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
|
||||
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 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);
|
||||
|
||||
depth = std::max(depth, adjust_stack(path, stack));
|
||||
if (!stack.empty())
|
||||
parent = stack.back();
|
||||
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++;
|
||||
}
|
||||
}
|
||||
@ -305,12 +308,12 @@ void FileArchiveDialog::on_open_button()
|
||||
wxDataViewItemArray 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)
|
||||
return;
|
||||
if (node->get_children().empty()) {
|
||||
if (node->get_toggle())
|
||||
paths.emplace_back(node->get_fullpath());
|
||||
paths.emplace_back(node->get_fullpath(), node->get_size());
|
||||
} else {
|
||||
for (std::shared_ptr<ArchiveViewNode> child : node->get_children())
|
||||
deep_fill(child.get());
|
||||
|
@ -33,6 +33,8 @@ public:
|
||||
void set_is_folder(bool is_folder) { m_folder = is_folder; }
|
||||
void set_fullpath(boost::filesystem::path path) { m_fullpath = path; }
|
||||
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:
|
||||
wxString m_name;
|
||||
@ -43,6 +45,7 @@ private:
|
||||
bool m_folder { false };
|
||||
boost::filesystem::path m_fullpath;
|
||||
bool m_container { false };
|
||||
size_t m_size { 0 };
|
||||
};
|
||||
|
||||
class ArchiveViewModel : public wxDataViewModel
|
||||
@ -100,7 +103,7 @@ protected:
|
||||
class FileArchiveDialog : public DPIDialog
|
||||
{
|
||||
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:
|
||||
void on_dpi_changed(const wxRect& suggested_rect) override;
|
||||
@ -109,7 +112,9 @@ protected:
|
||||
void on_all_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;
|
||||
};
|
||||
|
||||
|
@ -5558,23 +5558,25 @@ 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());
|
||||
throw Slic3r::FileIOError(err_msg);
|
||||
}
|
||||
|
||||
mz_uint num_entries = mz_zip_reader_get_num_files(&archive);
|
||||
|
||||
mz_zip_archive_file_stat stat;
|
||||
|
||||
std::vector<fs::path> selected_paths;
|
||||
|
||||
// selected_paths contains paths and its uncompressed size. The size is used to distinguish between files with same path.
|
||||
std::vector<std::pair<fs::path, size_t>> selected_paths;
|
||||
FileArchiveDialog dlg(static_cast<wxWindow*>(wxGetApp().mainframe), &archive, selected_paths);
|
||||
if (dlg.ShowModal() == wxID_OK)
|
||||
{
|
||||
std::string archive_path_string = archive_path.string();
|
||||
archive_path_string = archive_path_string.substr(0, archive_path_string.size() - 4);
|
||||
|
||||
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);
|
||||
@ -5588,8 +5590,9 @@ bool Plater::preview_zip_archive(const boost::filesystem::path& archive_path)
|
||||
|
||||
if (archive_path.empty())
|
||||
continue;
|
||||
for (const auto& path : selected_paths) {
|
||||
if (path == archive_path) {
|
||||
if (path != archive_path)
|
||||
continue;
|
||||
// decompressing
|
||||
try
|
||||
{
|
||||
std::replace(name.begin(), name.end(), '\\', '/');
|
||||
@ -5607,15 +5610,16 @@ bool Plater::preview_zip_archive(const boost::filesystem::path& archive_path)
|
||||
}
|
||||
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);
|
||||
// Decompress action. We already has correct file index in stat structure.
|
||||
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);
|
||||
continue;
|
||||
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();
|
||||
@ -5623,22 +5627,22 @@ bool Plater::preview_zip_archive(const boost::filesystem::path& archive_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;
|
||||
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);
|
||||
continue;
|
||||
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);
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
|
||||
project_paths.emplace_back(final_path);
|
||||
break;
|
||||
}
|
||||
catch (const std::exception& e)
|
||||
{
|
||||
@ -5646,8 +5650,6 @@ bool Plater::preview_zip_archive(const boost::filesystem::path& archive_path)
|
||||
close_zip_reader(&archive);
|
||||
throw Slic3r::FileIOError(e.what());
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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:
|
||||
PrusaConnect(DynamicPrintConfig* config);
|
||||
~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; }
|
||||
const char* get_name() const override { return "PrusaConnect"; }
|
||||
bool get_storage(wxArrayString& storage_path, wxArrayString& storage_name) const override { return false; }
|
||||
protected:
|
||||
void set_http_post_header_args(Http& http, PrintHostPostUploadAction post_action) const override;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user