Fixed conflicts after merge with master
|
@ -234,7 +234,11 @@ if(SLIC3R_STATIC)
|
|||
endif()
|
||||
#set(Boost_DEBUG ON)
|
||||
# set(Boost_COMPILER "-vc120")
|
||||
find_package(Boost REQUIRED COMPONENTS system filesystem thread log locale regex)
|
||||
if(NOT WIN32)
|
||||
# boost::process was introduced first in version 1.64.0
|
||||
set(MINIMUM_BOOST_VERSION "1.64.0")
|
||||
endif()
|
||||
find_package(Boost ${MINIMUM_BOOST_VERSION} REQUIRED COMPONENTS system filesystem thread log locale regex)
|
||||
if(Boost_FOUND)
|
||||
include_directories(${Boost_INCLUDE_DIRS})
|
||||
if (APPLE)
|
||||
|
|
|
@ -36,7 +36,7 @@ Each string resource in Slic3rPE available for translation needs to be explicitl
|
|||
```C++
|
||||
auto msg = L("This message to be localized")
|
||||
```
|
||||
To get translated text use one of needed macro/function (`_(s)`, `_CHB(s)` or `L_str(s)` ).
|
||||
To get translated text use one of needed macro/function (`_(s)` or `_CHB(s)` ).
|
||||
If you add new file resource, add it to the list of files containing macro `L()`
|
||||
|
||||
### Scenario 4. How do I use GNUgettext to localize my own application taking Slic3rPE as an example
|
||||
|
|
|
@ -5,13 +5,13 @@
|
|||
<g id="layers">
|
||||
<g>
|
||||
<g>
|
||||
<rect x="1" y="13" fill="#FFFFFF" width="14" height="2"/>
|
||||
<rect x="1" y="13" fill="#808080" width="14" height="2"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect x="1" y="10.6" fill="#FFFFFF" width="14" height="1.74"/>
|
||||
<rect x="1" y="10.6" fill="#808080" width="14" height="1.74"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect x="1" y="8.19" fill="#FFFFFF" width="14" height="1.47"/>
|
||||
<rect x="1" y="8.19" fill="#808080" width="14" height="1.47"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect x="1" y="5.79" fill="#ED6B21" width="14" height="1.2"/>
|
||||
|
@ -20,7 +20,7 @@
|
|||
<rect x="1" y="3.39" fill="#ED6B21" width="14" height="0.93"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect x="1" y="0.99" fill="#FFFFFF" width="14" height="0.67"/>
|
||||
<rect x="1" y="0.99" fill="#808080" width="14" height="0.67"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
|
|
Before Width: | Height: | Size: 845 B After Width: | Height: | Size: 845 B |
19
resources/icons/white/add_copies.svg
Normal file
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="add_x5F_copies">
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M8,2c3.31,0,6,2.69,6,6s-2.69,6-6,6s-6-2.69-6-6S4.69,2,8,2 M8,1C4.13,1,1,4.13,1,8s3.13,7,7,7s7-3.13,7-7
|
||||
S11.87,1,8,1L8,1z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M12,8.75H4C3.59,8.75,3.25,8.41,3.25,8S3.59,7.25,4,7.25h8c0.41,0,0.75,0.34,0.75,0.75S12.41,8.75,12,8.75
|
||||
z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M8,12.75c-0.41,0-0.75-0.34-0.75-0.75V4c0-0.41,0.34-0.75,0.75-0.75S8.75,3.59,8.75,4v8
|
||||
C8.75,12.41,8.41,12.75,8,12.75z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 846 B |
13
resources/icons/white/add_modifier.svg
Normal file
|
@ -0,0 +1,13 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="add_x5F_modifer">
|
||||
<path fill="#FFFFFF" d="M10.98,9.78c-0.29,0-0.52,0.23-0.52,0.52v2.09v1.04c0,0.29-0.23,0.52-0.52,0.52H2.62
|
||||
c-0.29,0-0.53-0.24-0.53-0.53l-0.05-7.3c0-0.14,0.05-0.27,0.15-0.37c0.1-0.1,0.23-0.15,0.37-0.15h3.19l0,0
|
||||
c0.29,0,0.52-0.23,0.52-0.52S6.04,4.55,5.75,4.55H3.66c-0.01,0-0.01,0-0.02,0H2.56c-0.42,0-0.81,0.16-1.11,0.46
|
||||
C1.16,5.31,1,5.71,1,6.13l0.04,7.31C1.05,14.3,1.75,15,2.62,15h7.31c0.86,0,1.57-0.7,1.57-1.57v-1.04V10.3
|
||||
C11.5,10.01,11.27,9.78,10.98,9.78z"/>
|
||||
<circle fill="#ED6B21" cx="11" cy="5" r="3.5"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 891 B |
20
resources/icons/white/add_part.svg
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="add_x5F_part_1_">
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M11,15c-0.55,0-1-0.45-1-1V8c0-0.55,0.45-1,1-1s1,0.45,1,1v6C12,14.55,11.55,15,11,15z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M14,12H8c-0.55,0-1-0.45-1-1s0.45-1,1-1h6c0.55,0,1,0.45,1,1S14.55,12,14,12z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M10.98,6.22c-0.29,0-0.52-0.23-0.52-0.52V3.61V2.57c0-0.29-0.23-0.52-0.52-0.52H2.62
|
||||
c-0.29,0-0.53,0.24-0.53,0.53l-0.05,7.3c0,0.14,0.05,0.27,0.15,0.37c0.1,0.1,0.23,0.15,0.37,0.15h3.19l0,0
|
||||
c0.29,0,0.52,0.23,0.52,0.52s-0.23,0.52-0.52,0.52H3.66c-0.01,0-0.01,0-0.02,0H2.56c-0.42,0-0.81-0.16-1.11-0.46
|
||||
C1.16,10.69,1,10.29,1,9.87l0.04-7.31C1.05,1.7,1.75,1,2.62,1h7.31c0.86,0,1.57,0.7,1.57,1.57v1.04V5.7
|
||||
C11.5,5.99,11.27,6.22,10.98,6.22z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.1 KiB |
43
resources/icons/white/advanced+wrench.svg
Normal file
|
@ -0,0 +1,43 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="advanced_x2B_wrench">
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M7.61,3.81C7.49,3.75,7.35,3.6,7.31,3.47S7.15,2.92,7.19,2.79l0.06-0.17c0.04-0.13,0-0.32-0.1-0.41
|
||||
L6.8,1.85c-0.1-0.1-0.28-0.14-0.41-0.1L6.21,1.81C6.08,1.85,5.88,1.84,5.76,1.78S5.26,1.51,5.2,1.39L5.11,1.22
|
||||
C5.05,1.1,4.89,1,4.75,1h-0.5c-0.14,0-0.3,0.1-0.36,0.22L3.81,1.39C3.75,1.51,3.6,1.65,3.47,1.69S2.92,1.85,2.79,1.81L2.62,1.75
|
||||
c-0.13-0.04-0.32,0-0.41,0.1L1.85,2.2c-0.1,0.1-0.14,0.28-0.1,0.41l0.06,0.17c0.04,0.13,0.03,0.33-0.03,0.45s-0.27,0.5-0.39,0.56
|
||||
l-0.17,0.1C1.1,3.95,1,4.11,1,4.25v0.5c0,0.14,0.1,0.3,0.22,0.36l0.17,0.08c0.12,0.06,0.26,0.21,0.3,0.34S1.85,6.07,1.81,6.2
|
||||
L1.75,6.38c-0.04,0.13,0,0.32,0.1,0.41L2.2,7.15c0.1,0.1,0.28,0.14,0.41,0.1l0.17-0.06c0.13-0.04,0.33-0.03,0.45,0.03
|
||||
s0.5,0.27,0.56,0.39l0.08,0.17C3.95,7.9,4.11,8,4.25,8h0.5c0.14,0,0.3-0.1,0.36-0.22l0.08-0.17c0.06-0.12,0.21-0.26,0.34-0.3
|
||||
S6.07,7.15,6.2,7.19l0.17,0.06c0.13,0.04,0.32,0,0.41-0.1L7.15,6.8c0.1-0.1,0.14-0.28,0.1-0.41L7.19,6.21
|
||||
C7.15,6.08,7.16,5.88,7.22,5.76s0.27-0.5,0.39-0.56l0.17-0.08C7.9,5.05,8,4.89,8,4.75v-0.5c0-0.14-0.1-0.3-0.22-0.36L7.61,3.81z
|
||||
M4.5,6.42c-1.06,0-1.92-0.86-1.92-1.92S3.44,2.58,4.5,2.58S6.42,3.44,6.42,4.5S5.56,6.42,4.5,6.42z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M12.61,2.6c-0.12-0.06-0.24-0.18-0.28-0.27s-0.11-0.42-0.06-0.54s0-0.31-0.1-0.41l-0.15-0.15
|
||||
c-0.1-0.1-0.28-0.14-0.41-0.1s-0.3,0.04-0.39,0S10.86,0.9,10.8,0.78s-0.22-0.22-0.36-0.22h-0.21c-0.14,0-0.3,0.1-0.36,0.22
|
||||
S9.68,1.03,9.59,1.06s-0.41,0.1-0.54,0.06s-0.31,0-0.41,0.1L8.49,1.37c-0.1,0.1-0.14,0.28-0.1,0.41s0.04,0.3,0,0.39
|
||||
S8.17,2.54,8.05,2.6S7.83,2.82,7.83,2.96v0.21c0,0.14,0.1,0.3,0.22,0.36C8.17,3.59,8.3,3.71,8.33,3.8s0.11,0.42,0.06,0.54
|
||||
s0,0.31,0.1,0.41L8.64,4.9C8.74,5,8.92,5.04,9.05,5s0.3-0.04,0.39,0s0.37,0.22,0.43,0.34s0.22,0.22,0.36,0.22h0.21
|
||||
c0.14,0,0.3-0.1,0.36-0.22s0.18-0.24,0.27-0.28S11.49,4.95,11.61,5s0.31,0,0.41-0.1l0.15-0.15c0.1-0.1,0.14-0.28,0.1-0.41
|
||||
s-0.04-0.3,0-0.39s0.22-0.37,0.34-0.43s0.22-0.22,0.22-0.36v-0.2C12.83,2.82,12.74,2.66,12.61,2.6z M10.33,4.18
|
||||
c-0.62,0-1.11-0.5-1.11-1.11c0-0.62,0.5-1.11,1.11-1.11s1.11,0.5,1.11,1.11C11.45,3.68,10.95,4.18,10.33,4.18z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M14.38,9.89c-0.01-0.14,0.06-0.33,0.15-0.44l0.31-0.35c0.09-0.1,0.12-0.29,0.07-0.42l-0.35-0.85
|
||||
c-0.05-0.13-0.21-0.24-0.35-0.25l-0.47-0.03c-0.14-0.01-0.32-0.1-0.42-0.2l-0.37-0.37c-0.1-0.09-0.2-0.28-0.2-0.41L12.72,6.1
|
||||
c-0.01-0.14-0.12-0.29-0.25-0.35L11.62,5.4c-0.13-0.05-0.32-0.02-0.42,0.07l-0.36,0.31c-0.1,0.09-0.3,0.16-0.44,0.15H9.88
|
||||
c-0.13,0-0.33-0.07-0.43-0.16L9.1,5.46C8.99,5.37,8.8,5.34,8.68,5.4L7.83,5.75C7.7,5.8,7.59,5.95,7.58,6.09L7.55,6.56
|
||||
c-0.01,0.14-0.1,0.32-0.2,0.42L6.98,7.34c-0.09,0.1-0.28,0.2-0.41,0.2L6.09,7.58C5.95,7.59,5.8,7.7,5.75,7.83L5.4,8.68
|
||||
C5.34,8.8,5.37,8.99,5.46,9.1l0.31,0.36c0.09,0.1,0.16,0.3,0.15,0.44v0.52c0.01,0.14-0.06,0.33-0.15,0.44L5.46,11.2
|
||||
c-0.09,0.1-0.12,0.29-0.07,0.42l0.35,0.85c0.05,0.13,0.21,0.24,0.35,0.25l0.47,0.03c0.14,0.01,0.32,0.1,0.42,0.2l0.37,0.37
|
||||
c0.1,0.09,0.2,0.28,0.2,0.41l0.03,0.47c0.01,0.14,0.12,0.29,0.25,0.35l0.85,0.35C8.81,14.95,9,14.92,9.1,14.83l0.36-0.31
|
||||
c0.1-0.09,0.3-0.16,0.44-0.15h0.52c0.14-0.01,0.33,0.06,0.44,0.15l0.35,0.31c0.1,0.09,0.29,0.12,0.42,0.07l0.85-0.35
|
||||
c0.13-0.05,0.24-0.21,0.25-0.35l0.03-0.47c0.01-0.14,0.1-0.32,0.2-0.42l0.37-0.37c0.09-0.1,0.28-0.2,0.41-0.21l0.47-0.03
|
||||
c0.14-0.01,0.29-0.12,0.35-0.25l0.35-0.85c0.05-0.13,0.02-0.32-0.07-0.42l-0.31-0.36c-0.09-0.1-0.16-0.3-0.15-0.44L14.38,9.89z
|
||||
M10.15,13c-1.57,0-2.85-1.27-2.85-2.85S8.58,7.3,10.15,7.3S13,8.58,13,10.15S11.72,13,10.15,13z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.9 KiB |
24
resources/icons/white/advanced_plus.svg
Normal file
|
@ -0,0 +1,24 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="advanced_x2B_">
|
||||
<path fill="#FFFFFF" d="M10.98,9.78c-0.29,0-0.52,0.23-0.52,0.52v2.09v1.04c0,0.29-0.23,0.52-0.52,0.52H2.62
|
||||
c-0.29,0-0.53-0.24-0.53-0.53l-0.05-7.3c0-0.14,0.05-0.27,0.15-0.37c0.1-0.1,0.23-0.15,0.37-0.15h3.19l0,0
|
||||
c0.29,0,0.52-0.23,0.52-0.52S6.04,4.55,5.75,4.55H3.66c-0.01,0-0.01,0-0.02,0H2.56c-0.42,0-0.81,0.16-1.11,0.46
|
||||
C1.16,5.31,1,5.71,1,6.13l0.04,7.31C1.05,14.3,1.75,15,2.62,15h7.31c0.86,0,1.57-0.7,1.57-1.57v-1.04V10.3
|
||||
C11.5,10.01,11.27,9.78,10.98,9.78z"/>
|
||||
<path fill="#ED6B21" d="M13.56,5.38c-0.01-0.13,0.06-0.33,0.15-0.43l0.13-0.15c0.09-0.1,0.12-0.29,0.07-0.42l-0.2-0.48
|
||||
c-0.05-0.13-0.21-0.24-0.35-0.25l-0.2-0.01c-0.14-0.01-0.32-0.1-0.41-0.2c-0.09-0.1-0.37-0.45-0.38-0.59l-0.01-0.2
|
||||
c-0.01-0.14-0.12-0.29-0.25-0.35l-0.48-0.2c-0.13-0.05-0.32-0.02-0.42,0.07L11.06,2.3c-0.1,0.09-0.3,0.16-0.44,0.15
|
||||
S10.05,2.39,9.94,2.3L9.79,2.16C9.69,2.07,9.5,2.04,9.37,2.1L8.89,2.3C8.76,2.35,8.65,2.5,8.64,2.64l-0.01,0.2
|
||||
c-0.01,0.14-0.1,0.32-0.2,0.41c-0.1,0.09-0.45,0.37-0.59,0.38l-0.2,0.01C7.5,3.65,7.35,3.76,7.3,3.89L7.1,4.37
|
||||
C7.04,4.5,7.07,4.69,7.16,4.79L7.3,4.94c0.09,0.1,0.16,0.3,0.15,0.44C7.44,5.51,7.38,5.95,7.29,6.06L7.16,6.21
|
||||
C7.07,6.31,7.04,6.5,7.1,6.63l0.2,0.48c0.05,0.13,0.2,0.24,0.34,0.25l0.2,0.01c0.14,0.01,0.32,0.1,0.41,0.2s0.37,0.45,0.38,0.59
|
||||
l0.01,0.2C8.65,8.5,8.76,8.65,8.89,8.7l0.48,0.2C9.5,8.96,9.69,8.93,9.79,8.84L9.94,8.7c0.1-0.09,0.3-0.16,0.44-0.15
|
||||
c0.14,0.01,0.57,0.06,0.68,0.15l0.15,0.13c0.1,0.09,0.29,0.12,0.42,0.07l0.48-0.2c0.13-0.05,0.24-0.21,0.25-0.35l0.01-0.2
|
||||
c0.01-0.14,0.1-0.32,0.2-0.41s0.45-0.37,0.59-0.38l0.2-0.01c0.14-0.01,0.29-0.12,0.35-0.25l0.2-0.48c0.05-0.13,0.02-0.32-0.07-0.42
|
||||
L13.7,6.06C13.61,5.95,13.56,5.51,13.56,5.38z M10.5,7.55c-1.13,0-2.05-0.92-2.05-2.05s0.92-2.05,2.05-2.05s2.05,0.92,2.05,2.05
|
||||
S11.63,7.55,10.5,7.55z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.1 KiB |
17
resources/icons/white/cog.svg
Normal file
|
@ -0,0 +1,17 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="machine_x2B_cog">
|
||||
<path fill="#ffffff" d="M13.77,6.39c-0.13-0.47-0.32-0.92-0.55-1.33l0.43-1.3l-1.41-1.41l-1.3,0.43c-0.42-0.23-0.86-0.42-1.33-0.55
|
||||
L9,1H7L6.39,2.23C5.92,2.36,5.47,2.54,5.06,2.78l-1.3-0.43L2.34,3.76l0.43,1.3C2.54,5.47,2.36,5.92,2.23,6.39L1,7v2l1.23,0.61
|
||||
c0.13,0.47,0.32,0.92,0.55,1.33l-0.43,1.3l1.41,1.41l1.3-0.43c0.42,0.23,0.86,0.42,1.33,0.55L7,15h2l0.61-1.23
|
||||
c0.47-0.13,0.92-0.32,1.33-0.55l1.3,0.43l1.41-1.41l-0.43-1.3c0.23-0.42,0.42-0.86,0.55-1.33L15,9V7L13.77,6.39z M8,13
|
||||
c-2.76,0-5-2.24-5-5s2.24-5,5-5s5,2.24,5,5S10.76,13,8,13z"/>
|
||||
<path fill="#ED6B21" d="M11.3,7.08c-0.07-0.27-0.18-0.52-0.31-0.76l0.25-0.74l-0.81-0.81L9.68,5.01C9.45,4.88,9.19,4.78,8.92,4.7
|
||||
L8.57,4H7.43L7.08,4.7C6.81,4.78,6.55,4.88,6.32,5.01L5.58,4.77L4.77,5.58l0.25,0.74C4.88,6.55,4.78,6.81,4.7,7.08L4,7.43v1.14
|
||||
l0.7,0.35c0.07,0.27,0.18,0.52,0.31,0.76l-0.25,0.74l0.81,0.81l0.74-0.25c0.24,0.13,0.49,0.24,0.76,0.31L7.43,12h1.14l0.35-0.7
|
||||
c0.27-0.07,0.52-0.18,0.76-0.31l0.74,0.25l0.81-0.81l-0.25-0.74c0.13-0.24,0.24-0.49,0.31-0.76L12,8.57V7.43L11.3,7.08z M8,10.86
|
||||
c-1.58,0-2.86-1.28-2.86-2.86S6.42,5.14,8,5.14S10.86,6.42,10.86,8S9.58,10.86,8,10.86z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.5 KiB |
25
resources/icons/white/cooling.svg
Normal file
|
@ -0,0 +1,25 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="cooling">
|
||||
<path fill="#FFFFFF" d="M14,1H2C1.45,1,1,1.45,1,2v12c0,0.55,0.45,1,1,1h12c0.55,0,1-0.45,1-1V2C15,1.45,14.55,1,14,1z M8,14
|
||||
c-3.31,0-6-2.69-6-6s2.69-6,6-6s6,2.69,6,6S11.31,14,8,14z"/>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M7.86,7.14C7.94,7.41,8,7.7,8,8c0,1.66-1.34,3-3,3c-0.3,0-0.59-0.06-0.86-0.14C4.51,12.09,5.64,13,7,13
|
||||
c1.66,0,3-1.34,3-3C10,8.64,9.09,7.51,7.86,7.14z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M8,8C6.34,8,5,6.66,5,5c0-0.3,0.06-0.59,0.14-0.86C3.91,4.51,3,5.64,3,7c0,1.66,1.34,3,3,3
|
||||
c1.36,0,2.49-0.91,2.86-2.14C8.59,7.94,8.3,8,8,8z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M10,6C8.64,6,7.51,6.91,7.14,8.14C7.41,8.06,7.7,8,8,8c1.66,0,3,1.34,3,3c0,0.3-0.06,0.59-0.14,0.86
|
||||
C12.09,11.49,13,10.36,13,9C13,7.34,11.66,6,10,6z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M8,8c0-1.66,1.34-3,3-3c0.3,0,0.59,0.06,0.86,0.14C11.49,3.91,10.36,3,9,3C7.34,3,6,4.34,6,6
|
||||
c0,1.36,0.91,2.49,2.14,2.86C8.06,8.59,8,8.3,8,8z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
37
resources/icons/white/copy_menu.svg
Normal file
|
@ -0,0 +1,37 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
|
||||
<g id="copy">
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M115.76,51.2l-8.06-8.06c-2.47-2.47-6.97-4.34-10.47-4.34h-50.8c-4.2,0-7.62,3.42-7.62,7.62v66.04
|
||||
c0,4.2,3.42,7.62,7.62,7.62h66.04c4.2,0,7.62-3.42,7.62-7.62v-50.8C120.09,58.17,118.23,53.67,115.76,51.2z M111.42,54.04h-6.57
|
||||
v-6.57L111.42,54.04z M115.01,112.47c0,1.4-1.14,2.54-2.54,2.54H46.43c-1.4,0-2.54-1.14-2.54-2.54V46.42
|
||||
c0-1.4,1.14-2.54,2.54-2.54h50.8c0.74,0,1.63,0.18,2.54,0.46v12.24c0,1.4,1.14,2.54,2.54,2.54h12.24c0.28,0.91,0.46,1.8,0.46,2.54
|
||||
V112.47z"/>
|
||||
<path fill="#ED6B21" d="M53.97,59.13h35.72c1.4,0,2.54-1.14,2.54-2.54s-1.14-2.54-2.54-2.54H53.97c-1.4,0-2.54,1.14-2.54,2.54
|
||||
S52.56,59.13,53.97,59.13z"/>
|
||||
<path fill="#ED6B21" d="M104.93,69.29H53.97c-1.4,0-2.54,1.14-2.54,2.54s1.14,2.54,2.54,2.54h50.96c1.4,0,2.54-1.14,2.54-2.54
|
||||
S106.33,69.29,104.93,69.29z"/>
|
||||
<path fill="#ED6B21" d="M104.93,84.53H53.97c-1.4,0-2.54,1.14-2.54,2.54s1.14,2.54,2.54,2.54h50.96c1.4,0,2.54-1.14,2.54-2.54
|
||||
S106.33,84.53,104.93,84.53z"/>
|
||||
<path fill="#ED6B21" d="M104.93,99.77H53.97c-1.4,0-2.54,1.14-2.54,2.54s1.14,2.54,2.54,2.54h50.96c1.4,0,2.54-1.14,2.54-2.54
|
||||
S106.33,99.77,104.93,99.77z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ffffff" d="M85.27,20.71l-8.06-8.06c-2.47-2.47-6.97-4.34-10.47-4.34h-50.8c-4.2,0-7.62,3.42-7.62,7.62v66.04
|
||||
c0,4.2,3.42,7.62,7.62,7.62h17.78c1.4,0,2.54-1.14,2.54-2.54s-1.14-2.54-2.54-2.54H15.94c-1.4,0-2.54-1.14-2.54-2.54V15.94
|
||||
c0-1.4,1.14-2.54,2.54-2.54h50.8c0.74,0,1.63,0.18,2.54,0.46V26.1c0,1.4,1.14,2.54,2.54,2.54h12.45c0.16,0.49,0.25,0.93,0.25,1.27
|
||||
v3.81c0,1.4,1.14,2.54,2.54,2.54c1.4,0,2.54-1.14,2.54-2.54v-3.81C89.61,27.14,87.75,23.19,85.27,20.71z M74.37,16.99l6.57,6.57
|
||||
h-6.57V16.99z"/>
|
||||
<path fill="#ffffff" d="M59.21,23.56H23.48c-1.4,0-2.54,1.14-2.54,2.54s1.14,2.54,2.54,2.54h35.72c1.4,0,2.54-1.14,2.54-2.54
|
||||
S60.61,23.56,59.21,23.56z"/>
|
||||
<path fill="#ffffff" d="M28.73,38.8h-5.24c-1.4,0-2.54,1.14-2.54,2.54s1.14,2.54,2.54,2.54h5.24c1.4,0,2.54-1.14,2.54-2.54
|
||||
S30.13,38.8,28.73,38.8z"/>
|
||||
<path fill="#ffffff" d="M28.73,54.04h-5.24c-1.4,0-2.54,1.14-2.54,2.54s1.14,2.54,2.54,2.54h5.24c1.4,0,2.54-1.14,2.54-2.54
|
||||
S30.13,54.04,28.73,54.04z"/>
|
||||
<path fill="#ffffff" d="M28.73,69.29h-5.24c-1.4,0-2.54,1.14-2.54,2.54s1.14,2.54,2.54,2.54h5.24c1.4,0,2.54-1.14,2.54-2.54
|
||||
S30.13,69.29,28.73,69.29z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.6 KiB |
22
resources/icons/white/delete.svg
Normal file
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="delete">
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M13,10c0-1.1-0.9-2-2-2H5c-1.1,0-2,0.9-2,2v3c0,1.1,0.9,2,2,2h6c1.1,0,2-0.9,2-2V10z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M12,5.01c0.25,0,0.47,0.09,0.62,0.26s0.22,0.4,0.2,0.64l-0.64,7.01C12.13,13.49,11.58,14,11,14H5
|
||||
c-0.58,0-1.13-0.51-1.19-1.08L3.18,5.91c-0.02-0.25,0.05-0.47,0.2-0.64C3.53,5.1,3.75,5.01,4,5.01H12 M12,4.01H4
|
||||
c-1.1,0-1.92,0.9-1.82,1.99l0.64,7.01C2.92,14.1,3.9,15,5,15h6c1.1,0,2.08-0.9,2.18-1.99L13.82,6C13.92,4.91,13.1,4.01,12,4.01
|
||||
L12,4.01z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M13,3.5H3C2.72,3.5,2.5,3.28,2.5,3S2.72,2.5,3,2.5h10c0.28,0,0.5,0.22,0.5,0.5S13.28,3.5,13,3.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M10,2.5H6C5.72,2.5,5.5,2.28,5.5,2S5.72,1.5,6,1.5h4c0.28,0,0.5,0.22,0.5,0.5S10.28,2.5,10,2.5z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.1 KiB |
31
resources/icons/white/delete_all_menu.svg
Normal file
|
@ -0,0 +1,31 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
|
||||
<g id="DELETE_ALL_1_">
|
||||
<path fill="#ffffff" d="M103.52,43.87l-13.31,69.97H37.79L24.48,43.87H103.52 M108.77,37.87H19.23c-1.1,0-1.83,0.88-1.63,1.96
|
||||
l14.84,78.04c0.21,1.08,1.27,1.96,2.37,1.96h58.36c1.1,0,2.17-0.88,2.37-1.96l14.84-78.04C110.6,38.75,109.87,37.87,108.77,37.87
|
||||
L108.77,37.87z"/>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M89.38,22.97c-1.1,0-2-0.9-2-2v-10.9c0-1.1-0.9-2-2-2H42.62c-1.1,0-2,0.9-2,2v10.9c0,1.1-0.9,2-2,2H19.23
|
||||
c-1.1,0-2,0.9-2,2v3.45c0,1.1,0.9,2,2,2h89.54c1.1,0,2-0.9,2-2v-3.45c0-1.1-0.9-2-2-2H89.38z M79.59,20.97c0,1.1-0.9,2-2,2H50.41
|
||||
c-1.1,0-2-0.9-2-2v-3.45c0-1.1,0.9-2,2-2h27.18c1.1,0,2,0.9,2,2V20.97z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ffffff" d="M93.17,73.5H34.83c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h58.34c0.83,0,1.5,0.67,1.5,1.5
|
||||
S94,73.5,93.17,73.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ffffff" d="M90.14,89.45H37.96c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h52.18c0.83,0,1.5,0.67,1.5,1.5
|
||||
S90.97,89.45,90.14,89.45z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ffffff" d="M87.1,105.4H40.9c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h46.2c0.83,0,1.5,0.67,1.5,1.5
|
||||
S87.93,105.4,87.1,105.4z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ffffff" d="M96.2,57.56H31.8c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h64.4c0.83,0,1.5,0.67,1.5,1.5
|
||||
S97.03,57.56,96.2,57.56z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
20
resources/icons/white/editor_menu.svg
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
|
||||
<g id="editor">
|
||||
<g>
|
||||
<path fill="none" stroke="#ffffff" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M118.68,8.83L92.1,37.03c-0.75,0.8-2.27,1.46-3.37,1.46H9.44"/>
|
||||
</g>
|
||||
<g>
|
||||
|
||||
<line fill="none" stroke="#ffffff" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="90.72" y1="118.69" x2="90.72" y2="38.81"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="none" stroke="#ffffff" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M119.88,91.51v-81.4c0-1.1-0.9-2-2-2H42.92c-1.1,0-2.66,0.61-3.47,1.36L9.59,37.13c-0.81,0.75-1.47,2.26-1.47,3.36v77.39
|
||||
c0,1.1,0.9,2,2,2h78.61c1.1,0,2.65-0.63,3.44-1.39l27.67-26.82"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.1 KiB |
20
resources/icons/white/export_config.svg
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="export_x5F_config">
|
||||
<path fill="#FFFFFF" d="M14.22,6.61c-0.25-0.12-0.52-0.43-0.6-0.68s-0.32-1.09-0.23-1.35l0.12-0.35c0.09-0.26,0-0.63-0.2-0.83
|
||||
L12.6,2.7c-0.19-0.19-0.57-0.28-0.83-0.2l-0.35,0.12c-0.26,0.09-0.67,0.06-0.91-0.05s-1-0.54-1.12-0.79L9.22,1.45
|
||||
C9.1,1.2,8.77,1,8.5,1h-1C7.22,1,6.9,1.2,6.78,1.45L6.61,1.78C6.49,2.02,6.18,2.3,5.93,2.38S4.84,2.7,4.58,2.62L4.23,2.5
|
||||
C3.97,2.41,3.6,2.5,3.4,2.7L2.7,3.4C2.5,3.6,2.41,3.97,2.5,4.23l0.12,0.35C2.7,4.84,2.68,5.25,2.57,5.49s-0.54,1-0.79,1.12
|
||||
L1.45,6.78C1.2,6.9,1,7.22,1,7.5v1c0,0.27,0.2,0.6,0.45,0.72l0.33,0.17c0.25,0.12,0.52,0.43,0.6,0.68s0.32,1.09,0.23,1.35
|
||||
L2.5,11.77c-0.09,0.26,0,0.63,0.2,0.83l0.7,0.7c0.19,0.19,0.57,0.28,0.83,0.2l0.35-0.12c0.26-0.09,0.67-0.06,0.91,0.05
|
||||
s1,0.54,1.12,0.79l0.17,0.33C6.9,14.8,7.22,15,7.5,15h1c0.27,0,0.6-0.2,0.72-0.45l0.17-0.33c0.12-0.25,0.43-0.52,0.68-0.6
|
||||
s1.09-0.32,1.35-0.23l0.35,0.12c0.26,0.09,0.63,0,0.83-0.2l0.71-0.71c0.19-0.19,0.28-0.57,0.2-0.83l-0.12-0.35
|
||||
c-0.09-0.26-0.06-0.67,0.05-0.91s0.54-1,0.79-1.12l0.33-0.17C14.8,9.1,15,8.77,15,8.5v-1c0-0.28-0.2-0.6-0.45-0.72L14.22,6.61z
|
||||
M8,13c-2.76,0-5-2.24-5-5s2.24-5,5-5s5,2.24,5,5S10.76,13,8,13z"/>
|
||||
<path fill="#ED6B21" d="M11.65,8.35c0.19-0.19,0.19-0.51,0-0.71L8.92,4.92C8.73,4.73,8.57,4.8,8.57,5.07v1.29
|
||||
c0,0.28-0.22,0.5-0.5,0.5H4.5C4.22,6.86,4,7.08,4,7.36v1.29c0,0.27,0.22,0.5,0.5,0.5h3.57c0.28,0,0.5,0.22,0.5,0.5v1.29
|
||||
c0,0.27,0.16,0.34,0.35,0.15L11.65,8.35z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.7 KiB |
50
resources/icons/white/export_config_bundle.svg
Normal file
|
@ -0,0 +1,50 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="export_x5F_config_x5F_bundle">
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M1.2,12.61c0.11,0.08,0.21,0.22,0.23,0.31s0.04,0.43-0.03,0.55s-0.05,0.31,0.03,0.42l0.12,0.17
|
||||
c0.08,0.11,0.25,0.19,0.39,0.17c0.13-0.02,0.3,0.01,0.38,0.06s0.33,0.28,0.37,0.41s0.18,0.25,0.32,0.27l0.21,0.04
|
||||
c0.14,0.02,0.31-0.05,0.39-0.16s0.22-0.21,0.31-0.23c0.09-0.02,0.43-0.04,0.55,0.03c0.12,0.06,0.31,0.05,0.42-0.03l0.17-0.12
|
||||
c0.11-0.08,0.19-0.25,0.17-0.39c-0.02-0.13,0.01-0.3,0.06-0.38s0.28-0.33,0.41-0.37c0.13-0.04,0.25-0.18,0.27-0.32l0.04-0.21
|
||||
c0.02-0.14-0.05-0.31-0.16-0.39c-0.11-0.08-0.21-0.22-0.23-0.31s-0.04-0.43,0.03-0.55c0.06-0.12,0.05-0.31-0.03-0.42L5.5,10.98
|
||||
c-0.08-0.11-0.25-0.19-0.39-0.17c-0.13,0.02-0.3-0.01-0.38-0.06s-0.33-0.28-0.37-0.41s-0.18-0.25-0.32-0.27l-0.21-0.04
|
||||
c-0.14-0.02-0.31,0.05-0.39,0.16s-0.22,0.21-0.31,0.23S2.7,10.46,2.58,10.4c-0.12-0.06-0.31-0.05-0.42,0.03l-0.17,0.12
|
||||
c-0.11,0.08-0.19,0.25-0.17,0.39s-0.01,0.3-0.06,0.38s-0.28,0.33-0.41,0.37s-0.25,0.18-0.27,0.32l-0.04,0.21
|
||||
C1.02,12.36,1.09,12.53,1.2,12.61z M3.71,11.42c0.61,0.1,1.02,0.68,0.92,1.28c-0.1,0.61-0.68,1.02-1.28,0.92
|
||||
c-0.61-0.1-1.02-0.68-0.92-1.28C2.53,11.73,3.1,11.32,3.71,11.42z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M10.39,4.47c0.13,0.03,0.28,0.13,0.33,0.21s0.19,0.38,0.18,0.52s0.07,0.3,0.19,0.38l0.18,0.11
|
||||
c0.12,0.07,0.31,0.08,0.42,0.01c0.12-0.07,0.28-0.11,0.38-0.09c0.09,0.02,0.41,0.13,0.5,0.24c0.09,0.1,0.26,0.17,0.4,0.13
|
||||
l0.21-0.05c0.13-0.03,0.27-0.16,0.3-0.29s0.13-0.28,0.21-0.33c0.08-0.05,0.38-0.19,0.52-0.18c0.13,0.01,0.3-0.07,0.38-0.19
|
||||
l0.11-0.18c0.07-0.12,0.08-0.31,0.01-0.42c-0.07-0.12-0.11-0.28-0.09-0.38c0.02-0.09,0.13-0.41,0.24-0.5
|
||||
c0.1-0.09,0.17-0.26,0.13-0.4l-0.05-0.21c-0.03-0.13-0.16-0.27-0.29-0.3s-0.28-0.13-0.33-0.21s-0.19-0.38-0.18-0.52
|
||||
c0.01-0.13-0.07-0.3-0.19-0.38l-0.18-0.11c-0.12-0.07-0.31-0.08-0.42-0.01c-0.12,0.07-0.28,0.11-0.38,0.09
|
||||
c-0.09-0.02-0.41-0.13-0.5-0.24c-0.09-0.1-0.26-0.17-0.4-0.13l-0.2,0.06c-0.13,0.03-0.27,0.16-0.3,0.29s-0.13,0.28-0.21,0.33
|
||||
s-0.38,0.19-0.52,0.18s-0.3,0.07-0.38,0.19l-0.11,0.18c-0.07,0.12-0.08,0.31-0.01,0.42c0.07,0.12,0.11,0.28,0.09,0.38
|
||||
s-0.13,0.41-0.24,0.5c-0.1,0.09-0.17,0.26-0.13,0.4l0.05,0.21C10.13,4.3,10.26,4.44,10.39,4.47z M12.27,2.43
|
||||
c0.6-0.13,1.2,0.24,1.33,0.84s-0.24,1.2-0.84,1.33c-0.6,0.13-1.2-0.24-1.33-0.84S11.67,2.56,12.27,2.43z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M1.85,4.19C1.8,4.32,1.66,4.47,1.53,4.53L1.15,4.71C1.02,4.77,0.92,4.93,0.91,5.06L0.89,5.92
|
||||
c0,0.14,0.09,0.3,0.21,0.37l0.37,0.2c0.13,0.06,0.26,0.22,0.3,0.35l0.17,0.44C2,7.41,2,7.62,1.96,7.75l-0.15,0.4
|
||||
C1.76,8.28,1.8,8.47,1.89,8.57l0.58,0.62c0.09,0.1,0.28,0.15,0.41,0.11L3.3,9.17c0.13-0.04,0.34-0.02,0.46,0.04l0.43,0.2
|
||||
C4.32,9.46,4.47,9.6,4.53,9.73l0.18,0.39c0.06,0.12,0.22,0.23,0.35,0.23l0.85,0.03c0.14,0,0.3-0.09,0.37-0.21l0.2-0.37
|
||||
c0.07-0.12,0.23-0.25,0.36-0.29l0.44-0.17c0.13-0.06,0.33-0.06,0.46-0.02l0.4,0.15c0.14,0.03,0.33,0,0.43-0.1l0.62-0.58
|
||||
C9.29,8.7,9.34,8.51,9.3,8.38L9.17,7.97C9.13,7.84,9.16,7.63,9.22,7.51l0.2-0.43C9.47,6.95,9.61,6.8,9.74,6.74l0.39-0.18
|
||||
c0.12-0.06,0.23-0.22,0.23-0.35l0.03-0.85c0-0.14-0.09-0.3-0.21-0.37l-0.37-0.2C9.67,4.71,9.54,4.55,9.49,4.42L9.33,3.98
|
||||
C9.27,3.85,9.26,3.64,9.31,3.52l0.15-0.4C9.5,2.99,9.47,2.8,9.37,2.7L8.79,2.08C8.7,1.98,8.51,1.93,8.38,1.97L7.97,2.09
|
||||
C7.84,2.13,7.63,2.11,7.51,2.05l-0.43-0.2C6.94,1.8,6.79,1.66,6.73,1.53L6.56,1.15C6.5,1.02,6.34,0.92,6.2,0.91L5.35,0.89
|
||||
c-0.14,0-0.3,0.09-0.37,0.21l-0.2,0.37C4.71,1.6,4.55,1.73,4.42,1.77L3.98,1.94C3.85,2,3.64,2,3.52,1.96l-0.4-0.15
|
||||
C2.99,1.76,2.8,1.8,2.7,1.89L2.08,2.48c-0.1,0.09-0.15,0.28-0.11,0.41L2.09,3.3c0.04,0.13,0.02,0.34-0.04,0.46L1.85,4.19z
|
||||
M6.75,3.15c1.37,0.62,1.98,2.23,1.36,3.6s-2.23,1.98-3.6,1.36C3.15,7.5,2.54,5.89,3.15,4.52S5.38,2.54,6.75,3.15z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M14.65,11.78c0.19-0.19,0.19-0.51,0-0.71l-2.72-2.72c-0.19-0.19-0.35-0.13-0.35,0.15v1.29
|
||||
c0,0.28-0.22,0.5-0.5,0.5H8.49c-0.28,0-0.5,0.23-0.5,0.5v1.29c0,0.28,0.22,0.5,0.5,0.5h2.58c0.28,0,0.5,0.23,0.5,0.5v1.29
|
||||
c0,0.28,0.16,0.34,0.35,0.15L14.65,11.78z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.3 KiB |
14
resources/icons/white/export_gcode.svg
Normal file
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="export_x5F_gcode">
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M5.02,7.17H9v3.08c0,2.6-1.23,3.72-4.05,3.72S1,12.85,1,10.29V5.54C1,3.12,2.09,2,4.95,2S9,3,9,5.54H6.88
|
||||
c0-1.11-0.28-1.66-1.92-1.66c-1.54,0-1.83,0.69-1.83,1.77v4.65c0,1.12,0.29,1.77,1.83,1.77s2.08-0.65,2.08-1.82V9.09H5.02V7.17z"
|
||||
/>
|
||||
</g>
|
||||
<path fill="#ED6B21" d="M14.65,8.35c0.19-0.19,0.19-0.51,0-0.71l-4.29-4.29C10.16,3.16,10,3.22,10,3.5v9
|
||||
c0,0.27,0.16,0.34,0.35,0.15L14.65,8.35z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 797 B |
15
resources/icons/white/export_plate.svg
Normal file
|
@ -0,0 +1,15 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#FFFFFF;}
|
||||
.st1{fill:#ED6B21;}
|
||||
</style>
|
||||
<g id="export_x5F_plater">
|
||||
<path class="st0" d="M13,2c0.5,0,1,0.4,1,1v10c0,0.5-0.4,1-1,1H3c-0.5,0-1-0.4-1-1V3c0-0.5,0.4-1,1-1H13 M13,1H3C1.9,1,1,1.9,1,3
|
||||
v10c0,1.1,0.9,2,2,2h10c1.1,0,2-0.9,2-2V3C15,1.9,14.1,1,13,1L13,1z"/>
|
||||
<path class="st1" d="M11.6,8.4c0.2-0.2,0.2-0.5,0-0.7L8.9,4.9C8.7,4.7,8.6,4.8,8.6,5.1v1.3c0,0.3-0.2,0.5-0.5,0.5H4.5
|
||||
C4.2,6.9,4,7.1,4,7.4v1.3C4,9,4.2,9.2,4.5,9.2h3.6c0.3,0,0.5,0.2,0.5,0.5V11c0,0.3,0.2,0.3,0.4,0.1L11.6,8.4z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 884 B |
12
resources/icons/white/export_plater.svg
Normal file
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="export_x5F_plater">
|
||||
<path fill="#FFFFFF" d="M13,2c0.55,0,1,0.45,1,1v10c0,0.55-0.45,1-1,1H3c-0.55,0-1-0.45-1-1V3c0-0.55,0.45-1,1-1H13 M13,1H3
|
||||
C1.9,1,1,1.89,1,3v10c0,1.1,0.89,2,2,2h10c1.1,0,2-0.89,2-2V3C15,1.89,14.11,1,13,1L13,1z"/>
|
||||
<path fill="#ED6B21" d="M11.65,8.35c0.19-0.19,0.19-0.51,0-0.71L8.92,4.92C8.73,4.73,8.57,4.8,8.57,5.07v1.29
|
||||
c0,0.28-0.22,0.5-0.5,0.5H4.5C4.22,6.86,4,7.08,4,7.36v1.29c0,0.27,0.22,0.5,0.5,0.5h3.57c0.28,0,0.5,0.22,0.5,0.5v1.29
|
||||
c0,0.27,0.16,0.34,0.35,0.15L11.65,8.35z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 862 B |
15
resources/icons/white/extruder+funnel.svg
Normal file
|
@ -0,0 +1,15 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="extruder_x2B_funnel">
|
||||
<rect x="1" y="1" display="none" fill="#808080" width="14" height="6"/>
|
||||
<line fill="none" stroke="#ED6B21" stroke-linecap="round" stroke-miterlimit="10" x1="8" y1="9.37" x2="8" y2="15"/>
|
||||
<polygon display="none" fill="#808080" points="5,7 5,8 8,10 11,8 11,7 "/>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M14,2v4h-3c-0.55,0-1,0.45-1,1v0.47L8,8.8L6,7.46V7c0-0.55-0.45-1-1-1H2V2H14 M14,1H2C1.45,1,1,1.45,1,2v4
|
||||
c0,0.55,0.45,1,1,1h3v1l2.45,1.63C7.61,9.74,7.81,9.8,8,9.8c0.19,0,0.39-0.06,0.55-0.17L11,8V7h3c0.55,0,1-0.45,1-1V2
|
||||
C15,1.45,14.55,1,14,1L14,1z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 935 B |
10
resources/icons/white/flag_green.svg
Normal file
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="flag_x5F_green">
|
||||
|
||||
<line fill="none" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" x1="14" y1="2" x2="14" y2="14"/>
|
||||
<path fill="#8CC63F" d="M13,2C8.2,2,5.8,4.4,1,4.4v7.2c4.8,0,7.2-2.4,12-2.4V2z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 591 B |
10
resources/icons/white/flag_red.svg
Normal file
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="flag_x5F_red">
|
||||
|
||||
<line fill="none" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" x1="14" y1="2" x2="14" y2="14"/>
|
||||
<path fill="#ED1C24" d="M13,2C8.2,2,5.8,4.4,1,4.4v7.2c4.8,0,7.2-2.4,12-2.4V2z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 589 B |
25
resources/icons/white/import_config.svg
Normal file
|
@ -0,0 +1,25 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="import_x5F_config">
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M14.22,6.61c-0.25-0.12-0.52-0.43-0.6-0.68s-0.32-1.09-0.23-1.35l0.12-0.35c0.09-0.26,0-0.63-0.2-0.83
|
||||
L12.6,2.7c-0.19-0.19-0.57-0.28-0.83-0.2l-0.35,0.12c-0.26,0.09-0.67,0.06-0.91-0.05s-1-0.54-1.12-0.79L9.22,1.45
|
||||
C9.1,1.2,8.77,1,8.5,1h-1C7.22,1,6.9,1.2,6.78,1.45L6.61,1.78C6.49,2.02,6.18,2.3,5.93,2.38S4.84,2.7,4.58,2.62L4.23,2.5
|
||||
C3.97,2.41,3.6,2.5,3.4,2.7L2.7,3.4C2.5,3.6,2.41,3.97,2.5,4.23l0.12,0.35C2.7,4.84,2.68,5.25,2.57,5.49s-0.54,1-0.79,1.12
|
||||
L1.45,6.78C1.2,6.9,1,7.22,1,7.5v1c0,0.27,0.2,0.6,0.45,0.72l0.33,0.17c0.25,0.12,0.52,0.43,0.6,0.68s0.32,1.09,0.23,1.35
|
||||
L2.5,11.77c-0.09,0.26,0,0.63,0.2,0.83l0.7,0.7c0.19,0.19,0.57,0.28,0.83,0.2l0.35-0.12c0.26-0.09,0.67-0.06,0.91,0.05
|
||||
s1,0.54,1.12,0.79l0.17,0.33C6.9,14.8,7.22,15,7.5,15h1c0.27,0,0.6-0.2,0.72-0.45l0.17-0.33c0.12-0.25,0.43-0.52,0.68-0.6
|
||||
s1.09-0.32,1.35-0.23l0.35,0.12c0.26,0.09,0.63,0,0.83-0.2l0.71-0.71c0.19-0.19,0.28-0.57,0.2-0.83l-0.12-0.35
|
||||
c-0.09-0.26-0.06-0.67,0.05-0.91s0.54-1,0.79-1.12l0.33-0.17C14.8,9.1,15,8.77,15,8.5v-1c0-0.28-0.2-0.6-0.45-0.72L14.22,6.61z
|
||||
M8,13c-2.76,0-5-2.24-5-5s2.24-5,5-5s5,2.24,5,5S10.76,13,8,13z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M8,12c-0.55,0-1-0.45-1-1V5c0-0.55,0.45-1,1-1s1,0.45,1,1v6C9,11.55,8.55,12,8,12z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M11,9H5C4.45,9,4,8.55,4,8s0.45-1,1-1h6c0.55,0,1,0.45,1,1S11.55,9,11,9z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.7 KiB |
61
resources/icons/white/import_config_bundle.svg
Normal file
|
@ -0,0 +1,61 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="import_x5F_config_x5F_bundle">
|
||||
<g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M1.2,12.61c0.11,0.08,0.21,0.22,0.23,0.31s0.04,0.43-0.03,0.55s-0.05,0.31,0.03,0.42l0.12,0.17
|
||||
c0.08,0.11,0.25,0.19,0.39,0.17c0.13-0.02,0.3,0.01,0.38,0.06s0.33,0.28,0.37,0.41s0.18,0.25,0.32,0.27l0.21,0.04
|
||||
c0.14,0.02,0.31-0.05,0.39-0.16s0.22-0.21,0.31-0.23c0.09-0.02,0.43-0.04,0.55,0.03c0.12,0.06,0.31,0.05,0.42-0.03l0.17-0.12
|
||||
c0.11-0.08,0.19-0.25,0.17-0.39c-0.02-0.13,0.01-0.3,0.06-0.38s0.28-0.33,0.41-0.37c0.13-0.04,0.25-0.18,0.27-0.32l0.04-0.21
|
||||
c0.02-0.14-0.05-0.31-0.16-0.39c-0.11-0.08-0.21-0.22-0.23-0.31s-0.04-0.43,0.03-0.55c0.06-0.12,0.05-0.31-0.03-0.42L5.5,10.98
|
||||
c-0.08-0.11-0.25-0.19-0.39-0.17c-0.13,0.02-0.3-0.01-0.38-0.06s-0.33-0.28-0.37-0.41s-0.18-0.25-0.32-0.27l-0.21-0.04
|
||||
c-0.14-0.02-0.31,0.05-0.39,0.16s-0.22,0.21-0.31,0.23S2.7,10.46,2.58,10.4c-0.12-0.06-0.31-0.05-0.42,0.03l-0.17,0.12
|
||||
c-0.11,0.08-0.19,0.25-0.17,0.39s-0.01,0.3-0.06,0.38s-0.28,0.33-0.41,0.37s-0.25,0.18-0.27,0.32l-0.04,0.21
|
||||
C1.02,12.36,1.09,12.53,1.2,12.61z M3.71,11.42c0.61,0.1,1.02,0.68,0.92,1.28c-0.1,0.61-0.68,1.02-1.28,0.92
|
||||
c-0.61-0.1-1.02-0.68-0.92-1.28C2.53,11.73,3.1,11.32,3.71,11.42z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M10.39,4.47c0.13,0.03,0.28,0.13,0.33,0.21s0.19,0.38,0.18,0.52s0.07,0.3,0.19,0.38l0.18,0.11
|
||||
c0.12,0.07,0.31,0.08,0.42,0.01c0.12-0.07,0.28-0.11,0.38-0.09c0.09,0.02,0.41,0.13,0.5,0.24c0.09,0.1,0.26,0.17,0.4,0.13
|
||||
l0.21-0.05c0.13-0.03,0.27-0.16,0.3-0.29s0.13-0.28,0.21-0.33c0.08-0.05,0.38-0.19,0.52-0.18c0.13,0.01,0.3-0.07,0.38-0.19
|
||||
l0.11-0.18c0.07-0.12,0.08-0.31,0.01-0.42c-0.07-0.12-0.11-0.28-0.09-0.38c0.02-0.09,0.13-0.41,0.24-0.5
|
||||
c0.1-0.09,0.17-0.26,0.13-0.4l-0.05-0.21c-0.03-0.13-0.16-0.27-0.29-0.3s-0.28-0.13-0.33-0.21s-0.19-0.38-0.18-0.52
|
||||
c0.01-0.13-0.07-0.3-0.19-0.38l-0.18-0.11c-0.12-0.07-0.31-0.08-0.42-0.01c-0.12,0.07-0.28,0.11-0.38,0.09
|
||||
c-0.09-0.02-0.41-0.13-0.5-0.24c-0.09-0.1-0.26-0.17-0.4-0.13l-0.2,0.06c-0.13,0.03-0.27,0.16-0.3,0.29s-0.13,0.28-0.21,0.33
|
||||
s-0.38,0.19-0.52,0.18s-0.3,0.07-0.38,0.19l-0.11,0.18c-0.07,0.12-0.08,0.31-0.01,0.42c0.07,0.12,0.11,0.28,0.09,0.38
|
||||
s-0.13,0.41-0.24,0.5c-0.1,0.09-0.17,0.26-0.13,0.4l0.05,0.21C10.13,4.3,10.26,4.44,10.39,4.47z M12.27,2.43
|
||||
c0.6-0.13,1.2,0.24,1.33,0.84s-0.24,1.2-0.84,1.33c-0.6,0.13-1.2-0.24-1.33-0.84S11.67,2.56,12.27,2.43z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M1.85,4.19C1.8,4.32,1.66,4.47,1.53,4.53L1.15,4.71C1.02,4.77,0.92,4.93,0.91,5.06L0.89,5.92
|
||||
c0,0.14,0.09,0.3,0.21,0.37l0.37,0.2c0.13,0.06,0.26,0.22,0.3,0.35l0.17,0.44C2,7.41,2,7.62,1.96,7.75l-0.15,0.4
|
||||
C1.76,8.28,1.8,8.47,1.89,8.57l0.58,0.62c0.09,0.1,0.28,0.15,0.41,0.11L3.3,9.17c0.13-0.04,0.34-0.02,0.46,0.04l0.43,0.2
|
||||
C4.32,9.46,4.47,9.6,4.53,9.73l0.18,0.39c0.06,0.12,0.22,0.23,0.35,0.23l0.85,0.03c0.14,0,0.3-0.09,0.37-0.21l0.2-0.37
|
||||
c0.07-0.12,0.23-0.25,0.36-0.29l0.44-0.17c0.13-0.06,0.33-0.06,0.46-0.02l0.4,0.15c0.14,0.03,0.33,0,0.43-0.1l0.62-0.58
|
||||
C9.29,8.7,9.34,8.51,9.3,8.38L9.17,7.97C9.13,7.84,9.16,7.63,9.22,7.51l0.2-0.43C9.47,6.95,9.61,6.8,9.74,6.74l0.39-0.18
|
||||
c0.12-0.06,0.23-0.22,0.23-0.35l0.03-0.85c0-0.14-0.09-0.3-0.21-0.37l-0.37-0.2C9.67,4.71,9.54,4.55,9.49,4.42L9.33,3.98
|
||||
C9.27,3.85,9.26,3.64,9.31,3.52l0.15-0.4C9.5,2.99,9.47,2.8,9.37,2.7L8.79,2.08C8.7,1.98,8.51,1.93,8.38,1.97L7.97,2.09
|
||||
C7.84,2.13,7.63,2.11,7.51,2.05l-0.43-0.2C6.94,1.8,6.79,1.66,6.73,1.53L6.56,1.15C6.5,1.02,6.34,0.92,6.2,0.91L5.35,0.89
|
||||
c-0.14,0-0.3,0.09-0.37,0.21l-0.2,0.37C4.71,1.6,4.55,1.73,4.42,1.77L3.98,1.94C3.85,2,3.64,2,3.52,1.96l-0.4-0.15
|
||||
C2.99,1.76,2.8,1.8,2.7,1.89L2.08,2.48c-0.1,0.09-0.15,0.28-0.11,0.41L2.09,3.3c0.04,0.13,0.02,0.34-0.04,0.46L1.85,4.19z
|
||||
M6.75,3.15c1.37,0.62,1.98,2.23,1.36,3.6s-2.23,1.98-3.6,1.36C3.15,7.5,2.54,5.89,3.15,4.52S5.38,2.54,6.75,3.15z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M11,15c-0.55,0-1-0.45-1-1V8c0-0.55,0.45-1,1-1s1,0.45,1,1v6C12,14.55,11.55,15,11,15z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M14,12H8c-0.55,0-1-0.45-1-1s0.45-1,1-1h6c0.55,0,1,0.45,1,1S14.55,12,14,12z"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.3 KiB |
38
resources/icons/white/import_plate.svg
Normal file
|
@ -0,0 +1,38 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
|
||||
<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
|
||||
<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
|
||||
<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
|
||||
<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
|
||||
<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
|
||||
<!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
|
||||
<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
|
||||
<!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
|
||||
]>
|
||||
<svg version="1.1" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
|
||||
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 16 16"
|
||||
style="enable-background:new 0 0 16 16;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#FFFFFF;}
|
||||
.st1{fill:#ED6B21;}
|
||||
</style>
|
||||
<metadata>
|
||||
<sfw xmlns="&ns_sfw;">
|
||||
<slices></slices>
|
||||
<sliceSourceBounds bottomLeftOrigin="true" height="14" width="14" x="1" y="1"></sliceSourceBounds>
|
||||
</sfw>
|
||||
</metadata>
|
||||
<g id="import_x5F_plater">
|
||||
<g>
|
||||
<path class="st0" d="M13,2c0.5,0,1,0.4,1,1v10c0,0.5-0.4,1-1,1H3c-0.5,0-1-0.4-1-1V3c0-0.5,0.4-1,1-1H13 M13,1H3C1.9,1,1,1.9,1,3
|
||||
v10c0,1.1,0.9,2,2,2h10c1.1,0,2-0.9,2-2V3C15,1.9,14.1,1,13,1L13,1z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st1" d="M8,12c-0.6,0-1-0.4-1-1V5c0-0.6,0.4-1,1-1s1,0.4,1,1v6C9,11.6,8.6,12,8,12z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st1" d="M11,9H5C4.4,9,4,8.6,4,8s0.4-1,1-1h6c0.6,0,1,0.4,1,1C12,8.6,11.6,9,11,9z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.7 KiB |
17
resources/icons/white/import_plater.svg
Normal file
|
@ -0,0 +1,17 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="import_x5F_plater">
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M13,2c0.55,0,1,0.45,1,1v10c0,0.55-0.45,1-1,1H3c-0.55,0-1-0.45-1-1V3c0-0.55,0.45-1,1-1H13 M13,1H3
|
||||
C1.9,1,1,1.89,1,3v10c0,1.1,0.89,2,2,2h10c1.1,0,2-0.89,2-2V3C15,1.89,14.11,1,13,1L13,1z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M8,12c-0.55,0-1-0.45-1-1V5c0-0.55,0.45-1,1-1s1,0.45,1,1v6C9,11.55,8.55,12,8,12z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M11,9H5C4.45,9,4,8.55,4,8s0.45-1,1-1h6c0.55,0,1,0.45,1,1S11.55,9,11,9z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 835 B |
35
resources/icons/white/infill.svg
Normal file
|
@ -0,0 +1,35 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="infill">
|
||||
<g>
|
||||
<g>
|
||||
<defs>
|
||||
<polygon id="SVGID_1_" points="8,1.03 2,5.03 2,7.03 2,11.03 8,15.03 14,11.03 14,7.03 14,5.03 "/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_2_">
|
||||
<use xlink:href="#SVGID_1_" overflow="visible"/>
|
||||
</clipPath>
|
||||
<g clip-path="url(#SVGID_2_)">
|
||||
|
||||
<line fill="none" stroke="#ED6B21" stroke-width="0.7" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="2.32" y1="11.59" x2="8.56" y2="1.34"/>
|
||||
|
||||
<line fill="none" stroke="#ED6B21" stroke-width="0.7" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="4.88" y1="13.15" x2="11.12" y2="2.9"/>
|
||||
|
||||
<line fill="none" stroke="#ED6B21" stroke-width="0.7" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="7.44" y1="14.71" x2="13.68" y2="4.46"/>
|
||||
|
||||
<line fill="none" stroke="#ED6B21" stroke-width="0.7" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="4.44" y1="2.34" x2="14.68" y2="8.59"/>
|
||||
|
||||
<line fill="none" stroke="#ED6B21" stroke-width="0.7" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="2.88" y1="4.91" x2="13.12" y2="11.15"/>
|
||||
|
||||
<line fill="none" stroke="#ED6B21" stroke-width="0.7" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="1.32" y1="7.47" x2="11.56" y2="13.71"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M8,2.23l5,3.33v1.46v3.46l-5,3.33l-5-3.33V7.03V5.56L8,2.23 M8,1.03l-6,4v2v4l6,4l6-4v-4v-2L8,1.03L8,1.03
|
||||
z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
27
resources/icons/white/layers.svg
Normal file
|
@ -0,0 +1,27 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="layers">
|
||||
<g>
|
||||
<g>
|
||||
<rect x="1" y="13" fill="#FFFFFF" width="14" height="2"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect x="1" y="10.6" fill="#FFFFFF" width="14" height="1.74"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect x="1" y="8.19" fill="#FFFFFF" width="14" height="1.47"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect x="1" y="5.79" fill="#ED6B21" width="14" height="1.2"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect x="1" y="3.39" fill="#ED6B21" width="14" height="0.93"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect x="1" y="0.99" fill="#FFFFFF" width="14" height="0.67"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 845 B |
10
resources/icons/white/lock2_closed.svg
Normal file
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="lock2_x5F_closed">
|
||||
<path fill="none" stroke="#FFFFFF" stroke-width="2" stroke-miterlimit="10" d="M4,8V4c0,0,0-2,2-2c1,0,3,0,4,0c2,0,2,2,2,2v4"/>
|
||||
<path fill="#FFFFFF" d="M13,8H3C2.45,8,2,8.45,2,9v5c0,0.55,0.45,1,1,1h10c0.55,0,1-0.45,1-1V9C14,8.45,13.55,8,13,8z M10,12H8.91
|
||||
c-0.21,0.58-0.76,1-1.41,1C6.67,13,6,12.33,6,11.5S6.67,10,7.5,10c0.65,0,1.2,0.42,1.41,1H10V12z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 730 B |
10
resources/icons/white/lock_closed.svg
Normal file
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="lock_x5F_closed">
|
||||
<path fill="none" stroke="#FFFFFF" stroke-width="2" stroke-miterlimit="10" d="M4,8V4c0,0,0-2,2-2c1,0,3,0,4,0c2,0,2,2,2,2v4"/>
|
||||
<path fill="#FFFFFF" d="M13,8H3C2.45,8,2,8.45,2,9v5c0,0.55,0.45,1,1,1h10c0.55,0,1-0.45,1-1V9C14,8.45,13.55,8,13,8z M10,12H8.91
|
||||
c-0.21,0.58-0.76,1-1.41,1C6.67,13,6,12.33,6,11.5S6.67,10,7.5,10c0.65,0,1.2,0.42,1.41,1H10V12z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 729 B |
30
resources/icons/white/machine+cog.svg
Normal file
|
@ -0,0 +1,30 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="machine_x2B_cog">
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M14.22,6.61c-0.25-0.12-0.52-0.43-0.6-0.68s-0.32-1.09-0.23-1.35l0.12-0.35c0.09-0.26,0-0.63-0.2-0.83
|
||||
L12.6,2.7c-0.19-0.19-0.57-0.28-0.83-0.2l-0.35,0.12c-0.26,0.09-0.67,0.06-0.91-0.05s-1-0.54-1.12-0.79L9.22,1.45
|
||||
C9.1,1.2,8.77,1,8.5,1h-1C7.22,1,6.9,1.2,6.78,1.45L6.61,1.78C6.49,2.02,6.18,2.3,5.93,2.38S4.84,2.7,4.58,2.62L4.23,2.5
|
||||
C3.97,2.41,3.6,2.5,3.4,2.7L2.7,3.4C2.5,3.6,2.41,3.97,2.5,4.23l0.12,0.35C2.7,4.84,2.68,5.25,2.57,5.49s-0.54,1-0.79,1.12
|
||||
L1.45,6.78C1.2,6.9,1,7.22,1,7.5v1c0,0.27,0.2,0.6,0.45,0.72l0.33,0.17c0.25,0.12,0.52,0.43,0.6,0.68s0.32,1.09,0.23,1.35
|
||||
L2.5,11.77c-0.09,0.26,0,0.63,0.2,0.83l0.7,0.7c0.19,0.19,0.57,0.28,0.83,0.2l0.35-0.12c0.26-0.09,0.67-0.06,0.91,0.05
|
||||
s1,0.54,1.12,0.79l0.17,0.33C6.9,14.8,7.22,15,7.5,15h1c0.27,0,0.6-0.2,0.72-0.45l0.17-0.33c0.12-0.25,0.43-0.52,0.68-0.6
|
||||
s1.09-0.32,1.35-0.23l0.35,0.12c0.26,0.09,0.63,0,0.83-0.2l0.71-0.71c0.19-0.19,0.28-0.57,0.2-0.83l-0.12-0.35
|
||||
c-0.09-0.26-0.06-0.67,0.05-0.91s0.54-1,0.79-1.12l0.33-0.17C14.8,9.1,15,8.77,15,8.5v-1c0-0.28-0.2-0.6-0.45-0.72L14.22,6.61z
|
||||
M8,13c-2.76,0-5-2.24-5-5s2.24-5,5-5s5,2.24,5,5S10.76,13,8,13z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M11.65,7.25c-0.19-0.1-0.39-0.29-0.44-0.44s-0.17-0.67-0.1-0.87s-0.04-0.53-0.23-0.72l-0.1-0.1
|
||||
c-0.19-0.19-0.52-0.3-0.72-0.23s-0.48,0.07-0.62,0C9.3,4.83,8.84,4.54,8.75,4.35C8.65,4.16,8.35,4,8.07,4H7.93
|
||||
C7.65,4,7.35,4.16,7.25,4.35S6.96,4.74,6.81,4.79s-0.67,0.17-0.87,0.1S5.42,4.93,5.22,5.12l-0.1,0.1
|
||||
c-0.19,0.19-0.3,0.52-0.23,0.72s0.07,0.48,0,0.62C4.83,6.7,4.54,7.16,4.35,7.25C4.16,7.35,4,7.65,4,7.93v0.14
|
||||
c0,0.28,0.16,0.58,0.35,0.68s0.39,0.29,0.44,0.44c0.05,0.14,0.17,0.67,0.1,0.87s0.04,0.53,0.23,0.72l0.1,0.1
|
||||
c0.19,0.19,0.52,0.3,0.72,0.23s0.48-0.07,0.62,0s0.59,0.35,0.69,0.54C7.35,11.84,7.65,12,7.93,12h0.14c0.28,0,0.58-0.16,0.68-0.35
|
||||
c0.1-0.19,0.29-0.39,0.44-0.44c0.14-0.05,0.67-0.17,0.87-0.1s0.53-0.04,0.72-0.23l0.1-0.1c0.19-0.19,0.3-0.52,0.23-0.72
|
||||
s-0.07-0.48,0-0.62s0.35-0.59,0.54-0.69C11.84,8.65,12,8.35,12,8.07V7.93C12,7.65,11.84,7.35,11.65,7.25z M8,10.86
|
||||
c-1.58,0-2.86-1.28-2.86-2.86S6.42,5.14,8,5.14S10.86,6.42,10.86,8S9.58,10.86,8,10.86z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
25
resources/icons/white/notes.svg
Normal file
|
@ -0,0 +1,25 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="notes">
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M11,2v12H2V2H11 M11,1H2C1.45,1,1,1.45,1,2v12c0,0.55,0.45,1,1,1h9c0.55,0,1-0.45,1-1V2
|
||||
C12,1.45,11.55,1,11,1L11,1z"/>
|
||||
</g>
|
||||
<path fill="#ED6B21" d="M14,3L14,3c-0.55,0-1,0.45-1,1v10c0,0.55,0.45,1,1,1l0,0c0.55,0,1-0.45,1-1V4C15,3.45,14.55,3,14,3z"/>
|
||||
<polygon fill="#ED6B21" points="15,4 13,4 14,1 "/>
|
||||
<g>
|
||||
<line fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-miterlimit="10" x1="3" y1="4" x2="10" y2="4"/>
|
||||
</g>
|
||||
<g>
|
||||
<line fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-miterlimit="10" x1="3" y1="6" x2="10" y2="6"/>
|
||||
</g>
|
||||
<g>
|
||||
<line fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-miterlimit="10" x1="3" y1="8" x2="10" y2="8"/>
|
||||
</g>
|
||||
<g>
|
||||
<line fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-miterlimit="10" x1="3" y1="10" x2="7" y2="10"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
29
resources/icons/white/number_of_copies.svg
Normal file
|
@ -0,0 +1,29 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="number_x5F_of_x5F_copies">
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M13,2c0.55,0,1,0.45,1,1v10c0,0.55-0.45,1-1,1H3c-0.55,0-1-0.45-1-1V3c0-0.55,0.45-1,1-1H13 M13,1H3
|
||||
C1.9,1,1,1.89,1,3v10c0,1.1,0.89,2,2,2h10c1.1,0,2-0.89,2-2V3C15,1.89,14.11,1,13,1L13,1z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M6,4.5H4C3.72,4.5,3.5,4.28,3.5,4S3.72,3.5,4,3.5h2c0.28,0,0.5,0.22,0.5,0.5S6.28,4.5,6,4.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M12,8.5H8C7.72,8.5,7.5,8.28,7.5,8S7.72,7.5,8,7.5h4c0.28,0,0.5,0.22,0.5,0.5C12.5,8.28,12.28,8.5,12,8.5z
|
||||
"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M6,12.5H4c-0.28,0-0.5-0.22-0.5-0.5s0.22-0.5,0.5-0.5h2c0.28,0,0.5,0.22,0.5,0.5S6.28,12.5,6,12.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M5,12.5c-0.28,0-0.5-0.22-0.5-0.5V4c0-0.28,0.22-0.5,0.5-0.5S5.5,3.72,5.5,4v8C5.5,12.28,5.28,12.5,5,12.5
|
||||
z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M10,10.5c-0.28,0-0.5-0.22-0.5-0.5V6c0-0.28,0.22-0.5,0.5-0.5s0.5,0.22,0.5,0.5v4
|
||||
C10.5,10.28,10.28,10.5,10,10.5z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
11
resources/icons/white/open.svg
Normal file
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="open">
|
||||
<path fill="#FFFFFF" d="M1.22,14V3c0,0,0-1,1-1s4,0,5,0s1,2,2,2s4,0,4,0s1,0,1,1v2h-1c0,0,0,0,0-1s-1-1-1-1h-3.5c-1,0-1-2-2-2
|
||||
s-3.5,0-3.5,0c-1,0-1,1-1,1v9v1h1v1c0,0,0,0-1,0S1.22,14,1.22,14z"/>
|
||||
<path fill="#ED6B21" d="M5,6C4.45,6,3.86,6.43,3.68,6.95l-2.37,7.1C1.14,14.57,1.45,15,2,15h10c0.55,0,1.14-0.43,1.32-0.95
|
||||
l2.37-7.1C15.86,6.43,15.55,6,15,6H5z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 720 B |
20
resources/icons/white/output+page_white.svg
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="output_x2B_page_x5F_white">
|
||||
<path fill="#FFFFFF" d="M14.5,10c-0.27,0-0.5,0.23-0.5,0.5v3c0,0.27-0.23,0.5-0.5,0.5h-11C2.22,14,2,13.77,2,13.5v-11
|
||||
C2,2.22,2.22,2,2.5,2h11C13.77,2,14,2.22,14,2.5v3C14,5.78,14.23,6,14.5,6l0,0C14.77,6,15,5.78,15,5.5v-4C15,1.23,14.77,1,14.5,1
|
||||
h-13C1.23,1,1,1.23,1,1.5v13C1,14.77,1.23,15,1.5,15h13c0.27,0,0.5-0.23,0.5-0.5v-4C15,10.23,14.77,10,14.5,10L14.5,10z"/>
|
||||
<path fill="#FFFFFF" d="M11,10.5c0-0.27-0.01-0.5-0.02-0.5s-0.17,0.17-0.36,0.37c0,0-0.61,0.67-1.3,0.95
|
||||
c-1.83,0.73-3.91-0.16-4.64-1.99s0.16-3.91,1.99-4.64c1.59-0.64,3.88,1.02,3.88,1.02C10.77,5.87,10.97,6,10.98,6S11,5.78,11,5.5
|
||||
V5.49c0-0.28-0.04-0.55-0.1-0.62s-0.23-0.43-0.25-0.7s-0.24-0.58-0.49-0.68L9.77,3.32C9.52,3.21,9.15,3.26,8.94,3.44
|
||||
s-0.53,0.3-0.71,0.29S7.37,3.6,7.17,3.42S6.6,3.18,6.34,3.28l-0.4,0.16c-0.26,0.1-0.48,0.41-0.5,0.67S5.28,4.7,5.14,4.82
|
||||
s-0.69,0.5-0.96,0.52S3.6,5.58,3.49,5.83l-0.17,0.4C3.21,6.48,3.26,6.85,3.44,7.06s0.3,0.53,0.29,0.71S3.6,8.63,3.42,8.83
|
||||
S3.18,9.4,3.28,9.66l0.16,0.4c0.1,0.26,0.41,0.48,0.67,0.5s0.59,0.16,0.71,0.3s0.5,0.69,0.52,0.96s0.24,0.58,0.49,0.68l0.39,0.17
|
||||
c0.25,0.11,0.63,0.05,0.83-0.12s0.53-0.3,0.71-0.29s0.85,0.13,1.05,0.31s0.57,0.24,0.83,0.14l0.4-0.16c0.26-0.1,0.48-0.41,0.5-0.67
|
||||
s0.1-0.55,0.17-0.62S11,10.79,11,10.51V10.5z"/>
|
||||
<path fill="#ED6B21" d="M14.65,8.35c0.19-0.19,0.19-0.51,0-0.71l-2.29-2.29C12.16,5.16,12,5.22,12,5.5v1C12,6.78,11.77,7,11.5,7h-3
|
||||
C8.23,7,8,7.22,8,7.5v1C8,8.77,8.23,9,8.5,9h3C11.77,9,12,9.23,12,9.5v1c0,0.27,0.16,0.34,0.35,0.15L14.65,8.35z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
83
resources/icons/white/pad.svg
Normal file
|
@ -0,0 +1,83 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="pad">
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M14,14H2c-0.55,0-1-0.45-1-1s0.45-1,1-1h12c0.55,0,1,0.45,1,1S14.55,14,14,14z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M8,8.17c-0.4,0-0.8-0.1-1.11-0.31L2.55,4.97C1.95,4.57,1.5,3.72,1.5,3V2c0-0.28,0.22-0.5,0.5-0.5
|
||||
S2.5,1.72,2.5,2v1c0,0.38,0.29,0.93,0.61,1.14l4.34,2.89c0.29,0.19,0.82,0.19,1.11,0l4.34-2.89c0.31-0.21,0.6-0.76,0.6-1.14V2
|
||||
c0-0.28,0.22-0.5,0.5-0.5s0.5,0.22,0.5,0.5v1c0,0.72-0.45,1.57-1.05,1.97L9.11,7.86C8.8,8.07,8.4,8.17,8,8.17z"/>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M13,11.38c-0.21,0-0.38-0.17-0.38-0.38V7c0-0.21,0.17-0.38,0.38-0.38S13.38,6.79,13.38,7v4
|
||||
C13.38,11.21,13.21,11.38,13,11.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
|
||||
<path fill="#FFFFFF" stroke="#808080" stroke-width="0.75" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M12,7.49"/>
|
||||
</g>
|
||||
<g>
|
||||
|
||||
<path fill="#FFFFFF" stroke="#808080" stroke-width="0.75" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M12,11"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M11,11.38c-0.21,0-0.38-0.17-0.38-0.38V8.12c0-0.21,0.17-0.38,0.38-0.38s0.38,0.17,0.38,0.38V11
|
||||
C11.38,11.21,11.21,11.38,11,11.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
|
||||
<path fill="#FFFFFF" stroke="#808080" stroke-width="0.75" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M10,8.79"/>
|
||||
</g>
|
||||
<g>
|
||||
|
||||
<path fill="#FFFFFF" stroke="#808080" stroke-width="0.75" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M10,11"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M9,11.38c-0.21,0-0.38-0.17-0.38-0.38V9.5c0-0.21,0.17-0.38,0.38-0.38S9.38,9.29,9.38,9.5V11
|
||||
C9.38,11.21,9.21,11.38,9,11.38z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M3,11.38c-0.21,0-0.38-0.17-0.38-0.38V7c0-0.21,0.17-0.38,0.38-0.38S3.37,6.79,3.37,7v4
|
||||
C3.37,11.21,3.2,11.38,3,11.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
|
||||
<path fill="#FFFFFF" stroke="#808080" stroke-width="0.75" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M4,7.49"/>
|
||||
</g>
|
||||
<g>
|
||||
|
||||
<path fill="#FFFFFF" stroke="#808080" stroke-width="0.75" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M4,11"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M5,11.38c-0.21,0-0.38-0.17-0.38-0.38V8.12c0-0.21,0.17-0.38,0.38-0.38s0.38,0.17,0.38,0.38V11
|
||||
C5.37,11.21,5.2,11.38,5,11.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
|
||||
<path fill="#FFFFFF" stroke="#808080" stroke-width="0.75" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M6,8.79"/>
|
||||
</g>
|
||||
<g>
|
||||
|
||||
<path fill="#FFFFFF" stroke="#808080" stroke-width="0.75" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M6,11"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M7,11.38c-0.21,0-0.38-0.17-0.38-0.38V9.5c0-0.21,0.17-0.38,0.38-0.38S7.37,9.29,7.37,9.5V11
|
||||
C7.37,11.21,7.2,11.38,7,11.38z"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.1 KiB |
27
resources/icons/white/paste_menu.svg
Normal file
|
@ -0,0 +1,27 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
|
||||
<g id="paste">
|
||||
<path fill="#ffffff" d="M33.73,107.03H15.94c-1.4,0-2.54-1.14-2.54-2.54V23.52c0-1.4,1.14-2.54,2.54-2.54h7.62v5.08
|
||||
c0,1.4,1.14,2.54,2.54,2.54h45.72c1.4,0,2.54-1.14,2.54-2.54v-5.08h7.62c1.4,0,2.54,1.14,2.54,2.54v10.16
|
||||
c0,1.4,1.14,2.54,2.54,2.54c1.4,0,2.54-1.14,2.54-2.54V23.52c0-4.2-3.42-7.62-7.62-7.62h-7.62v-5.08c0-1.4-1.14-2.54-2.54-2.54
|
||||
H26.11c-1.4,0-2.54,1.14-2.54,2.54v5.08h-7.62c-4.2,0-7.62,3.42-7.62,7.62v80.97c0,4.2,3.42,7.62,7.62,7.62h17.78
|
||||
c1.4,0,2.54-1.14,2.54-2.54C36.27,108.16,35.13,107.03,33.73,107.03z M28.65,13.36h40.64v10.16H28.65V13.36z"/>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M53.97,59.08h35.72c1.4,0,2.54-1.14,2.54-2.54c0-1.4-1.14-2.54-2.54-2.54H53.97
|
||||
c-1.4,0-2.54,1.14-2.54,2.54C51.43,57.94,52.56,59.08,53.97,59.08z"/>
|
||||
<path fill="#ED6B21" d="M104.93,69.24H53.97c-1.4,0-2.54,1.14-2.54,2.54c0,1.4,1.14,2.54,2.54,2.54h50.96
|
||||
c1.4,0,2.54-1.14,2.54-2.54C107.47,70.38,106.33,69.24,104.93,69.24z"/>
|
||||
<path fill="#ED6B21" d="M104.93,99.72H53.97c-1.4,0-2.54,1.14-2.54,2.54s1.14,2.54,2.54,2.54h50.96c1.4,0,2.54-1.14,2.54-2.54
|
||||
S106.33,99.72,104.93,99.72z"/>
|
||||
<path fill="#ED6B21" d="M115.75,51.15l-8.06-8.06c-2.47-2.47-6.97-4.34-10.47-4.34h-50.8c-4.2,0-7.62,3.42-7.62,7.62v66.04
|
||||
c0,4.2,3.42,7.62,7.62,7.62h66.04c4.2,0,7.62-3.42,7.62-7.62v-50.8C120.09,58.12,118.23,53.62,115.75,51.15z M104.85,47.43
|
||||
l6.57,6.57h-6.57V47.43z M115.01,112.42c0,1.4-1.14,2.54-2.54,2.54H46.43c-1.4,0-2.54-1.14-2.54-2.54V46.38
|
||||
c0-1.4,1.14-2.54,2.54-2.54h50.8c0.74,0,1.63,0.18,2.54,0.46v12.24c0,1.4,1.14,2.54,2.54,2.54h12.24c0.28,0.91,0.46,1.8,0.46,2.54
|
||||
V112.42z"/>
|
||||
<path fill="#ED6B21" d="M104.93,84.48H53.97c-1.4,0-2.54,1.14-2.54,2.54c0,1.4,1.14,2.54,2.54,2.54h50.96
|
||||
c1.4,0,2.54-1.14,2.54-2.54C107.47,85.62,106.33,84.48,104.93,84.48z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.1 KiB |
12
resources/icons/white/plater.svg
Normal file
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="plater">
|
||||
<path fill="#FFFFFF" d="M13,2c0.55,0,1,0.45,1,1v10c0,0.55-0.45,1-1,1H3c-0.55,0-1-0.45-1-1V3c0-0.55,0.45-1,1-1H13 M13,1H3
|
||||
C1.9,1,1,1.89,1,3v10c0,1.1,0.89,2,2,2h10c1.1,0,2-0.89,2-2V3C15,1.89,14.11,1,13,1L13,1z"/>
|
||||
<path fill="#ED6B21" d="M8.42,3.28c-0.23-0.15-0.6-0.15-0.83,0l-3.46,2.3C3.9,5.73,3.71,6.08,3.71,6.36v1.85c0,0.28,0,0.54,0,0.58
|
||||
s0,0.31,0,0.58v0.27c0,0.27,0.19,0.62,0.42,0.78l3.46,2.3c0.23,0.15,0.6,0.15,0.83,0l3.46-2.3c0.23-0.15,0.42-0.5,0.42-0.78V9.38
|
||||
c0-0.28,0-0.54,0-0.58s0-0.31,0-0.58V6.36c0-0.28-0.19-0.62-0.42-0.78L8.42,3.28z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 919 B |
48
resources/icons/white/preview_menu.svg
Normal file
|
@ -0,0 +1,48 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
|
||||
<g id="preview">
|
||||
<g>
|
||||
<path fill="#ffffff" d="M90.72,121.38H8.12c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h81.99l28.72-28.15
|
||||
c0.59-0.58,1.54-0.57,2.12,0.02c0.58,0.59,0.57,1.54-0.02,2.12l-29.16,28.57C91.49,121.23,91.11,121.38,90.72,121.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ffffff" d="M90.72,111.38H8.12c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h81.99l28.72-28.14
|
||||
c0.59-0.58,1.54-0.57,2.12,0.02c0.58,0.59,0.57,1.54-0.02,2.12l-29.16,28.57C91.49,111.23,91.11,111.38,90.72,111.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ffffff" d="M90.72,101.38H8.12c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h81.99l28.72-28.14
|
||||
c0.59-0.58,1.54-0.57,2.12,0.02s0.57,1.54-0.02,2.12l-29.16,28.57C91.49,101.23,91.11,101.38,90.72,101.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ffffff" d="M90.72,91.38H8.12c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h81.99l28.72-28.15
|
||||
c0.59-0.58,1.54-0.57,2.12,0.02s0.57,1.54-0.02,2.12L91.77,90.95C91.49,91.23,91.11,91.38,90.72,91.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ffffff" d="M90.72,81.38H8.12c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h81.99l28.72-28.15
|
||||
c0.59-0.58,1.54-0.57,2.12,0.02c0.58,0.59,0.57,1.54-0.02,2.12L91.77,80.95C91.49,81.23,91.11,81.38,90.72,81.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ffffff" d="M90.72,71.38H8.12c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h81.99l28.72-28.15
|
||||
c0.59-0.58,1.54-0.57,2.12,0.02c0.58,0.59,0.57,1.54-0.02,2.12L91.77,70.95C91.49,71.23,91.11,71.38,90.72,71.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M90.72,61.38H8.12c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h81.99l28.72-28.15
|
||||
c0.59-0.58,1.54-0.57,2.12,0.02c0.58,0.59,0.57,1.54-0.02,2.12L91.77,60.95C91.49,61.23,91.11,61.38,90.72,61.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ffffff" d="M90.72,51.38H8.12c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h81.99l28.72-28.15
|
||||
c0.59-0.58,1.54-0.57,2.12,0.02s0.57,1.54-0.02,2.12L91.77,50.95C91.49,51.23,91.11,51.38,90.72,51.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<path fill="#ffffff" d="M88.72,41.38H9.18c-1.68,0-2.22-0.95-2.37-1.36s-0.37-1.48,0.89-2.59L38.43,10.5
|
||||
c1.1-0.96,3.03-1.69,4.49-1.69h75.85c1.65,0,2.22,0.94,2.38,1.34s0.42,1.47-0.75,2.63c0,0,0,0,0,0L93.2,39.55
|
||||
C92.14,40.59,90.21,41.38,88.72,41.38z M11.17,38.38h77.55c0.71,0,1.87-0.47,2.37-0.97l26.01-25.6H42.92
|
||||
c-0.74,0-1.96,0.46-2.51,0.95L11.17,38.38z M118.89,11.82C118.89,11.82,118.89,11.82,118.89,11.82
|
||||
C118.89,11.82,118.89,11.82,118.89,11.82z M119.34,11.71L119.34,11.71L119.34,11.71z"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.7 KiB |
14
resources/icons/white/printer.svg
Normal file
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="printer">
|
||||
<rect x="1" y="1" fill="#FFFFFF" width="1" height="14"/>
|
||||
<rect x="14" y="1" fill="#FFFFFF" width="1" height="14"/>
|
||||
<rect x="1" y="5" fill="#FFFFFF" width="14" height="1"/>
|
||||
<rect x="1" y="1" fill="#FFFFFF" width="14" height="1"/>
|
||||
<rect x="1" y="13" fill="#FFFFFF" width="14" height="2"/>
|
||||
<rect x="3" y="4" fill="#ED6B21" width="4" height="4"/>
|
||||
<polygon fill="#ED6B21" points="5,9 4,8 6,8 "/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 766 B |
19
resources/icons/white/re_slice.svg
Normal file
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="slice">
|
||||
<path fill="#FFFFFF" d="M14.22,6.61c-0.25-0.12-0.52-0.43-0.6-0.68s-0.32-1.09-0.23-1.35l0.12-0.35c0.09-0.26,0-0.63-0.2-0.83
|
||||
L12.6,2.7c-0.19-0.19-0.57-0.28-0.83-0.2l-0.35,0.12c-0.26,0.09-0.67,0.06-0.91-0.05s-1-0.54-1.12-0.79L9.22,1.45
|
||||
C9.1,1.2,8.77,1,8.5,1h-1C7.22,1,6.9,1.2,6.78,1.45L6.61,1.78C6.49,2.02,6.18,2.3,5.93,2.38S4.84,2.7,4.58,2.62L4.23,2.5
|
||||
C3.97,2.41,3.6,2.5,3.4,2.7L2.7,3.4C2.5,3.6,2.41,3.97,2.5,4.23l0.12,0.35C2.7,4.84,2.68,5.25,2.57,5.49s-0.54,1-0.79,1.12
|
||||
L1.45,6.78C1.2,6.9,1,7.22,1,7.5v1c0,0.27,0.2,0.6,0.45,0.72l0.33,0.17c0.25,0.12,0.52,0.43,0.6,0.68s0.32,1.09,0.23,1.35
|
||||
L2.5,11.77c-0.09,0.26,0,0.63,0.2,0.83l0.7,0.7c0.19,0.19,0.57,0.28,0.83,0.2l0.35-0.12c0.26-0.09,0.67-0.06,0.91,0.05
|
||||
s1,0.54,1.12,0.79l0.17,0.33C6.9,14.8,7.22,15,7.5,15h1c0.27,0,0.6-0.2,0.72-0.45l0.17-0.33c0.12-0.25,0.43-0.52,0.68-0.6
|
||||
s1.09-0.32,1.35-0.23l0.35,0.12c0.26,0.09,0.63,0,0.83-0.2l0.71-0.71c0.19-0.19,0.28-0.57,0.2-0.83l-0.12-0.35
|
||||
c-0.09-0.26-0.06-0.67,0.05-0.91s0.54-1,0.79-1.12l0.33-0.17C14.8,9.1,15,8.77,15,8.5v-1c0-0.28-0.2-0.6-0.45-0.72L14.22,6.61z
|
||||
M8,13c-2.76,0-5-2.24-5-5s2.24-5,5-5s5,2.24,5,5S10.76,13,8,13z"/>
|
||||
<path fill="#ED6B21" d="M6.86,5.51C6.39,5.23,6,5.45,6,6v4c0,0.55,0.39,0.77,0.86,0.49l3.29-1.97c0.47-0.28,0.47-0.75,0-1.03
|
||||
L6.86,5.51z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
15
resources/icons/white/remove_copies.svg
Normal file
|
@ -0,0 +1,15 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="remove_x5F_copies">
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M8,2c3.31,0,6,2.69,6,6s-2.69,6-6,6s-6-2.69-6-6S4.69,2,8,2 M8,1C4.13,1,1,4.13,1,8s3.13,7,7,7s7-3.13,7-7
|
||||
S11.87,1,8,1L8,1z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M12,8.75H4C3.59,8.75,3.25,8.41,3.25,8S3.59,7.25,4,7.25h8c0.41,0,0.75,0.34,0.75,0.75S12.41,8.75,12,8.75
|
||||
z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 689 B |
44
resources/icons/white/remove_menu.svg
Normal file
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
|
||||
<path fill="#ffffff" d="M38.11,44.25H25.75c-0.95,0-1.72,0.77-1.72,1.72s0.77,1.72,1.72,1.72H38.1c0.95,0,1.72-0.77,1.72-1.72
|
||||
C39.83,45.02,39.06,44.25,38.11,44.25z M45.89,45.97c0,0.95,0.77,1.72,1.72,1.72h12.35c0.95,0,1.72-0.77,1.72-1.72
|
||||
s-0.77-1.72-1.72-1.72H47.61C46.66,44.25,45.89,45.02,45.89,45.97z M68.11,43.6c-0.33,0.28-0.52,0.65-0.59,1.04
|
||||
c-0.59,0.27-1,0.87-1,1.56v5.6c0,0.95,0.77,1.72,1.72,1.72c0.95,0,1.72-0.77,1.72-1.72v-5.34c0.12-0.06,0.24-0.13,0.35-0.22
|
||||
c0.13-0.11,0.25-0.23,0.36-0.34l8.27-8.77c0.65-0.69,0.62-1.78-0.07-2.43s-1.78-0.62-2.43,0.07l-8.27,8.78
|
||||
C68.16,43.56,68.14,43.58,68.11,43.6z M68.25,76.84c-0.95,0-1.72,0.77-1.72,1.72V89.1c0,0.95,0.77,1.72,1.72,1.72
|
||||
c0.95,0,1.72-0.77,1.72-1.72V78.56C69.97,77.61,69.2,76.84,68.25,76.84z M69.97,59.91c0-0.95-0.77-1.72-1.72-1.72
|
||||
c-0.95,0-1.72,0.77-1.72,1.72v10.54c0,0.95,0.77,1.72,1.72,1.72c0.95,0,1.72-0.77,1.72-1.72V59.91z M88.92,56.35
|
||||
c-0.95,0-1.72,0.77-1.72,1.72v3.4c0,0.34-0.02,0.63-0.04,0.85c-0.51,0.55-0.62,1.38-0.22,2.06c0.32,0.54,0.89,0.84,1.48,0.84
|
||||
c0.3,0,0.6-0.08,0.88-0.24l0.25-0.15c0.67-0.4,1.09-1.1,1.09-3.35v-3.4C90.64,57.12,89.87,56.35,88.92,56.35z M41.81,26.17h11.3
|
||||
c0.95,0,1.72-0.77,1.72-1.72s-0.77-1.72-1.72-1.72h-11.3c-0.95,0-1.72,0.77-1.72,1.72S40.86,26.17,41.81,26.17z M87.2,22.73h-5.39
|
||||
c-0.95,0-1.72,0.77-1.72,1.72s0.77,1.72,1.72,1.72h2.75l-1.58,1.68c-0.65,0.69-0.62,1.78,0.07,2.43c0.33,0.31,0.76,0.47,1.18,0.47
|
||||
c0.46,0,0.91-0.18,1.25-0.54l1.72-1.82v0.99c0,0.95,0.77,1.72,1.72,1.72c0.95,0,1.72-0.77,1.72-1.72v-3.21
|
||||
C90.64,24.27,89.09,22.73,87.2,22.73z M61.81,26.17h11.3c0.95,0,1.72-0.77,1.72-1.72s-0.77-1.72-1.72-1.72h-11.3
|
||||
c-0.95,0-1.72,0.77-1.72,1.72S60.86,26.17,61.81,26.17z M9.71,67.54c0.95,0,1.72-0.77,1.72-1.72v-11.3c0-0.95-0.77-1.72-1.72-1.72
|
||||
s-1.72,0.77-1.72,1.72v11.3C7.99,66.77,8.76,67.54,9.71,67.54z M24.65,33.86c0.42,0,0.84-0.15,1.17-0.46l7.04-6.52
|
||||
c0.14-0.13,0.46-0.34,0.9-0.51c0.89-0.34,1.34-1.33,1-2.22s-1.33-1.34-2.22-1c-0.8,0.3-1.52,0.73-2.03,1.2l-7.04,6.52
|
||||
c-0.7,0.65-0.74,1.74-0.09,2.43C23.73,33.68,24.19,33.86,24.65,33.86z M70.35,99.28l-0.37,0.36v-2.43c0-0.95-0.77-1.72-1.72-1.72
|
||||
c-0.95,0-1.72,0.77-1.72,1.72v4.72H61.3c-0.95,0-1.72,0.77-1.72,1.72s0.77,1.72,1.72,1.72h5.23c1.4,0,3.15-0.7,4.16-1.66l2.03-1.94
|
||||
c0.69-0.66,0.71-1.75,0.06-2.43C72.13,98.65,71.03,98.63,70.35,99.28z M52.6,101.93H41.3c-0.95,0-1.72,0.77-1.72,1.72
|
||||
s0.77,1.72,1.72,1.72h11.3c0.95,0,1.72-0.77,1.72-1.72S53.55,101.93,52.6,101.93z M88.92,36.35c-0.95,0-1.72,0.77-1.72,1.72v11.3
|
||||
c0,0.95,0.77,1.72,1.72,1.72c0.95,0,1.72-0.77,1.72-1.72v-11.3C90.64,37.12,89.87,36.35,88.92,36.35z M32.61,101.93H21.3
|
||||
c-0.95,0-1.72,0.77-1.72,1.72s0.77,1.72,1.72,1.72h11.3c0.95,0,1.72-0.77,1.72-1.72S33.56,101.93,32.61,101.93z M9.71,87.54
|
||||
c0.95,0,1.72-0.77,1.72-1.72v-11.3c0-0.95-0.77-1.72-1.72-1.72s-1.72,0.77-1.72,1.72v11.3C7.99,86.77,8.76,87.54,9.71,87.54z
|
||||
M12.61,101.93h-1.18v-7.42c0-0.95-0.77-1.72-1.72-1.72s-1.72,0.77-1.72,1.72v7.42c0,1.9,1.54,3.44,3.44,3.44h1.18
|
||||
c0.95,0,1.72-0.77,1.72-1.72S13.56,101.93,12.61,101.93z M19.53,36.88c-0.65-0.7-1.74-0.74-2.43-0.09l-7.3,6.76
|
||||
c-0.55,0.51-0.93,1.15-1.16,1.6C8.22,46,8.56,47.03,9.41,47.46c0.25,0.12,0.51,0.18,0.77,0.18h0.01c0.14,0.04,0.29,0.07,0.45,0.07
|
||||
h5.6c0.95,0,1.72-0.77,1.72-1.72s-0.77-1.72-1.72-1.72h-2.13l5.33-4.94C20.14,38.66,20.18,37.57,19.53,36.88z M80.7,89.4l-4.05,3.86
|
||||
c-0.69,0.66-0.71,1.75-0.06,2.43c0.34,0.35,0.79,0.53,1.25,0.53c0.43,0,0.86-0.16,1.19-0.48l4.05-3.86
|
||||
c0.69-0.66,0.71-1.75,0.06-2.43C82.48,88.77,81.39,88.75,80.7,89.4z"/>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M98.82,101.06c-11.63,0-21.09-9.46-21.09-21.09s9.46-21.09,21.09-21.09s21.09,9.46,21.09,21.09
|
||||
S110.45,101.06,98.82,101.06z M98.82,62.32c-9.73,0-17.65,7.92-17.65,17.65s7.92,17.65,17.65,17.65s17.65-7.92,17.65-17.65
|
||||
S108.55,62.32,98.82,62.32z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M110.44,81.84c0,1.1-0.9,2-2,2H89.2c-1.1,0-2-0.9-2-2v-3.75c0-1.1,0.9-2,2-2h19.25c1.1,0,2,0.9,2,2
|
||||
L110.44,81.84L110.44,81.84z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.2 KiB |
10
resources/icons/white/resin.svg
Normal file
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="resin">
|
||||
<rect x="4" y="7" fill="#ED6B21" width="8" height="8"/>
|
||||
<path fill="none" stroke="#FFFFFF" stroke-linecap="round" stroke-miterlimit="10" d="M4.5,15h6.99c0.28,0,0.5-0.23,0.5-0.5V6
|
||||
c0-1-2-1-2-2s0-1,0-1h1V1.5C11,1.23,10.77,1,10.5,1h-5C5.23,1,5,1.23,5,1.5V3h1v1c0,1-2,1-2,2v8.5C4,14.77,4.23,15,4.5,15z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 670 B |
25
resources/icons/white/save.svg
Normal file
|
@ -0,0 +1,25 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="save">
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M12,2c1.44,0,2,0.56,2,2v10H2V2H12 M12,1H2C1.45,1,1,1.45,1,2v12c0,0.55,0.45,1,1,1h12c0.55,0,1-0.45,1-1
|
||||
V4C15,2,14,1,12,1L12,1z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M10,8.5H3C2.72,8.5,2.5,8.28,2.5,8S2.72,7.5,3,7.5h7c0.28,0,0.5,0.22,0.5,0.5C10.5,8.28,10.28,8.5,10,8.5z
|
||||
"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M10,10.5H3c-0.28,0-0.5-0.22-0.5-0.5S2.72,9.5,3,9.5h7c0.28,0,0.5,0.22,0.5,0.5S10.28,10.5,10,10.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M7,12.5H3c-0.28,0-0.5-0.22-0.5-0.5s0.22-0.5,0.5-0.5h4c0.28,0,0.5,0.22,0.5,0.5S7.28,12.5,7,12.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M11,1H5C4.45,1,4,1.45,4,2v3c0,0.55,0.45,1,1,1h6c0.55,0,1-0.45,1-1V2C12,1.45,11.55,1,11,1z M6,4.5
|
||||
C6,4.78,5.78,5,5.5,5S5,4.78,5,4.5v-2C5,2.22,5.22,2,5.5,2S6,2.22,6,2.5V4.5z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.1 KiB |
29
resources/icons/white/set_separate_obj.svg
Normal file
|
@ -0,0 +1,29 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="set_x5F_separate_x5F_obj">
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M6,15.49H2.04c-0.83,0-1.5-0.67-1.51-1.5l-0.02-3.96c0-0.4,0.15-0.78,0.44-1.06C1.22,8.69,1.6,8.53,2,8.53
|
||||
h4c0.83,0,1.5,0.67,1.5,1.5v3.96C7.5,14.82,6.83,15.49,6,15.49z M6,9.53H2c-0.13,0-0.26,0.05-0.35,0.15
|
||||
C1.56,9.77,1.51,9.9,1.51,10.03l0.02,3.96c0,0.28,0.23,0.5,0.51,0.5H6c0.28,0,0.5-0.22,0.5-0.5v-3.96C6.5,9.75,6.28,9.53,6,9.53z"
|
||||
/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M6,7.5H2.04c-0.83,0-1.5-0.67-1.51-1.5L0.51,2.04c0-0.4,0.15-0.78,0.44-1.06C1.22,0.7,1.6,0.54,2,0.54h4
|
||||
c0.83,0,1.5,0.67,1.5,1.5V6C7.5,6.83,6.83,7.5,6,7.5z M6,1.54H2c-0.13,0-0.26,0.05-0.35,0.15C1.56,1.78,1.51,1.9,1.51,2.04L1.53,6
|
||||
c0,0.28,0.23,0.5,0.51,0.5H6c0.28,0,0.5-0.22,0.5-0.5V2.04C6.5,1.76,6.28,1.54,6,1.54z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M14,7.5h-3.96c-0.83,0-1.5-0.67-1.51-1.5L8.51,2.04c0-0.4,0.15-0.78,0.44-1.06C9.22,0.7,9.6,0.54,10,0.54
|
||||
h4c0.83,0,1.5,0.67,1.5,1.5V6C15.5,6.83,14.83,7.5,14,7.5z M14,1.54h-4c-0.13,0-0.26,0.05-0.35,0.15C9.56,1.78,9.5,1.9,9.51,2.04
|
||||
L9.53,6c0,0.27,0.23,0.5,0.51,0.5H14c0.28,0,0.5-0.22,0.5-0.5V2.04C14.5,1.76,14.28,1.54,14,1.54z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M14,15.5h-3.96c-0.83,0-1.5-0.67-1.51-1.5l-0.02-3.96c0-0.4,0.15-0.78,0.44-1.06
|
||||
C9.22,8.7,9.6,8.54,10,8.54h4c0.83,0,1.5,0.67,1.5,1.5V14C15.5,14.83,14.83,15.5,14,15.5z M14,9.54h-4
|
||||
c-0.13,0-0.26,0.05-0.35,0.15C9.56,9.78,9.5,9.9,9.51,10.04L9.53,14c0,0.27,0.23,0.5,0.51,0.5H14c0.28,0,0.5-0.22,0.5-0.5v-3.96
|
||||
C14.5,9.76,14.28,9.54,14,9.54z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
15
resources/icons/white/skirt+brim.svg
Normal file
|
@ -0,0 +1,15 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<path fill="#FFFFFF" d="M11.9,5.59L8.42,3.27c-0.23-0.15-0.6-0.15-0.83,0L4.1,5.59C3.87,5.75,3.69,6.1,3.69,6.37v0.44v1v0.44
|
||||
c0,0.28,0,0.72,0,1v0.44c0,0.28,0.19,0.62,0.42,0.78l3.48,2.32c0.23,0.15,0.6,0.15,0.83,0l3.48-2.32c0.23-0.15,0.42-0.5,0.42-0.78
|
||||
V9.25c0-0.28,0-0.72,0-1V7.81v-1V6.37C12.31,6.1,12.13,5.75,11.9,5.59z M11.47,7.81v0.44c0,0.27,0,0.71,0,0.99s-0.19,0.62-0.42,0.78
|
||||
l-2.64,1.76c-0.23,0.15-0.6,0.15-0.83,0l-2.64-1.76c-0.23-0.15-0.42-0.5-0.42-0.78c0-0.27,0-0.71,0-0.99V7.81V6.82
|
||||
c0-0.27,0.19-0.62,0.42-0.78l2.64-1.76c0.23-0.15,0.6-0.15,0.83,0l2.64,1.76c0.23,0.15,0.42,0.5,0.42,0.78V7.81z"/>
|
||||
<path fill="#ED6B21" d="M13.17,4.47L8.83,1.58c-0.46-0.31-1.21-0.31-1.66,0L2.83,4.47C2.37,4.78,2,5.48,2,6.03s0,1.45,0,2v2
|
||||
c0,0.55,0.37,1.25,0.83,1.55l4.34,2.89c0.46,0.31,1.21,0.31,1.66,0l4.34-2.89c0.46-0.31,0.83-1,0.83-1.55v-2c0-0.55,0-1.45,0-2
|
||||
S13.63,4.78,13.17,4.47z M13.25,8.03v1.6c0,0.55-0.37,1.25-0.83,1.55l-3.59,2.39c-0.46,0.31-1.21,0.31-1.66,0l-3.59-2.39
|
||||
c-0.46-0.31-0.83-1-0.83-1.55v-1.6c0-0.48,0-1.14,0-1.6c0-0.55,0.37-1.25,0.83-1.55l3.59-2.39c0.46-0.31,1.21-0.31,1.66,0l3.59,2.39
|
||||
c0.46,0.31,0.83,1,0.83,1.55C13.25,6.89,13.25,7.55,13.25,8.03z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.5 KiB |
19
resources/icons/white/split_object_SMALL.svg
Normal file
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="split_x5F_object_x5F_small">
|
||||
<path fill="#FFFFFF" d="M10.98,7.22c-0.29,0-0.52-0.23-0.52-0.52V4.61V3.57c0-0.29-0.23-0.52-0.52-0.52H2.62
|
||||
c-0.29,0-0.53,0.24-0.53,0.53l-0.04,7.31c0,0.14,0.05,0.27,0.15,0.37c0.1,0.1,0.23,0.15,0.37,0.15h3.19l0,0
|
||||
c0.29,0,0.52,0.23,0.52,0.52s-0.23,0.52-0.52,0.52h-2.1c-0.01,0-0.01,0-0.02,0H2.56c-0.42,0-0.81-0.16-1.11-0.46
|
||||
C1.16,11.69,1,11.29,1,10.87l0.04-7.31C1.05,2.7,1.75,2,2.62,2h7.31c0.86,0,1.57,0.7,1.57,1.57v1.04V6.7
|
||||
C11.5,6.99,11.27,7.22,10.98,7.22z"/>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M13.53,8H7.47C7.21,8,7,8.21,7,8.47v6.07C7,14.79,7.21,15,7.47,15h6.07c0.26,0,0.47-0.21,0.47-0.47V8.47
|
||||
C14,8.21,13.79,8,13.53,8z M12.36,12.68c0,1.14-0.57,1.65-1.88,1.65s-1.84-0.51-1.84-1.65v-2.33c0-1.17,0.51-1.65,1.84-1.65
|
||||
s1.88,0.48,1.88,1.65V12.68z"/>
|
||||
<path fill="#ED6B21" d="M10.47,9.57c-0.72,0-0.85,0.32-0.85,0.82v2.23c0,0.52,0.14,0.82,0.85,0.82c0.72,0,0.89-0.3,0.89-0.82V10.4
|
||||
C11.37,9.9,11.24,9.57,10.47,9.57z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
18
resources/icons/white/split_parts_SMALL.svg
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="split_x5F_parts_x5F_small">
|
||||
<path fill="#FFFFFF" d="M10.98,7.22c-0.29,0-0.52-0.23-0.52-0.52V4.61V3.57c0-0.29-0.23-0.52-0.52-0.52H2.62
|
||||
c-0.29,0-0.53,0.24-0.53,0.53l-0.04,7.31c0,0.14,0.05,0.27,0.15,0.37c0.1,0.1,0.23,0.15,0.37,0.15h3.19l0,0
|
||||
c0.29,0,0.52,0.23,0.52,0.52s-0.23,0.52-0.52,0.52h-2.1c-0.01,0-0.01,0-0.02,0H2.56c-0.42,0-0.81-0.16-1.11-0.46
|
||||
C1.16,11.69,1,11.29,1,10.87l0.04-7.31C1.05,2.7,1.75,2,2.62,2h7.31c0.86,0,1.57,0.7,1.57,1.57v1.04V6.7
|
||||
C11.5,6.99,11.27,7.22,10.98,7.22z"/>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M13.53,8H7.47C7.21,8,7,8.21,7,8.47v6.07C7,14.79,7.21,15,7.47,15h6.07c0.26,0,0.47-0.21,0.47-0.47V8.47
|
||||
C14,8.21,13.79,8,13.53,8z M12.19,10.89c0,1.16-0.65,1.69-1.99,1.69H9.81v1.72H8.79V8.7h1.41c1.35,0,1.99,0.49,1.99,1.67V10.89z"
|
||||
/>
|
||||
<path fill="#ED6B21" d="M10.21,9.62h-0.4v2h0.39c0.73,0,0.97-0.25,0.97-0.78v-0.41C11.17,9.89,10.99,9.62,10.21,9.62z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
21
resources/icons/white/spool.svg
Normal file
|
@ -0,0 +1,21 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="spool">
|
||||
|
||||
<line fill="none" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" x1="2" y1="2" x2="2" y2="14"/>
|
||||
|
||||
<line fill="none" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" x1="14" y1="2" x2="14" y2="14"/>
|
||||
|
||||
<line fill="none" stroke="#ED6B21" stroke-width="1.5" stroke-linecap="round" stroke-miterlimit="10" x1="4" y1="3" x2="4" y2="13"/>
|
||||
|
||||
<line fill="none" stroke="#ED6B21" stroke-width="1.5" stroke-linecap="round" stroke-miterlimit="10" x1="6" y1="3" x2="6" y2="13"/>
|
||||
|
||||
<line fill="none" stroke="#ED6B21" stroke-width="1.5" stroke-linecap="round" stroke-miterlimit="10" x1="8" y1="3" x2="8" y2="13"/>
|
||||
|
||||
<line fill="none" stroke="#ED6B21" stroke-width="1.5" stroke-linecap="round" stroke-miterlimit="10" x1="10" y1="3" x2="10" y2="13"/>
|
||||
|
||||
<line fill="none" stroke="#ED6B21" stroke-width="1.5" stroke-linecap="round" stroke-miterlimit="10" x1="12" y1="3" x2="12" y2="13"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
94
resources/icons/white/support.svg
Normal file
|
@ -0,0 +1,94 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="support">
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M8.42,0.91c-0.23-0.15-0.6-0.15-0.83,0L3.11,3.89c-0.23,0.15-0.42,0.5-0.42,0.78v0.57c0,0.28,0,0.55,0,0.6
|
||||
s0,0.33,0,0.6V7.2c0,0.27,0,0.55,0,0.6s0,0.33,0,0.6v0.57c0,0.28,0.19,0.62,0.42,0.78l4.47,2.98c0.23,0.15,0.6,0.15,0.83,0
|
||||
l4.47-2.98c0.23-0.15,0.42-0.5,0.42-0.78V8.4c0-0.27,0-0.55,0-0.6s0-0.33,0-0.6V6.44c0-0.28,0-0.55,0-0.6s0-0.33,0-0.6V4.67
|
||||
c0-0.28-0.19-0.62-0.42-0.78L8.42,0.91z M12.42,5.24c0,0.28,0,0.55,0,0.6s0,0.33,0,0.6V7.2c0,0.27,0,0.55,0,0.6s0,0.33,0,0.6v0.09
|
||||
c0,0.28-0.19,0.62-0.42,0.78l-3.59,2.39c-0.23,0.15-0.6,0.15-0.83,0L3.99,9.27c-0.23-0.15-0.42-0.5-0.42-0.78V8.4
|
||||
c0-0.27,0-0.55,0-0.6s0-0.33,0-0.6V6.44c0-0.28,0-0.55,0-0.6s0-0.33,0-0.6v-0.1c0-0.27,0.19-0.62,0.42-0.78l3.59-2.39
|
||||
c0.23-0.15,0.6-0.15,0.83,0L12,4.36c0.23,0.15,0.42,0.5,0.42,0.78V5.24z"/>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M13,15.38c-0.21,0-0.38-0.17-0.38-0.38v-4c0-0.21,0.17-0.38,0.38-0.38s0.38,0.17,0.38,0.38v4
|
||||
C13.38,15.21,13.21,15.38,13,15.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
|
||||
<path fill="none" stroke="#ED6B21" stroke-width="0.75" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M12,11.49"/>
|
||||
</g>
|
||||
<g>
|
||||
|
||||
<path fill="none" stroke="#ED6B21" stroke-width="0.75" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M12,15"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M11,15.38c-0.21,0-0.38-0.17-0.38-0.38v-2.88c0-0.21,0.17-0.38,0.38-0.38s0.38,0.17,0.38,0.38V15
|
||||
C11.38,15.21,11.21,15.38,11,15.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
|
||||
<path fill="none" stroke="#ED6B21" stroke-width="0.75" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M10,12.79"/>
|
||||
</g>
|
||||
<g>
|
||||
|
||||
<path fill="none" stroke="#ED6B21" stroke-width="0.75" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M10,15"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M9,15.38c-0.21,0-0.38-0.17-0.38-0.38v-1.5c0-0.21,0.17-0.38,0.38-0.38s0.38,0.17,0.38,0.38V15
|
||||
C9.38,15.21,9.21,15.38,9,15.38z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M3,15.38c-0.21,0-0.38-0.17-0.38-0.38v-4c0-0.21,0.17-0.38,0.38-0.38S3.37,10.79,3.37,11v4
|
||||
C3.37,15.21,3.2,15.38,3,15.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
|
||||
<path fill="none" stroke="#ED6B21" stroke-width="0.75" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M4,11.49"/>
|
||||
</g>
|
||||
<g>
|
||||
|
||||
<path fill="none" stroke="#ED6B21" stroke-width="0.75" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M4,15"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M5,15.38c-0.21,0-0.38-0.17-0.38-0.38v-2.88c0-0.21,0.17-0.38,0.38-0.38s0.38,0.17,0.38,0.38V15
|
||||
C5.37,15.21,5.2,15.38,5,15.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
|
||||
<path fill="none" stroke="#ED6B21" stroke-width="0.75" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M6,12.79"/>
|
||||
</g>
|
||||
<g>
|
||||
|
||||
<path fill="none" stroke="#ED6B21" stroke-width="0.75" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M6,15"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M7,15.38c-0.21,0-0.38-0.17-0.38-0.38v-1.5c0-0.21,0.17-0.38,0.38-0.38s0.38,0.17,0.38,0.38V15
|
||||
C7.37,15.21,7.2,15.38,7,15.38z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
|
||||
<path fill="none" stroke="#ED6B21" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M8,14"/>
|
||||
</g>
|
||||
<g>
|
||||
|
||||
<path fill="none" stroke="#ED6B21" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M8,15"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.8 KiB |
48
resources/icons/white/support_blocker.svg
Normal file
|
@ -0,0 +1,48 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="support_x5F_blocker">
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M8,8.17c-0.4,0-0.8-0.1-1.11-0.31L2.55,4.97C1.95,4.57,1.5,3.72,1.5,3V2c0-0.28,0.22-0.5,0.5-0.5
|
||||
S2.5,1.72,2.5,2v1c0,0.38,0.29,0.93,0.61,1.14l4.34,2.89c0.29,0.19,0.82,0.19,1.11,0l4.34-2.89c0.31-0.21,0.6-0.76,0.6-1.14V2
|
||||
c0-0.28,0.22-0.5,0.5-0.5s0.5,0.22,0.5,0.5v1c0,0.72-0.45,1.57-1.05,1.97L9.11,7.86C8.8,8.07,8.4,8.17,8,8.17z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M11,8.38c-0.12,0-0.24-0.06-0.31-0.17c-0.11-0.17-0.07-0.41,0.1-0.52l3-2c0.12-0.08,0.26-0.08,0.38-0.02
|
||||
s0.2,0.19,0.2,0.33v2c0,0.21-0.17,0.38-0.38,0.38S13.62,8.21,13.62,8V6.7L11.2,8.31C11.14,8.35,11.07,8.38,11,8.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M14,14.38h-3c-0.21,0-0.38-0.17-0.38-0.38s0.17-0.38,0.38-0.38h2.62V13c0-0.21,0.17-0.38,0.38-0.38
|
||||
s0.38,0.17,0.38,0.38v1C14.38,14.21,14.21,14.38,14,14.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M9,14.38H7c-0.21,0-0.38-0.17-0.38-0.38S6.79,13.62,7,13.62h2c0.21,0,0.38,0.17,0.38,0.38
|
||||
S9.21,14.38,9,14.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M14,11.38c-0.21,0-0.38-0.17-0.38-0.38v-1c0-0.21,0.17-0.38,0.38-0.38s0.38,0.17,0.38,0.38v1
|
||||
C14.38,11.21,14.21,11.38,14,11.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M8,10.38c-0.13,0-0.25-0.06-0.32-0.18C7.57,10.02,7.63,9.79,7.8,9.68l1.62-1C9.6,8.57,9.83,8.63,9.94,8.8
|
||||
c0.11,0.18,0.05,0.41-0.12,0.52l-1.62,1C8.14,10.36,8.07,10.38,8,10.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M5,8.38c-0.07,0-0.14-0.02-0.21-0.06L2.38,6.7V8c0,0.21-0.17,0.38-0.38,0.38S1.62,8.21,1.62,8V6
|
||||
c0-0.14,0.08-0.27,0.2-0.33C1.95,5.6,2.09,5.61,2.21,5.69l3,2c0.17,0.11,0.22,0.35,0.1,0.52C5.24,8.32,5.12,8.38,5,8.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M5,14.38H2c-0.21,0-0.38-0.17-0.38-0.38v-1c0-0.21,0.17-0.38,0.38-0.38S2.38,12.79,2.38,13v0.62H5
|
||||
c0.21,0,0.38,0.17,0.38,0.38S5.21,14.38,5,14.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M2,11.38c-0.21,0-0.38-0.17-0.38-0.38v-1c0-0.21,0.17-0.38,0.38-0.38S2.38,9.79,2.38,10v1
|
||||
C2.38,11.21,2.21,11.38,2,11.38z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M8,10.38c-0.07,0-0.14-0.02-0.2-0.06l-1.62-1C6.01,9.21,5.96,8.98,6.06,8.8C6.17,8.63,6.4,8.57,6.58,8.68
|
||||
l1.62,1c0.18,0.11,0.23,0.34,0.12,0.52C8.25,10.31,8.13,10.38,8,10.38z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
19
resources/icons/white/support_enforcer.svg
Normal file
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="support_x5F_enfocer">
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M8,8.17c-0.4,0-0.8-0.1-1.11-0.31L2.55,4.97C1.95,4.57,1.5,3.72,1.5,3V2c0-0.28,0.22-0.5,0.5-0.5
|
||||
S2.5,1.72,2.5,2v1c0,0.38,0.29,0.93,0.61,1.14l4.34,2.89c0.29,0.19,0.82,0.19,1.11,0l4.34-2.89c0.31-0.21,0.6-0.76,0.6-1.14V2
|
||||
c0-0.28,0.22-0.5,0.5-0.5s0.5,0.22,0.5,0.5v1c0,0.72-0.45,1.57-1.05,1.97L9.11,7.86C8.8,8.07,8.4,8.17,8,8.17z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M13,14.5H3c-0.83,0-1.5-0.67-1.5-1.5V7c0-0.45,0.19-0.81,0.51-0.98s0.72-0.13,1.1,0.12l4.34,2.89
|
||||
c0.29,0.19,0.82,0.19,1.11,0l4.34-2.89c0.38-0.25,0.78-0.3,1.1-0.12c0.31,0.17,0.5,0.53,0.5,0.98v6C14.5,13.83,13.83,14.5,13,14.5
|
||||
z M2.5,6.94c0,0.02,0,0.04,0,0.06v6c0,0.28,0.22,0.5,0.5,0.5h10c0.28,0,0.5-0.22,0.5-0.5V7c0-0.02,0-0.04,0-0.06
|
||||
c-0.02,0.01-0.03,0.02-0.05,0.03L9.11,9.86c-0.62,0.41-1.6,0.41-2.22,0L2.55,6.97C2.54,6.96,2.52,6.95,2.5,6.94z M8.83,9.45
|
||||
L8.83,9.45L8.83,9.45z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
37
resources/icons/white/test.svg
Normal file
|
@ -0,0 +1,37 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="test">
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M13,1.5h-1.5v1h1v12h-9v-12h1v-1H3C2.72,1.5,2.5,1.72,2.5,2v13c0,0.28,0.22,0.5,0.5,0.5h10
|
||||
c0.28,0,0.5-0.22,0.5-0.5V2C13.5,1.72,13.28,1.5,13,1.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M8,8.5H5C4.72,8.5,4.5,8.28,4.5,8V5c0-0.28,0.22-0.5,0.5-0.5h3c0.28,0,0.5,0.22,0.5,0.5v3
|
||||
C8.5,8.28,8.28,8.5,8,8.5z M5.5,7.5h2v-2h-2V7.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M8,13.5H5c-0.28,0-0.5-0.22-0.5-0.5v-3c0-0.28,0.22-0.5,0.5-0.5h3c0.28,0,0.5,0.22,0.5,0.5v3
|
||||
C8.5,13.28,8.28,13.5,8,13.5z M5.5,12.5h2v-2h-2V12.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M11,5.5h-1C9.72,5.5,9.5,5.28,9.5,5S9.72,4.5,10,4.5h1c0.28,0,0.5,0.22,0.5,0.5S11.28,5.5,11,5.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M11,7.5h-1C9.72,7.5,9.5,7.28,9.5,7S9.72,6.5,10,6.5h1c0.28,0,0.5,0.22,0.5,0.5S11.28,7.5,11,7.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M11,10.5h-1c-0.28,0-0.5-0.22-0.5-0.5S9.72,9.5,10,9.5h1c0.28,0,0.5,0.22,0.5,0.5S11.28,10.5,11,10.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#ED6B21" d="M11,12.5h-1c-0.28,0-0.5-0.22-0.5-0.5s0.22-0.5,0.5-0.5h1c0.28,0,0.5,0.22,0.5,0.5S11.28,12.5,11,12.5z"/>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M11,3.5H5C4.72,3.5,4.5,3.28,4.5,3V1c0-0.28,0.22-0.5,0.5-0.5h6c0.28,0,0.5,0.22,0.5,0.5v2
|
||||
C11.5,3.28,11.28,3.5,11,3.5z M5.5,2.5h5v-1h-5V2.5z"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
16
resources/icons/white/time.svg
Normal file
|
@ -0,0 +1,16 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="time">
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M8,2c3.31,0,6,2.69,6,6s-2.69,6-6,6s-6-2.69-6-6S4.69,2,8,2 M8,1C4.13,1,1,4.13,1,8s3.13,7,7,7s7-3.13,7-7
|
||||
S11.87,1,8,1L8,1z"/>
|
||||
</g>
|
||||
<g>
|
||||
<line fill="none" stroke="#ED6B21" stroke-linecap="round" stroke-miterlimit="10" x1="5" y1="4" x2="8" y2="8"/>
|
||||
</g>
|
||||
|
||||
<line fill="none" stroke="#ED6B21" stroke-width="1.5" stroke-linecap="round" stroke-miterlimit="10" x1="11.5" y1="8" x2="8" y2="8"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 789 B |
29
resources/icons/white/upload_queue.svg
Normal file
|
@ -0,0 +1,29 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="gueue">
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M6,15.49H2.04c-0.83,0-1.5-0.67-1.51-1.5l-0.02-3.96c0-0.4,0.15-0.78,0.44-1.06C1.22,8.69,1.6,8.53,2,8.53
|
||||
h4c0.83,0,1.5,0.67,1.5,1.5v3.96C7.5,14.82,6.83,15.49,6,15.49z M6,9.53H2c-0.13,0-0.26,0.05-0.35,0.15
|
||||
C1.56,9.77,1.51,9.9,1.51,10.03l0.02,3.96c0,0.28,0.23,0.5,0.51,0.5H6c0.28,0,0.5-0.22,0.5-0.5v-3.96C6.5,9.75,6.28,9.53,6,9.53z"
|
||||
/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M6,7.5H2.04c-0.83,0-1.5-0.67-1.51-1.5L0.51,2.04c0-0.4,0.15-0.78,0.44-1.06C1.22,0.7,1.6,0.54,2,0.54h4
|
||||
l0,0c0.4,0,0.77,0.16,1.06,0.44C7.34,1.26,7.5,1.64,7.5,2.04V6C7.5,6.83,6.83,7.5,6,7.5z M6,1.54L6,1.54H2
|
||||
c-0.13,0-0.26,0.05-0.35,0.15C1.56,1.78,1.51,1.9,1.51,2.04L1.53,6c0,0.28,0.23,0.5,0.51,0.5H6c0.28,0,0.5-0.22,0.5-0.5V2.04
|
||||
c0-0.13-0.05-0.26-0.15-0.35C6.26,1.59,6.13,1.54,6,1.54z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M14,7.5h-3.96c-0.83,0-1.5-0.67-1.51-1.5L8.51,2.04c0-0.4,0.15-0.78,0.44-1.06C9.22,0.7,9.6,0.54,10,0.54
|
||||
h4l0,0c0.4,0,0.78,0.16,1.06,0.44s0.44,0.66,0.44,1.06V6C15.5,6.83,14.83,7.5,14,7.5z M14,1.54L14,1.54h-4
|
||||
c-0.13,0-0.26,0.05-0.35,0.15C9.56,1.78,9.5,1.9,9.51,2.04L9.53,6c0,0.27,0.23,0.5,0.51,0.5H14c0.28,0,0.5-0.22,0.5-0.5V2.04
|
||||
c0-0.13-0.05-0.26-0.15-0.35S14.13,1.54,14,1.54z"/>
|
||||
</g>
|
||||
<path fill="#ED6B21" d="M12,8.5c-1.93,0-3.5,1.57-3.5,3.5s1.57,3.5,3.5,3.5s3.5-1.57,3.5-3.5S13.93,8.5,12,8.5z M13.45,12.58H12
|
||||
c-0.09,0-0.17-0.02-0.24-0.06c-0.02-0.01-0.04-0.02-0.05-0.04c-0.05-0.03-0.1-0.07-0.14-0.12c-0.01-0.01-0.02-0.01-0.03-0.02
|
||||
l-1.25-1.67c-0.19-0.26-0.14-0.62,0.12-0.82c0.26-0.19,0.62-0.14,0.82,0.12l1.07,1.43h1.17c0.32,0,0.58,0.26,0.58,0.58
|
||||
C14.04,12.32,13.78,12.58,13.45,12.58z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2 KiB |
20
resources/icons/white/wrench.svg
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="advanced_x2B_wrench">
|
||||
<path fill="#FFFFFF" d="M7.4,3.7C7.3,3.5,7.2,3.2,7.1,3l0.2-0.7L6.6,1.7L6,1.9C5.8,1.8,5.5,1.7,5.3,1.6L5,1H4L3.7,1.6
|
||||
C3.5,1.7,3.2,1.8,3,1.9L2.4,1.7L1.7,2.4L1.9,3C1.8,3.2,1.7,3.5,1.6,3.7L1,4v1l0.6,0.3C1.7,5.5,1.8,5.8,1.9,6L1.7,6.6l0.7,0.7L3,7.1
|
||||
c0.2,0.1,0.4,0.2,0.7,0.3L4,8h1l0.3-0.6C5.5,7.3,5.8,7.2,6,7.1l0.7,0.2l0.7-0.7L7.1,6c0.1-0.2,0.2-0.4,0.3-0.7L8,5V4L7.4,3.7z
|
||||
M4.5,6.4c-1.1,0-1.9-0.9-1.9-1.9s0.9-1.9,1.9-1.9s1.9,0.9,1.9,1.9S5.6,6.4,4.5,6.4z"/>
|
||||
<path fill="#FFFFFF" d="M12.4,2.5c-0.1-0.2-0.1-0.3-0.2-0.5l0.1-0.5L11.8,1l-0.5,0.2C11.2,1.1,11.1,1,10.9,1l-0.2-0.4H10L9.8,1
|
||||
C9.6,1,9.4,1.1,9.3,1.2L8.8,1L8.3,1.5L8.5,2C8.4,2.2,8.3,2.3,8.3,2.5L7.8,2.7v0.7l0.4,0.2c0,0.2,0.1,0.3,0.2,0.5L8.3,4.6l0.5,0.5
|
||||
l0.5-0.2C9.4,5,9.6,5.1,9.8,5.1L10,5.6h0.7l0.2-0.4c0.2,0,0.3-0.1,0.5-0.2l0.5,0.2l0.5-0.5l-0.2-0.5c0.1-0.2,0.1-0.3,0.2-0.5
|
||||
l0.4-0.2V2.7L12.4,2.5z M10.3,4.2c-0.6,0-1.1-0.5-1.1-1.1S9.7,2,10.3,2s1.1,0.5,1.1,1.1S10.9,4.2,10.3,4.2z"/>
|
||||
<path fill="#ED6B21" d="M14.4,9.6L15,8.9l-0.5-1.3l-1-0.1C13.3,7.3,13,7,12.8,6.8l-0.1-1l-1.3-0.5l-0.7,0.6c-0.3,0-0.7,0-1,0
|
||||
L8.9,5.3L7.6,5.8l-0.1,1C7.3,7,7,7.3,6.8,7.5l-1,0.1L5.3,8.9l0.6,0.7c0,0.3,0,0.7,0,1l-0.6,0.7l0.5,1.3l1,0.1
|
||||
C7,13,7.3,13.3,7.5,13.5l0.1,1L8.9,15l0.7-0.6c0.3,0,0.7,0,1,0l0.7,0.6l1.3-0.5l0.1-1c0.3-0.2,0.5-0.5,0.7-0.7l1-0.1l0.5-1.3
|
||||
l-0.6-0.7C14.4,10.3,14.4,10,14.4,9.6z M10.2,13c-1.6,0-2.9-1.3-2.9-2.8c0-1.6,1.3-2.9,2.9-2.9S13,8.6,13,10.2
|
||||
C13,11.7,11.7,13,10.2,13z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
20
resources/icons/wrench_white.svg
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||
<g id="advanced_x2B_wrench">
|
||||
<path fill="#FFFFFF" d="M7.4,3.7C7.3,3.5,7.2,3.2,7.1,3l0.2-0.7L6.6,1.7L6,1.9C5.8,1.8,5.5,1.7,5.3,1.6L5,1H4L3.7,1.6
|
||||
C3.5,1.7,3.2,1.8,3,1.9L2.4,1.7L1.7,2.4L1.9,3C1.8,3.2,1.7,3.5,1.6,3.7L1,4v1l0.6,0.3C1.7,5.5,1.8,5.8,1.9,6L1.7,6.6l0.7,0.7L3,7.1
|
||||
c0.2,0.1,0.4,0.2,0.7,0.3L4,8h1l0.3-0.6C5.5,7.3,5.8,7.2,6,7.1l0.7,0.2l0.7-0.7L7.1,6c0.1-0.2,0.2-0.4,0.3-0.7L8,5V4L7.4,3.7z
|
||||
M4.5,6.4c-1.1,0-1.9-0.9-1.9-1.9s0.9-1.9,1.9-1.9s1.9,0.9,1.9,1.9S5.6,6.4,4.5,6.4z"/>
|
||||
<path fill="#FFFFFF" d="M12.4,2.5c-0.1-0.2-0.1-0.3-0.2-0.5l0.1-0.5L11.8,1l-0.5,0.2C11.2,1.1,11.1,1,10.9,1l-0.2-0.4H10L9.8,1
|
||||
C9.6,1,9.4,1.1,9.3,1.2L8.8,1L8.3,1.5L8.5,2C8.4,2.2,8.3,2.3,8.3,2.5L7.8,2.7v0.7l0.4,0.2c0,0.2,0.1,0.3,0.2,0.5L8.3,4.6l0.5,0.5
|
||||
l0.5-0.2C9.4,5,9.6,5.1,9.8,5.1L10,5.6h0.7l0.2-0.4c0.2,0,0.3-0.1,0.5-0.2l0.5,0.2l0.5-0.5l-0.2-0.5c0.1-0.2,0.1-0.3,0.2-0.5
|
||||
l0.4-0.2V2.7L12.4,2.5z M10.3,4.2c-0.6,0-1.1-0.5-1.1-1.1S9.7,2,10.3,2s1.1,0.5,1.1,1.1S10.9,4.2,10.3,4.2z"/>
|
||||
<path fill="#ED6B21" d="M14.4,9.6L15,8.9l-0.5-1.3l-1-0.1C13.3,7.3,13,7,12.8,6.8l-0.1-1l-1.3-0.5l-0.7,0.6c-0.3,0-0.7,0-1,0
|
||||
L8.9,5.3L7.6,5.8l-0.1,1C7.3,7,7,7.3,6.8,7.5l-1,0.1L5.3,8.9l0.6,0.7c0,0.3,0,0.7,0,1l-0.6,0.7l0.5,1.3l1,0.1
|
||||
C7,13,7.3,13.3,7.5,13.5l0.1,1L8.9,15l0.7-0.6c0.3,0,0.7,0,1,0l0.7,0.6l1.3-0.5l0.1-1c0.3-0.2,0.5-0.5,0.7-0.7l1-0.1l0.5-1.3
|
||||
l-0.6-0.7C14.4,10.3,14.4,10,14.4,9.6z M10.2,13c-1.6,0-2.9-1.3-2.9-2.8c0-1.6,1.3-2.9,2.9-2.9S13,8.6,13,10.2
|
||||
C13,11.7,11.7,13,10.2,13z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
|
@ -4,6 +4,7 @@
|
|||
|
||||
#include <libslic3r/libslic3r.h>
|
||||
#include <libslic3r/TriangleMesh.hpp>
|
||||
#include <libslic3r/Tesselate.hpp>
|
||||
#include <libslic3r/SLA/SLABasePool.hpp>
|
||||
#include <libslic3r/SLA/SLABoilerPlate.hpp>
|
||||
#include <libnest2d/tools/benchmark.h>
|
||||
|
@ -14,7 +15,9 @@ const std::string USAGE_STR = {
|
|||
|
||||
namespace Slic3r { namespace sla {
|
||||
|
||||
Contour3D convert(const Polygons& triangles, coord_t z, bool dir);
|
||||
Contour3D create_base_pool(const ExPolygons &ground_layer,
|
||||
const PoolConfig& cfg = PoolConfig());
|
||||
|
||||
Contour3D walls(const Polygon& floor_plate, const Polygon& ceiling,
|
||||
double floor_z_mm, double ceiling_z_mm,
|
||||
double offset_difference_mm, ThrowOnCancel thr);
|
||||
|
@ -47,31 +50,38 @@ int main(const int argc, const char *argv[]) {
|
|||
|
||||
if(ground_slice.empty()) return EXIT_FAILURE;
|
||||
|
||||
ExPolygon bottom_plate = ground_slice.front();
|
||||
ExPolygon top_plate = bottom_plate;
|
||||
sla::offset(top_plate, coord_t(3.0/SCALING_FACTOR));
|
||||
sla::offset(bottom_plate, coord_t(1.0/SCALING_FACTOR));
|
||||
// ExPolygon bottom_plate = ground_slice.front();
|
||||
// ExPolygon top_plate = bottom_plate;
|
||||
// sla::offset(top_plate, coord_t(3.0/SCALING_FACTOR));
|
||||
// sla::offset(bottom_plate, coord_t(1.0/SCALING_FACTOR));
|
||||
|
||||
bench.start();
|
||||
|
||||
Polygons top_plate_triangles, bottom_plate_triangles;
|
||||
top_plate.triangulate_p2t(&top_plate_triangles);
|
||||
bottom_plate.triangulate_p2t(&bottom_plate_triangles);
|
||||
|
||||
auto top_plate_mesh = sla::convert(top_plate_triangles, coord_t(3.0/SCALING_FACTOR), false);
|
||||
auto bottom_plate_mesh = sla::convert(bottom_plate_triangles, 0, true);
|
||||
|
||||
mesh.merge(bottom_plate_mesh);
|
||||
mesh.merge(top_plate_mesh);
|
||||
|
||||
sla::Contour3D w = sla::walls(bottom_plate.contour, top_plate.contour, 0, 3, 2.0, [](){});
|
||||
|
||||
mesh.merge(w);
|
||||
// sla::create_base_pool(ground_slice, basepool);
|
||||
// TriangleMesh pool;
|
||||
sla::PoolConfig cfg;
|
||||
cfg.min_wall_height_mm = 0;
|
||||
cfg.edge_radius_mm = 0.2;
|
||||
mesh = sla::create_base_pool(ground_slice, cfg);
|
||||
|
||||
// mesh.merge(triangulate_expolygon_3d(top_plate, 3.0, false));
|
||||
// mesh.merge(triangulate_expolygon_3d(bottom_plate, 0.0, true));
|
||||
// mesh = sla::walls(bottom_plate.contour, top_plate.contour, 0, 3, 2.0, [](){});
|
||||
|
||||
bench.stop();
|
||||
|
||||
cout << "Base pool creation time: " << std::setprecision(10)
|
||||
<< bench.getElapsedSec() << " seconds." << endl;
|
||||
|
||||
// auto point = []()
|
||||
for(auto& trind : mesh.indices) {
|
||||
Vec3d p0 = mesh.points[size_t(trind[0])];
|
||||
Vec3d p1 = mesh.points[size_t(trind[1])];
|
||||
Vec3d p2 = mesh.points[size_t(trind[2])];
|
||||
Vec3d p01 = p1 - p0;
|
||||
Vec3d p02 = p2 - p0;
|
||||
auto a = p01.cross(p02).norm() / 2.0;
|
||||
if(std::abs(a) < 1e-6) std::cout << "degenerate triangle" << std::endl;
|
||||
}
|
||||
|
||||
// basepool.write_ascii("out.stl");
|
||||
|
||||
|
|
|
@ -108,6 +108,9 @@ stl_fix_normal_directions(stl_file *stl) {
|
|||
|
||||
if (stl->error) return;
|
||||
|
||||
// this may happen for malformed models, see: https://github.com/prusa3d/Slic3r/issues/2209
|
||||
if (stl->stats.number_of_facets == 0) return;
|
||||
|
||||
/* Initialize linked list. */
|
||||
head = (struct stl_normal*)malloc(sizeof(struct stl_normal));
|
||||
if(head == NULL) perror("stl_fix_normal_directions");
|
||||
|
|
|
@ -180,8 +180,67 @@ extern void stl_rotate_z(stl_file *stl, float angle);
|
|||
extern void stl_mirror_xy(stl_file *stl);
|
||||
extern void stl_mirror_yz(stl_file *stl);
|
||||
extern void stl_mirror_xz(stl_file *stl);
|
||||
extern void stl_transform(stl_file *stl, float *trafo3x4);
|
||||
extern void stl_transform(stl_file *stl, const Eigen::Transform<double, 3, Eigen::Affine, Eigen::DontAlign>& t);
|
||||
|
||||
extern void stl_get_size(stl_file *stl);
|
||||
|
||||
template<typename T>
|
||||
extern void stl_transform(stl_file *stl, T *trafo3x4)
|
||||
{
|
||||
if (stl->error)
|
||||
return;
|
||||
|
||||
for (uint32_t i_face = 0; i_face < stl->stats.number_of_facets; ++ i_face) {
|
||||
stl_facet &face = stl->facet_start[i_face];
|
||||
for (int i_vertex = 0; i_vertex < 3; ++ i_vertex) {
|
||||
stl_vertex &v_dst = face.vertex[i_vertex];
|
||||
stl_vertex v_src = v_dst;
|
||||
v_dst(0) = T(trafo3x4[0] * v_src(0) + trafo3x4[1] * v_src(1) + trafo3x4[2] * v_src(2) + trafo3x4[3]);
|
||||
v_dst(1) = T(trafo3x4[4] * v_src(0) + trafo3x4[5] * v_src(1) + trafo3x4[6] * v_src(2) + trafo3x4[7]);
|
||||
v_dst(2) = T(trafo3x4[8] * v_src(0) + trafo3x4[9] * v_src(1) + trafo3x4[10] * v_src(2) + trafo3x4[11]);
|
||||
}
|
||||
stl_vertex &v_dst = face.normal;
|
||||
stl_vertex v_src = v_dst;
|
||||
v_dst(0) = T(trafo3x4[0] * v_src(0) + trafo3x4[1] * v_src(1) + trafo3x4[2] * v_src(2));
|
||||
v_dst(1) = T(trafo3x4[4] * v_src(0) + trafo3x4[5] * v_src(1) + trafo3x4[6] * v_src(2));
|
||||
v_dst(2) = T(trafo3x4[8] * v_src(0) + trafo3x4[9] * v_src(1) + trafo3x4[10] * v_src(2));
|
||||
}
|
||||
|
||||
stl_get_size(stl);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
inline void stl_transform(stl_file *stl, const Eigen::Transform<T, 3, Eigen::Affine, Eigen::DontAlign>& t)
|
||||
{
|
||||
if (stl->error)
|
||||
return;
|
||||
|
||||
const Eigen::Matrix<double, 3, 3, Eigen::DontAlign> r = t.matrix().template block<3, 3>(0, 0);
|
||||
for (size_t i = 0; i < stl->stats.number_of_facets; ++i) {
|
||||
stl_facet &f = stl->facet_start[i];
|
||||
for (size_t j = 0; j < 3; ++j)
|
||||
f.vertex[j] = (t * f.vertex[j].template cast<T>()).template cast<float>().eval();
|
||||
f.normal = (r * f.normal.template cast<T>()).template cast<float>().eval();
|
||||
}
|
||||
|
||||
stl_get_size(stl);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
inline void stl_transform(stl_file *stl, const Eigen::Matrix<T, 3, 3, Eigen::DontAlign>& m)
|
||||
{
|
||||
if (stl->error)
|
||||
return;
|
||||
|
||||
for (size_t i = 0; i < stl->stats.number_of_facets; ++i) {
|
||||
stl_facet &f = stl->facet_start[i];
|
||||
for (size_t j = 0; j < 3; ++j)
|
||||
f.vertex[j] = (m * f.vertex[j].template cast<T>()).template cast<float>().eval();
|
||||
f.normal = (m * f.normal.template cast<T>()).template cast<float>().eval();
|
||||
}
|
||||
|
||||
stl_get_size(stl);
|
||||
}
|
||||
|
||||
extern void stl_open_merge(stl_file *stl, char *file);
|
||||
extern void stl_invalidate_shared_vertices(stl_file *stl);
|
||||
extern void stl_generate_shared_vertices(stl_file *stl);
|
||||
|
@ -214,7 +273,6 @@ extern void stl_read(stl_file *stl, int first_facet, bool first);
|
|||
extern void stl_facet_stats(stl_file *stl, stl_facet facet, bool &first);
|
||||
extern void stl_reallocate(stl_file *stl);
|
||||
extern void stl_add_facet(stl_file *stl, stl_facet *new_facet);
|
||||
extern void stl_get_size(stl_file *stl);
|
||||
|
||||
extern void stl_clear_error(stl_file *stl);
|
||||
extern int stl_get_error(stl_file *stl);
|
||||
|
|
|
@ -137,65 +137,6 @@ static void calculate_normals(stl_file *stl)
|
|||
}
|
||||
}
|
||||
|
||||
void stl_transform(stl_file *stl, float *trafo3x4) {
|
||||
int i_face, i_vertex;
|
||||
if (stl->error)
|
||||
return;
|
||||
for (i_face = 0; i_face < stl->stats.number_of_facets; ++ i_face) {
|
||||
stl_vertex *vertices = stl->facet_start[i_face].vertex;
|
||||
for (i_vertex = 0; i_vertex < 3; ++ i_vertex) {
|
||||
stl_vertex &v_dst = vertices[i_vertex];
|
||||
stl_vertex v_src = v_dst;
|
||||
v_dst(0) = trafo3x4[0] * v_src(0) + trafo3x4[1] * v_src(1) + trafo3x4[2] * v_src(2) + trafo3x4[3];
|
||||
v_dst(1) = trafo3x4[4] * v_src(0) + trafo3x4[5] * v_src(1) + trafo3x4[6] * v_src(2) + trafo3x4[7];
|
||||
v_dst(2) = trafo3x4[8] * v_src(0) + trafo3x4[9] * v_src(1) + trafo3x4[10] * v_src(2) + trafo3x4[11];
|
||||
}
|
||||
}
|
||||
stl_get_size(stl);
|
||||
calculate_normals(stl);
|
||||
}
|
||||
|
||||
void stl_transform(stl_file *stl, const Eigen::Transform<double, 3, Eigen::Affine, Eigen::DontAlign>& t)
|
||||
{
|
||||
if (stl->error)
|
||||
return;
|
||||
|
||||
unsigned int vertices_count = 3 * (unsigned int)stl->stats.number_of_facets;
|
||||
if (vertices_count == 0)
|
||||
return;
|
||||
|
||||
Eigen::MatrixXf src_vertices(3, vertices_count);
|
||||
stl_facet* facet_ptr = stl->facet_start;
|
||||
unsigned int v_id = 0;
|
||||
while (facet_ptr < stl->facet_start + stl->stats.number_of_facets)
|
||||
{
|
||||
for (int i = 0; i < 3; ++i)
|
||||
{
|
||||
::memcpy((void*)src_vertices.col(v_id).data(), (const void*)&facet_ptr->vertex[i], 3 * sizeof(float));
|
||||
++v_id;
|
||||
}
|
||||
facet_ptr += 1;
|
||||
}
|
||||
|
||||
Eigen::MatrixXf dst_vertices(3, vertices_count);
|
||||
dst_vertices = t.cast<float>() * src_vertices.colwise().homogeneous();
|
||||
|
||||
facet_ptr = stl->facet_start;
|
||||
v_id = 0;
|
||||
while (facet_ptr < stl->facet_start + stl->stats.number_of_facets)
|
||||
{
|
||||
for (int i = 0; i < 3; ++i)
|
||||
{
|
||||
::memcpy((void*)&facet_ptr->vertex[i], (const void*)dst_vertices.col(v_id).data(), 3 * sizeof(float));
|
||||
++v_id;
|
||||
}
|
||||
facet_ptr += 1;
|
||||
}
|
||||
|
||||
stl_get_size(stl);
|
||||
calculate_normals(stl);
|
||||
}
|
||||
|
||||
void
|
||||
stl_rotate_x(stl_file *stl, float angle) {
|
||||
int i;
|
||||
|
|
|
@ -280,7 +280,7 @@ std::ostream& ConfigDef::print_cli_help(std::ostream& out, bool show_defaults, s
|
|||
|
||||
// right: option description
|
||||
std::string descr = def.tooltip;
|
||||
if (show_defaults && def.default_value != nullptr && def.type != coBool
|
||||
if (show_defaults && def.default_value && def.type != coBool
|
||||
&& (def.type != coString || !def.default_value->serialize().empty())) {
|
||||
descr += " (";
|
||||
if (!def.sidetext.empty()) {
|
||||
|
@ -627,7 +627,7 @@ ConfigOption* DynamicConfig::optptr(const t_config_option_key &opt_key, bool cre
|
|||
// Let the parent decide what to do if the opt_key is not defined by this->def().
|
||||
return nullptr;
|
||||
ConfigOption *opt = nullptr;
|
||||
if (optdef->default_value != nullptr) {
|
||||
if (optdef->default_value) {
|
||||
opt = (optdef->default_value->type() == coEnum) ?
|
||||
// Special case: For a DynamicConfig, convert a templated enum to a generic enum.
|
||||
new ConfigOptionEnumGeneric(optdef->enum_keys_map, optdef->default_value->getInt()) :
|
||||
|
@ -783,8 +783,8 @@ void StaticConfig::set_defaults()
|
|||
for (const std::string &key : this->keys()) {
|
||||
const ConfigOptionDef *def = defs->get(key);
|
||||
ConfigOption *opt = this->option(key);
|
||||
if (def != nullptr && opt != nullptr && def->default_value != nullptr)
|
||||
opt->set(def->default_value);
|
||||
if (def != nullptr && opt != nullptr && def->default_value)
|
||||
opt->set(def->default_value.get());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <string>
|
||||
#include <vector>
|
||||
#include "libslic3r.h"
|
||||
#include "clonable_ptr.hpp"
|
||||
#include "Point.hpp"
|
||||
|
||||
#include <boost/format.hpp>
|
||||
|
@ -1010,7 +1011,10 @@ public:
|
|||
// What type? bool, int, string etc.
|
||||
ConfigOptionType type = coNone;
|
||||
// Default value of this option. The default value object is owned by ConfigDef, it is released in its destructor.
|
||||
const ConfigOption *default_value = nullptr;
|
||||
Slic3r::clonable_ptr<const ConfigOption> default_value;
|
||||
void set_default_value(const ConfigOption* ptr) { this->default_value = Slic3r::clonable_ptr<const ConfigOption>(ptr); }
|
||||
template<typename T>
|
||||
const T* get_default_value() const { return static_cast<const T*>(this->default_value.get()); }
|
||||
|
||||
// Usually empty.
|
||||
// Special values - "i_enum_open", "f_enum_open" to provide combo box for int or float selection,
|
||||
|
@ -1099,12 +1103,6 @@ typedef std::map<t_config_option_key, ConfigOptionDef> t_optiondef_map;
|
|||
class ConfigDef
|
||||
{
|
||||
public:
|
||||
~ConfigDef() {
|
||||
for (std::pair<const t_config_option_key, ConfigOptionDef> &def : this->options)
|
||||
delete def.second.default_value;
|
||||
this->options.clear();
|
||||
}
|
||||
|
||||
t_optiondef_map options;
|
||||
|
||||
bool has(const t_config_option_key &opt_key) const { return this->options.count(opt_key) > 0; }
|
||||
|
|
|
@ -201,12 +201,13 @@ std::string WipeTowerIntegration::append_tcr(GCode &gcodegen, const WipeTower::T
|
|||
// Let the m_writer know the current extruder_id, but ignore the generated G-code.
|
||||
if (new_extruder_id >= 0 && gcodegen.writer().need_toolchange(new_extruder_id))
|
||||
gcodegen.writer().toolchange(new_extruder_id);
|
||||
gcodegen.placeholder_parser().set("current_extruder", new_extruder_id);
|
||||
|
||||
// Always append the filament start G-code even if the extruder did not switch,
|
||||
// because the wipe tower resets the linear advance and we want it to be re-enabled.
|
||||
const std::string &start_filament_gcode = gcodegen.config().start_filament_gcode.get_at(new_extruder_id);
|
||||
if (! start_filament_gcode.empty()) {
|
||||
// Process the start_filament_gcode for the active filament only.
|
||||
gcodegen.placeholder_parser().set("current_extruder", new_extruder_id);
|
||||
DynamicConfig config;
|
||||
config.set_key_value("filament_extruder_id", new ConfigOptionInt(new_extruder_id));
|
||||
gcode += gcodegen.placeholder_parser_process("start_filament_gcode", start_filament_gcode, new_extruder_id, &config);
|
||||
|
|
|
@ -269,6 +269,21 @@ extern Eigen::Quaterniond rotation_xyz_diff(const Vec3d &rot_xyz_from, const Vec
|
|||
// This should only be called if it is known, that the two rotations only differ in rotation around the Z axis.
|
||||
extern double rotation_diff_z(const Vec3d &rot_xyz_from, const Vec3d &rot_xyz_to);
|
||||
|
||||
// Is the angle close to a multiple of 90 degrees?
|
||||
inline bool is_rotation_ninety_degrees(double a)
|
||||
{
|
||||
a = fmod(std::abs(a), 0.5 * M_PI);
|
||||
if (a > 0.25 * PI)
|
||||
a = 0.5 * PI - a;
|
||||
return a < 0.001;
|
||||
}
|
||||
|
||||
// Is the angle close to a multiple of 90 degrees?
|
||||
inline bool is_rotation_ninety_degrees(const Vec3d &rotation)
|
||||
{
|
||||
return is_rotation_ninety_degrees(rotation.x()) && is_rotation_ninety_degrees(rotation.y()) && is_rotation_ninety_degrees(rotation.z());
|
||||
}
|
||||
|
||||
} }
|
||||
|
||||
#endif
|
||||
|
|
|
@ -24,6 +24,19 @@ unsigned int Model::s_auto_extruder_id = 1;
|
|||
|
||||
size_t ModelBase::s_last_id = 0;
|
||||
|
||||
// Unique object / instance ID for the wipe tower.
|
||||
ModelID wipe_tower_object_id()
|
||||
{
|
||||
static ModelBase mine;
|
||||
return mine.id();
|
||||
}
|
||||
|
||||
ModelID wipe_tower_instance_id()
|
||||
{
|
||||
static ModelBase mine;
|
||||
return mine.id();
|
||||
}
|
||||
|
||||
Model& Model::assign_copy(const Model &rhs)
|
||||
{
|
||||
this->copy_id(rhs);
|
||||
|
@ -1320,6 +1333,58 @@ void ModelObject::repair()
|
|||
v->mesh.repair();
|
||||
}
|
||||
|
||||
// Support for non-uniform scaling of instances. If an instance is rotated by angles, which are not multiples of ninety degrees,
|
||||
// then the scaling in world coordinate system is not representable by the Geometry::Transformation structure.
|
||||
// This situation is solved by baking in the instance transformation into the mesh vertices.
|
||||
// Rotation and mirroring is being baked in. In case the instance scaling was non-uniform, it is baked in as well.
|
||||
void ModelObject::bake_xy_rotation_into_meshes(size_t instance_idx)
|
||||
{
|
||||
assert(instance_idx < this->instances.size());
|
||||
|
||||
const Geometry::Transformation reference_trafo = this->instances[instance_idx]->get_transformation();
|
||||
if (Geometry::is_rotation_ninety_degrees(reference_trafo.get_rotation()))
|
||||
// nothing to do, scaling in the world coordinate space is possible in the representation of Geometry::Transformation.
|
||||
return;
|
||||
|
||||
bool left_handed = reference_trafo.is_left_handed();
|
||||
bool has_mirrorring = ! reference_trafo.get_mirror().isApprox(Vec3d(1., 1., 1.));
|
||||
bool uniform_scaling = std::abs(reference_trafo.get_scaling_factor().x() - reference_trafo.get_scaling_factor().y()) < EPSILON &&
|
||||
std::abs(reference_trafo.get_scaling_factor().x() - reference_trafo.get_scaling_factor().z()) < EPSILON;
|
||||
double new_scaling_factor = uniform_scaling ? reference_trafo.get_scaling_factor().x() : 1.;
|
||||
|
||||
// Adjust the instances.
|
||||
for (size_t i = 0; i < this->instances.size(); ++ i) {
|
||||
ModelInstance &model_instance = *this->instances[i];
|
||||
model_instance.set_rotation(Vec3d(0., 0., Geometry::rotation_diff_z(reference_trafo.get_rotation(), model_instance.get_rotation())));
|
||||
model_instance.set_scaling_factor(Vec3d(new_scaling_factor, new_scaling_factor, new_scaling_factor));
|
||||
model_instance.set_mirror(Vec3d(1., 1., 1.));
|
||||
}
|
||||
|
||||
// Adjust the meshes.
|
||||
// Transformation to be applied to the meshes.
|
||||
Eigen::Matrix3d mesh_trafo_3x3 = reference_trafo.get_matrix(true, false, uniform_scaling, ! has_mirrorring).matrix().block<3, 3>(0, 0);
|
||||
Transform3d volume_offset_correction = this->instances[instance_idx]->get_transformation().get_matrix().inverse() * reference_trafo.get_matrix();
|
||||
for (ModelVolume *model_volume : this->volumes) {
|
||||
const Geometry::Transformation volume_trafo = model_volume->get_transformation();
|
||||
bool volume_left_handed = volume_trafo.is_left_handed();
|
||||
bool volume_has_mirrorring = ! volume_trafo.get_mirror().isApprox(Vec3d(1., 1., 1.));
|
||||
bool volume_uniform_scaling = std::abs(volume_trafo.get_scaling_factor().x() - volume_trafo.get_scaling_factor().y()) < EPSILON &&
|
||||
std::abs(volume_trafo.get_scaling_factor().x() - volume_trafo.get_scaling_factor().z()) < EPSILON;
|
||||
double volume_new_scaling_factor = volume_uniform_scaling ? volume_trafo.get_scaling_factor().x() : 1.;
|
||||
// Transform the mesh.
|
||||
Matrix3d volume_trafo_3x3 = volume_trafo.get_matrix(true, false, volume_uniform_scaling, !volume_has_mirrorring).matrix().block<3, 3>(0, 0);
|
||||
model_volume->transform_mesh(mesh_trafo_3x3 * volume_trafo_3x3, left_handed != volume_left_handed);
|
||||
// Reset the rotation, scaling and mirroring.
|
||||
model_volume->set_rotation(Vec3d(0., 0., 0.));
|
||||
model_volume->set_scaling_factor(Vec3d(volume_new_scaling_factor, volume_new_scaling_factor, volume_new_scaling_factor));
|
||||
model_volume->set_mirror(Vec3d(1., 1., 1.));
|
||||
// Move the reference point of the volume to compensate for the change of the instance trafo.
|
||||
model_volume->set_offset(volume_offset_correction * volume_trafo.get_offset());
|
||||
}
|
||||
|
||||
this->invalidate_bounding_box();
|
||||
}
|
||||
|
||||
double ModelObject::get_min_z() const
|
||||
{
|
||||
if (instances.empty())
|
||||
|
@ -1451,6 +1516,50 @@ std::string ModelObject::get_export_filename() const
|
|||
return ret;
|
||||
}
|
||||
|
||||
stl_stats ModelObject::get_object_stl_stats() const
|
||||
{
|
||||
if (this->volumes.size() == 1)
|
||||
return this->volumes[0]->mesh.stl.stats;
|
||||
|
||||
stl_stats full_stats = this->volumes[0]->mesh.stl.stats;
|
||||
|
||||
// fill full_stats from all objet's meshes
|
||||
for (ModelVolume* volume : this->volumes)
|
||||
{
|
||||
if (volume->id() == this->volumes[0]->id())
|
||||
continue;
|
||||
|
||||
const stl_stats& stats = volume->mesh.stl.stats;
|
||||
|
||||
// initialize full_stats (for repaired errors)
|
||||
full_stats.degenerate_facets += stats.degenerate_facets;
|
||||
full_stats.edges_fixed += stats.edges_fixed;
|
||||
full_stats.facets_removed += stats.facets_removed;
|
||||
full_stats.facets_added += stats.facets_added;
|
||||
full_stats.facets_reversed += stats.facets_reversed;
|
||||
full_stats.backwards_edges += stats.backwards_edges;
|
||||
|
||||
// another used satistics value
|
||||
if (volume->is_model_part()) {
|
||||
full_stats.volume += stats.volume;
|
||||
full_stats.number_of_parts += stats.number_of_parts;
|
||||
}
|
||||
}
|
||||
|
||||
return full_stats;
|
||||
}
|
||||
|
||||
int ModelObject::get_mesh_errors_count(const int vol_idx /*= -1*/) const
|
||||
{
|
||||
if (vol_idx >= 0)
|
||||
return this->volumes[vol_idx]->get_mesh_errors_count();
|
||||
|
||||
const stl_stats& stats = get_object_stl_stats();
|
||||
|
||||
return stats.degenerate_facets + stats.edges_fixed + stats.facets_removed +
|
||||
stats.facets_added + stats.facets_reversed + stats.backwards_edges;
|
||||
}
|
||||
|
||||
void ModelVolume::set_material_id(t_model_material_id material_id)
|
||||
{
|
||||
m_material_id = material_id;
|
||||
|
@ -1516,6 +1625,14 @@ void ModelVolume::calculate_convex_hull()
|
|||
m_convex_hull = mesh.convex_hull_3d();
|
||||
}
|
||||
|
||||
int ModelVolume::get_mesh_errors_count() const
|
||||
{
|
||||
const stl_stats& stats = this->mesh.stl.stats;
|
||||
|
||||
return stats.degenerate_facets + stats.edges_fixed + stats.facets_removed +
|
||||
stats.facets_added + stats.facets_reversed + stats.backwards_edges;
|
||||
}
|
||||
|
||||
const TriangleMesh& ModelVolume::get_convex_hull() const
|
||||
{
|
||||
return m_convex_hull;
|
||||
|
@ -1656,6 +1773,22 @@ void ModelVolume::scale_geometry(const Vec3d& versor)
|
|||
m_convex_hull.scale(versor);
|
||||
}
|
||||
|
||||
void ModelVolume::transform_mesh(const Transform3d &mesh_trafo, bool fix_left_handed)
|
||||
{
|
||||
this->mesh.transform(mesh_trafo, fix_left_handed);
|
||||
this->m_convex_hull.transform(mesh_trafo, fix_left_handed);
|
||||
// Let the rest of the application know that the geometry changed, so the meshes have to be reloaded.
|
||||
this->set_new_unique_id();
|
||||
}
|
||||
|
||||
void ModelVolume::transform_mesh(const Matrix3d &matrix, bool fix_left_handed)
|
||||
{
|
||||
this->mesh.transform(matrix, fix_left_handed);
|
||||
this->m_convex_hull.transform(matrix, fix_left_handed);
|
||||
// Let the rest of the application know that the geometry changed, so the meshes have to be reloaded.
|
||||
this->set_new_unique_id();
|
||||
}
|
||||
|
||||
void ModelInstance::transform_mesh(TriangleMesh* mesh, bool dont_translate) const
|
||||
{
|
||||
mesh->transform(get_matrix(dont_translate));
|
||||
|
|
|
@ -54,6 +54,10 @@ struct ModelID
|
|||
size_t id;
|
||||
};
|
||||
|
||||
// Unique object / instance ID for the wipe tower.
|
||||
extern ModelID wipe_tower_object_id();
|
||||
extern ModelID wipe_tower_instance_id();
|
||||
|
||||
// Base for Model, ModelObject, ModelVolume, ModelInstance or ModelMaterial to provide a unique ID
|
||||
// to synchronize the front end (UI) with the back end (BackgroundSlicingProcess / Print / PrintObject).
|
||||
// Achtung! The s_last_id counter is not thread safe, so it is expected, that the ModelBase derived instances
|
||||
|
@ -85,6 +89,9 @@ private:
|
|||
|
||||
static inline ModelID generate_new_id() { return ModelID(++ s_last_id); }
|
||||
static size_t s_last_id;
|
||||
|
||||
friend ModelID wipe_tower_object_id();
|
||||
friend ModelID wipe_tower_instance_id();
|
||||
};
|
||||
|
||||
#define MODELBASE_DERIVED_COPY_MOVE_CLONE(TYPE) \
|
||||
|
@ -265,6 +272,11 @@ public:
|
|||
ModelObjectPtrs cut(size_t instance, coordf_t z, bool keep_upper = true, bool keep_lower = true, bool rotate_lower = false); // Note: z is in world coordinates
|
||||
void split(ModelObjectPtrs* new_objects);
|
||||
void repair();
|
||||
// Support for non-uniform scaling of instances. If an instance is rotated by angles, which are not multiples of ninety degrees,
|
||||
// then the scaling in world coordinate system is not representable by the Geometry::Transformation structure.
|
||||
// This situation is solved by baking in the instance transformation into the mesh vertices.
|
||||
// Rotation and mirroring is being baked in. In case the instance scaling was non-uniform, it is baked in as well.
|
||||
void bake_xy_rotation_into_meshes(size_t instance_idx);
|
||||
|
||||
double get_min_z() const;
|
||||
double get_instance_min_z(size_t instance_idx) const;
|
||||
|
@ -277,6 +289,11 @@ public:
|
|||
|
||||
std::string get_export_filename() const;
|
||||
|
||||
// Get full stl statistics for all object's meshes
|
||||
stl_stats get_object_stl_stats() const;
|
||||
// Get count of errors in the mesh( or all object's meshes, if volume index isn't defined)
|
||||
int get_mesh_errors_count(const int vol_idx = -1) const;
|
||||
|
||||
protected:
|
||||
friend class Print;
|
||||
friend class SLAPrint;
|
||||
|
@ -370,6 +387,8 @@ public:
|
|||
|
||||
void calculate_convex_hull();
|
||||
const TriangleMesh& get_convex_hull() const;
|
||||
// Get count of errors in the mesh
|
||||
int get_mesh_errors_count() const;
|
||||
|
||||
// Helpers for loading / storing into AMF / 3MF files.
|
||||
static ModelVolumeType type_from_string(const std::string &s);
|
||||
|
@ -414,6 +433,8 @@ protected:
|
|||
|
||||
explicit ModelVolume(const ModelVolume &rhs) = default;
|
||||
void set_model_object(ModelObject *model_object) { object = model_object; }
|
||||
void transform_mesh(const Transform3d& t, bool fix_left_handed);
|
||||
void transform_mesh(const Matrix3d& m, bool fix_left_handed);
|
||||
|
||||
private:
|
||||
// Parent object owning this ModelVolume.
|
||||
|
|
|
@ -567,8 +567,13 @@ ShapeData2D projectModelFromTop(const Slic3r::Model &model) {
|
|||
Transform3d trafo_instance = Geometry::assemble_transform(Vec3d::Zero(), rotation, finst->get_scaling_factor(), finst->get_mirror());
|
||||
Polygon p = objptr->convex_hull_2d(trafo_instance);
|
||||
assert(! p.points.empty());
|
||||
p.reverse();
|
||||
assert(! p.is_counter_clockwise());
|
||||
|
||||
// this may happen for malformed models, see: https://github.com/prusa3d/Slic3r/issues/2209
|
||||
if (p.points.empty())
|
||||
continue;
|
||||
|
||||
p.reverse();
|
||||
assert(!p.is_counter_clockwise());
|
||||
p.append(p.first_point());
|
||||
clpath = Slic3rMultiPoint_to_ClipperPath(p);
|
||||
}
|
||||
|
|
|
@ -40,6 +40,11 @@ typedef std::vector<Vec3crd> Points3;
|
|||
typedef std::vector<Vec2d> Pointfs;
|
||||
typedef std::vector<Vec3d> Pointf3s;
|
||||
|
||||
typedef Eigen::Matrix<float, 2, 2, Eigen::DontAlign> Matrix2f;
|
||||
typedef Eigen::Matrix<double, 2, 2, Eigen::DontAlign> Matrix2d;
|
||||
typedef Eigen::Matrix<float, 3, 3, Eigen::DontAlign> Matrix3f;
|
||||
typedef Eigen::Matrix<double, 3, 3, Eigen::DontAlign> Matrix3d;
|
||||
|
||||
typedef Eigen::Transform<float, 2, Eigen::Affine, Eigen::DontAlign> Transform2f;
|
||||
typedef Eigen::Transform<double, 2, Eigen::Affine, Eigen::DontAlign> Transform2d;
|
||||
typedef Eigen::Transform<float, 3, Eigen::Affine, Eigen::DontAlign> Transform3f;
|
||||
|
|
|
@ -1220,7 +1220,7 @@ std::string Print::validate() const
|
|||
const SlicingParameters &slicing_params = object->slicing_parameters();
|
||||
if (std::abs(slicing_params.first_print_layer_height - slicing_params0.first_print_layer_height) > EPSILON ||
|
||||
std::abs(slicing_params.layer_height - slicing_params0.layer_height ) > EPSILON)
|
||||
return L("The Wipe Tower is only supported for multiple objects if they have equal layer heigths");
|
||||
return L("The Wipe Tower is only supported for multiple objects if they have equal layer heights");
|
||||
if (slicing_params.raft_layers() != slicing_params0.raft_layers())
|
||||
return L("The Wipe Tower is only supported for multiple objects if they are printed over an equal number of raft layers");
|
||||
if (object->config().support_material_contact_distance != m_objects.front()->config().support_material_contact_distance)
|
||||
|
@ -1473,7 +1473,7 @@ void Print::process()
|
|||
BOOST_LOG_TRIVIAL(info) << "Staring the slicing process." << log_memory_info();
|
||||
for (PrintObject *obj : m_objects)
|
||||
obj->make_perimeters();
|
||||
this->set_status(70, "Infilling layers");
|
||||
this->set_status(70, L("Infilling layers"));
|
||||
for (PrintObject *obj : m_objects)
|
||||
obj->infill();
|
||||
for (PrintObject *obj : m_objects)
|
||||
|
@ -1481,7 +1481,7 @@ void Print::process()
|
|||
if (this->set_started(psSkirt)) {
|
||||
m_skirt.clear();
|
||||
if (this->has_skirt()) {
|
||||
this->set_status(88, "Generating skirt");
|
||||
this->set_status(88, L("Generating skirt"));
|
||||
this->_make_skirt();
|
||||
}
|
||||
this->set_done(psSkirt);
|
||||
|
@ -1489,7 +1489,7 @@ void Print::process()
|
|||
if (this->set_started(psBrim)) {
|
||||
m_brim.clear();
|
||||
if (m_config.brim_width > 0) {
|
||||
this->set_status(88, "Generating brim");
|
||||
this->set_status(88, L("Generating brim"));
|
||||
this->_make_brim();
|
||||
}
|
||||
this->set_done(psBrim);
|
||||
|
@ -1497,7 +1497,7 @@ void Print::process()
|
|||
if (this->set_started(psWipeTower)) {
|
||||
m_wipe_tower_data.clear();
|
||||
if (this->has_wipe_tower()) {
|
||||
//this->set_status(95, "Generating wipe tower");
|
||||
//this->set_status(95, L("Generating wipe tower"));
|
||||
this->_make_wipe_tower();
|
||||
}
|
||||
this->set_done(psWipeTower);
|
||||
|
@ -1514,12 +1514,14 @@ std::string Print::export_gcode(const std::string &path_template, GCodePreviewDa
|
|||
// output everything to a G-code file
|
||||
// The following call may die if the output_filename_format template substitution fails.
|
||||
std::string path = this->output_filepath(path_template);
|
||||
std::string message = "Exporting G-code";
|
||||
std::string message;
|
||||
if (! path.empty() && preview_data == nullptr) {
|
||||
// Only show the path if preview_data is not set -> running from command line.
|
||||
message = L("Exporting G-code");
|
||||
message += " to ";
|
||||
message += path;
|
||||
}
|
||||
} else
|
||||
message = L("Generating G-code");
|
||||
this->set_status(90, message);
|
||||
|
||||
// The following line may die for multiple reasons.
|
||||
|
|
|
@ -307,8 +307,8 @@ protected:
|
|||
m_keys.emplace_back(kvp.first);
|
||||
const ConfigOptionDef *def = defs->get(kvp.first);
|
||||
assert(def != nullptr);
|
||||
if (def->default_value != nullptr)
|
||||
opt->set(def->default_value);
|
||||
if (def->default_value)
|
||||
opt->set(def->default_value.get());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#include "BoundingBox.hpp"
|
||||
#include "ClipperUtils.hpp"
|
||||
#include "Geometry.hpp"
|
||||
#include "I18N.hpp"
|
||||
#include "SupportMaterial.hpp"
|
||||
#include "Surface.hpp"
|
||||
#include "Slicing.hpp"
|
||||
|
@ -17,6 +18,10 @@
|
|||
|
||||
#include <Shiny/Shiny.h>
|
||||
|
||||
//! macro used to mark string used at localization,
|
||||
//! return same string
|
||||
#define L(s) Slic3r::I18N::translate(s)
|
||||
|
||||
#ifdef SLIC3R_DEBUG_SLICE_PROCESSING
|
||||
#define SLIC3R_DEBUG
|
||||
#endif
|
||||
|
@ -102,7 +107,7 @@ void PrintObject::slice()
|
|||
{
|
||||
if (! this->set_started(posSlice))
|
||||
return;
|
||||
m_print->set_status(10, "Processing triangulated mesh");
|
||||
m_print->set_status(10, L("Processing triangulated mesh"));
|
||||
std::vector<coordf_t> layer_height_profile;
|
||||
this->update_layer_height_profile(*this->model_object(), m_slicing_params, layer_height_profile);
|
||||
m_print->throw_if_canceled();
|
||||
|
@ -133,7 +138,7 @@ void PrintObject::make_perimeters()
|
|||
if (! this->set_started(posPerimeters))
|
||||
return;
|
||||
|
||||
m_print->set_status(20, "Generating perimeters");
|
||||
m_print->set_status(20, L("Generating perimeters"));
|
||||
BOOST_LOG_TRIVIAL(info) << "Generating perimeters..." << log_memory_info();
|
||||
|
||||
// merge slices if they were split into types
|
||||
|
@ -243,7 +248,7 @@ void PrintObject::prepare_infill()
|
|||
if (! this->set_started(posPrepareInfill))
|
||||
return;
|
||||
|
||||
m_print->set_status(30, "Preparing infill");
|
||||
m_print->set_status(30, L("Preparing infill"));
|
||||
|
||||
// This will assign a type (top/bottom/internal) to $layerm->slices.
|
||||
// Then the classifcation of $layerm->slices is transfered onto
|
||||
|
@ -383,7 +388,7 @@ void PrintObject::generate_support_material()
|
|||
if (this->set_started(posSupportMaterial)) {
|
||||
this->clear_support_layers();
|
||||
if ((m_config.support_material || m_config.raft_layers > 0) && m_layers.size() > 1) {
|
||||
m_print->set_status(85, "Generating support material");
|
||||
m_print->set_status(85, L("Generating support material"));
|
||||
this->_generate_support_material();
|
||||
m_print->throw_if_canceled();
|
||||
} else {
|
||||
|
|
|
@ -582,8 +582,8 @@ void base_plate(const TriangleMesh &mesh, ExPolygons &output, float h,
|
|||
}
|
||||
}
|
||||
|
||||
void create_base_pool(const ExPolygons &ground_layer, TriangleMesh& out,
|
||||
const PoolConfig& cfg)
|
||||
Contour3D create_base_pool(const ExPolygons &ground_layer,
|
||||
const PoolConfig& cfg = PoolConfig())
|
||||
{
|
||||
// for debugging:
|
||||
// Benchmark bench;
|
||||
|
@ -618,7 +618,7 @@ void create_base_pool(const ExPolygons &ground_layer, TriangleMesh& out,
|
|||
Contour3D pool;
|
||||
|
||||
for(ExPolygon& concaveh : concavehs) {
|
||||
if(concaveh.contour.points.empty()) return;
|
||||
if(concaveh.contour.points.empty()) return pool;
|
||||
|
||||
// Get rid of any holes in the concave hull output.
|
||||
concaveh.holes.clear();
|
||||
|
@ -683,7 +683,7 @@ void create_base_pool(const ExPolygons &ground_layer, TriangleMesh& out,
|
|||
|
||||
|
||||
// Generate the smoothed edge geometry
|
||||
pool.merge(round_edges(ob,
|
||||
if(s_eradius > 0) pool.merge(round_edges(ob,
|
||||
r,
|
||||
phi,
|
||||
0, // z position of the input plane
|
||||
|
@ -698,7 +698,8 @@ void create_base_pool(const ExPolygons &ground_layer, TriangleMesh& out,
|
|||
|
||||
if(wingheight > 0) {
|
||||
// Generate the smoothed edge geometry
|
||||
pool.merge(round_edges(middle_base,
|
||||
wh = 0;
|
||||
if(s_eradius) pool.merge(round_edges(middle_base,
|
||||
r,
|
||||
phi - 90, // from tangent lines
|
||||
0, // z position of the input plane
|
||||
|
@ -722,6 +723,14 @@ void create_base_pool(const ExPolygons &ground_layer, TriangleMesh& out,
|
|||
pool.merge(triangulate_expolygon_3d(inner_base, -wingheight));
|
||||
|
||||
}
|
||||
|
||||
return pool;
|
||||
}
|
||||
|
||||
void create_base_pool(const ExPolygons &ground_layer, TriangleMesh& out,
|
||||
const PoolConfig& cfg)
|
||||
{
|
||||
|
||||
|
||||
// For debugging:
|
||||
// bench.stop();
|
||||
|
@ -729,7 +738,7 @@ void create_base_pool(const ExPolygons &ground_layer, TriangleMesh& out,
|
|||
// std::fstream fout("pad_debug.obj", std::fstream::out);
|
||||
// if(fout.good()) pool.to_obj(fout);
|
||||
|
||||
out.merge(mesh(pool));
|
||||
out.merge(mesh(create_base_pool(ground_layer, cfg)));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -50,13 +50,18 @@ const std::array<unsigned, slaposCount> OBJ_STEP_LEVELS =
|
|||
30, // slaposSliceSupports,
|
||||
};
|
||||
|
||||
const std::array<std::string, slaposCount> OBJ_STEP_LABELS =
|
||||
// Object step to status label. The labels are localized at the time of calling, thus supporting language switching.
|
||||
std::string OBJ_STEP_LABELS(size_t idx)
|
||||
{
|
||||
L("Slicing model"), // slaposObjectSlice,
|
||||
L("Generating support points"), // slaposSupportPoints,
|
||||
L("Generating support tree"), // slaposSupportTree,
|
||||
L("Generating pad"), // slaposBasePool,
|
||||
L("Slicing supports"), // slaposSliceSupports,
|
||||
switch (idx) {
|
||||
case slaposObjectSlice: return L("Slicing model");
|
||||
case slaposSupportPoints: return L("Generating support points");
|
||||
case slaposSupportTree: return L("Generating support tree");
|
||||
case slaposBasePool: return L("Generating pad");
|
||||
case slaposSliceSupports: return L("Slicing supports");
|
||||
default:;
|
||||
}
|
||||
assert(false); return "Out of bounds!";
|
||||
};
|
||||
|
||||
// Should also add up to 100 (%)
|
||||
|
@ -66,10 +71,15 @@ const std::array<unsigned, slapsCount> PRINT_STEP_LEVELS =
|
|||
90, // slapsRasterize
|
||||
};
|
||||
|
||||
const std::array<std::string, slapsCount> PRINT_STEP_LABELS =
|
||||
// Print step to status label. The labels are localized at the time of calling, thus supporting language switching.
|
||||
std::string PRINT_STEP_LABELS(size_t idx)
|
||||
{
|
||||
L("Merging slices and calculating statistics"), // slapsStats
|
||||
L("Rasterizing layers"), // slapsRasterize
|
||||
switch (idx) {
|
||||
case slapsMergeSlicesAndEval: return L("Merging slices and calculating statistics");
|
||||
case slapsRasterize: return L("Rasterizing layers");
|
||||
default:;
|
||||
}
|
||||
assert(false); return "Out of bounds!";
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -128,7 +138,7 @@ static std::vector<SLAPrintObject::Instance> sla_instances(const ModelObject &mo
|
|||
instances.emplace_back(
|
||||
model_instance->id(),
|
||||
Point::new_scale(model_instance->get_offset(X), model_instance->get_offset(Y)),
|
||||
float(Geometry::rotation_diff_z(rotation0, model_instance->get_rotation())));
|
||||
float(Geometry::rotation_diff_z(rotation0, model_instance->get_rotation())));
|
||||
}
|
||||
}
|
||||
return instances;
|
||||
|
@ -705,7 +715,7 @@ void SLAPrint::process()
|
|||
po.closest_slice_record(po.m_slice_index, float(bb3d.min(Z)));
|
||||
|
||||
if(slindex_it == po.m_slice_index.end())
|
||||
//TRN To be shown at the status bar on SLA slicing error.
|
||||
//TRN To be shown at the status bar on SLA slicing error.
|
||||
throw std::runtime_error(L("Slicing had to be stopped "
|
||||
"due to an internal error."));
|
||||
|
||||
|
@ -783,7 +793,7 @@ void SLAPrint::process()
|
|||
double current = init + st * d;
|
||||
if(std::round(m_report_status.status()) < std::round(current))
|
||||
m_report_status(*this, current,
|
||||
OBJ_STEP_LABELS[slaposSupportPoints]);
|
||||
OBJ_STEP_LABELS(slaposSupportPoints));
|
||||
|
||||
};
|
||||
|
||||
|
@ -837,7 +847,7 @@ void SLAPrint::process()
|
|||
double current = init + st * d;
|
||||
if(std::round(m_report_status.status()) < std::round(current))
|
||||
m_report_status(*this, current,
|
||||
OBJ_STEP_LABELS[slaposSupportTree]);
|
||||
OBJ_STEP_LABELS(slaposSupportTree));
|
||||
|
||||
};
|
||||
|
||||
|
@ -1053,8 +1063,6 @@ void SLAPrint::process()
|
|||
const double width = m_printer_config.display_width.getFloat() / SCALING_FACTOR;
|
||||
const double height = m_printer_config.display_height.getFloat() / SCALING_FACTOR;
|
||||
const double display_area = width*height;
|
||||
|
||||
const coord_t clpr_back_offs = - coord_t(m_printer_config.absolute_correction.getFloat() / SCALING_FACTOR);
|
||||
|
||||
// get polygons for all instances in the object
|
||||
auto get_all_polygons =
|
||||
|
@ -1138,7 +1146,7 @@ void SLAPrint::process()
|
|||
auto printlayerfn = [this,
|
||||
// functions and read only vars
|
||||
get_all_polygons, polyunion, polydiff, areafn,
|
||||
area_fill, display_area, exp_time, init_exp_time, fast_tilt, slow_tilt, delta_fade_time, clpr_back_offs,
|
||||
area_fill, display_area, exp_time, init_exp_time, fast_tilt, slow_tilt, delta_fade_time,
|
||||
|
||||
// write vars
|
||||
&mutex, &models_volume, &supports_volume, &estim_time, &slow_layers,
|
||||
|
@ -1174,8 +1182,6 @@ void SLAPrint::process()
|
|||
for(const SliceRecord& record : layer.slices()) {
|
||||
const SLAPrintObject *po = record.print_obj();
|
||||
|
||||
// const ExPolygons &rawmodelslices = record.get_slice(soModel);
|
||||
// const ExPolygons &modelslices = clpr_back_offs != 0 ? offset_ex(rawmodelslices, clpr_back_offs) : rawmodelslices;
|
||||
const ExPolygons &modelslices = record.get_slice(soModel);
|
||||
|
||||
bool is_lefth = record.print_obj()->is_left_handed();
|
||||
|
@ -1184,8 +1190,6 @@ void SLAPrint::process()
|
|||
for(ClipperPolygon& p_tmp : v) model_polygons.emplace_back(std::move(p_tmp));
|
||||
}
|
||||
|
||||
// const ExPolygons &rawsupportslices = record.get_slice(soSupport);
|
||||
// const ExPolygons &supportslices = clpr_back_offs != 0 ? offset_ex(rawsupportslices, clpr_back_offs) : rawsupportslices;
|
||||
const ExPolygons &supportslices = record.get_slice(soSupport);
|
||||
|
||||
if (!supportslices.empty()) {
|
||||
|
@ -1353,7 +1357,7 @@ void SLAPrint::process()
|
|||
double st = std::round(dstatus);
|
||||
if(st > pst) {
|
||||
m_report_status(*this, st,
|
||||
PRINT_STEP_LABELS[slapsRasterize]);
|
||||
PRINT_STEP_LABELS(slapsRasterize));
|
||||
pst = st;
|
||||
}
|
||||
}
|
||||
|
@ -1419,7 +1423,7 @@ void SLAPrint::process()
|
|||
st += incr * ostepd;
|
||||
|
||||
if(po->m_stepmask[currentstep] && po->set_started(currentstep)) {
|
||||
m_report_status(*this, st, OBJ_STEP_LABELS[currentstep]);
|
||||
m_report_status(*this, st, OBJ_STEP_LABELS(currentstep));
|
||||
pobj_program[currentstep](*po);
|
||||
throw_if_canceled();
|
||||
po->set_done(currentstep);
|
||||
|
@ -1446,7 +1450,7 @@ void SLAPrint::process()
|
|||
|
||||
if(m_stepmask[currentstep] && set_started(currentstep))
|
||||
{
|
||||
m_report_status(*this, st, PRINT_STEP_LABELS[currentstep]);
|
||||
m_report_status(*this, st, PRINT_STEP_LABELS(currentstep));
|
||||
print_program[currentstep]();
|
||||
throw_if_canceled();
|
||||
set_done(currentstep);
|
||||
|
|
|
@ -176,6 +176,8 @@ private:
|
|||
{
|
||||
return level<T>(r1) < level<T>(r2);
|
||||
});
|
||||
|
||||
if(it == cont.end()) return it;
|
||||
|
||||
T diff = std::abs(level<T>(*it) - lvl);
|
||||
|
||||
|
|
|
@ -330,6 +330,17 @@ void TriangleMesh::transform(const Transform3d& t, bool fix_left_handed)
|
|||
}
|
||||
}
|
||||
|
||||
void TriangleMesh::transform(const Matrix3d& m, bool fix_left_handed)
|
||||
{
|
||||
stl_transform(&stl, m);
|
||||
stl_invalidate_shared_vertices(&stl);
|
||||
if (fix_left_handed && m.determinant() < 0.) {
|
||||
// Left handed transformation is being applied. It is a good idea to flip the faces and their normals.
|
||||
this->repair();
|
||||
stl_reverse_all_facets(&stl);
|
||||
}
|
||||
}
|
||||
|
||||
void TriangleMesh::align_to_origin()
|
||||
{
|
||||
this->translate(
|
||||
|
@ -1847,116 +1858,101 @@ TriangleMesh make_cube(double x, double y, double z) {
|
|||
// Generate the mesh for a cylinder and return it, using
|
||||
// the generated angle to calculate the top mesh triangles.
|
||||
// Default is 360 sides, angle fa is in radians.
|
||||
TriangleMesh make_cylinder(double r, double h, double fa) {
|
||||
Pointf3s vertices;
|
||||
std::vector<Vec3crd> facets;
|
||||
TriangleMesh make_cylinder(double r, double h, double fa)
|
||||
{
|
||||
size_t n_steps = (size_t)ceil(2. * PI / fa);
|
||||
double angle_step = 2. * PI / n_steps;
|
||||
|
||||
Pointf3s vertices;
|
||||
std::vector<Vec3crd> facets;
|
||||
vertices.reserve(2 * n_steps + 2);
|
||||
facets.reserve(4 * n_steps);
|
||||
|
||||
// 2 special vertices, top and bottom center, rest are relative to this
|
||||
vertices.emplace_back(Vec3d(0.0, 0.0, 0.0));
|
||||
vertices.emplace_back(Vec3d(0.0, 0.0, h));
|
||||
|
||||
// adjust via rounding to get an even multiple for any provided angle.
|
||||
double angle = (2*PI / floor(2*PI / fa));
|
||||
|
||||
// for each line along the polygon approximating the top/bottom of the
|
||||
// circle, generate four points and four facets (2 for the wall, 2 for the
|
||||
// top and bottom.
|
||||
// Special case: Last line shares 2 vertices with the first line.
|
||||
unsigned id = vertices.size() - 1;
|
||||
vertices.emplace_back(Vec3d(sin(0) * r , cos(0) * r, 0));
|
||||
vertices.emplace_back(Vec3d(sin(0) * r , cos(0) * r, h));
|
||||
for (double i = 0; i < 2*PI; i+=angle) {
|
||||
Vec2d p = Eigen::Rotation2Dd(i) * Eigen::Vector2d(0, r);
|
||||
Vec2d p = Eigen::Rotation2Dd(0.) * Eigen::Vector2d(0, r);
|
||||
vertices.emplace_back(Vec3d(p(0), p(1), 0.));
|
||||
vertices.emplace_back(Vec3d(p(0), p(1), h));
|
||||
for (size_t i = 1; i < n_steps; ++i) {
|
||||
p = Eigen::Rotation2Dd(angle_step * i) * Eigen::Vector2d(0, r);
|
||||
vertices.emplace_back(Vec3d(p(0), p(1), 0.));
|
||||
vertices.emplace_back(Vec3d(p(0), p(1), h));
|
||||
id = vertices.size() - 1;
|
||||
int id = (int)vertices.size() - 1;
|
||||
facets.emplace_back(Vec3crd( 0, id - 1, id - 3)); // top
|
||||
facets.emplace_back(Vec3crd(id, 1, id - 2)); // bottom
|
||||
facets.emplace_back(Vec3crd(id, id - 2, id - 3)); // upper-right of side
|
||||
facets.emplace_back(Vec3crd(id, id - 2, id - 3)); // upper-right of side
|
||||
facets.emplace_back(Vec3crd(id, id - 3, id - 1)); // bottom-left of side
|
||||
}
|
||||
// Connect the last set of vertices with the first.
|
||||
facets.emplace_back(Vec3crd( 2, 0, id - 1));
|
||||
facets.emplace_back(Vec3crd( 1, 3, id));
|
||||
facets.emplace_back(Vec3crd(id, 3, 2));
|
||||
facets.emplace_back(Vec3crd(id, 2, id - 1));
|
||||
int id = (int)vertices.size() - 1;
|
||||
facets.emplace_back(Vec3crd( 0, 2, id - 1));
|
||||
facets.emplace_back(Vec3crd( 3, 1, id));
|
||||
facets.emplace_back(Vec3crd(id, 2, 3));
|
||||
facets.emplace_back(Vec3crd(id, id - 1, 2));
|
||||
|
||||
TriangleMesh mesh(vertices, facets);
|
||||
return mesh;
|
||||
return TriangleMesh(std::move(vertices), std::move(facets));
|
||||
}
|
||||
|
||||
// Generates mesh for a sphere centered about the origin, using the generated angle
|
||||
// to determine the granularity.
|
||||
// Default angle is 1 degree.
|
||||
TriangleMesh make_sphere(double rho, double fa) {
|
||||
Pointf3s vertices;
|
||||
std::vector<Vec3crd> facets;
|
||||
//FIXME better to discretize an Icosahedron recursively http://www.songho.ca/opengl/gl_sphere.html
|
||||
TriangleMesh make_sphere(double radius, double fa)
|
||||
{
|
||||
int sectorCount = ceil(2. * M_PI / fa);
|
||||
int stackCount = ceil(M_PI / fa);
|
||||
float sectorStep = 2. * M_PI / sectorCount;
|
||||
float stackStep = M_PI / stackCount;
|
||||
|
||||
// Algorithm:
|
||||
// Add points one-by-one to the sphere grid and form facets using relative coordinates.
|
||||
// Sphere is composed effectively of a mesh of stacked circles.
|
||||
Pointf3s vertices;
|
||||
vertices.reserve((stackCount - 1) * sectorCount + 2);
|
||||
for (int i = 0; i <= stackCount; ++ i) {
|
||||
// from pi/2 to -pi/2
|
||||
double stackAngle = 0.5 * M_PI - stackStep * i;
|
||||
double xy = radius * cos(stackAngle);
|
||||
double z = radius * sin(stackAngle);
|
||||
if (i == 0 || i == stackCount)
|
||||
vertices.emplace_back(Vec3d(xy, 0., z));
|
||||
else
|
||||
for (int j = 0; j < sectorCount; ++ j) {
|
||||
// from 0 to 2pi
|
||||
double sectorAngle = sectorStep * j;
|
||||
vertices.emplace_back(Vec3d(xy * cos(sectorAngle), xy * sin(sectorAngle), z));
|
||||
}
|
||||
}
|
||||
|
||||
// adjust via rounding to get an even multiple for any provided angle.
|
||||
double angle = (2*PI / floor(2*PI / fa));
|
||||
|
||||
// Ring to be scaled to generate the steps of the sphere
|
||||
std::vector<double> ring;
|
||||
for (double i = 0; i < 2*PI; i+=angle) {
|
||||
ring.emplace_back(i);
|
||||
}
|
||||
const size_t steps = ring.size();
|
||||
const double increment = (double)(1.0 / (double)steps);
|
||||
|
||||
// special case: first ring connects to 0,0,0
|
||||
// insert and form facets.
|
||||
vertices.emplace_back(Vec3d(0.0, 0.0, -rho));
|
||||
size_t id = vertices.size();
|
||||
for (size_t i = 0; i < ring.size(); i++) {
|
||||
// Fixed scaling
|
||||
const double z = -rho + increment*rho*2.0;
|
||||
// radius of the circle for this step.
|
||||
const double r = sqrt(abs(rho*rho - z*z));
|
||||
Vec2d b = Eigen::Rotation2Dd(ring[i]) * Eigen::Vector2d(0, r);
|
||||
vertices.emplace_back(Vec3d(b(0), b(1), z));
|
||||
facets.emplace_back((i == 0) ? Vec3crd(1, 0, ring.size()) : Vec3crd(id, 0, id - 1));
|
||||
++ id;
|
||||
}
|
||||
|
||||
// General case: insert and form facets for each step, joining it to the ring below it.
|
||||
for (size_t s = 2; s < steps - 1; s++) {
|
||||
const double z = -rho + increment*(double)s*2.0*rho;
|
||||
const double r = sqrt(abs(rho*rho - z*z));
|
||||
|
||||
for (size_t i = 0; i < ring.size(); i++) {
|
||||
Vec2d b = Eigen::Rotation2Dd(ring[i]) * Eigen::Vector2d(0, r);
|
||||
vertices.emplace_back(Vec3d(b(0), b(1), z));
|
||||
if (i == 0) {
|
||||
// wrap around
|
||||
facets.emplace_back(Vec3crd(id + ring.size() - 1 , id, id - 1));
|
||||
facets.emplace_back(Vec3crd(id, id - ring.size(), id - 1));
|
||||
} else {
|
||||
facets.emplace_back(Vec3crd(id , id - ring.size(), (id - 1) - ring.size()));
|
||||
facets.emplace_back(Vec3crd(id, id - 1 - ring.size() , id - 1));
|
||||
}
|
||||
id++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// special case: last ring connects to 0,0,rho*2.0
|
||||
// only form facets.
|
||||
vertices.emplace_back(Vec3d(0.0, 0.0, rho));
|
||||
for (size_t i = 0; i < ring.size(); i++) {
|
||||
if (i == 0) {
|
||||
// third vertex is on the other side of the ring.
|
||||
facets.emplace_back(Vec3crd(id, id - ring.size(), id - 1));
|
||||
} else {
|
||||
facets.emplace_back(Vec3crd(id, id - ring.size() + i, id - ring.size() + (i - 1)));
|
||||
}
|
||||
}
|
||||
id++;
|
||||
TriangleMesh mesh(vertices, facets);
|
||||
return mesh;
|
||||
std::vector<Vec3crd> facets;
|
||||
facets.reserve(2 * (stackCount - 1) * sectorCount);
|
||||
for (int i = 0; i < stackCount; ++ i) {
|
||||
// Beginning of current stack.
|
||||
int k1 = (i == 0) ? 0 : (1 + (i - 1) * sectorCount);
|
||||
int k1_first = k1;
|
||||
// Beginning of next stack.
|
||||
int k2 = (i == 0) ? 1 : (k1 + sectorCount);
|
||||
int k2_first = k2;
|
||||
for (int j = 0; j < sectorCount; ++ j) {
|
||||
// 2 triangles per sector excluding first and last stacks
|
||||
int k1_next = k1;
|
||||
int k2_next = k2;
|
||||
if (i != 0) {
|
||||
k1_next = (j + 1 == sectorCount) ? k1_first : (k1 + 1);
|
||||
facets.emplace_back(Vec3crd(k1, k2, k1_next));
|
||||
}
|
||||
if (i + 1 != stackCount) {
|
||||
k2_next = (j + 1 == sectorCount) ? k2_first : (k2 + 1);
|
||||
facets.emplace_back(Vec3crd(k1_next, k2, k2_next));
|
||||
}
|
||||
k1 = k1_next;
|
||||
k2 = k2_next;
|
||||
}
|
||||
}
|
||||
return TriangleMesh(std::move(vertices), std::move(facets));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -52,6 +52,7 @@ public:
|
|||
void mirror_y() { this->mirror(Y); }
|
||||
void mirror_z() { this->mirror(Z); }
|
||||
void transform(const Transform3d& t, bool fix_left_handed = false);
|
||||
void transform(const Matrix3d& t, bool fix_left_handed = false);
|
||||
void align_to_origin();
|
||||
void rotate(double angle, Point* center);
|
||||
TriangleMeshPtrs split() const;
|
||||
|
|
168
src/libslic3r/clonable_ptr.hpp
Normal file
|
@ -0,0 +1,168 @@
|
|||
// clonable_ptr: a smart pointer with a usage similar to unique_ptr, with the exception, that
|
||||
// the copy constructor / copy assignment operator work by calling the ->clone() method.
|
||||
|
||||
// derived from https://github.com/SRombauts/shared_ptr/blob/master/include/unique_ptr.hpp
|
||||
/**
|
||||
* @file clonable_ptr.hpp
|
||||
* @brief clonable_ptr is a fake implementation to use in place of a C++11 std::clonable_ptr when compiling on an older compiler.
|
||||
*
|
||||
* @see http://www.cplusplus.com/reference/memory/clonable_ptr/
|
||||
*
|
||||
* Copyright (c) 2014-2019 Sebastien Rombauts (sebastien.rombauts@gmail.com)
|
||||
*
|
||||
* Distributed under the MIT License (MIT) (See accompanying file LICENSE.txt
|
||||
* or copy at http://opensource.org/licenses/MIT)
|
||||
*/
|
||||
|
||||
#include "assert.h"
|
||||
|
||||
namespace Slic3r {
|
||||
|
||||
// Detect whether the compiler supports C++11 noexcept exception specifications.
|
||||
#if defined(_MSC_VER) && _MSC_VER < 1900 && ! defined(noexcept)
|
||||
#define noexcept throw()
|
||||
#endif
|
||||
|
||||
template<class T>
|
||||
class clonable_ptr
|
||||
{
|
||||
public:
|
||||
/// The type of the managed object, aliased as member type
|
||||
typedef T element_type;
|
||||
|
||||
/// @brief Default constructor
|
||||
clonable_ptr() noexcept :
|
||||
px(nullptr)
|
||||
{
|
||||
}
|
||||
/// @brief Constructor with the provided pointer to manage
|
||||
explicit clonable_ptr(T* p) noexcept :
|
||||
px(p)
|
||||
{
|
||||
}
|
||||
/// @brief Copy constructor, clones by calling the rhs.clone() method
|
||||
clonable_ptr(const clonable_ptr& rhs) :
|
||||
px(rhs ? rhs.px->clone() : nullptr)
|
||||
{
|
||||
}
|
||||
/// @brief Move constructor, never throws
|
||||
clonable_ptr(clonable_ptr&& rhs) noexcept :
|
||||
px(rhs.px)
|
||||
{
|
||||
rhs.px = nullptr;
|
||||
}
|
||||
/// @brief Assignment operator
|
||||
clonable_ptr& operator=(const clonable_ptr& rhs)
|
||||
{
|
||||
delete px;
|
||||
px = rhs ? rhs.px->clone() : nullptr;
|
||||
return *this;
|
||||
}
|
||||
/// @brief Move operator, never throws
|
||||
clonable_ptr& operator=(clonable_ptr&& rhs)
|
||||
{
|
||||
delete px;
|
||||
px = rhs.px;
|
||||
rhs.px = nullptr;
|
||||
return *this;
|
||||
}
|
||||
/// @brief the destructor releases its ownership and destroy the object
|
||||
inline ~clonable_ptr() noexcept
|
||||
{
|
||||
destroy();
|
||||
}
|
||||
/// @brief this reset releases its ownership and destroy the object
|
||||
inline void reset() noexcept
|
||||
{
|
||||
destroy();
|
||||
}
|
||||
/// @brief this reset release its ownership and re-acquire another one
|
||||
void reset(T* p) noexcept
|
||||
{
|
||||
assert((nullptr == p) || (px != p)); // auto-reset not allowed
|
||||
destroy();
|
||||
px = p;
|
||||
}
|
||||
|
||||
/// @brief Swap method for the copy-and-swap idiom (copy constructor and swap method)
|
||||
void swap(clonable_ptr& rhs) noexcept
|
||||
{
|
||||
T *tmp = px;
|
||||
px = rhs.px;
|
||||
rhs.px = tmp;
|
||||
}
|
||||
|
||||
/// @brief release the ownership of the px pointer without destroying the object!
|
||||
inline void release() noexcept
|
||||
{
|
||||
px = nullptr;
|
||||
}
|
||||
|
||||
// reference counter operations :
|
||||
inline operator bool() const noexcept
|
||||
{
|
||||
return (nullptr != px); // TODO nullptrptr
|
||||
}
|
||||
|
||||
// underlying pointer operations :
|
||||
inline T& operator*() const noexcept
|
||||
{
|
||||
assert(nullptr != px);
|
||||
return *px;
|
||||
}
|
||||
inline T* operator->() const noexcept
|
||||
{
|
||||
assert(nullptr != px);
|
||||
return px;
|
||||
}
|
||||
inline T* get() const noexcept
|
||||
{
|
||||
// no assert, can return nullptr
|
||||
return px;
|
||||
}
|
||||
|
||||
private:
|
||||
/// @brief release the ownership of the px pointer and destroy the object
|
||||
inline void destroy() noexcept
|
||||
{
|
||||
delete px;
|
||||
px = nullptr;
|
||||
}
|
||||
|
||||
/// @brief hack: const-cast release the ownership of the px pointer without destroying the object!
|
||||
inline void release() const noexcept
|
||||
{
|
||||
px = nullptr;
|
||||
}
|
||||
|
||||
private:
|
||||
T* px; //!< Native pointer
|
||||
};
|
||||
|
||||
// comparison operators
|
||||
template<class T, class U> inline bool operator==(const clonable_ptr<T>& l, const clonable_ptr<U>& r) noexcept
|
||||
{
|
||||
return (l.get() == r.get());
|
||||
}
|
||||
template<class T, class U> inline bool operator!=(const clonable_ptr<T>& l, const clonable_ptr<U>& r) noexcept
|
||||
{
|
||||
return (l.get() != r.get());
|
||||
}
|
||||
template<class T, class U> inline bool operator<=(const clonable_ptr<T>& l, const clonable_ptr<U>& r) noexcept
|
||||
{
|
||||
return (l.get() <= r.get());
|
||||
}
|
||||
template<class T, class U> inline bool operator<(const clonable_ptr<T>& l, const clonable_ptr<U>& r) noexcept
|
||||
{
|
||||
return (l.get() < r.get());
|
||||
}
|
||||
template<class T, class U> inline bool operator>=(const clonable_ptr<T>& l, const clonable_ptr<U>& r) noexcept
|
||||
{
|
||||
return (l.get() >= r.get());
|
||||
}
|
||||
template<class T, class U> inline bool operator>(const clonable_ptr<T>& l, const clonable_ptr<U>& r) noexcept
|
||||
{
|
||||
return (l.get() > r.get());
|
||||
}
|
||||
|
||||
} // namespace Slic3r
|
|
@ -628,7 +628,7 @@ std::string CLI::output_filepath(const Model &model, IO::ExportFormat format) co
|
|||
{
|
||||
std::string ext;
|
||||
switch (format) {
|
||||
case IO::AMF: ext = ".amf"; break;
|
||||
case IO::AMF: ext = ".zip.amf"; break;
|
||||
case IO::OBJ: ext = ".obj"; break;
|
||||
case IO::STL: ext = ".stl"; break;
|
||||
case IO::TMF: ext = ".3mf"; break;
|
||||
|
|
|
@ -224,7 +224,7 @@ void GLIndexedVertexArray::render(
|
|||
|
||||
const float GLVolume::SELECTED_COLOR[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
|
||||
const float GLVolume::HOVER_SELECT_COLOR[4] = { 0.4f, 0.9f, 0.1f, 1.0f };
|
||||
const float GLVolume::HOVER_DESELECT_COLOR[4] = { 0.9f, 0.4f, 0.1f, 1.0f };
|
||||
const float GLVolume::HOVER_DESELECT_COLOR[4] = { 1.0f, 0.75f, 0.75f, 1.0f };
|
||||
const float GLVolume::OUTSIDE_COLOR[4] = { 0.0f, 0.38f, 0.8f, 1.0f };
|
||||
const float GLVolume::SELECTED_OUTSIDE_COLOR[4] = { 0.19f, 0.58f, 1.0f, 1.0f };
|
||||
const float GLVolume::DISABLED_COLOR[4] = { 0.25f, 0.25f, 0.25f, 1.0f };
|
||||
|
@ -365,19 +365,18 @@ const BoundingBoxf3& GLVolume::transformed_bounding_box() const
|
|||
|
||||
const BoundingBoxf3& GLVolume::transformed_convex_hull_bounding_box() const
|
||||
{
|
||||
if (m_transformed_convex_hull_bounding_box_dirty)
|
||||
{
|
||||
if ((m_convex_hull != nullptr) && (m_convex_hull->stl.stats.number_of_facets > 0))
|
||||
m_transformed_convex_hull_bounding_box = m_convex_hull->transformed_bounding_box(world_matrix());
|
||||
else
|
||||
m_transformed_convex_hull_bounding_box = bounding_box.transformed(world_matrix());
|
||||
|
||||
m_transformed_convex_hull_bounding_box_dirty = false;
|
||||
}
|
||||
|
||||
if (m_transformed_convex_hull_bounding_box_dirty)
|
||||
m_transformed_convex_hull_bounding_box = this->transformed_convex_hull_bounding_box(world_matrix());
|
||||
return m_transformed_convex_hull_bounding_box;
|
||||
}
|
||||
|
||||
BoundingBoxf3 GLVolume::transformed_convex_hull_bounding_box(const Transform3d &trafo) const
|
||||
{
|
||||
return (m_convex_hull != nullptr && m_convex_hull->stl.stats.number_of_facets > 0) ?
|
||||
m_convex_hull->transformed_bounding_box(trafo) :
|
||||
bounding_box.transformed(trafo);
|
||||
}
|
||||
|
||||
void GLVolume::set_range(double min_z, double max_z)
|
||||
{
|
||||
this->qverts_range.first = 0;
|
||||
|
@ -719,6 +718,8 @@ int GLVolumeCollection::load_wipe_tower_preview(
|
|||
v.bounding_box = v.indexed_vertex_array.bounding_box();
|
||||
v.indexed_vertex_array.finalize_geometry(use_VBOs);
|
||||
v.composite_id = GLVolume::CompositeID(obj_idx, 0, 0);
|
||||
v.geometry_id.first = 0;
|
||||
v.geometry_id.second = wipe_tower_instance_id().id;
|
||||
v.is_wipe_tower = true;
|
||||
v.shader_outside_printer_detection_enabled = ! size_unknown;
|
||||
return int(this->volumes.size() - 1);
|
||||
|
|
|
@ -283,6 +283,8 @@ public:
|
|||
int volume_id;
|
||||
// Instance ID, which is equal to the index of the respective ModelInstance in ModelObject.instances array.
|
||||
int instance_id;
|
||||
bool operator==(const CompositeID &rhs) const { return object_id == rhs.object_id && volume_id == rhs.volume_id && instance_id == rhs.instance_id; }
|
||||
bool operator!=(const CompositeID &rhs) const { return ! (*this == rhs); }
|
||||
};
|
||||
CompositeID composite_id;
|
||||
// Fingerprint of the source geometry. For ModelVolumes, it is the ModelVolume::ID and ModelInstanceID,
|
||||
|
@ -403,6 +405,9 @@ public:
|
|||
bool is_left_handed() const;
|
||||
|
||||
const BoundingBoxf3& transformed_bounding_box() const;
|
||||
// non-caching variant
|
||||
BoundingBoxf3 transformed_convex_hull_bounding_box(const Transform3d &trafo) const;
|
||||
// caching variant
|
||||
const BoundingBoxf3& transformed_convex_hull_bounding_box() const;
|
||||
|
||||
bool empty() const { return this->indexed_vertex_array.empty(); }
|
||||
|
|
|
@ -89,21 +89,28 @@ AboutDialog::AboutDialog()
|
|||
int size[] = {fs,fs,fs,fs,fs,fs,fs};
|
||||
m_html->SetFonts(font.GetFaceName(), font.GetFaceName(), size);
|
||||
m_html->SetBorders(2);
|
||||
const wxString copyright_str = _(L("Copyright"));
|
||||
// TRN "Slic3r _is licensed under the_ License"
|
||||
const wxString is_lecensed_str = _(L("is licensed under the"));
|
||||
const wxString license_str = _(L("GNU Affero General Public License, version 3"));
|
||||
const wxString contributors_str = _(L("Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous others."));
|
||||
const auto text = wxString::Format(
|
||||
"<html>"
|
||||
"<body bgcolor= %s link= %s>"
|
||||
"<font color=%s>"
|
||||
"Copyright © 2016-2019 Prusa Research. <br />"
|
||||
"Copyright © 2011-2018 Alessandro Ranellucci. <br />"
|
||||
"<a href=\"http://slic3r.org/\">Slic3r</a> is licensed under the "
|
||||
"<a href=\"http://www.gnu.org/licenses/agpl-3.0.html\">GNU Affero General Public License, version 3</a>."
|
||||
"%s © 2016-2019 Prusa Research. <br />"
|
||||
"%s © 2011-2018 Alessandro Ranellucci. <br />"
|
||||
"<a href=\"http://slic3r.org/\">Slic3r</a> %s "
|
||||
"<a href=\"http://www.gnu.org/licenses/agpl-3.0.html\">%s</a>."
|
||||
"<br /><br />"
|
||||
"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous others. "
|
||||
"Manual by Gary Hodgson. Inspired by the RepRap community. <br />"
|
||||
"Slic3r logo designed by Corey Daniels, <a href=\"http://www.famfamfam.com/lab/icons/silk/\">Silk Icon Set</a> designed by Mark James. "
|
||||
"%s"
|
||||
"</font>"
|
||||
"</body>"
|
||||
"</html>", bgr_clr_str, text_clr_str, text_clr_str);
|
||||
"</html>", bgr_clr_str, text_clr_str, text_clr_str,
|
||||
copyright_str, copyright_str,
|
||||
is_lecensed_str,
|
||||
license_str,
|
||||
contributors_str);
|
||||
m_html->SetPage(text);
|
||||
vsizer->Add(m_html, 1, wxEXPAND | wxBOTTOM, 10);
|
||||
m_html->Bind(wxEVT_HTML_LINK_CLICKED, &AboutDialog::onLinkClicked, this);
|
||||
|
@ -113,9 +120,6 @@ AboutDialog::AboutDialog()
|
|||
this->SetEscapeId(wxID_CLOSE);
|
||||
this->Bind(wxEVT_BUTTON, &AboutDialog::onCloseDialog, this, wxID_CLOSE);
|
||||
vsizer->Add(buttons, 0, wxEXPAND | wxRIGHT | wxBOTTOM, 3);
|
||||
|
||||
// this->Bind(wxEVT_LEFT_DOWN, &AboutDialog::onCloseDialog, this);
|
||||
// logo->Bind(wxEVT_LEFT_DOWN, &AboutDialog::onCloseDialog, this);
|
||||
|
||||
SetSizer(main_sizer);
|
||||
main_sizer->SetSizeHints(this);
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include <boost/filesystem.hpp>
|
||||
#include <boost/log/trivial.hpp>
|
||||
#include <boost/nowide/cstdio.hpp>
|
||||
#include "I18N.hpp"
|
||||
|
||||
namespace Slic3r {
|
||||
|
||||
|
@ -80,14 +81,14 @@ void BackgroundSlicingProcess::process_fff()
|
|||
// Perform the final post-processing of the export path by applying the print statistics over the file name.
|
||||
std::string export_path = m_fff_print->print_statistics().finalize_output_path(m_export_path);
|
||||
if (copy_file(m_temp_output_path, export_path) != 0)
|
||||
throw std::runtime_error("Copying of the temporary G-code to the output G-code failed");
|
||||
m_print->set_status(95, "Running post-processing scripts");
|
||||
throw std::runtime_error(_utf8(L("Copying of the temporary G-code to the output G-code failed")));
|
||||
m_print->set_status(95, _utf8(L("Running post-processing scripts")));
|
||||
run_post_process_scripts(export_path, m_fff_print->config());
|
||||
m_print->set_status(100, "G-code file exported to " + export_path);
|
||||
m_print->set_status(100, (boost::format(_utf8(L("G-code file exported to %1%"))) % export_path).str());
|
||||
} else if (! m_upload_job.empty()) {
|
||||
prepare_upload();
|
||||
} else {
|
||||
m_print->set_status(100, "Slicing complete");
|
||||
m_print->set_status(100, _utf8(L("Slicing complete")));
|
||||
}
|
||||
this->set_step_done(bspsGCodeFinalize);
|
||||
}
|
||||
|
@ -101,11 +102,11 @@ void BackgroundSlicingProcess::process_sla()
|
|||
if (! m_export_path.empty()) {
|
||||
const std::string export_path = m_sla_print->print_statistics().finalize_output_path(m_export_path);
|
||||
m_sla_print->export_raster(export_path);
|
||||
m_print->set_status(100, "Masked SLA file exported to " + export_path);
|
||||
m_print->set_status(100, (boost::format(_utf8(L("Masked SLA file exported to %1%"))) % export_path).str());
|
||||
} else if (! m_upload_job.empty()) {
|
||||
prepare_upload();
|
||||
} else {
|
||||
m_print->set_status(100, "Slicing complete");
|
||||
m_print->set_status(100, _utf8(L("Slicing complete")));
|
||||
}
|
||||
this->set_step_done(bspsGCodeFinalize);
|
||||
}
|
||||
|
@ -394,9 +395,9 @@ void BackgroundSlicingProcess::prepare_upload()
|
|||
/ boost::filesystem::unique_path("." SLIC3R_APP_KEY ".upload.%%%%-%%%%-%%%%-%%%%");
|
||||
|
||||
if (m_print == m_fff_print) {
|
||||
m_print->set_status(95, "Running post-processing scripts");
|
||||
m_print->set_status(95, _utf8(L("Running post-processing scripts")));
|
||||
if (copy_file(m_temp_output_path, source_path.string()) != 0) {
|
||||
throw std::runtime_error("Copying of the temporary G-code to the output G-code failed");
|
||||
throw std::runtime_error(_utf8(L("Copying of the temporary G-code to the output G-code failed")));
|
||||
}
|
||||
run_post_process_scripts(source_path.string(), m_fff_print->config());
|
||||
m_upload_job.upload_data.upload_path = m_fff_print->print_statistics().finalize_output_path(m_upload_job.upload_data.upload_path.string());
|
||||
|
@ -405,7 +406,7 @@ void BackgroundSlicingProcess::prepare_upload()
|
|||
m_sla_print->export_raster(source_path.string(), m_upload_job.upload_data.upload_path.string());
|
||||
}
|
||||
|
||||
m_print->set_status(100, (boost::format("Scheduling upload to `%1%`. See Window -> Print Host Upload Queue") % m_upload_job.printhost->get_host()).str());
|
||||
m_print->set_status(100, (boost::format(_utf8(L("Scheduling upload to `%1%`. See Window -> Print Host Upload Queue"))) % m_upload_job.printhost->get_host()).str());
|
||||
|
||||
m_upload_job.upload_data.source_path = std::move(source_path);
|
||||
|
||||
|
|
|
@ -68,14 +68,14 @@ void BedShapePanel::build_panel(ConfigOptionPoints* default_pt)
|
|||
auto optgroup = init_shape_options_page(_(L("Rectangular")));
|
||||
ConfigOptionDef def;
|
||||
def.type = coPoints;
|
||||
def.default_value = new ConfigOptionPoints{ Vec2d(200, 200) };
|
||||
def.set_default_value(new ConfigOptionPoints{ Vec2d(200, 200) });
|
||||
def.label = L("Size");
|
||||
def.tooltip = L("Size in X and Y of the rectangular plate.");
|
||||
Option option(def, "rect_size");
|
||||
optgroup->append_single_option_line(option);
|
||||
|
||||
def.type = coPoints;
|
||||
def.default_value = new ConfigOptionPoints{ Vec2d(0, 0) };
|
||||
def.set_default_value(new ConfigOptionPoints{ Vec2d(0, 0) });
|
||||
def.label = L("Origin");
|
||||
def.tooltip = L("Distance of the 0,0 G-code coordinate from the front left corner of the rectangle.");
|
||||
option = Option(def, "rect_origin");
|
||||
|
@ -83,7 +83,7 @@ void BedShapePanel::build_panel(ConfigOptionPoints* default_pt)
|
|||
|
||||
optgroup = init_shape_options_page(_(L("Circular")));
|
||||
def.type = coFloat;
|
||||
def.default_value = new ConfigOptionFloat(200);
|
||||
def.set_default_value(new ConfigOptionFloat(200));
|
||||
def.sidetext = L("mm");
|
||||
def.label = L("Diameter");
|
||||
def.tooltip = L("Diameter of the print bed. It is assumed that origin (0,0) is located in the center.");
|
||||
|
|
|
@ -12,9 +12,9 @@
|
|||
namespace Slic3r {
|
||||
namespace GUI {
|
||||
|
||||
ButtonsDescription::ButtonsDescription(wxWindow* parent, t_icon_descriptions* icon_descriptions) :
|
||||
ButtonsDescription::ButtonsDescription(wxWindow* parent, const std::vector<Entry> &entries) :
|
||||
wxDialog(parent, wxID_ANY, _(L("Buttons And Text Colors Description")), wxDefaultPosition, wxDefaultSize),
|
||||
m_icon_descriptions(icon_descriptions)
|
||||
m_entries(entries)
|
||||
{
|
||||
auto grid_sizer = new wxFlexGridSizer(3, 20, 20);
|
||||
|
||||
|
@ -22,18 +22,13 @@ ButtonsDescription::ButtonsDescription(wxWindow* parent, t_icon_descriptions* ic
|
|||
main_sizer->Add(grid_sizer, 0, wxEXPAND | wxALL, 20);
|
||||
|
||||
// Icon description
|
||||
for (auto pair : *m_icon_descriptions)
|
||||
for (const Entry &entry : m_entries)
|
||||
{
|
||||
auto icon = new wxStaticBitmap(this, wxID_ANY, /***/pair.first->bmp());
|
||||
auto icon = new wxStaticBitmap(this, wxID_ANY, entry.bitmap->bmp());
|
||||
grid_sizer->Add(icon, -1, wxALIGN_CENTRE_VERTICAL);
|
||||
|
||||
std::istringstream f(pair.second);
|
||||
std::string s;
|
||||
getline(f, s, ';');
|
||||
auto description = new wxStaticText(this, wxID_ANY, _(s));
|
||||
auto description = new wxStaticText(this, wxID_ANY, _utf8(entry.symbol));
|
||||
grid_sizer->Add(description, -1, wxALIGN_CENTRE_VERTICAL);
|
||||
getline(f, s, ';');
|
||||
description = new wxStaticText(this, wxID_ANY, _(s));
|
||||
description = new wxStaticText(this, wxID_ANY, _utf8(entry.explanation));
|
||||
grid_sizer->Add(description, -1, wxALIGN_CENTRE_VERTICAL | wxEXPAND);
|
||||
}
|
||||
|
||||
|
|
|
@ -9,14 +9,22 @@ class ScalableBitmap;
|
|||
namespace Slic3r {
|
||||
namespace GUI {
|
||||
|
||||
using t_icon_descriptions = std::vector<std::pair<ScalableBitmap*, std::string>>;
|
||||
|
||||
class ButtonsDescription : public wxDialog
|
||||
{
|
||||
t_icon_descriptions* m_icon_descriptions;
|
||||
public:
|
||||
ButtonsDescription(wxWindow* parent, t_icon_descriptions* icon_descriptions);
|
||||
struct Entry {
|
||||
Entry(ScalableBitmap *bitmap, const std::string &symbol, const std::string &explanation) : bitmap(bitmap), symbol(symbol), explanation(explanation) {}
|
||||
|
||||
ScalableBitmap *bitmap;
|
||||
std::string symbol;
|
||||
std::string explanation;
|
||||
};
|
||||
|
||||
ButtonsDescription(wxWindow* parent, const std::vector<Entry> &entries);
|
||||
~ButtonsDescription() {}
|
||||
|
||||
private:
|
||||
std::vector<Entry> m_entries;
|
||||
};
|
||||
|
||||
} // GUI
|
||||
|
|
|
@ -291,7 +291,13 @@ void ConfigWizardPage::append_spacer(int space)
|
|||
// Wizard pages
|
||||
|
||||
PageWelcome::PageWelcome(ConfigWizard *parent)
|
||||
: ConfigWizardPage(parent, wxString::Format(_(L("Welcome to the %s %s")), SLIC3R_APP_NAME, ConfigWizard::name()), _(L("Welcome")))
|
||||
: ConfigWizardPage(parent, wxString::Format(
|
||||
#ifdef __APPLE__
|
||||
_(L("Welcome to the %s Configuration Assistant"))
|
||||
#else
|
||||
_(L("Welcome to the %s Configuration Wizard"))
|
||||
#endif
|
||||
, SLIC3R_APP_NAME), _(L("Welcome")))
|
||||
, cbox_reset(nullptr)
|
||||
{
|
||||
if (wizard_p()->run_reason == ConfigWizard::RR_DATA_EMPTY) {
|
||||
|
@ -488,7 +494,7 @@ PageFirmware::PageFirmware(ConfigWizard *parent)
|
|||
, gcode_picker(nullptr)
|
||||
{
|
||||
append_text(_(L("Choose the type of firmware used by your printer.")));
|
||||
append_text(gcode_opt.tooltip);
|
||||
append_text(_(gcode_opt.tooltip));
|
||||
|
||||
wxArrayString choices;
|
||||
choices.Alloc(gcode_opt.enum_labels.size());
|
||||
|
@ -499,7 +505,7 @@ PageFirmware::PageFirmware(ConfigWizard *parent)
|
|||
gcode_picker = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, choices);
|
||||
const auto &enum_values = gcode_opt.enum_values;
|
||||
auto needle = enum_values.cend();
|
||||
if (gcode_opt.default_value != nullptr) {
|
||||
if (gcode_opt.default_value) {
|
||||
needle = std::find(enum_values.cbegin(), enum_values.cend(), gcode_opt.default_value->serialize());
|
||||
}
|
||||
if (needle != enum_values.cend()) {
|
||||
|
@ -544,14 +550,12 @@ PageDiameters::PageDiameters(ConfigWizard *parent)
|
|||
{
|
||||
spin_nozzle->SetDigits(2);
|
||||
spin_nozzle->SetIncrement(0.1);
|
||||
const auto &def_nozzle = *print_config_def.get("nozzle_diameter");
|
||||
auto *default_nozzle = dynamic_cast<const ConfigOptionFloats*>(def_nozzle.default_value);
|
||||
auto *default_nozzle = print_config_def.get("nozzle_diameter")->get_default_value<ConfigOptionFloats>();
|
||||
spin_nozzle->SetValue(default_nozzle != nullptr && default_nozzle->size() > 0 ? default_nozzle->get_at(0) : 0.5);
|
||||
|
||||
spin_filam->SetDigits(2);
|
||||
spin_filam->SetIncrement(0.25);
|
||||
const auto &def_filam = *print_config_def.get("filament_diameter");
|
||||
auto *default_filam = dynamic_cast<const ConfigOptionFloats*>(def_filam.default_value);
|
||||
auto *default_filam = print_config_def.get("filament_diameter")->get_default_value<ConfigOptionFloats>();
|
||||
spin_filam->SetValue(default_filam != nullptr && default_filam->size() > 0 ? default_filam->get_at(0) : 3.0);
|
||||
|
||||
append_text(_(L("Enter the diameter of your printer's hot end nozzle.")));
|
||||
|
@ -596,13 +600,13 @@ PageTemperatures::PageTemperatures(ConfigWizard *parent)
|
|||
spin_extr->SetIncrement(5.0);
|
||||
const auto &def_extr = *print_config_def.get("temperature");
|
||||
spin_extr->SetRange(def_extr.min, def_extr.max);
|
||||
auto *default_extr = dynamic_cast<const ConfigOptionInts*>(def_extr.default_value);
|
||||
auto *default_extr = def_extr.get_default_value<ConfigOptionInts>();
|
||||
spin_extr->SetValue(default_extr != nullptr && default_extr->size() > 0 ? default_extr->get_at(0) : 200);
|
||||
|
||||
spin_bed->SetIncrement(5.0);
|
||||
const auto &def_bed = *print_config_def.get("bed_temperature");
|
||||
spin_bed->SetRange(def_bed.min, def_bed.max);
|
||||
auto *default_bed = dynamic_cast<const ConfigOptionInts*>(def_bed.default_value);
|
||||
auto *default_bed = def_bed.get_default_value<ConfigOptionInts>();
|
||||
spin_bed->SetValue(default_bed != nullptr && default_bed->size() > 0 ? default_bed->get_at(0) : 0);
|
||||
|
||||
append_text(_(L("Enter the temperature needed for extruding your filament.")));
|
||||
|
@ -1177,12 +1181,12 @@ bool ConfigWizard::run(PresetBundle *preset_bundle, const PresetUpdater *updater
|
|||
const wxString& ConfigWizard::name(const bool from_menu/* = false*/)
|
||||
{
|
||||
// A different naming convention is used for the Wizard on Windows vs. OSX & GTK.
|
||||
#if WIN32
|
||||
static const wxString config_wizard_name = L("Configuration Wizard");
|
||||
static const wxString config_wizard_name_menu = L("Configuration &Wizard");
|
||||
#if __APPLE__
|
||||
static const wxString config_wizard_name = _(L("Configuration Assistant"));
|
||||
static const wxString config_wizard_name_menu = _(L("Configuration &Assistant"));
|
||||
#else
|
||||
static const wxString config_wizard_name = L("Configuration Assistant");
|
||||
static const wxString config_wizard_name_menu = L("Configuration &Assistant");
|
||||
static const wxString config_wizard_name = _(L("Configuration Wizard"));
|
||||
static const wxString config_wizard_name_menu = _(L("Configuration &Wizard"));
|
||||
#endif
|
||||
return from_menu ? config_wizard_name_menu : config_wizard_name;
|
||||
}
|
||||
|
|
|
@ -15,19 +15,7 @@ namespace Slic3r { namespace GUI {
|
|||
|
||||
wxString double_to_string(double const value, const int max_precision /*= 4*/)
|
||||
{
|
||||
if (value - int(value) == 0)
|
||||
return wxString::Format(_T("%i"), int(value));
|
||||
|
||||
int precision = max_precision;
|
||||
for (size_t p = 1; p < max_precision; p++)
|
||||
{
|
||||
double cur_val = pow(10, p)*value;
|
||||
if (cur_val - int(cur_val) == 0) {
|
||||
precision = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return wxNumberFormatter::ToString(value, precision, wxNumberFormatter::Style_None);
|
||||
return wxNumberFormatter::ToString(value, max_precision, wxNumberFormatter::Style_NoTrailingZeroes);
|
||||
}
|
||||
|
||||
void Field::PostInitialize()
|
||||
|
@ -215,7 +203,7 @@ void TextCtrl::BUILD() {
|
|||
case coFloatOrPercent:
|
||||
{
|
||||
text_value = double_to_string(m_opt.default_value->getFloat());
|
||||
if (static_cast<const ConfigOptionFloatOrPercent*>(m_opt.default_value)->percent)
|
||||
if (m_opt.get_default_value<ConfigOptionFloatOrPercent>()->percent)
|
||||
text_value += "%";
|
||||
break;
|
||||
}
|
||||
|
@ -230,19 +218,19 @@ void TextCtrl::BUILD() {
|
|||
case coFloat:
|
||||
{
|
||||
double val = m_opt.type == coFloats ?
|
||||
static_cast<const ConfigOptionFloats*>(m_opt.default_value)->get_at(m_opt_idx) :
|
||||
m_opt.get_default_value<ConfigOptionFloats>()->get_at(m_opt_idx) :
|
||||
m_opt.type == coFloat ?
|
||||
m_opt.default_value->getFloat() :
|
||||
static_cast<const ConfigOptionPercents*>(m_opt.default_value)->get_at(m_opt_idx);
|
||||
m_opt.get_default_value<ConfigOptionPercents>()->get_at(m_opt_idx);
|
||||
text_value = double_to_string(val);
|
||||
break;
|
||||
}
|
||||
case coString:
|
||||
text_value = static_cast<const ConfigOptionString*>(m_opt.default_value)->value;
|
||||
text_value = m_opt.get_default_value<ConfigOptionString>()->value;
|
||||
break;
|
||||
case coStrings:
|
||||
{
|
||||
const ConfigOptionStrings *vec = static_cast<const ConfigOptionStrings*>(m_opt.default_value);
|
||||
const ConfigOptionStrings *vec = m_opt.get_default_value<ConfigOptionStrings>();
|
||||
if (vec == nullptr || vec->empty()) break; //for the case of empty default value
|
||||
text_value = vec->get_at(m_opt_idx);
|
||||
break;
|
||||
|
@ -272,8 +260,8 @@ void TextCtrl::BUILD() {
|
|||
e.Skip();
|
||||
temp->GetToolTip()->Enable(true);
|
||||
#endif // __WXGTK__
|
||||
propagate_value();
|
||||
bEnterPressed = true;
|
||||
propagate_value();
|
||||
}), temp->GetId());
|
||||
}
|
||||
|
||||
|
@ -385,8 +373,8 @@ void CheckBox::BUILD() {
|
|||
|
||||
bool check_value = m_opt.type == coBool ?
|
||||
m_opt.default_value->getBool() : m_opt.type == coBools ?
|
||||
static_cast<const ConfigOptionBools*>(m_opt.default_value)->get_at(m_opt_idx) :
|
||||
false;
|
||||
m_opt.get_default_value<ConfigOptionBools>()->get_at(m_opt_idx) :
|
||||
false;
|
||||
|
||||
// Set Label as a string of at least one space simbol to correct system scaling of a CheckBox
|
||||
auto temp = new wxCheckBox(m_parent, wxID_ANY, wxString(" "), wxDefaultPosition, size);
|
||||
|
@ -439,7 +427,7 @@ void SpinCtrl::BUILD() {
|
|||
break;
|
||||
case coInts:
|
||||
{
|
||||
const ConfigOptionInts *vec = static_cast<const ConfigOptionInts*>(m_opt.default_value);
|
||||
const ConfigOptionInts *vec = m_opt.get_default_value<ConfigOptionInts>();
|
||||
if (vec == nullptr || vec->empty()) break;
|
||||
for (size_t id = 0; id < vec->size(); ++id)
|
||||
{
|
||||
|
@ -641,7 +629,7 @@ void Choice::set_selection()
|
|||
break;
|
||||
}
|
||||
case coEnum:{
|
||||
int id_value = static_cast<const ConfigOptionEnum<SeamPosition>*>(m_opt.default_value)->value; //!!
|
||||
int id_value = m_opt.get_default_value<ConfigOptionEnum<SeamPosition>>()->value; //!!
|
||||
field->SetSelection(id_value);
|
||||
break;
|
||||
}
|
||||
|
@ -661,7 +649,7 @@ void Choice::set_selection()
|
|||
break;
|
||||
}
|
||||
case coStrings:{
|
||||
text_value = static_cast<const ConfigOptionStrings*>(m_opt.default_value)->get_at(m_opt_idx);
|
||||
text_value = m_opt.get_default_value<ConfigOptionStrings>()->get_at(m_opt_idx);
|
||||
|
||||
size_t idx = 0;
|
||||
for (auto el : m_opt.enum_values)
|
||||
|
@ -898,7 +886,7 @@ void ColourPicker::BUILD()
|
|||
if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit);
|
||||
|
||||
// Validate the color
|
||||
wxString clr_str(static_cast<const ConfigOptionStrings*>(m_opt.default_value)->get_at(m_opt_idx));
|
||||
wxString clr_str(m_opt.get_default_value<ConfigOptionStrings>()->get_at(m_opt_idx));
|
||||
wxColour clr(clr_str);
|
||||
if (! clr.IsOk()) {
|
||||
clr = wxTransparentColour;
|
||||
|
@ -932,7 +920,7 @@ void PointCtrl::BUILD()
|
|||
|
||||
const wxSize field_size(4 * m_em_unit, -1);
|
||||
|
||||
auto default_pt = static_cast<const ConfigOptionPoints*>(m_opt.default_value)->values.at(0);
|
||||
auto default_pt = m_opt.get_default_value<ConfigOptionPoints>()->values.at(0);
|
||||
double val = default_pt(0);
|
||||
wxString X = val - int(val) == 0 ? wxString::Format(_T("%i"), int(val)) : wxNumberFormatter::ToString(val, 2, wxNumberFormatter::Style_None);
|
||||
val = default_pt(1);
|
||||
|
@ -1031,7 +1019,7 @@ void StaticText::BUILD()
|
|||
if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit);
|
||||
if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit);
|
||||
|
||||
const wxString legend(static_cast<const ConfigOptionString*>(m_opt.default_value)->value);
|
||||
const wxString legend = wxString::FromUTF8(m_opt.get_default_value<ConfigOptionString>()->value.c_str());
|
||||
auto temp = new wxStaticText(m_parent, wxID_ANY, legend, wxDefaultPosition, size, wxST_ELLIPSIZE_MIDDLE);
|
||||
temp->SetFont(Slic3r::GUI::wxGetApp().normal_font());
|
||||
temp->SetBackgroundStyle(wxBG_STYLE_PAINT);
|
||||
|
@ -1055,6 +1043,7 @@ void StaticText::msw_rescale()
|
|||
{
|
||||
wxStaticText* field = dynamic_cast<wxStaticText*>(window);
|
||||
field->SetSize(size);
|
||||
field->SetMinSize(size);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1066,7 +1055,7 @@ void SliderCtrl::BUILD()
|
|||
|
||||
auto temp = new wxBoxSizer(wxHORIZONTAL);
|
||||
|
||||
auto def_val = static_cast<const ConfigOptionInt*>(m_opt.default_value)->value;
|
||||
auto def_val = m_opt.get_default_value<ConfigOptionInt>()->value;
|
||||
auto min = m_opt.min == INT_MIN ? 0 : m_opt.min;
|
||||
auto max = m_opt.max == INT_MAX ? 100 : m_opt.max;
|
||||
|
||||
|
|
|
@ -225,6 +225,9 @@ public:
|
|||
m_em_unit = em_unit(m_parent);
|
||||
}
|
||||
|
||||
bool get_enter_pressed() const { return bEnterPressed; }
|
||||
void set_enter_pressed(bool pressed) { bEnterPressed = pressed; }
|
||||
|
||||
protected:
|
||||
RevertButton* m_Undo_btn = nullptr;
|
||||
// Bitmap and Tooltip text for m_Undo_btn. The wxButton will be updated only if the new wxBitmap pointer differs from the currently rendered one.
|
||||
|
@ -462,7 +465,7 @@ public:
|
|||
|
||||
void set_value(const std::string& value, bool change_event = false) {
|
||||
m_disable_change_event = !change_event;
|
||||
dynamic_cast<wxStaticText*>(window)->SetLabel(value);
|
||||
dynamic_cast<wxStaticText*>(window)->SetLabel(wxString::FromUTF8(value.data()));
|
||||
m_disable_change_event = false;
|
||||
}
|
||||
void set_value(const boost::any& value, bool change_event = false) {
|
||||
|
|
|
@ -765,6 +765,7 @@ FirmwareDialog::FirmwareDialog(wxWindow *parent) :
|
|||
auto *label_hex_picker = new wxStaticText(panel, wxID_ANY, _(L("Firmware image:")));
|
||||
p->hex_picker = new wxFilePickerCtrl(panel, wxID_ANY, wxEmptyString, wxFileSelectorPromptStr,
|
||||
"Hex files (*.hex)|*.hex|All files|*.*");
|
||||
p->hex_picker->GetPickerCtrl()->SetLabelText(_(L("Browse")));
|
||||
|
||||
auto *label_port_picker = new wxStaticText(panel, wxID_ANY, _(L("Serial port:")));
|
||||
p->port_picker = new wxComboBox(panel, wxID_ANY);
|
||||
|
|
|
@ -261,7 +261,7 @@ void GLCanvas3D::LayersEditing::select_object(const Model &model, int object_id)
|
|||
// Maximum height of an object changes when the object gets rotated or scaled.
|
||||
// Changing maximum height of an object will invalidate the layer heigth editing profile.
|
||||
// m_model_object->raw_bounding_box() is cached, therefore it is cheap even if this method is called frequently.
|
||||
float new_max_z = (m_model_object == nullptr) ? 0.f : m_model_object->raw_bounding_box().size().z();
|
||||
float new_max_z = (model_object_new == nullptr) ? 0.f : model_object_new->raw_bounding_box().size().z();
|
||||
if (m_model_object != model_object_new || this->last_object_id != object_id || m_object_max_z != new_max_z ||
|
||||
(model_object_new != nullptr && m_model_object->id() != model_object_new->id())) {
|
||||
m_layer_height_profile.clear();
|
||||
|
@ -795,7 +795,7 @@ bool GLCanvas3D::WarningTexture::_generate(const std::string& msg_utf8, const GL
|
|||
if (msg_utf8.empty())
|
||||
return false;
|
||||
|
||||
wxString msg = GUI::from_u8(msg_utf8);
|
||||
wxString msg = _(msg_utf8);
|
||||
|
||||
wxMemoryDC memDC;
|
||||
|
||||
|
@ -1783,7 +1783,7 @@ void GLCanvas3D::mirror_selection(Axis axis)
|
|||
{
|
||||
m_selection.mirror(axis);
|
||||
do_mirror();
|
||||
wxGetApp().obj_manipul()->update_settings_value(m_selection);
|
||||
wxGetApp().obj_manipul()->set_dirty();
|
||||
}
|
||||
|
||||
// Reload the 3D scene of
|
||||
|
@ -1828,6 +1828,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re
|
|||
// State of the sla_steps for all SLAPrintObjects.
|
||||
std::vector<SLASupportState> sla_support_state;
|
||||
|
||||
std::vector<size_t> instance_ids_selected;
|
||||
std::vector<size_t> map_glvolume_old_to_new(m_volumes.volumes.size(), size_t(-1));
|
||||
std::vector<GLVolume*> glvolumes_new;
|
||||
glvolumes_new.reserve(m_volumes.volumes.size());
|
||||
|
@ -1892,6 +1893,10 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re
|
|||
if (it != model_volume_state.end() && it->geometry_id == key.geometry_id)
|
||||
mvs = &(*it);
|
||||
}
|
||||
// Emplace instance ID of the volume. Both the aux volumes and model volumes share the same instance ID.
|
||||
// The wipe tower has its own wipe_tower_instance_id().
|
||||
if (m_selection.contains_volume(volume_id))
|
||||
instance_ids_selected.emplace_back(volume->geometry_id.second);
|
||||
if (mvs == nullptr || force_full_scene_refresh) {
|
||||
// This GLVolume will be released.
|
||||
if (volume->is_wipe_tower) {
|
||||
|
@ -1923,13 +1928,18 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re
|
|||
}
|
||||
}
|
||||
}
|
||||
sort_remove_duplicates(instance_ids_selected);
|
||||
}
|
||||
|
||||
if (m_reload_delayed)
|
||||
return;
|
||||
|
||||
bool update_object_list = false;
|
||||
|
||||
if (m_regenerate_volumes)
|
||||
{
|
||||
if (m_volumes.volumes != glvolumes_new)
|
||||
update_object_list = true;
|
||||
m_volumes.volumes = std::move(glvolumes_new);
|
||||
for (unsigned int obj_idx = 0; obj_idx < (unsigned int)m_model->objects.size(); ++ obj_idx) {
|
||||
const ModelObject &model_object = *m_model->objects[obj_idx];
|
||||
|
@ -1944,12 +1954,16 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re
|
|||
// New volume.
|
||||
m_volumes.load_object_volume(&model_object, obj_idx, volume_idx, instance_idx, m_color_by, m_use_VBOs && m_initialized);
|
||||
m_volumes.volumes.back()->geometry_id = key.geometry_id;
|
||||
update_object_list = true;
|
||||
} else {
|
||||
// Recycling an old GLVolume.
|
||||
GLVolume &existing_volume = *m_volumes.volumes[it->volume_idx];
|
||||
assert(existing_volume.geometry_id == key.geometry_id);
|
||||
// Update the Object/Volume/Instance indices into the current Model.
|
||||
existing_volume.composite_id = it->composite_id;
|
||||
if (existing_volume.composite_id != it->composite_id) {
|
||||
existing_volume.composite_id = it->composite_id;
|
||||
update_object_list = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2051,13 +2065,17 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re
|
|||
|
||||
update_volumes_colors_by_extruder();
|
||||
// Update selection indices based on the old/new GLVolumeCollection.
|
||||
m_selection.volumes_changed(map_glvolume_old_to_new);
|
||||
if (m_selection.get_mode() == Selection::Instance)
|
||||
m_selection.instances_changed(instance_ids_selected);
|
||||
else
|
||||
m_selection.volumes_changed(map_glvolume_old_to_new);
|
||||
}
|
||||
|
||||
m_gizmos.update_data(*this);
|
||||
|
||||
// Update the toolbar
|
||||
post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT));
|
||||
if (update_object_list)
|
||||
post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT));
|
||||
|
||||
// checks for geometry outside the print volume to render it accordingly
|
||||
if (!m_volumes.empty())
|
||||
|
@ -2108,7 +2126,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re
|
|||
// to force a reset of its cache
|
||||
auto manip = wxGetApp().obj_manipul();
|
||||
if (manip != nullptr)
|
||||
manip->update_settings_value(m_selection);
|
||||
manip->set_dirty();
|
||||
}
|
||||
|
||||
// and force this canvas to be redrawn.
|
||||
|
@ -2391,7 +2409,7 @@ void GLCanvas3D::on_key(wxKeyEvent& evt)
|
|||
m_mouse.ignore_left_up = true;
|
||||
m_dirty = true;
|
||||
}
|
||||
set_cursor(Standard);
|
||||
// set_cursor(Standard);
|
||||
}
|
||||
else if (keyCode == WXK_ALT)
|
||||
{
|
||||
|
@ -2402,7 +2420,7 @@ void GLCanvas3D::on_key(wxKeyEvent& evt)
|
|||
m_mouse.ignore_left_up = true;
|
||||
m_dirty = true;
|
||||
}
|
||||
set_cursor(Standard);
|
||||
// set_cursor(Standard);
|
||||
}
|
||||
else if (keyCode == WXK_CONTROL)
|
||||
m_dirty = true;
|
||||
|
@ -2414,7 +2432,7 @@ void GLCanvas3D::on_key(wxKeyEvent& evt)
|
|||
if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports))
|
||||
{
|
||||
m_mouse.ignore_left_up = false;
|
||||
set_cursor(Cross);
|
||||
// set_cursor(Cross);
|
||||
}
|
||||
}
|
||||
else if (keyCode == WXK_ALT)
|
||||
|
@ -2422,7 +2440,7 @@ void GLCanvas3D::on_key(wxKeyEvent& evt)
|
|||
if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports))
|
||||
{
|
||||
m_mouse.ignore_left_up = false;
|
||||
set_cursor(Cross);
|
||||
// set_cursor(Cross);
|
||||
}
|
||||
}
|
||||
else if (keyCode == WXK_CONTROL)
|
||||
|
@ -2723,7 +2741,11 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
|||
// propagate event through callback
|
||||
if (curr_idxs != m_selection.get_volume_idxs())
|
||||
{
|
||||
m_gizmos.refresh_on_off_state(m_selection);
|
||||
if (m_selection.is_empty())
|
||||
m_gizmos.reset_all_states();
|
||||
else
|
||||
m_gizmos.refresh_on_off_state(m_selection);
|
||||
|
||||
m_gizmos.update_data(*this);
|
||||
post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT));
|
||||
m_dirty = true;
|
||||
|
@ -2796,7 +2818,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
|||
|
||||
m_regenerate_volumes = false;
|
||||
m_selection.translate(cur_pos - m_mouse.drag.start_position_3D);
|
||||
wxGetApp().obj_manipul()->update_settings_value(m_selection);
|
||||
wxGetApp().obj_manipul()->set_dirty();
|
||||
m_dirty = true;
|
||||
}
|
||||
}
|
||||
|
@ -2856,7 +2878,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
|||
{
|
||||
m_regenerate_volumes = false;
|
||||
do_move();
|
||||
wxGetApp().obj_manipul()->update_settings_value(m_selection);
|
||||
wxGetApp().obj_manipul()->set_dirty();
|
||||
// Let the platter know that the dragging finished, so a delayed refresh
|
||||
// of the scene with the background processing data should be performed.
|
||||
post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED));
|
||||
|
@ -2875,7 +2897,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
|||
{
|
||||
m_selection.clear();
|
||||
m_selection.set_mode(Selection::Instance);
|
||||
wxGetApp().obj_manipul()->update_settings_value(m_selection);
|
||||
wxGetApp().obj_manipul()->set_dirty();
|
||||
m_gizmos.reset_all_states();
|
||||
m_gizmos.update_data(*this);
|
||||
post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT));
|
||||
|
@ -2902,7 +2924,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
|||
m_gizmos.refresh_on_off_state(m_selection);
|
||||
post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT));
|
||||
m_gizmos.update_data(*this);
|
||||
wxGetApp().obj_manipul()->update_settings_value(m_selection);
|
||||
wxGetApp().obj_manipul()->set_dirty();
|
||||
// forces a frame render to update the view before the context menu is shown
|
||||
render();
|
||||
|
||||
|
@ -3013,10 +3035,10 @@ void GLCanvas3D::set_tooltip(const std::string& tooltip) const
|
|||
if (tooltip.empty())
|
||||
m_canvas->UnsetToolTip();
|
||||
else
|
||||
t->SetTip(tooltip);
|
||||
t->SetTip(wxString::FromUTF8(tooltip.data()));
|
||||
}
|
||||
else if (!tooltip.empty()) // Avoid "empty" tooltips => unset of the empty tooltip leads to application crash under OSX
|
||||
m_canvas->SetToolTip(tooltip);
|
||||
m_canvas->SetToolTip(wxString::FromUTF8(tooltip.data()));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3367,7 +3389,7 @@ bool GLCanvas3D::_init_toolbar()
|
|||
#if ENABLE_SVG_ICONS
|
||||
item.icon_filename = "add.svg";
|
||||
#endif // ENABLE_SVG_ICONS
|
||||
item.tooltip = GUI::L_str("Add...") + " [" + GUI::shortkey_ctrl_prefix() + "I]";
|
||||
item.tooltip = _utf8(L("Add...")) + " [" + GUI::shortkey_ctrl_prefix() + "I]";
|
||||
item.sprite_id = 0;
|
||||
item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_ADD)); };
|
||||
if (!m_toolbar.add_item(item))
|
||||
|
@ -3377,7 +3399,7 @@ bool GLCanvas3D::_init_toolbar()
|
|||
#if ENABLE_SVG_ICONS
|
||||
item.icon_filename = "remove.svg";
|
||||
#endif // ENABLE_SVG_ICONS
|
||||
item.tooltip = GUI::L_str("Delete") + " [Del]";
|
||||
item.tooltip = _utf8(L("Delete")) + " [Del]";
|
||||
item.sprite_id = 1;
|
||||
item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_DELETE)); };
|
||||
item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_delete(); };
|
||||
|
@ -3388,7 +3410,7 @@ bool GLCanvas3D::_init_toolbar()
|
|||
#if ENABLE_SVG_ICONS
|
||||
item.icon_filename = "delete_all.svg";
|
||||
#endif // ENABLE_SVG_ICONS
|
||||
item.tooltip = GUI::L_str("Delete all") + " [" + GUI::shortkey_ctrl_prefix() + "Del]";
|
||||
item.tooltip = _utf8(L("Delete all")) + " [" + GUI::shortkey_ctrl_prefix() + "Del]";
|
||||
item.sprite_id = 2;
|
||||
item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_DELETE_ALL)); };
|
||||
item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_delete_all(); };
|
||||
|
@ -3399,7 +3421,7 @@ bool GLCanvas3D::_init_toolbar()
|
|||
#if ENABLE_SVG_ICONS
|
||||
item.icon_filename = "arrange.svg";
|
||||
#endif // ENABLE_SVG_ICONS
|
||||
item.tooltip = GUI::L_str("Arrange [A]");
|
||||
item.tooltip = _utf8(L("Arrange")) + " [A]";
|
||||
item.sprite_id = 3;
|
||||
item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_ARRANGE)); };
|
||||
item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_arrange(); };
|
||||
|
@ -3413,7 +3435,7 @@ bool GLCanvas3D::_init_toolbar()
|
|||
#if ENABLE_SVG_ICONS
|
||||
item.icon_filename = "copy.svg";
|
||||
#endif // ENABLE_SVG_ICONS
|
||||
item.tooltip = GUI::L_str("Copy") + " [" + GUI::shortkey_ctrl_prefix() + "C]";
|
||||
item.tooltip = _utf8(L("Copy")) + " [" + GUI::shortkey_ctrl_prefix() + "C]";
|
||||
item.sprite_id = 4;
|
||||
item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_COPY)); };
|
||||
item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_copy(); };
|
||||
|
@ -3424,7 +3446,7 @@ bool GLCanvas3D::_init_toolbar()
|
|||
#if ENABLE_SVG_ICONS
|
||||
item.icon_filename = "paste.svg";
|
||||
#endif // ENABLE_SVG_ICONS
|
||||
item.tooltip = GUI::L_str("Paste") + " [" + GUI::shortkey_ctrl_prefix() + "V]";
|
||||
item.tooltip = _utf8(L("Paste")) + " [" + GUI::shortkey_ctrl_prefix() + "V]";
|
||||
item.sprite_id = 5;
|
||||
item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_PASTE)); };
|
||||
item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_paste(); };
|
||||
|
@ -3438,7 +3460,7 @@ bool GLCanvas3D::_init_toolbar()
|
|||
#if ENABLE_SVG_ICONS
|
||||
item.icon_filename = "instance_add.svg";
|
||||
#endif // ENABLE_SVG_ICONS
|
||||
item.tooltip = GUI::L_str("Add instance [+]");
|
||||
item.tooltip = _utf8(L("Add instance")) + " [+]";
|
||||
item.sprite_id = 6;
|
||||
item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_MORE)); };
|
||||
item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple; };
|
||||
|
@ -3450,7 +3472,7 @@ bool GLCanvas3D::_init_toolbar()
|
|||
#if ENABLE_SVG_ICONS
|
||||
item.icon_filename = "instance_remove.svg";
|
||||
#endif // ENABLE_SVG_ICONS
|
||||
item.tooltip = GUI::L_str("Remove instance [-]");
|
||||
item.tooltip = _utf8(L("Remove instance")) + " [-]";
|
||||
item.sprite_id = 7;
|
||||
item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_FEWER)); };
|
||||
item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple; };
|
||||
|
@ -3465,7 +3487,7 @@ bool GLCanvas3D::_init_toolbar()
|
|||
#if ENABLE_SVG_ICONS
|
||||
item.icon_filename = "split_objects.svg";
|
||||
#endif // ENABLE_SVG_ICONS
|
||||
item.tooltip = GUI::L_str("Split to objects");
|
||||
item.tooltip = _utf8(L("Split to objects"));
|
||||
item.sprite_id = 8;
|
||||
item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_SPLIT_OBJECTS)); };
|
||||
item.visibility_callback = GLToolbarItem::Default_Visibility_Callback;
|
||||
|
@ -3477,7 +3499,7 @@ bool GLCanvas3D::_init_toolbar()
|
|||
#if ENABLE_SVG_ICONS
|
||||
item.icon_filename = "split_parts.svg";
|
||||
#endif // ENABLE_SVG_ICONS
|
||||
item.tooltip = GUI::L_str("Split to parts");
|
||||
item.tooltip = _utf8(L("Split to parts"));
|
||||
item.sprite_id = 9;
|
||||
item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_SPLIT_VOLUMES)); };
|
||||
item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple; };
|
||||
|
@ -3490,9 +3512,9 @@ bool GLCanvas3D::_init_toolbar()
|
|||
|
||||
item.name = "layersediting";
|
||||
#if ENABLE_SVG_ICONS
|
||||
item.icon_filename = "layers.svg";
|
||||
item.icon_filename = "layers_white.svg";
|
||||
#endif // ENABLE_SVG_ICONS
|
||||
item.tooltip = GUI::L_str("Layers editing");
|
||||
item.tooltip = _utf8(L("Layers editing"));
|
||||
item.sprite_id = 10;
|
||||
item.is_toggable = true;
|
||||
item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_LAYERSEDITING)); };
|
||||
|
@ -3755,55 +3777,52 @@ void GLCanvas3D::_rectangular_selection_picking_pass() const
|
|||
if (m_multisample_allowed)
|
||||
glsafe(::glEnable(GL_MULTISAMPLE));
|
||||
|
||||
int width = (int)m_rectangle_selection.get_width();
|
||||
int height = (int)m_rectangle_selection.get_height();
|
||||
int width = std::max((int)m_rectangle_selection.get_width(), 1);
|
||||
int height = std::max((int)m_rectangle_selection.get_height(), 1);
|
||||
int px_count = width * height;
|
||||
|
||||
if (px_count > 0)
|
||||
int left = (int)m_rectangle_selection.get_left();
|
||||
int top = get_canvas_size().get_height() - (int)m_rectangle_selection.get_top();
|
||||
if ((left >= 0) && (top >= 0))
|
||||
{
|
||||
int left = (int)m_rectangle_selection.get_left();
|
||||
int top = get_canvas_size().get_height() - (int)m_rectangle_selection.get_top();
|
||||
if ((left >= 0) && (top >= 0))
|
||||
{
|
||||
#define USE_PARALLEL 1
|
||||
#if USE_PARALLEL
|
||||
struct Pixel
|
||||
struct Pixel
|
||||
{
|
||||
std::array<GLubyte, 4> data;
|
||||
int id() const { return data[0] + (data[1] << 8) + (data[2] << 16); }
|
||||
};
|
||||
|
||||
std::vector<Pixel> frame(px_count);
|
||||
glsafe(::glReadPixels(left, top, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (void*)frame.data()));
|
||||
|
||||
tbb::spin_mutex mutex;
|
||||
tbb::parallel_for(tbb::blocked_range<size_t>(0, frame.size(), (size_t)width),
|
||||
[this, &frame, &idxs, &mutex](const tbb::blocked_range<size_t>& range) {
|
||||
for (size_t i = range.begin(); i < range.end(); ++i)
|
||||
{
|
||||
std::array<GLubyte, 4> data;
|
||||
int id() const { return data[0] + (data[1] << 8) + (data[2] << 16); }
|
||||
};
|
||||
|
||||
std::vector<Pixel> frame(px_count);
|
||||
glsafe(::glReadPixels(left, top, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (void*)frame.data()));
|
||||
|
||||
tbb::spin_mutex mutex;
|
||||
tbb::parallel_for(tbb::blocked_range<size_t>(0, frame.size(), (size_t)width),
|
||||
[this, &frame, &idxs, &mutex](const tbb::blocked_range<size_t>& range) {
|
||||
for (size_t i = range.begin(); i < range.end(); ++i)
|
||||
int volume_id = frame[i].id();
|
||||
if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size()))
|
||||
{
|
||||
int volume_id = frame[i].id();
|
||||
if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size()))
|
||||
{
|
||||
mutex.lock();
|
||||
idxs.insert(volume_id);
|
||||
mutex.unlock();
|
||||
}
|
||||
mutex.lock();
|
||||
idxs.insert(volume_id);
|
||||
mutex.unlock();
|
||||
}
|
||||
}
|
||||
);
|
||||
#else
|
||||
std::vector<GLubyte> frame(4 * px_count);
|
||||
glsafe(::glReadPixels(left, top, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (void*)frame.data()));
|
||||
|
||||
for (int i = 0; i < px_count; ++i)
|
||||
{
|
||||
int px_id = 4 * i;
|
||||
int volume_id = frame[px_id] + (frame[px_id + 1] << 8) + (frame[px_id + 2] << 16);
|
||||
if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size()))
|
||||
idxs.insert(volume_id);
|
||||
}
|
||||
#endif // USE_PARALLEL
|
||||
}
|
||||
);
|
||||
#else
|
||||
std::vector<GLubyte> frame(4 * px_count);
|
||||
glsafe(::glReadPixels(left, top, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (void*)frame.data()));
|
||||
|
||||
for (int i = 0; i < px_count; ++i)
|
||||
{
|
||||
int px_id = 4 * i;
|
||||
int volume_id = frame[px_id] + (frame[px_id + 1] << 8) + (frame[px_id + 2] << 16);
|
||||
if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size()))
|
||||
idxs.insert(volume_id);
|
||||
}
|
||||
#endif // USE_PARALLEL
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5704,7 +5723,11 @@ void GLCanvas3D::_update_selection_from_hover()
|
|||
m_selection.remove(i);
|
||||
}
|
||||
|
||||
m_gizmos.refresh_on_off_state(m_selection);
|
||||
if (m_selection.is_empty())
|
||||
m_gizmos.reset_all_states();
|
||||
else
|
||||
m_gizmos.refresh_on_off_state(m_selection);
|
||||
|
||||
m_gizmos.update_data(*this);
|
||||
post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT));
|
||||
m_dirty = true;
|
||||
|
|
|
@ -8,110 +8,110 @@
|
|||
namespace Slic3r {
|
||||
namespace GUI {
|
||||
|
||||
void GLSelectionRectangle::start_dragging(const Vec2d& mouse_position, EState state)
|
||||
{
|
||||
if (is_dragging() || (state == Off))
|
||||
return;
|
||||
void GLSelectionRectangle::start_dragging(const Vec2d& mouse_position, EState state)
|
||||
{
|
||||
if (is_dragging() || (state == Off))
|
||||
return;
|
||||
|
||||
m_state = state;
|
||||
m_start_corner = mouse_position;
|
||||
m_end_corner = mouse_position;
|
||||
}
|
||||
|
||||
void GLSelectionRectangle::dragging(const Vec2d& mouse_position)
|
||||
{
|
||||
if (!is_dragging())
|
||||
return;
|
||||
|
||||
m_end_corner = mouse_position;
|
||||
}
|
||||
|
||||
std::vector<unsigned int> GLSelectionRectangle::stop_dragging(const GLCanvas3D& canvas, const std::vector<Vec3d>& points)
|
||||
{
|
||||
std::vector<unsigned int> out;
|
||||
|
||||
if (!is_dragging())
|
||||
return out;
|
||||
|
||||
m_state = Off;
|
||||
|
||||
const Camera& camera = canvas.get_camera();
|
||||
const std::array<int, 4>& viewport = camera.get_viewport();
|
||||
const Transform3d& modelview_matrix = camera.get_view_matrix();
|
||||
const Transform3d& projection_matrix = camera.get_projection_matrix();
|
||||
|
||||
// bounding box created from the rectangle corners - will take care of order of the corners
|
||||
BoundingBox rectangle(Points{ Point(m_start_corner.cast<int>()), Point(m_end_corner.cast<int>()) });
|
||||
|
||||
// Iterate over all points and determine whether they're in the rectangle.
|
||||
for (unsigned int i = 0; i<points.size(); ++i) {
|
||||
const Vec3d& point = points[i];
|
||||
GLdouble out_x, out_y, out_z;
|
||||
::gluProject((GLdouble)point(0), (GLdouble)point(1), (GLdouble)point(2), (GLdouble*)modelview_matrix.data(), (GLdouble*)projection_matrix.data(), (GLint*)viewport.data(), &out_x, &out_y, &out_z);
|
||||
out_y = canvas.get_canvas_size().get_height() - out_y;
|
||||
|
||||
if (rectangle.contains(Point(out_x, out_y)))
|
||||
out.push_back(i);
|
||||
m_state = state;
|
||||
m_start_corner = mouse_position;
|
||||
m_end_corner = mouse_position;
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
void GLSelectionRectangle::dragging(const Vec2d& mouse_position)
|
||||
{
|
||||
if (!is_dragging())
|
||||
return;
|
||||
|
||||
m_end_corner = mouse_position;
|
||||
}
|
||||
|
||||
std::vector<unsigned int> GLSelectionRectangle::stop_dragging(const GLCanvas3D& canvas, const std::vector<Vec3d>& points)
|
||||
{
|
||||
std::vector<unsigned int> out;
|
||||
|
||||
if (!is_dragging())
|
||||
return out;
|
||||
|
||||
void GLSelectionRectangle::stop_dragging()
|
||||
{
|
||||
if (is_dragging())
|
||||
m_state = Off;
|
||||
}
|
||||
|
||||
void GLSelectionRectangle::render(const GLCanvas3D& canvas) const
|
||||
{
|
||||
if (!is_dragging())
|
||||
return;
|
||||
const Camera& camera = canvas.get_camera();
|
||||
const std::array<int, 4>& viewport = camera.get_viewport();
|
||||
const Transform3d& modelview_matrix = camera.get_view_matrix();
|
||||
const Transform3d& projection_matrix = camera.get_projection_matrix();
|
||||
|
||||
float zoom = canvas.get_camera().zoom;
|
||||
float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f;
|
||||
// bounding box created from the rectangle corners - will take care of order of the corners
|
||||
BoundingBox rectangle(Points{ Point(m_start_corner.cast<int>()), Point(m_end_corner.cast<int>()) });
|
||||
|
||||
Size cnv_size = canvas.get_canvas_size();
|
||||
float cnv_half_width = 0.5f * (float)cnv_size.get_width();
|
||||
float cnv_half_height = 0.5f * (float)cnv_size.get_height();
|
||||
if ((cnv_half_width == 0.0f) || (cnv_half_height == 0.0f))
|
||||
return;
|
||||
// Iterate over all points and determine whether they're in the rectangle.
|
||||
for (unsigned int i = 0; i<points.size(); ++i) {
|
||||
const Vec3d& point = points[i];
|
||||
GLdouble out_x, out_y, out_z;
|
||||
::gluProject((GLdouble)point(0), (GLdouble)point(1), (GLdouble)point(2), (GLdouble*)modelview_matrix.data(), (GLdouble*)projection_matrix.data(), (GLint*)viewport.data(), &out_x, &out_y, &out_z);
|
||||
out_y = canvas.get_canvas_size().get_height() - out_y;
|
||||
|
||||
Vec2d start(m_start_corner(0) - cnv_half_width, cnv_half_height - m_start_corner(1));
|
||||
Vec2d end(m_end_corner(0) - cnv_half_width, cnv_half_height - m_end_corner(1));
|
||||
if (rectangle.contains(Point(out_x, out_y)))
|
||||
out.push_back(i);
|
||||
}
|
||||
|
||||
float left = (float)std::min(start(0), end(0)) * inv_zoom;
|
||||
float top = (float)std::max(start(1), end(1)) * inv_zoom;
|
||||
float right = (float)std::max(start(0), end(0)) * inv_zoom;
|
||||
float bottom = (float)std::min(start(1), end(1)) * inv_zoom;
|
||||
return out;
|
||||
}
|
||||
|
||||
glsafe(::glLineWidth(1.5f));
|
||||
float color[3];
|
||||
color[0] = (m_state == Select) ? 0.3f : 1.0f;
|
||||
color[1] = (m_state == Select) ? 1.0f : 0.3f;
|
||||
color[2] = 0.3f;
|
||||
glsafe(::glColor3fv(color));
|
||||
void GLSelectionRectangle::stop_dragging()
|
||||
{
|
||||
if (is_dragging())
|
||||
m_state = Off;
|
||||
}
|
||||
|
||||
glsafe(::glDisable(GL_DEPTH_TEST));
|
||||
void GLSelectionRectangle::render(const GLCanvas3D& canvas) const
|
||||
{
|
||||
if (!is_dragging())
|
||||
return;
|
||||
|
||||
glsafe(::glPushMatrix());
|
||||
glsafe(::glLoadIdentity());
|
||||
float zoom = canvas.get_camera().zoom;
|
||||
float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f;
|
||||
|
||||
glsafe(::glPushAttrib(GL_ENABLE_BIT));
|
||||
glsafe(::glLineStipple(4, 0xAAAA));
|
||||
glsafe(::glEnable(GL_LINE_STIPPLE));
|
||||
Size cnv_size = canvas.get_canvas_size();
|
||||
float cnv_half_width = 0.5f * (float)cnv_size.get_width();
|
||||
float cnv_half_height = 0.5f * (float)cnv_size.get_height();
|
||||
if ((cnv_half_width == 0.0f) || (cnv_half_height == 0.0f))
|
||||
return;
|
||||
|
||||
::glBegin(GL_LINE_LOOP);
|
||||
::glVertex2f((GLfloat)left, (GLfloat)bottom);
|
||||
::glVertex2f((GLfloat)right, (GLfloat)bottom);
|
||||
::glVertex2f((GLfloat)right, (GLfloat)top);
|
||||
::glVertex2f((GLfloat)left, (GLfloat)top);
|
||||
glsafe(::glEnd());
|
||||
Vec2d start(m_start_corner(0) - cnv_half_width, cnv_half_height - m_start_corner(1));
|
||||
Vec2d end(m_end_corner(0) - cnv_half_width, cnv_half_height - m_end_corner(1));
|
||||
|
||||
glsafe(::glPopAttrib());
|
||||
float left = (float)std::min(start(0), end(0)) * inv_zoom;
|
||||
float top = (float)std::max(start(1), end(1)) * inv_zoom;
|
||||
float right = (float)std::max(start(0), end(0)) * inv_zoom;
|
||||
float bottom = (float)std::min(start(1), end(1)) * inv_zoom;
|
||||
|
||||
glsafe(::glPopMatrix());
|
||||
}
|
||||
glsafe(::glLineWidth(1.5f));
|
||||
float color[3];
|
||||
color[0] = (m_state == Select) ? 0.3f : 1.0f;
|
||||
color[1] = (m_state == Select) ? 1.0f : 0.3f;
|
||||
color[2] = 0.3f;
|
||||
glsafe(::glColor3fv(color));
|
||||
|
||||
glsafe(::glDisable(GL_DEPTH_TEST));
|
||||
|
||||
glsafe(::glPushMatrix());
|
||||
glsafe(::glLoadIdentity());
|
||||
|
||||
glsafe(::glPushAttrib(GL_ENABLE_BIT));
|
||||
glsafe(::glLineStipple(4, 0xAAAA));
|
||||
glsafe(::glEnable(GL_LINE_STIPPLE));
|
||||
|
||||
::glBegin(GL_LINE_LOOP);
|
||||
::glVertex2f((GLfloat)left, (GLfloat)bottom);
|
||||
::glVertex2f((GLfloat)right, (GLfloat)bottom);
|
||||
::glVertex2f((GLfloat)right, (GLfloat)top);
|
||||
::glVertex2f((GLfloat)left, (GLfloat)top);
|
||||
glsafe(::glEnd());
|
||||
|
||||
glsafe(::glPopAttrib());
|
||||
|
||||
glsafe(::glPopMatrix());
|
||||
}
|
||||
|
||||
} // namespace GUI
|
||||
} // namespace Slic3r
|
||||
|
|
|
@ -44,6 +44,10 @@
|
|||
#include "SysInfoDialog.hpp"
|
||||
#include "KBShortcutsDialog.hpp"
|
||||
|
||||
#ifdef __WXMSW__
|
||||
#include <Shlobj.h>
|
||||
#endif // __WXMSW__
|
||||
|
||||
namespace Slic3r {
|
||||
namespace GUI {
|
||||
|
||||
|
@ -182,6 +186,10 @@ bool GUI_App::on_init_inner()
|
|||
app_config->set("version", SLIC3R_VERSION);
|
||||
app_config->save();
|
||||
|
||||
#ifdef __WXMSW__
|
||||
associate_3mf_files();
|
||||
#endif // __WXMSW__
|
||||
|
||||
preset_updater = new PresetUpdater();
|
||||
Bind(EVT_SLIC3R_VERSION_ONLINE, [this](const wxCommandEvent &evt) {
|
||||
app_config->set("version_online", into_u8(evt.GetString()));
|
||||
|
@ -303,13 +311,13 @@ bool GUI_App::dark_mode_menus()
|
|||
void GUI_App::init_label_colours()
|
||||
{
|
||||
if (dark_mode()) {
|
||||
m_color_label_modified = wxColour(252, 77, 1);
|
||||
m_color_label_sys = wxColour(26, 132, 57);
|
||||
}
|
||||
else {
|
||||
m_color_label_modified = wxColour(253, 111, 40);
|
||||
m_color_label_sys = wxColour(115, 220, 103);
|
||||
}
|
||||
else {
|
||||
m_color_label_modified = wxColour(252, 77, 1);
|
||||
m_color_label_sys = wxColour(26, 132, 57);
|
||||
}
|
||||
m_color_label_default = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
|
||||
}
|
||||
|
||||
|
@ -340,15 +348,19 @@ void GUI_App::init_fonts()
|
|||
#endif /*__WXMAC__*/
|
||||
}
|
||||
|
||||
void GUI_App::update_fonts()
|
||||
void GUI_App::update_fonts(const MainFrame *main_frame)
|
||||
{
|
||||
/* Only normal and bold fonts are used for an application rescale,
|
||||
* because of under MSW small and normal fonts are the same.
|
||||
* To avoid same rescaling twice, just fill this values
|
||||
* from rescaled MainFrame
|
||||
*/
|
||||
m_normal_font = mainframe->normal_font();
|
||||
m_bold_font = mainframe->normal_font().Bold();
|
||||
if (main_frame == nullptr)
|
||||
main_frame = this->mainframe;
|
||||
m_normal_font = main_frame->normal_font();
|
||||
m_small_font = m_normal_font;
|
||||
m_bold_font = main_frame->normal_font().Bold();
|
||||
m_em_unit = main_frame->em_unit();
|
||||
}
|
||||
|
||||
void GUI_App::set_label_clr_modified(const wxColour& clr) {
|
||||
|
@ -737,10 +749,10 @@ void GUI_App::add_config_menu(wxMenuBar *menu)
|
|||
* and draw user's attention to the application restarting after a language change
|
||||
*/
|
||||
wxMessageDialog dialog(nullptr,
|
||||
_(L("Application will be restarted after language change.")) + "\n" +
|
||||
_(L("3D-Scene will be cleaned.")) + "\n\n" +
|
||||
_(L("Please, check your changes before.")),
|
||||
_(L("Attention!")),
|
||||
_(L("Switching the language will trigger application restart.\n"
|
||||
"You will lose content of the plater.")) + "\n\n" +
|
||||
_(L("Do you want to proceed?")),
|
||||
wxString(SLIC3R_APP_NAME) + " - " + _(L("Language selection")),
|
||||
wxICON_QUESTION | wxOK | wxCANCEL);
|
||||
if ( dialog.ShowModal() == wxID_CANCEL)
|
||||
return;
|
||||
|
@ -773,21 +785,21 @@ void GUI_App::add_config_menu(wxMenuBar *menu)
|
|||
// to notify the user whether he is aware that some preset changes will be lost.
|
||||
bool GUI_App::check_unsaved_changes()
|
||||
{
|
||||
std::string dirty;
|
||||
wxString dirty;
|
||||
PrinterTechnology printer_technology = preset_bundle->printers.get_edited_preset().printer_technology();
|
||||
for (Tab *tab : tabs_list)
|
||||
if (tab->supports_printer_technology(printer_technology) && tab->current_preset_is_dirty())
|
||||
if (dirty.empty())
|
||||
dirty = tab->name();
|
||||
dirty = _(tab->name());
|
||||
else
|
||||
dirty += std::string(", ") + tab->name();
|
||||
dirty += wxString(", ") + _(tab->name());
|
||||
if (dirty.empty())
|
||||
// No changes, the application may close or reload presets.
|
||||
return true;
|
||||
// Ask the user.
|
||||
wxMessageDialog dialog(mainframe,
|
||||
_(L("You have unsaved changes ")) + dirty + _(L(". Discard changes and continue anyway?")),
|
||||
_(L("Unsaved Presets")),
|
||||
_(L("The following presets were modified: ")) + dirty + "\n" + _(L("Discard changes and continue anyway?")),
|
||||
wxString(SLIC3R_APP_NAME) + " - " + _(L("Unsaved Presets")),
|
||||
wxICON_QUESTION | wxYES_NO | wxNO_DEFAULT);
|
||||
return dialog.ShowModal() == wxID_YES;
|
||||
}
|
||||
|
@ -807,7 +819,7 @@ void GUI_App::load_current_presets()
|
|||
this->plater()->set_printer_technology(printer_technology);
|
||||
for (Tab *tab : tabs_list)
|
||||
if (tab->supports_printer_technology(printer_technology)) {
|
||||
if (tab->name() == "printer")
|
||||
if (tab->type() == Preset::TYPE_PRINTER)
|
||||
static_cast<TabPrinter*>(tab)->update_pages();
|
||||
tab->load_current_preset();
|
||||
}
|
||||
|
@ -947,5 +959,64 @@ void GUI_App::window_pos_sanitize(wxTopLevelWindow* window)
|
|||
// }
|
||||
|
||||
|
||||
#ifdef __WXMSW__
|
||||
void GUI_App::associate_3mf_files()
|
||||
{
|
||||
// see as reference: https://stackoverflow.com/questions/20245262/c-program-needs-an-file-association
|
||||
|
||||
auto reg_set = [](HKEY hkeyHive, const wchar_t* pszVar, const wchar_t* pszValue)
|
||||
{
|
||||
wchar_t szValueCurrent[1000];
|
||||
DWORD dwType;
|
||||
DWORD dwSize = sizeof(szValueCurrent);
|
||||
|
||||
int iRC = ::RegGetValueW(hkeyHive, pszVar, nullptr, RRF_RT_ANY, &dwType, szValueCurrent, &dwSize);
|
||||
|
||||
bool bDidntExist = iRC == ERROR_FILE_NOT_FOUND;
|
||||
|
||||
if ((iRC != ERROR_SUCCESS) && !bDidntExist)
|
||||
// an error occurred
|
||||
return;
|
||||
|
||||
if (!bDidntExist)
|
||||
{
|
||||
if (dwType != REG_SZ)
|
||||
// invalid type
|
||||
return;
|
||||
|
||||
if (::wcscmp(szValueCurrent, pszValue) == 0)
|
||||
// value already set
|
||||
return;
|
||||
}
|
||||
|
||||
DWORD dwDisposition;
|
||||
HKEY hkey;
|
||||
iRC = ::RegCreateKeyExW(hkeyHive, pszVar, 0, 0, 0, KEY_ALL_ACCESS, nullptr, &hkey, &dwDisposition);
|
||||
if (iRC == ERROR_SUCCESS)
|
||||
iRC = ::RegSetValueExW(hkey, L"", 0, REG_SZ, (BYTE*)pszValue, (::wcslen(pszValue) + 1) * sizeof(wchar_t));
|
||||
|
||||
RegCloseKey(hkey);
|
||||
};
|
||||
|
||||
wchar_t app_path[MAX_PATH];
|
||||
::GetModuleFileNameW(nullptr, app_path, sizeof(app_path));
|
||||
|
||||
std::wstring prog_path = L"\"" + std::wstring(app_path) + L"\"";
|
||||
std::wstring prog_id = L"Prusa.Slicer.1";
|
||||
std::wstring prog_desc = L"PrusaSlicer";
|
||||
std::wstring prog_command = prog_path + L" \"%1\"";
|
||||
std::wstring reg_base = L"Software\\Classes";
|
||||
std::wstring reg_extension = reg_base + L"\\.3mf";
|
||||
std::wstring reg_prog_id = reg_base + L"\\" + prog_id;
|
||||
std::wstring reg_prog_id_command = reg_prog_id + L"\\Shell\\Open\\Command";
|
||||
|
||||
reg_set(HKEY_CURRENT_USER, reg_extension.c_str(), prog_id.c_str());
|
||||
reg_set(HKEY_CURRENT_USER, reg_prog_id.c_str(), prog_desc.c_str());
|
||||
reg_set(HKEY_CURRENT_USER, reg_prog_id_command.c_str(), prog_command.c_str());
|
||||
|
||||
::SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nullptr, nullptr);
|
||||
}
|
||||
#endif // __WXMSW__
|
||||
|
||||
} // GUI
|
||||
} //Slic3r
|
||||
|
|
|
@ -100,7 +100,7 @@ public:
|
|||
void init_label_colours();
|
||||
void update_label_colours_from_appconfig();
|
||||
void init_fonts();
|
||||
void update_fonts();
|
||||
void update_fonts(const MainFrame *main_frame = nullptr);
|
||||
void set_label_clr_modified(const wxColour& clr);
|
||||
void set_label_clr_sys(const wxColour& clr);
|
||||
|
||||
|
@ -178,6 +178,9 @@ private:
|
|||
void window_pos_save(wxTopLevelWindow* window, const std::string &name);
|
||||
void window_pos_restore(wxTopLevelWindow* window, const std::string &name, bool default_maximized = false);
|
||||
void window_pos_sanitize(wxTopLevelWindow* window);
|
||||
#ifdef __WXMSW__
|
||||
void associate_3mf_files();
|
||||
#endif // __WXMSW__
|
||||
};
|
||||
DECLARE_APP(GUI_App)
|
||||
|
||||
|
|
|
@ -39,6 +39,15 @@ FreqSettingsBundle FREQ_SETTINGS_BUNDLE_SLA =
|
|||
{ L("Pad and Support") , { "supports_enable", "pad_enable" } }
|
||||
};
|
||||
|
||||
// Note: id accords to type of the sub-object (adding volume), so sequence of the menu items is important
|
||||
std::vector<std::pair<std::string, std::string>> ADD_VOLUME_MENU_ITEMS = {
|
||||
// menu_item Name menu_item bitmap name
|
||||
{L("Add part"), "add_part" }, // ~ModelVolumeType::MODEL_PART
|
||||
{L("Add modifier"), "add_modifier"}, // ~ModelVolumeType::PARAMETER_MODIFIER
|
||||
{L("Add support enforcer"), "support_enforcer"}, // ~ModelVolumeType::SUPPORT_ENFORCER
|
||||
{L("Add support blocker"), "support_blocker"} // ~ModelVolumeType::SUPPORT_BLOCKER
|
||||
};
|
||||
|
||||
static PrinterTechnology printer_technology()
|
||||
{
|
||||
return wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology();
|
||||
|
@ -120,7 +129,7 @@ ObjectList::ObjectList(wxWindow* parent) :
|
|||
#endif //__WXMSW__
|
||||
});
|
||||
|
||||
Bind(wxEVT_CHAR, [this](wxKeyEvent& event) { key_event(event); }); // doesn't work on OSX
|
||||
// Bind(wxEVT_CHAR, [this](wxKeyEvent& event) { key_event(event); }); // doesn't work on OSX
|
||||
|
||||
#ifdef __WXMSW__
|
||||
GetMainWindow()->Bind(wxEVT_MOTION, [this](wxMouseEvent& event) {
|
||||
|
@ -142,9 +151,27 @@ ObjectList::ObjectList(wxWindow* parent) :
|
|||
Bind(wxCUSTOMEVT_LAST_VOLUME_IS_DELETED, [this](wxCommandEvent& e) { last_volume_is_deleted(e.GetInt()); });
|
||||
|
||||
#ifdef __WXOSX__
|
||||
Bind(wxEVT_KEY_DOWN, &ObjectList::OnChar, this);
|
||||
// Bind(wxEVT_KEY_DOWN, &ObjectList::OnChar, this);
|
||||
#endif //__WXOSX__
|
||||
|
||||
{
|
||||
// Accelerators
|
||||
wxAcceleratorEntry entries[6];
|
||||
entries[0].Set(wxACCEL_CTRL, (int) 'C', wxID_COPY);
|
||||
entries[1].Set(wxACCEL_CTRL, (int) 'X', wxID_CUT);
|
||||
entries[2].Set(wxACCEL_CTRL, (int) 'V', wxID_PASTE);
|
||||
entries[3].Set(wxACCEL_CTRL, (int) 'A', wxID_SELECTALL);
|
||||
entries[4].Set(wxACCEL_NORMAL, WXK_DELETE, wxID_DELETE);
|
||||
entries[5].Set(wxACCEL_NORMAL, WXK_BACK, wxID_DELETE);
|
||||
wxAcceleratorTable accel(6, entries);
|
||||
SetAcceleratorTable(accel);
|
||||
|
||||
this->Bind(wxEVT_MENU, [this](wxCommandEvent &evt) { wxPostEvent((wxEvtHandler*)wxGetApp().plater()->canvas3D()->get_wxglcanvas(), SimpleEvent(EVT_GLTOOLBAR_COPY)); }, wxID_COPY);
|
||||
this->Bind(wxEVT_MENU, [this](wxCommandEvent &evt) { wxPostEvent((wxEvtHandler*)wxGetApp().plater()->canvas3D()->get_wxglcanvas(), SimpleEvent(EVT_GLTOOLBAR_PASTE)); }, wxID_PASTE);
|
||||
this->Bind(wxEVT_MENU, [this](wxCommandEvent &evt) { this->select_item_all_children(); }, wxID_SELECTALL);
|
||||
this->Bind(wxEVT_MENU, [this](wxCommandEvent &evt) { this->remove(); }, wxID_DELETE);
|
||||
}
|
||||
|
||||
Bind(wxEVT_SIZE, ([this](wxSizeEvent &e) { this->EnsureVisible(this->GetCurrentItem()); e.Skip(); }));
|
||||
}
|
||||
|
||||
|
@ -193,6 +220,76 @@ void ObjectList::create_popup_menus()
|
|||
create_instance_popupmenu(&m_menu_instance);
|
||||
}
|
||||
|
||||
void ObjectList::get_selected_item_indexes(int& obj_idx, int& vol_idx, const wxDataViewItem& input_item/* = wxDataViewItem(0)*/)
|
||||
{
|
||||
const wxDataViewItem item = input_item == wxDataViewItem(0) ? GetSelection() : input_item;
|
||||
|
||||
if (!item)
|
||||
{
|
||||
obj_idx = vol_idx = -1;
|
||||
return;
|
||||
}
|
||||
|
||||
const ItemType type = m_objects_model->GetItemType(item);
|
||||
|
||||
obj_idx = type & itObject ? m_objects_model->GetIdByItem(item) :
|
||||
type & itVolume ? m_objects_model->GetIdByItem(m_objects_model->GetTopParent(item)) : -1;
|
||||
|
||||
vol_idx = type & itVolume ? m_objects_model->GetVolumeIdByItem(item) : -1;
|
||||
}
|
||||
|
||||
int ObjectList::get_mesh_errors_count(const int obj_idx, const int vol_idx /*= -1*/) const
|
||||
{
|
||||
if (obj_idx < 0)
|
||||
return 0;
|
||||
|
||||
return (*m_objects)[obj_idx]->get_mesh_errors_count(vol_idx);
|
||||
}
|
||||
|
||||
wxString ObjectList::get_mesh_errors_list(const int obj_idx, const int vol_idx /*= -1*/) const
|
||||
{
|
||||
const int errors = get_mesh_errors_count(obj_idx, vol_idx);
|
||||
|
||||
if (errors == 0)
|
||||
return ""; // hide tooltip
|
||||
|
||||
// Create tooltip string, if there are errors
|
||||
wxString tooltip = wxString::Format(_(L("Auto-repaired (%d errors):\n")), errors);
|
||||
|
||||
const stl_stats& stats = vol_idx == -1 ?
|
||||
(*m_objects)[obj_idx]->get_object_stl_stats() :
|
||||
(*m_objects)[obj_idx]->volumes[vol_idx]->mesh.stl.stats;
|
||||
|
||||
std::map<std::string, int> error_msg = {
|
||||
{ L("degenerate facets"), stats.degenerate_facets },
|
||||
{ L("edges fixed"), stats.edges_fixed },
|
||||
{ L("facets removed"), stats.facets_removed },
|
||||
{ L("facets added"), stats.facets_added },
|
||||
{ L("facets reversed"), stats.facets_reversed },
|
||||
{ L("backwards edges"), stats.backwards_edges }
|
||||
};
|
||||
|
||||
for (const auto& error : error_msg)
|
||||
if (error.second > 0)
|
||||
tooltip += wxString::Format("\t%d %s\n", error.second, _(error.first));
|
||||
|
||||
if (is_windows10())
|
||||
tooltip += _(L("Right button click the icon to fix STL through Netfabb"));
|
||||
|
||||
return tooltip;
|
||||
}
|
||||
|
||||
wxString ObjectList::get_mesh_errors_list()
|
||||
{
|
||||
if (!GetSelection())
|
||||
return "";
|
||||
|
||||
int obj_idx, vol_idx;
|
||||
get_selected_item_indexes(obj_idx, vol_idx);
|
||||
|
||||
return get_mesh_errors_list(obj_idx, vol_idx);
|
||||
}
|
||||
|
||||
void ObjectList::set_tooltip_for_item(const wxPoint& pt)
|
||||
{
|
||||
wxDataViewItem item;
|
||||
|
@ -200,40 +297,24 @@ void ObjectList::set_tooltip_for_item(const wxPoint& pt)
|
|||
HitTest(pt, item, col);
|
||||
if (!item) return;
|
||||
|
||||
/* GetMainWindow() return window, associated with wxDataViewCtrl.
|
||||
* And for this window we should to set tooltips.
|
||||
* Just this->SetToolTip(tooltip) => has no effect.
|
||||
*/
|
||||
|
||||
if (col->GetTitle() == " " && GetSelectedItemsCount()<2)
|
||||
GetMainWindow()->SetToolTip(_(L("Right button click the icon to change the object settings")));
|
||||
else if (col->GetTitle() == _("Name") &&
|
||||
m_objects_model->GetBitmap(item).GetRefData() == m_bmp_manifold_warning.bmp().GetRefData()) {
|
||||
int obj_idx = m_objects_model->GetIdByItem(item);
|
||||
auto& stats = (*m_objects)[obj_idx]->volumes[0]->mesh.stl.stats;
|
||||
int errors = stats.degenerate_facets + stats.edges_fixed + stats.facets_removed +
|
||||
stats.facets_added + stats.facets_reversed + stats.backwards_edges;
|
||||
|
||||
wxString tooltip = wxString::Format(_(L("Auto-repaired (%d errors):\n")), errors);
|
||||
|
||||
std::map<std::string, int> error_msg;
|
||||
error_msg[L("degenerate facets")] = stats.degenerate_facets;
|
||||
error_msg[L("edges fixed")] = stats.edges_fixed;
|
||||
error_msg[L("facets removed")] = stats.facets_removed;
|
||||
error_msg[L("facets added")] = stats.facets_added;
|
||||
error_msg[L("facets reversed")] = stats.facets_reversed;
|
||||
error_msg[L("backwards edges")] = stats.backwards_edges;
|
||||
|
||||
for (auto error : error_msg)
|
||||
{
|
||||
if (error.second > 0)
|
||||
tooltip += wxString::Format(_("\t%d %s\n"), error.second, error.first);
|
||||
else if (col->GetTitle() == _("Name"))
|
||||
{
|
||||
#ifdef __WXMSW__
|
||||
if (pt.x < 2 * wxGetApp().em_unit() || pt.x > 4 * wxGetApp().em_unit()) {
|
||||
GetMainWindow()->SetToolTip(""); // hide tooltip
|
||||
return;
|
||||
}
|
||||
// OR
|
||||
// tooltip += wxString::Format(_(L("%d degenerate facets, %d edges fixed, %d facets removed, "
|
||||
// "%d facets added, %d facets reversed, %d backwards edges")),
|
||||
// stats.degenerate_facets, stats.edges_fixed, stats.facets_removed,
|
||||
// stats.facets_added, stats.facets_reversed, stats.backwards_edges);
|
||||
|
||||
if (is_windows10())
|
||||
tooltip += _(L("Right button click the icon to fix STL through Netfabb"));
|
||||
|
||||
GetMainWindow()->SetToolTip(tooltip);
|
||||
#endif //__WXMSW__
|
||||
int obj_idx, vol_idx;
|
||||
get_selected_item_indexes(obj_idx, vol_idx, item);
|
||||
GetMainWindow()->SetToolTip(get_mesh_errors_list(obj_idx, vol_idx));
|
||||
}
|
||||
else
|
||||
GetMainWindow()->SetToolTip(""); // hide tooltip
|
||||
|
@ -395,10 +476,10 @@ void ObjectList::update_name_in_model(const wxDataViewItem& item) const
|
|||
|
||||
void ObjectList::init_icons()
|
||||
{
|
||||
m_bmp_modifiermesh = ScalableBitmap(nullptr, "add_modifier"); // Add part
|
||||
m_bmp_solidmesh = ScalableBitmap(nullptr, "add_part"); // Add modifier
|
||||
m_bmp_support_enforcer = ScalableBitmap(nullptr, "support_enforcer");// Add support enforcer
|
||||
m_bmp_support_blocker = ScalableBitmap(nullptr, "support_blocker"); // Add support blocker
|
||||
m_bmp_solidmesh = ScalableBitmap(nullptr, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::MODEL_PART) ].second);
|
||||
m_bmp_modifiermesh = ScalableBitmap(nullptr, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::PARAMETER_MODIFIER)].second);
|
||||
m_bmp_support_enforcer = ScalableBitmap(nullptr, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_ENFORCER) ].second);
|
||||
m_bmp_support_blocker = ScalableBitmap(nullptr, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_BLOCKER) ].second);
|
||||
|
||||
m_bmp_vector.reserve(4); // bitmaps for different types of parts
|
||||
m_bmp_vector.push_back(&m_bmp_solidmesh.bmp());
|
||||
|
@ -412,21 +493,19 @@ void ObjectList::init_icons()
|
|||
|
||||
// init icon for manifold warning
|
||||
m_bmp_manifold_warning = ScalableBitmap(nullptr, "exclamation");
|
||||
|
||||
// init bitmap for "Split to sub-objects" context menu
|
||||
m_bmp_split = ScalableBitmap(nullptr, "split_parts_SMALL");
|
||||
// Set warning bitmap for the model
|
||||
m_objects_model->SetWarningBitmap(&m_bmp_manifold_warning.bmp());
|
||||
|
||||
// init bitmap for "Add Settings" context menu
|
||||
m_bmp_cog = ScalableBitmap(nullptr, "cog");
|
||||
}
|
||||
|
||||
void ObjectList::rescale_icons()
|
||||
void ObjectList::msw_rescale_icons()
|
||||
{
|
||||
m_bmp_vector.clear();
|
||||
m_bmp_vector.reserve(4); // bitmaps for different types of parts
|
||||
for (ScalableBitmap* bitmap : std::vector<ScalableBitmap*> {
|
||||
&m_bmp_modifiermesh, // Add part
|
||||
&m_bmp_solidmesh, // Add modifier
|
||||
for (ScalableBitmap* bitmap : { &m_bmp_solidmesh, // Add part
|
||||
&m_bmp_modifiermesh, // Add modifier
|
||||
&m_bmp_support_enforcer, // Add support enforcer
|
||||
&m_bmp_support_blocker }) // Add support blocker
|
||||
{
|
||||
|
@ -437,7 +516,9 @@ void ObjectList::rescale_icons()
|
|||
m_objects_model->SetVolumeBitmaps(m_bmp_vector);
|
||||
|
||||
m_bmp_manifold_warning.msw_rescale();
|
||||
m_bmp_split.msw_rescale();
|
||||
// Set warning bitmap for the model
|
||||
m_objects_model->SetWarningBitmap(&m_bmp_manifold_warning.bmp());
|
||||
|
||||
m_bmp_cog.msw_rescale();
|
||||
|
||||
|
||||
|
@ -498,7 +579,8 @@ void ObjectList::paste_volumes_into_list(int obj_idx, const ModelVolumePtrs& vol
|
|||
|
||||
for (const ModelVolume* volume : volumes)
|
||||
{
|
||||
auto vol_item = m_objects_model->AddVolumeChild(object_item, volume->name, volume->type(),
|
||||
const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(object_item, volume->name, volume->type(),
|
||||
volume->get_mesh_errors_count()>0 ,
|
||||
volume->config.has("extruder") ? volume->config.option<ConfigOptionInt>("extruder")->value : 0);
|
||||
auto opt_keys = volume->config.keys();
|
||||
if (!opt_keys.empty() && !((opt_keys.size() == 1) && (opt_keys[0] == "extruder")))
|
||||
|
@ -574,10 +656,13 @@ void ObjectList::OnContextMenu(wxDataViewEvent&)
|
|||
|
||||
if (title == " ")
|
||||
show_context_menu();
|
||||
else if (title == _("Name") && pt.x >15 &&
|
||||
m_objects_model->GetBitmap(item).GetRefData() == m_bmp_manifold_warning.bmp().GetRefData())
|
||||
else if (title == _("Name"))
|
||||
{
|
||||
if (is_windows10())
|
||||
int obj_idx, vol_idx;
|
||||
get_selected_item_indexes(obj_idx, vol_idx, item);
|
||||
|
||||
if (is_windows10() && get_mesh_errors_count(obj_idx, vol_idx) > 0 &&
|
||||
pt.x > 2*wxGetApp().em_unit() && pt.x < 4*wxGetApp().em_unit() )
|
||||
fix_through_netfabb();
|
||||
}
|
||||
|
||||
|
@ -937,6 +1022,7 @@ void ObjectList::get_freq_settings_choice(const wxString& bundle_name)
|
|||
{
|
||||
const std::vector<std::string>& options = get_options_for_bundle(bundle_name);
|
||||
|
||||
assert(m_config);
|
||||
auto opt_keys = m_config->keys();
|
||||
|
||||
const DynamicPrintConfig& from_config = wxGetApp().preset_bundle->prints.get_edited_preset().config;
|
||||
|
@ -966,6 +1052,10 @@ void ObjectList::update_settings_item()
|
|||
const auto settings_item = m_objects_model->IsSettingsItem(item) ? item : m_objects_model->GetSettingsItem(item);
|
||||
select_item(settings_item ? settings_item :
|
||||
m_objects_model->AddSettingsChild(item));
|
||||
|
||||
// update object selection on Plater
|
||||
if (!m_prevent_canvas_selection_update)
|
||||
update_selections_on_canvas();
|
||||
}
|
||||
else {
|
||||
auto panel = wxGetApp().sidebar().scrolled_panel();
|
||||
|
@ -975,72 +1065,62 @@ void ObjectList::update_settings_item()
|
|||
}
|
||||
}
|
||||
|
||||
void ObjectList::append_menu_item_add_generic(wxMenuItem* menu, const ModelVolumeType type) {
|
||||
wxMenu* ObjectList::append_submenu_add_generic(wxMenu* menu, const ModelVolumeType type) {
|
||||
auto sub_menu = new wxMenu;
|
||||
|
||||
if (wxGetApp().get_mode() == comExpert) {
|
||||
append_menu_item(sub_menu, wxID_ANY, _(L("Load")) + " " + dots, "",
|
||||
[this, type](wxCommandEvent&) { load_subobject(type); }, "", menu->GetMenu());
|
||||
[this, type](wxCommandEvent&) { load_subobject(type); }, "", menu);
|
||||
sub_menu->AppendSeparator();
|
||||
}
|
||||
|
||||
for (auto& item : { L("Box"), L("Cylinder"), L("Sphere"), L("Slab") }) {
|
||||
append_menu_item(sub_menu, wxID_ANY, _(item), "",
|
||||
[this, type, item](wxCommandEvent&) { load_generic_subobject(item, type); }, "", menu->GetMenu());
|
||||
[this, type, item](wxCommandEvent&) { load_generic_subobject(item, type); }, "", menu);
|
||||
}
|
||||
|
||||
menu->SetSubMenu(sub_menu);
|
||||
return sub_menu;
|
||||
}
|
||||
|
||||
void ObjectList::append_menu_items_add_volume(wxMenu* menu)
|
||||
{
|
||||
// Note: id accords to type of the sub-object, so sequence of the menu items is important
|
||||
std::vector<std::string> menu_object_types_items = {L("Add part"), // ~ModelVolumeType::MODEL_PART
|
||||
L("Add modifier"), // ~ModelVolumeType::PARAMETER_MODIFIER
|
||||
L("Add support enforcer"), // ~ModelVolumeType::SUPPORT_ENFORCER
|
||||
L("Add support blocker") }; // ~ModelVolumeType::SUPPORT_BLOCKER
|
||||
|
||||
// Update "add" items(delete old & create new) settings popupmenu
|
||||
for (auto& item : menu_object_types_items){
|
||||
const auto settings_id = menu->FindItem(_(item));
|
||||
for (auto& item : ADD_VOLUME_MENU_ITEMS){
|
||||
const auto settings_id = menu->FindItem(_(item.first));
|
||||
if (settings_id != wxNOT_FOUND)
|
||||
menu->Destroy(settings_id);
|
||||
}
|
||||
|
||||
const ConfigOptionMode mode = wxGetApp().get_mode();
|
||||
|
||||
if (mode == comAdvanced)
|
||||
{
|
||||
append_menu_item(menu, wxID_ANY, _(L("Add part")), "",
|
||||
[this](wxCommandEvent&) { load_subobject(ModelVolumeType::MODEL_PART); }, *m_bmp_vector[int(ModelVolumeType::MODEL_PART)]);
|
||||
if (mode == comAdvanced) {
|
||||
append_menu_item(menu, wxID_ANY, _(ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::MODEL_PART)].first), "",
|
||||
[this](wxCommandEvent&) { load_subobject(ModelVolumeType::MODEL_PART); }, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::MODEL_PART)].second);
|
||||
}
|
||||
if (mode == comSimple) {
|
||||
append_menu_item(menu, wxID_ANY, _(L("Add support enforcer")), "",
|
||||
append_menu_item(menu, wxID_ANY, _(ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_ENFORCER)].first), "",
|
||||
[this](wxCommandEvent&) { load_generic_subobject(L("Box"), ModelVolumeType::SUPPORT_ENFORCER); },
|
||||
*m_bmp_vector[int(ModelVolumeType::SUPPORT_ENFORCER)]);
|
||||
append_menu_item(menu, wxID_ANY, _(L("Add support blocker")), "",
|
||||
ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_ENFORCER)].second);
|
||||
append_menu_item(menu, wxID_ANY, _(ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_BLOCKER)].first), "",
|
||||
[this](wxCommandEvent&) { load_generic_subobject(L("Box"), ModelVolumeType::SUPPORT_BLOCKER); },
|
||||
*m_bmp_vector[int(ModelVolumeType::SUPPORT_BLOCKER)]);
|
||||
ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_BLOCKER)].second);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
for (int type = mode == comExpert ? 0 : 1 ; type < menu_object_types_items.size(); type++)
|
||||
for (int type = mode == comExpert ? 0 : 1 ; type < ADD_VOLUME_MENU_ITEMS.size(); type++)
|
||||
{
|
||||
auto& item = menu_object_types_items[type];
|
||||
auto& item = ADD_VOLUME_MENU_ITEMS[type];
|
||||
|
||||
auto menu_item = new wxMenuItem(menu, wxID_ANY, _(item));
|
||||
menu_item->SetBitmap(*m_bmp_vector[type]);
|
||||
append_menu_item_add_generic(menu_item, ModelVolumeType(type));
|
||||
|
||||
menu->Append(menu_item);
|
||||
wxMenu* sub_menu = append_submenu_add_generic(menu, ModelVolumeType(type));
|
||||
append_submenu(menu, sub_menu, wxID_ANY, _(item.first), "", item.second);
|
||||
}
|
||||
}
|
||||
|
||||
wxMenuItem* ObjectList::append_menu_item_split(wxMenu* menu)
|
||||
{
|
||||
return append_menu_item(menu, wxID_ANY, _(L("Split to parts")), "",
|
||||
[this](wxCommandEvent&) { split(); }, m_bmp_split.bmp(), menu);
|
||||
[this](wxCommandEvent&) { split(); }, "split_parts_SMALL", menu);
|
||||
}
|
||||
|
||||
wxMenuItem* ObjectList::append_menu_item_settings(wxMenu* menu_)
|
||||
|
@ -1135,19 +1215,21 @@ void ObjectList::append_menu_items_osx(wxMenu* menu)
|
|||
menu->AppendSeparator();
|
||||
}
|
||||
|
||||
void ObjectList::append_menu_item_fix_through_netfabb(wxMenu* menu)
|
||||
wxMenuItem* ObjectList::append_menu_item_fix_through_netfabb(wxMenu* menu)
|
||||
{
|
||||
if (!is_windows10())
|
||||
return;
|
||||
append_menu_item(menu, wxID_ANY, _(L("Fix through the Netfabb")), "",
|
||||
return nullptr;
|
||||
wxMenuItem* menu_item = append_menu_item(menu, wxID_ANY, _(L("Fix through the Netfabb")), "",
|
||||
[this](wxCommandEvent&) { fix_through_netfabb(); }, "", menu);
|
||||
menu->AppendSeparator();
|
||||
|
||||
return menu_item;
|
||||
}
|
||||
|
||||
void ObjectList::append_menu_item_export_stl(wxMenu* menu) const
|
||||
{
|
||||
append_menu_item(menu, wxID_ANY, _(L("Export as STL")) + dots, "",
|
||||
[](wxCommandEvent&) { wxGetApp().plater()->export_stl(true); }, "", menu);
|
||||
[](wxCommandEvent&) { wxGetApp().plater()->export_stl(false, true); }, "", menu);
|
||||
menu->AppendSeparator();
|
||||
}
|
||||
|
||||
|
@ -1327,21 +1409,23 @@ void ObjectList::load_subobject(ModelVolumeType type)
|
|||
int obj_idx = m_objects_model->GetIdByItem(item);
|
||||
|
||||
if (obj_idx < 0) return;
|
||||
wxArrayString part_names;
|
||||
load_part((*m_objects)[obj_idx], part_names, type);
|
||||
|
||||
std::vector<std::pair<wxString, bool>> volumes_info;
|
||||
load_part((*m_objects)[obj_idx], volumes_info, type);
|
||||
|
||||
|
||||
changed_object(obj_idx);
|
||||
|
||||
for (int i = 0; i < part_names.size(); ++i) {
|
||||
const wxDataViewItem sel_item = m_objects_model->AddVolumeChild(item, part_names.Item(i), type);
|
||||
|
||||
if (i == part_names.size() - 1)
|
||||
select_item(sel_item);
|
||||
}
|
||||
wxDataViewItem sel_item;
|
||||
for (const auto& volume : volumes_info )
|
||||
sel_item = m_objects_model->AddVolumeChild(item, volume.first, type, volume.second);
|
||||
|
||||
if (sel_item)
|
||||
select_item(sel_item);
|
||||
}
|
||||
|
||||
void ObjectList::load_part( ModelObject* model_object,
|
||||
wxArrayString& part_names,
|
||||
std::vector<std::pair<wxString, bool>> &volumes_info,
|
||||
ModelVolumeType type)
|
||||
{
|
||||
wxWindow* parent = wxGetApp().tab_panel()->GetPage(0);
|
||||
|
@ -1377,7 +1461,7 @@ void ObjectList::load_part( ModelObject* model_object,
|
|||
new_volume->set_type(type);
|
||||
new_volume->name = boost::filesystem::path(input_file).filename().string();
|
||||
|
||||
part_names.Add(from_u8(new_volume->name));
|
||||
volumes_info.push_back(std::make_pair(from_u8(new_volume->name), new_volume->get_mesh_errors_count()>0));
|
||||
|
||||
// set a default extruder value, since user can't add it manually
|
||||
new_volume->config.set_key_value("extruder", new ConfigOptionInt(0));
|
||||
|
@ -1394,19 +1478,12 @@ Geometry::Transformation volume_to_bed_transformation(const Geometry::Transforma
|
|||
{
|
||||
Geometry::Transformation out;
|
||||
|
||||
// Is the angle close to a multiple of 90 degrees?
|
||||
auto ninety_degrees = [](double a) {
|
||||
a = fmod(std::abs(a), 0.5 * PI);
|
||||
if (a > 0.25 * PI)
|
||||
a = 0.5 * PI - a;
|
||||
return a < 0.001;
|
||||
};
|
||||
if (instance_transformation.is_scaling_uniform()) {
|
||||
// No need to run the non-linear least squares fitting for uniform scaling.
|
||||
// Just set the inverse.
|
||||
out.set_from_transform(instance_transformation.get_matrix(true).inverse());
|
||||
}
|
||||
else if (ninety_degrees(instance_transformation.get_rotation().x()) && ninety_degrees(instance_transformation.get_rotation().y()) && ninety_degrees(instance_transformation.get_rotation().z()))
|
||||
else if (Geometry::is_rotation_ninety_degrees(instance_transformation.get_rotation()))
|
||||
{
|
||||
// Anisotropic scaling, rotation by multiples of ninety degrees.
|
||||
Eigen::Matrix3d instance_rotation_trafo =
|
||||
|
@ -1533,7 +1610,8 @@ void ObjectList::load_generic_subobject(const std::string& type_name, const Mode
|
|||
changed_object(obj_idx);
|
||||
|
||||
const auto object_item = m_objects_model->GetTopParent(GetSelection());
|
||||
select_item(m_objects_model->AddVolumeChild(object_item, name, type));
|
||||
select_item(m_objects_model->AddVolumeChild(object_item, name, type,
|
||||
new_volume->get_mesh_errors_count()>0));
|
||||
#ifndef __WXOSX__ //#ifdef __WXMSW__ // #ys_FIXME
|
||||
selection_changed();
|
||||
#endif //no __WXOSX__ //__WXMSW__
|
||||
|
@ -1565,6 +1643,10 @@ void ObjectList::del_subobject_item(wxDataViewItem& item)
|
|||
else if (!del_subobject_from_object(obj_idx, idx, type))
|
||||
return;
|
||||
|
||||
// If last volume item with warning was deleted, unmark object item
|
||||
if (type == itVolume && (*m_objects)[obj_idx]->get_mesh_errors_count() == 0)
|
||||
m_objects_model->DeleteWarningIcon(m_objects_model->GetParent(item));
|
||||
|
||||
m_objects_model->Delete(item);
|
||||
}
|
||||
|
||||
|
@ -1671,18 +1753,18 @@ void ObjectList::split()
|
|||
else
|
||||
parent = item;
|
||||
|
||||
for (auto id = 0; id < model_object->volumes.size(); id++) {
|
||||
const auto vol_item = m_objects_model->AddVolumeChild(parent, from_u8(model_object->volumes[id]->name),
|
||||
model_object->volumes[id]->is_modifier() ?
|
||||
ModelVolumeType::PARAMETER_MODIFIER : ModelVolumeType::MODEL_PART,
|
||||
model_object->volumes[id]->config.has("extruder") ?
|
||||
model_object->volumes[id]->config.option<ConfigOptionInt>("extruder")->value : 0,
|
||||
for (const ModelVolume* volume : model_object->volumes) {
|
||||
const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(parent, from_u8(volume->name),
|
||||
volume->is_modifier() ? ModelVolumeType::PARAMETER_MODIFIER : ModelVolumeType::MODEL_PART,
|
||||
volume->get_mesh_errors_count()>0,
|
||||
volume->config.has("extruder") ?
|
||||
volume->config.option<ConfigOptionInt>("extruder")->value : 0,
|
||||
false);
|
||||
// add settings to the part, if it has those
|
||||
auto opt_keys = model_object->volumes[id]->config.keys();
|
||||
auto opt_keys = volume->config.keys();
|
||||
if ( !(opt_keys.size() == 1 && opt_keys[0] == "extruder") ) {
|
||||
select_item(m_objects_model->AddSettingsChild(vol_item));
|
||||
/*Collapse*/Expand(vol_item);
|
||||
Expand(vol_item);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1755,6 +1837,7 @@ void ObjectList::changed_object(const int obj_idx/* = -1*/) const
|
|||
void ObjectList::part_selection_changed()
|
||||
{
|
||||
int obj_idx = -1;
|
||||
int volume_id = -1;
|
||||
m_config = nullptr;
|
||||
wxString og_name = wxEmptyString;
|
||||
|
||||
|
@ -1801,7 +1884,7 @@ void ObjectList::part_selection_changed()
|
|||
}
|
||||
else if (m_objects_model->GetItemType(item) == itVolume) {
|
||||
og_name = _(L("Part manipulation"));
|
||||
const auto volume_id = m_objects_model->GetVolumeIdByItem(item);
|
||||
volume_id = m_objects_model->GetVolumeIdByItem(item);
|
||||
m_config = &(*m_objects)[obj_idx]->volumes[volume_id]->config;
|
||||
update_and_show_manipulations = true;
|
||||
}
|
||||
|
@ -1821,7 +1904,11 @@ void ObjectList::part_selection_changed()
|
|||
|
||||
if (update_and_show_manipulations) {
|
||||
wxGetApp().obj_manipul()->get_og()->set_name(" " + og_name + " ");
|
||||
wxGetApp().obj_manipul()->get_og()->set_value("object_name", m_objects_model->GetName(GetSelection()));
|
||||
|
||||
if (item) {
|
||||
wxGetApp().obj_manipul()->get_og()->set_value("object_name", m_objects_model->GetName(item));
|
||||
wxGetApp().obj_manipul()->update_warning_icon_state(get_mesh_errors_list(obj_idx, volume_id));
|
||||
}
|
||||
}
|
||||
|
||||
if (update_and_show_settings)
|
||||
|
@ -1841,34 +1928,26 @@ void ObjectList::part_selection_changed()
|
|||
void ObjectList::add_object_to_list(size_t obj_idx)
|
||||
{
|
||||
auto model_object = (*m_objects)[obj_idx];
|
||||
wxString item_name = from_u8(model_object->name);
|
||||
const wxString& item_name = from_u8(model_object->name);
|
||||
const auto item = m_objects_model->Add(item_name,
|
||||
!model_object->config.has("extruder") ? 0 :
|
||||
model_object->config.option<ConfigOptionInt>("extruder")->value);
|
||||
|
||||
// Add error icon if detected auto-repaire
|
||||
auto stats = model_object->volumes[0]->mesh.stl.stats;
|
||||
int errors = stats.degenerate_facets + stats.edges_fixed + stats.facets_removed +
|
||||
stats.facets_added + stats.facets_reversed + stats.backwards_edges;
|
||||
if (errors > 0) {
|
||||
wxVariant variant;
|
||||
variant << DataViewBitmapText(item_name, m_bmp_manifold_warning.bmp());
|
||||
m_objects_model->SetValue(variant, item, 0);
|
||||
}
|
||||
model_object->config.option<ConfigOptionInt>("extruder")->value,
|
||||
get_mesh_errors_count(obj_idx) > 0);
|
||||
|
||||
// add volumes to the object
|
||||
if (model_object->volumes.size() > 1) {
|
||||
for (auto id = 0; id < model_object->volumes.size(); id++) {
|
||||
auto vol_item = m_objects_model->AddVolumeChild(item,
|
||||
from_u8(model_object->volumes[id]->name),
|
||||
model_object->volumes[id]->type(),
|
||||
!model_object->volumes[id]->config.has("extruder") ? 0 :
|
||||
model_object->volumes[id]->config.option<ConfigOptionInt>("extruder")->value,
|
||||
for (const ModelVolume* volume : model_object->volumes) {
|
||||
const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(item,
|
||||
from_u8(volume->name),
|
||||
volume->type(),
|
||||
volume->get_mesh_errors_count()>0,
|
||||
!volume->config.has("extruder") ? 0 :
|
||||
volume->config.option<ConfigOptionInt>("extruder")->value,
|
||||
false);
|
||||
auto opt_keys = model_object->volumes[id]->config.keys();
|
||||
auto opt_keys = volume->config.keys();
|
||||
if (!opt_keys.empty() && !(opt_keys.size() == 1 && opt_keys[0] == "extruder")) {
|
||||
select_item(m_objects_model->AddSettingsChild(vol_item));
|
||||
/*Collapse*/Expand(vol_item);
|
||||
Expand(vol_item);
|
||||
}
|
||||
}
|
||||
Expand(item);
|
||||
|
@ -1882,7 +1961,7 @@ void ObjectList::add_object_to_list(size_t obj_idx)
|
|||
auto opt_keys = model_object->config.keys();
|
||||
if (!opt_keys.empty() && !(opt_keys.size() == 1 && opt_keys[0] == "extruder")) {
|
||||
select_item(m_objects_model->AddSettingsChild(item));
|
||||
/*Collapse*/Expand(item);
|
||||
Expand(item);
|
||||
}
|
||||
|
||||
#ifndef __WXOSX__
|
||||
|
@ -2076,6 +2155,11 @@ void ObjectList::update_selections()
|
|||
if (m_objects_model->GetVolumeIdByItem(m_objects_model->GetParent(item)) == gl_vol->volume_idx())
|
||||
return;
|
||||
}
|
||||
|
||||
// but if there is selected only one of several instances by context menu,
|
||||
// then select this instance in ObjectList
|
||||
if (selection.is_single_full_instance())
|
||||
sels.Add(m_objects_model->GetItemByInstanceId(selection.get_object_idx(), selection.get_instance_idx()));
|
||||
}
|
||||
else if (selection.is_single_full_object() || selection.is_multiple_full_object())
|
||||
{
|
||||
|
@ -2666,18 +2750,10 @@ void ObjectList::rename_item()
|
|||
update_name_in_model(item);
|
||||
}
|
||||
|
||||
void ObjectList::fix_through_netfabb() const
|
||||
void ObjectList::fix_through_netfabb()
|
||||
{
|
||||
const wxDataViewItem item = GetSelection();
|
||||
if (!item)
|
||||
return;
|
||||
|
||||
const ItemType type = m_objects_model->GetItemType(item);
|
||||
|
||||
const int obj_idx = type & itObject ? m_objects_model->GetIdByItem(item) :
|
||||
type & itVolume ? m_objects_model->GetIdByItem(m_objects_model->GetTopParent(item)) : -1;
|
||||
|
||||
const int vol_idx = type & itVolume ? m_objects_model->GetVolumeIdByItem(item) : -1;
|
||||
int obj_idx, vol_idx;
|
||||
get_selected_item_indexes(obj_idx, vol_idx);
|
||||
|
||||
wxGetApp().plater()->fix_through_netfabb(obj_idx, vol_idx);
|
||||
|
||||
|
@ -2691,35 +2767,41 @@ void ObjectList::update_item_error_icon(const int obj_idx, const int vol_idx) co
|
|||
if (!item)
|
||||
return;
|
||||
|
||||
auto model_object = (*m_objects)[obj_idx];
|
||||
|
||||
const stl_stats& stats = model_object->volumes[vol_idx<0 ? 0 : vol_idx]->mesh.stl.stats;
|
||||
const int errors = stats.degenerate_facets + stats.edges_fixed + stats.facets_removed +
|
||||
stats.facets_added + stats.facets_reversed + stats.backwards_edges;
|
||||
|
||||
if (errors == 0) {
|
||||
// delete Error_icon if all errors are fixed
|
||||
wxVariant variant;
|
||||
variant << DataViewBitmapText(from_u8(model_object->name), wxNullBitmap);
|
||||
m_objects_model->SetValue(variant, item, 0);
|
||||
if (get_mesh_errors_count(obj_idx, vol_idx) == 0)
|
||||
{
|
||||
// if whole object has no errors more,
|
||||
if (get_mesh_errors_count(obj_idx) == 0)
|
||||
// unmark all items in the object
|
||||
m_objects_model->DeleteWarningIcon(vol_idx >= 0 ? m_objects_model->GetParent(item) : item, true);
|
||||
else
|
||||
// unmark fixed item only
|
||||
m_objects_model->DeleteWarningIcon(item);
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectList::msw_rescale()
|
||||
{
|
||||
const int em = wxGetApp().em_unit();
|
||||
// update min size !!! A width of control shouldn't be a wxDefaultCoord
|
||||
SetMinSize(wxSize(1, 15 * wxGetApp().em_unit()));
|
||||
SetMinSize(wxSize(1, 15 * em));
|
||||
|
||||
GetColumn(0)->SetWidth(19 * wxGetApp().em_unit());
|
||||
GetColumn(1)->SetWidth(8 * wxGetApp().em_unit());
|
||||
GetColumn(2)->SetWidth(int(2 * wxGetApp().em_unit()));
|
||||
GetColumn(0)->SetWidth(19 * em);
|
||||
GetColumn(1)->SetWidth( 8 * em);
|
||||
GetColumn(2)->SetWidth( 2 * em);
|
||||
|
||||
// rescale all icons, used by ObjectList
|
||||
rescale_icons();
|
||||
msw_rescale_icons();
|
||||
|
||||
// rescale/update existingitems with bitmaps
|
||||
// rescale/update existing items with bitmaps
|
||||
m_objects_model->Rescale();
|
||||
|
||||
// rescale menus
|
||||
for (MenuWithSeparators* menu : { &m_menu_object,
|
||||
&m_menu_part,
|
||||
&m_menu_sla_object,
|
||||
&m_menu_instance })
|
||||
msw_rescale_menu(menu);
|
||||
|
||||
Layout();
|
||||
}
|
||||
|
||||
|
|