Merge branch 'master' into fs_import_svg

This commit is contained in:
Filip Sykala - NTB T15p 2023-10-23 16:51:20 +02:00
commit e7ece23d01
49 changed files with 71133 additions and 53007 deletions

View File

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="a" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="b" d="m8.54,4.31c-.53-.19-.81-.69-.73-1.32.08-.62.55-1.01,1.21-1.01.46,0,.82.21,1,.58.1.2.1.22.1.55,0,.43-.07.61-.31.87-.24.26-.46.35-.84.36-.21,0-.33,0-.43-.04Z" style="fill:#ed6b21; isolation:isolate; opacity:1;"/><path id="c" d="m6.82,13.97c-.51-.14-.74-.4-.77-.86-.02-.28-.04-.15.57-3.12.22-1.07.44-2.13.48-2.34.13-.71.07-.77-.77-.81-.21-.01-.38-.03-.39-.04s0-.09.02-.18c.04-.18,0-.16.69-.31.62-.14,1.09-.19,1.63-.2.67,0,.9.07,1.13.36.09.11.09.13.09.41,0,.25-.06.57-.39,2.17-.78,3.74-.79,3.82-.68,3.99.03.04.08.1.12.13.12.08.47.14.8.14h.3s-.02.18-.02.18c-.01.1-.04.19-.05.2-.05.03-.88.2-1.24.26-.45.07-1.31.09-1.51.03h0Z" style="fill:#ed6b21; isolation:isolate; opacity:1;"/><polyline points="14.5 3.5 14.5 1.5 12.5 1.5" style="fill:none; stroke:808080; stroke-linecap:round; stroke-miterlimit:10;"/><polyline points="3.5 1.5 1.5 1.5 1.5 3.5" style="fill:none; stroke:#808080; stroke-linecap:round; stroke-miterlimit:10;"/><polyline points="1.5 12.5 1.5 14.5 3.5 14.5" style="fill:none; stroke:#808080; stroke-linecap:round; stroke-miterlimit:10;"/><polyline points="12.5 14.5 14.5 14.5 14.5 12.5" style="fill:none; stroke:#808080; stroke-linecap:round; stroke-miterlimit:10;"/></svg> <?xml version="1.0" encoding="UTF-8"?><svg id="a" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="b" d="m8.54,4.31c-.53-.19-.81-.69-.73-1.32.08-.62.55-1.01,1.21-1.01.46,0,.82.21,1,.58.1.2.1.22.1.55,0,.43-.07.61-.31.87-.24.26-.46.35-.84.36-.21,0-.33,0-.43-.04Z" style="fill:#ed6b21; isolation:isolate; opacity:1;"/><path id="c" d="m6.82,13.97c-.51-.14-.74-.4-.77-.86-.02-.28-.04-.15.57-3.12.22-1.07.44-2.13.48-2.34.13-.71.07-.77-.77-.81-.21-.01-.38-.03-.39-.04s0-.09.02-.18c.04-.18,0-.16.69-.31.62-.14,1.09-.19,1.63-.2.67,0,.9.07,1.13.36.09.11.09.13.09.41,0,.25-.06.57-.39,2.17-.78,3.74-.79,3.82-.68,3.99.03.04.08.1.12.13.12.08.47.14.8.14h.3s-.02.18-.02.18c-.01.1-.04.19-.05.2-.05.03-.88.2-1.24.26-.45.07-1.31.09-1.51.03h0Z" style="fill:#ed6b21; isolation:isolate; opacity:1;"/><polyline points="14.5 3.5 14.5 1.5 12.5 1.5" style="fill:none; stroke:#808080; stroke-linecap:round; stroke-miterlimit:10;"/><polyline points="3.5 1.5 1.5 1.5 1.5 3.5" style="fill:none; stroke:#808080; stroke-linecap:round; stroke-miterlimit:10;"/><polyline points="1.5 12.5 1.5 14.5 3.5 14.5" style="fill:none; stroke:#808080; stroke-linecap:round; stroke-miterlimit:10;"/><polyline points="12.5 14.5 14.5 14.5 14.5 12.5" style="fill:none; stroke:#808080; stroke-linecap:round; stroke-miterlimit:10;"/></svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="a" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><rect x="1" y="7" width="2" height="6" rx="1" ry="1" style="fill:#ed6b21;"/><rect x="5" y="2" width="2" height="11" rx="1" ry="1" style="fill:#ed6b21;"/><rect x="9" y="3" width="2" height="10" rx="1" ry="1" style="fill:#ed6b21;"/><rect x="13" y="5" width="2" height="8" rx="1" ry="1" style="fill:#ed6b21;"/></svg> <?xml version="1.0" encoding="UTF-8"?><svg id="a" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><rect x="1" y="7" width="2" height="6" rx="1" ry="1" style="fill:#808080;"/><rect x="5" y="2" width="2" height="11" rx="1" ry="1" style="fill:#808080;"/><rect x="9" y="3" width="2" height="10" rx="1" ry="1" style="fill:#808080;"/><rect x="13" y="5" width="2" height="8" rx="1" ry="1" style="fill:#808080;"/></svg>

Before

Width:  |  Height:  |  Size: 418 B

After

Width:  |  Height:  |  Size: 418 B

View File

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="a" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><polyline points="4.5 2.5 2.5 2.5 2.5 13.5 4.5 13.5" style="fill:none; stroke:808080; stroke-linecap:round; stroke-miterlimit:10;"/><polyline points="11.5 13.5 13.5 13.5 13.5 2.5 11.5 2.5" style="fill:none; stroke:808080; stroke-linecap:round; stroke-miterlimit:10;"/><path d="m9,8v3.14c0,.47-.45.86-1,.86h0c-.55,0-1-.38-1-.86v-3.14h2Z" style="fill:#808080;"/><circle cx="8" cy="6" r="1" style="fill:#808080;"/></svg> <?xml version="1.0" encoding="UTF-8"?><svg id="a" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><polyline points="4.5 2.5 2.5 2.5 2.5 13.5 4.5 13.5" style="fill:none; stroke:#808080; stroke-linecap:round; stroke-miterlimit:10;"/><polyline points="11.5 13.5 13.5 13.5 13.5 2.5 11.5 2.5" style="fill:none; stroke:#808080; stroke-linecap:round; stroke-miterlimit:10;"/><path d="m9,8v3.14c0,.47-.45.86-1,.86h0c-.55,0-1-.38-1-.86v-3.14h2Z" style="fill:#808080;"/><circle cx="8" cy="6" r="1" style="fill:#808080;"/></svg>

Before

Width:  |  Height:  |  Size: 522 B

After

Width:  |  Height:  |  Size: 524 B

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,5 @@
min_slic3r_version = 2.6.0 min_slic3r_version = 2.6.0
0.0.4 Updated Start G-Codes.
0.0.3 Added new printer profile. 0.0.3 Added new printer profile.
0.0.2 Updated initial layer heights. 0.0.2 Updated initial layer heights.
0.0.1 Initial version. 0.0.1 Initial version.

View File

@ -10,7 +10,7 @@ name = LNL3D
# Configuration version of this file. Config file will only be installed, if the config_version differs. # Configuration version of this file. Config file will only be installed, if the config_version differs.
# This means, the server may force the PrusaSlicer configuration to be downgraded. # This means, the server may force the PrusaSlicer configuration to be downgraded.
config_version = 0.0.3 config_version = 0.0.4
# Where to get the updates from? # Where to get the updates from?
config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/LNL3D/ config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/LNL3D/
@ -891,7 +891,7 @@ wipe = 1,1
z_offset = 0 z_offset = 0
printer_model = printer_model =
default_filament_profile = "Generic PLA @LNL3D" default_filament_profile = "Generic PLA @LNL3D"
start_gcode = G21 ; Metric values\nG90 ; Absolute positioning\nM82 ; Set extruder to absolute mode\nM107 ; Start with the fan off\nG28 ; Move to min endstops\nG92 E0 ; Reset extruder\nG1 E15 F1500 ; Move extruder 15mm\nG1 Z15.0 F3000 ; Move the header up 15mm\nM117 Final warmup ; LCD message\nM140 S[first_layer_bed_temperature] ; Set bed temp\nM190 S{first_layer_bed_temperature[0] - 5} ; Wait for bed temp-5\nM104 S[first_layer_temperature] ; Heat extruder rest of the way after heatbed\nM109 S[first_layer_temperature] ; Wait for extruder temp\nG1 X40 Y5 Z4 F5000.0 ; Move to position to prevent hitting clamps or bed\nG1 X50 Y5 Z0.3 F5000.0 ; Move to start position\nG1 X110 Y5 Z0.3 F1500.0 E15 ; First purge line\nG1 X70 Y5 Z0.3 F1500.0 E8 ; Second pass\nM117 Printing... ; LCD message\n start_gcode = G21 ; Metric values\nG90 ; Absolute positioning\nM82 ; Set extruder to absolute mode\nM107 ; Start with the fan off\nG28 ; Move to min endstops\nG92 E0 ; Reset extruder\nG1 Z15.0 F3000 ; Move the header up 15mm\nM117 Final warmup ; LCD message\nM140 S[first_layer_bed_temperature] ; Set bed temp\nM190 S{first_layer_bed_temperature[0] - 5} ; Wait for bed temp-5\nM104 S[first_layer_temperature] ; Heat extruder rest of the way after heatbed\nM109 S[first_layer_temperature] ; Wait for extruder temp\nG1 X40 Y5 Z4 F5000.0 ; Move to position to prevent hitting clamps or bed\nG1 X50 Y5 Z0.3 F5000.0 ; Move to start position\nG1 X110 Y5 Z0.3 F1500.0 E15 ; First purge line\nG1 X70 Y5 Z0.3 F1500.0 E8 ; Second pass\nM117 Printing... ; LCD message\n
end_gcode = M104 T0 S0 ;left extruder heater off\nM104 T1 S0 ;right extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning end_gcode = M104 T0 S0 ;left extruder heater off\nM104 T1 S0 ;right extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning

View File

@ -1,4 +1,7 @@
min_slic3r_version = 2.6.2-alpha0 min_slic3r_version = 2.6.2-alpha0
1.11.0-alpha9 Added printer profiles for Prusa XL Input Shaper (Alpha). Updated Prusa MINI Input Shaper profiles. Added profiles for "Filament PM" filaments.
1.11.0-alpha8 Default file extension changed to bgcode also for other nozzle diameters (MK4IS/MK3.9).
1.11.0-alpha7 Updated end g-code for XL Multi-Tool. Slightly decreased PETG bed temperature (XL).
1.11.0-alpha6 Increased MBL temperature for PET. Enabled FW-specific object labels for XL/MK3.9/MK4/MINI. PETG V0 marked as UL certified for MK4. 1.11.0-alpha6 Increased MBL temperature for PET. Enabled FW-specific object labels for XL/MK3.9/MK4/MINI. PETG V0 marked as UL certified for MK4.
1.11.0-alpha5 Added new profiles (additional nozzle diameters) for Prusa MINI Input Shaper (Alpha). Arc fitting changed to I J. 1.11.0-alpha5 Added new profiles (additional nozzle diameters) for Prusa MINI Input Shaper (Alpha). Arc fitting changed to I J.
1.11.0-alpha4 Updated compatible printer conditions for specific filament profiles. 1.11.0-alpha4 Updated compatible printer conditions for specific filament profiles.
@ -7,6 +10,7 @@ min_slic3r_version = 2.6.2-alpha0
1.11.0-alpha1 Updated ramming parameters. Updated start-gcode for XL Multi-Tool. Updated output filename format. 1.11.0-alpha1 Updated ramming parameters. Updated start-gcode for XL Multi-Tool. Updated output filename format.
1.11.0-alpha0 Binary g-code, arc fitting, QOI/PNG thumbnails, 90degree XL tower, XL specific filament variants. 1.11.0-alpha0 Binary g-code, arc fitting, QOI/PNG thumbnails, 90degree XL tower, XL specific filament variants.
min_slic3r_version = 2.6.1-rc2 min_slic3r_version = 2.6.1-rc2
1.10.1 Increased MBL temperature for PET filaments (MK4, XL). PETG V0 is now UL certified for MK4. Updated end g-code for XL Multi-Tool. Slightly decreased bed temperature for some PET filaments (XL).
1.10.0 Added new profiles for Prusa MINI Input Shaper (Alpha). Enabled XL ramming feature. Prusa XL users may need to re-enable filament profiles in configuration wizard. 1.10.0 Added new profiles for Prusa MINI Input Shaper (Alpha). Enabled XL ramming feature. Prusa XL users may need to re-enable filament profiles in configuration wizard.
min_slic3r_version = 2.6.0-beta2 min_slic3r_version = 2.6.0-beta2
1.9.10 Added new print profiles for Prusa MINI Input Shaper (Alpha). Updated MK4 IS profiles. 1.9.10 Added new print profiles for Prusa MINI Input Shaper (Alpha). Updated MK4 IS profiles.

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

View File

@ -0,0 +1,744 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="Layer_1"
data-name="Layer 1"
width="360mm"
height="360mm"
viewBox="0 0 1020.5 1020.5"
version="1.1">
<metadata
id="metadata129">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs1646" />
<rect
width="1020.5"
height="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 5.7px;"
id="rect1407" />
<g
id="g1577">
<rect
width="1020.5"
height="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="rect1409" />
<line
y1="992.1"
x2="1020.5"
y2="992.1"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1411" />
<line
x1="954"
y1="963.8"
x2="1020.5"
y2="963.8"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1413" />
<line
y1="963.8"
x2="576.3"
y2="963.8"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1415" />
<line
y1="935.4"
x2="1020.5"
y2="935.4"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1417" />
<line
y1="907.1"
x2="1020.5"
y2="907.1"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1419" />
<line
y1="878.7"
x2="1020.5"
y2="878.7"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1421" />
<line
y1="850.4"
x2="1020.5"
y2="850.4"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1423" />
<line
y1="822"
x2="1020.5"
y2="822"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1425" />
<line
y1="793.7"
x2="1020.5"
y2="793.7"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1427" />
<line
y1="765.4"
x2="1020.5"
y2="765.4"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1429" />
<line
y1="737"
x2="1020.5"
y2="737"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1431" />
<line
y1="708.7"
x2="1020.5"
y2="708.7"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1433" />
<line
y1="680.3"
x2="1020.5"
y2="680.3"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1435" />
<line
y1="652"
x2="1020.5"
y2="652"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1437" />
<line
y1="623.6"
x2="1020.5"
y2="623.6"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1439" />
<line
y1="595.3"
x2="1020.5"
y2="595.3"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1441" />
<line
y1="566.9"
x2="1020.5"
y2="566.9"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1443" />
<line
y1="538.6"
x2="1020.5"
y2="538.6"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1445" />
<line
y1="510.2"
x2="1020.5"
y2="510.2"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1447" />
<line
y1="481.9"
x2="1020.5"
y2="481.9"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1449" />
<line
y1="453.5"
x2="1020.5"
y2="453.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1451" />
<line
y1="425.2"
x2="1020.5"
y2="425.2"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1453" />
<line
y1="396.9"
x2="1020.5"
y2="396.9"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1455" />
<line
y1="368.5"
x2="1020.5"
y2="368.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1457" />
<line
y1="340.2"
x2="1020.5"
y2="340.2"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1459" />
<line
y1="311.8"
x2="1020.5"
y2="311.8"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1461" />
<line
y1="283.5"
x2="1020.5"
y2="283.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1463" />
<line
y1="255.1"
x2="1020.5"
y2="255.1"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1465" />
<line
y1="226.8"
x2="1020.5"
y2="226.8"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1467" />
<line
y1="198.4"
x2="1020.5"
y2="198.4"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1469" />
<line
y1="170.1"
x2="1020.5"
y2="170.1"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1471" />
<line
y1="141.7"
x2="1020.5"
y2="141.7"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1473" />
<line
y1="113.4"
x2="1020.5"
y2="113.4"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1475" />
<line
y1="85"
x2="1020.5"
y2="85"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1477" />
<line
y1="56.7"
x2="1020.5"
y2="56.7"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1479" />
<line
y1="28.3"
x2="1020.5"
y2="28.3"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1481" />
<line
x1="992.1"
x2="992.1"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1483" />
<line
x1="963.8"
x2="963.8"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1485" />
<line
x1="935.4"
y1="984.3"
x2="935.4"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1487" />
<line
x1="935.4"
x2="935.4"
y2="944.9"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1489" />
<line
x1="907.1"
y1="984.3"
x2="907.1"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1491" />
<line
x1="907.1"
x2="907.1"
y2="944.9"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1493" />
<line
x1="878.8"
y1="984.3"
x2="878.7"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1495" />
<line
x1="878.7"
x2="878.7"
y2="944.9"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1497" />
<line
x1="850.5"
y1="984.3"
x2="850.4"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1499" />
<line
x1="850.4"
x2="850.4"
y2="944.9"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1501" />
<line
x1="822.1"
y1="984.3"
x2="822"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1503" />
<line
x1="822"
x2="822"
y2="944.9"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1505" />
<line
x1="793.8"
y1="984.3"
x2="793.7"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1507" />
<line
x1="793.7"
x2="793.7"
y2="944.9"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1509" />
<line
x1="765.4"
x2="765.4"
y2="935.4"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1511" />
<line
x1="737"
y1="984.2"
x2="737"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1513" />
<line
x1="737"
x2="737"
y2="944.9"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1515" />
<line
x1="708.7"
y1="984.2"
x2="708.7"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1517" />
<line
x1="708.7"
x2="708.7"
y2="944.9"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1519" />
<line
x1="680.3"
y1="984.2"
x2="680.3"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1521" />
<line
x1="680.3"
x2="680.3"
y2="944.9"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1523" />
<line
x1="652"
y1="984.2"
x2="652"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1525" />
<line
x1="652"
x2="652"
y2="944.9"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1527" />
<line
x1="623.6"
y1="984.2"
x2="623.6"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1529" />
<line
x1="623.6"
x2="623.6"
y2="944.9"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1531" />
<line
x1="595.3"
y1="984.2"
x2="595.3"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1533" />
<line
x1="595.3"
x2="595.3"
y2="944.9"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1535" />
<line
x1="566.9"
x2="566.9"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1537" />
<line
x1="538.6"
x2="538.6"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1539" />
<line
x1="510.2"
x2="510.2"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1541" />
<line
x1="481.9"
x2="481.9"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1543" />
<line
x1="453.5"
x2="453.5"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1545" />
<line
x1="425.2"
x2="425.2"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1547" />
<line
x1="396.9"
x2="396.9"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1549" />
<line
x1="368.5"
x2="368.5"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1551" />
<line
x1="340.2"
x2="340.2"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1553" />
<line
x1="311.8"
x2="311.8"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1555" />
<line
x1="283.5"
x2="283.5"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1557" />
<line
x1="255.1"
x2="255.1"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1559" />
<line
x1="226.8"
x2="226.8"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1561" />
<line
x1="198.4"
x2="198.4"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1563" />
<line
x1="170.1"
x2="170.1"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1565" />
<line
x1="141.7"
x2="141.7"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1567" />
<line
x1="113.4"
x2="113.4"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1569" />
<line
x1="85"
x2="85"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1571" />
<line
x1="56.7"
x2="56.7"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1573" />
<line
x1="28.3"
x2="28.3"
y2="1020.5"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: .7px;"
id="line1575" />
</g>
<rect
y="765.4"
width="255.1"
height="255.1"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"
id="rect1579" />
<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;"
id="rect1581" />
<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;"
id="polyline1583" />
<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;"
id="polyline1585" />
<rect
y="510.2"
width="255.1"
height="255.1"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"
id="rect1587" />
<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;"
id="rect1589" />
<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;"
id="rect1591" />
<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;"
id="rect1593" />
<rect
y="255.1"
width="255.1"
height="255.1"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"
id="rect1595" />
<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;"
id="rect1597" />
<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;"
id="rect1599" />
<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;"
id="rect1601" />
<rect
width="255.1"
height="255.1"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"
id="rect1603" />
<rect
x="255.1"
width="255.1"
height="255.1"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"
id="rect1605" />
<rect
x="510.2"
width="255.1"
height="255.1"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"
id="rect1607" />
<rect
x="765.4"
width="255.1"
height="255.1"
style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 1.4px;"
id="rect1609" />
<g
id="g1641">
<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;"
id="path1611" />
<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;"
id="path1613" />
<path
d="m639.4,951.3h5.7v25.7h-5.7v-25.7Z"
style="fill: #fff;"
id="path1615" />
<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;"
id="path1617" />
<path
d="m677.4,951.3h5.7v25.7h-5.7v-25.7Z"
style="fill: #fff;"
id="path1619" />
<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;"
id="path1621" />
<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;"
id="path1623" />
<path
d="m739.3,951.3h5.7v21h12.5v4.8h-18.2v-25.7Z"
style="fill: #fff;"
id="path1625" />
<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;"
id="path1627" />
<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;"
id="path1629" />
<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;"
id="path1631" />
<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;"
id="path1633" />
<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;"
id="path1635" />
<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;"
id="path1637" />
<path
d="m929.4,951.3h5.7v21h12.5v4.8h-18.2v-25.7Z"
style="fill: #fff;"
id="path1639" />
</g>
<rect
x="584.22406"
y="983.10077"
width="41.176113"
height="15.750426"
style="fill:#ff3c00;stroke-width:0.75002"
id="rect1336" />
<g
id="g1348"
transform="matrix(0.75002026,0,0,0.75002026,295.01625,586.41471)">
<path
d="m 401.3,545.4 c 0,0.2 0,0.4 -0.2,0.4 h -2 c -0.2,0 -0.4,0 -0.4,-0.3 l -0.4,-1.7 h -3.2 l -0.4,1.7 c 0,0.2 -0.2,0.3 -0.4,0.3 h -2 c -0.2,0 -0.3,-0.1 -0.2,-0.4 l 3.3,-11.9 c 0,-0.2 0.2,-0.3 0.4,-0.3 h 1.7 c 0.2,0 0.3,0 0.4,0.3 l 3.3,11.9 z m -4.5,-9.2 -0.2,1.2 -0.9,4.2 h 2.2 l -0.9,-4.2 z"
style="fill:#ffffff"
id="path1338" />
<path
d="m 402.5,532.1 c 0,-0.2 0.1,-0.4 0.3,-0.4 h 1.8 c 0.2,0 0.3,0.1 0.3,0.4 v 13.3 c 0,0.2 0,0.4 -0.3,0.4 h -1.8 c -0.2,0 -0.3,-0.1 -0.3,-0.4 z"
style="fill:#ffffff"
id="path1340" />
<path
d="m 415,541.9 c 0,2.3 -1.4,4.1 -3.7,4.1 -2.3,0 -1.4,-0.5 -1.8,-1.1 v 3.9 c 0,0.2 -0.2,0.4 -0.4,0.4 h -1.7 c -0.2,0 -0.3,-0.1 -0.3,-0.4 v -13.5 c 0,-0.2 0.1,-0.4 0.3,-0.4 h 1.3 c 0.2,0 0.4,0.1 0.4,0.4 l 0.2,0.9 c 0.4,-0.8 1.1,-1.5 2.1,-1.5 2.2,0 3.6,1.9 3.6,4.1 z m -2.5,-3.2 c 0,-0.9 -0.6,-1.7 -1.5,-1.7 -0.9,0 -1.4,0.8 -1.5,1.8 v 3 c 0,1 0.6,1.9 1.5,1.9 0.9,0 1.5,-0.8 1.5,-1.7 z"
style="fill:#ffffff"
id="path1342" />
<path
d="m 422,538.6 c 0,-0.8 -0.6,-1.6 -1.5,-1.6 -0.9,0 -1.5,0.9 -1.5,1.6 v 6.8 c 0,0.2 -0.3,0.4 -0.5,0.4 h -1.7 c -0.2,0 -0.3,-0.1 -0.3,-0.4 v -13.3 c 0,-0.2 0.1,-0.4 0.3,-0.4 h 1.8 c 0.2,0 0.3,0 0.3,0.3 v 3.9 c 0.5,-0.8 1.2,-1.3 2.2,-1.3 1.9,0 3.3,1.3 3.3,4 v 6.7 c 0,0.2 -0.1,0.4 -0.3,0.4 h -1.8 c -0.2,0 -0.3,-0.1 -0.3,-0.4 v -6.8 z"
style="fill:#ffffff"
id="path1344" />
<path
d="m 426,538.8 c 0,-2.2 1.5,-4.1 3.7,-4.1 2.2,0 1.6,0.6 2,1.4 v -0.8 c 0.2,-0.2 0.3,-0.4 0.6,-0.4 h 1.3 c 0.2,0 0.3,0.1 0.3,0.4 v 10.1 c 0,0.2 -0.1,0.4 -0.3,0.4 h -1.3 c -0.2,0 -0.4,-0.1 -0.4,-0.4 v -0.9 c -0.5,0.8 -1.1,1.4 -2.2,1.4 -2.2,0 -3.7,-1.8 -3.7,-4.1 v -3.1 z m 2.5,3.2 c 0,0.9 0.6,1.7 1.5,1.7 0.9,0 1.4,-0.8 1.5,-1.8 v -3.1 c 0,-1 -0.6,-1.8 -1.5,-1.8 -0.9,0 -1.5,0.8 -1.5,1.7 z"
style="fill:#ffffff"
id="path1346" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -20,6 +20,10 @@ struct FillBedTask: public ArrangeTaskBase
std::vector<ArrItem> selected, unselected; std::vector<ArrItem> selected, unselected;
// For workaround regarding "holes" when filling the bed with the same
// item's copies
std::vector<ArrItem> selected_fillers;
ArrangeSettings settings; ArrangeSettings settings;
ExtendedBed bed; ExtendedBed bed;
size_t selected_existing_count = 0; size_t selected_existing_count = 0;

View File

@ -74,8 +74,7 @@ void extract(FillBedTask<ArrItem> &task,
// Workaround for missing items when arranging the same geometry only: // Workaround for missing items when arranging the same geometry only:
// Injecting a number of items but with slightly shrinked shape, so that // Injecting a number of items but with slightly shrinked shape, so that
// they can fill the emerging holes. Priority is set to lowest so that // they can fill the emerging holes.
// these filler items will only be inserted as the last ones.
ArrItem prototype_item_shrinked; ArrItem prototype_item_shrinked;
scene.model().visit_arrangeable(selected_ids.front(), scene.model().visit_arrangeable(selected_ids.front(),
[&prototype_item_shrinked, &itm_conv](const Arrangeable &arrbl) { [&prototype_item_shrinked, &itm_conv](const Arrangeable &arrbl) {
@ -104,10 +103,6 @@ void extract(FillBedTask<ArrItem> &task,
} }
}; };
// Set the lowest priority to the shrinked prototype (hole filler) item
set_priority(prototype_item_shrinked,
lowest_priority(range(task.selected)) - 1);
scene.model().for_each_arrangeable(collect_task_items); scene.model().for_each_arrangeable(collect_task_items);
int needed_items = calculate_items_needed_to_fill_bed(task.bed, int needed_items = calculate_items_needed_to_fill_bed(task.bed,
@ -122,7 +117,7 @@ void extract(FillBedTask<ArrItem> &task,
// Add as many filler items as there are needed items. Most of them will // Add as many filler items as there are needed items. Most of them will
// be discarded anyways. // be discarded anyways.
std::fill_n(std::back_inserter(task.selected), needed_items, std::fill_n(std::back_inserter(task.selected_fillers), needed_items,
prototype_item_shrinked); prototype_item_shrinked);
} }
@ -175,7 +170,7 @@ std::unique_ptr<FillBedTaskResult> FillBedTask<ArrItem>::process_native(
void on_packed(ArrItem &itm) override void on_packed(ArrItem &itm) override
{ {
// Stop at the first filler that is not on the physical bed // Stop at the first filler that is not on the physical bed
do_stop = get_bed_index(itm) > PhysicalBedId && get_priority(itm) < 0; do_stop = get_bed_index(itm) > PhysicalBedId && get_priority(itm) == 0;
} }
} subctl(ctl, *this); } subctl(ctl, *this);
@ -184,6 +179,13 @@ std::unique_ptr<FillBedTaskResult> FillBedTask<ArrItem>::process_native(
arranger->arrange(selected, unselected, bed, subctl); arranger->arrange(selected, unselected, bed, subctl);
auto unsel_cpy = unselected;
for (const auto &itm : selected) {
unsel_cpy.emplace_back(itm);
}
arranger->arrange(selected_fillers, unsel_cpy, bed, FillBedCtl{ctl, *this});
auto arranged_range = Range{selected.begin(), auto arranged_range = Range{selected.begin(),
selected.begin() + selected_existing_count}; selected.begin() + selected_existing_count};
@ -196,6 +198,10 @@ std::unique_ptr<FillBedTaskResult> FillBedTask<ArrItem>::process_native(
if (get_bed_index(itm) == PhysicalBedId) if (get_bed_index(itm) == PhysicalBedId)
result->add_new_item(itm); result->add_new_item(itm);
for (auto &itm : selected_fillers)
if (get_bed_index(itm) == PhysicalBedId)
result->add_new_item(itm);
return result; return result;
} }

View File

@ -416,12 +416,12 @@ void PrintConfigDef::init_common_params()
def->label = L("Authorization Type"); def->label = L("Authorization Type");
// def->tooltip = L(""); // def->tooltip = L("");
def->set_enum<AuthorizationType>({ def->set_enum<AuthorizationType>({
{ "user", L("HTTP digest") }, { "key", L("API key") },
{ "key", L("API key") } { "user", L("HTTP digest") }
}); });
def->mode = comAdvanced; def->mode = comAdvanced;
def->cli = ConfigOptionDef::nocli; def->cli = ConfigOptionDef::nocli;
def->set_default_value(new ConfigOptionEnum<AuthorizationType>(atUserPassword)); def->set_default_value(new ConfigOptionEnum<AuthorizationType>(atKeyPassword));
// temporary workaround for compatibility with older Slicer // temporary workaround for compatibility with older Slicer
{ {

View File

@ -899,8 +899,9 @@ void SpinCtrl::BUILD() {
if (!wxOSX) temp->SetBackgroundStyle(wxBG_STYLE_PAINT); if (!wxOSX) temp->SetBackgroundStyle(wxBG_STYLE_PAINT);
wxGetApp().UpdateDarkUI(temp); wxGetApp().UpdateDarkUI(temp);
if (m_opt.height < 0 && parent_is_custom_ctrl) if (m_opt.height < 0 && parent_is_custom_ctrl) {
opt_height = (double)temp->GetSize().GetHeight() / m_em_unit; opt_height = (double)temp->GetSize().GetHeight() / m_em_unit;
}
temp->Bind(wxEVT_KILL_FOCUS, ([this](wxEvent& e) temp->Bind(wxEVT_KILL_FOCUS, ([this](wxEvent& e)
{ {
@ -1282,8 +1283,8 @@ void Choice::set_values(const std::vector<std::string>& values)
auto value = ww->GetValue(); auto value = ww->GetValue();
ww->Clear(); ww->Clear();
ww->Append(""); ww->Append("");
for (const auto &el : values) for (const std::string& el : values)
ww->Append(wxString(el)); ww->Append(from_u8(el));
ww->SetValue(value); ww->SetValue(value);
m_disable_change_event = false; m_disable_change_event = false;

View File

@ -1680,7 +1680,7 @@ void GUI_App::SetWindowVariantForButton(wxButton* btn)
int GUI_App::get_max_font_pt_size() int GUI_App::get_max_font_pt_size()
{ {
const unsigned disp_count = wxDisplay::GetCount(); const unsigned disp_count = wxDisplay::GetCount();
for (int i = 0; i < disp_count; i++) { for (unsigned i = 0; i < disp_count; i++) {
const wxRect display_rect = wxDisplay(i).GetGeometry(); const wxRect display_rect = wxDisplay(i).GetGeometry();
if (display_rect.width >= 2560 && display_rect.height >= 1440) if (display_rect.width >= 2560 && display_rect.height >= 1440)
return 20; return 20;

View File

@ -1099,28 +1099,30 @@ std::vector<std::string> create_shape_warnings(const EmbossShape &shape, float s
// This waning is not connected to NSVGshape. It is about union of paths, but Zero index is shown first // This waning is not connected to NSVGshape. It is about union of paths, but Zero index is shown first
size_t index = 0; size_t index = 0;
add_warning(index, _u8L("Final shape constains selfintersection or multiple points with same coordinate")); add_warning(index, _u8L("Final shape constains selfintersection or multiple points with same coordinate."));
} }
size_t shape_index = 0; size_t shape_index = 0;
for (NSVGshape *shape = image.shapes; shape != NULL; shape = shape->next, ++shape_index) { for (NSVGshape *shape = image.shapes; shape != NULL; shape = shape->next, ++shape_index) {
if (!(shape->flags & NSVG_FLAGS_VISIBLE)){ if (!(shape->flags & NSVG_FLAGS_VISIBLE)){
add_warning(shape_index * 2, GUI::format(_L("Shape is marked as invisible (%1%)"), shape->id)); add_warning(shape_index * 2, GUI::format(_L("Shape is marked as invisible (%1%)."), shape->id));
continue; continue;
} }
std::string fill_warning = create_fill_warning(*shape); std::string fill_warning = create_fill_warning(*shape);
if (!fill_warning.empty()) if (!fill_warning.empty()) {
add_warning(shape_index * 2, GUI::format(_L("Fill of shape (%1%) contains unsupported: %2% "), shape->id, fill_warning)); // TRN: The first placeholder is shape identifier, the second one is text describing the problem.
add_warning(shape_index * 2, GUI::format(_L("Fill of shape (%1%) contains unsupported: %2%."), shape->id, fill_warning));
}
float minimal_width_in_mm = 1e-3f; float minimal_width_in_mm = 1e-3f;
if (shape->strokeWidth <= minimal_width_in_mm * scale) { if (shape->strokeWidth <= minimal_width_in_mm * scale) {
add_warning(shape_index * 2, GUI::format(_L("Stroke of shape (%1%) is too thin (minimal width is %2% mm)"), shape->id, minimal_width_in_mm)); add_warning(shape_index * 2, GUI::format(_L("Stroke of shape (%1%) is too thin (minimal width is %2% mm)."), shape->id, minimal_width_in_mm));
continue; continue;
} }
std::string stroke_warning = create_stroke_warning(*shape); std::string stroke_warning = create_stroke_warning(*shape);
if (!stroke_warning.empty()) if (!stroke_warning.empty())
add_warning(shape_index * 2 + 1, GUI::format(_L("Stroke of shape (%1%) contains unsupported: %2% "), shape->id, stroke_warning)); add_warning(shape_index * 2 + 1, GUI::format(_L("Stroke of shape (%1%) contains unsupported: %2%."), shape->id, stroke_warning));
} }
return result; return result;
} }

View File

@ -1928,13 +1928,13 @@ void MainFrame::load_config_file()
DynamicPrintConfig config = wxGetApp().preset_bundle->full_config(); DynamicPrintConfig config = wxGetApp().preset_bundle->full_config();
const auto* post_process = config.opt<ConfigOptionStrings>("post_process"); const auto* post_process = config.opt<ConfigOptionStrings>("post_process");
if (post_process != nullptr && !post_process->values.empty()) { if (post_process != nullptr && !post_process->values.empty()) {
const wxString msg = _L("The selected config file contains a post-processing script") + "\n" + _L("Please review the script carefully before running it."); const wxString msg = _L("The selected config file contains a post-processing script.\nPlease review the script carefully before exporting G-code.");
wxString text; std::string text;
for (const auto& s : post_process->values) { for (const std::string& s : post_process->values) {
text += s; text += s;
} }
InfoDialog msg_dlg(nullptr, msg, text, true, wxOK | wxICON_WARNING); InfoDialog msg_dlg(nullptr, msg, from_u8(text), true, wxOK | wxICON_WARNING);
msg_dlg.set_caption(wxString(SLIC3R_APP_NAME " - ") + _L("Attention!")); msg_dlg.set_caption(wxString(SLIC3R_APP_NAME " - ") + _L("Attention!"));
msg_dlg.ShowModal(); msg_dlg.ShowModal();
} }

View File

@ -943,8 +943,8 @@ boost::any ConfigOptionsGroup::get_config_value(const DynamicPrintConfig& config
else if (opt->gui_flags == "serialized") { else if (opt->gui_flags == "serialized") {
std::vector<std::string> values = config.option<ConfigOptionStrings>(opt_key)->values; std::vector<std::string> values = config.option<ConfigOptionStrings>(opt_key)->values;
if (!values.empty() && !values[0].empty()) if (!values.empty() && !values[0].empty())
for (auto el : values) for (const std::string& el : values)
text_value += el + ";"; text_value += from_u8(el) + ";";
ret = text_value; ret = text_value;
} }
else else

View File

@ -2616,15 +2616,14 @@ std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& input_
if (!config.empty()) { if (!config.empty()) {
const auto* post_process = config.opt<ConfigOptionStrings>("post_process"); const auto* post_process = config.opt<ConfigOptionStrings>("post_process");
if (post_process != nullptr && !post_process->values.empty()) { if (post_process != nullptr && !post_process->values.empty()) {
wxString msg = type_3mf ? _L("The selected 3MF file contains a post-processing script") : // TRN The placeholder is either "3MF" or "AMF"
_L("The selected AMF file contains a post-processing script"); wxString msg = GUI::format_wxstr(_L("The selected %1% file contains a post-processing script.\n"
msg += "\n" + _L("Please review the script carefully before running it."); "Please review the script carefully before exporting G-code."), type_3mf ? "3MF" : "AMF" );
wxString text; std::string text;
for (const auto& s : post_process->values) { for (const std::string& s : post_process->values)
text += s; text += s;
}
InfoDialog msg_dlg(nullptr, msg, text, true, wxOK | wxICON_WARNING); InfoDialog msg_dlg(nullptr, msg, from_u8(text), true, wxOK | wxICON_WARNING);
msg_dlg.set_caption(wxString(SLIC3R_APP_NAME " - ") + _L("Attention!")); msg_dlg.set_caption(wxString(SLIC3R_APP_NAME " - ") + _L("Attention!"));
msg_dlg.ShowModal(); msg_dlg.ShowModal();
} }
@ -5589,10 +5588,8 @@ void Plater::convert_gcode_to_ascii()
} }
else { else {
output_file = rename_file(output_file, ".gcode"); output_file = rename_file(output_file, ".gcode");
wxString msg = _L("You are trying to convert to ASCII a binary file whose extension is '.gcode'."); wxString msg = GUI::format_wxstr("The converted binary G-code file has '.gcode' extension.\n"
msg += "\n" + _L("The exported file will be renamed as:"); "The exported file will be renamed to:\n\n%1%\n\nDo you want to continue?", output_file);
msg += "\n\n" + output_file;
msg += "\n\n" + _L("Continue with export?");
MessageDialog msg_dlg(this, msg, _L("Warning"), wxYES_NO); MessageDialog msg_dlg(this, msg, _L("Warning"), wxYES_NO);
if (msg_dlg.ShowModal() != wxID_YES) if (msg_dlg.ShowModal() != wxID_YES)
return; return;
@ -5669,10 +5666,8 @@ void Plater::convert_gcode_to_binary()
} }
else { else {
output_file = rename_file(output_file, ".bgcode"); output_file = rename_file(output_file, ".bgcode");
wxString msg = _L("You are trying to convert to binary an ASCII file whose extension is '.bgcode'."); wxString msg = GUI::format_wxstr("The converted ASCII G-code file has '.bgcode' extension.\n"
msg += "\n" + _L("The exported file will be renamed as:"); "The exported file will be renamed to:\n\n%1%\n\nDo you want to continue?", output_file);
msg += "\n\n" + output_file;
msg += "\n\n" + _L("Continue with export?");
MessageDialog msg_dlg(this, msg, _L("Warning"), wxYES_NO); MessageDialog msg_dlg(this, msg, _L("Warning"), wxYES_NO);
if (msg_dlg.ShowModal() != wxID_YES) if (msg_dlg.ShowModal() != wxID_YES)
return; return;

View File

@ -1372,10 +1372,10 @@ void Tab::update_preset_description_line()
if (!default_filament_profiles.empty()) if (!default_filament_profiles.empty())
{ {
description_line += "\n\n\t" + _(L("default filament profile")) + ": \n\t\t"; description_line += "\n\n\t" + _(L("default filament profile")) + ": \n\t\t";
for (auto& profile : default_filament_profiles) { for (const std::string& profile : default_filament_profiles) {
if (&profile != &*default_filament_profiles.begin()) if (&profile != &*default_filament_profiles.begin())
description_line += ", "; description_line += ", ";
description_line += profile; description_line += from_u8(profile);
} }
} }
break; break;
@ -1947,7 +1947,6 @@ void TabFilament::create_line_with_near_label_widget(ConfigOptionsGroupShp optgr
else else
line = optgroup->create_single_option_line(optgroup->get_option(opt_key)); line = optgroup->create_single_option_line(optgroup->get_option(opt_key));
line.near_label_widget = [this, optgroup_wk = ConfigOptionsGroupWkp(optgroup), opt_key, opt_index](wxWindow* parent) { line.near_label_widget = [this, optgroup_wk = ConfigOptionsGroupWkp(optgroup), opt_key, opt_index](wxWindow* parent) {
wxWindow* check_box = CheckBox::GetNewWin(parent); wxWindow* check_box = CheckBox::GetNewWin(parent);
wxGetApp().UpdateDarkUI(check_box); wxGetApp().UpdateDarkUI(check_box);
@ -2435,6 +2434,7 @@ void TabFilament::msw_rescale()
void TabFilament::sys_color_changed() void TabFilament::sys_color_changed()
{ {
wxGetApp().UpdateDarkUI(m_extruders_cb);
m_extruders_cb->Clear(); m_extruders_cb->Clear();
update_extruder_combobox(); update_extruder_combobox();

View File

@ -306,7 +306,7 @@ MsgUpdateConfig::MsgUpdateConfig(const std::vector<Update> &updates, bool force_
} }
if (! update.new_printers.empty()) { if (! update.new_printers.empty()) {
flex->Add(new wxStaticText(this, wxID_ANY, _L_PLURAL("New printer:", "New printers:", update.new_printers.find(',') == std::string::npos ? 1 : 2)), 0, wxALIGN_RIGHT); flex->Add(new wxStaticText(this, wxID_ANY, _L_PLURAL("New printer", "New printers", update.new_printers.find(',') == std::string::npos ? 1 : 2) + ":"), 0, wxALIGN_RIGHT);
auto* update_printer = new wxStaticText(this, wxID_ANY, from_u8(update.new_printers)); auto* update_printer = new wxStaticText(this, wxID_ANY, from_u8(update.new_printers));
update_printer->Wrap(CONTENT_WIDTH * wxGetApp().em_unit()); update_printer->Wrap(CONTENT_WIDTH * wxGetApp().em_unit());
flex->Add(update_printer); flex->Add(update_printer);
@ -373,7 +373,7 @@ MsgUpdateForced::MsgUpdateForced(const std::vector<Update>& updates) :
} }
if (!update.new_printers.empty()) { if (!update.new_printers.empty()) {
versions->Add(new wxStaticText(this, wxID_ANY, _L_PLURAL("New printer:", "New printers:", update.new_printers.find(',') == std::string::npos ? 1 : 2))/*, 0, wxALIGN_RIGHT*/); versions->Add(new wxStaticText(this, wxID_ANY, _L_PLURAL("New printer", "New printers", update.new_printers.find(',') == std::string::npos ? 1 : 2)+":")/*, 0, wxALIGN_RIGHT*/);
auto* update_printer = new wxStaticText(this, wxID_ANY, from_u8(update.new_printers)); auto* update_printer = new wxStaticText(this, wxID_ANY, from_u8(update.new_printers));
update_printer->Wrap(CONTENT_WIDTH * wxGetApp().em_unit()); update_printer->Wrap(CONTENT_WIDTH * wxGetApp().em_unit());
versions->Add(update_printer); versions->Add(update_printer);

View File

@ -272,7 +272,7 @@ void ComboBox::mouseWheelMoved(wxMouseEvent &event)
{ {
event.Skip(); event.Skip();
if (drop_down) return; if (drop_down) return;
auto delta = (event.GetWheelRotation() < 0 == event.IsWheelInverted()) ? -1 : 1; auto delta = ((event.GetWheelRotation() < 0) == event.IsWheelInverted()) ? -1 : 1;
unsigned int n = GetSelection() + delta; unsigned int n = GetSelection() + delta;
if (n < GetCount()) { if (n < GetCount()) {
SetSelection((int) n); SetSelection((int) n);

View File

@ -302,7 +302,7 @@ void DropDown::render(wxDC &dc)
} }
// draw texts & icons // draw texts & icons
dc.SetTextForeground(text_color.colorForStates(states)); dc.SetTextForeground(text_color.colorForStates(states));
for (int i = 0; i < texts.size(); ++i) { for (size_t i = 0; i < texts.size(); ++i) {
if (rcContent.GetBottom() < 0) { if (rcContent.GetBottom() < 0) {
rcContent.y += rowSize.y; rcContent.y += rowSize.y;
continue; continue;
@ -460,13 +460,14 @@ void DropDown::mouseCaptureLost(wxMouseCaptureLostEvent &event)
void DropDown::mouseMove(wxMouseEvent &event) void DropDown::mouseMove(wxMouseEvent &event)
{ {
wxPoint pt = event.GetPosition(); wxPoint pt = event.GetPosition();
int text_size = int(texts.size());
if (pressedDown) { if (pressedDown) {
wxPoint pt2 = offset + pt - dragStart; wxPoint pt2 = offset + pt - dragStart;
dragStart = pt; dragStart = pt;
if (pt2.y > 0) if (pt2.y > 0)
pt2.y = 0; pt2.y = 0;
else if (pt2.y + rowSize.y * texts.size() < GetSize().y) else if (pt2.y + rowSize.y * text_size < GetSize().y)
pt2.y = GetSize().y - rowSize.y * texts.size(); pt2.y = GetSize().y - rowSize.y * text_size;
if (pt2.y != offset.y) { if (pt2.y != offset.y) {
offset = pt2; offset = pt2;
hover_item = -1; // moved hover_item = -1; // moved
@ -476,7 +477,7 @@ void DropDown::mouseMove(wxMouseEvent &event)
} }
if (!pressedDown || hover_item >= 0) { if (!pressedDown || hover_item >= 0) {
int hover = (pt.y - offset.y) / rowSize.y; int hover = (pt.y - offset.y) / rowSize.y;
if (hover >= (int) texts.size()) hover = -1; if (hover >= text_size) hover = -1;
if (hover == hover_item) return; if (hover == hover_item) return;
hover_item = hover; hover_item = hover;
if (hover >= 0) if (hover >= 0)
@ -489,17 +490,18 @@ void DropDown::mouseWheelMoved(wxMouseEvent &event)
{ {
auto delta = event.GetWheelRotation() > 0 ? rowSize.y : -rowSize.y; auto delta = event.GetWheelRotation() > 0 ? rowSize.y : -rowSize.y;
wxPoint pt2 = offset + wxPoint{0, delta}; wxPoint pt2 = offset + wxPoint{0, delta};
int text_size = int(texts.size());
if (pt2.y > 0) if (pt2.y > 0)
pt2.y = 0; pt2.y = 0;
else if (pt2.y + rowSize.y * texts.size() < GetSize().y) else if (pt2.y + rowSize.y * text_size < GetSize().y)
pt2.y = GetSize().y - rowSize.y * texts.size(); pt2.y = GetSize().y - rowSize.y * text_size;
if (pt2.y != offset.y) { if (pt2.y != offset.y) {
offset = pt2; offset = pt2;
} else { } else {
return; return;
} }
int hover = (event.GetPosition().y - offset.y) / rowSize.y; int hover = (event.GetPosition().y - offset.y) / rowSize.y;
if (hover >= (int) texts.size()) hover = -1; if (hover >= text_size) hover = -1;
if (hover != hover_item) { if (hover != hover_item) {
hover_item = hover; hover_item = hover;
if (hover >= 0) SetToolTip(texts[hover]); if (hover >= 0) SetToolTip(texts[hover]);

View File

@ -297,7 +297,7 @@ void SpinInput::Create(wxWindow *parent,
text_ctrl->Bind(wxEVT_TEXT, &SpinInput::onText, this); text_ctrl->Bind(wxEVT_TEXT, &SpinInput::onText, this);
text_ctrl->Bind(wxEVT_TEXT_ENTER, &SpinInput::onTextEnter, this); text_ctrl->Bind(wxEVT_TEXT_ENTER, &SpinInput::onTextEnter, this);
text_ctrl->Bind(wxEVT_KEY_DOWN, &SpinInput::keyPressed, this); text_ctrl->Bind(wxEVT_KEY_DOWN, &SpinInput::keyPressed, this);
text_ctrl->Bind(wxEVT_RIGHT_DOWN, [this](auto &e) {}); // disable context menu text_ctrl->Bind(wxEVT_RIGHT_DOWN, [](auto &e) {}); // disable context menu
button_inc = create_button(ButtonId::btnIncrease); button_inc = create_button(ButtonId::btnIncrease);
button_dec = create_button(ButtonId::btnDecrease); button_dec = create_button(ButtonId::btnDecrease);
delta = 0; delta = 0;
@ -403,7 +403,7 @@ void SpinInput::onTextEnter(wxCommandEvent &event)
void SpinInput::mouseWheelMoved(wxMouseEvent &event) void SpinInput::mouseWheelMoved(wxMouseEvent &event)
{ {
auto delta = (event.GetWheelRotation() < 0 == event.IsWheelInverted()) ? 1 : -1; auto delta = ((event.GetWheelRotation() < 0) == event.IsWheelInverted()) ? 1 : -1;
SetValue(val + delta); SetValue(val + delta);
sendSpinEvent(); sendSpinEvent();
text_ctrl->SetFocus(); text_ctrl->SetFocus();
@ -473,7 +473,7 @@ void SpinInputDouble::Create(wxWindow *parent,
text_ctrl->Bind(wxEVT_TEXT, &SpinInputDouble::onText, this); text_ctrl->Bind(wxEVT_TEXT, &SpinInputDouble::onText, this);
text_ctrl->Bind(wxEVT_TEXT_ENTER, &SpinInputDouble::onTextEnter, this); text_ctrl->Bind(wxEVT_TEXT_ENTER, &SpinInputDouble::onTextEnter, this);
text_ctrl->Bind(wxEVT_KEY_DOWN, &SpinInputDouble::keyPressed, this); text_ctrl->Bind(wxEVT_KEY_DOWN, &SpinInputDouble::keyPressed, this);
text_ctrl->Bind(wxEVT_RIGHT_DOWN, [this](auto &e) {}); // disable context menu text_ctrl->Bind(wxEVT_RIGHT_DOWN, [](auto &e) {}); // disable context menu
button_inc = create_button(ButtonId::btnIncrease); button_inc = create_button(ButtonId::btnIncrease);
button_dec = create_button(ButtonId::btnDecrease); button_dec = create_button(ButtonId::btnDecrease);
delta = 0; delta = 0;
@ -600,7 +600,7 @@ void SpinInputDouble::onTextEnter(wxCommandEvent &event)
void SpinInputDouble::mouseWheelMoved(wxMouseEvent &event) void SpinInputDouble::mouseWheelMoved(wxMouseEvent &event)
{ {
auto delta = (event.GetWheelRotation() < 0 == event.IsWheelInverted()) ? inc : -inc; auto delta = ((event.GetWheelRotation() < 0) == event.IsWheelInverted()) ? inc : -inc;
SetValue(val + delta); SetValue(val + delta);
sendSpinEvent(); sendSpinEvent();
text_ctrl->SetFocus(); text_ctrl->SetFocus();

View File

@ -22,7 +22,7 @@ void StateColor::append(unsigned long color, int states)
{ {
if ((color & 0xff000000) == 0) if ((color & 0xff000000) == 0)
color |= 0xff000000; color |= 0xff000000;
wxColour cl; cl.SetRGBA(color & 0xff00ff00 | ((color & 0xff) << 16) | ((color >> 16) & 0xff)); wxColour cl; cl.SetRGBA((color & 0xff00ff00) | ((color & 0xff) << 16) | ((color >> 16) & 0xff));
append(cl, states); append(cl, states);
} }
@ -49,7 +49,7 @@ wxColour StateColor::defaultColor() {
wxColour StateColor::colorForStates(int states) wxColour StateColor::colorForStates(int states)
{ {
bool focused = takeFocusedAsHovered_ && (states & Focused); bool focused = takeFocusedAsHovered_ && (states & Focused);
for (int i = 0; i < statesList_.size(); ++i) { for (size_t i = 0; i < statesList_.size(); ++i) {
int s = statesList_[i]; int s = statesList_[i];
int on = s & 0xffff; int on = s & 0xffff;
int off = s >> 16; int off = s >> 16;
@ -69,18 +69,18 @@ wxColour StateColor::colorForStates(int states)
int StateColor::colorIndexForStates(int states) int StateColor::colorIndexForStates(int states)
{ {
for (int i = 0; i < statesList_.size(); ++i) { for (size_t i = 0; i < statesList_.size(); ++i) {
int s = statesList_[i]; int s = statesList_[i];
int on = s & 0xffff; int on = s & 0xffff;
int off = s >> 16; int off = s >> 16;
if ((on & states) == on && (off & ~states) == off) { return i; } if ((on & states) == on && (off & ~states) == off) { return int(i); }
} }
return -1; return -1;
} }
bool StateColor::setColorForStates(wxColour const &color, int states) bool StateColor::setColorForStates(wxColour const &color, int states)
{ {
for (int i = 0; i < statesList_.size(); ++i) { for (size_t i = 0; i < statesList_.size(); ++i) {
if (statesList_[i] == states) { if (statesList_[i] == states) {
colors_[i] = color; colors_[i] = color;
return true; return true;

View File

@ -52,7 +52,7 @@ void StateHandler::update_binds()
int diff = bind_states ^ bind_states_; int diff = bind_states ^ bind_states_;
State states[] = {Enabled, Checked, Focused, Hovered, Pressed}; State states[] = {Enabled, Checked, Focused, Hovered, Pressed};
wxEventType events[] = {EVT_ENABLE_CHANGED, wxEVT_CHECKBOX, wxEVT_SET_FOCUS, wxEVT_ENTER_WINDOW, wxEVT_LEFT_DOWN}; wxEventType events[] = {EVT_ENABLE_CHANGED, wxEVT_CHECKBOX, wxEVT_SET_FOCUS, wxEVT_ENTER_WINDOW, wxEVT_LEFT_DOWN};
wxEventType events2[] = {{0}, {0}, wxEVT_KILL_FOCUS, wxEVT_LEAVE_WINDOW, wxEVT_LEFT_UP}; wxEventType events2[] = {0, 0, wxEVT_KILL_FOCUS, wxEVT_LEAVE_WINDOW, wxEVT_LEFT_UP};
for (int i = 0; i < 5; ++i) { for (int i = 0; i < 5; ++i) {
int s = states[i]; int s = states[i];
if (diff & s) { if (diff & s) {
@ -82,7 +82,7 @@ void StateHandler::changed(wxEvent &event)
{ {
event.Skip(); event.Skip();
wxEventType events[] = {EVT_ENABLE_CHANGED, wxEVT_CHECKBOX, wxEVT_SET_FOCUS, wxEVT_ENTER_WINDOW, wxEVT_LEFT_DOWN}; wxEventType events[] = {EVT_ENABLE_CHANGED, wxEVT_CHECKBOX, wxEVT_SET_FOCUS, wxEVT_ENTER_WINDOW, wxEVT_LEFT_DOWN};
wxEventType events2[] = {{0}, {0}, wxEVT_KILL_FOCUS, wxEVT_LEAVE_WINDOW, wxEVT_LEFT_UP}; wxEventType events2[] = { 0, 0, wxEVT_KILL_FOCUS, wxEVT_LEAVE_WINDOW, wxEVT_LEFT_UP};
int old = states_; int old = states_;
// some events are from another window (ex: text_ctrl of TextInput), save state in states2_ to avoid conflicts // some events are from another window (ex: text_ctrl of TextInput), save state in states2_ to avoid conflicts
for (int i = 0; i < 5; ++i) { for (int i = 0; i < 5; ++i) {

View File

@ -78,7 +78,7 @@ void TextInput::Create(wxWindow * parent,
e.SetId(GetId()); e.SetId(GetId());
ProcessEventLocally(e); ProcessEventLocally(e);
}); });
text_ctrl->Bind(wxEVT_RIGHT_DOWN, [this](auto &e) {}); // disable context menu text_ctrl->Bind(wxEVT_RIGHT_DOWN, [](auto &e) {}); // disable context menu
if (!icon.IsEmpty()) { if (!icon.IsEmpty()) {
this->drop_down_icon = ScalableBitmap(this, icon.ToStdString(), 16); this->drop_down_icon = ScalableBitmap(this, icon.ToStdString(), 16);
@ -86,12 +86,6 @@ void TextInput::Create(wxWindow * parent,
messureSize(); messureSize();
} }
void TextInput::SetCornerRadius(double radius)
{
this->radius = radius;
Refresh();
}
void TextInput::SetLabel(const wxString& label) void TextInput::SetLabel(const wxString& label)
{ {
wxWindow::SetLabel(label); wxWindow::SetLabel(label);

View File

@ -37,9 +37,7 @@ public:
const wxSize & size = wxDefaultSize, const wxSize & size = wxDefaultSize,
long style = 0); long style = 0);
void SetCornerRadius(double radius); void SetLabel(const wxString& label) wxOVERRIDE;
void SetLabel(const wxString& label);
void SetIcon(const wxBitmapBundle& icon); void SetIcon(const wxBitmapBundle& icon);
@ -76,8 +74,7 @@ public:
protected: protected:
virtual void OnEdit() {} virtual void OnEdit() {}
virtual void DoSetSize( void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO) wxOVERRIDE;
int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO);
void DoSetToolTipText(wxString const &tip) override; void DoSetToolTipText(wxString const &tip) override;

View File

@ -13,10 +13,15 @@
#include <boost/log/trivial.hpp> #include <boost/log/trivial.hpp>
#include <boost/filesystem.hpp> #include <boost/filesystem.hpp>
#include "Widgets/ComboBox.hpp"
namespace Slic3r { namespace Slic3r {
namespace GUI { namespace GUI {
const char* WIFI_CONFIGFILE_NAME = "prusa_printer_settings.ini";
WifiConfigDialog::WifiConfigDialog(wxWindow* parent, std::string& file_path, RemovableDriveManager* removable_manager) WifiConfigDialog::WifiConfigDialog(wxWindow* parent, std::string& file_path, RemovableDriveManager* removable_manager)
// TRN: This is the dialog title.
: DPIDialog(parent, wxID_ANY, _L("Wi-Fi Configuration File Generator"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) : DPIDialog(parent, wxID_ANY, _L("Wi-Fi Configuration File Generator"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
, m_wifi_scanner(new WifiScanner()) , m_wifi_scanner(new WifiScanner())
, out_file_path(file_path) , out_file_path(file_path)
@ -31,29 +36,29 @@ WifiConfigDialog::WifiConfigDialog(wxWindow* parent, std::string& file_path, Rem
// TRN Wifi config dialog explanation line 1. // TRN Wifi config dialog explanation line 1.
wxStaticText* explain_label1 = new wxStaticText(panel, wxID_ANY, _L("Generate a file to be loaded by a Prusa printer to configure its Wi-Fi connection.")); wxStaticText* explain_label1 = new wxStaticText(panel, wxID_ANY, _L("Generate a file to be loaded by a Prusa printer to configure its Wi-Fi connection."));
// TRN Wifi config dialog explanation line 2. // TRN Wifi config dialog explanation line 2.
wxStaticText* explain_label2 = new wxStaticText(panel, wxID_ANY, _L("Write this file on a USB flash drive. Its name will be prusa_printer_settings.ini.")); wxStaticText* explain_label2 = new wxStaticText(panel, wxID_ANY, GUI::format_wxstr(_L("Write this file on the USB flash drive. Its name will be %1%."), WIFI_CONFIGFILE_NAME));
// TRN Wifi config dialog explanation line 3. // TRN Wifi config dialog explanation line 3.
wxStaticText* explain_label3 = new wxStaticText(panel, wxID_ANY, _L("Your Prusa Printer should load this file automatically.")); wxStaticText* explain_label3 = new wxStaticText(panel, wxID_ANY, _L("Your Prusa Printer should load this file automatically."));
// TRN Wifi config dialog explanation line 4. // TRN Wifi config dialog explanation line 4.
wxStaticText* explain_label4 = new wxStaticText(panel, wxID_ANY, _L("Note: This file will contains SSID and password in plain text.")); wxStaticText* explain_label4 = new wxStaticText(panel, wxID_ANY, _L("Note: This file will contain the SSID and password in plain text."));
auto* ssid_sizer = new wxBoxSizer(wxHORIZONTAL); auto* ssid_sizer = new wxBoxSizer(wxHORIZONTAL);
// TRN SSID of WiFi network. // TRN SSID of WiFi network. It is a standard abbreviation which should probably not change in most languages.
wxStaticText* ssid_label = new wxStaticText(panel, wxID_ANY, GUI::format_wxstr("%1%:", _L("SSID"))); wxStaticText* ssid_label = new wxStaticText(panel, wxID_ANY, GUI::format_wxstr("%1%:", _L("SSID")));
m_ssid_combo = new wxComboBox(panel, wxID_ANY); m_ssid_combo = new ::ComboBox(panel, wxID_ANY);
#if __APPLE__ #if __APPLE__
m_ssid_combo->SetToolTip(_L("On some versions of MacOS, this only loads SSID of connected network.")); m_ssid_combo->SetToolTip(_L("On some versions of MacOS, this only loads SSID of connected network."));
#endif // __APPLE__ #endif // __APPLE__
rescan_networks(false); rescan_networks(false);
// TRN Text of button to rescan visible networks in Wifi Config dialog. // TRN Text of button to rescan visible networks in Wifi Config dialog.
wxButton* ssid_button = new wxButton(panel, wxID_ANY, _(L("Rescan"))); wxButton* ssid_button = new wxButton(panel, wxID_ANY, _(L("Rescan")));
ssid_sizer->Add(m_ssid_combo, 1, wxALIGN_CENTER_VERTICAL, 10); ssid_sizer->Add(m_ssid_combo, 1, wxALIGN_CENTER_VERTICAL | wxRIGHT, 10);
ssid_sizer->Add(ssid_button, 0); ssid_sizer->Add(ssid_button, 0);
auto* pass_sizer = new wxBoxSizer(wxHORIZONTAL); auto* pass_sizer = new wxBoxSizer(wxHORIZONTAL);
// TRN Password of WiFi network. // TRN Password of WiFi network.
wxStaticText* password_label = new wxStaticText(panel, wxID_ANY, GUI::format_wxstr("%1%:", _L("Password"))); wxStaticText* password_label = new wxStaticText(panel, wxID_ANY, GUI::format_wxstr("%1%:", _L("Password")));
m_pass_textctrl = new wxTextCtrl(panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize); m_pass_textctrl = new ::TextInput(panel, "", "", "", wxDefaultPosition, wxDefaultSize);
pass_sizer->Add(m_pass_textctrl, 1, wxALIGN_CENTER_VERTICAL, 10); pass_sizer->Add(m_pass_textctrl, 1, wxALIGN_CENTER_VERTICAL, 10);
#if __APPLE__ #if __APPLE__
// TRN Text of button to retrieve password from keychain in Wifi Config dialog. Only on Mac. // TRN Text of button to retrieve password from keychain in Wifi Config dialog. Only on Mac.
@ -67,11 +72,11 @@ WifiConfigDialog::WifiConfigDialog(wxWindow* parent, std::string& file_path, Rem
auto* drive_sizer = new wxBoxSizer(wxHORIZONTAL); auto* drive_sizer = new wxBoxSizer(wxHORIZONTAL);
// TRN description of Combo Box with path to USB drive. // TRN description of Combo Box with path to USB drive.
wxStaticText* drive_label = new wxStaticText(panel, wxID_ANY, GUI::format_wxstr("%1%:", _L("Drive"))); wxStaticText* drive_label = new wxStaticText(panel, wxID_ANY, GUI::format_wxstr("%1%:", _L("Drive")));
m_drive_combo = new wxComboBox(panel, wxID_ANY); m_drive_combo = new ::ComboBox(panel, wxID_ANY);
rescan_drives(); rescan_drives();
// TRN Text of button to rescan connect usb drives in Wifi Config dialog. // TRN Text of button to rescan connect usb drives in Wifi Config dialog.
wxButton* drive_button = new wxButton(panel, wxID_ANY, _(L("Rescan"))); wxButton* drive_button = new wxButton(panel, wxID_ANY, _(L("Rescan")));
drive_sizer->Add(m_drive_combo, 1, wxALIGN_CENTER_VERTICAL, 10); drive_sizer->Add(m_drive_combo, 1, wxALIGN_CENTER_VERTICAL | wxRIGHT, 10);
drive_sizer->Add(drive_button, 0); drive_sizer->Add(drive_button, 0);
// TRN Text of button to write config file in Wifi Config dialog. // TRN Text of button to write config file in Wifi Config dialog.
@ -111,6 +116,8 @@ WifiConfigDialog::WifiConfigDialog(wxWindow* parent, std::string& file_path, Rem
m_ssid_combo->Bind(wxEVT_TEXT, &WifiConfigDialog::on_combo, this); m_ssid_combo->Bind(wxEVT_TEXT, &WifiConfigDialog::on_combo, this);
drive_button->Bind(wxEVT_BUTTON, &WifiConfigDialog::on_rescan_drives, this); drive_button->Bind(wxEVT_BUTTON, &WifiConfigDialog::on_rescan_drives, this);
ssid_button->Bind(wxEVT_BUTTON, &WifiConfigDialog::on_rescan_networks, this); ssid_button->Bind(wxEVT_BUTTON, &WifiConfigDialog::on_rescan_networks, this);
wxGetApp().UpdateDlgDarkUI(this);
} }
WifiConfigDialog::~WifiConfigDialog() WifiConfigDialog::~WifiConfigDialog()
@ -208,7 +215,7 @@ void WifiConfigDialog::on_ok(wxCommandEvent& e)
return; return;
} }
boost::filesystem::path file_path = boost::filesystem::path(selected_path) / "prusa_printer_settings.ini"; boost::filesystem::path file_path = boost::filesystem::path(selected_path) / WIFI_CONFIGFILE_NAME;
bool path_on_removable_media = m_removable_manager->set_and_verify_last_save_path(file_path.string()); bool path_on_removable_media = m_removable_manager->set_and_verify_last_save_path(file_path.string());
if (!path_on_removable_media) { if (!path_on_removable_media) {

View File

@ -10,6 +10,9 @@
#include <wx/combobox.h> #include <wx/combobox.h>
#include <wx/textctrl.h> #include <wx/textctrl.h>
#include "Widgets/ComboBox.hpp"
#include "Widgets/TextInput.hpp"
namespace Slic3r { namespace Slic3r {
namespace GUI { namespace GUI {
@ -20,9 +23,9 @@ public:
WifiConfigDialog(wxWindow* parent, std::string& file_path, RemovableDriveManager* removable_manager); WifiConfigDialog(wxWindow* parent, std::string& file_path, RemovableDriveManager* removable_manager);
~WifiConfigDialog(); ~WifiConfigDialog();
private: private:
wxComboBox* m_ssid_combo {nullptr}; ::ComboBox* m_ssid_combo {nullptr};
wxTextCtrl* m_pass_textctrl {nullptr}; ::TextInput* m_pass_textctrl {nullptr};
wxComboBox* m_drive_combo {nullptr}; ::ComboBox* m_drive_combo {nullptr};
void on_ok(wxCommandEvent& e); void on_ok(wxCommandEvent& e);
void on_combo(wxCommandEvent& e); void on_combo(wxCommandEvent& e);

View File

@ -71,11 +71,8 @@ TEST_CASE("Moments calculation for rotated axis.", "[SupportSpotsGenerator]") {
Integrals integrals{{polygon}}; Integrals integrals{{polygon}};
std::mt19937 generator{std::random_device{}()};
std::uniform_real_distribution<float> angle_distribution{0.f, float(2*M_PI)};
// Meassured counterclockwise from (1, 0) // Meassured counterclockwise from (1, 0)
const float angle = angle_distribution(generator); const float angle = 1.432f;
Vec2f axis{std::cos(angle), std::sin(angle)}; Vec2f axis{std::cos(angle), std::sin(angle)};
float moment_calculated_then_rotated = compute_second_moment( float moment_calculated_then_rotated = compute_second_moment(
@ -93,7 +90,8 @@ TEST_CASE("Moments calculation for rotated axis.", "[SupportSpotsGenerator]") {
Vec2f{1, 0} Vec2f{1, 0}
); );
CHECK(moment_calculated_then_rotated == Approx(moment_rotated_polygon)); // Up to 0.1% accuracy
CHECK_THAT(moment_calculated_then_rotated, Catch::Matchers::WithinRel(moment_rotated_polygon, 0.001f));
} }
struct ObjectPartFixture { struct ObjectPartFixture {

View File

@ -3,7 +3,7 @@
set(SLIC3R_APP_NAME "PrusaSlicer") set(SLIC3R_APP_NAME "PrusaSlicer")
set(SLIC3R_APP_KEY "PrusaSlicer") set(SLIC3R_APP_KEY "PrusaSlicer")
set(SLIC3R_VERSION "2.7.0-alpha0") set(SLIC3R_VERSION "2.7.0-alpha1")
set(SLIC3R_BUILD_ID "PrusaSlicer-${SLIC3R_VERSION}+UNKNOWN") set(SLIC3R_BUILD_ID "PrusaSlicer-${SLIC3R_VERSION}+UNKNOWN")
set(SLIC3R_RC_VERSION "2,7,0,0") set(SLIC3R_RC_VERSION "2,7,0,0")
set(SLIC3R_RC_VERSION_DOTS "2.7.0.0") set(SLIC3R_RC_VERSION_DOTS "2.7.0.0")