mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-16 21:42:43 +00:00
Compare commits
658
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ee2b4ccf70 | ||
|
|
753c793ea0 | ||
|
|
9c5494b19f | ||
|
|
93a119427a | ||
|
|
d264fcaef4 | ||
|
|
b4ab6dedfd | ||
|
|
a610d2d899 | ||
|
|
ade9e77b6b | ||
|
|
ed59f93456 | ||
|
|
cf52c81dcd | ||
|
|
803a2a3239 | ||
|
|
985092bb46 | ||
|
|
cb16a2e547 | ||
|
|
2c2e91b629 | ||
|
|
c3faf903ca | ||
|
|
5f3c957597 | ||
|
|
8557285389 | ||
|
|
a9edab78a8 | ||
|
|
79dede7d59 | ||
|
|
2ac45b2f78 | ||
|
|
b4f33e71e9 | ||
|
|
93c8b3f2b0 | ||
|
|
9321f24959 | ||
|
|
3e1daccd7c | ||
|
|
a0ada1aa88 | ||
|
|
9409598c2a | ||
|
|
7e545651bb | ||
|
|
ac3997c0d1 | ||
|
|
bd1304443c | ||
|
|
8c91cab971 | ||
|
|
79077518e9 | ||
|
|
bb3a260acb | ||
|
|
56aa348c89 | ||
|
|
2b6eb425e4 | ||
|
|
ae1752fbf2 | ||
|
|
cf3f36a1c6 | ||
|
|
cca7d8adb1 | ||
|
|
396d9ff51a | ||
|
|
81540c81e0 | ||
|
|
e7ace6cc99 | ||
|
|
79c20a1fad | ||
|
|
e48f9f47d2 | ||
|
|
2f566e3779 | ||
|
|
37d1edf69a | ||
|
|
f1cf9c69b1 | ||
|
|
1df362888e | ||
|
|
0956b4d8fe | ||
|
|
5514559feb | ||
|
|
4b2466b179 | ||
|
|
d5cf1502c4 | ||
|
|
3adcb3e953 | ||
|
|
37e2b6c928 | ||
|
|
efc9f253ee | ||
|
|
292cf0095e | ||
|
|
5c635d5e50 | ||
|
|
5496883493 | ||
|
|
31eb8a2bd1 | ||
|
|
70247ad298 | ||
|
|
d4840901fc | ||
|
|
5f01f21661 | ||
|
|
ecbe1b1b90 | ||
|
|
104dbb2140 | ||
|
|
e482cbbdd7 | ||
|
|
00429da739 | ||
|
|
31f6eb2718 | ||
|
|
ffb4f192c1 | ||
|
|
2a5ddd9edb | ||
|
|
4373bc3697 | ||
|
|
c10f83cf61 | ||
|
|
8eeec6935e | ||
|
|
131a2abf99 | ||
|
|
a09d6a565c | ||
|
|
214b5e2b0a | ||
|
|
c5b152b722 | ||
|
|
fd63164268 | ||
|
|
aef9ca2efb | ||
|
|
26fa1694d9 | ||
|
|
636b623cb7 | ||
|
|
d643b10ac4 | ||
|
|
9e8fbc17dd | ||
|
|
15ebdc3799 | ||
|
|
a7775296b0 | ||
|
|
c21e48450c | ||
|
|
bb8c2ae5ce | ||
|
|
fe0d47c7a3 | ||
|
|
c5965fa4d9 | ||
|
|
db9163ec34 | ||
|
|
e7ca4fb87e | ||
|
|
0888e331b5 | ||
|
|
ccd6086787 | ||
|
|
e998ad968a | ||
|
|
081bb9a703 | ||
|
|
75f5fe22e8 | ||
|
|
74cf148384 | ||
|
|
1e76e733b7 | ||
|
|
9daecc59b4 | ||
|
|
58e000d842 | ||
|
|
f21f062ded | ||
|
|
6a88f0790e | ||
|
|
6f90ff6e93 | ||
|
|
67f77e16c3 | ||
|
|
af6be5858e | ||
|
|
0a3724ed2f | ||
|
|
613dbcb21b | ||
|
|
4ad3d11c7a | ||
|
|
3331280b34 | ||
|
|
a6cf5cc1e3 | ||
|
|
baa91282e3 | ||
|
|
7a6026d3e8 | ||
|
|
8d874cdc36 | ||
|
|
a49b892708 | ||
|
|
d127db4d99 | ||
|
|
0a630738f1 | ||
|
|
d97dea2c41 | ||
|
|
a640e32a19 | ||
|
|
d09c3568c5 | ||
|
|
3fc7fd99d6 | ||
|
|
29b3282c8b | ||
|
|
ac1ed139d7 | ||
|
|
b709e3fec0 | ||
|
|
7e96a58770 | ||
|
|
a93c6ea67b | ||
|
|
e8d35fadd4 | ||
|
|
7888452666 | ||
|
|
6c92920aa1 | ||
|
|
eb0b67740e | ||
|
|
3788a19730 | ||
|
|
0acf76780f | ||
|
|
8c8e6fd069 | ||
|
|
a5d0d33df3 | ||
|
|
9e4f8aac80 | ||
|
|
e296d5daac | ||
|
|
dbeef900cc | ||
|
|
f18eb21b82 | ||
|
|
0927a5d5e7 | ||
|
|
913afc51b7 | ||
|
|
fa3dbfcc6f | ||
|
|
46180c3f54 | ||
|
|
a3c9041c10 | ||
|
|
c70a613548 | ||
|
|
10c123f2aa | ||
|
|
3fe043651b | ||
|
|
d112a0af29 | ||
|
|
b0b78c296c | ||
|
|
8af92214d0 | ||
|
|
284539d762 | ||
|
|
2f2a6bc3b5 | ||
|
|
fae77be3db | ||
|
|
81357695c5 | ||
|
|
2fdc16f9f2 | ||
|
|
869805132e | ||
|
|
4c583212f5 | ||
|
|
e17965be53 | ||
|
|
99627c8e93 | ||
|
|
98acd687f7 | ||
|
|
e1efec7d6c | ||
|
|
8df5e5e738 | ||
|
|
8a291f9d56 | ||
|
|
62791fabfa | ||
|
|
b0ada2dee5 | ||
|
|
8f4df1aa8c | ||
|
|
4deadc9dce | ||
|
|
a4c399d250 | ||
|
|
0f5891f25d | ||
|
|
5fec9b8d19 | ||
|
|
75ed5afbac | ||
|
|
01c553bad9 | ||
|
|
58bf267fdd | ||
|
|
8e064659ad | ||
|
|
fe29eadc34 | ||
|
|
42d75e119a | ||
|
|
01a03d6d32 | ||
|
|
bcb4f17d9a | ||
|
|
a4376c77c3 | ||
|
|
c61d2fe5d1 | ||
|
|
5779274e5b | ||
|
|
40ce930e18 | ||
|
|
c459994290 | ||
|
|
9b1e141aa9 | ||
|
|
52ed9a8848 | ||
|
|
37e1582c4c | ||
|
|
9e1b000e7f | ||
|
|
fcb128c51b | ||
|
|
8740696e75 | ||
|
|
b394ca891f | ||
|
|
3a0fda7d18 | ||
|
|
886d43d37a | ||
|
|
eec4ae1e87 | ||
|
|
6943b6ddc3 | ||
|
|
494d50bd55 | ||
|
|
eebc82cc95 | ||
|
|
4b104bb574 | ||
|
|
3500a1e588 | ||
|
|
8d44b680bd | ||
|
|
43ce8c5e46 | ||
|
|
0365304ae0 | ||
|
|
85dc866425 | ||
|
|
06e665fca7 | ||
|
|
0b6bbd85bd | ||
|
|
bf20b041e2 | ||
|
|
4aa0e1d60b | ||
|
|
7037e9cad3 | ||
|
|
cd2e8a8223 | ||
|
|
c0c2cc5068 | ||
|
|
71e4e19191 | ||
|
|
6014f3fb43 | ||
|
|
5302f703c0 | ||
|
|
cd011e6385 | ||
|
|
067dfa35c6 | ||
|
|
2ad9c87dda | ||
|
|
0224741105 | ||
|
|
134b9ad96e | ||
|
|
1170b048e8 | ||
|
|
eb8733f0f4 | ||
|
|
55acb940a8 | ||
|
|
0d691403de | ||
|
|
9b2b75a51d | ||
|
|
25da273ea0 | ||
|
|
dbcb82075f | ||
|
|
2f82cfe40f | ||
|
|
df30e22427 | ||
|
|
ec207e67a3 | ||
|
|
9df23cab62 | ||
|
|
db3d684ee0 | ||
|
|
c6ab725584 | ||
|
|
40cc3340b1 | ||
|
|
25e020f5c9 | ||
|
|
bbb4681b32 | ||
|
|
57ce18d70d | ||
|
|
7acea3ed09 | ||
|
|
b370d8ef31 | ||
|
|
c57ea0ec67 | ||
|
|
6a13cc2ab6 | ||
|
|
a4382ce3b3 | ||
|
|
df101ead91 | ||
|
|
a426b3bae4 | ||
|
|
7c9b38ba04 | ||
|
|
f92bd81190 | ||
|
|
972031cf06 | ||
|
|
fdc0ee18f1 | ||
|
|
07dafaf299 | ||
|
|
c5952c3308 | ||
|
|
904796cf24 | ||
|
|
bcff39661c | ||
|
|
8c7160079e | ||
|
|
fa8edd0f69 | ||
|
|
e2b251c145 | ||
|
|
21fdd7028f | ||
|
|
686b7f66ac | ||
|
|
e6501bb1ce | ||
|
|
53c26a5724 | ||
|
|
3605614ee7 | ||
|
|
8bf1d3ea84 | ||
|
|
51fd6327fe | ||
|
|
b81c0e30c1 | ||
|
|
640fd9f454 | ||
|
|
ab90aec001 | ||
|
|
1749c293a6 | ||
|
|
9b8d93bef2 | ||
|
|
85f14673f0 | ||
|
|
e17f932aff | ||
|
|
2a4792e762 | ||
|
|
7a0ca15df8 | ||
|
|
e523acc164 | ||
|
|
f1719b5580 | ||
|
|
4654d24f6f | ||
|
|
dd15ac6146 | ||
|
|
f5984e7523 | ||
|
|
f85902b0ce | ||
|
|
b6ef6cf1be | ||
|
|
e8115658e0 | ||
|
|
36228c4755 | ||
|
|
44a617a40d | ||
|
|
e108ddfd56 | ||
|
|
918d3914ba | ||
|
|
21aa07b9cc | ||
|
|
ec06c8788d | ||
|
|
96e85b1db5 | ||
|
|
afa806da18 | ||
|
|
7eaff76cec | ||
|
|
b0469254bc | ||
|
|
2228589e16 | ||
|
|
4d8480e1a1 | ||
|
|
4320cc78d9 | ||
|
|
d9d9678a7e | ||
|
|
d55a0bfec6 | ||
|
|
bee0df825e | ||
|
|
d00af63a61 | ||
|
|
6985075c5b | ||
|
|
3b1017df51 | ||
|
|
f5b81d2ffc | ||
|
|
eb9cfe0ecb | ||
|
|
1e8805d43d | ||
|
|
e8f089dfa4 | ||
|
|
84e929ea24 | ||
|
|
abec603e73 | ||
|
|
0ed19d4826 | ||
|
|
90d5654db9 | ||
|
|
ab21af6b08 | ||
|
|
b747c13ef4 | ||
|
|
6a12aca495 | ||
|
|
6ec904074b | ||
|
|
7133d6b225 | ||
|
|
d486db6459 | ||
|
|
fe777b8801 | ||
|
|
49c4b09db6 | ||
|
|
174d23e22f | ||
|
|
7c063b2933 | ||
|
|
e1c28a5f7c | ||
|
|
417a6d7c30 | ||
|
|
261cc19c59 | ||
|
|
9933cab59f | ||
|
|
5436e422b9 | ||
|
|
ca903faa56 | ||
|
|
fcf6f0a3a5 | ||
|
|
3cda90e3a1 | ||
|
|
e8b2a9fca0 | ||
|
|
36740ffdd8 | ||
|
|
4d67159ea2 | ||
|
|
6fef33cdb3 | ||
|
|
684cd37f8d | ||
|
|
b585d9f3d9 | ||
|
|
5add7a5062 | ||
|
|
21c0bf795a | ||
|
|
c4fea8ad24 | ||
|
|
a6483e79b2 | ||
|
|
27e99ca713 | ||
|
|
fff0efdb27 | ||
|
|
6ffb20a7f5 | ||
|
|
06517e623f | ||
|
|
8994ab9f98 | ||
|
|
ea0242feda | ||
|
|
56a452875e | ||
|
|
600f0f20bd | ||
|
|
05b3c9053e | ||
|
|
dfb102f68d | ||
|
|
d9fa43f1d7 | ||
|
|
db29f570bd | ||
|
|
cc390f11ee | ||
|
|
1b3e206f34 | ||
|
|
4df1607ec4 | ||
|
|
a62db72e02 | ||
|
|
1c09ef14a5 | ||
|
|
25b008ba3e | ||
|
|
28b325805b | ||
|
|
6d1584844e | ||
|
|
6fdd4945c1 | ||
|
|
cbd1bf2c37 | ||
|
|
23b98e2ca5 | ||
|
|
a0ec8bec8a | ||
|
|
36c362cbd2 | ||
|
|
84fde32616 | ||
|
|
f9c415fc41 | ||
|
|
4c71ec4770 | ||
|
|
3ab5157a49 | ||
|
|
34e349e323 | ||
|
|
20e5a7e042 | ||
|
|
76d9b8bac0 | ||
|
|
213161b7cd | ||
|
|
142c63ab0e | ||
|
|
dbcb196f4e | ||
|
|
5552ed6cf1 | ||
|
|
44941e571f | ||
|
|
876d6e2499 | ||
|
|
9dc9b42475 | ||
|
|
1e4b48c548 | ||
|
|
ce277ebbf5 | ||
|
|
feb0e479fa | ||
|
|
036c4004f7 | ||
|
|
858b3024ff | ||
|
|
cc267055e1 | ||
|
|
24967b543a | ||
|
|
ea4a4a60f1 | ||
|
|
a5223279ac | ||
|
|
265ae16160 | ||
|
|
9e34dde632 | ||
|
|
bfe5f7e63c | ||
|
|
56f9edc572 | ||
|
|
6595557c34 | ||
|
|
e1a79c4112 | ||
|
|
51b646efcf | ||
|
|
c729849843 | ||
|
|
795514900d | ||
|
|
c0563be36e | ||
|
|
462f8dce30 | ||
|
|
1e392e4437 | ||
|
|
b2a0485139 | ||
|
|
d4cb739b8b | ||
|
|
f16071f083 | ||
|
|
a1505e9bed | ||
|
|
390e47a8c6 | ||
|
|
8e48312b1f | ||
|
|
4c4eb9a94e | ||
|
|
b8e0f9cdfb | ||
|
|
0ba7bae794 | ||
|
|
c2357fdac6 | ||
|
|
52aa5a52e9 | ||
|
|
2f9ef86e97 | ||
|
|
fbe4cdff23 | ||
|
|
a3231aa723 | ||
|
|
ce75a66e7c | ||
|
|
524fd5e9c0 | ||
|
|
0fa25acda8 | ||
|
|
1631d3cf01 | ||
|
|
55812a7a8d | ||
|
|
e342698d8e | ||
|
|
3ed1f64f2e | ||
|
|
2aff31c07a | ||
|
|
575a874832 | ||
|
|
d61e0cb7bf | ||
|
|
07b81cfdc9 | ||
|
|
d7fed95390 | ||
|
|
c72908e377 | ||
|
|
ea376e858c | ||
|
|
877180829c | ||
|
|
2b1499a087 | ||
|
|
7934814077 | ||
|
|
4a32a9e066 | ||
|
|
ff35dacf4c | ||
|
|
6f32d59997 | ||
|
|
f02423074c | ||
|
|
38d51783ae | ||
|
|
af5397d678 | ||
|
|
9985688b5b | ||
|
|
d27766aff0 | ||
|
|
cfeca9b9ff | ||
|
|
716bba53df | ||
|
|
8965b0be21 | ||
|
|
0c3d7c6ed1 | ||
|
|
2131ef0560 | ||
|
|
6745a33d53 | ||
|
|
b2e1870a14 | ||
|
|
6e52c091f3 | ||
|
|
1b5b8fce54 | ||
|
|
b1e3cdc666 | ||
|
|
94a1cd6c93 | ||
|
|
fcdfcae427 | ||
|
|
9d733e50f9 | ||
|
|
3c37bf9ca4 | ||
|
|
42f708bbb6 | ||
|
|
86a7e93a48 | ||
|
|
72a68e9a0f | ||
|
|
ccd34ab03a | ||
|
|
76f23396ea | ||
|
|
51bc06a68a | ||
|
|
8b20a4b066 | ||
|
|
8fea099d99 | ||
|
|
550e234a37 | ||
|
|
3b4e65d8a9 | ||
|
|
4b397fc2cc | ||
|
|
90f76fa28c | ||
|
|
f05444dc94 | ||
|
|
28b1f3ab03 | ||
|
|
36e5d4770b | ||
|
|
95e392e206 | ||
|
|
f23e5875d5 | ||
|
|
8d83414d09 | ||
|
|
1c405f8a2c | ||
|
|
58d1a3b093 | ||
|
|
71563cc6c6 | ||
|
|
f3fa3a34bd | ||
|
|
5ed56eb876 | ||
|
|
790a010615 | ||
|
|
a5033afaf8 | ||
|
|
ba7fdb8ceb | ||
|
|
8be9800567 | ||
|
|
c4eabc3c52 | ||
|
|
a0e95abebe | ||
|
|
aa3ce35683 | ||
|
|
19a0407560 | ||
|
|
6ef02a67db | ||
|
|
ca65f0fd8e | ||
|
|
87ca2bc42e | ||
|
|
aa233a82a5 | ||
|
|
aaa8e98bb0 | ||
|
|
0d0d281d0c | ||
|
|
c4bbcd322b | ||
|
|
7aea1b1235 | ||
|
|
41c16436bf | ||
|
|
dc75ce6811 | ||
|
|
4c8e851b46 | ||
|
|
ba22973919 | ||
|
|
f5f3d2221d | ||
|
|
2bbb229c91 | ||
|
|
8047141981 | ||
|
|
c2a43157d2 | ||
|
|
738b30a743 | ||
|
|
6e6ffe13f8 | ||
|
|
eb96d127b0 | ||
|
|
aeaa3c5d66 | ||
|
|
2e0ef11b0f | ||
|
|
1b770e8638 | ||
|
|
60421c33f4 | ||
|
|
872c660cb3 | ||
|
|
83a00843a0 | ||
|
|
300c4b8afb | ||
|
|
96092ef2d3 | ||
|
|
d9002ad87d | ||
|
|
36a8811cc0 | ||
|
|
b82d4f3af8 | ||
|
|
6aab2b22a1 | ||
|
|
6c429059e0 | ||
|
|
2b18744cc2 | ||
|
|
4c1ea0a602 | ||
|
|
9415812d85 | ||
|
|
d3c728557e | ||
|
|
6558c52849 | ||
|
|
eaaffd2706 | ||
|
|
86a63e7e2f | ||
|
|
9c7e6711c6 | ||
|
|
adcbdddc12 | ||
|
|
7e3724b5f3 | ||
|
|
dd910dcb85 | ||
|
|
bf40951a4f | ||
|
|
97955dbab8 | ||
|
|
4531dc2af1 | ||
|
|
2c8f56dd84 | ||
|
|
ec31750330 | ||
|
|
111364d880 | ||
|
|
92123cdc2c | ||
|
|
76ec2f10c6 | ||
|
|
a34d056de2 | ||
|
|
58b17f08e0 | ||
|
|
9d37ee4709 | ||
|
|
991c36d649 | ||
|
|
f6f68573b6 | ||
|
|
99db5cca38 | ||
|
|
d124e1ccbc | ||
|
|
73131735a2 | ||
|
|
96f5a23387 | ||
|
|
28d0d218ff | ||
|
|
d99f4c8164 | ||
|
|
e9ca9d41d1 | ||
|
|
b488067f82 | ||
|
|
b280ab555c | ||
|
|
41c107d4f7 | ||
|
|
86d4429197 | ||
|
|
ddd62e25df | ||
|
|
43ec8805b1 | ||
|
|
482da7288f | ||
|
|
547bcc7b03 | ||
|
|
5b7a58c8bb | ||
|
|
b10c91cf11 | ||
|
|
2d9a3be88f | ||
|
|
936900d4d8 | ||
|
|
e2eebc69dd | ||
|
|
dc4562cbfc | ||
|
|
7382a15b89 | ||
|
|
0325f94de1 | ||
|
|
ce53d34b4d | ||
|
|
26383d5c22 | ||
|
|
76e3da15e3 | ||
|
|
a9be080ebc | ||
|
|
7b5f8d00a0 | ||
|
|
76546d89f1 | ||
|
|
004aea23c8 | ||
|
|
3045ff7788 | ||
|
|
fed03193e2 | ||
|
|
c3d9c27091 | ||
|
|
240227de79 | ||
|
|
be2be5c831 | ||
|
|
2ae0a52928 | ||
|
|
d325b6b85c | ||
|
|
b612cfa38b | ||
|
|
0f06620d40 | ||
|
|
fbc5dbcfd4 | ||
|
|
297572dc03 | ||
|
|
8832d54b53 | ||
|
|
7c09b0bcba | ||
|
|
56ac17f085 | ||
|
|
4196c23d44 | ||
|
|
7ba5718be6 | ||
|
|
c1163ce7e5 | ||
|
|
da187eaaf9 | ||
|
|
de0268ce86 | ||
|
|
108923bdaa | ||
|
|
44793f7a21 | ||
|
|
7cb1805272 | ||
|
|
d5c528b7c7 | ||
|
|
742cb712d8 | ||
|
|
5d6008eed2 | ||
|
|
1a62a25d36 | ||
|
|
fd1c5d826c | ||
|
|
58be7f4861 | ||
|
|
4031b00915 | ||
|
|
6345d57512 | ||
|
|
159e577543 | ||
|
|
b2e05d0683 | ||
|
|
274150af27 | ||
|
|
ae27a09ffe | ||
|
|
cd33f589dc | ||
|
|
9ee736fe27 | ||
|
|
ced1058b31 | ||
|
|
aae83220f1 | ||
|
|
f3f44bffcb | ||
|
|
2d3e911efa | ||
|
|
56236f56a8 | ||
|
|
df5a08517a | ||
|
|
07c62112b8 | ||
|
|
f23e4963bf | ||
|
|
95279f7084 | ||
|
|
1014558c91 | ||
|
|
6515062a3a | ||
|
|
8153e26b6d | ||
|
|
79fd33d49a | ||
|
|
cdb662d4b2 | ||
|
|
a27fa7b5df | ||
|
|
cdeed107c5 | ||
|
|
be92f7e78c | ||
|
|
76f9de4cfb | ||
|
|
cd6d2cbf5e | ||
|
|
deaca0189f | ||
|
|
7d54ee286d | ||
|
|
dddfc7a8ad | ||
|
|
673bfb0dee | ||
|
|
b9e8c5a38c | ||
|
|
a2a4ca20e4 | ||
|
|
12075459d2 | ||
|
|
f3770f3106 | ||
|
|
90fbf1770f | ||
|
|
bde94ab37f | ||
|
|
6d25e1777e | ||
|
|
7ce26ca8e5 | ||
|
|
367fcce634 | ||
|
|
9b3a44b339 | ||
|
|
6384191102 | ||
|
|
5d953f915a | ||
|
|
dd2cb92685 | ||
|
|
b2f08c3ff8 | ||
|
|
75a2460649 | ||
|
|
01493d4e3a | ||
|
|
35970f61dc | ||
|
|
2169b72c94 | ||
|
|
0cb56b3cfa | ||
|
|
81b06d68f1 | ||
|
|
2e246341d1 | ||
|
|
9513300835 | ||
|
|
f7caf0db07 | ||
|
|
f7c1b290fd | ||
|
|
e3ac835cc3 | ||
|
|
23386f6129 | ||
|
|
3ccc58a9fc | ||
|
|
acd5dd0794 | ||
|
|
2c0867619c | ||
|
|
67406b24ba | ||
|
|
a395701f29 | ||
|
|
ac12dff1af | ||
|
|
33923464ae | ||
|
|
55a3114ec9 | ||
|
|
ee125975cf | ||
|
|
23b0aabb35 | ||
|
|
095fd9fba4 | ||
|
|
674344b3c1 | ||
|
|
4fc964d293 | ||
|
|
516267d869 | ||
|
|
ab60229311 | ||
|
|
1482fb81fd | ||
|
|
051cdd4560 |
@@ -1,2 +1,12 @@
|
|||||||
# Set the default behavior, in case people don't have core.autocrlf set.
|
# Set the default behavior, in case people don't have core.autocrlf set.
|
||||||
* text=auto
|
* text=auto
|
||||||
|
|
||||||
|
# Shell scripts are run by Git Bash on Windows CI, which cannot read a script
|
||||||
|
# with CRLF line endings: it fails on the first line. Windows checkouts default
|
||||||
|
# to core.autocrlf=true, so keep these LF whatever the platform.
|
||||||
|
*.sh text eol=lf
|
||||||
|
|
||||||
|
# Batch files are read by cmd.exe, which tracks a byte offset into the file to
|
||||||
|
# resume after `call :label`. With LF endings that offset can land wrong and the
|
||||||
|
# label lookup fails, so keep these CRLF whatever the platform.
|
||||||
|
*.bat text eol=crlf
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: 🐞 Bug Report
|
name: 🐞 Bug Report
|
||||||
description: File a bug report
|
description: Something behaves incorrectly while Orca Slicer keeps running
|
||||||
labels: ["bug"]
|
labels: ["bug"]
|
||||||
body:
|
body:
|
||||||
- type: markdown
|
- type: markdown
|
||||||
@@ -10,6 +10,8 @@ body:
|
|||||||
Please note that this is not the place to make feature requests or ask for help.
|
Please note that this is not the place to make feature requests or ask for help.
|
||||||
For this, please use the [Feature request](https://github.com/OrcaSlicer/OrcaSlicer/issues/new?assignees=&labels=&projects=&template=feature_request.yml) issue type or you can discuss your idea on our [Discord server](https://discord.gg/P4VE9UY9gJ) with others.
|
For this, please use the [Feature request](https://github.com/OrcaSlicer/OrcaSlicer/issues/new?assignees=&labels=&projects=&template=feature_request.yml) issue type or you can discuss your idea on our [Discord server](https://discord.gg/P4VE9UY9gJ) with others.
|
||||||
|
|
||||||
|
If Orca Slicer closes on its own, freezes or stops responding, please use the [Crash report](https://github.com/OrcaSlicer/OrcaSlicer/issues/new?assignees=&labels=&projects=&template=crash_report.yml) form instead. It asks for the logs a crash needs.
|
||||||
|
|
||||||
Before filing, please check if the issue already exists (either open or closed) by using the search bar on the issues page. If it does, comment there. Even if it's closed, we can reopen it based on your comment.
|
Before filing, please check if the issue already exists (either open or closed) by using the search bar on the issues page. If it does, comment there. Even if it's closed, we can reopen it based on your comment.
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
attributes:
|
attributes:
|
||||||
@@ -47,7 +49,7 @@ body:
|
|||||||
id: os_type
|
id: os_type
|
||||||
attributes:
|
attributes:
|
||||||
label: "Operating System (OS)"
|
label: "Operating System (OS)"
|
||||||
description: "What OSes are you are experiencing issues on?"
|
description: "What OSes are you experiencing issues on?"
|
||||||
multiple: true
|
multiple: true
|
||||||
options:
|
options:
|
||||||
- Linux
|
- Linux
|
||||||
@@ -86,7 +88,7 @@ body:
|
|||||||
id: reproduce_steps
|
id: reproduce_steps
|
||||||
attributes:
|
attributes:
|
||||||
label: How to reproduce
|
label: How to reproduce
|
||||||
description: Please described the detailed steps to reproduce this issue
|
description: Please describe the detailed steps to reproduce this issue
|
||||||
placeholder: |
|
placeholder: |
|
||||||
1. Go to '...'
|
1. Go to '...'
|
||||||
2. Click on '...'
|
2. Click on '...'
|
||||||
@@ -108,28 +110,23 @@ body:
|
|||||||
description: What should happen after the above steps?
|
description: What should happen after the above steps?
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: markdown
|
|
||||||
id: file_required
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
Please be sure to add the following files:
|
|
||||||
* Please upload a ZIP archive containing the **project file** used when the problem arise. Please export it just before or after the problem occurs. Even if you did nothing and/or there is no object, export it! (We need the configurations in project file).
|
|
||||||
You can export the project file from the application menu in `File`->`Save project as...`, then zip it
|
|
||||||
* A **log file** for crashes and similar issues.
|
|
||||||
You can find your log file here:
|
|
||||||
Windows: `%APPDATA%\OrcaSlicer\log` or usually `C:\Users\<your username>\AppData\Roaming\OrcaSlicer\log`
|
|
||||||
MacOS: `$HOME/Library/Application Support/OrcaSlicer/log`
|
|
||||||
Linux: `$HOME/.config/OrcaSlicer/log`
|
|
||||||
If Orca Slicer still starts, you can also reach this directory from the application menu in `Help` -> `Show Configuration Folder`
|
|
||||||
You can zip the log directory, or just select the newest logs when this issue happens, and zip them
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: file_uploads
|
id: file_uploads
|
||||||
attributes:
|
attributes:
|
||||||
label: Project file & Debug log uploads
|
label: Project file & Debug log uploads
|
||||||
description: Drop the project file and debug log here
|
description: |
|
||||||
|
Attach the files with the **Paste, drop, or click to add files** control directly underneath this box. Zip anything that is not a `.log`, `.txt` or image, since GitHub rejects other file types, and keep each file under 25 MB.
|
||||||
|
|
||||||
|
* The **project file** used when the problem happened, zipped. Export it just before or after the problem occurs. Even if you did nothing and there is no object on the plate, export it, since we need the configuration it carries. `File` -> `Save project as...`
|
||||||
|
* The **log folder**, zipped. `Help` -> `Show Configuration Folder` opens it, or find it at:
|
||||||
|
* Windows: `%APPDATA%\OrcaSlicer\log`, usually `C:\Users\<you>\AppData\Roaming\OrcaSlicer\log`
|
||||||
|
* macOS: `$HOME/Library/Application Support/OrcaSlicer/log`
|
||||||
|
* Linux: `$HOME/.config/OrcaSlicer/log`
|
||||||
|
* Flatpak: `$HOME/.var/app/com.orcaslicer.OrcaSlicer/config/OrcaSlicer/log`
|
||||||
|
* If the zip comes out over 25 MB, attach the newest logs from that folder on their own instead.
|
||||||
placeholder: |
|
placeholder: |
|
||||||
Project File: `File` -> `Save project as...` then zip it & drop it here
|
Zipped project file
|
||||||
Log File: `Help` -> `Show Configuration Folder`, then zip the log directory, or just select the newest logs in `log` when this issue happens and zip them, then drop the zip file here
|
Zipped log folder
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
@@ -144,7 +141,5 @@ body:
|
|||||||
label: Anything else?
|
label: Anything else?
|
||||||
description: |
|
description: |
|
||||||
Screenshots? References? Anything that will give us more context about the issue you are encountering!
|
Screenshots? References? Anything that will give us more context about the issue you are encountering!
|
||||||
|
|
||||||
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
|
|
||||||
validations:
|
validations:
|
||||||
required: false
|
required: false
|
||||||
|
|||||||
@@ -0,0 +1,183 @@
|
|||||||
|
name: 💥 Crash Report
|
||||||
|
description: Orca Slicer closes on its own, freezes or stops responding
|
||||||
|
labels: ["crash"]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
**Thank you for taking the time to report a crash.**
|
||||||
|
|
||||||
|
Use this form when Orca Slicer closes on its own, freezes, or stops responding.
|
||||||
|
If the application stays open and only produces a wrong result, please use the [Bug report](https://github.com/OrcaSlicer/OrcaSlicer/issues/new?assignees=&labels=&projects=&template=bug_report.yml) form instead.
|
||||||
|
A printer whose toolhead collides with the print is also a bug report rather than a crash, since the application itself did not stop.
|
||||||
|
|
||||||
|
Before filing, please check if the issue already exists (either open or closed) by using the search bar on the issues page. If it does, comment there. Even if it's closed, we can reopen it based on your comment.
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Is this crash reproducible in the latest nightly build?
|
||||||
|
description: >
|
||||||
|
Please verify this crash still happens in the latest nightly build first. It may already be fixed there:
|
||||||
|
[Nightly builds](https://github.com/OrcaSlicer/OrcaSlicer/releases/tag/nightly-builds).
|
||||||
|
options:
|
||||||
|
- label: I have checked the latest nightly build and the crash is still reproducible
|
||||||
|
required: true
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Is there an existing issue for this crash?
|
||||||
|
description: Please search to see if an issue already exists for the crash you encountered.
|
||||||
|
options:
|
||||||
|
- label: I have searched the existing issues
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: version
|
||||||
|
attributes:
|
||||||
|
label: OrcaSlicer Version
|
||||||
|
description: Which version of Orca Slicer are you running? You can see the full version in `Help` -> `About Orca Slicer`.
|
||||||
|
placeholder: e.g. 2.5.0
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: working_version
|
||||||
|
attributes:
|
||||||
|
label: Regression compared to a previous version
|
||||||
|
description: Did it work in a previous version?
|
||||||
|
placeholder: e.g. 2.3.2
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: dropdown
|
||||||
|
id: os_type
|
||||||
|
attributes:
|
||||||
|
label: "Operating System (OS)"
|
||||||
|
description: "What OSes are you seeing the crash on?"
|
||||||
|
multiple: true
|
||||||
|
options:
|
||||||
|
- Linux
|
||||||
|
- macOS
|
||||||
|
- Windows
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: os_version
|
||||||
|
attributes:
|
||||||
|
label: "OS Version"
|
||||||
|
description: "What OS version does this relate to?"
|
||||||
|
placeholder: "i.e. OS: Windows 7/8/10/11 ..., Ubuntu 22.04/Fedora 36 ..., macOS 10.15/11.1/12.3 ..."
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: printer
|
||||||
|
attributes:
|
||||||
|
label: Printer
|
||||||
|
description: Which printer was selected
|
||||||
|
placeholder: Voron 2.4/VzBot/Prusa MK4/Bambu Lab X1 series/Bambu Lab P1P/...
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: crash_moment
|
||||||
|
attributes:
|
||||||
|
label: When does the crash happen?
|
||||||
|
description: Pick the point where Orca Slicer stops working.
|
||||||
|
options:
|
||||||
|
- Not sure
|
||||||
|
- On startup, before the main window appears
|
||||||
|
- When opening or importing a project or model
|
||||||
|
- While changing printer, filament or process settings
|
||||||
|
- While slicing
|
||||||
|
- In the 3D view, Preview or Assembly view
|
||||||
|
- When exporting G-code or sending a print to the printer
|
||||||
|
- On the Device tab, or connecting to a printer (camera, sync, login)
|
||||||
|
- While using a specific tool, dialog or calibration
|
||||||
|
- After resuming from sleep or changing monitors
|
||||||
|
- When closing the application
|
||||||
|
- No clear pattern
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: crash_frequency
|
||||||
|
attributes:
|
||||||
|
label: How often does it happen?
|
||||||
|
options:
|
||||||
|
- Not sure
|
||||||
|
- Every time
|
||||||
|
- Often, but not every time
|
||||||
|
- Rarely
|
||||||
|
- It only happened once
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: fresh_config
|
||||||
|
attributes:
|
||||||
|
label: Does it still crash with a fresh configuration?
|
||||||
|
description: >
|
||||||
|
Close Orca Slicer and rename your configuration folder (`%APPDATA%\OrcaSlicer` on Windows,
|
||||||
|
`$HOME/Library/Application Support/OrcaSlicer` on macOS, `$HOME/.config/OrcaSlicer` on Linux),
|
||||||
|
then start it again. Renaming keeps your settings, so you can put the folder back afterwards.
|
||||||
|
options:
|
||||||
|
- I have not tried this
|
||||||
|
- Yes, it still crashes
|
||||||
|
- No, the crash goes away
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: reproduce_steps
|
||||||
|
attributes:
|
||||||
|
label: How to reproduce
|
||||||
|
description: Please describe the detailed steps that lead to the crash.
|
||||||
|
placeholder: |
|
||||||
|
1. Go to '...'
|
||||||
|
2. Click on '...'
|
||||||
|
3. Scroll down to '...'
|
||||||
|
4. Orca Slicer closes
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: system_info
|
||||||
|
attributes:
|
||||||
|
label: Additional system information
|
||||||
|
description: >
|
||||||
|
Display card and driver version are worth adding for crashes on startup or in the 3D view.
|
||||||
|
CPU and memory are worth adding for crashes while slicing.
|
||||||
|
placeholder: |
|
||||||
|
CPU: 11th gen Intel r core tm i7-1185g7/AMD Ryzen 7 6800h/...
|
||||||
|
Memory: 32/16 GB...
|
||||||
|
Display Card: NVIDIA Quadro P400/...
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
id: file_uploads
|
||||||
|
attributes:
|
||||||
|
label: Project file, logs and crash report uploads
|
||||||
|
description: |
|
||||||
|
A crash report without logs usually cannot be acted on. Attach the files with the **Paste, drop, or click to add files** control directly underneath this box. Zip anything that is not a `.log`, `.txt` or image, since GitHub rejects other file types, and keep each file under 25 MB.
|
||||||
|
|
||||||
|
* The **project file** used when the crash happened, zipped. Export it just before or after the crash, even if the plate is empty, since we need the configuration it carries. `File` -> `Save project as...`
|
||||||
|
* The whole **log folder**, zipped rather than single files picked out of it. `Help` -> `Show Configuration Folder` opens it, or find it at:
|
||||||
|
* Windows: `%APPDATA%\OrcaSlicer\log`, usually `C:\Users\<you>\AppData\Roaming\OrcaSlicer\log`
|
||||||
|
* macOS: `$HOME/Library/Application Support/OrcaSlicer/log`
|
||||||
|
* Linux: `$HOME/.config/OrcaSlicer/log`
|
||||||
|
* Flatpak: `$HOME/.var/app/com.orcaslicer.OrcaSlicer/config/OrcaSlicer/log`
|
||||||
|
* On Windows the crash itself is written to a separate `crash_*.log` in there, and that is the file we need most. If the zip comes out over 25 MB GitHub will refuse it, so attach the newest log and any `crash_*.log` on their own instead.
|
||||||
|
* The **operating system crash report**, on macOS and Linux, where Orca Slicer cannot write its own crash log. It is often the only record of where it died:
|
||||||
|
* macOS: Console.app -> Crash Reports, or `$HOME/Library/Logs/DiagnosticReports/`. The file starts with `OrcaSlicer` and ends in `.ips`. Zip it before attaching, GitHub does not accept `.ips` files.
|
||||||
|
* Linux: run `orca-slicer` from a terminal (Flatpak: `flatpak run com.orcaslicer.OrcaSlicer`) and paste everything it prints when it dies. On systemd systems `coredumpctl info orca-slicer` gives a backtrace.
|
||||||
|
placeholder: |
|
||||||
|
Zipped project file
|
||||||
|
Zipped log folder
|
||||||
|
Zipped macOS .ips crash report, or the terminal output on Linux
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: checkboxes
|
||||||
|
id: file_checklist
|
||||||
|
attributes:
|
||||||
|
label: Checklist of files to include
|
||||||
|
options:
|
||||||
|
- label: Log folder
|
||||||
|
- label: Project file
|
||||||
|
- label: Operating system crash report (macOS and Linux)
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Anything else?
|
||||||
|
description: |
|
||||||
|
Screenshots? References? Anything that will give us more context about the crash you are encountering!
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
+192
-15
@@ -14,6 +14,10 @@ on:
|
|||||||
- 'localization/**'
|
- 'localization/**'
|
||||||
- 'resources/**'
|
- 'resources/**'
|
||||||
- ".github/workflows/build_*.yml"
|
- ".github/workflows/build_*.yml"
|
||||||
|
- ".github/workflows/unit_tests*.yml"
|
||||||
|
- 'build_win.bat'
|
||||||
|
- 'scripts/test_build_win.ps1'
|
||||||
|
- 'scripts/build_preset_cache.*'
|
||||||
- 'scripts/flatpak/**'
|
- 'scripts/flatpak/**'
|
||||||
- 'scripts/msix/**'
|
- 'scripts/msix/**'
|
||||||
- 'tests/**'
|
- 'tests/**'
|
||||||
@@ -29,10 +33,12 @@ on:
|
|||||||
- '**/CMakeLists.txt'
|
- '**/CMakeLists.txt'
|
||||||
- 'version.inc'
|
- 'version.inc'
|
||||||
- ".github/workflows/build_*.yml"
|
- ".github/workflows/build_*.yml"
|
||||||
|
- ".github/workflows/unit_tests*.yml"
|
||||||
- 'build_linux.sh'
|
- 'build_linux.sh'
|
||||||
- 'build_release_vs.bat'
|
- 'build_win.bat'
|
||||||
- 'build_release_vs2022.bat'
|
- 'scripts/test_build_win.ps1'
|
||||||
- 'build_release_macos.sh'
|
- 'build_release_macos.sh'
|
||||||
|
- 'scripts/build_preset_cache.*'
|
||||||
- 'scripts/flatpak/**'
|
- 'scripts/flatpak/**'
|
||||||
- 'scripts/msix/**'
|
- 'scripts/msix/**'
|
||||||
- 'tests/**'
|
- 'tests/**'
|
||||||
@@ -54,6 +60,22 @@ concurrency:
|
|||||||
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
# build_win.bat ships a test suite. Run it before the Windows builds.
|
||||||
|
check_build_script:
|
||||||
|
name: Windows build script tests
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
lfs: 'false'
|
||||||
|
|
||||||
|
# Windows PowerShell rather than pwsh: the suite drives build_win.bat
|
||||||
|
# through cmd, and the two differ in how they quote native arguments.
|
||||||
|
- name: Run the build script test suite
|
||||||
|
shell: powershell
|
||||||
|
run: .\scripts\test_build_win.ps1
|
||||||
|
|
||||||
build_linux:
|
build_linux:
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
@@ -79,14 +101,16 @@ jobs:
|
|||||||
# SELF_HOSTED skips arm64 (the self-hosted Windows server is x64-only).
|
# SELF_HOSTED skips arm64 (the self-hosted Windows server is x64-only).
|
||||||
matrix:
|
matrix:
|
||||||
include: ${{ fromJSON(vars.SELF_HOSTED
|
include: ${{ fromJSON(vars.SELF_HOSTED
|
||||||
&& '[{"arch":"x64","os":"orca-win-server"}]'
|
&& '[{"arch":"x64","os":"orca-win-server","compiler":"clang"}]'
|
||||||
|| '[{"arch":"x64","os":"windows-latest"},{"arch":"arm64","os":"windows-11-arm"}]') }}
|
|| '[{"arch":"x64","os":"windows-latest","compiler":"clang"},{"arch":"arm64","os":"windows-11-vs2026-arm","compiler":"clang"}]') }}
|
||||||
|
needs: check_build_script
|
||||||
# Don't run scheduled builds on forks:
|
# Don't run scheduled builds on forks:
|
||||||
if: ${{ !cancelled() && (github.event_name != 'schedule' || github.repository == 'OrcaSlicer/OrcaSlicer') }}
|
if: ${{ !cancelled() && needs.check_build_script.result == 'success' && (github.event_name != 'schedule' || github.repository == 'OrcaSlicer/OrcaSlicer') }}
|
||||||
uses: ./.github/workflows/build_check_cache.yml
|
uses: ./.github/workflows/build_check_cache.yml
|
||||||
with:
|
with:
|
||||||
os: ${{ matrix.os }}
|
os: ${{ matrix.os }}
|
||||||
arch: ${{ matrix.arch }}
|
arch: ${{ matrix.arch }}
|
||||||
|
compiler: ${{ matrix.compiler }}
|
||||||
build-deps-only: ${{ inputs.build-deps-only || false }}
|
build-deps-only: ${{ inputs.build-deps-only || false }}
|
||||||
force-build: ${{ github.event_name == 'schedule' }}
|
force-build: ${{ github.event_name == 'schedule' }}
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
@@ -147,7 +171,7 @@ jobs:
|
|||||||
if: ${{ !cancelled() && success() && !vars.SELF_HOSTED }}
|
if: ${{ !cancelled() && success() && !vars.SELF_HOSTED }}
|
||||||
uses: ./.github/workflows/unit_tests.yml
|
uses: ./.github/workflows/unit_tests.yml
|
||||||
with:
|
with:
|
||||||
os: windows-11-arm
|
os: windows-11-vs2026-arm
|
||||||
artifact: ${{ github.sha }}-tests-windows-arm64
|
artifact: ${{ github.sha }}-tests-windows-arm64
|
||||||
test-dir: build-arm64/tests
|
test-dir: build-arm64/tests
|
||||||
unit_tests_macos_arm64:
|
unit_tests_macos_arm64:
|
||||||
@@ -185,7 +209,7 @@ jobs:
|
|||||||
./validator-bin/OrcaSlicer_profile_validator -p "${{ github.workspace }}/resources/profiles" -s -l 2
|
./validator-bin/OrcaSlicer_profile_validator -p "${{ github.workspace }}/resources/profiles" -s -l 2
|
||||||
publish_test_results:
|
publish_test_results:
|
||||||
name: Publish Test Results
|
name: Publish Test Results
|
||||||
needs: [unit_tests_linux_x86_64, unit_tests_linux_aarch64, unit_tests_windows_x64, unit_tests_windows_arm64, unit_tests_macos_arm64]
|
needs: [unit_tests_linux_x86_64, unit_tests_linux_aarch64, unit_tests_windows_x64, unit_tests_windows_arm64, unit_tests_macos_arm64, unit_tests_flatpak_x86_64, unit_tests_flatpak_aarch64]
|
||||||
if: ${{ !cancelled() }}
|
if: ${{ !cancelled() }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
@@ -257,38 +281,148 @@ jobs:
|
|||||||
echo "date=$(date +'%Y%m%d')" >> $GITHUB_ENV
|
echo "date=$(date +'%Y%m%d')" >> $GITHUB_ENV
|
||||||
echo "git_commit_hash=$git_commit_hash" >> $GITHUB_ENV
|
echo "git_commit_hash=$git_commit_hash" >> $GITHUB_ENV
|
||||||
shell: bash
|
shell: bash
|
||||||
# Manage flatpak-builder cache externally so PRs restore but never upload
|
- name: Compute the flatpak-builder cache key
|
||||||
|
id: fp_cache_key
|
||||||
|
run: echo "key=flatpak-builder-${{ matrix.variant.arch }}-${{ hashFiles('deps/**', 'scripts/flatpak/com.orcaslicer.OrcaSlicer.yml', 'scripts/flatpak/make_deps_tar.sh') }}" >> "$GITHUB_OUTPUT"
|
||||||
|
shell: bash
|
||||||
|
# Manage flatpak-builder cache externally so PRs restore but never upload.
|
||||||
|
# The compiler cache under it is keyed per run below, so it is left out.
|
||||||
- name: Restore flatpak-builder cache
|
- name: Restore flatpak-builder cache
|
||||||
if: github.event_name == 'pull_request'
|
if: github.event_name == 'pull_request'
|
||||||
uses: actions/cache/restore@v6
|
uses: actions/cache/restore@v6
|
||||||
with:
|
with:
|
||||||
path: .flatpak-builder
|
path: |
|
||||||
key: flatpak-builder-${{ matrix.variant.arch }}-${{ github.event.pull_request.base.sha }}
|
.flatpak-builder/*
|
||||||
|
!.flatpak-builder/ccache
|
||||||
|
key: ${{ steps.fp_cache_key.outputs.key }}
|
||||||
restore-keys: flatpak-builder-${{ matrix.variant.arch }}-
|
restore-keys: flatpak-builder-${{ matrix.variant.arch }}-
|
||||||
- name: Save/restore flatpak-builder cache
|
- name: Save/restore flatpak-builder cache
|
||||||
if: github.event_name != 'pull_request'
|
if: github.event_name != 'pull_request'
|
||||||
uses: actions/cache@v6
|
uses: actions/cache@v6
|
||||||
with:
|
with:
|
||||||
path: .flatpak-builder
|
path: |
|
||||||
key: flatpak-builder-${{ matrix.variant.arch }}-${{ github.sha }}
|
.flatpak-builder/*
|
||||||
|
!.flatpak-builder/ccache
|
||||||
|
key: ${{ steps.fp_cache_key.outputs.key }}
|
||||||
restore-keys: flatpak-builder-${{ matrix.variant.arch }}-
|
restore-keys: flatpak-builder-${{ matrix.variant.arch }}-
|
||||||
|
# Compiler cache for the OrcaSlicer module, as in build_orca.yml. Pull
|
||||||
|
# requests only restore it; every other run (main, release branches, the
|
||||||
|
# nightly, a dispatch) saves it. orca_deps stays on the state cache above.
|
||||||
|
- name: Name the compiler cache leg
|
||||||
|
run: |
|
||||||
|
leg="Flatpak-${{ matrix.variant.arch }}"
|
||||||
|
echo "CCACHE_LEG=$leg" >> "$GITHUB_ENV"
|
||||||
|
echo "CCACHE_ENTRY=ccache-$leg-${{ github.run_id }}-${{ github.run_attempt }}" >> "$GITHUB_ENV"
|
||||||
|
shell: bash
|
||||||
|
- name: Restore compiler cache
|
||||||
|
id: ccache_restore
|
||||||
|
uses: actions/cache/restore@v6
|
||||||
|
with:
|
||||||
|
path: .flatpak-builder/ccache
|
||||||
|
key: ${{ env.CCACHE_ENTRY }}
|
||||||
|
restore-keys: ccache-${{ env.CCACHE_LEG }}-
|
||||||
- name: Disable debug info for faster CI builds
|
- name: Disable debug info for faster CI builds
|
||||||
run: |
|
run: |
|
||||||
sed -i '/^build-options:/a\ no-debuginfo: true\n strip: true' \
|
sed -i '/^build-options:/a\ no-debuginfo: true\n strip: true' \
|
||||||
scripts/flatpak/com.orcaslicer.OrcaSlicer.yml
|
scripts/flatpak/com.orcaslicer.OrcaSlicer.yml
|
||||||
shell: bash
|
shell: bash
|
||||||
- name: Inject git commit hash into Flatpak manifest
|
# flatpak-builder reuses a module from its cache when the definition and
|
||||||
|
# sources are unchanged, so a re-run of the same commit would skip the
|
||||||
|
# OrcaSlicer module and ship no test asset. A per-run value in that module's
|
||||||
|
# env keeps it rebuilding; orca_deps stays cached, and the compiler cache
|
||||||
|
# still serves the rebuild.
|
||||||
|
- name: Inject commit hash and flatpak-builder cache buster into Flatpak manifest
|
||||||
|
env:
|
||||||
|
flatpak_builder_cache_buster: ${{ github.run_id }}-${{ github.run_attempt }}
|
||||||
run: |
|
run: |
|
||||||
sed -i "/name: OrcaSlicer/{n;s|buildsystem: simple|buildsystem: simple\n build-options:\n env:\n git_commit_hash: \"$git_commit_hash\"|}" \
|
sed -i "/name: OrcaSlicer/{n;s|buildsystem: simple|buildsystem: simple\n build-options:\n env:\n flatpak_builder_cache_buster: \"$flatpak_builder_cache_buster\"\n git_commit_hash: \"$git_commit_hash\"|}" \
|
||||||
scripts/flatpak/com.orcaslicer.OrcaSlicer.yml
|
scripts/flatpak/com.orcaslicer.OrcaSlicer.yml
|
||||||
shell: bash
|
shell: bash
|
||||||
|
# flatpak-builder's --ccache only wraps cc and gcc, and the manifest builds
|
||||||
|
# with clang, so CMake's launcher runs ccache instead; --ccache is still what
|
||||||
|
# mounts the cache directory into the sandbox. The settings go into that
|
||||||
|
# directory's own config file, which the sandbox reads too.
|
||||||
|
- name: Enable compiler cache
|
||||||
|
run: |
|
||||||
|
printf ' %s\n' \
|
||||||
|
'CMAKE_C_COMPILER_LAUNCHER: ccache' \
|
||||||
|
'CMAKE_CXX_COMPILER_LAUNCHER: ccache' > "$RUNNER_TEMP/ccache-env.yml"
|
||||||
|
sed -i "/^ git_commit_hash: /r $RUNNER_TEMP/ccache-env.yml" \
|
||||||
|
scripts/flatpak/com.orcaslicer.OrcaSlicer.yml
|
||||||
|
grep -q '^ CMAKE_CXX_COMPILER_LAUNCHER: ccache$' scripts/flatpak/com.orcaslicer.OrcaSlicer.yml
|
||||||
|
mkdir -p .flatpak-builder/ccache
|
||||||
|
export CCACHE_DIR=$PWD/.flatpak-builder/ccache
|
||||||
|
ccache --set-config=max_size=3G
|
||||||
|
# The compiler is reinstalled every run, so its mtime means nothing.
|
||||||
|
ccache --set-config=compiler_check=content
|
||||||
|
# Headers a fresh checkout has just written, the few files that use
|
||||||
|
# __DATE__ or __TIME__, and the precompiled header, whose macros ccache
|
||||||
|
# cannot see.
|
||||||
|
ccache --set-config=sloppiness=pch_defines,time_macros,include_file_mtime,include_file_ctime
|
||||||
|
# Hash the includes the compiler reports instead of preprocessing every
|
||||||
|
# miss before compiling it.
|
||||||
|
ccache --set-config=depend_mode=true
|
||||||
|
# The restored directory carries the previous run's counters.
|
||||||
|
ccache -z
|
||||||
|
shell: bash
|
||||||
|
- name: Check the manifest keeps orca_deps cacheable
|
||||||
|
run: ./scripts/flatpak/check_manifest_cacheable.sh
|
||||||
|
shell: bash
|
||||||
|
- name: Pack deps/ for the Flatpak manifest
|
||||||
|
run: ./scripts/flatpak/make_deps_tar.sh
|
||||||
|
shell: bash
|
||||||
- uses: flatpak/flatpak-github-actions/flatpak-builder@master
|
- uses: flatpak/flatpak-github-actions/flatpak-builder@master
|
||||||
with:
|
with:
|
||||||
bundle: OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak
|
bundle: OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak
|
||||||
manifest-path: scripts/flatpak/com.orcaslicer.OrcaSlicer.yml
|
manifest-path: scripts/flatpak/com.orcaslicer.OrcaSlicer.yml
|
||||||
cache: false
|
# cache only turns on flatpak-builder --ccache; the caching itself is above.
|
||||||
|
cache: true
|
||||||
|
restore-cache: false
|
||||||
|
save-cache: false
|
||||||
arch: ${{ matrix.variant.arch }}
|
arch: ${{ matrix.variant.arch }}
|
||||||
upload-artifact: false
|
upload-artifact: false
|
||||||
|
# run-tests fires the module's build-only test-commands; keep-build-dirs
|
||||||
|
# retains the binaries for the packaging step below.
|
||||||
|
run-tests: true
|
||||||
|
keep-build-dirs: true
|
||||||
|
# The build has just touched everything it can use, so an object untouched
|
||||||
|
# for a week is dead, usually orphaned by a flag change.
|
||||||
|
- name: Compiler cache statistics
|
||||||
|
if: always()
|
||||||
|
run: |
|
||||||
|
export CCACHE_DIR=$PWD/.flatpak-builder/ccache
|
||||||
|
ccache --evict-older-than 7d
|
||||||
|
ccache -s -v || ccache -s
|
||||||
|
shell: bash
|
||||||
|
# Save the new entry first, then drop the older ones for this leg on this
|
||||||
|
# ref, so a failed save leaves the previous entry in place. A cancelled or
|
||||||
|
# failed build saves too, since what it compiled is still valid; a restore
|
||||||
|
# that did not finish does not, since the directory may be a truncated copy.
|
||||||
|
- name: Save compiler cache
|
||||||
|
id: ccache_save
|
||||||
|
if: ${{ always() && steps.ccache_restore.outcome == 'success' && github.event_name != 'pull_request' }}
|
||||||
|
uses: actions/cache/save@v6
|
||||||
|
with:
|
||||||
|
path: .flatpak-builder/ccache
|
||||||
|
key: ${{ env.CCACHE_ENTRY }}
|
||||||
|
- name: Drop older compiler cache entries
|
||||||
|
if: ${{ always() && steps.ccache_save.outcome == 'success' }}
|
||||||
|
# The container has no gh, so this is the list and delete over the REST API.
|
||||||
|
# Older means a lower run id, so two runs finishing close together keep
|
||||||
|
# the newer entry whichever of them cleans up last.
|
||||||
|
continue-on-error: true
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
run: |
|
||||||
|
api="$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/actions/caches"
|
||||||
|
curl -sSf -H "Authorization: Bearer $GH_TOKEN" \
|
||||||
|
"$api?ref=$GITHUB_REF&key=ccache-$CCACHE_LEG-&per_page=100" \
|
||||||
|
| jq -r --arg prefix "ccache-$CCACHE_LEG-" --argjson run "$GITHUB_RUN_ID" \
|
||||||
|
'.actions_caches[] | select((.key | ltrimstr($prefix) | split("-")[0] | tonumber?) < $run) | .id' \
|
||||||
|
| while read -r id; do
|
||||||
|
curl -sSf -X DELETE -H "Authorization: Bearer $GH_TOKEN" "$api/$id"
|
||||||
|
done
|
||||||
|
shell: bash
|
||||||
- name: Upload artifacts Flatpak
|
- name: Upload artifacts Flatpak
|
||||||
uses: actions/upload-artifact@v7
|
uses: actions/upload-artifact@v7
|
||||||
with:
|
with:
|
||||||
@@ -304,3 +438,46 @@ jobs:
|
|||||||
asset_name: OrcaSlicer-Linux-flatpak_nightly${{ env.nightly_suffix }}_${{ matrix.variant.arch }}.flatpak
|
asset_name: OrcaSlicer-Linux-flatpak_nightly${{ env.nightly_suffix }}_${{ matrix.variant.arch }}.flatpak
|
||||||
asset_content_type: application/octet-stream
|
asset_content_type: application/octet-stream
|
||||||
max_releases: 1 # optional, if there are more releases than this matching the asset_name, the oldest ones are going to be deleted
|
max_releases: 1 # optional, if there are more releases than this matching the asset_name, the oldest ones are going to be deleted
|
||||||
|
# The asset is /app (the exes link it at runtime) plus the build tree
|
||||||
|
# slimmed to what ctest needs.
|
||||||
|
- name: Package flatpak test asset
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
d=$(ls -d .flatpak-builder/build/OrcaSlicer-* | tail -1)
|
||||||
|
find "$d/build_flatpak" -mindepth 1 -maxdepth 1 ! -name tests -exec rm -rf {} +
|
||||||
|
# Strip debug info (the SDK builds with -g, only the app gets stripped);
|
||||||
|
# the bounds checks are compiled in, so a stripped exe still catches them.
|
||||||
|
find "$d/build_flatpak/tests" -type f -perm -u+x -exec strip --strip-unneeded {} + 2>/dev/null || true
|
||||||
|
# At runtime the tests read tests/ (TEST_DATA_DIR), scripts/, and under
|
||||||
|
# resources/ the shipped profiles (PROFILES_DIR) and the printers/ maps.
|
||||||
|
find "$d" -mindepth 1 -maxdepth 1 -type d \
|
||||||
|
! -name tests ! -name build_flatpak ! -name scripts ! -name resources -exec rm -rf {} +
|
||||||
|
find "$d/resources" -mindepth 1 -maxdepth 1 ! -name profiles ! -name printers -exec rm -rf {} +
|
||||||
|
tar -cf flatpak-test-asset.tar flatpak_app "$d"
|
||||||
|
- name: Upload flatpak test asset
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: ${{ github.sha }}-flatpak-tests-${{ matrix.variant.arch }}
|
||||||
|
path: flatpak-test-asset.tar
|
||||||
|
retention-days: 1
|
||||||
|
# keep-build-dirs would otherwise land in the flatpak-builder cache saved post-job.
|
||||||
|
- name: Drop the kept build dirs before the flatpak-builder cache saves
|
||||||
|
if: always()
|
||||||
|
shell: bash
|
||||||
|
run: rm -rf .flatpak-builder/build
|
||||||
|
unit_tests_flatpak_x86_64:
|
||||||
|
name: Flatpak x86_64
|
||||||
|
needs: flatpak
|
||||||
|
if: ${{ !cancelled() && success() }}
|
||||||
|
uses: ./.github/workflows/unit_tests_flatpak.yml
|
||||||
|
with:
|
||||||
|
os: ubuntu-24.04
|
||||||
|
artifact: ${{ github.sha }}-flatpak-tests-x86_64
|
||||||
|
unit_tests_flatpak_aarch64:
|
||||||
|
name: Flatpak aarch64
|
||||||
|
needs: flatpak
|
||||||
|
if: ${{ !cancelled() && success() }}
|
||||||
|
uses: ./.github/workflows/unit_tests_flatpak.yml
|
||||||
|
with:
|
||||||
|
os: ubuntu-24.04-arm
|
||||||
|
artifact: ${{ github.sha }}-flatpak-tests-aarch64
|
||||||
|
|||||||
@@ -9,6 +9,10 @@ on:
|
|||||||
arch:
|
arch:
|
||||||
required: false
|
required: false
|
||||||
type: string
|
type: string
|
||||||
|
compiler:
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
default: msvc
|
||||||
build-deps-only:
|
build-deps-only:
|
||||||
required: false
|
required: false
|
||||||
type: boolean
|
type: boolean
|
||||||
@@ -33,11 +37,12 @@ jobs:
|
|||||||
- name: set outputs
|
- name: set outputs
|
||||||
id: set_outputs
|
id: set_outputs
|
||||||
env:
|
env:
|
||||||
# Keep macOS/Windows cache keys architecture-specific. amd64 Linux passes
|
# Anything that changes how the tree is built belongs in the key, or a job
|
||||||
# no arch (key stays 'linux-clang', preserving the existing cache);
|
# restores one it cannot use. Linux amd64 passes no arch deliberately, so
|
||||||
# aarch64 gets its own 'linux-clang-aarch64' key.
|
# 'linux-clang' keeps the cache it already has.
|
||||||
cache-os: ${{ runner.os == 'macOS' && format('macos-{0}', inputs.arch) || (runner.os == 'Windows' && format('windows-{0}', inputs.arch) || format('linux-clang{0}', inputs.arch && format('-{0}', inputs.arch) || '')) }}
|
cache-os: ${{ runner.os == 'macOS' && format('macos-{0}', inputs.arch) || (runner.os == 'Windows' && format('windows-{0}-{1}', inputs.arch, inputs.compiler) || format('linux-clang{0}', inputs.arch && format('-{0}', inputs.arch) || '')) }}
|
||||||
# ARM64 builds use the build-arm64 tree (see build_release_vs.bat); x64/other use build.
|
# The Windows ARM64 deps build in build-arm64, all others under build;
|
||||||
|
# build_deps.yml and build_orca.yml pass the Windows directory to build_win.bat.
|
||||||
dep-folder-name: ${{ runner.os == 'macOS' && format('/{0}', inputs.arch) || (runner.os == 'Windows' && inputs.arch == 'arm64') && '-arm64/OrcaSlicer_dep' || '/OrcaSlicer_dep' }}
|
dep-folder-name: ${{ runner.os == 'macOS' && format('/{0}', inputs.arch) || (runner.os == 'Windows' && inputs.arch == 'arm64') && '-arm64/OrcaSlicer_dep' || '/OrcaSlicer_dep' }}
|
||||||
output-cmd: ${{ runner.os == 'Windows' && '$env:GITHUB_OUTPUT' || '"$GITHUB_OUTPUT"'}}
|
output-cmd: ${{ runner.os == 'Windows' && '$env:GITHUB_OUTPUT' || '"$GITHUB_OUTPUT"'}}
|
||||||
run: |
|
run: |
|
||||||
@@ -62,6 +67,7 @@ jobs:
|
|||||||
valid-cache: ${{ needs.check_cache.outputs.valid-cache == 'true' }}
|
valid-cache: ${{ needs.check_cache.outputs.valid-cache == 'true' }}
|
||||||
os: ${{ inputs.os }}
|
os: ${{ inputs.os }}
|
||||||
arch: ${{ inputs.arch }}
|
arch: ${{ inputs.arch }}
|
||||||
|
compiler: ${{ inputs.compiler }}
|
||||||
build-deps-only: ${{ inputs.build-deps-only }}
|
build-deps-only: ${{ inputs.build-deps-only }}
|
||||||
force-build: ${{ inputs.force-build }}
|
force-build: ${{ inputs.force-build }}
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|||||||
@@ -16,6 +16,10 @@ on:
|
|||||||
arch:
|
arch:
|
||||||
required: false
|
required: false
|
||||||
type: string
|
type: string
|
||||||
|
compiler:
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
default: msvc
|
||||||
build-deps-only:
|
build-deps-only:
|
||||||
required: false
|
required: false
|
||||||
type: boolean
|
type: boolean
|
||||||
@@ -134,14 +138,11 @@ jobs:
|
|||||||
if (-not "${{ vars.SELF_HOSTED }}") {
|
if (-not "${{ vars.SELF_HOSTED }}") {
|
||||||
choco install strawberryperl
|
choco install strawberryperl
|
||||||
}
|
}
|
||||||
$arch = "${{ inputs.arch }}"
|
# cache-path is the install directory inside the deps build directory.
|
||||||
if ($arch -eq "arm64") {
|
$deps = (Split-Path "${{ inputs.cache-path }}").Replace('\', '/')
|
||||||
.\build_release_vs.bat deps arm64
|
# -l compiles with Visual Studio's clang-cl and -x builds with Ninja; --msvc --msbuild is cl under the Visual Studio generator.
|
||||||
.\build_release_vs.bat pack arm64
|
$flags = if ("${{ inputs.compiler }}" -eq "clang") { "-l", "-x" } else { "--msvc", "--msbuild" }
|
||||||
} else {
|
.\build_win.bat -d --arch ${{ inputs.arch }} --deps-dir $deps @flags
|
||||||
.\build_release_vs.bat deps
|
|
||||||
.\build_release_vs.bat pack
|
|
||||||
}
|
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
|
|
||||||
- name: Build on Mac ${{ inputs.arch }}
|
- name: Build on Mac ${{ inputs.arch }}
|
||||||
@@ -149,9 +150,9 @@ jobs:
|
|||||||
working-directory: ${{ github.workspace }}
|
working-directory: ${{ github.workspace }}
|
||||||
run: |
|
run: |
|
||||||
if [ -z "${{ vars.SELF_HOSTED }}" ]; then
|
if [ -z "${{ vars.SELF_HOSTED }}" ]; then
|
||||||
brew install automake texinfo libtool
|
brew install automake texinfo libtool pkgconf yasm nasm
|
||||||
fi
|
fi
|
||||||
./build_release_macos.sh -dx ${{ !vars.SELF_HOSTED && '-1' || '' }} -a ${{ inputs.arch }} -t 10.15
|
./build_release_macos.sh -dx ${{ !vars.SELF_HOSTED && '-j 3' || '' }} -a ${{ inputs.arch }} -t 10.15
|
||||||
(cd "${{ github.workspace }}/deps/build/${{ inputs.arch }}" && \
|
(cd "${{ github.workspace }}/deps/build/${{ inputs.arch }}" && \
|
||||||
find . -mindepth 1 -maxdepth 1 ! -name 'OrcaSlicer_dep' -exec rm -rf {} +)
|
find . -mindepth 1 -maxdepth 1 ! -name 'OrcaSlicer_dep' -exec rm -rf {} +)
|
||||||
|
|
||||||
@@ -204,4 +205,5 @@ jobs:
|
|||||||
cache-path: ${{ inputs.cache-path }}
|
cache-path: ${{ inputs.cache-path }}
|
||||||
os: ${{ inputs.os }}
|
os: ${{ inputs.os }}
|
||||||
arch: ${{ inputs.arch }}
|
arch: ${{ inputs.arch }}
|
||||||
|
compiler: ${{ inputs.compiler }}
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|||||||
@@ -13,6 +13,10 @@ on:
|
|||||||
arch:
|
arch:
|
||||||
required: false
|
required: false
|
||||||
type: string
|
type: string
|
||||||
|
compiler:
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
default: msvc
|
||||||
macos-combine-only:
|
macos-combine-only:
|
||||||
required: false
|
required: false
|
||||||
type: boolean
|
type: boolean
|
||||||
@@ -72,6 +76,60 @@ jobs:
|
|||||||
if (-not (Test-Path "$cmakeBin\cmake.exe")) { throw "cmake.exe not found at $cmakeBin" }
|
if (-not (Test-Path "$cmakeBin\cmake.exe")) { throw "cmake.exe not found at $cmakeBin" }
|
||||||
Add-Content -Path $env:GITHUB_PATH -Value $cmakeBin
|
Add-Content -Path $env:GITHUB_PATH -Value $cmakeBin
|
||||||
|
|
||||||
|
# Compiler cache. Pushes save it, so main keeps it warm; pull requests
|
||||||
|
# restore it and discard what they compiled. Objects are keyed on the
|
||||||
|
# preprocessed source, the compiler and the flags, so a leg only ever
|
||||||
|
# hits its own entries. A failed install costs the caching, not the build.
|
||||||
|
- name: Name the compiler cache leg
|
||||||
|
if: ${{ !inputs.macos-combine-only }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
leg="${{ runner.os }}-${{ inputs.arch || 'amd64' }}${{ runner.os == 'Windows' && format('-{0}', inputs.compiler) || '' }}"
|
||||||
|
echo "CCACHE_LEG=$leg" >> "$GITHUB_ENV"
|
||||||
|
echo "CCACHE_ENTRY=ccache-$leg-${{ github.run_id }}-${{ github.run_attempt }}" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
|
# The action only installs and configures ccache. Restore and save go
|
||||||
|
# through actions/cache with one path string, since the cache service
|
||||||
|
# only matches entries saved under the identical path and the action
|
||||||
|
# spells it differently on Windows.
|
||||||
|
- name: Compiler cache
|
||||||
|
id: ccache
|
||||||
|
if: ${{ !inputs.macos-combine-only }}
|
||||||
|
continue-on-error: true
|
||||||
|
uses: hendrikmuhs/ccache-action@v1.2.24
|
||||||
|
with:
|
||||||
|
key: ${{ env.CCACHE_LEG }}
|
||||||
|
max-size: 3G
|
||||||
|
restore: false
|
||||||
|
save: false
|
||||||
|
# ccache -s runs as its own step; no summary table per job.
|
||||||
|
job-summary: ''
|
||||||
|
|
||||||
|
- name: Restore compiler cache
|
||||||
|
id: ccache_restore
|
||||||
|
if: ${{ steps.ccache.outcome == 'success' }}
|
||||||
|
uses: actions/cache/restore@v6
|
||||||
|
with:
|
||||||
|
path: ${{ github.workspace }}/.ccache
|
||||||
|
key: ${{ env.CCACHE_ENTRY }}
|
||||||
|
restore-keys: ccache-${{ env.CCACHE_LEG }}-
|
||||||
|
|
||||||
|
- name: Enable compiler cache
|
||||||
|
if: ${{ steps.ccache.outcome == 'success' }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "CMAKE_C_COMPILER_LAUNCHER=ccache" >> "$GITHUB_ENV"
|
||||||
|
echo "CMAKE_CXX_COMPILER_LAUNCHER=ccache" >> "$GITHUB_ENV"
|
||||||
|
# Headers a fresh checkout has just written, the few files that
|
||||||
|
# use __DATE__ or __TIME__, and the precompiled header, whose
|
||||||
|
# macros ccache cannot see.
|
||||||
|
echo "CCACHE_SLOPPINESS=pch_defines,time_macros,include_file_mtime,include_file_ctime" >> "$GITHUB_ENV"
|
||||||
|
# Hash the includes the compiler reports instead of preprocessing
|
||||||
|
# every miss before compiling it.
|
||||||
|
echo "CCACHE_DEPEND=1" >> "$GITHUB_ENV"
|
||||||
|
# The restored directory carries the previous run's counters.
|
||||||
|
ccache -z
|
||||||
|
|
||||||
- name: Get the version and date on Ubuntu and macOS
|
- name: Get the version and date on Ubuntu and macOS
|
||||||
if: runner.os != 'Windows'
|
if: runner.os != 'Windows'
|
||||||
run: |
|
run: |
|
||||||
@@ -145,7 +203,7 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
ORCA_TESTS_BUILD_ONLY: ${{ inputs.arch == 'arm64' && '1' || '' }}
|
ORCA_TESTS_BUILD_ONLY: ${{ inputs.arch == 'arm64' && '1' || '' }}
|
||||||
run: |
|
run: |
|
||||||
./build_release_macos.sh -s -n -x ${{ !vars.SELF_HOSTED && '-1' || '' }} -a ${{ inputs.arch }} -t 10.15 ${{ inputs.arch == 'arm64' && '-T' || '' }}
|
./build_release_macos.sh -s -n -x ${{ !vars.SELF_HOSTED && '-j 3' || '' }} -a ${{ inputs.arch }} -t 10.15 ${{ inputs.arch == 'arm64' && '-T' || '' }}
|
||||||
|
|
||||||
- name: Pack unit tests mac
|
- name: Pack unit tests mac
|
||||||
if: runner.os == 'macOS' && !inputs.macos-combine-only && inputs.arch == 'arm64'
|
if: runner.os == 'macOS' && !inputs.macos-combine-only && inputs.arch == 'arm64'
|
||||||
@@ -162,6 +220,14 @@ jobs:
|
|||||||
retention-days: 5
|
retention-days: 5
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
|
|
||||||
|
- name: Build system preset cache (macOS)
|
||||||
|
if: runner.os == 'macOS' && !inputs.macos-combine-only
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
shell: bash
|
||||||
|
# The bundle was already packed from resources/, so the caches have to be
|
||||||
|
# installed into it here; the source tree keeps its JSONs for later jobs.
|
||||||
|
run: ./scripts/build_preset_cache.sh -b build/${{ inputs.arch }} build/${{ inputs.arch }}/OrcaSlicer/OrcaSlicer.app/Contents/Resources/profiles
|
||||||
|
|
||||||
- name: Pack macOS app bundle ${{ inputs.arch }}
|
- name: Pack macOS app bundle ${{ inputs.arch }}
|
||||||
if: runner.os == 'macOS' && !inputs.macos-combine-only
|
if: runner.os == 'macOS' && !inputs.macos-combine-only
|
||||||
working-directory: ${{ github.workspace }}
|
working-directory: ${{ github.workspace }}
|
||||||
@@ -196,7 +262,7 @@ jobs:
|
|||||||
if: runner.os == 'macOS' && inputs.macos-combine-only
|
if: runner.os == 'macOS' && inputs.macos-combine-only
|
||||||
working-directory: ${{ github.workspace }}
|
working-directory: ${{ github.workspace }}
|
||||||
run: |
|
run: |
|
||||||
./build_release_macos.sh -u -x ${{ !vars.SELF_HOSTED && '-1' || '' }} -a universal -t 10.15
|
./build_release_macos.sh -u -x ${{ !vars.SELF_HOSTED && '-j 3' || '' }} -a universal -t 10.15
|
||||||
|
|
||||||
# Thanks to RaySajuuk, it's working now
|
# Thanks to RaySajuuk, it's working now
|
||||||
- name: Sign app and notary
|
- name: Sign app and notary
|
||||||
@@ -384,12 +450,22 @@ jobs:
|
|||||||
# env:
|
# env:
|
||||||
# WindowsSdkDir: 'C:\Program Files (x86)\Windows Kits\10\'
|
# WindowsSdkDir: 'C:\Program Files (x86)\Windows Kits\10\'
|
||||||
# WindowsSDKVersion: '10.0.26100.0\'
|
# WindowsSDKVersion: '10.0.26100.0\'
|
||||||
# "tests" builds the unit tests too; the unit_tests_windows_* jobs run them.
|
# --tests builds the unit tests too; the unit_tests_windows_* jobs run them.
|
||||||
run: |
|
run: |
|
||||||
$arch = "${{ inputs.arch }}"
|
# cache-path is the install directory inside the deps build directory.
|
||||||
if ($arch -eq "arm64") { .\build_release_vs.bat slicer arm64 tests } else { .\build_release_vs.bat slicer tests }
|
$deps = (Split-Path "${{ inputs.cache-path }}").Replace('\', '/')
|
||||||
|
# -l compiles with Visual Studio's clang-cl and -x builds with Ninja; --msvc --msbuild is cl under the Visual Studio generator.
|
||||||
|
$flags = if ("${{ inputs.compiler }}" -eq "clang") { "-l", "-x" } else { "--msvc", "--msbuild" }
|
||||||
|
.\build_win.bat -s --tests -i --arch ${{ inputs.arch }} --build-dir $env:BUILD_DIR --deps-dir $deps @flags
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
|
|
||||||
|
- name: Build system preset cache (Windows)
|
||||||
|
if: runner.os == 'Windows'
|
||||||
|
shell: cmd
|
||||||
|
# Shipped into both the already-installed tree (portable zip, MSIX) and
|
||||||
|
# the checkout cpack re-installs from when it builds the NSIS installer.
|
||||||
|
run: scripts\build_preset_cache.bat --prune-source "%BUILD_DIR%" "resources\profiles" "%BUILD_DIR%\OrcaSlicer\resources\profiles"
|
||||||
|
|
||||||
- name: Pack unit tests Win
|
- name: Pack unit tests Win
|
||||||
if: runner.os == 'Windows'
|
if: runner.os == 'Windows'
|
||||||
working-directory: ${{ github.workspace }}
|
working-directory: ${{ github.workspace }}
|
||||||
@@ -539,6 +615,20 @@ jobs:
|
|||||||
retention-days: 5
|
retention-days: 5
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
|
|
||||||
|
- name: Build system preset cache (Linux)
|
||||||
|
if: runner.os == 'Linux'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
# Both were packed from resources/ before the caches existed, so the
|
||||||
|
# AppImage is unpacked first and the caches shipped into it and into
|
||||||
|
# the package tree; the source tree keeps its JSONs for later steps.
|
||||||
|
appimage=$(find build -maxdepth 1 -name "OrcaSlicer_Linux_AppImage*.AppImage" | head -1)
|
||||||
|
chmod +x "$appimage"
|
||||||
|
"$appimage" --appimage-extract
|
||||||
|
./scripts/build_preset_cache.sh -b build build/package/resources/profiles squashfs-root/resources/profiles
|
||||||
|
appimagetool=$(find build -name "appimagetool.AppImage" | head -1)
|
||||||
|
ARCH=$(uname -m) "$appimagetool" --appimage-extract-and-run squashfs-root "$appimage"
|
||||||
|
rm -rf squashfs-root
|
||||||
# Ship the freshly-built validator so slice_check_linux (build_all.yml)
|
# Ship the freshly-built validator so slice_check_linux (build_all.yml)
|
||||||
# can slice-sweep the shipped profiles with this PR's engine. Taken from
|
# can slice-sweep the shipped profiles with this PR's engine. Taken from
|
||||||
# the aarch64 leg so the sweep also exercises the arm build; x86_64 on
|
# the aarch64 leg so the sweep also exercises the arm build; x86_64 on
|
||||||
@@ -626,3 +716,41 @@ jobs:
|
|||||||
asset_name: orca_custom_preset_tests.zip
|
asset_name: orca_custom_preset_tests.zip
|
||||||
asset_content_type: application/octet-stream
|
asset_content_type: application/octet-stream
|
||||||
max_releases: 1
|
max_releases: 1
|
||||||
|
|
||||||
|
# The build has just touched everything it can use, so an object
|
||||||
|
# untouched for a week is dead, usually orphaned by a flag change.
|
||||||
|
- name: Compiler cache statistics
|
||||||
|
if: ${{ always() && steps.ccache.outcome == 'success' }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
ccache --evict-older-than 7d
|
||||||
|
ccache -s -v || ccache -s
|
||||||
|
|
||||||
|
# Entries are immutable, so the new one is saved first and the older
|
||||||
|
# ones for this leg on this ref are dropped afterwards: a failed save
|
||||||
|
# leaves the previous entry in place. A cancelled or failed build saves
|
||||||
|
# too, since what it compiled is still valid; a restore that did not
|
||||||
|
# finish does not, since the directory may be a truncated copy.
|
||||||
|
- name: Save compiler cache
|
||||||
|
id: ccache_save
|
||||||
|
if: ${{ always() && steps.ccache_restore.outcome == 'success' && github.event_name != 'pull_request' }}
|
||||||
|
uses: actions/cache/save@v6
|
||||||
|
with:
|
||||||
|
path: ${{ github.workspace }}/.ccache
|
||||||
|
key: ${{ env.CCACHE_ENTRY }}
|
||||||
|
|
||||||
|
- name: Drop older compiler cache entries
|
||||||
|
if: ${{ always() && steps.ccache_save.outcome == 'success' }}
|
||||||
|
# A read-only token (fork PRs) cannot delete; that only costs storage.
|
||||||
|
# Older means a lower run id, so two runs finishing close together keep
|
||||||
|
# the newer entry whichever of them cleans up last.
|
||||||
|
continue-on-error: true
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
run: |
|
||||||
|
gh cache list --ref "$GITHUB_REF" --key "ccache-$CCACHE_LEG-" --limit 100 --json id,key \
|
||||||
|
| jq -r --arg prefix "ccache-$CCACHE_LEG-" --argjson run "$GITHUB_RUN_ID" \
|
||||||
|
'.[] | select((.key | ltrimstr($prefix) | split("-")[0] | tonumber?) < $run) | .id' \
|
||||||
|
| tr -d '\r' \
|
||||||
|
| while read -r id; do gh cache delete "$id"; done
|
||||||
|
|||||||
@@ -9,6 +9,11 @@ on:
|
|||||||
- release/*
|
- release/*
|
||||||
paths:
|
paths:
|
||||||
- 'resources/profiles/**'
|
- 'resources/profiles/**'
|
||||||
|
# orca_profile_tool.py also validates resources/printers/bambu_filament_ids.json, and
|
||||||
|
# both it and its tests live in scripts/, so a PR touching only those must still run
|
||||||
|
# this workflow.
|
||||||
|
- 'resources/printers/**'
|
||||||
|
- 'scripts/**'
|
||||||
- ".github/workflows/check_profiles.yml"
|
- ".github/workflows/check_profiles.yml"
|
||||||
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@@ -32,12 +37,23 @@ jobs:
|
|||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v7
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
- name: Run extra JSON check
|
# Deliberately not continue-on-error, unlike every check below: if the tool itself is
|
||||||
id: extra_json_check
|
# broken, nothing it then reports about the profiles is worth reading.
|
||||||
|
- name: Run the profile tool's own unit tests
|
||||||
|
run: python3 -m unittest discover -s scripts/tests -t scripts
|
||||||
|
|
||||||
|
# What the validator below cannot see. It loads the tree the way the slicer does, so
|
||||||
|
# it never notices a profile no <vendor>.json indexes, a preset name two files claim,
|
||||||
|
# an id that is not the mint of its own triple, or a file that normalize and
|
||||||
|
# update-index would still rewrite.
|
||||||
|
# The step id is the handle the PR comment and the failure gate below use; renaming it
|
||||||
|
# silently disables them.
|
||||||
|
- name: Check profiles (orca_profile_tool.py)
|
||||||
|
id: profile_tool
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
run: |
|
run: |
|
||||||
set +e
|
set +e
|
||||||
python3 ./scripts/orca_extra_profile_check.py 2>&1 | tee ${{ runner.temp }}/extra_json_check.log
|
python3 ./scripts/orca_profile_tool.py check 2>&1 | tee ${{ runner.temp }}/profile_tool.log
|
||||||
exit ${PIPESTATUS[0]}
|
exit ${PIPESTATUS[0]}
|
||||||
|
|
||||||
# download
|
# download
|
||||||
@@ -64,13 +80,14 @@ jobs:
|
|||||||
set +e
|
set +e
|
||||||
./OrcaSlicer_profile_validator -p ${{ github.workspace }}/resources/profiles -s -l 2 2>&1 | tee ${{ runner.temp }}/validate_slice.log
|
./OrcaSlicer_profile_validator -p ${{ github.workspace }}/resources/profiles -s -l 2 2>&1 | tee ${{ runner.temp }}/validate_slice.log
|
||||||
exit ${PIPESTATUS[0]}
|
exit ${PIPESTATUS[0]}
|
||||||
# For now run filament subtype check only for BBL profiles until we fix other vendors' profiles.
|
# All vendors' filament_id collisions were fixed (see scripts/filament_id_snapshot.json),
|
||||||
- name: validate filament subtype check for BBL profiles
|
# so the duplicate-filament-subtype check runs tree-wide.
|
||||||
|
- name: validate filament subtype check
|
||||||
id: validate_filament_subtypes
|
id: validate_filament_subtypes
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
run: |
|
run: |
|
||||||
set +e
|
set +e
|
||||||
./OrcaSlicer_profile_validator -p ${{ github.workspace }}/resources/profiles -l 2 -v BBL -f 2>&1 | tee ${{ runner.temp }}/validate_filament_subtypes.log
|
./OrcaSlicer_profile_validator -p ${{ github.workspace }}/resources/profiles -l 2 -f 2>&1 | tee ${{ runner.temp }}/validate_filament_subtypes.log
|
||||||
exit ${PIPESTATUS[0]}
|
exit ${PIPESTATUS[0]}
|
||||||
|
|
||||||
- name: validate custom presets
|
- name: validate custom presets
|
||||||
@@ -181,7 +198,7 @@ jobs:
|
|||||||
echo "${{ github.event.pull_request.number }}" > ${{ runner.temp }}/profile-check-results/pr_number.txt
|
echo "${{ github.event.pull_request.number }}" > ${{ runner.temp }}/profile-check-results/pr_number.txt
|
||||||
|
|
||||||
- name: Prepare comment artifact
|
- name: Prepare comment artifact
|
||||||
if: ${{ always() && github.event_name == 'pull_request' && (steps.extra_json_check.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_slice.outcome == 'failure' || steps.validate_filament_subtypes.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
|
if: ${{ always() && github.event_name == 'pull_request' && (steps.profile_tool.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_slice.outcome == 'failure' || steps.validate_filament_subtypes.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
|
||||||
run: |
|
run: |
|
||||||
{
|
{
|
||||||
# Marker matched by check_profiles_comment.yml to delete prior comments.
|
# Marker matched by check_profiles_comment.yml to delete prior comments.
|
||||||
@@ -189,11 +206,11 @@ jobs:
|
|||||||
echo "## :x: Profile Validation Errors"
|
echo "## :x: Profile Validation Errors"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
if [ "${{ steps.extra_json_check.outcome }}" = "failure" ]; then
|
if [ "${{ steps.profile_tool.outcome }}" = "failure" ]; then
|
||||||
echo "### Extra JSON Check Failed"
|
echo "### Profile Check Failed (orca_profile_tool.py)"
|
||||||
echo ""
|
echo ""
|
||||||
echo '```'
|
echo '```'
|
||||||
head -c 30000 ${{ runner.temp }}/extra_json_check.log || echo "No output captured"
|
head -c 30000 ${{ runner.temp }}/profile_tool.log || echo "No output captured"
|
||||||
echo '```'
|
echo '```'
|
||||||
echo ""
|
echo ""
|
||||||
fi
|
fi
|
||||||
@@ -217,7 +234,7 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "${{ steps.validate_filament_subtypes.outcome }}" = "failure" ]; then
|
if [ "${{ steps.validate_filament_subtypes.outcome }}" = "failure" ]; then
|
||||||
echo "### BBL Filament Subtype Validation Failed"
|
echo "### Filament Subtype Validation Failed"
|
||||||
echo ""
|
echo ""
|
||||||
echo '```'
|
echo '```'
|
||||||
head -c 30000 ${{ runner.temp }}/validate_filament_subtypes.log || echo "No output captured"
|
head -c 30000 ${{ runner.temp }}/validate_filament_subtypes.log || echo "No output captured"
|
||||||
@@ -235,7 +252,7 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
echo "---"
|
echo "---"
|
||||||
echo "*Please fix the above errors and push a new commit.*"
|
echo '*Fix the errors above and push a new commit. To reproduce this run locally: `scripts/check_profile.sh`, or `scripts\check_profile.bat` on Windows.*'
|
||||||
} > ${{ runner.temp }}/profile-check-results/pr_comment.md
|
} > ${{ runner.temp }}/profile-check-results/pr_comment.md
|
||||||
|
|
||||||
- name: Upload comment artifact
|
- name: Upload comment artifact
|
||||||
@@ -247,7 +264,8 @@ jobs:
|
|||||||
retention-days: 1
|
retention-days: 1
|
||||||
|
|
||||||
- name: Fail if any check failed
|
- name: Fail if any check failed
|
||||||
if: ${{ always() && (steps.extra_json_check.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_slice.outcome == 'failure' || steps.validate_filament_subtypes.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
|
if: ${{ always() && (steps.profile_tool.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_slice.outcome == 'failure' || steps.validate_filament_subtypes.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
|
||||||
run: |
|
run: |
|
||||||
echo "One or more profile checks failed. See above for details."
|
echo "One or more profile checks failed; see the step logs above."
|
||||||
|
echo 'Reproduce the whole run locally with scripts/check_profile.sh (scripts\check_profile.bat on Windows).'
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -19,11 +19,18 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
steps:
|
steps:
|
||||||
- uses: thejerrybao/setup-swap-space@v1
|
# Doxygen with call graphs over all of src/ outgrows the runner's RAM;
|
||||||
with:
|
# replace the runner's swapfile with an 8 GB one.
|
||||||
swap-space-path: /swapfile
|
- name: Grow swap space
|
||||||
swap-size-gb: 8
|
run: |
|
||||||
remove-existing-swap-files: true
|
set -euo pipefail
|
||||||
|
sudo swapoff -a
|
||||||
|
sudo rm -f /swapfile
|
||||||
|
sudo fallocate -l 8G /swapfile
|
||||||
|
sudo chmod 600 /swapfile
|
||||||
|
sudo mkswap /swapfile
|
||||||
|
sudo swapon /swapfile
|
||||||
|
free -h
|
||||||
|
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v7
|
uses: actions/checkout@v7
|
||||||
|
|||||||
@@ -0,0 +1,219 @@
|
|||||||
|
# Nightly parity checks from OrcaSlicer/orca-test-repo, kept out of the
|
||||||
|
# per-build "Run external slicer regression tests" step because they take far
|
||||||
|
# longer than that step's budget:
|
||||||
|
# effect - the CLI override sweep's full effect stage: every landed option
|
||||||
|
# re-sliced on its own to see whether it changes the G-code
|
||||||
|
# harness - the GUI-vs-CLI parity harness (metrics only, never fails)
|
||||||
|
# Both test the latest successful build_all.yml Linux AppImage from main, with
|
||||||
|
# sources checked out at the commit that build was made from. Nothing here
|
||||||
|
# gates a build or a PR.
|
||||||
|
name: Parity Nightly
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
# build_all.yml starts at 17:00 UTC and has finished by ~20:00
|
||||||
|
- cron: "0 21 * * *"
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
test_repo_ref:
|
||||||
|
description: "orca-test-repo ref to run"
|
||||||
|
required: false
|
||||||
|
default: "main"
|
||||||
|
build_branch:
|
||||||
|
description: "branch whose latest successful build_all artifact to test"
|
||||||
|
required: false
|
||||||
|
default: "main"
|
||||||
|
fixtures:
|
||||||
|
description: "harness fixture ids, space-separated (empty = all)"
|
||||||
|
required: false
|
||||||
|
default: ""
|
||||||
|
cli_presets:
|
||||||
|
description: "harness lane C presets: flat = flatten inherits first, raw = leaf profile as-is"
|
||||||
|
required: false
|
||||||
|
default: "flat"
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
actions: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Find the build to test
|
||||||
|
# Don't run scheduled checks on forks
|
||||||
|
if: github.event_name != 'schedule' || github.repository == 'OrcaSlicer/OrcaSlicer'
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
outputs:
|
||||||
|
run_id: ${{ steps.find.outputs.run_id }}
|
||||||
|
head_sha: ${{ steps.find.outputs.head_sha }}
|
||||||
|
steps:
|
||||||
|
- id: find
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
GH_REPO: ${{ github.repository }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
gh run list --workflow build_all.yml \
|
||||||
|
--branch "${{ inputs.build_branch || 'main' }}" \
|
||||||
|
--status success --limit 1 --json databaseId,headSha \
|
||||||
|
--jq '"run_id=\(.[0].databaseId)\nhead_sha=\(.[0].headSha)"' \
|
||||||
|
>> "$GITHUB_OUTPUT"
|
||||||
|
cat "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
effect:
|
||||||
|
name: Override sweep effect stage (shard ${{ matrix.shard }})
|
||||||
|
needs: build
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
timeout-minutes: 60
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
# orca-test-repo's parity/effect_routing.json holds a 2-way split,
|
||||||
|
# ~12.5 min a shard on this runner
|
||||||
|
shard: [0, 1]
|
||||||
|
steps:
|
||||||
|
- &checkout-suite
|
||||||
|
name: Check out the test suite
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
repository: OrcaSlicer/orca-test-repo
|
||||||
|
ref: ${{ inputs.test_repo_ref || 'main' }}
|
||||||
|
path: orca-test-repo
|
||||||
|
|
||||||
|
# The AppImage ships only packed preset caches, so profiles and the CLI
|
||||||
|
# option surface come from the sources the build was made from
|
||||||
|
- &checkout-slicer
|
||||||
|
name: Check out OrcaSlicer at the build's commit
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
ref: ${{ needs.build.outputs.head_sha }}
|
||||||
|
path: slicer
|
||||||
|
lfs: 'false'
|
||||||
|
|
||||||
|
- &extract-appimage
|
||||||
|
name: Download and extract the Linux AppImage
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
GH_REPO: ${{ github.repository }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
gh run download "${{ needs.build.outputs.run_id }}" --dir appimage \
|
||||||
|
--pattern "OrcaSlicer_Linux_ubuntu_2404*"
|
||||||
|
appimage=$(find appimage -name "*.AppImage" ! -name "*aarch64*" | head -1)
|
||||||
|
[ -n "$appimage" ] || { echo "no x86_64 AppImage in run ${{ needs.build.outputs.run_id }}"; exit 1; }
|
||||||
|
chmod +x "$appimage"
|
||||||
|
"$appimage" --appimage-extract > /dev/null
|
||||||
|
# The bare binary cannot find the AppImage's bundled libraries; AppRun
|
||||||
|
# sets them up and execs it, so exit codes and signals pass through
|
||||||
|
[ -x squashfs-root/AppRun ] || { echo "no AppRun in the AppImage"; exit 1; }
|
||||||
|
echo "ORCA_BIN=$PWD/squashfs-root/AppRun" >> "$GITHUB_ENV"
|
||||||
|
echo "ORCA_SOURCE=$PWD/slicer" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
|
- name: Install the AppImage's host runtime dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y --no-install-recommends \
|
||||||
|
libopengl0 libglu1-mesa libgl1 libegl1 libwebkit2gtk-4.1-0
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v6
|
||||||
|
with:
|
||||||
|
python-version: "3.12"
|
||||||
|
|
||||||
|
- name: Install suite dependencies
|
||||||
|
run: pip install -r orca-test-repo/requirements.txt
|
||||||
|
|
||||||
|
- name: Run the override sweep with the full effect stage
|
||||||
|
id: run
|
||||||
|
continue-on-error: true
|
||||||
|
working-directory: orca-test-repo
|
||||||
|
run: |
|
||||||
|
set -o pipefail
|
||||||
|
# -rA keeps the per-stage summaries, which pytest otherwise swallows
|
||||||
|
# for passing tests
|
||||||
|
python -m pytest test_cli_overrides.py -c pytest.ini -v -rA \
|
||||||
|
--effect-full --effect-shard ${{ matrix.shard }}/2 \
|
||||||
|
--orca-bin "$ORCA_BIN" --orca-source "$ORCA_SOURCE" \
|
||||||
|
2>&1 | tee ../sweep.log
|
||||||
|
|
||||||
|
- name: Publish job summary
|
||||||
|
if: always()
|
||||||
|
run: |
|
||||||
|
{
|
||||||
|
echo "## Override sweep effect stage, shard ${{ matrix.shard }}/2"
|
||||||
|
echo "Build ${{ needs.build.outputs.head_sha }} (run ${{ needs.build.outputs.run_id }})"
|
||||||
|
echo '```'
|
||||||
|
grep -E "\[override sweep" sweep.log || echo "no stage summaries, see the log"
|
||||||
|
grep -E "^=+ .*(passed|failed)" sweep.log | tail -1 || true
|
||||||
|
echo '```'
|
||||||
|
} >> "$GITHUB_STEP_SUMMARY"
|
||||||
|
|
||||||
|
- name: Upload the override report
|
||||||
|
if: always()
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: override-report-shard${{ matrix.shard }}
|
||||||
|
path: |
|
||||||
|
orca-test-repo/.pytest_cache/override_report.json
|
||||||
|
sweep.log
|
||||||
|
if-no-files-found: warn
|
||||||
|
retention-days: 30
|
||||||
|
|
||||||
|
# The sweep step continues on error so the summary and report still get
|
||||||
|
# published; this puts the failure back on the job
|
||||||
|
- name: Fail the job if the sweep failed
|
||||||
|
if: steps.run.outcome == 'failure'
|
||||||
|
run: |
|
||||||
|
echo "the override sweep failed, see the job summary and the uploaded report" >&2
|
||||||
|
exit 1
|
||||||
|
|
||||||
|
harness:
|
||||||
|
name: GUI-vs-CLI parity harness
|
||||||
|
needs: build
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
timeout-minutes: 180
|
||||||
|
steps:
|
||||||
|
- *checkout-suite
|
||||||
|
- *checkout-slicer
|
||||||
|
- *extract-appimage
|
||||||
|
|
||||||
|
- name: Install display tooling and the AppImage's host runtime
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y --no-install-recommends \
|
||||||
|
xvfb xdotool imagemagick openbox mesa-utils \
|
||||||
|
libopengl0 libglu1-mesa libgl1 libegl1 libwebkit2gtk-4.1-0
|
||||||
|
|
||||||
|
- name: Run the parity harness
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
fixtures=()
|
||||||
|
for f in ${{ inputs.fixtures || '' }}; do
|
||||||
|
fixtures+=(--fixture "$f")
|
||||||
|
done
|
||||||
|
# 2 GUI displays: ~1.5 cores peak / ~1.9 GB on this 4-vCPU runner,
|
||||||
|
# and each fixture is fully isolated, so results match a serial run
|
||||||
|
python3 orca-test-repo/parity/run_parity.py \
|
||||||
|
--slicer-root "$ORCA_SOURCE" --bin "$ORCA_BIN" \
|
||||||
|
--cli-presets "${{ inputs.cli_presets || 'flat' }}" \
|
||||||
|
--gui-workers 2 --out "$PWD/parity-out" "${fixtures[@]}"
|
||||||
|
|
||||||
|
- name: Publish job summary
|
||||||
|
if: always()
|
||||||
|
run: |
|
||||||
|
if [ -f parity-out/report.md ]; then
|
||||||
|
cat parity-out/report.md >> "$GITHUB_STEP_SUMMARY"
|
||||||
|
else
|
||||||
|
echo "the harness produced no report, see the log" >> "$GITHUB_STEP_SUMMARY"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Drop per-lane datadirs before upload
|
||||||
|
if: always()
|
||||||
|
run: rm -rf parity-out/*/seed parity-out/*/datadir-* || true
|
||||||
|
|
||||||
|
- name: Upload the scorecard and evidence
|
||||||
|
if: always()
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: parity-scorecard
|
||||||
|
path: parity-out/
|
||||||
|
if-no-files-found: warn
|
||||||
|
retention-days: 30
|
||||||
@@ -32,13 +32,21 @@ jobs:
|
|||||||
}
|
}
|
||||||
|
|
||||||
const allowedLabels = [
|
const allowedLabels = [
|
||||||
|
// kind of change
|
||||||
|
'crash',
|
||||||
'bug-fix',
|
'bug-fix',
|
||||||
'enhancement',
|
'enhancement',
|
||||||
'Localization',
|
|
||||||
'profile',
|
|
||||||
'QoL',
|
'QoL',
|
||||||
|
'optimization',
|
||||||
|
// area
|
||||||
'UI/UX',
|
'UI/UX',
|
||||||
'dependencies'
|
'profile',
|
||||||
|
'Localization',
|
||||||
|
// infrastructure
|
||||||
|
'build',
|
||||||
|
'test',
|
||||||
|
'dependencies',
|
||||||
|
'documentation'
|
||||||
];
|
];
|
||||||
const pr = context.payload.pull_request;
|
const pr = context.payload.pull_request;
|
||||||
const labelsList = `${allowedLabels
|
const labelsList = `${allowedLabels
|
||||||
@@ -182,13 +190,21 @@ jobs:
|
|||||||
}
|
}
|
||||||
|
|
||||||
const allowedLabels = [
|
const allowedLabels = [
|
||||||
|
// kind of change
|
||||||
|
'crash',
|
||||||
'bug-fix',
|
'bug-fix',
|
||||||
'enhancement',
|
'enhancement',
|
||||||
'Localization',
|
|
||||||
'profile',
|
|
||||||
'QoL',
|
'QoL',
|
||||||
|
'optimization',
|
||||||
|
// area
|
||||||
'UI/UX',
|
'UI/UX',
|
||||||
'dependencies'
|
'profile',
|
||||||
|
'Localization',
|
||||||
|
// infrastructure
|
||||||
|
'build',
|
||||||
|
'test',
|
||||||
|
'dependencies',
|
||||||
|
'documentation'
|
||||||
];
|
];
|
||||||
|
|
||||||
const issue = context.payload.issue;
|
const issue = context.payload.issue;
|
||||||
|
|||||||
@@ -54,8 +54,10 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
tar -xvf build_tests.tar
|
tar -xvf build_tests.tar
|
||||||
# Multi-config generators (Windows/macOS) need a config; Linux is single-config.
|
# Every platform builds with a multi-config generator (build_linux.sh uses Ninja
|
||||||
scripts/run_unit_tests.sh "${{ inputs.test-dir }}" "${{ runner.os != 'Linux' && 'Release' || '' }}"
|
# Multi-Config), so ctest needs the config: without it, plain add_test() tests
|
||||||
|
# lose their labels and report "Not Run".
|
||||||
|
scripts/run_unit_tests.sh "${{ inputs.test-dir }}" Release
|
||||||
- name: Upload Test Logs
|
- name: Upload Test Logs
|
||||||
if: ${{ failure() }}
|
if: ${{ failure() }}
|
||||||
uses: actions/upload-artifact@v7
|
uses: actions/upload-artifact@v7
|
||||||
|
|||||||
@@ -0,0 +1,67 @@
|
|||||||
|
name: Flatpak Unit Tests
|
||||||
|
|
||||||
|
# Run the flatpak build's test asset inside the sandbox, once per arch. The
|
||||||
|
# GNOME SDK's _GLIBCXX_ASSERTIONS gives a bounds-checked STL that catches
|
||||||
|
# out-of-bounds reads no other test leg does.
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
os:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
artifact:
|
||||||
|
description: Test asset uploaded by the flatpak build leg
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
unit_tests_flatpak:
|
||||||
|
name: Flatpak Unit Tests
|
||||||
|
runs-on: ${{ inputs.os }}
|
||||||
|
container:
|
||||||
|
image: ghcr.io/flathub-infra/flatpak-github-actions:gnome-50
|
||||||
|
options: --privileged
|
||||||
|
steps:
|
||||||
|
- name: Restore test asset
|
||||||
|
uses: actions/download-artifact@v8
|
||||||
|
with:
|
||||||
|
name: ${{ inputs.artifact }}
|
||||||
|
- name: Run unit tests (bounds-checked sandbox)
|
||||||
|
timeout-minutes: 20
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
tar -xf flatpak-test-asset.tar
|
||||||
|
# Recreate the stable module symlink so /run/build/OrcaSlicer resolves.
|
||||||
|
d=$(ls -d .flatpak-builder/build/OrcaSlicer-* | tail -1)
|
||||||
|
ln -sfn "$(basename "$d")" .flatpak-builder/build/OrcaSlicer
|
||||||
|
# The runtime + SDK + the llvm extension the app metadata references,
|
||||||
|
# which `flatpak build` mounts; best-effort, the image may have them.
|
||||||
|
flatpak remote-add --if-not-exists --user flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||||
|
flatpak install --user -y --noninteractive flathub \
|
||||||
|
org.gnome.Platform//50 org.gnome.Sdk//50 org.freedesktop.Sdk.Extension.llvm21//25.08 || true
|
||||||
|
# `flatpak build` uses bwrap (no rofiles-fuse, which this container
|
||||||
|
# rejects); bind-mount the build tree so the baked TEST_DATA_DIR resolves.
|
||||||
|
flatpak build --die-with-parent --share=network \
|
||||||
|
--bind-mount=/run/build="$PWD/.flatpak-builder/build" \
|
||||||
|
flatpak_app \
|
||||||
|
bash -c 'cd /run/build/OrcaSlicer && scripts/run_unit_tests.sh build_flatpak/tests'
|
||||||
|
- name: Collect test results
|
||||||
|
if: always()
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
d=$(ls -d .flatpak-builder/build/OrcaSlicer-* 2>/dev/null | tail -1 || true)
|
||||||
|
[ -n "$d" ] && [ -f "$d/ctest_results.xml" ] && cp "$d/ctest_results.xml" ctest_results.xml || true
|
||||||
|
- name: Upload Test Results
|
||||||
|
if: always()
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: test-results-${{ inputs.artifact }}
|
||||||
|
path: ctest_results.xml
|
||||||
|
retention-days: 5
|
||||||
|
if-no-files-found: warn
|
||||||
|
- name: Delete Test Asset
|
||||||
|
if: success()
|
||||||
|
uses: geekyeggo/delete-artifact@v6
|
||||||
|
with:
|
||||||
|
name: ${{ inputs.artifact }}
|
||||||
|
failOnError: false
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
Build
|
Build
|
||||||
Build.bat
|
Build.bat
|
||||||
/build*/
|
/build*/
|
||||||
|
/out/
|
||||||
CMakeLists.txt.user
|
CMakeLists.txt.user
|
||||||
|
CMakeUserPresets.json
|
||||||
**/CMakeLists.txt.autosave
|
**/CMakeLists.txt.autosave
|
||||||
deps/build*
|
deps/build*
|
||||||
MYMETA.json
|
MYMETA.json
|
||||||
@@ -49,3 +51,6 @@ internal_docs/
|
|||||||
# Python bytecode
|
# Python bytecode
|
||||||
__pycache__/
|
__pycache__/
|
||||||
*.pyc
|
*.pyc
|
||||||
|
*.opc
|
||||||
|
/.test/
|
||||||
|
docs/superpowers/
|
||||||
@@ -20,11 +20,18 @@ cmake --build . --config %build_type% --target ALL_BUILD -- -m
|
|||||||
Catch2 framework. Tests in `tests/`; see [tests/AGENTS.md](tests/AGENTS.md) for where a new test belongs and the conventions to follow.
|
Catch2 framework. Tests in `tests/`; see [tests/AGENTS.md](tests/AGENTS.md) for where a new test belongs and the conventions to follow.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd build && ctest --output-on-failure # all tests
|
cd build && ctest -C Release --output-on-failure # all tests
|
||||||
ctest --test-dir ./tests/libslic3r # individual suite
|
ctest --test-dir ./tests/libslic3r -C Release # individual suite
|
||||||
ctest --test-dir ./tests/fff_print
|
ctest --test-dir ./tests/fff_print -C Release
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
- Docs live in `docs/`; the high-level design of a subsystem goes in `docs/HLSD/<subsystem>.md`.
|
||||||
|
- Describe the design as it stands — what the subsystem does, why it exists, and the constraints that shape it. Not the route that got there: no phases, task lists, status markers, or "before/after this PR" framing.
|
||||||
|
- Planning and investigation output (brainstorms, superpowers design and plan docs) stays in `docs/superpowers/`, which is gitignored. Never commit it.
|
||||||
|
- Write a doc only when the design is not evident from the code, and when a change invalidates an existing one, update it in the same PR.
|
||||||
|
|
||||||
## Code Style
|
## Code Style
|
||||||
|
|
||||||
- C++17, selective C++20. PascalCase classes, snake_case functions/variables
|
- C++17, selective C++20. PascalCase classes, snake_case functions/variables
|
||||||
@@ -57,16 +64,16 @@ ctest --test-dir ./tests/fff_print
|
|||||||
- Keep code concise and clear. Manually simplify AI generated bloated codes before review.
|
- Keep code concise and clear. Manually simplify AI generated bloated codes before review.
|
||||||
- Include targeted tests or documented verification for behavior changes, especially in slicing logic, profiles, formats, and GUI defaults.
|
- Include targeted tests or documented verification for behavior changes, especially in slicing logic, profiles, formats, and GUI defaults.
|
||||||
- For profile changes (`resources/profiles/<Vendor>/**`), check that `version` in the sibling `resources/profiles/<Vendor>.json` was bumped.
|
- For profile changes (`resources/profiles/<Vendor>/**`), check that `version` in the sibling `resources/profiles/<Vendor>.json` was bumped.
|
||||||
- For translation changes (`localization/i18n/**/*.po`), check that recurring terms match the [Localization glossary](https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/guides/localization_glossary.md) for that language.
|
- For translation changes (`localization/i18n/**/*.po`), check that recurring terms match the [Localization glossary](https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/developer_reference/localization_glossary.md) for that language.
|
||||||
|
|
||||||
## Localization & translations
|
## Localization & translations
|
||||||
|
|
||||||
Catalogs live in `localization/i18n/<lang>/OrcaSlicer_<lang>.po`; the template is `OrcaSlicer.pot`.
|
Catalogs live in `localization/i18n/<lang>/OrcaSlicer_<lang>.po`; the template is `OrcaSlicer.pot`.
|
||||||
See the [Localization guide](https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/guides/localization_guide.md) for the human-facing version of these principles.
|
See the [Localization guide](https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/developer_reference/localization_guide.md) for the human-facing version of these principles.
|
||||||
|
|
||||||
### Terminology
|
### Terminology
|
||||||
|
|
||||||
- Use the [Localization glossary](https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/guides/localization_glossary.md) as the source of truth for recurring terms, so the same English term is always rendered the same way within a language, and terms that must stay in English (brand/product names, acronyms, materials, file formats, G-code tokens, macros/variables/identifiers) are not translated.
|
- Use the [Localization glossary](https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/developer_reference/localization_glossary.md) as the source of truth for recurring terms, so the same English term is always rendered the same way within a language, and terms that must stay in English (brand/product names, acronyms, materials, file formats, G-code tokens, macros/variables/identifiers) are not translated.
|
||||||
- If a term's established translation changes, update both the affected `.po` files and the glossary (`localization_glossary.tsv`, then regenerate) so they stay in sync.
|
- If a term's established translation changes, update both the affected `.po` files and the glossary (`localization_glossary.tsv`, then regenerate) so they stay in sync.
|
||||||
- Translate the *meaning*, not the words. Check what the string actually controls before translating it — English reuses one word for different things. `Flow ratio` (multiplier), `Flow Rate` (throughput) and `Flow Dynamics` (pressure compensation) are three different terms; `extruder` may mean the toolhead, the feeder motor, or the nozzle depending on the string.
|
- Translate the *meaning*, not the words. Check what the string actually controls before translating it — English reuses one word for different things. `Flow ratio` (multiplier), `Flow Rate` (throughput) and `Flow Dynamics` (pressure compensation) are three different terms; `extruder` may mean the toolhead, the feeder motor, or the nozzle depending on the string.
|
||||||
- Reuse one template per recurring message shape (`Failed to connect to …`, `Are you sure you want to …?`), even where the English wording varies.
|
- Reuse one template per recurring message shape (`Failed to connect to …`, `Are you sure you want to …?`), even where the English wording varies.
|
||||||
|
|||||||
+305
-87
@@ -4,6 +4,10 @@ endif()
|
|||||||
|
|
||||||
cmake_minimum_required(VERSION 3.13)
|
cmake_minimum_required(VERSION 3.13)
|
||||||
|
|
||||||
|
if(POLICY CMP0177)
|
||||||
|
cmake_policy(SET CMP0177 NEW)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
# The following line used to be in tests/CMakeLists.txt
|
# The following line used to be in tests/CMakeLists.txt
|
||||||
# Having it there causes rebuilds of all targets on any CMakeLists.txt change under tests/
|
# Having it there causes rebuilds of all targets on any CMakeLists.txt change under tests/
|
||||||
@@ -59,6 +63,13 @@ if (APPLE)
|
|||||||
message(STATUS "CMAKE_OSX_DEPLOYMENT_TARGET: ${CMAKE_OSX_DEPLOYMENT_TARGET}")
|
message(STATUS "CMAKE_OSX_DEPLOYMENT_TARGET: ${CMAKE_OSX_DEPLOYMENT_TARGET}")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
# Keep MSVC's default /W3 out of CMAKE_<LANG>_FLAGS so it can be applied to our own
|
||||||
|
# targets only. Silencing a bundled target would otherwise override a warning level,
|
||||||
|
# which cl reports as D9025 for every file it compiles.
|
||||||
|
if (POLICY CMP0092)
|
||||||
|
cmake_policy(SET CMP0092 NEW)
|
||||||
|
endif ()
|
||||||
|
|
||||||
project(OrcaSlicer)
|
project(OrcaSlicer)
|
||||||
|
|
||||||
# Backward compatibility for old CMake versions
|
# Backward compatibility for old CMake versions
|
||||||
@@ -88,33 +99,6 @@ else ()
|
|||||||
add_compile_definitions("$<$<CONFIG:Release>:WXINSPECTOR_DISABLE>")
|
add_compile_definitions("$<$<CONFIG:Release>:WXINSPECTOR_DISABLE>")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
find_package(Git)
|
|
||||||
if(DEFINED ENV{git_commit_hash} AND NOT "$ENV{git_commit_hash}" STREQUAL "")
|
|
||||||
message(STATUS "Specified git commit hash: $ENV{git_commit_hash}")
|
|
||||||
if(GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
|
|
||||||
# Convert the given hash to short hash
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${GIT_EXECUTABLE} rev-parse --short "$ENV{git_commit_hash}"
|
|
||||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
||||||
OUTPUT_VARIABLE GIT_COMMIT_HASH
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
else()
|
|
||||||
# No .git directory (e.g., Flatpak sandbox) — truncate directly
|
|
||||||
string(SUBSTRING "$ENV{git_commit_hash}" 0 7 GIT_COMMIT_HASH)
|
|
||||||
endif()
|
|
||||||
add_definitions("-DGIT_COMMIT_HASH=\"${GIT_COMMIT_HASH}\"")
|
|
||||||
elseif(GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
|
|
||||||
# Check current Git commit hash
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${GIT_EXECUTABLE} log -1 --format=%h
|
|
||||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
||||||
OUTPUT_VARIABLE GIT_COMMIT_HASH
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
add_definitions("-DGIT_COMMIT_HASH=\"${GIT_COMMIT_HASH}\"")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(DEFINED ENV{SLIC3R_STATIC})
|
if(DEFINED ENV{SLIC3R_STATIC})
|
||||||
set(SLIC3R_STATIC_INITIAL $ENV{SLIC3R_STATIC})
|
set(SLIC3R_STATIC_INITIAL $ENV{SLIC3R_STATIC})
|
||||||
else()
|
else()
|
||||||
@@ -126,8 +110,11 @@ option(SLIC3R_GUI "Compile OrcaSlicer with GUI components (OpenGL,
|
|||||||
option(SLIC3R_FHS "Assume OrcaSlicer is to be installed in a FHS directory structure" 0)
|
option(SLIC3R_FHS "Assume OrcaSlicer is to be installed in a FHS directory structure" 0)
|
||||||
option(SLIC3R_PROFILE "Compile OrcaSlicer with an invasive Shiny profiler" 0)
|
option(SLIC3R_PROFILE "Compile OrcaSlicer with an invasive Shiny profiler" 0)
|
||||||
option(SLIC3R_PCH "Use precompiled headers" 1)
|
option(SLIC3R_PCH "Use precompiled headers" 1)
|
||||||
|
option(SLIC3R_WARNINGS "Emit compiler warnings for OrcaSlicer sources" 1)
|
||||||
|
option(SLIC3R_BUNDLED_WARNINGS "Emit compiler warnings for bundled third-party sources" 0)
|
||||||
option(SLIC3R_MSVC_COMPILE_PARALLEL "Compile on Visual Studio in parallel" 1)
|
option(SLIC3R_MSVC_COMPILE_PARALLEL "Compile on Visual Studio in parallel" 1)
|
||||||
option(SLIC3R_MSVC_PDB "Generate PDB files on MSVC in Release mode" 1)
|
option(SLIC3R_MSVC_PDB "Generate PDB files on MSVC in Release mode" 1)
|
||||||
|
option(SLIC3R_RELATIVE_DEBUG_PATHS "Record a relative compilation directory in debug info (clang-cl)" 0)
|
||||||
option(SLIC3R_ASAN "Enable ASan on Clang and GCC" 0)
|
option(SLIC3R_ASAN "Enable ASan on Clang and GCC" 0)
|
||||||
|
|
||||||
# Python stubgen module
|
# Python stubgen module
|
||||||
@@ -289,6 +276,8 @@ if (APPLE)
|
|||||||
SET(CMAKE_XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.orcaslicer.OrcaSlicer")
|
SET(CMAKE_XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.orcaslicer.OrcaSlicer")
|
||||||
|
|
||||||
message(STATUS "Orca: IS_CROSS_COMPILE: ${IS_CROSS_COMPILE}")
|
message(STATUS "Orca: IS_CROSS_COMPILE: ${IS_CROSS_COMPILE}")
|
||||||
|
elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||||
|
set(CMAKE_INSTALL_RPATH "$ORIGIN")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
# Proposal for C++ unit tests and sandboxes
|
# Proposal for C++ unit tests and sandboxes
|
||||||
@@ -335,23 +324,47 @@ if (MSVC AND CMAKE_CXX_COMPILER_ID STREQUAL Clang)
|
|||||||
|
|
||||||
# clang-cl can interpret SYSTEM header paths if -imsvc is used
|
# clang-cl can interpret SYSTEM header paths if -imsvc is used
|
||||||
set(CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-imsvc")
|
set(CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-imsvc")
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall \
|
|
||||||
-Wno-old-style-cast -Wno-reserved-id-macro -Wno-c++98-compat-pedantic")
|
|
||||||
else ()
|
else ()
|
||||||
set(IS_CLANG_CL FALSE)
|
set(IS_CLANG_CL FALSE)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
if (SLIC3R_MSVC_COMPILE_PARALLEL AND NOT IS_CLANG_CL)
|
# CMP0092 only applies when the cache is created; an existing tree keeps its /W3,
|
||||||
|
# which a silenced bundled target would then override (D9025, once per file).
|
||||||
|
string(REGEX REPLACE "/W[0-4]" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
|
||||||
|
string(REGEX REPLACE "/W[0-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
||||||
|
|
||||||
|
# /MP only matters for the VS generators, where CMake turns it into the
|
||||||
|
# MultiProcessorCompilation property. Ninja parallelises on its own, and
|
||||||
|
# clang-cl warns "argument unused" if the flag reaches it.
|
||||||
|
if (SLIC3R_MSVC_COMPILE_PARALLEL AND CMAKE_GENERATOR MATCHES "Visual Studio")
|
||||||
add_compile_options(/MP)
|
add_compile_options(/MP)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
# Parse lambdas the way the standard says, as clang and GCC already do. Without it
|
||||||
|
# MSVC keeps its legacy lambda processor under /std:c++17 and rejects reading a
|
||||||
|
# constexpr constant inside a lambda that does not capture it (C3493), which no
|
||||||
|
# other compiler requires. Implied by /std:c++20 and /permissive-, so it is only
|
||||||
|
# needed while we are on C++17. clang-cl is conforming already and does not take
|
||||||
|
# the flag. Requires VS2019 16.8 or newer.
|
||||||
|
if (NOT IS_CLANG_CL)
|
||||||
|
# cl.exe only warns (D9002) about an unknown /Zc: option, so without this the
|
||||||
|
# flag would be dropped and the first lambda reading a constexpr constant would
|
||||||
|
# fail with C3493 far from the cause.
|
||||||
|
if (MSVC_VERSION LESS 1928)
|
||||||
|
message(FATAL_ERROR "Visual Studio 2019 16.8 (MSVC 19.28) or newer is required; detected MSVC ${MSVC_VERSION}.")
|
||||||
|
endif ()
|
||||||
|
add_compile_options(/Zc:lambda)
|
||||||
|
endif ()
|
||||||
# /bigobj (Increase Number of Sections in .Obj file)
|
# /bigobj (Increase Number of Sections in .Obj file)
|
||||||
|
add_compile_options(-bigobj)
|
||||||
# error C3859: virtual memory range for PCH exceeded; please recompile with a command line option of '-Zm90' or greater
|
# error C3859: virtual memory range for PCH exceeded; please recompile with a command line option of '-Zm90' or greater
|
||||||
# Generate symbols at every build target, even for the release.
|
# Generate symbols at every build target, even for the release.
|
||||||
# -Zm520 fixes error C3859 but forces the compiler to pre-allocate that memory for every translation unit regardless
|
# -Zm520 fixes error C3859 but forces the compiler to pre-allocate that memory for every translation unit regardless
|
||||||
# combining /Zi with /FS frees up a significant amount of memory pressure across all parallel compile jobs and makes /MP faster overall.
|
# combining /Zi with /FS frees up a significant amount of memory pressure across all parallel compile jobs and makes /MP faster overall.
|
||||||
add_compile_options(-bigobj /Zi /FS)
|
if (SLIC3R_MSVC_PDB)
|
||||||
|
add_compile_options(/Zi /FS)
|
||||||
|
endif ()
|
||||||
# Disable STL4007: Many result_type typedefs and all argument_type, first_argument_type, and second_argument_type typedefs are deprecated in C++17.
|
# Disable STL4007: Many result_type typedefs and all argument_type, first_argument_type, and second_argument_type typedefs are deprecated in C++17.
|
||||||
#FIXME Remove this line after eigen library adapts to the new C++17 adaptor rules.
|
#FIXME Remove this line after eigen library adapts to the new C++17 adaptor rules.
|
||||||
add_compile_options(-D_SILENCE_CXX17_ADAPTOR_TYPEDEFS_DEPRECATION_WARNING)
|
add_compile_options(-D_SILENCE_CXX17_ADAPTOR_TYPEDEFS_DEPRECATION_WARNING)
|
||||||
@@ -369,6 +382,16 @@ if (MSVC)
|
|||||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LTCG")
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LTCG")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
# Without this every object names its build directory and two worktrees never
|
||||||
|
# share cache entries. The linker still writes absolute paths into the PDB.
|
||||||
|
if (SLIC3R_RELATIVE_DEBUG_PATHS)
|
||||||
|
if (IS_CLANG_CL)
|
||||||
|
add_compile_options(-ffile-compilation-dir=.)
|
||||||
|
else ()
|
||||||
|
message(WARNING "SLIC3R_RELATIVE_DEBUG_PATHS is only implemented for clang-cl")
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
|
||||||
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "AppleClang" AND ${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER 15)
|
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "AppleClang" AND ${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER 15)
|
||||||
add_compile_definitions(BOOST_NO_CXX98_FUNCTION_BASE _HAS_AUTO_PTR_ETC=0)
|
add_compile_definitions(BOOST_NO_CXX98_FUNCTION_BASE _HAS_AUTO_PTR_ETC=0)
|
||||||
endif()
|
endif()
|
||||||
@@ -523,63 +546,103 @@ if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUXX)
|
|||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fext-numeric-literals" )
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fext-numeric-literals" )
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT MSVC AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang"))
|
if ((NOT MSVC OR IS_CLANG_CL) AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang"))
|
||||||
if (NOT MINGW)
|
if (IS_CLANG_CL)
|
||||||
|
# clang-cl reads -Wall as MSVC /Wall, which clang maps to -Weverything. /W4 is
|
||||||
|
# its -Wall -Wextra and, unlike /clang:-Wall, is ordered with the -Wno-* below
|
||||||
|
# instead of after them. The -Wextra-only warnings are dropped again so the set
|
||||||
|
# matches what -Wall gives the GNU/Clang builds.
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4" )
|
||||||
|
add_compile_options(-Wno-unused-parameter -Wno-ignored-qualifiers -Wno-missing-field-initializers)
|
||||||
|
elseif (NOT MINGW)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall" )
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall" )
|
||||||
endif ()
|
endif ()
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-reorder" )
|
|
||||||
|
|
||||||
# On GCC and Clang, no return from a non-void function is a warning only. Here, we make it an error.
|
# Every warning is an error unless it appears in one of the two lists below.
|
||||||
add_compile_options(-Werror=return-type)
|
# disabled - never wanted. Off everywhere, so it never warns or errors.
|
||||||
|
# demoted - wanted, not cleared yet. Still warns, does not error.
|
||||||
|
|
||||||
# Since some portions of code are just commented out or put under conditional compilation, there are
|
# Disabled.
|
||||||
# a bunch of warning related to unused functions and variables. Suppress those warnings to not pollute
|
set(warnings_disabled
|
||||||
# compilers diagnostics output with warnings we not going to look at
|
reorder # members initialised in an order we chose
|
||||||
add_compile_options(-Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-label -Wno-unused-local-typedefs)
|
sign-compare # signed/unsigned comparisons throughout
|
||||||
|
misleading-indentation # false positives on mixed tabs and spaces
|
||||||
|
switch # unhandled enum value in a switch
|
||||||
|
unused-function # commented-out or conditionally compiled code
|
||||||
|
unused-variable # commented-out or conditionally compiled code
|
||||||
|
unused-but-set-variable # commented-out or conditionally compiled code
|
||||||
|
unused-label # commented-out or conditionally compiled code
|
||||||
|
unused-local-typedefs # commented-out or conditionally compiled code
|
||||||
|
)
|
||||||
|
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||||
|
list(APPEND warnings_disabled deprecated-declarations) # legacy OpenGL calls
|
||||||
|
endif ()
|
||||||
|
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 6.0)
|
||||||
|
list(APPEND warnings_disabled ignored-attributes) # from Eigen headers marked SYSTEM
|
||||||
|
endif ()
|
||||||
|
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
|
list(APPEND warnings_disabled unknown-pragmas) # igl pragmas, GCC bug 66943
|
||||||
|
endif ()
|
||||||
|
foreach (w IN LISTS warnings_disabled)
|
||||||
|
add_compile_options(-Wno-${w})
|
||||||
|
endforeach ()
|
||||||
|
|
||||||
# Ignore signed/unsigned comparison warnings
|
# GCC is not built in CI, so don't throw errors CI won't catch.
|
||||||
add_compile_options(-Wno-sign-compare)
|
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
|
add_compile_options(-Werror=return-type)
|
||||||
|
else ()
|
||||||
|
# Turn everything else into an error. Dependency headers are exempt because the
|
||||||
|
# SYSTEM include flag (-imsvc on clang-cl, -isystem elsewhere) keeps their
|
||||||
|
# diagnostics out.
|
||||||
|
add_compile_options(-Werror)
|
||||||
|
endif ()
|
||||||
|
|
||||||
# The mismatch of tabs and spaces throughout the project can sometimes
|
# Demoted. Remove a name once its category is cleared on every compiler.
|
||||||
# cause this warning to appear even though the indentation is fine.
|
set(warnings_demoted)
|
||||||
# Some includes also cause the warning
|
if (APPLE)
|
||||||
add_compile_options(-Wno-misleading-indentation)
|
list(APPEND warnings_demoted
|
||||||
|
# MacDarkMode.mm makes two calls to AppKit's private titlebarViewController
|
||||||
|
# and one to a wxWidgets category on NSTableColumn whose header is not
|
||||||
|
# imported. Clearing it means declaring the private selectors ourselves, which
|
||||||
|
# needs a macOS build to verify.
|
||||||
|
objc-method-access
|
||||||
|
)
|
||||||
|
endif ()
|
||||||
|
if (WIN32 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64")
|
||||||
|
list(APPEND warnings_demoted
|
||||||
|
# About two dozen GetProcAddress casts, most in the vendored dark_mode.hpp,
|
||||||
|
# retype FARPROC to a real signature. The __stdcall typedefs are identical to
|
||||||
|
# FARPROC on x64, so only arm64 reports them. Clearing them is a separate
|
||||||
|
# sweep.
|
||||||
|
cast-function-type-mismatch
|
||||||
|
)
|
||||||
|
endif ()
|
||||||
|
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||||
|
list(APPEND warnings_demoted
|
||||||
|
# enum-constexpr-conversion is a Clang warning that defaults to an error,
|
||||||
|
# present through clang 20 and gone in clang 21.
|
||||||
|
enum-constexpr-conversion
|
||||||
|
)
|
||||||
|
endif ()
|
||||||
|
|
||||||
# Disable warning if enum value does not have a corresponding case in switch statement
|
# The list mixes names not every compiler has, so add each exception only where the
|
||||||
add_compile_options(-Wno-switch)
|
# compiler knows the warning. Probe with the positive -W<name>, which an unknown
|
||||||
|
# warning fails on both compilers (GCC errors, Clang reports unknown-warning-option).
|
||||||
# removes LOTS of extraneous Eigen warnings (GCC only supports it since 6.1)
|
# An option that takes a =N argument rejects the bare -W<name>, so fall back to
|
||||||
# https://eigen.tuxfamily.org/bz/show_bug.cgi?id=1221
|
# -W<name>=1 and demote with the trailing =.
|
||||||
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 6.0)
|
include(CheckCXXCompilerFlag)
|
||||||
add_compile_options(-Wno-ignored-attributes) # Tamas: Eigen include dirs are marked as SYSTEM
|
foreach (category IN LISTS warnings_demoted)
|
||||||
endif()
|
string(MAKE_C_IDENTIFIER "ORCA_HAS_W_${category}" _orca_has_w)
|
||||||
|
check_cxx_compiler_flag("-W${category}" ${_orca_has_w})
|
||||||
# Clang reports legacy OpenGL calls as deprecated. Turn off the warning for now
|
if (${_orca_has_w})
|
||||||
# to reduce the clutter, we know about this one. It should be reenabled after
|
add_compile_options(-Wno-error=${category})
|
||||||
# we finally get rid of the deprecated code.
|
else ()
|
||||||
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
|
check_cxx_compiler_flag("-W${category}=1" ${_orca_has_w}_arg)
|
||||||
add_compile_options(-Wno-deprecated-declarations)
|
if (${${_orca_has_w}_arg})
|
||||||
endif()
|
add_compile_options(-Wno-error=${category}=)
|
||||||
|
endif ()
|
||||||
if((${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang" OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "AppleClang") AND ${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER 15)
|
endif ()
|
||||||
include(CheckCXXCompilerFlag)
|
endforeach ()
|
||||||
check_cxx_compiler_flag(-Wno-error=enum-constexpr-conversion HAS_WNO_ERROR_ENUM_CONSTEXPR_CONV)
|
|
||||||
if(HAS_WNO_ERROR_ENUM_CONSTEXPR_CONV)
|
|
||||||
add_compile_options(-Wno-error=enum-constexpr-conversion)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#GCC generates loads of -Wunknown-pragmas when compiling igl. The fix is not easy due to a bug in gcc, see
|
|
||||||
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66943 or
|
|
||||||
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53431
|
|
||||||
# We will turn the warning of for GCC for now:
|
|
||||||
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
|
||||||
# GCC generates loads of -Wunknown-pragmas when compiling igl. The fix is not easy due to a bug in gcc, see
|
|
||||||
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66943 or
|
|
||||||
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53431
|
|
||||||
# We will turn the warning of for GCC for now:
|
|
||||||
add_compile_options(-Wno-unknown-pragmas)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Compress the debug info with zstd to save space in Flatpak CI builds
|
# Compress the debug info with zstd to save space in Flatpak CI builds
|
||||||
if(FLATPAK)
|
if(FLATPAK)
|
||||||
@@ -589,10 +652,6 @@ if (NOT MSVC AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMP
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 14)
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=template-id-cdtor" )
|
|
||||||
endif()
|
|
||||||
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (SLIC3R_ASAN)
|
if (SLIC3R_ASAN)
|
||||||
@@ -762,6 +821,37 @@ find_package(OpenSSL REQUIRED)
|
|||||||
find_package(CURL REQUIRED)
|
find_package(CURL REQUIRED)
|
||||||
find_package(Freetype REQUIRED)
|
find_package(Freetype REQUIRED)
|
||||||
|
|
||||||
|
if (SLIC3R_GUI)
|
||||||
|
# LibDataChannel's installed export references its bundled dependencies,
|
||||||
|
# but does not install their CMake targets. Recreate those targets from
|
||||||
|
# the same dependency prefix before loading the LibDataChannel config.
|
||||||
|
if (NOT TARGET Usrsctp::usrsctp)
|
||||||
|
find_library(_ORCA_USRSCTP_LIBRARY NAMES usrsctp
|
||||||
|
PATHS "${CMAKE_PREFIX_PATH}/lib" NO_DEFAULT_PATH)
|
||||||
|
if (_ORCA_USRSCTP_LIBRARY)
|
||||||
|
add_library(Usrsctp::usrsctp UNKNOWN IMPORTED GLOBAL)
|
||||||
|
set_target_properties(Usrsctp::usrsctp PROPERTIES
|
||||||
|
IMPORTED_LOCATION "${_ORCA_USRSCTP_LIBRARY}"
|
||||||
|
IMPORTED_LINK_INTERFACE_LANGUAGES C
|
||||||
|
INTERFACE_LINK_LIBRARIES "Threads::Threads")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT TARGET LibJuice::LibJuice)
|
||||||
|
find_library(_ORCA_LIBJUICE_LIBRARY NAMES juice
|
||||||
|
PATHS "${CMAKE_PREFIX_PATH}/lib" NO_DEFAULT_PATH)
|
||||||
|
if (_ORCA_LIBJUICE_LIBRARY)
|
||||||
|
add_library(LibJuice::LibJuice UNKNOWN IMPORTED GLOBAL)
|
||||||
|
set_target_properties(LibJuice::LibJuice PROPERTIES
|
||||||
|
IMPORTED_LOCATION "${_ORCA_LIBJUICE_LIBRARY}"
|
||||||
|
IMPORTED_LINK_INTERFACE_LANGUAGES C
|
||||||
|
INTERFACE_LINK_LIBRARIES "Threads::Threads")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_package(LibDataChannel CONFIG REQUIRED)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
add_library(libcurl INTERFACE)
|
add_library(libcurl INTERFACE)
|
||||||
target_link_libraries(libcurl INTERFACE CURL::libcurl)
|
target_link_libraries(libcurl INTERFACE CURL::libcurl)
|
||||||
@@ -1044,6 +1134,11 @@ function(orcaslicer_copy_dlls target config postfix output_dlls)
|
|||||||
${CMAKE_PREFIX_PATH}/bin/occt/TKXDESTEP.dll
|
${CMAKE_PREFIX_PATH}/bin/occt/TKXDESTEP.dll
|
||||||
${CMAKE_PREFIX_PATH}/bin/occt/TKXSBase.dll
|
${CMAKE_PREFIX_PATH}/bin/occt/TKXSBase.dll
|
||||||
${CMAKE_PREFIX_PATH}/bin/freetype.dll
|
${CMAKE_PREFIX_PATH}/bin/freetype.dll
|
||||||
|
${CMAKE_PREFIX_PATH}/bin/avformat-61.dll
|
||||||
|
${CMAKE_PREFIX_PATH}/bin/avcodec-61.dll
|
||||||
|
${CMAKE_PREFIX_PATH}/bin/swresample-5.dll
|
||||||
|
${CMAKE_PREFIX_PATH}/bin/swscale-8.dll
|
||||||
|
${CMAKE_PREFIX_PATH}/bin/avutil-59.dll
|
||||||
DESTINATION ${_out_dir})
|
DESTINATION ${_out_dir})
|
||||||
|
|
||||||
set(${output_dlls}
|
set(${output_dlls}
|
||||||
@@ -1079,15 +1174,118 @@ function(orcaslicer_copy_dlls target config postfix output_dlls)
|
|||||||
${_out_dir}/TKXSBase.dll
|
${_out_dir}/TKXSBase.dll
|
||||||
|
|
||||||
${_out_dir}/freetype.dll
|
${_out_dir}/freetype.dll
|
||||||
|
${_out_dir}/avformat-61.dll
|
||||||
|
${_out_dir}/avcodec-61.dll
|
||||||
|
${_out_dir}/swresample-5.dll
|
||||||
|
${_out_dir}/swscale-8.dll
|
||||||
|
${_out_dir}/avutil-59.dll
|
||||||
PARENT_SCOPE
|
PARENT_SCOPE
|
||||||
)
|
)
|
||||||
|
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
function(orcaslicer_copy_sos target config postfix output_sos)
|
||||||
|
|
||||||
|
get_property(_is_multi GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||||
|
get_target_property(_alt_out_dir ${target} RUNTIME_OUTPUT_DIRECTORY)
|
||||||
|
|
||||||
|
if (_alt_out_dir)
|
||||||
|
set(_out_dir "${_alt_out_dir}")
|
||||||
|
elseif (_is_multi)
|
||||||
|
set(_out_dir "${CMAKE_CURRENT_BINARY_DIR}/${config}")
|
||||||
|
else ()
|
||||||
|
set(_out_dir "${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
file(COPY ${CMAKE_PREFIX_PATH}/lib/libavformat.so
|
||||||
|
${CMAKE_PREFIX_PATH}/lib/libavformat.so.61
|
||||||
|
${CMAKE_PREFIX_PATH}/lib/libavformat.so.61.1.100
|
||||||
|
${CMAKE_PREFIX_PATH}/lib/libavcodec.so
|
||||||
|
${CMAKE_PREFIX_PATH}/lib/libavcodec.so.61
|
||||||
|
${CMAKE_PREFIX_PATH}/lib/libavcodec.so.61.3.100
|
||||||
|
${CMAKE_PREFIX_PATH}/lib/libavutil.so
|
||||||
|
${CMAKE_PREFIX_PATH}/lib/libavutil.so.59
|
||||||
|
${CMAKE_PREFIX_PATH}/lib/libavutil.so.59.8.100
|
||||||
|
${CMAKE_PREFIX_PATH}/lib/libswscale.so
|
||||||
|
${CMAKE_PREFIX_PATH}/lib/libswscale.so.8
|
||||||
|
${CMAKE_PREFIX_PATH}/lib/libswscale.so.8.1.100
|
||||||
|
${CMAKE_PREFIX_PATH}/lib/libswresample.so
|
||||||
|
${CMAKE_PREFIX_PATH}/lib/libswresample.so.5
|
||||||
|
${CMAKE_PREFIX_PATH}/lib/libswresample.so.5.1.100
|
||||||
|
DESTINATION ${_out_dir})
|
||||||
|
|
||||||
|
set(${output_sos}
|
||||||
|
${_out_dir}/libavformat.so
|
||||||
|
${_out_dir}/libavformat.so.61
|
||||||
|
${_out_dir}/libavformat.so.61.1.100
|
||||||
|
${_out_dir}/libavcodec.so
|
||||||
|
${_out_dir}/libavcodec.so.61
|
||||||
|
${_out_dir}/libavcodec.so.61.3.100
|
||||||
|
${_out_dir}/libavutil.so
|
||||||
|
${_out_dir}/libavutil.so.59
|
||||||
|
${_out_dir}/libavutil.so.59.8.100
|
||||||
|
${_out_dir}/libswscale.so
|
||||||
|
${_out_dir}/libswscale.so.8
|
||||||
|
${_out_dir}/libswscale.so.8.1.100
|
||||||
|
${_out_dir}/libswresample.so
|
||||||
|
${_out_dir}/libswresample.so.5
|
||||||
|
${_out_dir}/libswresample.so.5.1.100
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# Bundled sources set their own warning flags, and a plain -Wall there means /Wall
|
||||||
|
# (= -Weverything) under clang-cl. Target options are applied after the ones a target
|
||||||
|
# set on itself, so these win. Targets are discovered rather than listed so a newly
|
||||||
|
# bundled library needs no maintenance here.
|
||||||
|
function(orcaslicer_silence_third_party_warnings _dir)
|
||||||
|
get_property(_subdirs DIRECTORY "${_dir}" PROPERTY SUBDIRECTORIES)
|
||||||
|
foreach (_subdir IN LISTS _subdirs)
|
||||||
|
orcaslicer_silence_third_party_warnings("${_subdir}")
|
||||||
|
endforeach ()
|
||||||
|
get_property(_targets DIRECTORY "${_dir}" PROPERTY BUILDSYSTEM_TARGETS)
|
||||||
|
foreach (_target IN LISTS _targets)
|
||||||
|
get_target_property(_type ${_target} TYPE)
|
||||||
|
if (NOT _type STREQUAL "INTERFACE_LIBRARY" AND NOT _type STREQUAL "UTILITY")
|
||||||
|
if (MSVC AND NOT IS_CLANG_CL)
|
||||||
|
# Drop any level the target set for itself, or -w overrides it and cl
|
||||||
|
# reports D9025 once per file.
|
||||||
|
get_target_property(_opts ${_target} COMPILE_OPTIONS)
|
||||||
|
if (_opts)
|
||||||
|
string(REGEX REPLACE "/W[0-4]|/Wall" "" _opts "${_opts}")
|
||||||
|
string(REGEX REPLACE ";;+" ";" _opts "${_opts}")
|
||||||
|
set_target_properties(${_target} PROPERTIES COMPILE_OPTIONS "${_opts}")
|
||||||
|
endif ()
|
||||||
|
# CMake maps a level into the VS generator's WarningLevel element, while a
|
||||||
|
# bare -w stays on the command line and trips D9025 there, once per file.
|
||||||
|
target_compile_options(${_target} PRIVATE /W0)
|
||||||
|
else ()
|
||||||
|
target_compile_options(${_target} PRIVATE -w)
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
endforeach ()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
|
||||||
# libslic3r, OrcaSlicer GUI and the OrcaSlicer executable.
|
# libslic3r, OrcaSlicer GUI and the OrcaSlicer executable.
|
||||||
add_subdirectory(deps_src)
|
add_subdirectory(deps_src)
|
||||||
|
|
||||||
|
if (NOT SLIC3R_BUNDLED_WARNINGS)
|
||||||
|
orcaslicer_silence_third_party_warnings("${CMAKE_CURRENT_SOURCE_DIR}/deps_src")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Warning level for the targets added below: our sources, plus glad and libvgcode,
|
||||||
|
# which are vendored but live under src/. The deps_src libraries were configured just
|
||||||
|
# above. CMP0092 left MSVC without a default level, so it is set here.
|
||||||
|
if (NOT SLIC3R_WARNINGS)
|
||||||
|
add_compile_options(-w)
|
||||||
|
elseif (MSVC AND NOT IS_CLANG_CL)
|
||||||
|
# /we4715 is C4715, no return from a non-void function, an error on the GNU/Clang
|
||||||
|
# builds under -Werror. MSVC is not in that model, so this stays a single promoted
|
||||||
|
# warning.
|
||||||
|
add_compile_options(/W3 /we4715)
|
||||||
|
endif ()
|
||||||
|
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT OrcaSlicer_app_gui)
|
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT OrcaSlicer_app_gui)
|
||||||
|
|
||||||
@@ -1099,6 +1297,10 @@ endif()
|
|||||||
|
|
||||||
if(BUILD_TESTS)
|
if(BUILD_TESTS)
|
||||||
add_subdirectory(tests)
|
add_subdirectory(tests)
|
||||||
|
if (NOT SLIC3R_BUNDLED_WARNINGS)
|
||||||
|
# Catch2 is vendored under tests/ and sets its own warning flags too.
|
||||||
|
orcaslicer_silence_third_party_warnings("${CMAKE_CURRENT_SOURCE_DIR}/tests/catch2")
|
||||||
|
endif ()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT WIN32 AND NOT APPLE)
|
if (NOT WIN32 AND NOT APPLE)
|
||||||
@@ -1143,6 +1345,22 @@ else ()
|
|||||||
endif()
|
endif()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||||
|
set(LIBRARY_FILES
|
||||||
|
${LIBDIR_BIN}/libavformat.so.61
|
||||||
|
${LIBDIR_BIN}/libavformat.so.61.1.100
|
||||||
|
${LIBDIR_BIN}/libavcodec.so.61
|
||||||
|
${LIBDIR_BIN}/libavcodec.so.61.3.100
|
||||||
|
${LIBDIR_BIN}/libavutil.so.59
|
||||||
|
${LIBDIR_BIN}/libavutil.so.59.8.100
|
||||||
|
${LIBDIR_BIN}/libswresample.so.5
|
||||||
|
${LIBDIR_BIN}/libswresample.so.5.1.100
|
||||||
|
${LIBDIR_BIN}/libswscale.so.8
|
||||||
|
${LIBDIR_BIN}/libswscale.so.8.1.100
|
||||||
|
)
|
||||||
|
install(FILES ${LIBRARY_FILES} DESTINATION "${CMAKE_INSTALL_PREFIX}/bin")
|
||||||
|
endif ()
|
||||||
|
|
||||||
install(FILES ${CMAKE_SOURCE_DIR}/LICENSE.txt DESTINATION ".")
|
install(FILES ${CMAKE_SOURCE_DIR}/LICENSE.txt DESTINATION ".")
|
||||||
configure_file(${LIBDIR}/dev-utils/platform/unix/fhs.hpp.in ${LIBDIR_BIN}/dev-utils/platform/unix/fhs.hpp)
|
configure_file(${LIBDIR}/dev-utils/platform/unix/fhs.hpp.in ${LIBDIR_BIN}/dev-utils/platform/unix/fhs.hpp)
|
||||||
|
|
||||||
|
|||||||
@@ -260,6 +260,9 @@ if [[ ! -f "./scripts/flatpak/com.orcaslicer.OrcaSlicer.yml" ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
echo -e "${YELLOW}Packing deps/ for the manifest...${NC}"
|
||||||
|
./scripts/flatpak/make_deps_tar.sh
|
||||||
|
|
||||||
# Build the Flatpak
|
# Build the Flatpak
|
||||||
echo -e "${YELLOW}Building Flatpak package...${NC}"
|
echo -e "${YELLOW}Building Flatpak package...${NC}"
|
||||||
echo -e "This may take a while (30+ minutes depending on your system)..."
|
echo -e "This may take a while (30+ minutes depending on your system)..."
|
||||||
|
|||||||
@@ -567,6 +567,8 @@ if [[ -n "${BUILD_ORCA}" ]] || [[ -n "${BUILD_TESTS}" ]] ; then
|
|||||||
print_and_run cmake --build $BUILD_DIR --config "${BUILD_CONFIG}" --target OrcaSlicer
|
print_and_run cmake --build $BUILD_DIR --config "${BUILD_CONFIG}" --target OrcaSlicer
|
||||||
echo "Building OrcaSlicer_profile_validator .."
|
echo "Building OrcaSlicer_profile_validator .."
|
||||||
print_and_run cmake --build $BUILD_DIR --config "${BUILD_CONFIG}" --target OrcaSlicer_profile_validator
|
print_and_run cmake --build $BUILD_DIR --config "${BUILD_CONFIG}" --target OrcaSlicer_profile_validator
|
||||||
|
echo "Building generate_system_cache ..."
|
||||||
|
print_and_run cmake --build $BUILD_DIR --config "${BUILD_CONFIG}" --target generate_system_cache
|
||||||
./scripts/run_gettext.sh
|
./scripts/run_gettext.sh
|
||||||
fi
|
fi
|
||||||
if [[ -n "${BUILD_TESTS}" ]] ; then
|
if [[ -n "${BUILD_TESTS}" ]] ; then
|
||||||
|
|||||||
@@ -1,52 +0,0 @@
|
|||||||
set WP=%CD%
|
|
||||||
|
|
||||||
set debug=OFF
|
|
||||||
set debuginfo=OFF
|
|
||||||
if "%1"=="debug" set debug=ON
|
|
||||||
if "%2"=="debug" set debug=ON
|
|
||||||
if "%1"=="debuginfo" set debuginfo=ON
|
|
||||||
if "%2"=="debuginfo" set debuginfo=ON
|
|
||||||
if "%debug%"=="ON" (
|
|
||||||
set build_type=Debug
|
|
||||||
set build_dir=build-dbg
|
|
||||||
) else (
|
|
||||||
if "%debuginfo%"=="ON" (
|
|
||||||
set build_type=RelWithDebInfo
|
|
||||||
set build_dir=build-dbginfo
|
|
||||||
) else (
|
|
||||||
set build_type=Release
|
|
||||||
set build_dir=build
|
|
||||||
)
|
|
||||||
)
|
|
||||||
echo build type set to %build_type%
|
|
||||||
|
|
||||||
cd deps
|
|
||||||
mkdir %build_dir%
|
|
||||||
cd %build_dir%
|
|
||||||
set DEPS=%CD%/OrcaSlicer_dep
|
|
||||||
set "SIG_FLAG="
|
|
||||||
if defined ORCA_UPDATER_SIG_KEY set "SIG_FLAG=-DORCA_UPDATER_SIG_KEY=%ORCA_UPDATER_SIG_KEY%"
|
|
||||||
if "%1"=="slicer" (
|
|
||||||
GOTO :slicer
|
|
||||||
)
|
|
||||||
echo "building deps.."
|
|
||||||
|
|
||||||
echo cmake ../ -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=%build_type%
|
|
||||||
cmake ../ -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=%build_type%
|
|
||||||
cmake --build . --config %build_type% --target deps -- -m
|
|
||||||
|
|
||||||
if "%1"=="deps" exit /b 0
|
|
||||||
|
|
||||||
:slicer
|
|
||||||
echo "building Orca Slicer..."
|
|
||||||
cd %WP%
|
|
||||||
mkdir %build_dir%
|
|
||||||
cd %build_dir%
|
|
||||||
|
|
||||||
echo cmake .. -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=%build_type%
|
|
||||||
cmake .. -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=%build_type% %SIG_FLAG%
|
|
||||||
cmake --build . --config %build_type% --target ALL_BUILD -- -m
|
|
||||||
cd ..
|
|
||||||
call scripts/run_gettext.bat
|
|
||||||
cd %build_dir%
|
|
||||||
cmake --build . --target install --config %build_type%
|
|
||||||
@@ -4,7 +4,7 @@ set -e
|
|||||||
set -o pipefail
|
set -o pipefail
|
||||||
SECONDS=0
|
SECONDS=0
|
||||||
|
|
||||||
while getopts ":dpa:snt:xbc:i:1Tuh" opt; do
|
while getopts ":dpa:snt:xbc:i:j:Tuh" opt; do
|
||||||
case "${opt}" in
|
case "${opt}" in
|
||||||
d )
|
d )
|
||||||
export BUILD_TARGET="deps"
|
export BUILD_TARGET="deps"
|
||||||
@@ -38,8 +38,8 @@ while getopts ":dpa:snt:xbc:i:1Tuh" opt; do
|
|||||||
i )
|
i )
|
||||||
export CMAKE_IGNORE_PREFIX_PATH="${CMAKE_IGNORE_PREFIX_PATH:+$CMAKE_IGNORE_PREFIX_PATH;}$OPTARG"
|
export CMAKE_IGNORE_PREFIX_PATH="${CMAKE_IGNORE_PREFIX_PATH:+$CMAKE_IGNORE_PREFIX_PATH;}$OPTARG"
|
||||||
;;
|
;;
|
||||||
1 )
|
j )
|
||||||
export CMAKE_BUILD_PARALLEL_LEVEL=1
|
export CMAKE_BUILD_PARALLEL_LEVEL="$OPTARG"
|
||||||
;;
|
;;
|
||||||
T )
|
T )
|
||||||
export BUILD_TESTS="1"
|
export BUILD_TESTS="1"
|
||||||
@@ -58,7 +58,7 @@ while getopts ":dpa:snt:xbc:i:1Tuh" opt; do
|
|||||||
echo " -b: Build without reconfiguring CMake"
|
echo " -b: Build without reconfiguring CMake"
|
||||||
echo " -c: Set CMake build configuration, default is Release"
|
echo " -c: Set CMake build configuration, default is Release"
|
||||||
echo " -i: Add a prefix to ignore during CMake dependency discovery (repeatable), defaults to /opt/local:/usr/local:/opt/homebrew"
|
echo " -i: Add a prefix to ignore during CMake dependency discovery (repeatable), defaults to /opt/local:/usr/local:/opt/homebrew"
|
||||||
echo " -1: Use single job for building"
|
echo " -j: Set the number of parallel build jobs (CMAKE_BUILD_PARALLEL_LEVEL)"
|
||||||
echo " -T: Build and run tests (set ORCA_TESTS_BUILD_ONLY=1 to build without running)"
|
echo " -T: Build and run tests (set ORCA_TESTS_BUILD_ONLY=1 to build without running)"
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
|
|||||||
@@ -1,177 +0,0 @@
|
|||||||
@REM OrcaSlicer build script for Windows with VS auto-detect
|
|
||||||
@echo off
|
|
||||||
set WP=%CD%
|
|
||||||
set _START_TIME=%TIME%
|
|
||||||
|
|
||||||
@REM Default target architecture to the host CPU arch; override by passing
|
|
||||||
@REM "x64" or "arm64" as an argument. PROCESSOR_ARCHITEW6432 covers a 32-bit
|
|
||||||
@REM shell running on a 64-bit OS, where PROCESSOR_ARCHITECTURE reads "x86".
|
|
||||||
set arch=x64
|
|
||||||
if /I "%PROCESSOR_ARCHITECTURE%"=="ARM64" set arch=ARM64
|
|
||||||
if /I "%PROCESSOR_ARCHITEW6432%"=="ARM64" set arch=ARM64
|
|
||||||
if /I "%1"=="arm64" set arch=ARM64
|
|
||||||
if /I "%2"=="arm64" set arch=ARM64
|
|
||||||
if /I "%1"=="x64" set arch=x64
|
|
||||||
if /I "%2"=="x64" set arch=x64
|
|
||||||
|
|
||||||
@REM Check for Ninja Multi-Config option (-x)
|
|
||||||
set USE_NINJA=0
|
|
||||||
for %%a in (%*) do (
|
|
||||||
if "%%a"=="-x" set USE_NINJA=1
|
|
||||||
)
|
|
||||||
|
|
||||||
@REM Check for unit-tests option ("tests")
|
|
||||||
set BUILD_TESTS=OFF
|
|
||||||
for %%a in (%*) do (
|
|
||||||
if /I "%%a"=="tests" set BUILD_TESTS=ON
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%USE_NINJA%"=="1" (
|
|
||||||
echo Using Ninja Multi-Config generator
|
|
||||||
set CMAKE_GENERATOR="Ninja Multi-Config"
|
|
||||||
set VS_VERSION=Ninja
|
|
||||||
goto :generator_ready
|
|
||||||
)
|
|
||||||
|
|
||||||
@REM Detect Visual Studio version using msbuild
|
|
||||||
echo Detecting Visual Studio version using msbuild...
|
|
||||||
|
|
||||||
@REM Try to get MSBuild version - the output format varies by VS version
|
|
||||||
set VS_MAJOR=
|
|
||||||
for /f "tokens=*" %%i in ('msbuild -version 2^>^&1 ^| findstr /r "^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"') do (
|
|
||||||
for /f "tokens=1 delims=." %%a in ("%%i") do set VS_MAJOR=%%a
|
|
||||||
set MSBUILD_OUTPUT=%%i
|
|
||||||
goto :version_found
|
|
||||||
)
|
|
||||||
|
|
||||||
@REM Alternative method for newer MSBuild versions
|
|
||||||
if "%VS_MAJOR%"=="" (
|
|
||||||
for /f "tokens=*" %%i in ('msbuild -version 2^>^&1 ^| findstr /r "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"') do (
|
|
||||||
for /f "tokens=1 delims=." %%a in ("%%i") do set VS_MAJOR=%%a
|
|
||||||
set MSBUILD_OUTPUT=%%i
|
|
||||||
goto :version_found
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
:version_found
|
|
||||||
echo MSBuild version detected: %MSBUILD_OUTPUT%
|
|
||||||
echo Major version: %VS_MAJOR%
|
|
||||||
|
|
||||||
if "%VS_MAJOR%"=="" (
|
|
||||||
echo Error: Could not determine Visual Studio version from msbuild
|
|
||||||
echo Please ensure Visual Studio and MSBuild are properly installed
|
|
||||||
exit /b 1
|
|
||||||
)
|
|
||||||
|
|
||||||
if "%VS_MAJOR%"=="16" (
|
|
||||||
set VS_VERSION=2019
|
|
||||||
set CMAKE_GENERATOR="Visual Studio 16 2019"
|
|
||||||
) else if "%VS_MAJOR%"=="17" (
|
|
||||||
set VS_VERSION=2022
|
|
||||||
set CMAKE_GENERATOR="Visual Studio 17 2022"
|
|
||||||
) else if "%VS_MAJOR%"=="18" (
|
|
||||||
set VS_VERSION=2026
|
|
||||||
set CMAKE_GENERATOR="Visual Studio 18 2026"
|
|
||||||
) else (
|
|
||||||
echo Error: Unsupported Visual Studio version: %VS_MAJOR%
|
|
||||||
echo Supported versions: VS2019 (16.x^), VS2022 (17.x^), VS2026 (18.x^)
|
|
||||||
exit /b 1
|
|
||||||
)
|
|
||||||
|
|
||||||
echo Detected Visual Studio %VS_VERSION% (version %VS_MAJOR%)
|
|
||||||
echo Using CMake generator: %CMAKE_GENERATOR%
|
|
||||||
|
|
||||||
:generator_ready
|
|
||||||
|
|
||||||
@REM Pack deps
|
|
||||||
if "%1"=="pack" (
|
|
||||||
setlocal ENABLEDELAYEDEXPANSION
|
|
||||||
cd %WP%/deps/build
|
|
||||||
if "%arch%"=="ARM64" cd %WP%/deps/build-arm64
|
|
||||||
for /f "tokens=2-4 delims=/ " %%a in ('date /t') do set build_date=%%c%%b%%a
|
|
||||||
echo packing deps: OrcaSlicer_dep_win-!arch!_!build_date!_vs!VS_VERSION!.zip
|
|
||||||
|
|
||||||
%WP%/tools/7z.exe a OrcaSlicer_dep_win-!arch!_!build_date!_vs!VS_VERSION!.zip OrcaSlicer_dep
|
|
||||||
goto :done
|
|
||||||
)
|
|
||||||
|
|
||||||
set debug=OFF
|
|
||||||
set debuginfo=OFF
|
|
||||||
if "%1"=="debug" set debug=ON
|
|
||||||
if "%2"=="debug" set debug=ON
|
|
||||||
if "%1"=="debuginfo" set debuginfo=ON
|
|
||||||
if "%2"=="debuginfo" set debuginfo=ON
|
|
||||||
if "%debug%"=="ON" (
|
|
||||||
set build_type=Debug
|
|
||||||
set build_dir=build-dbg
|
|
||||||
) else (
|
|
||||||
if "%debuginfo%"=="ON" (
|
|
||||||
set build_type=RelWithDebInfo
|
|
||||||
set build_dir=build-dbginfo
|
|
||||||
) else (
|
|
||||||
set build_type=Release
|
|
||||||
set build_dir=build
|
|
||||||
)
|
|
||||||
)
|
|
||||||
if "%arch%"=="ARM64" set build_dir=%build_dir%-arm64
|
|
||||||
echo build type set to %build_type%, arch=%arch%
|
|
||||||
|
|
||||||
setlocal DISABLEDELAYEDEXPANSION
|
|
||||||
cd deps
|
|
||||||
mkdir %build_dir%
|
|
||||||
cd %build_dir%
|
|
||||||
set "SIG_FLAG="
|
|
||||||
if defined ORCA_UPDATER_SIG_KEY set "SIG_FLAG=-DORCA_UPDATER_SIG_KEY=%ORCA_UPDATER_SIG_KEY%"
|
|
||||||
|
|
||||||
if "%1"=="slicer" (
|
|
||||||
GOTO :slicer
|
|
||||||
)
|
|
||||||
echo "building deps.."
|
|
||||||
|
|
||||||
echo on
|
|
||||||
REM Set minimum CMake policy to avoid <3.5 errors
|
|
||||||
set CMAKE_POLICY_VERSION_MINIMUM=3.5
|
|
||||||
if "%USE_NINJA%"=="1" (
|
|
||||||
cmake ../ -G %CMAKE_GENERATOR% -DCMAKE_BUILD_TYPE=%build_type%
|
|
||||||
cmake --build . --config %build_type% --target deps
|
|
||||||
) else (
|
|
||||||
cmake ../ -G %CMAKE_GENERATOR% -A %arch% -DCMAKE_BUILD_TYPE=%build_type%
|
|
||||||
cmake --build . --config %build_type% --target deps -- -m
|
|
||||||
)
|
|
||||||
@echo off
|
|
||||||
|
|
||||||
if "%1"=="deps" goto :done
|
|
||||||
|
|
||||||
:slicer
|
|
||||||
echo "building Orca Slicer..."
|
|
||||||
cd %WP%
|
|
||||||
mkdir %build_dir%
|
|
||||||
cd %build_dir%
|
|
||||||
|
|
||||||
echo on
|
|
||||||
set CMAKE_POLICY_VERSION_MINIMUM=3.5
|
|
||||||
if "%USE_NINJA%"=="1" (
|
|
||||||
cmake .. -G %CMAKE_GENERATOR% -DORCA_TOOLS=ON %SIG_FLAG% -DBUILD_TESTS=%BUILD_TESTS% -DCMAKE_BUILD_TYPE=%build_type%
|
|
||||||
cmake --build . --config %build_type% --target all
|
|
||||||
) else (
|
|
||||||
cmake .. -G %CMAKE_GENERATOR% -A %arch% -DORCA_TOOLS=ON %SIG_FLAG% -DBUILD_TESTS=%BUILD_TESTS% -DCMAKE_BUILD_TYPE=%build_type%
|
|
||||||
cmake --build . --config %build_type% --target ALL_BUILD -- -m
|
|
||||||
)
|
|
||||||
@echo off
|
|
||||||
cd ..
|
|
||||||
call scripts/run_gettext.bat
|
|
||||||
cd %build_dir%
|
|
||||||
cmake --build . --target install --config %build_type%
|
|
||||||
|
|
||||||
:done
|
|
||||||
@echo off
|
|
||||||
for /f "tokens=1-3 delims=:.," %%a in ("%_START_TIME: =0%") do set /a "_start_s=%%a*3600+%%b*60+%%c"
|
|
||||||
for /f "tokens=1-3 delims=:.," %%a in ("%TIME: =0%") do set /a "_end_s=%%a*3600+%%b*60+%%c"
|
|
||||||
set /a "_elapsed=_end_s - _start_s"
|
|
||||||
if %_elapsed% lss 0 set /a "_elapsed+=86400"
|
|
||||||
set /a "_hours=_elapsed / 3600"
|
|
||||||
set /a "_remainder=_elapsed - _hours * 3600"
|
|
||||||
set /a "_mins=_remainder / 60"
|
|
||||||
set /a "_secs=_remainder - _mins * 60"
|
|
||||||
echo.
|
|
||||||
echo Build completed in %_hours%h %_mins%m %_secs%s
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
@REM OrcaSlicer build script for Windows
|
|
||||||
@echo off
|
|
||||||
set WP=%CD%
|
|
||||||
|
|
||||||
@REM Pack deps
|
|
||||||
if "%1"=="pack" (
|
|
||||||
setlocal ENABLEDELAYEDEXPANSION
|
|
||||||
cd %WP%/deps/build
|
|
||||||
for /f "tokens=2-4 delims=/ " %%a in ('date /t') do set build_date=%%c%%b%%a
|
|
||||||
echo packing deps: OrcaSlicer_dep_win64_!build_date!_vs2022.zip
|
|
||||||
|
|
||||||
%WP%/tools/7z.exe a OrcaSlicer_dep_win64_!build_date!_vs2022.zip OrcaSlicer_dep
|
|
||||||
exit /b 0
|
|
||||||
)
|
|
||||||
|
|
||||||
set debug=OFF
|
|
||||||
set debuginfo=OFF
|
|
||||||
@REM Default target architecture to the host CPU arch; override with x64/arm64 arg.
|
|
||||||
set arch=x64
|
|
||||||
if /I "%PROCESSOR_ARCHITECTURE%"=="ARM64" set arch=ARM64
|
|
||||||
if /I "%PROCESSOR_ARCHITEW6432%"=="ARM64" set arch=ARM64
|
|
||||||
if "%1"=="debug" set debug=ON
|
|
||||||
if "%2"=="debug" set debug=ON
|
|
||||||
if "%1"=="debuginfo" set debuginfo=ON
|
|
||||||
if "%2"=="debuginfo" set debuginfo=ON
|
|
||||||
if /I "%1"=="arm64" set arch=ARM64
|
|
||||||
if /I "%2"=="arm64" set arch=ARM64
|
|
||||||
if /I "%1"=="x64" set arch=x64
|
|
||||||
if /I "%2"=="x64" set arch=x64
|
|
||||||
if "%debug%"=="ON" (
|
|
||||||
set build_type=Debug
|
|
||||||
set build_dir=build-dbg
|
|
||||||
) else (
|
|
||||||
if "%debuginfo%"=="ON" (
|
|
||||||
set build_type=RelWithDebInfo
|
|
||||||
set build_dir=build-dbginfo
|
|
||||||
) else (
|
|
||||||
set build_type=Release
|
|
||||||
set build_dir=build
|
|
||||||
)
|
|
||||||
)
|
|
||||||
if "%arch%"=="ARM64" set build_dir=%build_dir%-arm64
|
|
||||||
echo build type set to %build_type%, arch=%arch%
|
|
||||||
|
|
||||||
setlocal DISABLEDELAYEDEXPANSION
|
|
||||||
cd deps
|
|
||||||
mkdir %build_dir%
|
|
||||||
cd %build_dir%
|
|
||||||
set "SIG_FLAG="
|
|
||||||
if defined ORCA_UPDATER_SIG_KEY set "SIG_FLAG=-DORCA_UPDATER_SIG_KEY=%ORCA_UPDATER_SIG_KEY%"
|
|
||||||
|
|
||||||
if "%1"=="slicer" (
|
|
||||||
GOTO :slicer
|
|
||||||
)
|
|
||||||
echo "building deps.."
|
|
||||||
|
|
||||||
echo on
|
|
||||||
REM Set minimum CMake policy to avoid <3.5 errors
|
|
||||||
set CMAKE_POLICY_VERSION_MINIMUM=3.5
|
|
||||||
cmake ../ -G "Visual Studio 17 2022" -A %arch% -DCMAKE_BUILD_TYPE=%build_type%
|
|
||||||
cmake --build . --config %build_type% --target deps -- -m
|
|
||||||
@echo off
|
|
||||||
|
|
||||||
if "%1"=="deps" exit /b 0
|
|
||||||
|
|
||||||
:slicer
|
|
||||||
echo "building Orca Slicer..."
|
|
||||||
cd %WP%
|
|
||||||
mkdir %build_dir%
|
|
||||||
cd %build_dir%
|
|
||||||
|
|
||||||
echo on
|
|
||||||
set CMAKE_POLICY_VERSION_MINIMUM=3.5
|
|
||||||
cmake .. -G "Visual Studio 17 2022" -A %arch% -DORCA_TOOLS=ON %SIG_FLAG% -DCMAKE_BUILD_TYPE=%build_type%
|
|
||||||
cmake --build . --config %build_type% --target ALL_BUILD -- -m
|
|
||||||
@echo off
|
|
||||||
cd ..
|
|
||||||
call scripts/run_gettext.bat
|
|
||||||
cd %build_dir%
|
|
||||||
cmake --build . --target install --config %build_type%
|
|
||||||
+1396
File diff suppressed because it is too large
Load Diff
@@ -256,6 +256,13 @@ function(add_precompiled_header _target _input)
|
|||||||
message(STATUS "Adding precompiled header ${_input} to target ${_target}.")
|
message(STATUS "Adding precompiled header ${_input} to target ${_target}.")
|
||||||
target_precompile_headers(${_target} PRIVATE ${_input})
|
target_precompile_headers(${_target} PRIVATE ${_input})
|
||||||
|
|
||||||
|
# Clang records the modification time of every input in the precompiled
|
||||||
|
# header, which makes it differ between two checkouts of the same source
|
||||||
|
# and defeats a compiler cache. The build system already rebuilds the
|
||||||
|
# header when an input changes.
|
||||||
|
target_compile_options(${_target} PRIVATE
|
||||||
|
"$<$<CXX_COMPILER_ID:Clang,AppleClang>:SHELL:-Xclang -fno-pch-timestamp>")
|
||||||
|
|
||||||
get_target_property(_sources ${_target} SOURCES)
|
get_target_property(_sources ${_target} SOURCES)
|
||||||
list(FILTER _sources INCLUDE REGEX ".*\\.mm?")
|
list(FILTER _sources INCLUDE REGEX ".*\\.mm?")
|
||||||
|
|
||||||
|
|||||||
Vendored
+43
@@ -0,0 +1,43 @@
|
|||||||
|
if(CMAKE_VERSION VERSION_LESS 3.22)
|
||||||
|
set(_assimp_url "https://github.com/assimp/assimp/archive/refs/tags/v5.3.1.tar.gz")
|
||||||
|
set(_assimp_hash "SHA256=a07666be71afe1ad4bc008c2336b7c688aca391271188eb9108d0c6db1be53f1")
|
||||||
|
else()
|
||||||
|
set(_assimp_url "https://github.com/assimp/assimp/archive/refs/tags/v5.4.3.tar.gz")
|
||||||
|
set(_assimp_hash "SHA256=66dfbaee288f2bc43172440a55d0235dfc7bf885dda6435c038e8000e79582cb")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Assimp's bundled zlib (contrib/zlib) is too old to compile against the modern
|
||||||
|
# macOS SDK: its zutil.h takes the classic-Mac branch under TARGET_OS_MAC and
|
||||||
|
# does `#define fdopen(fd,mode) NULL`, which then clobbers the SDK's real
|
||||||
|
# `fdopen` prototype in <stdio.h> and breaks the build. On macOS use the system
|
||||||
|
# zlib (already found by find_package(ZLIB) in deps-unix-common) instead.
|
||||||
|
if(APPLE)
|
||||||
|
set(_assimp_build_zlib "-DASSIMP_BUILD_ZLIB=OFF")
|
||||||
|
else()
|
||||||
|
set(_assimp_build_zlib "-DASSIMP_BUILD_ZLIB=ON")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
orcaslicer_add_cmake_project(Assimp
|
||||||
|
URL ${_assimp_url}
|
||||||
|
URL_HASH ${_assimp_hash}
|
||||||
|
CMAKE_ARGS
|
||||||
|
# Assimp's ccache support sets the global RULE_LAUNCH_COMPILE, which breaks
|
||||||
|
# the Ninja RC rule. The superbuild forwards CMAKE_<LANG>_COMPILER_LAUNCHER.
|
||||||
|
-DASSIMP_BUILD_USE_CCACHE=OFF
|
||||||
|
-DASSIMP_BUILD_TESTS=OFF
|
||||||
|
-DASSIMP_BUILD_SAMPLES=OFF
|
||||||
|
-DASSIMP_BUILD_ASSIMP_TOOLS=OFF
|
||||||
|
-DASSIMP_INSTALL_PDB=OFF
|
||||||
|
-DASSIMP_NO_EXPORT=ON
|
||||||
|
-DASSIMP_BUILD_ALL_IMPORTERS_BY_DEFAULT=OFF
|
||||||
|
-DASSIMP_BUILD_GLTF_IMPORTER=ON
|
||||||
|
-DASSIMP_BUILD_OBJ_IMPORTER=ON
|
||||||
|
-DASSIMP_BUILD_FBX_IMPORTER=ON
|
||||||
|
${_assimp_build_zlib}
|
||||||
|
-DASSIMP_WARNINGS_AS_ERRORS=OFF
|
||||||
|
-DBUILD_WITH_STATIC_CRT=OFF
|
||||||
|
)
|
||||||
|
|
||||||
|
if (MSVC)
|
||||||
|
add_debug_dep(dep_Assimp)
|
||||||
|
endif ()
|
||||||
Vendored
+9
-1
@@ -24,6 +24,13 @@ if (MSVC AND DEP_DEBUG)
|
|||||||
set(_options "FORWARD_CONFIG")
|
set(_options "FORWARD_CONFIG")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
# Boost.Container's bundled dlmalloc passes int* where the Win32 Interlocked API
|
||||||
|
# takes volatile long*; cl compiles that with a warning, clang errors out.
|
||||||
|
set(_boost_c_flags_line "")
|
||||||
|
if (MSVC AND CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
||||||
|
set(_boost_c_flags_line "-DCMAKE_C_FLAGS:STRING=-Wno-incompatible-pointer-types")
|
||||||
|
endif ()
|
||||||
|
|
||||||
orcaslicer_add_cmake_project(Boost
|
orcaslicer_add_cmake_project(Boost
|
||||||
${_options}
|
${_options}
|
||||||
URL "https://github.com/boostorg/boost/releases/download/boost-1.84.0/boost-1.84.0.tar.gz"
|
URL "https://github.com/boostorg/boost/releases/download/boost-1.84.0/boost-1.84.0.tar.gz"
|
||||||
@@ -38,6 +45,7 @@ orcaslicer_add_cmake_project(Boost
|
|||||||
"${_context_abi_line}"
|
"${_context_abi_line}"
|
||||||
"${_context_arch_line}"
|
"${_context_arch_line}"
|
||||||
"${_context_impl_line}"
|
"${_context_impl_line}"
|
||||||
|
"${_boost_c_flags_line}"
|
||||||
)
|
)
|
||||||
|
|
||||||
set(DEP_Boost_DEPENDS ZLIB)
|
set(DEP_Boost_DEPENDS ZLIB)
|
||||||
|
|||||||
Vendored
+20
-4
@@ -157,8 +157,16 @@ endif ()
|
|||||||
function(orcaslicer_add_cmake_project projectname)
|
function(orcaslicer_add_cmake_project projectname)
|
||||||
cmake_parse_arguments(P_ARGS "FORWARD_CONFIG" "INSTALL_DIR;BUILD_COMMAND;INSTALL_COMMAND" "CMAKE_ARGS" ${ARGN})
|
cmake_parse_arguments(P_ARGS "FORWARD_CONFIG" "INSTALL_DIR;BUILD_COMMAND;INSTALL_COMMAND" "CMAKE_ARGS" ${ARGN})
|
||||||
|
|
||||||
|
# MSVC is true for clang-cl as well, so the sub-build toolchain has to key on the
|
||||||
|
# generator. A non-Visual-Studio superbuild passes its own generator down, and with
|
||||||
|
# it the CMAKE_C_COMPILER / CMAKE_CXX_COMPILER forwarded below.
|
||||||
|
set(_dep_msvc_gen FALSE)
|
||||||
|
if (MSVC AND CMAKE_GENERATOR MATCHES "Visual Studio")
|
||||||
|
set(_dep_msvc_gen TRUE)
|
||||||
|
endif ()
|
||||||
|
|
||||||
set(_configs_line -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE})
|
set(_configs_line -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE})
|
||||||
if (_is_multi OR MSVC)
|
if (_is_multi OR _dep_msvc_gen)
|
||||||
if (P_ARGS_FORWARD_CONFIG)
|
if (P_ARGS_FORWARD_CONFIG)
|
||||||
set(_configs_line -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE})
|
set(_configs_line -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE})
|
||||||
elseif (ORCA_INCLUDE_DEBUG_INFO AND NOT DEP_DEBUG)
|
elseif (ORCA_INCLUDE_DEBUG_INFO AND NOT DEP_DEBUG)
|
||||||
@@ -174,7 +182,7 @@ function(orcaslicer_add_cmake_project projectname)
|
|||||||
set(_target_config "Release")
|
set(_target_config "Release")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (MSVC)
|
if (_dep_msvc_gen)
|
||||||
set(_gen CMAKE_GENERATOR "${DEP_MSVC_GEN}" CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}")
|
set(_gen CMAKE_GENERATOR "${DEP_MSVC_GEN}" CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}")
|
||||||
else()
|
else()
|
||||||
set(_gen "")
|
set(_gen "")
|
||||||
@@ -182,7 +190,7 @@ function(orcaslicer_add_cmake_project projectname)
|
|||||||
|
|
||||||
if ($ENV{CMAKE_BUILD_PARALLEL_LEVEL})
|
if ($ENV{CMAKE_BUILD_PARALLEL_LEVEL})
|
||||||
set(_build_j "") # assume environment will control --build parallel setting
|
set(_build_j "") # assume environment will control --build parallel setting
|
||||||
elseif(MSVC)
|
elseif(_dep_msvc_gen)
|
||||||
set(_build_j "/m")
|
set(_build_j "/m")
|
||||||
else()
|
else()
|
||||||
set(_build_j "-j${NPROC}")
|
set(_build_j "-j${NPROC}")
|
||||||
@@ -367,7 +375,6 @@ include(libnoise/libnoise.cmake)
|
|||||||
|
|
||||||
include(Draco/Draco.cmake)
|
include(Draco/Draco.cmake)
|
||||||
|
|
||||||
|
|
||||||
# I *think* 1.1 is used for *just* md5 hashing?
|
# I *think* 1.1 is used for *just* md5 hashing?
|
||||||
# 3.1 has everything in the right place, but the md5 funcs used are deprecated
|
# 3.1 has everything in the right place, but the md5 funcs used are deprecated
|
||||||
# a grep across the repo shows it is used for other things
|
# a grep across the repo shows it is used for other things
|
||||||
@@ -378,6 +385,12 @@ if(NOT OPENSSL_FOUND)
|
|||||||
set(OPENSSL_PKG dep_OpenSSL)
|
set(OPENSSL_PKG dep_OpenSSL)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
include(FFMPEG/FFMPEG.cmake)
|
||||||
|
include(Assimp/Assimp.cmake)
|
||||||
|
|
||||||
|
include(DataChannel/DataChannel.cmake)
|
||||||
|
set(DATACHANNEL_PKG dep_DataChannel)
|
||||||
|
|
||||||
# we don't want to load a "wrong" openssl when loading curl
|
# we don't want to load a "wrong" openssl when loading curl
|
||||||
# so, just don't even bother
|
# so, just don't even bother
|
||||||
# ...i think this is how it works? change if wrong
|
# ...i think this is how it works? change if wrong
|
||||||
@@ -448,6 +461,9 @@ set(_dep_list
|
|||||||
dep_libnoise
|
dep_libnoise
|
||||||
dep_python3
|
dep_python3
|
||||||
dep_wxInspector
|
dep_wxInspector
|
||||||
|
dep_FFMPEG
|
||||||
|
dep_Assimp
|
||||||
|
${DATACHANNEL_PKG}
|
||||||
)
|
)
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
|
|||||||
Vendored
+14
@@ -56,6 +56,18 @@ else()
|
|||||||
set(_curl_static ON)
|
set(_curl_static ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# curl 7.75's configure probes and code rely on C laxness cl allows but clang
|
||||||
|
# errors on (implicit function declarations, int* vs u_long* in ioctlsocket),
|
||||||
|
# which flips probe results and misconfigures nonblock.c into the AmigaOS
|
||||||
|
# IoctlSocket branch. Relax both diagnostics so the probes behave like cl, and
|
||||||
|
# pin the camel-case probes off since they only "pass" by implicit declaration.
|
||||||
|
set(_curl_c_flags_line "")
|
||||||
|
set(_curl_probe_overrides "")
|
||||||
|
if (MSVC AND CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
||||||
|
set(_curl_c_flags_line "-DCMAKE_C_FLAGS:STRING=-Wno-implicit-function-declaration -Wno-incompatible-pointer-types")
|
||||||
|
set(_curl_probe_overrides -DHAVE_IOCTLSOCKET_CAMEL=0 -DHAVE_IOCTLSOCKET_CAMEL_FIONBIO=0)
|
||||||
|
endif ()
|
||||||
|
|
||||||
orcaslicer_add_cmake_project(CURL
|
orcaslicer_add_cmake_project(CURL
|
||||||
# GIT_REPOSITORY https://github.com/curl/curl.git
|
# GIT_REPOSITORY https://github.com/curl/curl.git
|
||||||
# GIT_TAG curl-7_75_0
|
# GIT_TAG curl-7_75_0
|
||||||
@@ -69,6 +81,8 @@ orcaslicer_add_cmake_project(CURL
|
|||||||
-DBUILD_CURL_EXE:BOOL=OFF
|
-DBUILD_CURL_EXE:BOOL=OFF
|
||||||
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
|
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
|
||||||
-DCURL_STATICLIB=${_curl_static}
|
-DCURL_STATICLIB=${_curl_static}
|
||||||
|
"${_curl_c_flags_line}"
|
||||||
|
${_curl_probe_overrides}
|
||||||
${_curl_platform_flags}
|
${_curl_platform_flags}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Vendored
+20
@@ -0,0 +1,20 @@
|
|||||||
|
# libdatachannel is the native ICE/DTLS/SCTP implementation used by the
|
||||||
|
# GUI WebRTC camera controller. Keep the source revision fixed: the signaling
|
||||||
|
# protocol is evolving independently of this transport dependency.
|
||||||
|
orcaslicer_add_cmake_project(DataChannel
|
||||||
|
DEPENDS ${OPENSSL_PKG}
|
||||||
|
CMAKE_ARGS
|
||||||
|
-DNO_EXAMPLES=ON
|
||||||
|
-DNO_TESTS=ON
|
||||||
|
-DNO_WEBSOCKET=ON
|
||||||
|
-DNO_MEDIA=ON
|
||||||
|
-DUSE_NICE=OFF
|
||||||
|
-DUSE_SYSTEM_JUICE=OFF
|
||||||
|
-DUSE_SYSTEM_USRSCTP=OFF
|
||||||
|
-DOPENSSL_ROOT_DIR:PATH=${DESTDIR}
|
||||||
|
-DOPENSSL_USE_STATIC_LIBS=ON
|
||||||
|
GIT_REPOSITORY https://github.com/paullouisageneau/libdatachannel.git
|
||||||
|
GIT_TAG v0.22.2
|
||||||
|
GIT_SHALLOW ON
|
||||||
|
GIT_SUBMODULES_RECURSE ON
|
||||||
|
)
|
||||||
Vendored
+15
@@ -7,5 +7,20 @@ orcaslicer_add_cmake_project(Eigen
|
|||||||
URL https://gitlab.com/libeigen/eigen/-/archive/5.0.1/eigen-5.0.1.zip
|
URL https://gitlab.com/libeigen/eigen/-/archive/5.0.1/eigen-5.0.1.zip
|
||||||
URL_HASH SHA256=0dbb1f9e3aaad66f352c03227d8c983f6f0b49e0b07e71a7300f4abcc01aee12
|
URL_HASH SHA256=0dbb1f9e3aaad66f352c03227d8c983f6f0b49e0b07e71a7300f4abcc01aee12
|
||||||
CMAKE_ARGS "${_eigen_extra_flags}"
|
CMAKE_ARGS "${_eigen_extra_flags}"
|
||||||
|
# Only the headers are consumed here. Everything below builds nothing we
|
||||||
|
# use, and all three enable_language(Fortran): test/CMakeLists.txt:9,
|
||||||
|
# lapack/CMakeLists.txt:6 and blas/testing/CMakeLists.txt:2. They default
|
||||||
|
# to ON because the dependency configures as its own top-level project.
|
||||||
|
#
|
||||||
|
# Whether that probe is harmless depends on what CMake finds. The Visual
|
||||||
|
# Studio generator supports no Fortran, so it finds nothing; clang-cl sits
|
||||||
|
# next to the LLVM toolset's flang, which works. MSVC with Ninja finds
|
||||||
|
# Strawberry Perl's MinGW gfortran instead, which the deps build already
|
||||||
|
# requires for OpenSSL, and hands it the MSVC-style /machine:x64 that
|
||||||
|
# MinGW's ld reads as a missing input file. The configure dies there and
|
||||||
|
# takes the rest of the superbuild with it.
|
||||||
|
-DEIGEN_BUILD_TESTING=OFF
|
||||||
|
-DEIGEN_BUILD_BLAS=OFF
|
||||||
|
-DEIGEN_BUILD_LAPACK=OFF
|
||||||
DEPENDS dep_Boost dep_GMP dep_MPFR
|
DEPENDS dep_Boost dep_GMP dep_MPFR
|
||||||
)
|
)
|
||||||
|
|||||||
Vendored
+103
@@ -0,0 +1,103 @@
|
|||||||
|
set(_conf_cmd ./configure)
|
||||||
|
|
||||||
|
set(_ffmpeg_depends)
|
||||||
|
set(_ffmpeg_configure_command ${_conf_cmd})
|
||||||
|
if (TARGET dep_OpenSSL)
|
||||||
|
set(_ffmpeg_depends DEPENDS dep_OpenSSL)
|
||||||
|
set(_ffmpeg_configure_command
|
||||||
|
${CMAKE_COMMAND} -E env
|
||||||
|
"PKG_CONFIG_PATH=${DESTDIR}/lib/pkgconfig:$ENV{PKG_CONFIG_PATH}"
|
||||||
|
${_conf_cmd}
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (MSVC)
|
||||||
|
set(_source_dir "${CMAKE_BINARY_DIR}/dep_FFMPEG-prefix/src/dep_FFMPEG")
|
||||||
|
|
||||||
|
set(PREBUILD_URL_arm64 "https://github.com/Noisyfox/FFmpeg-Builds-Orca/releases/download/autobuild-2026-07-17-14-28/ffmpeg-n7.0.3-31-g9b6ffd74b5-winarm64-orca-shared-7.0.zip")
|
||||||
|
set(PREBUILD_HASH_arm64 "12f4140279f2f8469885e1b5b2e8be9d788882914c21523cacd56989f3548054")
|
||||||
|
set(PREBUILD_URL_x64 "https://github.com/Noisyfox/FFmpeg-Builds-Orca/releases/download/autobuild-2026-07-17-14-28/ffmpeg-n7.0.3-31-g9b6ffd74b5-win64-orca-shared-7.0.zip")
|
||||||
|
set(PREBUILD_HASH_x64 "e65916020ddb9ef84b2666dfbcbfc9b1d67f69d15b4a66db53754637bf2d498c")
|
||||||
|
|
||||||
|
ExternalProject_Add(dep_FFMPEG
|
||||||
|
${_ffmpeg_depends}
|
||||||
|
URL ${PREBUILD_URL_${DEPS_ARCH}}
|
||||||
|
URL_HASH SHA256=${PREBUILD_HASH_${DEPS_ARCH}}
|
||||||
|
DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/FFMPEG
|
||||||
|
CONFIGURE_COMMAND ""
|
||||||
|
BUILD_COMMAND ""
|
||||||
|
INSTALL_COMMAND
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_directory "${_source_dir}/bin" "${DESTDIR}/bin"
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_directory "${_source_dir}/lib" "${DESTDIR}/lib"
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_directory "${_source_dir}/include" "${DESTDIR}/include"
|
||||||
|
)
|
||||||
|
|
||||||
|
else ()
|
||||||
|
set(_openssl_cmd --enable-openssl)
|
||||||
|
|
||||||
|
if (APPLE)
|
||||||
|
set(_minos_cmd
|
||||||
|
"--extra-cflags=-mmacosx-version-min=${DEP_OSX_TARGET}"
|
||||||
|
"--extra-ldflags=-mmacosx-version-min=${DEP_OSX_TARGET}"
|
||||||
|
)
|
||||||
|
# Static FFmpeg: nothing to bundle into the .app, no rpath handling.
|
||||||
|
# Disable the VideoToolbox/AudioToolbox HW-accel paths: the player decodes
|
||||||
|
# in software (swscale), and the auto-detected HW objects would drag in
|
||||||
|
# system frameworks that the static libs would then depend on.
|
||||||
|
set(_link_cmd --enable-static --disable-shared --disable-videotoolbox --disable-audiotoolbox)
|
||||||
|
if (IS_CROSS_COMPILE)
|
||||||
|
set(_cross_cmd --enable-cross-compile)
|
||||||
|
set(_pic_cmd --enable-pic)
|
||||||
|
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64")
|
||||||
|
set(_arch_cmd --arch=arm64)
|
||||||
|
set(_cc_cmd "--cc=clang -arch arm64")
|
||||||
|
else()
|
||||||
|
set(_arch_cmd --arch=x86_64)
|
||||||
|
set(_cc_cmd "--cc=clang -arch x86_64")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
else ()
|
||||||
|
set(_link_cmd --enable-shared)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
set(_build_j -j)
|
||||||
|
if(DEFINED ENV{CMAKE_BUILD_PARALLEL_LEVEL})
|
||||||
|
set(_build_j "-j$ENV{CMAKE_BUILD_PARALLEL_LEVEL}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
ExternalProject_Add(dep_FFMPEG
|
||||||
|
${_ffmpeg_depends}
|
||||||
|
URL https://github.com/FFmpeg/FFmpeg/archive/refs/tags/n7.0.3.tar.gz
|
||||||
|
URL_HASH SHA256=DEEDCABE339165214A3637DF4C86A507AEF0D793CF8774FF68735F4737E8DDBC
|
||||||
|
DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/FFMPEG
|
||||||
|
CONFIGURE_COMMAND ${_ffmpeg_configure_command}
|
||||||
|
${_cross_cmd}
|
||||||
|
${_pic_cmd}
|
||||||
|
${_arch_cmd}
|
||||||
|
${_cc_cmd}
|
||||||
|
"--prefix=${DESTDIR}"
|
||||||
|
${_link_cmd}
|
||||||
|
${_minos_cmd}
|
||||||
|
${_openssl_cmd}
|
||||||
|
--disable-doc
|
||||||
|
--enable-small
|
||||||
|
--disable-outdevs
|
||||||
|
--disable-filters
|
||||||
|
--enable-filter=*null*,afade,*fifo,*format,*resample,aeval,allrgb,allyuv,atempo,pan,*bars,color,*key,crop,draw*,eq*,framerate,*_qsv,*_vaapi,*v4l2*,hw*,scale,volume,test*
|
||||||
|
--disable-protocols
|
||||||
|
--enable-protocol=file,fd,pipe,http,https,rtp,tcp,udp
|
||||||
|
--disable-muxers
|
||||||
|
--enable-muxer=rtp
|
||||||
|
--disable-encoders
|
||||||
|
--disable-decoders
|
||||||
|
--enable-decoder=*aac*,h264*,mp3*,mjpeg,rv*
|
||||||
|
--disable-demuxers
|
||||||
|
--enable-demuxer=h264,mp3,mov,mpjpeg,rtsp,sdp
|
||||||
|
--disable-zlib
|
||||||
|
--disable-avdevice
|
||||||
|
BUILD_IN_SOURCE ON
|
||||||
|
BUILD_COMMAND make ${_build_j}
|
||||||
|
INSTALL_COMMAND make install
|
||||||
|
)
|
||||||
|
|
||||||
|
endif()
|
||||||
Vendored
+43
@@ -1,3 +1,20 @@
|
|||||||
|
diff --git a/adm/cmake/occt_defs_flags.cmake b/adm/cmake/occt_defs_flags.cmake
|
||||||
|
index 00000000..00000001 100644
|
||||||
|
--- a/adm/cmake/occt_defs_flags.cmake
|
||||||
|
+++ b/adm/cmake/occt_defs_flags.cmake
|
||||||
|
@@ -134,7 +134,11 @@
|
||||||
|
set (CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}")
|
||||||
|
endif()
|
||||||
|
# Optimize size of binaries
|
||||||
|
- set (CMAKE_SHARED_LINKER_FLAGS "-Wl,-s ${CMAKE_SHARED_LINKER_FLAGS}")
|
||||||
|
+ # clang-cl reports the Clang compiler ID, and OCCT builds shared on Windows,
|
||||||
|
+ # where the MSVC-style linker gets this flag as an argument it does not know.
|
||||||
|
+ if (NOT WIN32)
|
||||||
|
+ set (CMAKE_SHARED_LINKER_FLAGS "-Wl,-s ${CMAKE_SHARED_LINKER_FLAGS}")
|
||||||
|
+ endif()
|
||||||
|
elseif(MINGW)
|
||||||
|
add_definitions(-D_WIN32_WINNT=0x0601)
|
||||||
|
# _WIN32_WINNT=0x0601 (use Windows 7 SDK)
|
||||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||||
index d98acc0f..28eb8eb4 100644
|
index d98acc0f..28eb8eb4 100644
|
||||||
--- a/CMakeLists.txt
|
--- a/CMakeLists.txt
|
||||||
@@ -168,6 +185,32 @@ index d98acc0f..28eb8eb4 100644
|
|||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
if (BUILD_SAMPLES_QT)
|
if (BUILD_SAMPLES_QT)
|
||||||
|
diff --git a/adm/cmake/occt_macros.cmake b/adm/cmake/occt_macros.cmake
|
||||||
|
index 224c96b1..8c94a1c5 100644
|
||||||
|
--- a/adm/cmake/occt_macros.cmake
|
||||||
|
+++ b/adm/cmake/occt_macros.cmake
|
||||||
|
@@ -608,7 +608,7 @@ macro (OCCT_INSERT_CODE_FOR_TARGET)
|
||||||
|
install(CODE "if (\"\${CMAKE_INSTALL_CONFIG_NAME}\" MATCHES \"^([Rr][Ee][Ll][Ee][Aa][Ss][Ee])$\")
|
||||||
|
set (OCCT_INSTALL_BIN_LETTER \"\")
|
||||||
|
elseif (\"\${CMAKE_INSTALL_CONFIG_NAME}\" MATCHES \"^([Rr][Ee][Ll][Ww][Ii][Tt][Hh][Dd][Ee][Bb][Ii][Nn][Ff][Oo])$\")
|
||||||
|
- set (OCCT_INSTALL_BIN_LETTER \"i\")
|
||||||
|
+ set (OCCT_INSTALL_BIN_LETTER \"\")
|
||||||
|
elseif (\"\${CMAKE_INSTALL_CONFIG_NAME}\" MATCHES \"^([Dd][Ee][Bb][Uu][Gg])$\")
|
||||||
|
set (OCCT_INSTALL_BIN_LETTER \"d\")
|
||||||
|
endif()")
|
||||||
|
diff --git a/adm/cmake/occt_toolkit.cmake b/adm/cmake/occt_toolkit.cmake
|
||||||
|
index 550e0e2f..7ac1a3b8 100644
|
||||||
|
--- a/adm/cmake/occt_toolkit.cmake
|
||||||
|
+++ b/adm/cmake/occt_toolkit.cmake
|
||||||
|
@@ -241,7 +241,7 @@
|
||||||
|
else()
|
||||||
|
set (aReleasePdbConf)
|
||||||
|
endif()
|
||||||
|
- install (FILES ${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bin\${OCCT_INSTALL_BIN_LETTER}/${PROJECT_NAME}.pdb
|
||||||
|
+ install (FILES $<TARGET_PDB_FILE:${PROJECT_NAME}>
|
||||||
|
CONFIGURATIONS Debug ${aReleasePdbConf} RelWithDebInfo
|
||||||
|
DESTINATION "${INSTALL_DIR_BIN}\${OCCT_INSTALL_BIN_LETTER}")
|
||||||
|
endif()
|
||||||
diff --git a/src/Font/Font_FTFont.cxx b/src/Font/Font_FTFont.cxx
|
diff --git a/src/Font/Font_FTFont.cxx b/src/Font/Font_FTFont.cxx
|
||||||
index 5ae9899f..0a17372b 100644
|
index 5ae9899f..0a17372b 100644
|
||||||
--- a/src/Font/Font_FTFont.cxx
|
--- a/src/Font/Font_FTFont.cxx
|
||||||
|
|||||||
Vendored
+8
@@ -1,3 +1,10 @@
|
|||||||
|
# clang-cl cannot emit IGESAppli_GeneralModule.cxx on ARM64
|
||||||
|
# (llvm/llvm-project#62081). cl and clang-cl share an ABI.
|
||||||
|
set(_occt_compiler_args "")
|
||||||
|
if ("${DEPS_ARCH}" STREQUAL "arm64" AND CMAKE_CXX_COMPILER_ID STREQUAL Clang)
|
||||||
|
set(_occt_compiler_args -DCMAKE_C_COMPILER:STRING=cl -DCMAKE_CXX_COMPILER:STRING=cl)
|
||||||
|
endif ()
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
set(library_build_type "Shared")
|
set(library_build_type "Shared")
|
||||||
else()
|
else()
|
||||||
@@ -31,6 +38,7 @@ orcaslicer_add_cmake_project(OCCT
|
|||||||
-DBUILD_MODULE_ModelingAlgorithms=OFF
|
-DBUILD_MODULE_ModelingAlgorithms=OFF
|
||||||
-DBUILD_MODULE_ModelingData=OFF
|
-DBUILD_MODULE_ModelingData=OFF
|
||||||
-DBUILD_MODULE_Visualization=OFF
|
-DBUILD_MODULE_Visualization=OFF
|
||||||
|
${_occt_compiler_args}
|
||||||
)
|
)
|
||||||
|
|
||||||
# add_dependencies(dep_OCCT ${FREETYPE_PKG})
|
# add_dependencies(dep_OCCT ${FREETYPE_PKG})
|
||||||
|
|||||||
Vendored
+8
@@ -10,6 +10,13 @@ else ()
|
|||||||
set(_options "")
|
set(_options "")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
# carotene is OpenCV's ARM NEON HAL. It uses M_PI without _USE_MATH_DEFINES
|
||||||
|
# and does not compile with clang-cl.
|
||||||
|
set(_disable_carotene "")
|
||||||
|
if ("${DEPS_ARCH}" STREQUAL "arm64" AND CMAKE_CXX_COMPILER_ID STREQUAL Clang)
|
||||||
|
set(_disable_carotene "-DWITH_CAROTENE=OFF")
|
||||||
|
endif ()
|
||||||
|
|
||||||
if (IN_GIT_REPO)
|
if (IN_GIT_REPO)
|
||||||
set(OpenCV_DIRECTORY_FLAG --directory ${BINARY_DIR_REL}/dep_OpenCV-prefix/src/dep_OpenCV)
|
set(OpenCV_DIRECTORY_FLAG --directory ${BINARY_DIR_REL}/dep_OpenCV-prefix/src/dep_OpenCV)
|
||||||
endif ()
|
endif ()
|
||||||
@@ -83,5 +90,6 @@ orcaslicer_add_cmake_project(OpenCV
|
|||||||
-DWITH_PROTOBUF=OFF
|
-DWITH_PROTOBUF=OFF
|
||||||
-DWITH_WIN32UI=OFF
|
-DWITH_WIN32UI=OFF
|
||||||
-DHAVE_WIN32UI=FALSE
|
-DHAVE_WIN32UI=FALSE
|
||||||
|
${_disable_carotene}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Vendored
+14
-4
@@ -6,7 +6,7 @@ if(DEFINED OPENSSL_ARCH)
|
|||||||
set(_cross_arch ${OPENSSL_ARCH})
|
set(_cross_arch ${OPENSSL_ARCH})
|
||||||
else()
|
else()
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
if("${CMAKE_GENERATOR_PLATFORM}" STREQUAL "ARM64")
|
if("${DEPS_ARCH}" STREQUAL "arm64")
|
||||||
set(_cross_arch "VC-WIN64-ARM")
|
set(_cross_arch "VC-WIN64-ARM")
|
||||||
else()
|
else()
|
||||||
set(_cross_arch "VC-WIN64A")
|
set(_cross_arch "VC-WIN64A")
|
||||||
@@ -17,10 +17,20 @@ else()
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
set(_conf_cmd perl Configure )
|
set(_openssl_msvc_env CC=cl CXX=cl RC=rc CL=/FS)
|
||||||
|
# OpenSSL's perl Configure honors the CC environment variable, but the
|
||||||
|
# VC-WIN64A makefile only works with cl (an unquoted clang-cl path with
|
||||||
|
# spaces, e.g. exported by CLion, silently produces no .obj files and the
|
||||||
|
# lib step fails with LNK1181). Pin the upstream toolchain.
|
||||||
|
# Keep rc.exe resolved from the MSVC developer environment as well. The
|
||||||
|
# absolute Windows SDK path contains spaces and OpenSSL 1.1.1 writes it to
|
||||||
|
# the generated nmake file without quoting, which skips .res generation.
|
||||||
|
# /FS serializes access to OpenSSL's shared generated PDB when cl is
|
||||||
|
# driven through nmake from a Ninja configure step.
|
||||||
|
set(_conf_cmd ${CMAKE_COMMAND} -E env ${_openssl_msvc_env} perl Configure )
|
||||||
set(_cross_comp_prefix_line "")
|
set(_cross_comp_prefix_line "")
|
||||||
set(_make_cmd nmake)
|
set(_make_cmd ${CMAKE_COMMAND} -E env ${_openssl_msvc_env} nmake)
|
||||||
set(_install_cmd nmake install_sw )
|
set(_install_cmd ${CMAKE_COMMAND} -E env ${_openssl_msvc_env} nmake install_sw )
|
||||||
else()
|
else()
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
set(_conf_cmd export MACOSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} && ./Configure -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET})
|
set(_conf_cmd export MACOSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} && ./Configure -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET})
|
||||||
|
|||||||
Vendored
+4
@@ -1,6 +1,10 @@
|
|||||||
if (APPLE)
|
if (APPLE)
|
||||||
# Only disable NEON extension for Apple ARM builds, leave it enabled for Raspberry PI.
|
# Only disable NEON extension for Apple ARM builds, leave it enabled for Raspberry PI.
|
||||||
set(_disable_neon_extension "-DPNG_ARM_NEON=off")
|
set(_disable_neon_extension "-DPNG_ARM_NEON=off")
|
||||||
|
elseif ("${DEPS_ARCH}" STREQUAL "arm64" AND CMAKE_CXX_COMPILER_ID STREQUAL Clang)
|
||||||
|
# libpng's CMake ignores PNG_ARM_NEON on Windows ARM64 and skips the NEON
|
||||||
|
# sources, but pngpriv.h enables NEON anyway.
|
||||||
|
set(_disable_neon_extension "-DCMAKE_C_FLAGS=/DWIN32 /D_WINDOWS /DPNG_ARM_NEON_OPT=0")
|
||||||
else ()
|
else ()
|
||||||
set(_disable_neon_extension "")
|
set(_disable_neon_extension "")
|
||||||
endif ()
|
endif ()
|
||||||
|
|||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Compiles Objects/unicodectype.c without optimisation. VS 2026's ARM64 code
|
||||||
|
generator needs about 27 GB for _PyUnicode_ToNumeric, a switch with 1951
|
||||||
|
cases. CPython has the same workaround (python/cpython#153668). -->
|
||||||
|
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Update="..\Objects\unicodectype.c">
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
Vendored
+20
-8
@@ -15,7 +15,13 @@ if(WIN32)
|
|||||||
# See https://github.com/python/cpython/issues/153438
|
# See https://github.com/python/cpython/issues/153438
|
||||||
# Patch from https://github.com/python/cpython/pull/153608
|
# Patch from https://github.com/python/cpython/pull/153608
|
||||||
# This patch has not been merged to 3.12 yet so we need to apply it manually
|
# This patch has not been merged to 3.12 yet so we need to apply it manually
|
||||||
set(_patch_cmd git init && ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/01-windows-nuget.patch)
|
#
|
||||||
|
# Without core.autocrlf=false the patched find_python.bat comes out LF and
|
||||||
|
# cmd.exe cannot find its goto labels.
|
||||||
|
set(_patch_cmd git init
|
||||||
|
&& ${GIT_EXECUTABLE} -c core.autocrlf=false apply --verbose
|
||||||
|
--ignore-space-change --whitespace=fix
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/01-windows-nuget.patch)
|
||||||
|
|
||||||
if(MSVC_VERSION EQUAL 1800)
|
if(MSVC_VERSION EQUAL 1800)
|
||||||
set(_python_platform_toolset v120)
|
set(_python_platform_toolset v120)
|
||||||
@@ -53,12 +59,9 @@ if(WIN32)
|
|||||||
set(_python_pcbuild_output_dir win32)
|
set(_python_pcbuild_output_dir win32)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# pybind11 undefines _DEBUG around Python.h so a debug build links the
|
||||||
|
# release python3xx.lib; Py_DEBUG could not load release plugin modules.
|
||||||
set(_python_pcbuild_config Release)
|
set(_python_pcbuild_config Release)
|
||||||
set(_python_layout_debug OFF)
|
|
||||||
if(DEFINED DEP_DEBUG AND DEP_DEBUG)
|
|
||||||
set(_python_pcbuild_config Debug)
|
|
||||||
set(_python_layout_debug ON)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# CPython's PCbuild needs a 64-bit-hosted toolchain: find_msbuild.bat picks the
|
# CPython's PCbuild needs a 64-bit-hosted toolchain: find_msbuild.bat picks the
|
||||||
# 32-bit Bin\MSBuild.exe, whose x86 cl.exe/link.exe run out of address space
|
# 32-bit Bin\MSBuild.exe, whose x86 cl.exe/link.exe run out of address space
|
||||||
@@ -85,8 +88,18 @@ if(WIN32)
|
|||||||
list(APPEND _python_env_args "PreferredToolArchitecture=${_python_tool_arch}")
|
list(APPEND _python_env_args "PreferredToolArchitecture=${_python_tool_arch}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# MSBuild reads extra switches from PCbuild/msbuild.rsp.
|
||||||
|
set(_python_rsp "/p:PlatformToolset=${_python_platform_toolset}\n")
|
||||||
|
# VS 2026's ARM64 code generator needs about 27 GB for one function in
|
||||||
|
# Objects/unicodectype.c (python/cpython#153668); the property sheet compiles
|
||||||
|
# that file without optimisation.
|
||||||
|
if(_python_pcbuild_platform STREQUAL "ARM64")
|
||||||
|
file(TO_NATIVE_PATH "${CMAKE_CURRENT_LIST_DIR}/arm64-unicodectype.props" _python_arm64_props)
|
||||||
|
string(APPEND _python_rsp "/p:ForceImportAfterCppTargets=\"${_python_arm64_props}\"\n")
|
||||||
|
endif()
|
||||||
|
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/python3-msbuild.rsp" "${_python_rsp}")
|
||||||
set(_conf_cmd
|
set(_conf_cmd
|
||||||
cmd /c "echo /p:PlatformToolset=${_python_platform_toolset}>PCbuild\\msbuild.rsp"
|
${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_BINARY_DIR}/python3-msbuild.rsp" <SOURCE_DIR>/PCbuild/msbuild.rsp
|
||||||
)
|
)
|
||||||
set(_build_cmd
|
set(_build_cmd
|
||||||
${CMAKE_COMMAND} -E env ${_python_env_args}
|
${CMAKE_COMMAND} -E env ${_python_env_args}
|
||||||
@@ -101,7 +114,6 @@ if(WIN32)
|
|||||||
-DPYTHON_BUILD_DIR=<SOURCE_DIR>/PCbuild/${_python_pcbuild_output_dir}
|
-DPYTHON_BUILD_DIR=<SOURCE_DIR>/PCbuild/${_python_pcbuild_output_dir}
|
||||||
-DPYTHON_DEST_DIR=${DESTDIR}/libpython
|
-DPYTHON_DEST_DIR=${DESTDIR}/libpython
|
||||||
-DPYTHON_LAYOUT_ARCH=${_python_layout_arch}
|
-DPYTHON_LAYOUT_ARCH=${_python_layout_arch}
|
||||||
-DPYTHON_DEBUG=${_python_layout_debug}
|
|
||||||
-P ${CMAKE_CURRENT_LIST_DIR}/stage_windows.cmake
|
-P ${CMAKE_CURRENT_LIST_DIR}/stage_windows.cmake
|
||||||
)
|
)
|
||||||
elseif(APPLE)
|
elseif(APPLE)
|
||||||
|
|||||||
Vendored
+3
-17
@@ -9,9 +9,6 @@ foreach(_var PYTHON_SOURCE_DIR PYTHON_BUILD_DIR PYTHON_DEST_DIR PYTHON_LAYOUT_AR
|
|||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
set(_python_exe "${PYTHON_BUILD_DIR}/python.exe")
|
set(_python_exe "${PYTHON_BUILD_DIR}/python.exe")
|
||||||
if(PYTHON_DEBUG)
|
|
||||||
set(_python_exe "${PYTHON_BUILD_DIR}/python_d.exe")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT EXISTS "${_python_exe}")
|
if(NOT EXISTS "${_python_exe}")
|
||||||
message(FATAL_ERROR "Built Python executable not found: ${_python_exe}")
|
message(FATAL_ERROR "Built Python executable not found: ${_python_exe}")
|
||||||
@@ -49,22 +46,11 @@ endif()
|
|||||||
set(_required_files
|
set(_required_files
|
||||||
"${PYTHON_DEST_DIR}/Lib/encodings/__init__.py"
|
"${PYTHON_DEST_DIR}/Lib/encodings/__init__.py"
|
||||||
"${PYTHON_DEST_DIR}/include/Python.h"
|
"${PYTHON_DEST_DIR}/include/Python.h"
|
||||||
|
"${PYTHON_DEST_DIR}/python.exe"
|
||||||
|
"${PYTHON_DEST_DIR}/python${_python_abi}.dll"
|
||||||
|
"${PYTHON_DEST_DIR}/libs/python${_python_abi}.lib"
|
||||||
)
|
)
|
||||||
|
|
||||||
if(PYTHON_DEBUG)
|
|
||||||
list(APPEND _required_files
|
|
||||||
"${PYTHON_DEST_DIR}/python_d.exe"
|
|
||||||
"${PYTHON_DEST_DIR}/python${_python_abi}_d.dll"
|
|
||||||
"${PYTHON_DEST_DIR}/libs/python${_python_abi}_d.lib"
|
|
||||||
)
|
|
||||||
else()
|
|
||||||
list(APPEND _required_files
|
|
||||||
"${PYTHON_DEST_DIR}/python.exe"
|
|
||||||
"${PYTHON_DEST_DIR}/python${_python_abi}.dll"
|
|
||||||
"${PYTHON_DEST_DIR}/libs/python${_python_abi}.lib"
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
foreach(_required_file IN LISTS _required_files)
|
foreach(_required_file IN LISTS _required_files)
|
||||||
if(NOT EXISTS "${_required_file}")
|
if(NOT EXISTS "${_required_file}")
|
||||||
message(FATAL_ERROR "Staged Python file missing: ${_required_file}")
|
message(FATAL_ERROR "Staged Python file missing: ${_required_file}")
|
||||||
|
|||||||
Vendored
+24
@@ -1,3 +1,26 @@
|
|||||||
|
# wxInspector finds wxWidgets through CMake's FindwxWidgets module, which only
|
||||||
|
# searches lib/vc*_lib because _WX_TOOL is hardcoded to "vc". A superbuild driven
|
||||||
|
# by clang-cl installs wxWidgets into lib/clang_x64_lib, so hand the module the
|
||||||
|
# directory wxWidgets actually used, derived the same way wxWidgetsConfig.cmake
|
||||||
|
# derives it.
|
||||||
|
set(_wxinspector_wx_hints "")
|
||||||
|
if (MSVC)
|
||||||
|
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||||
|
set(_wx_compiler_prefix "clang")
|
||||||
|
else ()
|
||||||
|
set(_wx_compiler_prefix "vc")
|
||||||
|
endif ()
|
||||||
|
set(_wx_arch_suffix "")
|
||||||
|
if (CMAKE_GENERATOR_PLATFORM AND NOT CMAKE_GENERATOR_PLATFORM STREQUAL "Win32")
|
||||||
|
string(TOLOWER "_${CMAKE_GENERATOR_PLATFORM}" _wx_arch_suffix)
|
||||||
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
|
set(_wx_arch_suffix "_x64")
|
||||||
|
endif ()
|
||||||
|
set(_wxinspector_wx_hints
|
||||||
|
"-DwxWidgets_ROOT_DIR=${DESTDIR}"
|
||||||
|
"-DwxWidgets_LIB_DIR=${DESTDIR}/lib/${_wx_compiler_prefix}${_wx_arch_suffix}_lib")
|
||||||
|
endif ()
|
||||||
|
|
||||||
orcaslicer_add_cmake_project(
|
orcaslicer_add_cmake_project(
|
||||||
wxInspector
|
wxInspector
|
||||||
URL https://github.com/Noisyfox/wxInspector/archive/refs/tags/v1.0.0.zip
|
URL https://github.com/Noisyfox/wxInspector/archive/refs/tags/v1.0.0.zip
|
||||||
@@ -6,6 +29,7 @@ orcaslicer_add_cmake_project(
|
|||||||
CMAKE_ARGS
|
CMAKE_ARGS
|
||||||
-DCMAKE_CXX_FLAGS="-DwxDEBUG_LEVEL=0"
|
-DCMAKE_CXX_FLAGS="-DwxDEBUG_LEVEL=0"
|
||||||
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
|
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
|
||||||
|
${_wxinspector_wx_hints}
|
||||||
)
|
)
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
|
|||||||
-28
@@ -1,28 +0,0 @@
|
|||||||
---
|
|
||||||
build/cmake/wxWidgetsConfig.cmake.in | 10 +++++++++-
|
|
||||||
1 file changed, 10 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/build/cmake/wxWidgetsConfig.cmake.in b/build/cmake/wxWidgetsConfig.cmake.in
|
|
||||||
index 1a83f36..70ad8a4 100644
|
|
||||||
--- a/build/cmake/wxWidgetsConfig.cmake.in
|
|
||||||
+++ b/build/cmake/wxWidgetsConfig.cmake.in
|
|
||||||
@@ -58,7 +58,16 @@ if(WIN32_MSVC_NAMING)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
-include("${CMAKE_CURRENT_LIST_DIR}${wxPLATFORM_LIB_DIR}/@PROJECT_NAME@Targets.cmake")
|
|
||||||
+if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
|
|
||||||
+ if (CMAKE_GENERATOR_PLATFORM STREQUAL "ARM64" OR CMAKE_VS_PLATFORM_NAME STREQUAL "ARM64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "^(ARM64|arm64|aarch64)$")
|
|
||||||
+ set(_wx_clang_msvc_lib_dir "vc_arm64_lib")
|
|
||||||
+ else()
|
|
||||||
+ set(_wx_clang_msvc_lib_dir "vc_x64_lib")
|
|
||||||
+ endif()
|
|
||||||
+ include("${CMAKE_CURRENT_LIST_DIR}${wxPLATFORM_LIB_DIR}/${_wx_clang_msvc_lib_dir}/@PROJECT_NAME@Targets.cmake")
|
|
||||||
+else()
|
|
||||||
+ include("${CMAKE_CURRENT_LIST_DIR}${wxPLATFORM_LIB_DIR}/@PROJECT_NAME@Targets.cmake")
|
|
||||||
+endif()
|
|
||||||
|
|
||||||
macro(wx_inherit_property source dest name)
|
|
||||||
# property name without _<CONFIG>
|
|
||||||
--
|
|
||||||
2.43.0
|
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
diff --git a/src/osx/cocoa/colour.mm b/src/osx/cocoa/colour.mm
|
||||||
|
index 31515d146f..86b33e94a2 100644
|
||||||
|
--- a/src/osx/cocoa/colour.mm
|
||||||
|
+++ b/src/osx/cocoa/colour.mm
|
||||||
|
@@ -125,3 +125,3 @@
|
||||||
|
wxOSXEffectiveAppearanceSetter helper;
|
||||||
|
- if ( NSColor* colRGBA = [m_nsColour colorUsingColorSpaceName:NSCalibratedRGBColorSpace] )
|
||||||
|
+ if ( NSColor* colRGBA = [m_nsColour colorUsingColorSpace:[NSColorSpace sRGBColorSpace]] )
|
||||||
|
return [colRGBA redComponent];
|
||||||
|
@@ -134,3 +134,3 @@
|
||||||
|
wxOSXEffectiveAppearanceSetter helper;
|
||||||
|
- if ( NSColor* colRGBA = [m_nsColour colorUsingColorSpaceName:NSCalibratedRGBColorSpace] )
|
||||||
|
+ if ( NSColor* colRGBA = [m_nsColour colorUsingColorSpace:[NSColorSpace sRGBColorSpace]] )
|
||||||
|
return [colRGBA greenComponent];
|
||||||
|
@@ -143,3 +143,3 @@
|
||||||
|
wxOSXEffectiveAppearanceSetter helper;
|
||||||
|
- if ( NSColor* colRGBA = [m_nsColour colorUsingColorSpaceName:NSCalibratedRGBColorSpace] )
|
||||||
|
+ if ( NSColor* colRGBA = [m_nsColour colorUsingColorSpace:[NSColorSpace sRGBColorSpace]] )
|
||||||
|
return [colRGBA blueComponent];
|
||||||
|
@@ -152,3 +152,3 @@
|
||||||
|
wxOSXEffectiveAppearanceSetter helper;
|
||||||
|
- if ( NSColor* colRGBA = [m_nsColour colorUsingColorSpaceName:NSCalibratedRGBColorSpace] )
|
||||||
|
+ if ( NSColor* colRGBA = [m_nsColour colorUsingColorSpace:[NSColorSpace sRGBColorSpace]] )
|
||||||
|
return [colRGBA alphaComponent];
|
||||||
|
@@ -160,3 +160,3 @@
|
||||||
|
{
|
||||||
|
- return [m_nsColour colorUsingColorSpaceName:NSCalibratedRGBColorSpace] != nil;
|
||||||
|
+ return [m_nsColour colorUsingColorSpace:[NSColorSpace sRGBColorSpace]] != nil;
|
||||||
|
}
|
||||||
Vendored
+10
-1
@@ -21,14 +21,23 @@ else ()
|
|||||||
set(_wx_edge "-DwxUSE_WEBVIEW_EDGE=OFF")
|
set(_wx_edge "-DwxUSE_WEBVIEW_EDGE=OFF")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
set(_wx_patch_command "")
|
||||||
|
if (APPLE)
|
||||||
|
set(_wx_patch_command
|
||||||
|
${GIT_EXECUTABLE} checkout -f -- src/osx/cocoa/colour.mm
|
||||||
|
COMMAND ${GIT_EXECUTABLE} apply --verbose
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/0001-macos-use-srgb-colour-components.patch
|
||||||
|
)
|
||||||
|
endif ()
|
||||||
|
|
||||||
orcaslicer_add_cmake_project(
|
orcaslicer_add_cmake_project(
|
||||||
wxWidgets
|
wxWidgets
|
||||||
GIT_REPOSITORY "https://github.com/SoftFever/Orca-deps-wxWidgets"
|
GIT_REPOSITORY "https://github.com/SoftFever/Orca-deps-wxWidgets"
|
||||||
GIT_TAG v3.3.2
|
GIT_TAG v3.3.2
|
||||||
GIT_SHALLOW ON
|
GIT_SHALLOW ON
|
||||||
GIT_SUBMODULES 3rdparty/catch 3rdparty/pcre 3rdparty/libwebp
|
GIT_SUBMODULES 3rdparty/catch 3rdparty/pcre 3rdparty/libwebp
|
||||||
|
PATCH_COMMAND ${_wx_patch_command}
|
||||||
DEPENDS ${PNG_PKG} ${ZLIB_PKG} ${EXPAT_PKG} ${JPEG_PKG}
|
DEPENDS ${PNG_PKG} ${ZLIB_PKG} ${EXPAT_PKG} ${JPEG_PKG}
|
||||||
PATCH_COMMAND git apply --verbose --ignore-space-change --whitespace=fix ${CMAKE_CURRENT_LIST_DIR}/0001-Clang-CL-fix.patch
|
|
||||||
CMAKE_ARGS
|
CMAKE_ARGS
|
||||||
-DwxBUILD_PRECOMP=ON
|
-DwxBUILD_PRECOMP=ON
|
||||||
${_wx_toolkit}
|
${_wx_toolkit}
|
||||||
|
|||||||
@@ -162,7 +162,7 @@ static bool stl_read(stl_file *stl, FILE *fp, int first_facet, bool first, Impor
|
|||||||
rewind(fp);
|
rewind(fp);
|
||||||
try{
|
try{
|
||||||
char solid_name[256];
|
char solid_name[256];
|
||||||
int res_solid = fscanf(fp, " solid %[^\n]", solid_name);
|
int res_solid = fscanf(fp, " solid %255[^\n]", solid_name);
|
||||||
if (res_solid == 1) {
|
if (res_solid == 1) {
|
||||||
char* mw_position = strstr(solid_name, "MW");
|
char* mw_position = strstr(solid_name, "MW");
|
||||||
if (mw_position != NULL) {
|
if (mw_position != NULL) {
|
||||||
@@ -170,7 +170,7 @@ static bool stl_read(stl_file *stl, FILE *fp, int first_facet, bool first, Impor
|
|||||||
char version_str[16];
|
char version_str[16];
|
||||||
char model_id_str[128];
|
char model_id_str[128];
|
||||||
char country_code_str[16];
|
char country_code_str[16];
|
||||||
int num_values = sscanf(mw_position + 3, "%s %s %s", version_str, model_id_str, country_code_str);
|
int num_values = sscanf(mw_position + 3, "%15s %127s %15s", version_str, model_id_str, country_code_str);
|
||||||
if (num_values == 3) {
|
if (num_values == 3) {
|
||||||
if (strcmp(version_str, "1.0") == 0) {
|
if (strcmp(version_str, "1.0") == 0) {
|
||||||
model_id = model_id_str;
|
model_id = model_id_str;
|
||||||
|
|||||||
@@ -0,0 +1,507 @@
|
|||||||
|
# Filament IDs (`filament_id`)
|
||||||
|
|
||||||
|
`filament_id` identifies one **filament product**: one named spool product = one id, shared by
|
||||||
|
all of that product's per-printer / per-nozzle variants, in every profile bundle that ships it.
|
||||||
|
Devices use it to match a physical spool or tray to a filament preset. It is never per-color,
|
||||||
|
per-printer, per-nozzle, or per-preset (per-preset identity is `setting_id`), and it is never
|
||||||
|
per-bundle either — PolyLite PLA carries the same id whether the preset lives in the
|
||||||
|
OrcaFilamentLibrary (OFL), Qidi, or Snapmaker bundle. The granularity is the name on the spool,
|
||||||
|
not the brand behind it: `AAA PLA Lite` and `AAA PLA Pro` are two filaments with two ids, not
|
||||||
|
variants of one.
|
||||||
|
|
||||||
|
**How it is generated:** an id is computed, never invented. `scripts/orca_profile_tool.py`
|
||||||
|
mints it as a deterministic hash of the product's identity — the triple
|
||||||
|
`(filament_vendor, filament_type, filament name)`, where the filament name is the preset name
|
||||||
|
with its `@...` variant suffix stripped — producing an 8-character `OF*` code that is the
|
||||||
|
same for that product in every bundle, in every PR, on every machine. For example, Polymaker's
|
||||||
|
PolyLite PLA presets (`PolyLite PLA @base`, `PolyLite PLA@Q2-Series`, …) resolve
|
||||||
|
`filament_vendor` `Polymaker`, `filament_type` `PLA`, and filament name `PolyLite PLA`; hashing
|
||||||
|
`filament_product/Polymaker/PLA/PolyLite PLA` yields `OF5CgdDq`, and that is the id the
|
||||||
|
OrcaFilamentLibrary, OrcaArena, Qidi, and Snapmaker bundles all arrive at independently
|
||||||
|
(derivation details in the Minting section).
|
||||||
|
|
||||||
|
**How it is used:** at runtime the id is the join key between hardware and profiles.
|
||||||
|
When a printer reports what a tray holds (Bambu AMS, Qidi box, Creality CFS,
|
||||||
|
Klipper, Snapmaker), OrcaSlicer matches the reported id against the filament presets
|
||||||
|
compatible with that printer to select the right profile; other features — tray display
|
||||||
|
names, support-material detection, vitrification warnings, multi-nozzle filament grouping —
|
||||||
|
look up material properties by id alone. An id that changes is not forwarded anywhere: a
|
||||||
|
tray or record still holding the old value falls back to matching by material type until the
|
||||||
|
user re-selects the filament, so identity changes are made deliberately and rarely.
|
||||||
|
|
||||||
|
This page is the rule for authoring `filament_id` in system profiles
|
||||||
|
(`resources/profiles/**`). CI enforces everything below; the short version is:
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> **Never write a `filament_id` value by hand.** A new filament gets its id from
|
||||||
|
> `python scripts/orca_profile_tool.py generate-id`; one already in the tree has one — inherit it.
|
||||||
|
|
||||||
|
## The design, in two pieces
|
||||||
|
|
||||||
|
Because several consumers match **globally by id alone, first hit wins** (see the next
|
||||||
|
section), any two materials sharing one id feed wrong data somewhere — a wrong tray name, a
|
||||||
|
wrong support-material flag, a wrong nozzle grouping — and inside one printer a duplicated id
|
||||||
|
makes AMS spool matching a coin toss. Hand-written ids produce such collisions constantly, so
|
||||||
|
the system is built to make them impossible:
|
||||||
|
|
||||||
|
1. **Deterministic minting.** An id is a pure hash of the product's identity — no registry to
|
||||||
|
maintain, no next-free-number ceremony, no way for two concurrent PRs to race for the same
|
||||||
|
number, and no way to get it wrong by hand, because you never write it by hand.
|
||||||
|
2. **A sanctioned snapshot.** The complete id landscape derived from the tree must equal
|
||||||
|
`scripts/filament_id_snapshot.json` exactly, so every change to ids, claims (which bundles
|
||||||
|
ship which id, and for which filament), or product identity surfaces as a reviewable diff to
|
||||||
|
one file — the maintainer gate.
|
||||||
|
|
||||||
|
## Who consumes the id
|
||||||
|
|
||||||
|
The canonical consumer is tray-to-preset matching: a device reports a tray material id
|
||||||
|
(`tray_info_idx`), and the shared matching pipeline (`PresetBundle::sync_ams_list` and
|
||||||
|
friends) resolves it to a preset. The matcher is printer-scoped and first-match-wins:
|
||||||
|
scanning only compatible root presets — system roots plus user-made custom filaments, which
|
||||||
|
are user roots carrying their own `P*` ids; a preset derived from another resolves through
|
||||||
|
its root and never matches directly — it picks the first one whose `filament_id` equals the
|
||||||
|
tray's. On a miss it falls back by filament type: a system `Generic <type>` preset
|
||||||
|
(matched by name, then by type similarity), else the slot's previous selection, else any compatible system generic or,
|
||||||
|
failing that, any compatible system preset, else the slot is skipped — every fallback
|
||||||
|
selection surfaces a user-visible notice.
|
||||||
|
|
||||||
|
Today only the Bambu AMS integration follows this pattern end to end — the device itself
|
||||||
|
reports the id, `BBLPrinterAgent` translates it out of Bambu's catalog into ours, and the
|
||||||
|
pipeline does all the matching. The other device integrations still synthesize a preset id
|
||||||
|
client-side in their agents (by type, brand, or color lookups against the loaded presets)
|
||||||
|
before the pipeline runs; they are intended to converge on the same pattern, with the
|
||||||
|
device-reported tray material id flowing through the shared matcher.
|
||||||
|
|
||||||
|
| Ecosystem | Where the tray id comes from today |
|
||||||
|
| --- | --- |
|
||||||
|
| Bambu AMS | the device itself (RFID / user tray setting), in Bambu's own `GF*` catalog; `BBLPrinterAgent` rewrites it into our id before the matcher sees it (see [The Bambu catalog map](#the-bambu-catalog-map)) |
|
||||||
|
| Qidi box | composed at runtime as `QD_<series>_<vendor>_<typeidx>` — vendor and type indices from the device's per-slot saved variables, the series digit inferred client-side from the printer model/name. No preset carries a `QD_*` value, so the slot currently resolves by filament type; mapping the composed id onto the filament's minted id belongs in the agent |
|
||||||
|
| Creality CFS | runtime brand/type scoring returns the winning preset's id |
|
||||||
|
| Klipper (AFC / Happy Hare) | runtime lookup by filament type |
|
||||||
|
| Snapmaker | runtime color/vendor/type match |
|
||||||
|
|
||||||
|
Tray-to-preset matching is printer-scoped, but **several consumers match globally by id alone,
|
||||||
|
first hit wins**: tray display names, `filament_is_support`, vitrification warnings, and
|
||||||
|
multi-nozzle filament grouping in the slicing pipeline (`FilamentGroup::try_merge_filaments`
|
||||||
|
merges plate slots sharing one `(filament_id, color)` pair, with matching
|
||||||
|
extruder-printability, onto one nozzle group; the engine is implemented but no grouping path
|
||||||
|
calls it yet).
|
||||||
|
Two *different* materials sharing one id
|
||||||
|
feed wrong data to those consumers even when the presets live in different vendors — so
|
||||||
|
cross-material id sharing is never safe. Within one printer, duplicate ids break AMS matching:
|
||||||
|
the matcher picks whichever preset loads first (it now logs an "Ambiguous AMS filament match"
|
||||||
|
warning, but the pick is still arbitrary) and the tray-edit dialog, which lists one entry per
|
||||||
|
id, hides the second preset entirely. The profile validator's `-f` check
|
||||||
|
(`check_filament_subtypes` → `PresetBundle::check_duplicate_filament_subtypes`) rejects this
|
||||||
|
per printer, and CI runs it tree-wide.
|
||||||
|
|
||||||
|
Two more consumer-side facts worth knowing:
|
||||||
|
|
||||||
|
- The machine-facing dialogs (AMS tray edit, AMS dry control, calibration history, extrusion
|
||||||
|
calibration) offer the filaments a connected printer can use by the same compatibility rule
|
||||||
|
the plater uses (an empty `compatible_printers` means *every* printer). Alias shadowing
|
||||||
|
still applies: a vendor's same-name profile supersedes the library generic. That is what
|
||||||
|
puts Orca Filament Library materials in those lists — deduplicated to one entry per
|
||||||
|
`filament_id` in the AMS and calibration-history dialogs, while extrusion calibration
|
||||||
|
deliberately lists every matching preset by full name.
|
||||||
|
- The id is load-bearing at startup: an instantiated system filament (one marked
|
||||||
|
`"instantiation": "true"` — see the structure rules) that resolves **no**
|
||||||
|
`filament_id` anywhere in its `inherits` chain is a hard load error in the C++ loader
|
||||||
|
(`Can not find filament_id for <name>`) that discards the entire vendor bundle (for the
|
||||||
|
OrcaFilamentLibrary itself the failure is messier: library presets loaded before the
|
||||||
|
failing one survive, and every vendor bundle whose filaments inherit from the library is
|
||||||
|
then discarded for want of a base). CI's structure check catches this before it ships.
|
||||||
|
|
||||||
|
## Do I need a new id? The one-question test
|
||||||
|
|
||||||
|
> **Would a user consider this a different spool product than anything already in the tree?**
|
||||||
|
|
||||||
|
Different polymer, different sub-brand (Basic / Matte / Silk / HF), fiber-filled sibling, or a
|
||||||
|
second selectable diameter → **new filament, new id**. The same spool tuned for another printer
|
||||||
|
or nozzle → **join the existing filament** (keep its base name and inherit it; no id
|
||||||
|
key needed). Tuning a generic material → **join the OrcaFilamentLibrary filament** (inherit
|
||||||
|
`Generic X @System` and keep the `Generic X` base name; no id key needed).
|
||||||
|
|
||||||
|
| Situation | id |
|
||||||
|
| --- | --- |
|
||||||
|
| Per-printer / per-nozzle variant of an existing material | same id (inherit it) |
|
||||||
|
| Sub-brand or product line (PLA vs PLA Matte vs PLA Silk vs PLA HF) | new id each |
|
||||||
|
| Color | never a new id |
|
||||||
|
| Second diameter of the same product (1.75 + 2.85) | sibling filament, new id |
|
||||||
|
| "High-speed" tuned for a *different printer model* | same id (it is a printer variant) |
|
||||||
|
| "High-speed" selectable *alongside* the normal preset on one printer | new name, so a new id (it is a product line) |
|
||||||
|
|
||||||
|
## Structure rules
|
||||||
|
|
||||||
|
1. **Every preset carries the id of its own product, wherever it gets it from.** The id is a
|
||||||
|
function of the preset's own triple (rule 5), and `inherits` carries settings, never
|
||||||
|
identity. So a preset may declare the key itself or inherit it from any ancestor — a
|
||||||
|
`<Filament> @base` root, a real (instantiated) preset of the same filament, an
|
||||||
|
OrcaFilamentLibrary preset — and CI checks one thing: the id it ends up with equals the
|
||||||
|
mint of *its* triple. The usual shape is one `@base` root (`"instantiation": "false"`)
|
||||||
|
declaring the key and the per-printer variants inheriting it; a filament may have several
|
||||||
|
roots — Qidi's PolyLite PLA has four per-series roots (`PolyLite PLA@Q2-Series`,
|
||||||
|
`@Q2C-Series`, `@X-Max 4-Series`, `@X-Plus 5-Series`) — which then all declare the identical
|
||||||
|
id. A branded filament that borrows a generic's settings (`Flashforge ABS Basic @FF C5`
|
||||||
|
inherits `Generic ABS @System`) declares its own id, because its triple is its own.
|
||||||
|
2. **The filament name is the base name**: the preset name with everything from the first
|
||||||
|
(optionally space-preceded) `@` stripped. `MyBrand PLA @Orca 3D Fuse1` and `MyBrand PLA@HS`
|
||||||
|
are both the filament `MyBrand PLA`.
|
||||||
|
3. **Within one filament, variants' `compatible_printers` are pairwise disjoint** — per printer,
|
||||||
|
at most one compatible instantiated preset per id, or AMS matching turns ambiguous. The
|
||||||
|
C++ validator's `-f` check enforces this, tree-wide in CI. Since one product carries one id
|
||||||
|
and cannot be split onto two, this rule is the *only* remedy for such an ambiguity: narrow
|
||||||
|
the `compatible_printers`, or retire the preset that duplicates another.
|
||||||
|
4. **Generics belong to OrcaFilamentLibrary.** A vendor tuning a generic material inherits
|
||||||
|
`Generic X @System`, keeps the `Generic X` base name (that alias is what hides the library
|
||||||
|
preset on your printers, and it is what makes its triple — and so its id — the library's)
|
||||||
|
and sets a non-empty `compatible_printers` — e.g. `Generic PLA @Sovol SV08 MAX` inherits
|
||||||
|
`Generic PLA @System` and lists three Sovol nozzles. Renaming such a preset makes it a
|
||||||
|
different product by rule 5, so it then needs its own id.
|
||||||
|
5. **Ids follow the product identity.** The id is a pure function of the product triple
|
||||||
|
`(filament_vendor, filament_type, filament name)`, so correcting any of them re-mints the id
|
||||||
|
**by design**, applied by `generate-id` (preview with `--dry-run`, confine with `--vendor`)
|
||||||
|
and gated by the `update-snapshot` diff; the exact sequence is in the FAQ. Nothing forwards
|
||||||
|
the old value, so anything outside the tree that stored it — a device tray, a calibration
|
||||||
|
record, a saved project — falls back to matching by filament type until the user re-selects
|
||||||
|
the filament. Re-mint deliberately, and only to fix a genuinely wrong identity.
|
||||||
|
(`renamed_from` still gates preset-*name* compatibility, as before.)
|
||||||
|
|
||||||
|
## Minting — nobody invents ids
|
||||||
|
|
||||||
|
New ids are deterministic, computed exactly like the `setting_id` precedent
|
||||||
|
(the `setting_id` half of `scripts/orca_profile_tool.py generate-id`):
|
||||||
|
|
||||||
|
```text
|
||||||
|
FILAMENT_ID_NAMESPACE = uuid5(setting-id NAMESPACE, "filament_id")
|
||||||
|
= c4d3ff49-4c32-5534-a3e3-00894157ab97
|
||||||
|
filament_id = "OF" + base62_6( uuid5(FILAMENT_ID_NAMESPACE,
|
||||||
|
"filament_product/<filament_vendor>/<filament_type>/<filament_name>") )
|
||||||
|
```
|
||||||
|
|
||||||
|
`base62_6` is the low 6 base62 digits (alphabet `0-9A-Za-z`) of the UUID taken as a big-endian
|
||||||
|
integer, most-significant digit first; with the `OF` prefix the full id is 8 chars, within the
|
||||||
|
AMS length limit. The triple comes from the root preset's *flattened* config:
|
||||||
|
`<filament_vendor>` is the filament
|
||||||
|
**manufacturer** (`"Polymaker"`, or `"Generic"` for generics — never the printer brand),
|
||||||
|
`<filament_type>` the material type, `<filament_name>` the root's base name; the two config
|
||||||
|
values are inheritable list options and the first element counts.
|
||||||
|
|
||||||
|
Content-addressing on that triple is what makes the whole system converge. The key contains no
|
||||||
|
bundle name, so the same product mints the same id in every bundle — moving a filament into
|
||||||
|
OrcaFilamentLibrary never changes its id, and two vendors independently shipping the same
|
||||||
|
product arrive at the same id without coordinating. `Polymaker/PLA/PolyLite PLA` mints
|
||||||
|
`OF5CgdDq`, and that one id is declared by the OrcaFilamentLibrary, OrcaArena, Qidi, and
|
||||||
|
Snapmaker bundles alike; the OFL generic `Generic/PLA/Generic PLA` mints `OFDSrzZ8`, claimed
|
||||||
|
by 35 bundles — most by independent declarations converging on the same mint, the rest
|
||||||
|
purely through inheritance from the OFL preset.
|
||||||
|
|
||||||
|
Nothing but the triple feeds the mint — not the rest of the tree, not the snapshot, not what
|
||||||
|
another preset of the product happens to carry. Determined triple, determined id: one product
|
||||||
|
carries one id and there is no second acceptable value for it, so any other value on a preset
|
||||||
|
is a mismatch `check` reports and `generate-id` pulls back. Two *different* products whose
|
||||||
|
triples mint the same base62 value would be a collision (a roughly 36-bit id space against a
|
||||||
|
few thousand products); nothing salts past it: `check` reports it naming both products,
|
||||||
|
`generate-id` refuses to write it, and the remedy is a rename so their triples differ. Where
|
||||||
|
two presets of one product would be AMS-ambiguous on a printer, the fix is likewise in the
|
||||||
|
profiles — make their `compatible_printers` disjoint (structure rule 3), retire the redundant
|
||||||
|
preset, or, if they really are different products, give them different names so their triples
|
||||||
|
differ. Never a second id for one triple.
|
||||||
|
|
||||||
|
Workflow for a new filament:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Author the filament with NO filament_id key anywhere.
|
||||||
|
python scripts/orca_profile_tool.py generate-id --dry-run # 2. preview the ids — writes nothing
|
||||||
|
python scripts/orca_profile_tool.py generate-id # 3. apply them to the profile file(s)
|
||||||
|
python scripts/orca_profile_tool.py update-snapshot # 4. record the new claims in the snapshot
|
||||||
|
python scripts/orca_profile_tool.py check # 5. validate — everything CI checks
|
||||||
|
# 6. Commit the profile edits together with scripts/filament_id_snapshot.json, for review.
|
||||||
|
```
|
||||||
|
|
||||||
|
`generate-id` makes every filament's id equal the mint of its own
|
||||||
|
`(filament_vendor, filament_type, filament name)` triple: it inserts one where an instantiated
|
||||||
|
filament resolves none, and re-derives one that does not match. A preset that *inherits* a
|
||||||
|
mismatching id is the one case left to the author — check 3b names it, and the fix is to inherit
|
||||||
|
a preset of the same filament or to give the preset its own key. A declaration is left alone
|
||||||
|
exactly when it already equals the one id its triple mints, and a collision (check 3d) is
|
||||||
|
reported and left unwritten. The same run assigns
|
||||||
|
`generate_preset_setting_id(vendor, type, name)` to every instantiated filament, process
|
||||||
|
and machine preset of every vendor except BBL, which keeps its authoritative `G*` ids, strips
|
||||||
|
`setting_id` from base profiles, and fixes the misspelled `settings_id` key — dropped, or, for
|
||||||
|
BBL, whose ids have no formula to fall back on, restored under the correct name. It is idempotent and
|
||||||
|
byte-preserving (indentation, BOM, and line endings intact, every edited file re-parsed to fail
|
||||||
|
loudly), and a no-op on a tree that already passes `check`.
|
||||||
|
|
||||||
|
- `--filament-id` limits the run to `filament_id`.
|
||||||
|
- `--setting-id` limits the run to `setting_id`. The two exclude each other; pass neither to
|
||||||
|
write both.
|
||||||
|
- `--vendor VENDOR` confines the run to that bundle; repeatable. The id is a function of the
|
||||||
|
triple alone, so a narrowed run writes exactly what a full one would; `check` reports
|
||||||
|
whatever it left outside.
|
||||||
|
- `--dry-run` reports what the run would do and writes nothing, so
|
||||||
|
`generate-id --dry-run --vendor <Vendor>` previews just that bundle.
|
||||||
|
- `--profiles DIR` points the tooling at a different profile tree (default
|
||||||
|
`resources/profiles`). `check` and `update-snapshot` read and write the sanctioned state of
|
||||||
|
the tree they are given, so pointing them elsewhere needs `--snapshot PATH` for that tree too —
|
||||||
|
`scripts/filament_id_snapshot.json` describes `resources/profiles` and no other tree.
|
||||||
|
|
||||||
|
The tool's other commands maintain the tree around the ids: `fix` normalises profile files,
|
||||||
|
`trim` drops files no `<vendor>.json` list references, and `update-index` rebuilds those lists.
|
||||||
|
They do not touch ids; `--help` documents them.
|
||||||
|
|
||||||
|
**Identity fixes need no separate command.** `generate-id` re-derives an id that no longer matches
|
||||||
|
its triple exactly the way it fills in a missing one, so a rename or a `filament_vendor` /
|
||||||
|
`filament_type` correction is just: fix the config, run `generate-id` (confine it with
|
||||||
|
`--vendor`, preview it with `--dry-run`), then `update-snapshot` and review the diff.
|
||||||
|
|
||||||
|
If you skip the tooling, CI fails and prints the remedy: the expected id for your filament and
|
||||||
|
the instruction to run `python scripts/orca_profile_tool.py generate-id`; once the id is minted,
|
||||||
|
the snapshot checks likewise point at `update-snapshot` and tell you to commit the resulting
|
||||||
|
diff.
|
||||||
|
|
||||||
|
## Ids other systems compose
|
||||||
|
|
||||||
|
Every filament profile carries a minted id, with no exceptions and no spellings held back for
|
||||||
|
anyone. There is therefore no reserved namespace to respect and no bundle that owns one: an id
|
||||||
|
some other system composes for its own purposes is simply not the mint of a triple, so it
|
||||||
|
cannot be a system profile's `filament_id`, and the format check rejects it for that reason
|
||||||
|
alone — same error, same remedy, whoever wrote it.
|
||||||
|
|
||||||
|
Three such spaces exist around us, and are worth recognising so nobody mistakes one for an id
|
||||||
|
to copy into a profile:
|
||||||
|
|
||||||
|
- **Bambu's `GF*` catalog.** Bambu's device / RFID / cloud catalog is external and opaque. Every
|
||||||
|
BBL filament mints an `OF` id from its triple like every other vendor's, and the
|
||||||
|
correspondence to Bambu's catalog ids lives in one generated file the app applies at the
|
||||||
|
printer boundary — the next section. Note that `GF` is a *prefix*, not a namespace the tree
|
||||||
|
avoids: BBL's authoritative `setting_id` values include `GF`-prefixed ones, and
|
||||||
|
`resources/profiles/blacklist.json` and `BBL/filament/filaments_color_codes.json` both
|
||||||
|
reference Bambu catalog ids by design. The rule is about `filament_id` and nothing else.
|
||||||
|
- **Qidi's `QD_*` protocol ids.** The Qidi box composes `QD_<series>_<vendor>_<typeidx>` at
|
||||||
|
runtime (slot vendor and type indices reported by the device, the series digit inferred
|
||||||
|
client-side from the printer model/name). Qidi presets carry ordinary minted `OF*` ids
|
||||||
|
(generics share the OFL ids), so a composed id matches no preset and the slot falls back to
|
||||||
|
filament type; translating it to the filament's id belongs in `QidiPrinterAgent`. Treating
|
||||||
|
per-series protocol ids as preset ids would put one product under five ids
|
||||||
|
(`QIDI PLA Rapido` would be `QD_0_1_1` through `QD_4_1_1`) — exactly the fragmentation the
|
||||||
|
mint rule removes.
|
||||||
|
- **`P` + 7 hex chars, and `"null"`.** What `CreatePresetsDialog.cpp` gives a filament a *user*
|
||||||
|
creates. Those are user presets, not system profiles, and the two never meet in the tree.
|
||||||
|
|
||||||
|
## The Bambu catalog map
|
||||||
|
|
||||||
|
Bambu's printers, its AMS and its cloud know only Bambu's own catalog ids. Our profiles carry
|
||||||
|
minted `OF` ids like every other vendor's, so one generated file records the correspondence and
|
||||||
|
the app applies it **only where an id crosses to or from a Bambu printer**.
|
||||||
|
|
||||||
|
**The file** is `resources/printers/bambu_filament_ids.json` — a header plus one row per
|
||||||
|
catalogued product, keyed by our id:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"source": "https://github.com/bambulab/BambuStudio",
|
||||||
|
"bambustudio_commit": "66e405477",
|
||||||
|
"generated": "2026-09-04",
|
||||||
|
"filaments": {
|
||||||
|
"OFhuaUQB": { "bambu_id": "GFB00", "vendor": "Bambu Lab", "type": "ABS", "name": "Bambu ABS" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
It ships in `resources/printers/`, next to `filaments_blacklist.json` — deliberately not in
|
||||||
|
`resources/profiles/`, where the loader reads every top-level `.json` as a vendor index. It
|
||||||
|
holds 100 rows today, one per product BambuStudio ships, and the correspondence is
|
||||||
|
one-to-one in both directions.
|
||||||
|
|
||||||
|
**It is generated, never hand-edited.** `python scripts/update_bambu_filament_ids.py` rebuilds
|
||||||
|
it from **BambuStudio's own shipped BBL bundle** — a sparse shallow clone of upstream `master`,
|
||||||
|
or `--bambustudio-dir <a BambuStudio resources/profiles checkout>`. Our BBL bundle is a fork of
|
||||||
|
Bambu's, tuned and extended independently, so it is not the source of truth for Bambu's ids.
|
||||||
|
A row's key is the id the product's `(filament_vendor, filament_type, filament name)` triple
|
||||||
|
mints — the same id any bundle of ours carries for it, since the id is a function of the triple
|
||||||
|
alone; the row of a product we do not ship sits inert until some bundle claims that triple —
|
||||||
|
`OFdyfQvU` / `GFG03`, "Bambu PETG Matte", is such a row today.
|
||||||
|
|
||||||
|
**Regenerate it in the same commit as every BBL profile sync**, and read the drift report it
|
||||||
|
prints. Two lines, both informational, neither blocking the write:
|
||||||
|
|
||||||
|
```text
|
||||||
|
upstream ships 'Bambu PETG Matte' (Bambu Lab/PETG), we ship nothing with that identity
|
||||||
|
Orca BBL filaments with no row: 135 Orca-only product(s)
|
||||||
|
```
|
||||||
|
|
||||||
|
The first names each upstream product our BBL bundle has no same-identity filament for —
|
||||||
|
sometimes a genuinely missing product, sometimes a name drift a follow-up rename would
|
||||||
|
converge. The second counts our own BBL filaments that matched no row: 135 of 234 today, of
|
||||||
|
which 109 send an `OF` id on the wire and 26 already rode `OF` ids inherited from the
|
||||||
|
OrcaFilamentLibrary. **135 is the number to expect at every regeneration** — 109 was the
|
||||||
|
one-off size of the transition and stopped being computable from the tree once the BBL bundle
|
||||||
|
was re-minted, so do not "fix" the report to print it.
|
||||||
|
|
||||||
|
**Check 5** lives in `check_filament_ids`, so profile CI runs it alongside the other four. It
|
||||||
|
holds the file to its contract: it parses, carries `source` / `bambustudio_commit` /
|
||||||
|
`generated`, keys only `OF`-format ids, maps each Bambu id at most once, and — for every row
|
||||||
|
whose key the tree actually claims — agrees with the tree on that id's `(vendor, type, name)`
|
||||||
|
triple. A row for a product we do not ship is skipped, not an error. The remedy it prints is
|
||||||
|
always the same: regenerate the map and commit the diff for review.
|
||||||
|
|
||||||
|
### The runtime rule: swap on hit
|
||||||
|
|
||||||
|
Outbound, our id with a row becomes Bambu's; inbound, Bambu's id with a row becomes ours.
|
||||||
|
Everything else is forwarded untouched — an `OF` id with no row, a Bambu id for a product we do
|
||||||
|
not ship, a `P`-hex user id, `"null"`, an empty string. Translation is confined to the
|
||||||
|
boundary: nothing between the boundaries ever holds a Bambu id.
|
||||||
|
|
||||||
|
Translating one value is a capability of the printer agent: `IPrinterAgent` declares
|
||||||
|
`to_orca_filament_id` and `from_orca_filament_id` returning their argument, and `BBLPrinterAgent`
|
||||||
|
overrides them with Bambu's map, so an agent whose printers already speak our ids inherits the
|
||||||
|
identity default and translates nothing. `NetworkAgent` forwards both to the live agent, so the
|
||||||
|
comparison sites below reach them through `wxGetApp().getAgent()` and leave an id untranslated
|
||||||
|
while no agent is live. Whole documents are Bambu's business alone:
|
||||||
|
`BBLPrinterAgent::to_orca_payload` and `from_orca_payload` rewrite every string under
|
||||||
|
`tray_info_idx`, `filament_id` or `filamentId` at any depth; text that does not parse, or carries
|
||||||
|
none of those keys, comes back unchanged. The map is loaded once, lazily; a missing or malformed
|
||||||
|
file degrades to identity with a log line rather than failing.
|
||||||
|
|
||||||
|
| Boundary | Where it translates |
|
||||||
|
| --- | --- |
|
||||||
|
| Everything the agent sends | `BBLPrinterAgent::send_message` and `send_message_to_printer`, plus `PrintParams::ams_mapping_info` in `dispatch_start` — the funnel all five `start_*` calls share |
|
||||||
|
| Everything the agent receives | `set_on_message_fn` and `set_on_local_message_fn` wrap their callback, so `MachineObject::parse_json` and everything downstream see our ids only |
|
||||||
|
| 3mf export | `Plater::export_3mf` writes Bambu's ids into `slice_info.config`, gated on `preset_bundle.is_bbl_vendor()` — the printer reads that file and knows only its own catalog, and no other vendor's export is affected. The CLI has its own writer in `OrcaSlicer.cpp`; it does the same, gated on the `printer_model` prefix that already decides `Print::is_BBL_printer()` for that run |
|
||||||
|
| Project ingest | `Plater::priv::load_files` reverse-maps the project's `filament_ids` before the bundle ingests them, so a project saved by an older Orca or by BambuStudio still resolves the same presets |
|
||||||
|
| Prints from the printer's SD card | `SelectMachineDialog::update_print_required_data` reverse-maps each plate's slice-info ids as it adopts the plates, so the AMS mapping dialog pairs them with trays |
|
||||||
|
| Bambu-specific comparisons | `CalibUtils.cpp`, `DeviceManager.cpp`, `DeviceCore/DevFilaSystem.cpp`, `DeviceCore/DevFilaBlackList.cpp`, `SelectMachine.cpp`, `AMSDryControl.cpp`, `AMSMaterialsSetting.cpp`, `PresetComboBoxes.cpp`, `ColorDecomposeSupport.cpp` |
|
||||||
|
|
||||||
|
That last row is the rule to follow when a new Bambu-specific behaviour is added: **translate
|
||||||
|
the value you are about to compare, never the table you compare it against.** The shipped data
|
||||||
|
those sites read is Bambu's and stays verbatim — `white_fila_ids` in
|
||||||
|
`resources/printers/filaments_blacklist.json`, the calibration id lists in
|
||||||
|
`resources/printers/<model>.json`, `fila_id` in
|
||||||
|
`resources/profiles/BBL/filament/filaments_color_codes.json`.
|
||||||
|
|
||||||
|
`tests/slic3rutils/test_bambu_filament_ids.cpp` covers the lookups, the payload rewrite and the
|
||||||
|
Bambu-specific rules. `orcaslicer_discover_tests` registers a Catch2 tag as a CTest **label**,
|
||||||
|
not as part of the test name, so `-R` matches nothing here and the filter is `-L`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ctest --test-dir <build dir>/tests/slic3rutils -L BambuFilamentIds
|
||||||
|
```
|
||||||
|
|
||||||
|
### Three places the map deliberately does not reach
|
||||||
|
|
||||||
|
The map and its lookups live in the GUI library, which libslic3r cannot link against and which a
|
||||||
|
GUI-less build does not link at all. Three consequences are known and documented; none is worth
|
||||||
|
pulling the map down into libslic3r for.
|
||||||
|
|
||||||
|
- **The support display type in `PrintConfig.cpp`.** `DynamicPrintConfig::get_filament_type`
|
||||||
|
picks `PLA-S` / `Sup.PLA` and `PA-S` / `Sup.PA` for a support filament by testing
|
||||||
|
`filament_id` against `GFS00` and `GFS01`, and otherwise falls back on `filament_type` — a
|
||||||
|
fallback that returns those same two pairs for `"PLA"` and `"PA"`. Bambu Support W inherits
|
||||||
|
`fdm_filament_pla` and Bambu Support G inherits `fdm_filament_pa`, so with their `OF` ids the
|
||||||
|
fallback produces exactly what the id branches produced. (The only config that ever carries a
|
||||||
|
singular `filament_id` key is the AMS tray config built in `Plater.cpp`, and that one never
|
||||||
|
reaches this function.) These two lines are the only mention of a Bambu id anywhere in
|
||||||
|
libslic3r, and they need no change.
|
||||||
|
- **Config imports.** `PresetBundle::import_presets` (File ▸ Import ▸ Import Configs, for
|
||||||
|
`.json` / `.zip` / `.orca_filament` / `.orca_printer` / `.orca_bundle`) and
|
||||||
|
`PresetBundle::load_config_file` (the CLI's `--load-settings` of a G-code file with an
|
||||||
|
embedded config) both parse inside libslic3r, out of the GUI's reach, so a Bambu id carried
|
||||||
|
in such a file lands on the imported preset untranslated. The effect is bounded: that preset
|
||||||
|
does not auto-match an AMS tray while the stale id is live, and the id does not survive
|
||||||
|
being saved — `Preset::save` writes a `filament_id` key only for a preset whose `inherits` is
|
||||||
|
empty, and on the next load an inheriting preset takes its parent's id. A known gap, and not
|
||||||
|
a regression: nothing forwarded a stale id before either.
|
||||||
|
- **A build configured without the GUI.** `target_link_libraries(OrcaSlicer libslic3r_gui)` sits
|
||||||
|
inside `if (SLIC3R_GUI)` in `src/CMakeLists.txt`, so the lookups are not linkable when the GUI
|
||||||
|
is off. The CLI's 3mf writer in `src/OrcaSlicer.cpp` therefore guards its translation with
|
||||||
|
`#ifdef SLIC3R_GUI`, and a 3mf that such a build slices for a Bambu printer carries our `OF`
|
||||||
|
ids in `slice_info.config` rather than Bambu's. Every shipped build enables the GUI, so this
|
||||||
|
reaches only a purpose-built GUI-less binary.
|
||||||
|
|
||||||
|
One more thing worth recording before it is rediscovered:
|
||||||
|
`SyncAmsInfoDialog::update_print_required_data` is a structural twin of the SD-card function
|
||||||
|
above and carries no translation. It has no callers today and its plate list is only ever read
|
||||||
|
for `printer_model_id`, so it is not a live gap — but wiring it up without adding the reverse
|
||||||
|
map would silently reproduce the bug.
|
||||||
|
|
||||||
|
## How CI enforces this
|
||||||
|
|
||||||
|
Profile CI (`check_profiles.yml`) runs `check_filament_ids()` tree-wide via
|
||||||
|
`scripts/orca_profile_tool.py check`. Its ground truth is
|
||||||
|
**`scripts/filament_id_snapshot.json` — the sanctioned state**: the id state derived from the
|
||||||
|
tree must equal the snapshot exactly, in both directions. Any change to the id landscape
|
||||||
|
therefore surfaces as a diff to that file, and **that snapshot diff is what maintainers review
|
||||||
|
and gate in a PR**. Never edit the snapshot by hand — `update-snapshot` regenerates it
|
||||||
|
deterministically (running it twice changes nothing). The snapshot holds one map, `ids`: each
|
||||||
|
entry is the product the id is minted from (`filament_vendor`, `filament_type`, `name`) and the
|
||||||
|
`filaments` claiming it (`Vendor/Filament`), and it sanctions *state*, never exceptions: no check
|
||||||
|
consults it to excuse a preset from a rule, and there is no grandfather list of any kind.
|
||||||
|
|
||||||
|
The checks, in brief:
|
||||||
|
|
||||||
|
- **Format** — every id occurring in the tree is `OF` + 6 base62 chars. No exceptions: not a
|
||||||
|
snapshot entry, not BBL.
|
||||||
|
- **Snapshot equality** — tree claims == snapshot claims **and** each id's declared triple ==
|
||||||
|
its snapshot entry, both directions: any `filament_vendor`/`filament_type`/name change
|
||||||
|
surfaces as a snapshot diff.
|
||||||
|
- **Identity** — the id is a function of the triple alone. A declared `OF*` id must equal the
|
||||||
|
one id its declarer's own triple mints, with no second acceptable value; the id an
|
||||||
|
instantiated preset *inherits* must equal the mint of *its* own triple, however it inherits
|
||||||
|
it (a root, a real filament, a library preset — structure rule 1); and every instantiated
|
||||||
|
system filament must resolve an effective id at all (recall: an id-less one is a hard load
|
||||||
|
error in C++ that discards the whole vendor bundle); and no two products mint one id (a
|
||||||
|
base62 collision, resolved by renaming one of them). The errors print the expected id.
|
||||||
|
- **Triple integrity** — every declarer must resolve a non-empty `filament_vendor` and
|
||||||
|
`filament_type` (generics use `"Generic"`), and all declarers of one filament within a
|
||||||
|
bundle must agree on the triple.
|
||||||
|
- **Bambu catalog map** — `resources/printers/bambu_filament_ids.json` parses, carries its
|
||||||
|
`source` / `bambustudio_commit` / `generated` header, keys only `OF`-format ids, maps each
|
||||||
|
Bambu id at most once, and agrees with the tree on the triple of every row whose key the
|
||||||
|
tree claims. See [The Bambu catalog map](#the-bambu-catalog-map); the remedy is always to
|
||||||
|
regenerate, never to hand-edit.
|
||||||
|
|
||||||
|
A profile that declares an id no triple mints — a Bambu catalog id, a composed Qidi one, a
|
||||||
|
hand-typed value, whatever its vendor — fails the format check. For a Bambu-cataloged product
|
||||||
|
the catalog map is where the correspondence belongs. New sharing via a *declared* id is caught
|
||||||
|
by the identity check; sharing through inheritance carries no declaration to check and surfaces
|
||||||
|
only as a new claim in the snapshot diff — which is exactly why that diff is the gate.
|
||||||
|
|
||||||
|
The same `check` run holds every declared id to the AMS 8-character limit, tree-wide and for
|
||||||
|
every vendor alike, scoped to the presets a vendor's index actually references (a file the index
|
||||||
|
never loads cannot break AMS matching).
|
||||||
|
|
||||||
|
Complementing the Python checks, CI also runs the C++ profile validator with `-f`
|
||||||
|
(`check_filament_subtypes`): it loads the bundle exactly as the app does and flags any printer
|
||||||
|
for which two or more compatible filament presets share one `filament_id` — the runtime-shaped
|
||||||
|
ambiguity check behind structure rule 3.
|
||||||
|
|
||||||
|
## FAQ
|
||||||
|
|
||||||
|
- **A new color of an existing product?** Never a new id — colors are not filaments.
|
||||||
|
- **A second diameter (1.75 mm and 2.85 mm) of the same product?** A sibling filament with its
|
||||||
|
own id: two diameters are separately selectable spool products.
|
||||||
|
- **A high-speed tune of an existing material for another printer model?** Same filament:
|
||||||
|
keep the base name and inherit its root; no id key needed.
|
||||||
|
- **A tuned generic ("our profile for Generic PLA")?** Inherit `Generic PLA @System`, keep the
|
||||||
|
`Generic PLA` base name, set `compatible_printers`; no id key needed.
|
||||||
|
- **A branded filament that borrows a generic's settings?** Fine — inherit `Generic X @System`
|
||||||
|
(or any real filament) for the settings and declare the id of your own filament; run
|
||||||
|
`python scripts/orca_profile_tool.py generate-id` to mint it. Inheritance never changes the id.
|
||||||
|
- **I need to fix a filament's `filament_vendor` or `filament_type`.** Fix the config, run
|
||||||
|
`generate-id --vendor <Vendor>` (preview with `--dry-run`), then `update-snapshot`, and commit
|
||||||
|
the profile and snapshot diffs together. The id re-derives from the corrected identity, and
|
||||||
|
nothing forwards the old value, so a tray or record still holding it falls back to matching by
|
||||||
|
filament type.
|
||||||
|
- **I need to rename a filament.** Rename the presets (adding `renamed_from`, which keeps the
|
||||||
|
preset *name* resolving), then `generate-id --vendor <Vendor>` (preview with `--dry-run`), then
|
||||||
|
`update-snapshot`. The id follows the new filament name; as with any identity fix, the old id
|
||||||
|
is not forwarded.
|
||||||
|
- **Can I reuse a `QD_*` id for a Qidi profile?** No — it is not a mint, so it is not a
|
||||||
|
`filament_id`. Those values are composed by the box at runtime, and no preset carries one.
|
||||||
|
Author Qidi filaments like any other vendor's.
|
||||||
|
- **CI says my filament needs an id.** Run `python scripts/orca_profile_tool.py generate-id`, then
|
||||||
|
`update-snapshot`, and commit both diffs. Do not type an id by hand.
|
||||||
|
|
||||||
|
For general profile authoring, see the profile development guide on the
|
||||||
|
[OrcaSlicer wiki](https://www.orcaslicer.com/wiki).
|
||||||
@@ -0,0 +1,402 @@
|
|||||||
|
# System Preset Cache — High Level Design
|
||||||
|
|
||||||
|
## Why it exists
|
||||||
|
|
||||||
|
OrcaSlicer ships tens of thousands of system preset JSON files. Every launch used to
|
||||||
|
parse all of them: read each vendor profile, walk its machine, process and filament
|
||||||
|
sub-files, resolve inheritance, and build the preset collections from scratch. That
|
||||||
|
parse dominated startup, and it produced the same result every time, because system
|
||||||
|
presets only change when the app is updated or a profile update is installed.
|
||||||
|
|
||||||
|
The preset cache replaces that parse with a read. Each vendor's presets are serialized
|
||||||
|
once — at build time, in CI — into a single binary file the app reads in one pass. The
|
||||||
|
read replaces the file walk and the JSON parsing, which is where the time went;
|
||||||
|
resolving inheritance and registering the presets still runs at load, through the same
|
||||||
|
code the JSON path uses, so the result is the parse's result without the parse.
|
||||||
|
|
||||||
|
The cache is **only ever an optimization**. Every rule below exists to guarantee that a
|
||||||
|
cache is either provably equivalent to parsing the JSONs, or rejected. There is no
|
||||||
|
"mostly right" cache.
|
||||||
|
|
||||||
|
## The unit is one vendor
|
||||||
|
|
||||||
|
A cache covers exactly one vendor. `BBL.opc` sits beside `BBL.json` and holds
|
||||||
|
everything `BBL.json` and the `BBL/` sub-file tree would have produced.
|
||||||
|
|
||||||
|
Per-vendor granularity is what makes the system practical:
|
||||||
|
|
||||||
|
- A vendor whose profile is bumped invalidates only its own cache. The other 60-odd
|
||||||
|
vendors keep theirs — even when the bumped vendor is the shared Orca filament
|
||||||
|
library everyone else inherits from.
|
||||||
|
- The setup wizard, which loads vendors one at a time, gets the same speedup as
|
||||||
|
startup without a second code path.
|
||||||
|
- A vendor with no cache, or a broken one, costs only that vendor a parse.
|
||||||
|
|
||||||
|
A cache holds *system* presets only. User presets, project settings and modified
|
||||||
|
presets are never serialized — they have their own storage and their own lifecycle.
|
||||||
|
|
||||||
|
## Where the files live
|
||||||
|
|
||||||
|
| Location | Contents on a shipped build | Role |
|
||||||
|
|---|---|---|
|
||||||
|
| `resources/profiles/` | `<vendor>.opc` alone — the profile and its preset JSONs both pruned | What the app ships with; what installing copies from, and the only thing it is read for |
|
||||||
|
| `<data_dir>/system/` | `<vendor>.opc` alone, or `<vendor>.json` + `<vendor>/` after an update | What the user has installed |
|
||||||
|
| `<data_dir>/system/` (dev build) | `<vendor>.json` + `<vendor>/` + `<vendor>.opc` written at runtime | A developer tree caches as it parses |
|
||||||
|
| `<data_dir>/cache/wizard_profile_data.json` | The wizard's derived vendor catalog plus the stamps it was built from | Written and read by the setup wizard only; never shipped (see "The wizard's profile-data cache") |
|
||||||
|
|
||||||
|
Two forms of the same vendor therefore exist, and the system's central rule is that
|
||||||
|
**a vendor's cache is the whole of it**. Where a cache ships or is installed, no profile
|
||||||
|
and no preset JSONs sit beside it: the cache carries the presets, the vendor profile,
|
||||||
|
and the version stamp that says which release it came from. A vendor is "installed" if
|
||||||
|
either form is present *and usable*, and its installed version is read from whichever
|
||||||
|
form a load would serve.
|
||||||
|
|
||||||
|
What stays beside the caches in `resources/profiles/` is everything that is not a
|
||||||
|
preset: each vendor's directory of printer thumbnails, cover images, bed models and
|
||||||
|
hotend meshes, which are read from disk by path and were never part of the cache. Files
|
||||||
|
that are not vendors at all, `blacklist.json` chief among them, are untouched.
|
||||||
|
|
||||||
|
The alternative — shipping both and treating the cache as a sidecar — was rejected. It
|
||||||
|
doubles the installed size, and it creates a class of bug where the two disagree and
|
||||||
|
the app's behavior depends on which one a given code path happened to read.
|
||||||
|
|
||||||
|
## What a cache file is
|
||||||
|
|
||||||
|
A fixed-size header followed by one binary stream.
|
||||||
|
|
||||||
|
The header carries a magic number, the cache format version, the payload size and a
|
||||||
|
CRC32 of the payload. It exists so that a truncated download, a half-written file or a
|
||||||
|
file from an entirely different program is rejected in microseconds, before anything
|
||||||
|
tries to interpret it.
|
||||||
|
|
||||||
|
The payload opens with the stamps that decide whether the cache may be used at all —
|
||||||
|
format version, vendor name, vendor version — then a dictionary, and then the vendor's
|
||||||
|
data: its vendor profile, three lists of preset entries (process, filament, machine),
|
||||||
|
and the count of errors the original parse hit.
|
||||||
|
|
||||||
|
Each entry is one preset **in source form**: what its JSON sub-file states and nothing
|
||||||
|
that resolving it derives — the preset's own config diff, the name of the preset it
|
||||||
|
inherits, and the parse metadata (name, sub-path, description, instantiation, setting
|
||||||
|
and filament ids, renames). Non-instantiated base presets are stored too; the children
|
||||||
|
that inherit from them cannot resolve without them.
|
||||||
|
|
||||||
|
**The payload names its own keys.** The dictionary holds the distinct `opt_key`s the
|
||||||
|
file uses, the `ConfigOptionType` each was written as, and the distinct enum *value
|
||||||
|
names*; an option in an entry's config is then a `uint16` index into that dictionary
|
||||||
|
plus its value. Names are written once per file rather than once per occurrence, and a
|
||||||
|
reader resolves the dictionary against this build's `print_config_def` once, after
|
||||||
|
which reading an option is a vector index.
|
||||||
|
|
||||||
|
This is what makes the cache survive config-schema drift. The alternative — keying an
|
||||||
|
option by its `serialization_key_ordinal`, the position `ConfigDef::add` assigns by
|
||||||
|
declaration order at static init — cannot: inserting one option into the middle of
|
||||||
|
`PrintConfig.cpp` shifts every later ordinal, and the lookup on the way back in then
|
||||||
|
*succeeds on the wrong option*, silently, wherever the two share a type. Because a
|
||||||
|
name-keyed payload instead drops the individual options this build cannot place, the
|
||||||
|
file as a whole stays readable, and there is no schema fingerprint — no checksum over
|
||||||
|
the option schema that would reject every cache on every release. An option this build
|
||||||
|
no longer defines, or now defines with a different type, gets exactly what it gets from
|
||||||
|
a JSON profile: read, dropped, and the rest of the preset loads.
|
||||||
|
|
||||||
|
The ordinal-keyed cereal hooks in `PrintConfig.hpp` are untouched — they are also the
|
||||||
|
undo/redo wire format, where the process cannot change underneath them. The cache has
|
||||||
|
its own serialization in `PresetCacheFormat.{hpp,cpp}`.
|
||||||
|
|
||||||
|
Three deliberate choices in the layout:
|
||||||
|
|
||||||
|
- **Stamps come first**, so the question "what version is this vendor installed at?"
|
||||||
|
can be answered by reading the first kilobyte. The updater asks that question for
|
||||||
|
every vendor on every launch; reading tens of megabytes to answer it would give back
|
||||||
|
the startup time the cache saved. The dictionary sits behind them, ahead of the
|
||||||
|
entries, so a reader that does go on resolves it once and then indexes.
|
||||||
|
- **Nothing inherited is baked in.** A filament preset that inherits from the shared
|
||||||
|
library is stored as its own diff plus its parent's name, and the parent is looked up
|
||||||
|
when the entry is installed, against whatever library is loaded then. A cache
|
||||||
|
therefore carries no other vendor's values, and no other vendor's update — the
|
||||||
|
library's included — can make it stale.
|
||||||
|
- **Nothing derived is stored.** Default presets, flattened configs, aliases and
|
||||||
|
lookup maps are all reconstructed at load by the same code the JSON path runs, and
|
||||||
|
state that path never fills (obsolete-preset lists) is not stored either. This keeps
|
||||||
|
the cache a record of the vendor's data, not a memory image of the program's state.
|
||||||
|
|
||||||
|
## When a cache may be used
|
||||||
|
|
||||||
|
A cache is accepted only if every gate below passes. Any failure means "parse the
|
||||||
|
JSONs instead" — never a hard error, never a partial load.
|
||||||
|
|
||||||
|
**1. Integrity.** Magic number, a declared body size that is exactly the rest of the
|
||||||
|
file, CRC32 over the payload. The size is checked against the file's real length before
|
||||||
|
anything is allocated on the strength of it, so an eight-byte field in an unauthenticated
|
||||||
|
file cannot ask for a gigabyte.
|
||||||
|
|
||||||
|
**2. Cache format version.** A single integer bumped by hand whenever the binary layout
|
||||||
|
changes in a way nothing else would catch: reordering or retyping a hand-written
|
||||||
|
serialized field, or changing what the cache's own stamps mean. Config-schema drift is
|
||||||
|
explicitly *not* such a change — the dictionary handles it — so this no longer moves
|
||||||
|
every release.
|
||||||
|
|
||||||
|
**3. Vendor identity and version.** The cache names the vendor it holds and the profile
|
||||||
|
version it was built from. It is accepted only if that version is at least as new as
|
||||||
|
the profile now on disk. Where no profile sits beside the cache — the shipped,
|
||||||
|
cache-only form — the comparison is skipped, because nothing on disk can be newer than
|
||||||
|
a cache that is the installation.
|
||||||
|
|
||||||
|
**4. Every entry installs.** Entries are installed as they are read, and an entry that
|
||||||
|
cannot be — typically one that inherits a parent the currently loaded filament library
|
||||||
|
no longer provides — rejects the whole cache, never just the entry. A partial vendor is
|
||||||
|
not a vendor.
|
||||||
|
|
||||||
|
There is deliberately no stamp for the shared filament library. A cache stores its
|
||||||
|
filaments' inheritance by name and resolves it at load, so a library update changes
|
||||||
|
what a cache load *produces*, never whether the cache is *valid* — the same file yields
|
||||||
|
the updated result. This matters most on a shipped build, where a vendor is its cache
|
||||||
|
and nothing else: a profile update that delivered only the library would otherwise have
|
||||||
|
stranded every other vendor with a cache it invalidated and no JSONs to fall back on.
|
||||||
|
|
||||||
|
A vendor profile with no parsable version is never cached and never served from a
|
||||||
|
cache. There would be no way to tell later whether the cache had gone stale, and a
|
||||||
|
cache nothing can invalidate is worse than no cache.
|
||||||
|
|
||||||
|
## How a vendor is loaded
|
||||||
|
|
||||||
|
Vendors load in a fixed order, because filament inheritance crosses exactly one
|
||||||
|
boundary: any vendor's filament may inherit from the shared Orca filament library,
|
||||||
|
and nothing else reaches across vendors. The library therefore goes first, alone;
|
||||||
|
every other vendor follows in parallel, resolving against it; and the results are
|
||||||
|
merged in a stable order:
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart LR
|
||||||
|
lib["1 · OrcaFilamentLibrary<br/>loaded first, synchronously"] --> par["2 · every other vendor in parallel,<br/>each into its own bundle, filaments<br/>resolving against the loaded library"] --> merge["3 · bundles merged into one,<br/>sequentially, in stable vendor order"]
|
||||||
|
```
|
||||||
|
|
||||||
|
Whether a vendor comes from its cache or from a parse changes nothing in that
|
||||||
|
order — both produce the same bundle, so cached and parsed vendors mix freely in
|
||||||
|
one startup.
|
||||||
|
|
||||||
|
**A vendor is loaded from where it is installed and nowhere else.** For startup that
|
||||||
|
is `<data_dir>/system/`; resources reaches the app by being *installed* into that
|
||||||
|
directory first, never by being loaded from. (The setup wizard is the one caller with
|
||||||
|
a different notion of "where": it also shows vendors the user has not installed, and
|
||||||
|
loads those from `resources/profiles` — see "The wizard's profile-data cache".) There
|
||||||
|
is one lookup tier and one parse source:
|
||||||
|
|
||||||
|
```
|
||||||
|
load vendor V from <data_dir>/system:
|
||||||
|
system/V.opc passes CACHE_VERSION + size + CRC + vendor name + version gate?
|
||||||
|
yes -> serve from it
|
||||||
|
no -> parse system/V.json, then write system/V.opc back
|
||||||
|
```
|
||||||
|
|
||||||
|
The same decision drawn out — "the gates" are the four acceptance checks above:
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TB
|
||||||
|
start["load vendor V from a directory dir<br/>— normally <data_dir>/system/"]
|
||||||
|
start --> stamp["installed version = version of dir/V.json<br/>— or ∞ with no profile there,<br/>the cache then being the installation"]
|
||||||
|
stamp --> g1{"dir/V.opc<br/>passes all four gates?"}
|
||||||
|
g1 -- "yes" --> hit(["served from the<br/>installed cache"])
|
||||||
|
g1 -- "no" --> pd["parse the JSONs in dir"]
|
||||||
|
pd --> ver{"profile version<br/>parsable?"}
|
||||||
|
ver -- "yes" --> save(["loaded; dir/V.opc written back —<br/>the next load takes the top path"])
|
||||||
|
ver -- "no" --> raw(["loaded, never cached"])
|
||||||
|
```
|
||||||
|
|
||||||
|
A second tier into `resources/profiles/` used to sit between those two, and a parse
|
||||||
|
fallback to the same place behind them. Both existed only because an installed cache
|
||||||
|
died on every app upgrade, when the schema fingerprint rejected it; with the fingerprint
|
||||||
|
gone there is nothing for them to rescue. They also had a cost: on a developer tree the
|
||||||
|
shipped cache answered first, so the profile in `<data_dir>/system/` was never parsed
|
||||||
|
and its cache was never written back.
|
||||||
|
|
||||||
|
Serving from a cache is not a memory-image restore. The entries are deserialized and
|
||||||
|
then installed one by one — inheritance resolved against the presets installed before
|
||||||
|
them and the currently loaded filament library, configs flattened onto the collection
|
||||||
|
defaults, validated and registered — by the same function the JSON path calls straight
|
||||||
|
after parsing a sub-file. The two paths share everything below the parse, which is what
|
||||||
|
makes a cache-loaded bundle indistinguishable from a JSON-loaded one by construction
|
||||||
|
rather than by test coverage. Installation also rebuilds each preset's file path from
|
||||||
|
the local data directory, so a shipped cache never carries the generating machine's
|
||||||
|
paths.
|
||||||
|
|
||||||
|
App upgrades work because a cache normally survives one. Only a deliberate
|
||||||
|
`CACHE_VERSION` bump makes an installed cache unreadable, and that is handled at
|
||||||
|
install time rather than at load: a vendor whose cache this build cannot read counts
|
||||||
|
as **not installed**, so the updater lays down a working copy on the next launch (see
|
||||||
|
below). A vendor that still has its profile JSONs beside the cache is simply parsed
|
||||||
|
and re-cached.
|
||||||
|
|
||||||
|
If a parse does happen and the vendor's profile carries a version, the app writes the
|
||||||
|
cache back beside where it looked for the vendor. That is how a developer build warms
|
||||||
|
itself up on second launch, and how a vendor delivered by a profile update becomes
|
||||||
|
cached without waiting for the next release.
|
||||||
|
|
||||||
|
## The wizard's profile-data cache
|
||||||
|
|
||||||
|
The setup wizard's printer and filament pages want every vendor in one bundle — the
|
||||||
|
installed ones *and* the shipped ones the user has not installed yet, because the
|
||||||
|
wizard is where installing is chosen. Its set therefore spans two directories:
|
||||||
|
`<data_dir>/system/` for installed vendors (shadowing resources on a name collision),
|
||||||
|
`resources/profiles` for the rest, each vendor loaded from its own directory.
|
||||||
|
|
||||||
|
What the wizard actually consumes from that bundle is one derived JSON — the model /
|
||||||
|
machine / filament / process catalog its web pages render — and that JSON is a pure
|
||||||
|
function of the vendor set: each vendor's name and version, in load order. A profile
|
||||||
|
change requires a version bump, so name and version determine a vendor's content
|
||||||
|
wherever its copy sits; which directory served it is deliberately **not** stamped,
|
||||||
|
and installing or removing a copy at an unchanged version leaves the cache valid. So
|
||||||
|
the wizard caches the *derived JSON*, not another form of the inputs:
|
||||||
|
`<data_dir>/cache/wizard_profile_data.json` holds the stamp list and the catalog. On
|
||||||
|
open, the wizard computes the current stamps (one version peek per vendor) and, when
|
||||||
|
they match, serves the catalog from the file — no bundle built, no preset installed.
|
||||||
|
Caching bundle inputs instead was tried and measured: rebuilding the bundle from
|
||||||
|
per-vendor caches costs ~2 s of preset installation whatever feeds it, so only
|
||||||
|
skipping the rebuild entirely wins.
|
||||||
|
|
||||||
|
Any change to the set — a vendor added, removed or updated, or its cache-only
|
||||||
|
`.opc` replaced by a newer one — changes the stamps and retires the whole file;
|
||||||
|
the wizard then rebuilds the bundle vendor by vendor (per-vendor caches serving where
|
||||||
|
they cover) and writes the catalog back. Selections, region and per-open decorations
|
||||||
|
are applied downstream of the cache either way, so a served catalog is
|
||||||
|
indistinguishable from a rebuilt one. Nothing ships this file and the updater never
|
||||||
|
touches it; it is a locally written artifact, re-derived whenever stale, written
|
||||||
|
through a temp file and rename so half a cache is never readable.
|
||||||
|
|
||||||
|
The cache lives under `<data_dir>/cache/`, not beside the vendors: everything that
|
||||||
|
scans `<data_dir>/system/` treats any `.opc` there as a vendor, so a non-vendor
|
||||||
|
cache file must not sit in that directory. Relatedly, the stamp reader is hardened:
|
||||||
|
`read_cache_stamps` validates the cache version before reading anything
|
||||||
|
variable-length and bounds the stamp strings' lengths, so a reader pointed at a
|
||||||
|
foreign or damaged `.opc` rejects it cleanly instead of aborting on a garbage
|
||||||
|
64-bit allocation.
|
||||||
|
|
||||||
|
## How a vendor is installed
|
||||||
|
|
||||||
|
Installing copies from `resources/profiles/` into `<data_dir>/system/`. A shipped build
|
||||||
|
offers only a cache and a source tree only JSONs, but a partially-generated tree can
|
||||||
|
have both, at different versions, so the installer picks the form that ships at the
|
||||||
|
**newer version** and installs only that one:
|
||||||
|
|
||||||
|
- Cache newer or equal, and readable → copy the `.opc`, verify the *copy* is one this
|
||||||
|
build can read, and only then delete any profile and vendor directory a previous
|
||||||
|
install left behind, so nothing can shadow it.
|
||||||
|
- Profile newer, or the cache unreadable or absent → copy the profile and the vendor's
|
||||||
|
preset JSONs exactly as the app did before caches existed, and delete any stale `.opc`
|
||||||
|
once the profile is safely in place.
|
||||||
|
|
||||||
|
One vendor that cannot be installed is one vendor missing, not a reason to leave the
|
||||||
|
rest uninstalled: the installer skips it, records the failure, and carries on with the
|
||||||
|
batch. A vendor whose cache arrives unreadable falls back to installing its profile,
|
||||||
|
which is decided by reading the copy rather than by the kilobyte peek that chose the
|
||||||
|
form.
|
||||||
|
|
||||||
|
**"Installed" means present and usable.** Where the cache is the whole of a vendor's
|
||||||
|
installation, a `.opc` this build cannot read is not an installation — counted as one,
|
||||||
|
the vendor would be stranded with nothing to load and the updater would never repair
|
||||||
|
it. The installed version is likewise whichever form a load would actually serve: the
|
||||||
|
cache's stamp while it covers the profile beside it, the profile's own version once it
|
||||||
|
does not.
|
||||||
|
|
||||||
|
The result is that only one form of a vendor is ever present, and it is the newest one
|
||||||
|
the build has. This matters most for the update check, which compares what is installed
|
||||||
|
against what installing *would* lay down: if those two disagreed about which form
|
||||||
|
counts, a vendor could reinstall on every launch forever, or silently never update.
|
||||||
|
|
||||||
|
Profile updates delivered over the air always arrive as JSONs, and they win — an
|
||||||
|
updated vendor's real profile lands in the data directory, the installed cache beside it
|
||||||
|
is older and gets rejected, and the vendor is parsed and re-cached. An update that touches only
|
||||||
|
the filament library needs nothing more: every other vendor's cache stays valid and
|
||||||
|
simply resolves against the new library on its next load.
|
||||||
|
|
||||||
|
## How the caches are produced
|
||||||
|
|
||||||
|
Cache generation is a build step, not something a user ever runs.
|
||||||
|
|
||||||
|
One script per platform does the whole job, and CI calls it once on each. It builds a
|
||||||
|
small dev-utility that loads a profiles directory exactly as the app would, with cache
|
||||||
|
writing enabled, dropping a `<vendor>.opc` beside every vendor profile it parses; then
|
||||||
|
it copies those caches into each packaged application it was pointed at and deletes
|
||||||
|
every preset JSON they replace — the vendor's own profile included. Only a vendor that
|
||||||
|
actually has a cache is pruned, so a vendor the generator skipped keeps its JSONs and is
|
||||||
|
simply parsed at startup.
|
||||||
|
|
||||||
|
Caches are generated into the checkout's own `resources/profiles`, because that is what
|
||||||
|
cpack re-installs from when it builds the NSIS installer — so that directory is also a
|
||||||
|
prune target in CI. Pruning it deletes the checkout's preset JSONs, which is a packaging
|
||||||
|
step, not something a build should do to a working tree by surprise: the Windows script
|
||||||
|
refuses that target unless given `--prune-source`, and CI passes it.
|
||||||
|
|
||||||
|
Generation runs after the build, in the same job, so the caches ship with a build that
|
||||||
|
can read them.
|
||||||
|
|
||||||
|
The flatpak differs only in where the script is called from. Nothing outside
|
||||||
|
flatpak-builder ever builds it, so there is no packaged tree for the workflow to point
|
||||||
|
the script at afterwards: the manifest runs it as a build step instead, against the
|
||||||
|
profiles the install has already copied into `/app`.
|
||||||
|
|
||||||
|
## Behavior when things go wrong
|
||||||
|
|
||||||
|
The system is designed so that no cache problem is fatal:
|
||||||
|
|
||||||
|
- **Corrupt, truncated or foreign file** — rejected at the header, vendor parsed. A
|
||||||
|
cache is written to a temp file beside its target and moved into place, so a write
|
||||||
|
that dies partway leaves the previous cache intact rather than a truncated one.
|
||||||
|
- **An option this build no longer has, or now types differently** — that option alone
|
||||||
|
is dropped, exactly as a JSON profile's would be. The preset and the file load.
|
||||||
|
- **Cache from a build with a different cache layout** — rejected on `CACHE_VERSION`.
|
||||||
|
A vendor with JSONs beside it is parsed and re-cached; a cache-only vendor reads as
|
||||||
|
not installed and the updater reinstalls it.
|
||||||
|
- **Stale cache** — rejected on the vendor version stamp, vendor parsed and re-cached.
|
||||||
|
- **Failure part-way through loading** — a deserialization error, or any entry that
|
||||||
|
fails to install — rejects the whole cache, and the bundle is reset to a clean state
|
||||||
|
before falling back, so a half-loaded cache can never leak into the parsed result.
|
||||||
|
- **A vendor that can be neither read nor parsed** — logged, and left out. The setup
|
||||||
|
wizard drops that vendor from its list and opens with the rest; startup records the
|
||||||
|
error alongside the vendors that did load. One broken vendor never takes the app down.
|
||||||
|
|
||||||
|
The one genuine limit: on a shipped build a vendor is its cache and nothing else, so a
|
||||||
|
rejected cache has nothing to fall back to for that vendor. This is by design — the
|
||||||
|
alternative is shipping every preset twice — and it is why the acceptance gates are
|
||||||
|
conservative and why CI generates the caches with the same build that ships them. The
|
||||||
|
recovery path is a profile update, which delivers real JSONs.
|
||||||
|
|
||||||
|
It also means nothing may quietly assume a `<vendor>.json` exists. Discovery, version
|
||||||
|
checks and the update decision all read whichever form is present, and a code path that
|
||||||
|
enumerates only `*.json` will find no vendors at all in a packaged build.
|
||||||
|
|
||||||
|
## Maintenance rules
|
||||||
|
|
||||||
|
- **Adding, removing, retyping or reordering a config option** needs nothing. The
|
||||||
|
payload names its keys and its enum values, so an option a cache carries and this
|
||||||
|
build does not is dropped; one this build has and the cache does not is simply
|
||||||
|
absent, as it would be from a JSON that predates it.
|
||||||
|
- **Changing a hand-written `serialize()`** — `VendorProfile` or its nested types — or
|
||||||
|
the `CachedPreset` field list — written and read by `visit_entry` in
|
||||||
|
`PresetCacheFormat.cpp`, one list for the save, the load and the name peek alike — or
|
||||||
|
the cache's own layout or stamps, requires bumping `CACHE_VERSION` by hand.
|
||||||
|
- **The dictionary indexes with a `uint16`**, so `print_config_def` may hold at most
|
||||||
|
65535 options and one cache at most 65535 distinct enum value names.
|
||||||
|
`CacheDictionary::save` throws past that, which surfaces when CI generates the
|
||||||
|
caches rather than on a user's machine.
|
||||||
|
- **Bumping `CACHE_VERSION` is safe without a resources fallback** because
|
||||||
|
`is_vendor_installed` means *present and usable*: cache-only vendors read as not
|
||||||
|
installed after a bump, and the updater reinstalls them from resources.
|
||||||
|
- **Bumping a vendor profile's version** invalidates that vendor's cache and nothing
|
||||||
|
else — the filament library's included. Other vendors' caches resolve against the
|
||||||
|
new library the next time they load.
|
||||||
|
- **Caches are never committed.** They are build artifacts, generated per build,
|
||||||
|
ignored by git.
|
||||||
|
|
||||||
|
## Where this lives in the tree
|
||||||
|
|
||||||
|
| Area | Files |
|
||||||
|
|---|---|
|
||||||
|
| Everything about the bytes on disk — the dictionary, one config's wire format, the file framing and stamps, entry serialization, `VendorCacheFile` save/load/peeks | `src/libslic3r/PresetCacheFormat.{hpp,cpp}` |
|
||||||
|
| Serve-or-parse decision, installing cache entries into a bundle, cache write-back | `src/libslic3r/PresetBundle.{hpp,cpp}` |
|
||||||
|
| Vendor profile serialization | `src/libslic3r/Preset.hpp` |
|
||||||
|
| Vendor discovery, installed/shipped versions, installation | `src/libslic3r/utils.cpp` (declared in `Utils.hpp`) |
|
||||||
|
| Update and reinstall decisions | `src/slic3r/Utils/PresetUpdater.cpp` |
|
||||||
|
| Setup wizard and printer-selection dialog | `src/slic3r/GUI/ConfigWizard.cpp`, `src/slic3r/GUI/WebGuideDialog.cpp` |
|
||||||
|
| Generator tool | `src/dev-utils/generate_system_cache.cpp` |
|
||||||
|
| Build and packaging script | `scripts/build_preset_cache.{sh,bat}` |
|
||||||
|
| Tests | `tests/libslic3r/test_vendor_cache.cpp` |
|
||||||
@@ -0,0 +1,170 @@
|
|||||||
|
# Wipe inward — High Level Design
|
||||||
|
|
||||||
|
## Purpose and scope
|
||||||
|
|
||||||
|
Wipe inward reduces reheating of fresh plastic and visible seam artifacts by
|
||||||
|
moving the hot nozzle toward adjacent printed material during the external-wall
|
||||||
|
wipe. Wipe marks are especially visible at layer heights below 0.1 mm.
|
||||||
|
The option applies only to wipes after external walls, including walls around
|
||||||
|
holes. It does not offset wipes after inner walls, infill or supports. For an
|
||||||
|
outer contour the move is inward; for a hole it is away from the hole, toward
|
||||||
|
the surrounding material. The path must remain supported by material that is
|
||||||
|
already present when the wipe executes.
|
||||||
|
|
||||||
|
The operation belongs to G-code generation. It uses extrusion paths, their actual
|
||||||
|
widths and their print order. Changing its settings invalidates G-code export
|
||||||
|
while preserving the sliced geometry.
|
||||||
|
|
||||||
|
## Settings and eligibility
|
||||||
|
|
||||||
|
`wipe_inward` defaults to disabled and requires Wipe while retracting to be
|
||||||
|
enabled for the active filament. `wipe_inward_distance` defaults to 50% of the
|
||||||
|
actual external-wall extrusion width; it also accepts an absolute distance in
|
||||||
|
millimeters. Using the path width makes Auto width and Arachne's variable widths
|
||||||
|
meaningful. The effective offset is limited by that width and the spacing to the
|
||||||
|
adjacent wall. A zero distance disables the offset.
|
||||||
|
|
||||||
|
Only external perimeters with a suitable, previously printed inner perimeter
|
||||||
|
are eligible. A configured wall count alone cannot establish eligibility:
|
||||||
|
the local geometry may contain fewer walls, and walls scheduled later do not
|
||||||
|
provide support. Outer/Inner wall order therefore normally retains the regular
|
||||||
|
wipe path.
|
||||||
|
|
||||||
|
Retraction and pressure advance calibrations disable inward wiping so it cannot
|
||||||
|
mask the behavior being measured. The calibration settings turn it off, and
|
||||||
|
G-code generation enforces this even if a profile or object override enables it.
|
||||||
|
|
||||||
|
## Path selection and support
|
||||||
|
|
||||||
|
The planner identifies an adjacent inner perimeter on the material side of the
|
||||||
|
outgoing wall. Contour winding and the distinction between outer contours and
|
||||||
|
holes establish a preferred direction; local printed geometry resolves ambiguous
|
||||||
|
or self-touching contours.
|
||||||
|
|
||||||
|
Candidate paths offset or translate the portion needed for the configured wipe
|
||||||
|
distance. A wide seam gap can prevent a supported forward path; following the
|
||||||
|
incoming printed wall backwards is also a candidate. If translating that wall
|
||||||
|
cannot provide a complete wipe around a curve, the planner tries an offset of
|
||||||
|
the reversed wall. Direction checks allow coordinate-rounding error at a
|
||||||
|
perpendicular entry, while rejecting actual backtracking. The planner checks the
|
||||||
|
complete executable path, including its connector from the nozzle position,
|
||||||
|
against the current and earlier printed perimeters. Nearby endpoints alone do
|
||||||
|
not establish support across a gap.
|
||||||
|
|
||||||
|
Each region accumulates its printed perimeter prefix once, in extrusion order.
|
||||||
|
Every entity contributes its geometry only after it is printed, and the prefix
|
||||||
|
is discarded when the region ends. This collection is skipped when inward wiping
|
||||||
|
is disabled or its configured distance is zero. A mixed inner-wall loop remains
|
||||||
|
an eligible target even when its first path is an overhang: ordinary inner-wall
|
||||||
|
paths elsewhere in the loop identify it. Likewise, an external loop with an
|
||||||
|
overhanging start remains eligible when other segments identify the external
|
||||||
|
wall. It is available for support checks but is not an inner-wall target.
|
||||||
|
Candidate-specific support filtering and AABB trees are built only for eligible
|
||||||
|
external loops, then reused across their candidate paths.
|
||||||
|
|
||||||
|
Material-side validation applies with or without a seam gap. Along each
|
||||||
|
candidate, local wall normals point toward the adjacent printed inner wall;
|
||||||
|
samples on the opposite side are rejected even when they remain close enough
|
||||||
|
to the external wall to pass the support check. This uses the open wall geometry
|
||||||
|
without treating it as a closed polygon. Full paths at a zero-gap seam also
|
||||||
|
retain clearance from the external wall after their initial connector. At a
|
||||||
|
clipped corner, another branch can be closer than the requested offset, so
|
||||||
|
material-side and support checks apply without that additional clearance rule.
|
||||||
|
|
||||||
|
An accepted candidate replaces the stored wipe path as a whole. A short direct
|
||||||
|
inward move is also eligible when longer candidates fail validation. It may
|
||||||
|
waive full wall clearance, but must pass the material-side check. Its initial
|
||||||
|
direction is checked from the actual nozzle position after any loop pre-move;
|
||||||
|
the original wall endpoint is retained separately for intersection checks. It takes
|
||||||
|
priority over the alternate offset when the preferred and translated paths
|
||||||
|
are unusable. A longer reversed path may replace the selected candidate only
|
||||||
|
when its distance to the target inner wall is no worse within tolerance.
|
||||||
|
|
||||||
|
## Fallback to the regular wipe
|
||||||
|
|
||||||
|
The original wipe path is retained when:
|
||||||
|
|
||||||
|
- No suitable adjacent inner wall has already been printed near the seam. This
|
||||||
|
includes single-wall areas, locally missing inner walls and normally Outer/Inner
|
||||||
|
wall order. A distant wall or a wall on the air side does not qualify.
|
||||||
|
- The requested or available offset, or the configured wipe distance, is zero
|
||||||
|
or too small at the geometry's coordinate precision.
|
||||||
|
- Degenerate geometry prevents construction of a usable candidate, or all
|
||||||
|
candidates fail the checks for printed support, direction, wall clearance or
|
||||||
|
the connector from the actual nozzle position. This can occur at tight corners,
|
||||||
|
narrow features or seam gaps.
|
||||||
|
|
||||||
|
Corners and seam gaps do not automatically trigger fallback: an offset,
|
||||||
|
translated, reversed or short direct inward path may still be valid. The regular
|
||||||
|
wipe is retained only when no candidate is accepted.
|
||||||
|
|
||||||
|
Fallback uses the path and retraction rules for `wipe_inward` disabled.
|
||||||
|
Wipe while retracting must still be enabled for a wipe to occur; `wipe_on_loops`
|
||||||
|
remains controlled by its own setting.
|
||||||
|
|
||||||
|
## Interaction with Wipe on loop
|
||||||
|
|
||||||
|
`wipe_on_loops` is an independent option that makes a short move before leaving
|
||||||
|
an external loop. It can operate with `wipe_inward` disabled. When both options
|
||||||
|
are enabled, its destination is the starting position for the inward wipe.
|
||||||
|
|
||||||
|
The loop move samples the outgoing and incoming paths by distance across path
|
||||||
|
boundaries. The sampling distance is bounded by the nozzle diameter and one
|
||||||
|
quarter of the total path length. It samples the outgoing path at up to 20% of
|
||||||
|
the nozzle diameter and rotates that point around the seam through one third
|
||||||
|
of the material-side corner angle. For a closed square outer contour, this
|
||||||
|
produces a move of 20% of the nozzle diameter at 30 degrees into the corner.
|
||||||
|
Coincident samples or degenerate angles suppress the move.
|
||||||
|
|
||||||
|
The nozzle position stored by G-code generation must match the emitted loop
|
||||||
|
move. Both travel planning and wipe execution depend on this position, including
|
||||||
|
when Wipe inward is disabled.
|
||||||
|
|
||||||
|
With a seam gap, a loop move may advance past the inward offset's original entry.
|
||||||
|
If that alone makes the connector backtrack, the entry advances to the nozzle's
|
||||||
|
projection on the offset. The planner extends the source as needed to preserve
|
||||||
|
the configured wipe length and validates the new connector and complete path.
|
||||||
|
Joins that already backtrack across the seam gap are not adjusted this way.
|
||||||
|
|
||||||
|
## Execution and retraction
|
||||||
|
|
||||||
|
The stored wipe path uses a sentinel first point. Execution starts from the
|
||||||
|
actual nozzle position and proceeds to the second stored point. Path selection,
|
||||||
|
support validation and wipe-length calculation must all use this same executable
|
||||||
|
geometry, especially after a Wipe on loop move.
|
||||||
|
|
||||||
|
An accepted inward path executes at the end of the external loop, after any
|
||||||
|
Wipe on loop move, without retracting filament. It consumes the stored path and
|
||||||
|
updates the nozzle position before travel planning. A short travel to the next
|
||||||
|
wall cannot discard this wipe or force a retraction or Z-hop. Subsequent travel
|
||||||
|
uses the normal minimum-travel threshold and retraction/lift settings from the
|
||||||
|
new position. The regular wipe, including fallback, remains deferred until a
|
||||||
|
normal retraction uses it.
|
||||||
|
|
||||||
|
Retraction is divided into portions before, during and after wiping. The amount
|
||||||
|
that can be retracted during the wipe depends on its executable length, wipe
|
||||||
|
speed and the active filament's retraction speed. Fractional retraction speeds
|
||||||
|
are retained in this calculation. For a 2 mm wipe at 100 mm/s and a retraction
|
||||||
|
speed of 25.5 mm/s, the wipe can retract 0.51 mm. With a total retraction of 0.8 mm
|
||||||
|
and both before/after percentages set to zero, the remaining 0.29 mm is retracted
|
||||||
|
before wiping. This split applies to regular deferred wipes, including fallback;
|
||||||
|
an accepted inward wipe executes separately without retraction.
|
||||||
|
|
||||||
|
## Implementation and verification
|
||||||
|
|
||||||
|
- [GCode.cpp](../../src/libslic3r/GCode.cpp) integrates path selection, nozzle
|
||||||
|
position and retraction; [Print.cpp](../../src/libslic3r/Print.cpp) controls
|
||||||
|
invalidation, and [PrintConfig.cpp](../../src/libslic3r/PrintConfig.cpp) defines
|
||||||
|
the settings.
|
||||||
|
- [WipePathHelpers](../../src/libslic3r/GCode/WipePathHelpers.hpp) implements path
|
||||||
|
sampling, offset selection and support checks.
|
||||||
|
- [Geometry tests](../../tests/libslic3r/test_wipe_path.cpp) cover support,
|
||||||
|
degenerate paths, contour and hole orientations, and exact loop-move geometry
|
||||||
|
across path subdivisions.
|
||||||
|
- [FFF tests](../../tests/fff_print/test_wipe.cpp) cover emitted trajectories,
|
||||||
|
fallback, minimum-travel retraction and Z-hop rules, and export invalidation.
|
||||||
|
With Wipe inward disabled, they check the loop move's direction and magnitude
|
||||||
|
for Classic and Arachne, the subsequent wipe's start and length, and fractional
|
||||||
|
retraction splitting in absolute and relative E modes.
|
||||||
|
Loop-move checks use reserved role/wipe markers and extrusion state, and run
|
||||||
|
with human-readable G-code comments both enabled and disabled.
|
||||||
@@ -1,111 +0,0 @@
|
|||||||
# Move `wxInspectable` into `DPIAware` — Implementation Plan
|
|
||||||
|
|
||||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
|
||||||
|
|
||||||
**Goal:** Move `wxInspector::wxInspectable` from individual leaf classes into the common `DPIAware<P>` template so every DPIAware widget is automatically inspectable and gets the inspector keyboard shortcut.
|
|
||||||
|
|
||||||
**Architecture:** `DPIAware<P>` gains `wxInspector::wxInspectable` as a second base class and calls `SetupInspectorAccelerator(this)` in its constructor. `DPIDialog` and `MainFrame` drop their now-redundant `wxInspectable` inheritance and `SetupInspectorAccelerator` calls.
|
|
||||||
|
|
||||||
**Tech Stack:** C++17, wxWidgets, wxInspector
|
|
||||||
|
|
||||||
## Global Constraints
|
|
||||||
|
|
||||||
- Build with `D:\VisualStudio\2026\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe`
|
|
||||||
- Use `--config RelWithDebInfo` for all builds
|
|
||||||
- Cross-platform: must compile on Windows, macOS, and Linux
|
|
||||||
- Match existing code style: PascalCase classes, `#pragma once`
|
|
||||||
- Do NOT commit files under `.superpowers/`
|
|
||||||
- Do NOT commit `task.md`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Task 1: Move `wxInspectable` and `SetupInspectorAccelerator` into `DPIAware<P>`
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
- Modify: `src/slic3r/GUI/GUI_Utils.hpp:92` (DPIAware template — add wxInspectable base + SetupInspectorAccelerator call)
|
|
||||||
- Modify: `src/slic3r/GUI/GUI_Utils.hpp:276` (DPIDialog — drop wxInspectable + SetupInspectorAccelerator)
|
|
||||||
- Modify: `src/slic3r/GUI/MainFrame.hpp:96` (MainFrame — drop wxInspectable)
|
|
||||||
- Modify: `src/slic3r/GUI/MainFrame.cpp:304` (MainFrame constructor — drop SetupInspectorAccelerator)
|
|
||||||
|
|
||||||
**Interfaces:**
|
|
||||||
- Consumes: Nothing (standalone refactor)
|
|
||||||
- Produces: All DPIAware widgets automatically inherit `wxInspector::wxInspectable` and get Ctrl+Shift+I accelerator
|
|
||||||
|
|
||||||
- [ ] **Step 1: Add `wxInspectable` to `DPIAware<P>` and call `SetupInspectorAccelerator`**
|
|
||||||
|
|
||||||
In `src/slic3r/GUI/GUI_Utils.hpp`, line 92, change the base class:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
// Before:
|
|
||||||
template<class P> class DPIAware : public P
|
|
||||||
// After:
|
|
||||||
template<class P> class DPIAware : public P, public wxInspector::wxInspectable
|
|
||||||
```
|
|
||||||
|
|
||||||
In the constructor body of `DPIAware<P>`, after `this->CenterOnParent();` (currently line 110), add:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
SetupInspectorAccelerator(this);
|
|
||||||
```
|
|
||||||
|
|
||||||
(`<wx/inspector/inspector.h>` is already included at line 23.)
|
|
||||||
|
|
||||||
- [ ] **Step 2: Remove redundant `wxInspectable` and `SetupInspectorAccelerator` from `DPIDialog`**
|
|
||||||
|
|
||||||
In `src/slic3r/GUI/GUI_Utils.hpp`, line 276, change:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
// Before:
|
|
||||||
class DPIDialog : public DPIAware<wxDialog>, public wxInspector::wxInspectable
|
|
||||||
// After:
|
|
||||||
class DPIDialog : public DPIAware<wxDialog>
|
|
||||||
```
|
|
||||||
|
|
||||||
In the `DPIDialog` constructor body, remove the `SetupInspectorAccelerator(this);` line (currently line 286). The rest of the constructor stays.
|
|
||||||
|
|
||||||
- [ ] **Step 3: Remove redundant `wxInspectable` from `MainFrame`**
|
|
||||||
|
|
||||||
In `src/slic3r/GUI/MainFrame.hpp`, line 96, change:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
// Before:
|
|
||||||
class MainFrame : public DPIFrame, public wxInspector::wxInspectable
|
|
||||||
// After:
|
|
||||||
class MainFrame : public DPIFrame
|
|
||||||
```
|
|
||||||
|
|
||||||
`MainFrame` now gets `wxInspectable` through `DPIFrame` → `DPIAware<wxFrame>`.
|
|
||||||
|
|
||||||
- [ ] **Step 4: Remove redundant `SetupInspectorAccelerator` from `MainFrame` constructor**
|
|
||||||
|
|
||||||
In `src/slic3r/GUI/MainFrame.cpp`, line 304, remove the line:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
SetupInspectorAccelerator(this);
|
|
||||||
```
|
|
||||||
|
|
||||||
It is now called automatically by the `DPIAware<wxFrame>` constructor.
|
|
||||||
|
|
||||||
- [ ] **Step 5: Build to verify compilation**
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
$cmakePath = "D:\VisualStudio\2026\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe"
|
|
||||||
& $cmakePath --build . --config RelWithDebInfo --target ALL_BUILD -- -m
|
|
||||||
```
|
|
||||||
|
|
||||||
Expected: Build succeeds with zero new errors or warnings.
|
|
||||||
|
|
||||||
- [ ] **Step 6: Commit**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git add src/slic3r/GUI/GUI_Utils.hpp src/slic3r/GUI/MainFrame.hpp src/slic3r/GUI/MainFrame.cpp
|
|
||||||
git commit -m "refactor: move wxInspectable and SetupInspectorAccelerator into DPIAware
|
|
||||||
|
|
||||||
DPIAware<P> now inherits wxInspector::wxInspectable and calls
|
|
||||||
SetupInspectorAccelerator in its constructor, making all DPIAware
|
|
||||||
widgets automatically appear in the inspector tree with the
|
|
||||||
Ctrl+Shift+I shortcut. Remove redundant wxInspectable inheritance
|
|
||||||
and SetupInspectorAccelerator calls from DPIDialog and MainFrame.
|
|
||||||
|
|
||||||
Co-Authored-By: Claude <noreply@anthropic.com>"
|
|
||||||
```
|
|
||||||
@@ -1,753 +0,0 @@
|
|||||||
# wxInspector Plugins for OrcaSlicer — Implementation Plan
|
|
||||||
|
|
||||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
|
||||||
|
|
||||||
**Goal:** Build two wxInspector plugins (DPIAware + CustomWidgets) that expose OrcaSlicer custom control properties in the inspector's property grid.
|
|
||||||
|
|
||||||
**Architecture:** Two plugins in a shared folder under `src/slic3r/Utils/wxInspectorPlugins/`. DPIAwarePlugin uses `dynamic_cast<DPIFrame*>/<DPIDialog*>` for detection; CustomWidgetsPlugin uses per-type `dynamic_cast`. Both registered as static singletons via a single inline function in `Registration.hpp`, called from `MainFrame` constructor.
|
|
||||||
|
|
||||||
**Tech Stack:** C++17, wxWidgets, wxInspector plugin API (`wx/inspector/plugin.h`, `wx/inspector/inspector.h`), OrcaSlicer custom widget headers
|
|
||||||
|
|
||||||
## Global Constraints
|
|
||||||
|
|
||||||
- Plugins placed under `src/slic3r/Utils/wxInspectorPlugins/`
|
|
||||||
- Build with `D:\VisualStudio\2026\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe`
|
|
||||||
- Minimal source changes: only trivial (one-line) getters/setters added to existing classes
|
|
||||||
- Cross-platform: must compile on Windows, macOS, and Linux
|
|
||||||
- Match existing code style: PascalCase classes, snake_case functions, `#pragma once`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Task 1: Add getters/setters to existing Orca widget headers
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
- Modify: `src/slic3r/GUI/GUI_Utils.hpp` (DPIAware template — add 4 methods)
|
|
||||||
- Modify: `src/slic3r/GUI/Widgets/Button.hpp` (add 3 getters)
|
|
||||||
- Modify: `src/slic3r/GUI/Widgets/CheckBox.hpp` (add 1 getter)
|
|
||||||
- Modify: `src/slic3r/GUI/Widgets/TextInput.hpp` (add 1 getter)
|
|
||||||
- Modify: `src/slic3r/GUI/Widgets/LabeledStaticBox.hpp` (add 4 getter declarations)
|
|
||||||
- Modify: `src/slic3r/GUI/Widgets/LabeledStaticBox.cpp` (add 4 getter implementations)
|
|
||||||
|
|
||||||
**Interfaces:**
|
|
||||||
- Consumes: Nothing (prerequisite for all other tasks)
|
|
||||||
- Produces:
|
|
||||||
- `DPIAware<P>::set_scale_factor(float)`, `DPIAware<P>::set_prev_scale_factor(float)`, `DPIAware<P>::set_em_unit(int)`, `DPIAware<P>::force_rescale() const`
|
|
||||||
- `Button::GetStyle()`, `Button::GetType()`, `Button::IsSelected()`
|
|
||||||
- `CheckBox::IsHalfChecked()`
|
|
||||||
- `TextInput::GetCornerRadius()`
|
|
||||||
- `LabeledStaticBox::GetCornerRadius()`, `LabeledStaticBox::GetBorderWidth()`, `LabeledStaticBox::GetBorderColor()`, `LabeledStaticBox::GetScale()`
|
|
||||||
|
|
||||||
- [ ] **Step 1: Add DPIAware setters/getter in GUI_Utils.hpp**
|
|
||||||
|
|
||||||
After line 184 (`float prev_scale_factor() const { return m_prev_scale_factor; }`), add:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
void set_scale_factor(float v) { m_scale_factor = v; }
|
|
||||||
void set_prev_scale_factor(float v) { m_prev_scale_factor = v; }
|
|
||||||
void set_em_unit(int v) { m_em_unit = v; }
|
|
||||||
bool force_rescale() const { return m_force_rescale; }
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] **Step 2: Add Button getters in Button.hpp**
|
|
||||||
|
|
||||||
After line 79 (`void SetSelected(bool selected = true) { m_selected = selected; }`), add:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
ButtonStyle GetStyle() const { return m_style; }
|
|
||||||
ButtonType GetType() const { return m_type; }
|
|
||||||
bool IsSelected() const { return m_selected; }
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] **Step 3: Add CheckBox getter in CheckBox.hpp**
|
|
||||||
|
|
||||||
After line 16 (`void SetHalfChecked(bool value = true);`), add:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
bool IsHalfChecked() const { return m_half_checked; }
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] **Step 4: Add TextInput getter in TextInput.hpp**
|
|
||||||
|
|
||||||
After line 44 (`void SetCornerRadius(double radius);`), add:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
int GetCornerRadius() const { return static_cast<int>(radius); }
|
|
||||||
```
|
|
||||||
|
|
||||||
(Note: `radius` is inherited from `StaticBox` which has it as a protected `double` member.)
|
|
||||||
|
|
||||||
- [ ] **Step 5: Add LabeledStaticBox getter declarations in LabeledStaticBox.hpp**
|
|
||||||
|
|
||||||
After line 46 (`bool Enable(bool enable) override;`), add:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
int GetCornerRadius() const { return m_radius; }
|
|
||||||
int GetBorderWidth() const { return m_border_width; }
|
|
||||||
StateColor GetBorderColor() const { return border_color; }
|
|
||||||
float GetScale() const { return m_scale; }
|
|
||||||
```
|
|
||||||
|
|
||||||
(Note: all of `m_radius`, `m_border_width`, `border_color`, `m_scale` are protected members, accessible to inline methods.)
|
|
||||||
|
|
||||||
- [ ] **Step 6: Commit**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git add src/slic3r/GUI/GUI_Utils.hpp src/slic3r/GUI/Widgets/Button.hpp src/slic3r/GUI/Widgets/CheckBox.hpp src/slic3r/GUI/Widgets/TextInput.hpp src/slic3r/GUI/Widgets/LabeledStaticBox.hpp
|
|
||||||
git commit -m "feat: add getters/setters for wxInspector plugin access
|
|
||||||
|
|
||||||
Add minimal public accessors to DPIAware (set_scale_factor,
|
|
||||||
set_prev_scale_factor, set_em_unit, force_rescale), Button
|
|
||||||
(GetStyle, GetType, IsSelected), CheckBox (IsHalfChecked),
|
|
||||||
TextInput (GetCornerRadius), and LabeledStaticBox
|
|
||||||
(GetCornerRadius, GetBorderWidth, GetBorderColor, GetScale)."
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Task 2: Create Registration helper header
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
- Create: `src/slic3r/Utils/wxInspectorPlugins/Registration.hpp`
|
|
||||||
|
|
||||||
**Interfaces:**
|
|
||||||
- Consumes: Nothing (forward-declares plugin classes)
|
|
||||||
- Produces: `RegisterOrcaInspectorPlugins()`
|
|
||||||
|
|
||||||
- [ ] **Step 1: Create directory**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
mkdir -p src/slic3r/Utils/wxInspectorPlugins
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] **Step 2: Write Registration.hpp**
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
namespace wxInspector {
|
|
||||||
class wxInspectorPlugin;
|
|
||||||
void RegisterPlugin(wxInspectorPlugin* plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Forward declare our plugins
|
|
||||||
class DPIAwarePlugin;
|
|
||||||
class CustomWidgetsPlugin;
|
|
||||||
|
|
||||||
inline void RegisterOrcaInspectorPlugins()
|
|
||||||
{
|
|
||||||
static DPIAwarePlugin dpiaware;
|
|
||||||
static CustomWidgetsPlugin customWidgets;
|
|
||||||
wxInspector::RegisterPlugin(&dpiaware);
|
|
||||||
wxInspector::RegisterPlugin(&customWidgets);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] **Step 3: Commit**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git add src/slic3r/Utils/wxInspectorPlugins/Registration.hpp
|
|
||||||
git commit -m "feat: add wxInspector plugin registration helper
|
|
||||||
|
|
||||||
Add RegisterOrcaInspectorPlugins() inline function that creates
|
|
||||||
and registers the DPIAwarePlugin and CustomWidgetsPlugin as
|
|
||||||
static instances (matching wxInspector's built-in pattern)."
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Task 3: Create DPIAwarePlugin
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
- Create: `src/slic3r/Utils/wxInspectorPlugins/DPIAwarePlugin.hpp`
|
|
||||||
- Create: `src/slic3r/Utils/wxInspectorPlugins/DPIAwarePlugin.cpp`
|
|
||||||
|
|
||||||
**Interfaces:**
|
|
||||||
- Consumes: Task 1 (DPIAware getters/setters), Task 2 (registration pattern)
|
|
||||||
- Produces: `class DPIAwarePlugin : public wxInspector::wxInspectorPlugin`
|
|
||||||
|
|
||||||
- [ ] **Step 1: Write DPIAwarePlugin.hpp**
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <wx/inspector/plugin.h>
|
|
||||||
|
|
||||||
class DPIAwarePlugin : public wxInspector::wxInspectorPlugin
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
wxString GetName() const override;
|
|
||||||
|
|
||||||
bool CanProvideProperties(wxClassInfo* info) override;
|
|
||||||
|
|
||||||
wxVector<wxInspector::PropertyDef> GetProperties(
|
|
||||||
wxInspector::InspectableObject& obj) override;
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] **Step 2: Write DPIAwarePlugin.cpp**
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include "DPIAwarePlugin.hpp"
|
|
||||||
|
|
||||||
#include "slic3r/GUI/GUI_Utils.hpp" // DPIFrame, DPIDialog, DPIAware<P>
|
|
||||||
|
|
||||||
#include <wx/window.h>
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
void addDPIProps(T* dpi, wxVector<wxInspector::PropertyDef>& props)
|
|
||||||
{
|
|
||||||
using namespace wxInspector;
|
|
||||||
|
|
||||||
props.push_back({"Scale Factor", "DPI Scaling", PropertyType::String,
|
|
||||||
wxString::Format("%.2f", dpi->scale_factor()), false, {},
|
|
||||||
[dpi]() { return wxString::Format("%.2f", dpi->scale_factor()); },
|
|
||||||
[dpi](const wxString& v) {
|
|
||||||
double val;
|
|
||||||
if (wxSscanf(v, "%lf", &val) != 1) return false;
|
|
||||||
dpi->set_scale_factor((float) val);
|
|
||||||
return true;
|
|
||||||
}});
|
|
||||||
|
|
||||||
props.push_back({"Prev Scale Factor", "DPI Scaling", PropertyType::String,
|
|
||||||
wxString::Format("%.2f", dpi->prev_scale_factor()), false, {},
|
|
||||||
[dpi]() { return wxString::Format("%.2f", dpi->prev_scale_factor()); },
|
|
||||||
[dpi](const wxString& v) {
|
|
||||||
double val;
|
|
||||||
if (wxSscanf(v, "%lf", &val) != 1) return false;
|
|
||||||
dpi->set_prev_scale_factor((float) val);
|
|
||||||
return true;
|
|
||||||
}});
|
|
||||||
|
|
||||||
props.push_back({"EM Unit", "DPI Scaling", PropertyType::Integer,
|
|
||||||
wxString::Format("%d", dpi->em_unit()), false, {},
|
|
||||||
[dpi]() { return wxString::Format("%d", dpi->em_unit()); },
|
|
||||||
[dpi](const wxString& v) {
|
|
||||||
long val;
|
|
||||||
if (!v.ToLong(&val)) return false;
|
|
||||||
dpi->set_em_unit((int) val);
|
|
||||||
return true;
|
|
||||||
}});
|
|
||||||
|
|
||||||
props.push_back({"Normal Font", "DPI Scaling", PropertyType::ReadOnly,
|
|
||||||
dpi->normal_font().GetNativeFontInfoDesc(), true, {},
|
|
||||||
[dpi]() { return dpi->normal_font().GetNativeFontInfoDesc(); },
|
|
||||||
nullptr});
|
|
||||||
|
|
||||||
props.push_back({"Force Rescale", "DPI Scaling", PropertyType::Boolean,
|
|
||||||
dpi->force_rescale() ? "true" : "false", true, {},
|
|
||||||
[dpi]() { return dpi->force_rescale() ? "true" : "false"; },
|
|
||||||
nullptr});
|
|
||||||
}
|
|
||||||
|
|
||||||
} // anonymous namespace
|
|
||||||
|
|
||||||
wxString DPIAwarePlugin::GetName() const
|
|
||||||
{
|
|
||||||
return "OrcaDPIAware";
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DPIAwarePlugin::CanProvideProperties(wxClassInfo* info)
|
|
||||||
{
|
|
||||||
return info->IsKindOf(CLASSINFO(wxWindow));
|
|
||||||
}
|
|
||||||
|
|
||||||
wxVector<wxInspector::PropertyDef> DPIAwarePlugin::GetProperties(
|
|
||||||
wxInspector::InspectableObject& obj)
|
|
||||||
{
|
|
||||||
wxVector<wxInspector::PropertyDef> props;
|
|
||||||
wxWindow* win = obj.AsWindow();
|
|
||||||
if (!win) return props;
|
|
||||||
|
|
||||||
if (auto* frame = dynamic_cast<DPIFrame*>(win)) {
|
|
||||||
addDPIProps(frame, props);
|
|
||||||
} else if (auto* dlg = dynamic_cast<DPIDialog*>(win)) {
|
|
||||||
addDPIProps(dlg, props);
|
|
||||||
}
|
|
||||||
|
|
||||||
return props;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] **Step 3: Commit**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git add src/slic3r/Utils/wxInspectorPlugins/DPIAwarePlugin.hpp src/slic3r/Utils/wxInspectorPlugins/DPIAwarePlugin.cpp
|
|
||||||
git commit -m "feat: add DPIAware wxInspector plugin
|
|
||||||
|
|
||||||
Exposes DPI scaling properties (scale_factor, prev_scale_factor,
|
|
||||||
em_unit, normal_font, force_rescale) on DPIFrame and DPIDialog
|
|
||||||
widgets. Uses dynamic_cast for detection and a template helper
|
|
||||||
to capture the correct static type for lambda accessors."
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Task 4: Create CustomWidgetsPlugin
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
- Create: `src/slic3r/Utils/wxInspectorPlugins/CustomWidgetsPlugin.hpp`
|
|
||||||
- Create: `src/slic3r/Utils/wxInspectorPlugins/CustomWidgetsPlugin.cpp`
|
|
||||||
|
|
||||||
**Interfaces:**
|
|
||||||
- Consumes: Task 1 (all widget getters), Task 2 (registration pattern)
|
|
||||||
- Produces: `class CustomWidgetsPlugin : public wxInspector::wxInspectorPlugin`
|
|
||||||
|
|
||||||
- [ ] **Step 1: Write CustomWidgetsPlugin.hpp**
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <wx/inspector/plugin.h>
|
|
||||||
|
|
||||||
class CustomWidgetsPlugin : public wxInspector::wxInspectorPlugin
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
wxString GetName() const override;
|
|
||||||
|
|
||||||
bool CanProvideProperties(wxClassInfo* info) override;
|
|
||||||
|
|
||||||
wxVector<wxInspector::PropertyDef> GetProperties(
|
|
||||||
wxInspector::InspectableObject& obj) override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
void addButtonProps(class Button* btn,
|
|
||||||
wxVector<wxInspector::PropertyDef>& props);
|
|
||||||
void addCheckBoxProps(class CheckBox* cb,
|
|
||||||
wxVector<wxInspector::PropertyDef>& props);
|
|
||||||
void addTextInputProps(class TextInput* ti,
|
|
||||||
wxVector<wxInspector::PropertyDef>& props);
|
|
||||||
void addSwitchButtonProps(class SwitchButton* sb,
|
|
||||||
wxVector<wxInspector::PropertyDef>& props);
|
|
||||||
void addProgressBarProps(class ProgressBar* pb,
|
|
||||||
wxVector<wxInspector::PropertyDef>& props);
|
|
||||||
void addLabelProps(class Label* lbl,
|
|
||||||
wxVector<wxInspector::PropertyDef>& props);
|
|
||||||
void addLabeledStaticBoxProps(class LabeledStaticBox* lsb,
|
|
||||||
wxVector<wxInspector::PropertyDef>& props);
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] **Step 2: Write CustomWidgetsPlugin.cpp — includes and GetName/CanProvideProperties**
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include "CustomWidgetsPlugin.hpp"
|
|
||||||
|
|
||||||
#include "slic3r/GUI/Widgets/Button.hpp"
|
|
||||||
#include "slic3r/GUI/Widgets/CheckBox.hpp"
|
|
||||||
#include "slic3r/GUI/Widgets/TextInput.hpp"
|
|
||||||
#include "slic3r/GUI/Widgets/SwitchButton.hpp"
|
|
||||||
#include "slic3r/GUI/Widgets/ProgressBar.hpp"
|
|
||||||
#include "slic3r/GUI/Widgets/Label.hpp"
|
|
||||||
#include "slic3r/GUI/Widgets/LabeledStaticBox.hpp"
|
|
||||||
|
|
||||||
#include <wx/window.h>
|
|
||||||
#include <wx/tglbtn.h>
|
|
||||||
|
|
||||||
wxString CustomWidgetsPlugin::GetName() const
|
|
||||||
{
|
|
||||||
return "OrcaCustomWidgets";
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CustomWidgetsPlugin::CanProvideProperties(wxClassInfo* info)
|
|
||||||
{
|
|
||||||
return info->IsKindOf(CLASSINFO(wxWindow));
|
|
||||||
}
|
|
||||||
|
|
||||||
wxVector<wxInspector::PropertyDef> CustomWidgetsPlugin::GetProperties(
|
|
||||||
wxInspector::InspectableObject& obj)
|
|
||||||
{
|
|
||||||
wxVector<wxInspector::PropertyDef> props;
|
|
||||||
wxWindow* win = obj.AsWindow();
|
|
||||||
if (!win) return props;
|
|
||||||
|
|
||||||
if (auto* btn = dynamic_cast<Button*>(win))
|
|
||||||
addButtonProps(btn, props);
|
|
||||||
if (auto* cb = dynamic_cast<CheckBox*>(win))
|
|
||||||
addCheckBoxProps(cb, props);
|
|
||||||
if (auto* ti = dynamic_cast<TextInput*>(win))
|
|
||||||
addTextInputProps(ti, props);
|
|
||||||
if (auto* sb = dynamic_cast<SwitchButton*>(win))
|
|
||||||
addSwitchButtonProps(sb, props);
|
|
||||||
if (auto* pb = dynamic_cast<ProgressBar*>(win))
|
|
||||||
addProgressBarProps(pb, props);
|
|
||||||
if (auto* lbl = dynamic_cast<Label*>(win))
|
|
||||||
addLabelProps(lbl, props);
|
|
||||||
if (auto* lsb = dynamic_cast<LabeledStaticBox*>(win))
|
|
||||||
addLabeledStaticBoxProps(lsb, props);
|
|
||||||
|
|
||||||
return props;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] **Step 3: Write CustomWidgetsPlugin.cpp — addButtonProps**
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
void CustomWidgetsPlugin::addButtonProps(Button* btn,
|
|
||||||
wxVector<wxInspector::PropertyDef>& props)
|
|
||||||
{
|
|
||||||
using namespace wxInspector;
|
|
||||||
|
|
||||||
wxVector<wxString> styleChoices;
|
|
||||||
styleChoices.push_back("Regular");
|
|
||||||
styleChoices.push_back("Confirm");
|
|
||||||
styleChoices.push_back("Alert");
|
|
||||||
styleChoices.push_back("Disabled");
|
|
||||||
|
|
||||||
auto styleToStr = [](ButtonStyle s) -> wxString {
|
|
||||||
switch (s) {
|
|
||||||
case ButtonStyle::Regular: return "Regular";
|
|
||||||
case ButtonStyle::Confirm: return "Confirm";
|
|
||||||
case ButtonStyle::Alert: return "Alert";
|
|
||||||
case ButtonStyle::Disabled: return "Disabled";
|
|
||||||
}
|
|
||||||
return "Regular";
|
|
||||||
};
|
|
||||||
|
|
||||||
props.push_back({"Button Style", "Orca Button", PropertyType::Choice,
|
|
||||||
styleToStr(btn->GetStyle()), false, styleChoices,
|
|
||||||
[btn, styleToStr]() { return styleToStr(btn->GetStyle()); },
|
|
||||||
[btn](const wxString& v) {
|
|
||||||
ButtonStyle s = ButtonStyle::Regular;
|
|
||||||
if (v == "Confirm") s = ButtonStyle::Confirm;
|
|
||||||
else if (v == "Alert") s = ButtonStyle::Alert;
|
|
||||||
else if (v == "Disabled") s = ButtonStyle::Disabled;
|
|
||||||
btn->SetStyle(s, btn->GetType());
|
|
||||||
return true;
|
|
||||||
}});
|
|
||||||
|
|
||||||
wxVector<wxString> typeChoices;
|
|
||||||
typeChoices.push_back("Compact");
|
|
||||||
typeChoices.push_back("Window");
|
|
||||||
typeChoices.push_back("Choice");
|
|
||||||
typeChoices.push_back("Parameter");
|
|
||||||
typeChoices.push_back("Icon");
|
|
||||||
typeChoices.push_back("Expanded");
|
|
||||||
|
|
||||||
auto typeToStr = [](ButtonType t) -> wxString {
|
|
||||||
switch (t) {
|
|
||||||
case ButtonType::Compact: return "Compact";
|
|
||||||
case ButtonType::Window: return "Window";
|
|
||||||
case ButtonType::Choice: return "Choice";
|
|
||||||
case ButtonType::Parameter: return "Parameter";
|
|
||||||
case ButtonType::Icon: return "Icon";
|
|
||||||
case ButtonType::Expanded: return "Expanded";
|
|
||||||
}
|
|
||||||
return "Compact";
|
|
||||||
};
|
|
||||||
|
|
||||||
props.push_back({"Button Type", "Orca Button", PropertyType::Choice,
|
|
||||||
typeToStr(btn->GetType()), false, typeChoices,
|
|
||||||
[btn, typeToStr]() { return typeToStr(btn->GetType()); },
|
|
||||||
[btn](const wxString& v) {
|
|
||||||
ButtonType t = ButtonType::Compact;
|
|
||||||
if (v == "Window") t = ButtonType::Window;
|
|
||||||
else if (v == "Choice") t = ButtonType::Choice;
|
|
||||||
else if (v == "Parameter") t = ButtonType::Parameter;
|
|
||||||
else if (v == "Icon") t = ButtonType::Icon;
|
|
||||||
else if (v == "Expanded") t = ButtonType::Expanded;
|
|
||||||
btn->SetStyle(btn->GetStyle(), t);
|
|
||||||
return true;
|
|
||||||
}});
|
|
||||||
|
|
||||||
props.push_back({"Selected", "Orca Button", PropertyType::Boolean,
|
|
||||||
btn->IsSelected() ? "true" : "false", false, {},
|
|
||||||
[btn]() { return btn->IsSelected() ? "true" : "false"; },
|
|
||||||
[btn](const wxString& v) {
|
|
||||||
btn->SetSelected(v == "true");
|
|
||||||
btn->Refresh();
|
|
||||||
return true;
|
|
||||||
}});
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] **Step 4: Write CustomWidgetsPlugin.cpp — addCheckBoxProps**
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
void CustomWidgetsPlugin::addCheckBoxProps(CheckBox* cb,
|
|
||||||
wxVector<wxInspector::PropertyDef>& props)
|
|
||||||
{
|
|
||||||
using namespace wxInspector;
|
|
||||||
|
|
||||||
props.push_back({"Half Checked", "Orca CheckBox", PropertyType::Boolean,
|
|
||||||
cb->IsHalfChecked() ? "true" : "false", false, {},
|
|
||||||
[cb]() { return cb->IsHalfChecked() ? "true" : "false"; },
|
|
||||||
[cb](const wxString& v) {
|
|
||||||
cb->SetHalfChecked(v == "true");
|
|
||||||
return true;
|
|
||||||
}});
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] **Step 5: Write CustomWidgetsPlugin.cpp — addTextInputProps**
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
void CustomWidgetsPlugin::addTextInputProps(TextInput* ti,
|
|
||||||
wxVector<wxInspector::PropertyDef>& props)
|
|
||||||
{
|
|
||||||
using namespace wxInspector;
|
|
||||||
|
|
||||||
props.push_back({"Label", "Orca TextInput", PropertyType::String,
|
|
||||||
ti->GetLabel(), false, {},
|
|
||||||
[ti]() { return ti->GetLabel(); },
|
|
||||||
[ti](const wxString& v) { ti->SetLabel(v); return true; }});
|
|
||||||
|
|
||||||
props.push_back({"Text Value", "Orca TextInput", PropertyType::String,
|
|
||||||
ti->GetTextCtrl()->GetValue(), false, {},
|
|
||||||
[ti]() { return ti->GetTextCtrl()->GetValue(); },
|
|
||||||
[ti](const wxString& v) { ti->GetTextCtrl()->SetValue(v); return true; }});
|
|
||||||
|
|
||||||
props.push_back({"Corner Radius", "Orca TextInput", PropertyType::Integer,
|
|
||||||
wxString::Format("%d", ti->GetCornerRadius()), false, {},
|
|
||||||
[ti]() { return wxString::Format("%d", ti->GetCornerRadius()); },
|
|
||||||
[ti](const wxString& v) {
|
|
||||||
long val;
|
|
||||||
if (!v.ToLong(&val)) return false;
|
|
||||||
ti->SetCornerRadius((double) val);
|
|
||||||
ti->Refresh();
|
|
||||||
return true;
|
|
||||||
}});
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] **Step 6: Write CustomWidgetsPlugin.cpp — addSwitchButtonProps**
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
void CustomWidgetsPlugin::addSwitchButtonProps(SwitchButton* sb,
|
|
||||||
wxVector<wxInspector::PropertyDef>& props)
|
|
||||||
{
|
|
||||||
using namespace wxInspector;
|
|
||||||
|
|
||||||
props.push_back({"Value", "Orca SwitchButton", PropertyType::Boolean,
|
|
||||||
sb->GetValue() ? "true" : "false", false, {},
|
|
||||||
[sb]() { return sb->GetValue() ? "true" : "false"; },
|
|
||||||
[sb](const wxString& v) {
|
|
||||||
sb->SetValue(v == "true");
|
|
||||||
return true;
|
|
||||||
}});
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
(Note: `GetValue()` and `SetValue()` are inherited from `wxBitmapToggleButton` → `wxToggleButton`.)
|
|
||||||
|
|
||||||
- [ ] **Step 7: Write CustomWidgetsPlugin.cpp — addProgressBarProps**
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
void CustomWidgetsPlugin::addProgressBarProps(ProgressBar* pb,
|
|
||||||
wxVector<wxInspector::PropertyDef>& props)
|
|
||||||
{
|
|
||||||
using namespace wxInspector;
|
|
||||||
|
|
||||||
props.push_back({"Proportion", "Orca ProgressBar", PropertyType::String,
|
|
||||||
wxString::Format("%.2f", pb->m_proportion), false, {},
|
|
||||||
[pb]() { return wxString::Format("%.2f", pb->m_proportion); },
|
|
||||||
[pb](const wxString& v) {
|
|
||||||
double val;
|
|
||||||
if (wxSscanf(v, "%lf", &val) != 1) return false;
|
|
||||||
pb->m_proportion = val;
|
|
||||||
pb->Refresh();
|
|
||||||
return true;
|
|
||||||
}});
|
|
||||||
|
|
||||||
props.push_back({"Show Number", "Orca ProgressBar", PropertyType::Boolean,
|
|
||||||
pb->m_shownumber ? "true" : "false", false, {},
|
|
||||||
[pb]() { return pb->m_shownumber ? "true" : "false"; },
|
|
||||||
[pb](const wxString& v) {
|
|
||||||
pb->m_shownumber = (v == "true");
|
|
||||||
pb->Refresh();
|
|
||||||
return true;
|
|
||||||
}});
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
(Note: `m_proportion` and `m_shownumber` are public members on `ProgressBar`.)
|
|
||||||
|
|
||||||
- [ ] **Step 8: Write CustomWidgetsPlugin.cpp — addLabelProps**
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
void CustomWidgetsPlugin::addLabelProps(Label* lbl,
|
|
||||||
wxVector<wxInspector::PropertyDef>& props)
|
|
||||||
{
|
|
||||||
using namespace wxInspector;
|
|
||||||
|
|
||||||
bool isHyperlink = (lbl->GetWindowStyleFlag() & 0x0020) != 0; // LB_HYPERLINK
|
|
||||||
|
|
||||||
props.push_back({"Is Hyperlink", "Orca Label", PropertyType::Boolean,
|
|
||||||
isHyperlink ? "true" : "false", true, {},
|
|
||||||
[lbl]() {
|
|
||||||
return (lbl->GetWindowStyleFlag() & 0x0020) ? "true" : "false";
|
|
||||||
},
|
|
||||||
nullptr});
|
|
||||||
|
|
||||||
props.push_back({"Font Point Size", "Orca Label", PropertyType::ReadOnly,
|
|
||||||
wxString::Format("%d", lbl->GetFont().GetPointSize()), true, {},
|
|
||||||
[lbl]() {
|
|
||||||
return wxString::Format("%d", lbl->GetFont().GetPointSize());
|
|
||||||
},
|
|
||||||
nullptr});
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] **Step 9: Write CustomWidgetsPlugin.cpp — addLabeledStaticBoxProps**
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
void CustomWidgetsPlugin::addLabeledStaticBoxProps(LabeledStaticBox* lsb,
|
|
||||||
wxVector<wxInspector::PropertyDef>& props)
|
|
||||||
{
|
|
||||||
using namespace wxInspector;
|
|
||||||
|
|
||||||
props.push_back({"Corner Radius", "LabeledStaticBox", PropertyType::Integer,
|
|
||||||
wxString::Format("%d", lsb->GetCornerRadius()), false, {},
|
|
||||||
[lsb]() { return wxString::Format("%d", lsb->GetCornerRadius()); },
|
|
||||||
[lsb](const wxString& v) {
|
|
||||||
long val;
|
|
||||||
if (!v.ToLong(&val)) return false;
|
|
||||||
lsb->SetCornerRadius((int) val);
|
|
||||||
return true;
|
|
||||||
}});
|
|
||||||
|
|
||||||
props.push_back({"Border Width", "LabeledStaticBox", PropertyType::Integer,
|
|
||||||
wxString::Format("%d", lsb->GetBorderWidth()), false, {},
|
|
||||||
[lsb]() { return wxString::Format("%d", lsb->GetBorderWidth()); },
|
|
||||||
[lsb](const wxString& v) {
|
|
||||||
long val;
|
|
||||||
if (!v.ToLong(&val)) return false;
|
|
||||||
lsb->SetBorderWidth((int) val);
|
|
||||||
return true;
|
|
||||||
}});
|
|
||||||
|
|
||||||
// Border Color: display as hex string
|
|
||||||
wxColour bc = lsb->GetBorderColor().colorForStates(0);
|
|
||||||
props.push_back({"Border Color", "LabeledStaticBox", PropertyType::String,
|
|
||||||
bc.GetAsString(wxC2S_HTML_SYNTAX), false, {},
|
|
||||||
[lsb]() {
|
|
||||||
return lsb->GetBorderColor()
|
|
||||||
.colorForStates(0)
|
|
||||||
.GetAsString(wxC2S_HTML_SYNTAX);
|
|
||||||
},
|
|
||||||
[lsb](const wxString& v) {
|
|
||||||
wxColour c(v);
|
|
||||||
if (!c.IsOk()) return false;
|
|
||||||
lsb->SetBorderColor(StateColor(c));
|
|
||||||
return true;
|
|
||||||
}});
|
|
||||||
|
|
||||||
props.push_back({"Scale", "LabeledStaticBox", PropertyType::ReadOnly,
|
|
||||||
wxString::Format("%.2f", lsb->GetScale()), true, {},
|
|
||||||
[lsb]() { return wxString::Format("%.2f", lsb->GetScale()); },
|
|
||||||
nullptr});
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] **Step 10: Commit**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git add src/slic3r/Utils/wxInspectorPlugins/CustomWidgetsPlugin.hpp src/slic3r/Utils/wxInspectorPlugins/CustomWidgetsPlugin.cpp
|
|
||||||
git commit -m "feat: add OrcaCustomWidgets wxInspector plugin
|
|
||||||
|
|
||||||
Exposes Orca-specific properties on 7 widget types:
|
|
||||||
- Button: Style, Type, Selected
|
|
||||||
- CheckBox: Half Checked
|
|
||||||
- TextInput: Label, Text Value, Corner Radius
|
|
||||||
- SwitchButton: Value
|
|
||||||
- ProgressBar: Proportion, Show Number
|
|
||||||
- Label: Is Hyperlink, Font Point Size
|
|
||||||
- LabeledStaticBox: Corner Radius, Border Width, Border Color, Scale
|
|
||||||
|
|
||||||
Each widget type uses dynamic_cast for safe detection."
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Task 5: Wire plugins into MainFrame and CMakeLists
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
- Modify: `src/slic3r/GUI/MainFrame.cpp` (add include + registration call)
|
|
||||||
- Modify: `src/slic3r/CMakeLists.txt` (add 4 source files)
|
|
||||||
|
|
||||||
**Interfaces:**
|
|
||||||
- Consumes: Tasks 1-4 (all plugins and registration helper)
|
|
||||||
- Produces: Registered plugins available at runtime, buildable project
|
|
||||||
|
|
||||||
- [ ] **Step 1: Add include in MainFrame.cpp**
|
|
||||||
|
|
||||||
After the existing includes (around line 30, near the other Utils includes), add:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include "slic3r/Utils/wxInspectorPlugins/Registration.hpp"
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] **Step 2: Add registration call in MainFrame constructor**
|
|
||||||
|
|
||||||
After `SetupInspectorAccelerator(this);` (currently line ~303), add:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
RegisterOrcaInspectorPlugins();
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] **Step 3: Add source files to CMakeLists.txt**
|
|
||||||
|
|
||||||
Find the `SLIC3R_GUI_SOURCES` list in `src/slic3r/CMakeLists.txt`. After the existing `Utils/*.cpp` entries (around line 650-754), add:
|
|
||||||
|
|
||||||
```cmake
|
|
||||||
Utils/wxInspectorPlugins/DPIAwarePlugin.hpp
|
|
||||||
Utils/wxInspectorPlugins/DPIAwarePlugin.cpp
|
|
||||||
Utils/wxInspectorPlugins/CustomWidgetsPlugin.hpp
|
|
||||||
Utils/wxInspectorPlugins/CustomWidgetsPlugin.cpp
|
|
||||||
Utils/wxInspectorPlugins/Registration.hpp
|
|
||||||
```
|
|
||||||
|
|
||||||
(Note: Add all 5 files — 2 .hpp + 2 .cpp + 1 Registration.hpp. wxWidgets cmake needs headers listed too for the resource system.)
|
|
||||||
|
|
||||||
- [ ] **Step 4: Commit**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git add src/slic3r/GUI/MainFrame.cpp src/slic3r/CMakeLists.txt
|
|
||||||
git commit -m "feat: wire wxInspector plugins into MainFrame and build
|
|
||||||
|
|
||||||
- Call RegisterOrcaInspectorPlugins() after SetupInspectorAccelerator
|
|
||||||
- Add all plugin source files to SLIC3R_GUI_SOURCES"
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Task 6: Build and verify
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
- None modified (verification only)
|
|
||||||
|
|
||||||
- [ ] **Step 1: Configure the build**
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
$cmakePath = "D:\VisualStudio\2026\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe"
|
|
||||||
& $cmakePath --build . --config Debug --target ALL_BUILD -- -m
|
|
||||||
```
|
|
||||||
|
|
||||||
Expected: Build succeeds with zero errors and zero warnings from our new files.
|
|
||||||
|
|
||||||
- [ ] **Step 2: Fix any compilation errors**
|
|
||||||
|
|
||||||
If the build fails:
|
|
||||||
- Check that `#include` paths resolve (the `slic3r/GUI/…` relative paths use `src/` as the include root — verify this is set up in CMake via `include_directories`)
|
|
||||||
- Check that `ButtonStyle` and `ButtonType` enums are visible (they're defined in `Button.hpp`)
|
|
||||||
- Check that `StateColor` constructor from `wxColour` is valid (it has `StateColor(wxColour const&)`)
|
|
||||||
- Check that `LabeledStaticBox::GetBorderColor()` returns by value (StateColor copy is fine)
|
|
||||||
- On macOS: static box margin removal call needs `#ifdef __WXOSX__` guard
|
|
||||||
|
|
||||||
- [ ] **Step 3: Launch OrcaSlicer and verify inspector**
|
|
||||||
|
|
||||||
Launch the built OrcaSlicer, press Ctrl+Shift+I to open the inspector:
|
|
||||||
1. Select the MainFrame in the tree — verify "DPI Scaling" category appears with Scale Factor, Prev Scale Factor, EM Unit, Normal Font, Force Rescale
|
|
||||||
2. Select an Orca Button — verify "Orca Button" category appears
|
|
||||||
3. Select an Orca CheckBox — verify "Orca CheckBox" category appears
|
|
||||||
4. Edit a property value (e.g., Scale Factor) — verify the setter applies correctly
|
|
||||||
5. Select a LabeledStaticBox — verify corner radius, border width, border color, scale appear
|
|
||||||
|
|
||||||
- [ ] **Step 5: Commit (if fixes were needed) or mark complete**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git status
|
|
||||||
```
|
|
||||||
|
|
||||||
If clean: verification complete. If changes were made: `git add` and commit with fix message.
|
|
||||||
@@ -1,102 +0,0 @@
|
|||||||
# Move `wxInspectable` into `DPIAware` — Design Spec
|
|
||||||
|
|
||||||
Date: 2026-07-23
|
|
||||||
Branch: `dev/layout-inspector`
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
Move the `wxInspector::wxInspectable` base class from individual leaf classes (`DPIDialog`, `MainFrame`) into the common `DPIAware<P>` template. This makes every DPIAware widget automatically visible in the inspector tree without requiring each subclass to opt in.
|
|
||||||
|
|
||||||
## Motivation
|
|
||||||
|
|
||||||
Currently, only `DPIDialog` and `MainFrame` explicitly inherit `wxInspectable`. `DPIFrame` (which `MainFrame` inherits from) does not — `MainFrame` adds it manually. This means:
|
|
||||||
|
|
||||||
- Any `DPIAware<T>` widget that isn't `DPIDialog` or `MainFrame` is invisible in the inspector tree
|
|
||||||
- `DPIFrame` subclasses (`BaseTransparentDPIFrame`, `ImageDPIFrame`, `ModelMallDialog`, `MediaFileFrame`, `SecondaryCheckDialog`, `PrintErrorDialog`, etc.) don't appear
|
|
||||||
- Adding a new DPIAware widget type requires remembering to also inherit `wxInspectable`
|
|
||||||
|
|
||||||
Moving `wxInspectable` to `DPIAware` fixes this for all current and future DPIAware widgets at once.
|
|
||||||
|
|
||||||
## Design
|
|
||||||
|
|
||||||
### Change 1: `GUI_Utils.hpp` — `DPIAware<P>`
|
|
||||||
|
|
||||||
Add `wxInspector::wxInspectable` as a second base class, and call `SetupInspectorAccelerator(this)` in the constructor (after `this->CenterOnParent()`):
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
// Before:
|
|
||||||
template<class P> class DPIAware : public P
|
|
||||||
|
|
||||||
// After:
|
|
||||||
template<class P> class DPIAware : public P, public wxInspector::wxInspectable
|
|
||||||
```
|
|
||||||
|
|
||||||
Add in the constructor body (after `this->CenterOnParent()` at line 110):
|
|
||||||
```cpp
|
|
||||||
SetupInspectorAccelerator(this);
|
|
||||||
```
|
|
||||||
|
|
||||||
This gives every `DPIAware<T>` widget both inspectability and the Ctrl+Shift+I keyboard shortcut automatically. `#include <wx/inspector/inspector.h>` is already present in the file.
|
|
||||||
|
|
||||||
### Change 2: `GUI_Utils.hpp` — `DPIDialog`
|
|
||||||
|
|
||||||
Remove the now-redundant `wxInspector::wxInspectable` and the `SetupInspectorAccelerator(this)` call:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
// Before:
|
|
||||||
class DPIDialog : public DPIAware<wxDialog>, public wxInspector::wxInspectable
|
|
||||||
// ...
|
|
||||||
SetupInspectorAccelerator(this);
|
|
||||||
|
|
||||||
// After:
|
|
||||||
class DPIDialog : public DPIAware<wxDialog>
|
|
||||||
// (SetupInspectorAccelerator call removed — now done in DPIAware constructor)
|
|
||||||
```
|
|
||||||
|
|
||||||
`DPIDialog` gets `wxInspectable` and the accelerator through `DPIAware<wxDialog>` now.
|
|
||||||
|
|
||||||
### Change 3: `MainFrame.hpp` — `MainFrame`
|
|
||||||
|
|
||||||
Remove the now-redundant `wxInspector::wxInspectable`:
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
// Before:
|
|
||||||
class MainFrame : public DPIFrame, public wxInspector::wxInspectable
|
|
||||||
|
|
||||||
// After:
|
|
||||||
class MainFrame : public DPIFrame
|
|
||||||
```
|
|
||||||
|
|
||||||
`MainFrame` gets `wxInspectable` through `DPIFrame` → `DPIAware<wxFrame>`.
|
|
||||||
|
|
||||||
### Change 4: `MainFrame.cpp` — `MainFrame` constructor
|
|
||||||
|
|
||||||
Remove the now-redundant `SetupInspectorAccelerator(this)` call (line 304). It will be called automatically by the `DPIAware` constructor.
|
|
||||||
|
|
||||||
## Impact
|
|
||||||
|
|
||||||
| Widget | Before | After |
|
|
||||||
|--------|--------|-------|
|
|
||||||
| `DPIDialog` subclasses (~80) | ✓ inspectable | ✓ inspectable (transitive) |
|
|
||||||
| `MainFrame` | ✓ inspectable | ✓ inspectable (transitive) |
|
|
||||||
| `DPIFrame` subclasses (8 others) | ✗ invisible | ✓ inspectable |
|
|
||||||
| Future `DPIAware<T>` | ✗ invisible | ✓ inspectable |
|
|
||||||
|
|
||||||
## Files Modified
|
|
||||||
|
|
||||||
| File | Change |
|
|
||||||
|------|--------|
|
|
||||||
| `src/slic3r/GUI/GUI_Utils.hpp` | `DPIAware<P>` gains `wxInspector::wxInspectable` + `SetupInspectorAccelerator(this)` call; `DPIDialog` drops redundant `wxInspector::wxInspectable` and `SetupInspectorAccelerator(this)` |
|
|
||||||
| `src/slic3r/GUI/MainFrame.hpp` | `MainFrame` drops redundant `wxInspector::wxInspectable` |
|
|
||||||
| `src/slic3r/GUI/MainFrame.cpp` | Remove redundant `SetupInspectorAccelerator(this)` from MainFrame constructor |
|
|
||||||
|
|
||||||
## Non-Goals
|
|
||||||
|
|
||||||
- The `DPIAwarePlugin` detection logic (`dynamic_cast<DPIFrame*>` / `dynamic_cast<DPIDialog*>`) is unchanged
|
|
||||||
- No new DPI properties — this is purely about tree visibility and accelerator setup
|
|
||||||
|
|
||||||
## Risk Assessment
|
|
||||||
|
|
||||||
- **Multiple inheritance**: `DPIAware<P>` already has a vtable (virtual destructor). Adding `wxInspectable` adds a second base but no additional data members. The `wxInspector::wxInspectable` class is expected to be a lightweight marker interface.
|
|
||||||
- **Build**: No new includes needed; `<wx/inspector/inspector.h>` is already included in `GUI_Utils.hpp`.
|
|
||||||
- **Cross-platform**: The change is standard C++ multiple inheritance — no platform-specific concerns.
|
|
||||||
@@ -1,244 +0,0 @@
|
|||||||
# wxInspector Plugins for OrcaSlicer Custom Controls — Design Spec
|
|
||||||
|
|
||||||
Date: 2026-07-23
|
|
||||||
Branch: `dev/layout-inspector`
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
Create wxInspector plugins that expose OrcaSlicer's custom widget properties in the inspector's property grid. Without these plugins, the inspector shows only generic wxWidgets properties — missing all DPI-awareness data, custom styling, and Orca-specific control state.
|
|
||||||
|
|
||||||
## Goals
|
|
||||||
|
|
||||||
1. **DPIAware properties** — Inspect and update `scale_factor`, `prev_scale_factor`, `em_unit`, and `normal_font` on any DPIAware-derived widget
|
|
||||||
2. **Custom widget properties** — Surface Orca-specific properties on `Button`, `CheckBox`, `TextInput`, `SwitchButton`, `ProgressBar`, `Label`, and `LabeledStaticBox`
|
|
||||||
3. **Minimal source changes** — Only add trivial (one-line) getters/setters to existing classes; no architectural refactoring of Orca's widget hierarchy
|
|
||||||
|
|
||||||
## Non-Goals
|
|
||||||
|
|
||||||
- Custom inspector panels or AUI tabs (use the existing property grid and method invoker)
|
|
||||||
- Python-plugin integration (this is C++ wxInspector, not Orca's Python plugin system)
|
|
||||||
- Event logging customization (the built-in event logger already works)
|
|
||||||
|
|
||||||
## Architecture
|
|
||||||
|
|
||||||
### Two Plugins
|
|
||||||
|
|
||||||
| Plugin | Class | Files |
|
|
||||||
|--------|-------|-------|
|
|
||||||
| DPIAware plugin | `DPIAwarePlugin` | `DPIAwarePlugin.hpp`, `DPIAwarePlugin.cpp` |
|
|
||||||
| Custom widgets plugin | `CustomWidgetsPlugin` | `CustomWidgetsPlugin.hpp`, `CustomWidgetsPlugin.cpp` |
|
|
||||||
| Registration helper | inline function | `Registration.hpp` |
|
|
||||||
|
|
||||||
All files live under `src/slic3r/Utils/wxInspectorPlugins/`.
|
|
||||||
|
|
||||||
### Plugin Detection Strategy
|
|
||||||
|
|
||||||
**DPIAware plugin**: Uses `dynamic_cast<DPIFrame*>` and `dynamic_cast<DPIDialog*>` as detection gates. `DPIFrame` = `DPIAware<wxFrame>`, `DPIDialog` = `DPIAware<wxDialog>`. Since these are concrete typedefs, `dynamic_cast` works at runtime. This covers `MainFrame`, `SettingsDialog`, and all 8 calibration dialogs (which inherit `DPIDialog`).
|
|
||||||
|
|
||||||
**Custom widgets plugin**: Gates broadly on `CLASSINFO(wxWindow)`, then uses per-type `dynamic_cast` inside `GetProperties` to check each Orca-specific type. Only matching types append properties.
|
|
||||||
|
|
||||||
### Registration
|
|
||||||
|
|
||||||
A single `RegisterOrcaInspectorPlugins()` inline function in `Registration.hpp` creates both plugins as function-local statics (matching the wxInspector built-in provider pattern) and registers them via `wxInspector::RegisterPlugin()`.
|
|
||||||
|
|
||||||
Called once from `MainFrame::MainFrame()` after `SetupInspectorAccelerator(this)`.
|
|
||||||
|
|
||||||
### Why Separate Plugins?
|
|
||||||
|
|
||||||
- DPIAware is a C++ template concept (not a wxClassInfo-isKindOf check), so it needs its own detection logic
|
|
||||||
- Custom widgets use standard wxClassInfo-based detection, matching the built-in provider pattern
|
|
||||||
- Two focused files are easier to review and maintain than one monolithic plugin
|
|
||||||
- Compile-time failure isolation: if a widget header changes, only one plugin breaks
|
|
||||||
|
|
||||||
## DPIAware Plugin — Property Specification
|
|
||||||
|
|
||||||
### Source Changes (GUI_Utils.hpp)
|
|
||||||
|
|
||||||
Four one-liner methods added to the `DPIAware<P>` template class (public section):
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
float scale_factor() const { return m_scale_factor; } // already exists
|
|
||||||
float prev_scale_factor() const { return m_prev_scale_factor; } // already exists
|
|
||||||
int em_unit() const { return m_em_unit; } // already exists
|
|
||||||
void set_scale_factor(float v) { m_scale_factor = v; } // NEW
|
|
||||||
void set_prev_scale_factor(float v) { m_prev_scale_factor = v; } // NEW
|
|
||||||
void set_em_unit(int v) { m_em_unit = v; } // NEW
|
|
||||||
bool force_rescale() const { return m_force_rescale; } // NEW
|
|
||||||
// m_normal_font getter already exists: normal_font()
|
|
||||||
```
|
|
||||||
|
|
||||||
### Detection
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
bool CanProvideProperties(wxClassInfo* info) override {
|
|
||||||
// Gated in GetProperties via dynamic_cast on the window itself
|
|
||||||
return info->IsKindOf(CLASSINFO(wxWindow));
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
In `GetProperties`:
|
|
||||||
```cpp
|
|
||||||
auto* win = obj.AsWindow();
|
|
||||||
bool isDPI = dynamic_cast<DPIFrame*>(win) || dynamic_cast<DPIDialog*>(win);
|
|
||||||
if (!isDPI) return props;
|
|
||||||
```
|
|
||||||
|
|
||||||
### Property Table (category: "DPI Scaling")
|
|
||||||
|
|
||||||
| Name | Type | Editable | Getter | Setter |
|
|
||||||
|------|------|----------|--------|--------|
|
|
||||||
| Scale Factor | String (float) | Yes | `dpi->scale_factor()` | `dpi->set_scale_factor(v)` |
|
|
||||||
| Prev Scale Factor | String (float) | Yes | `dpi->prev_scale_factor()` | `dpi->set_prev_scale_factor(v)` |
|
|
||||||
| EM Unit | Integer | Yes | `dpi->em_unit()` | `dpi->set_em_unit(v)` |
|
|
||||||
| Normal Font | ReadOnly | No | `dpi->normal_font().GetNativeFontInfoDesc()` | — |
|
|
||||||
| Force Rescale | Boolean (ReadOnly) | No | `dpi->force_rescale()` | — |
|
|
||||||
|
|
||||||
**Note on setters**: The setters simply store values. They do NOT trigger a widget rescale/layout. To see the effect of a changed scale factor, use the inspector's Methods panel to call `Layout()` or resize the window — which triggers the DPI_CHANGED event path naturally.
|
|
||||||
|
|
||||||
## Custom Widgets Plugin — Property Specification
|
|
||||||
|
|
||||||
All properties are appended to the built-in wxWindow properties. Each widget type is independently detected via `dynamic_cast`.
|
|
||||||
|
|
||||||
### Detection gates (in `GetProperties`)
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
auto* win = obj.AsWindow();
|
|
||||||
if (auto* btn = dynamic_cast<Button*>(win)) { addButtonProperties(btn, props); }
|
|
||||||
if (auto* cb = dynamic_cast<CheckBox*>(win)) { addCheckBoxProperties(cb, props); }
|
|
||||||
if (auto* ti = dynamic_cast<TextInput*>(win)) { addTextInputProperties(ti, props); }
|
|
||||||
if (auto* sb = dynamic_cast<SwitchButton*>(win)) { addSwitchButtonProperties(sb, props); }
|
|
||||||
if (auto* pb = dynamic_cast<ProgressBar*>(win)) { addProgressBarProperties(pb, props); }
|
|
||||||
if (auto* lbl = dynamic_cast<Label*>(win)) { addLabelProperties(lbl, props); }
|
|
||||||
if (auto* lsb = dynamic_cast<LabeledStaticBox*>(win)) { addLabeledStaticBoxProperties(lsb, props); }
|
|
||||||
```
|
|
||||||
|
|
||||||
### Orca Button (`Button`) — category: "Orca Button"
|
|
||||||
|
|
||||||
| Name | Type | Editable | Getter | Setter |
|
|
||||||
|------|------|----------|--------|--------|
|
|
||||||
| Button Style | Choice | Yes | enum→string | string→enum |
|
|
||||||
| Button Type | Choice | Yes | enum→string | string→enum |
|
|
||||||
| Selected | Boolean | Yes | `m_selected` (needs getter) | `SetSelected(v)` |
|
|
||||||
| Active Icon | ReadOnly | No | icon name string | — |
|
|
||||||
| Inactive Icon | ReadOnly | No | icon name string | — |
|
|
||||||
|
|
||||||
Choices for Button Style: `Regular`, `Confirm`, `Alert`, `Disabled`
|
|
||||||
Choices for Button Type: `Compact`, `Window`, `Choice`, `Parameter`, `Icon`, `Expanded`
|
|
||||||
|
|
||||||
**Source changes needed**: Button's `m_selected` is private. Add one-liner getter:
|
|
||||||
```cpp
|
|
||||||
bool IsSelected() const { return m_selected; }
|
|
||||||
```
|
|
||||||
|
|
||||||
### Orca CheckBox (`CheckBox`) — category: "Orca CheckBox"
|
|
||||||
|
|
||||||
| Name | Type | Editable | Getter | Setter |
|
|
||||||
|------|------|----------|--------|--------|
|
|
||||||
| Half Checked | Boolean | Yes | `m_half_checked` (needs getter) | `SetHalfChecked(v)` |
|
|
||||||
|
|
||||||
**Source changes needed**: `m_half_checked` is private. Add one-liner getter:
|
|
||||||
```cpp
|
|
||||||
bool IsHalfChecked() const { return m_half_checked; }
|
|
||||||
```
|
|
||||||
|
|
||||||
### Orca TextInput (`TextInput`) — category: "Orca TextInput"
|
|
||||||
|
|
||||||
| Name | Type | Editable | Getter | Setter |
|
|
||||||
|------|------|----------|--------|--------|
|
|
||||||
| Label | String | Yes | `GetLabel()` (inherited from wxWindow) | `SetLabel(v)` (exists) |
|
|
||||||
| Text Value | String | Yes | `GetTextCtrl()->GetValue()` (GetTextCtrl is public) | `GetTextCtrl()->SetValue(v)` |
|
|
||||||
| Corner Radius | Integer | Yes | `GetCornerRadius()` (NEW) | `SetCornerRadius(v)` (exists) |
|
|
||||||
|
|
||||||
**Source changes needed**: Add one getter to `TextInput`:
|
|
||||||
```cpp
|
|
||||||
int GetCornerRadius() const { return static_cast<int>(radius); }
|
|
||||||
```
|
|
||||||
(`radius` is inherited from StaticBox. `SetCornerRadius(double)` already exists. `GetTextCtrl()` is already public.)
|
|
||||||
|
|
||||||
### Orca SwitchButton (`SwitchButton`) — category: "Orca SwitchButton"
|
|
||||||
|
|
||||||
| Name | Type | Editable | Getter | Setter |
|
|
||||||
|------|------|----------|--------|--------|
|
|
||||||
| Value | Boolean | Yes | existing getter | existing setter |
|
|
||||||
|
|
||||||
### Orca ProgressBar (`ProgressBar`) — category: "Orca ProgressBar"
|
|
||||||
|
|
||||||
| Name | Type | Editable | Getter | Setter |
|
|
||||||
|------|------|----------|--------|--------|
|
|
||||||
| Proportion | Float (0-1) | Yes | `pb->m_proportion` (public member) | `pb->m_proportion = v` |
|
|
||||||
| Show Number | Boolean | Yes | `pb->m_shownumber` (public member) | `pb->m_shownumber = v` |
|
|
||||||
|
|
||||||
**No source changes needed**: `m_proportion` and `m_shownumber` are already public members. `SetValue(int)` and `SetProgress(int)` already exist as public methods.
|
|
||||||
|
|
||||||
### Orca Label (`Label`) — category: "Orca Label"
|
|
||||||
|
|
||||||
| Name | Type | Editable | Getter | Setter |
|
|
||||||
|------|------|----------|--------|--------|
|
|
||||||
| Is Hyperlink | Boolean | No | existing flag check | — |
|
|
||||||
| Font Size | ReadOnly | No | `GetFont().GetPointSize()` | — |
|
|
||||||
|
|
||||||
### LabeledStaticBox — category: "LabeledStaticBox"
|
|
||||||
|
|
||||||
| Name | Type | Editable | Getter | Setter |
|
|
||||||
|------|------|----------|--------|--------|
|
|
||||||
| Corner Radius | Integer | Yes | `GetCornerRadius()` (NEW) | `SetCornerRadius(v)` (exists) |
|
|
||||||
| Border Width | Integer | Yes | `GetBorderWidth()` (NEW) | `SetBorderWidth(v)` (exists) |
|
|
||||||
| Border Color | String (hex) | Yes | `GetBorderColor()` (NEW) | `SetBorderColor(v)` (exists) |
|
|
||||||
| Scale | Float (ReadOnly) | No | `m_scale` (protected, needs getter) | — |
|
|
||||||
|
|
||||||
**Source changes needed**: Four one-liner getters added to `LabeledStaticBox`:
|
|
||||||
```cpp
|
|
||||||
int GetCornerRadius() const { return m_radius; }
|
|
||||||
int GetBorderWidth() const { return m_border_width; }
|
|
||||||
StateColor GetBorderColor() const { return border_color; }
|
|
||||||
float GetScale() const { return m_scale; }
|
|
||||||
```
|
|
||||||
|
|
||||||
## Files Modified (Existing Code)
|
|
||||||
|
|
||||||
| File | Changes |
|
|
||||||
|------|---------|
|
|
||||||
| `src/slic3r/GUI/GUI_Utils.hpp` | +4 methods in `DPIAware<P>`: `set_scale_factor()`, `set_prev_scale_factor()`, `set_em_unit()`, `force_rescale()` |
|
|
||||||
| `src/slic3r/GUI/Widgets/LabeledStaticBox.hpp` | +4 getter declarations: `GetCornerRadius()`, `GetBorderWidth()`, `GetBorderColor()`, `GetScale()` |
|
|
||||||
| `src/slic3r/GUI/Widgets/LabeledStaticBox.cpp` | +4 getter implementations |
|
|
||||||
| `src/slic3r/GUI/Widgets/Button.hpp` | +1 getter: `IsSelected()` |
|
|
||||||
| `src/slic3r/GUI/Widgets/CheckBox.hpp` | +1 getter: `IsHalfChecked()` |
|
|
||||||
| `src/slic3r/GUI/Widgets/TextInput.hpp` | +1 getter: `GetCornerRadius()` |
|
|
||||||
| `src/slic3r/GUI/Widgets/ProgressBar.hpp` | None (public members are used directly) |
|
|
||||||
| `src/slic3r/GUI/MainFrame.cpp` | +1 `#include`, +1 call to `RegisterOrcaInspectorPlugins()` |
|
|
||||||
| `src/slic3r/CMakeLists.txt` | +4 entries in `SLIC3R_GUI_SOURCES` (the .cpp plugin files) |
|
|
||||||
|
|
||||||
## Files Created
|
|
||||||
|
|
||||||
```
|
|
||||||
src/slic3r/Utils/wxInspectorPlugins/
|
|
||||||
├── DPIAwarePlugin.hpp
|
|
||||||
├── DPIAwarePlugin.cpp
|
|
||||||
├── CustomWidgetsPlugin.hpp
|
|
||||||
├── CustomWidgetsPlugin.cpp
|
|
||||||
└── Registration.hpp
|
|
||||||
```
|
|
||||||
|
|
||||||
## Build & Linking
|
|
||||||
|
|
||||||
The `wxInspector` dependency is already wired:
|
|
||||||
- `deps/wxInspector/wxInspector.cmake` fetches and builds wxInspector
|
|
||||||
- `src/CMakeLists.txt` lines 92-93 link `wxInspector::wxInspector` into `wxWidgets_LIBRARIES`
|
|
||||||
- The plugin files only need `#include <wx/inspector/plugin.h>` and `#include <wx/inspector/inspector.h>` — both available from the installed dependency
|
|
||||||
|
|
||||||
No new CMake dependencies needed. Only the new source files need listing in `SLIC3R_GUI_SOURCES`.
|
|
||||||
|
|
||||||
## Error Handling & Edge Cases
|
|
||||||
|
|
||||||
- **Stale pointers**: Plugin lambdas capture raw pointers, regenerated on every `GetProperties` call (matching wxInspector's built-in provider pattern). Pointers live only until the next tree selection.
|
|
||||||
- **Widget destruction**: If a widget is destroyed while the inspector is showing its properties, `InspectableObject::IsValid()` returns false and properties are not displayed. The inspector won't show stale data.
|
|
||||||
- **Invalid property values**: Setters use `sscanf` / `ToLong` with validation (matching built-in patterns). Bogus input is rejected — setter returns `false`, property grid shows error state.
|
|
||||||
- **DPI drift**: Setting `scale_factor` without triggering rescale means displayed sizes don't match the new factor. This is acceptable — the inspector is a developer tool; operators know to call `Layout()` after making changes.
|
|
||||||
- **Missing widget type**: If a `dynamic_cast` fails for all types, only built-in wxWindow properties are shown. No crash, no error — just reduced info.
|
|
||||||
|
|
||||||
## Future Work (Out of Scope)
|
|
||||||
|
|
||||||
- **StateColor visualization**: `StateColor` is a multi-value type (maps bitmask states to colors). A full solution would need a custom property editor (e.g., a table showing each state→color pair). Keep it simple for now.
|
|
||||||
- **ScalableBitmap display**: Could show the bitmap as an inline thumbnail. Complex property editor work — deferred.
|
|
||||||
- **More widget types**: `SwitchBoard`, `MultiSwitchButton`, `StepCtrl`, `FanControl`, `DropDown`, `ComboBox`, `AMS*` widgets could all benefit. Add as needed.
|
|
||||||
- **Property refresh on tree selection**: Currently properties are static snapshots. A "refresh" button or auto-poll could keep values current for rapidly-changing widgets (progress bars, etc.). The built-in wxInspector already provides a tree-refresh button.
|
|
||||||
@@ -8,7 +8,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2026-07-29 17:40-0300\n"
|
"POT-Creation-Date: 2026-09-03 10:27+0800\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@@ -2293,8 +2293,6 @@ msgstr ""
|
|||||||
msgid "%s has been removed."
|
msgid "%s has been removed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Switching application language"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Select the language"
|
msgid "Select the language"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -2762,6 +2760,9 @@ msgstr ""
|
|||||||
msgid "Merge with"
|
msgid "Merge with"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Decompose Color"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Delete this filament"
|
msgid "Delete this filament"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -3039,6 +3040,9 @@ msgstr ""
|
|||||||
msgid "Merge parts to an object"
|
msgid "Merge parts to an object"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Using variable layer height together with mixed color sublayer may result in poor color mixing quality."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Add layers"
|
msgid "Add layers"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -4452,6 +4456,20 @@ msgstr ""
|
|||||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#, possible-c-format, possible-boost-format
|
||||||
|
msgid "Layer height is too small. It will be set to the minimum (%g mm)."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Layer height is outside the limits set in Printer Settings -> Extruder -> Layer height limits, this may cause printing quality issues."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#, possible-c-format, possible-boost-format
|
||||||
|
msgid "Adjust it to the limit (%g mm) automatically?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Adjust"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Layer height too small\n"
|
"Layer height too small\n"
|
||||||
"It has been reset to 0.2"
|
"It has been reset to 0.2"
|
||||||
@@ -4483,7 +4501,7 @@ msgid ""
|
|||||||
"The value will be reset to 0."
|
"The value will be reset to 0."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Alternate extra wall does't work well when ensure vertical shell thickness is set to All."
|
msgid "Alternate extra wall doesn't work well when ensure vertical shell thickness is set to All."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -4514,13 +4532,13 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"seam_slope_start_height need to be smaller than layer_height.\n"
|
"seam_slope_start_height needs to be smaller than layer_height.\n"
|
||||||
"Reset to 0."
|
"Reset to 0."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, no-c-format, no-boost-format
|
#, no-c-format, no-boost-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Lock depth should smaller than skin depth.\n"
|
"Lock depth should be smaller than skin depth.\n"
|
||||||
"Reset to 50% of skin depth."
|
"Reset to 50% of skin depth."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -4533,6 +4551,12 @@ msgid ""
|
|||||||
"No - Disable Arachne Wall Generator and set [Displacement] mode of the Fuzzy Skin"
|
"No - Disable Arachne Wall Generator and set [Displacement] mode of the Fuzzy Skin"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Brim ear radius"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Brim width"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Spiral mode only works when wall loops is 1, support is disabled, clumping detection by probing is disabled, top shell layers is 0, sparse infill density is 0 and timelapse type is traditional."
|
msgid "Spiral mode only works when wall loops is 1, support is disabled, clumping detection by probing is disabled, top shell layers is 0, sparse infill density is 0 and timelapse type is traditional."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -4545,6 +4569,9 @@ msgid ""
|
|||||||
"No - Cancel enabling spiral mode"
|
"No - Cancel enabling spiral mode"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "N/A"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Printing"
|
msgid "Printing"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -4784,6 +4811,12 @@ msgstr ""
|
|||||||
msgid "Calibration error"
|
msgid "Calibration error"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "This printer is not configured with the hardware this control needs."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "This control is not supported on this printer."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Network unavailable"
|
msgid "Network unavailable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -4962,9 +4995,7 @@ msgstr ""
|
|||||||
|
|
||||||
#, possible-c-format, possible-boost-format
|
#, possible-c-format, possible-boost-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Is it %s%% or %s %s?\n"
|
"Is it %s%% or %s %s?"
|
||||||
"YES for %s%%, \n"
|
|
||||||
"NO for %s %s."
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, possible-boost-format
|
#, possible-boost-format
|
||||||
@@ -4987,9 +5018,6 @@ msgstr ""
|
|||||||
msgid "Invalid format. Expected vector format: \"%1%\""
|
msgid "Invalid format. Expected vector format: \"%1%\""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "N/A"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "System agents"
|
msgid "System agents"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -5615,7 +5643,7 @@ msgstr ""
|
|||||||
msgid "Size:"
|
msgid "Size:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, possible-c-format, possible-boost-format
|
#, possible-boost-format
|
||||||
msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)."
|
msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -5790,6 +5818,9 @@ msgstr ""
|
|||||||
msgid "Project"
|
msgid "Project"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Device (Web)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Yes"
|
msgid "Yes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -5916,16 +5947,22 @@ msgstr ""
|
|||||||
msgid "Save current project as"
|
msgid "Save current project as"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish 3MF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Export a 3MF file with the selected settings embedded"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
|
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Load a model"
|
msgid "Load a model"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Import Zip Archive"
|
msgid "Import ZIP Archive"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Load models contained within a zip archive"
|
msgid "Load models contained within a ZIP archive"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Import Configs"
|
msgid "Import Configs"
|
||||||
@@ -7374,6 +7411,9 @@ msgstr ""
|
|||||||
msgid "The %s nozzle can not print %s."
|
msgid "The %s nozzle can not print %s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Printing mixed-color filament on a single-extruder printer requires frequent filament changes and flushing, which may significantly increase waste and the risk of nozzle / waste-chute clogging."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, possible-boost-format
|
#, possible-boost-format
|
||||||
msgid "Mixing %1% with %2% in printing is not recommended.\n"
|
msgid "Mixing %1% with %2% in printing is not recommended.\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -7494,12 +7534,36 @@ msgstr ""
|
|||||||
msgid "Set filaments to use"
|
msgid "Set filaments to use"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Add Mixed Filament"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed Filament"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Remove last mixed filament"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Add mixed filament"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament has invalid or mismatched components. Please re-edit affected entries."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Search plate, object and part."
|
msgid "Search plate, object and part."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Pellets"
|
msgid "Pellets"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament has broken component references"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Edit / Delete / Merge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, possible-c-format, possible-boost-format
|
#, possible-c-format, possible-boost-format
|
||||||
msgid "After completing your operation, %s project will be closed and create a new project."
|
msgid "After completing your operation, %s project will be closed and create a new project."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -7634,7 +7698,13 @@ msgstr ""
|
|||||||
msgid "Customized Preset"
|
msgid "Customized Preset"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Component name(s) inside step file not in UTF8 format!"
|
msgid "Some published settings could not be applied:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Some filament slots were changed:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Component name(s) inside step file not in UTF-8 format!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Because of unsupported text encoding, garbage characters may appear!"
|
msgid "Because of unsupported text encoding, garbage characters may appear!"
|
||||||
@@ -7656,7 +7726,7 @@ msgstr ""
|
|||||||
#, possible-c-format, possible-boost-format
|
#, possible-c-format, possible-boost-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"The object from file %s is too small, and may be in meters or inches.\n"
|
"The object from file %s is too small, and may be in meters or inches.\n"
|
||||||
" Do you want to scale to millimeters?"
|
"Do you want to scale to millimeters?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Object too small"
|
msgid "Object too small"
|
||||||
@@ -7671,6 +7741,12 @@ msgstr ""
|
|||||||
msgid "Multi-part object detected"
|
msgid "Multi-part object detected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Matching textures to filaments"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Texture Import Warning"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Load these files as a single object with multiple parts?\n"
|
msgid "Load these files as a single object with multiple parts?\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -7780,19 +7856,19 @@ msgstr ""
|
|||||||
msgid "Replaced with 3D files from directory:\n"
|
msgid "Replaced with 3D files from directory:\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, possible-boost-format
|
#, possible-c-format, possible-boost-format
|
||||||
msgid "✖ Skipped %s: same file.\n"
|
msgid "✖ Skipped %s: same file.\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, possible-boost-format
|
#, possible-c-format, possible-boost-format
|
||||||
msgid "✖ Skipped %s: file does not exist.\n"
|
msgid "✖ Skipped %s: file does not exist.\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, possible-boost-format
|
#, possible-c-format, possible-boost-format
|
||||||
msgid "✖ Skipped %s: failed to replace.\n"
|
msgid "✖ Skipped %s: failed to replace.\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, possible-boost-format
|
#, possible-c-format, possible-boost-format
|
||||||
msgid "✔ Replaced %s.\n"
|
msgid "✔ Replaced %s.\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -7865,6 +7941,18 @@ msgstr ""
|
|||||||
msgid "Sync now"
|
msgid "Sync now"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Texture import failed. The model appears to contain texture data, but the texture import process could not be completed. The model will be imported as geometry only."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Applying texture colors..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Updating 3D view..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Texture colors applied."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "You can keep the modified presets for the new project or discard them"
|
msgid "You can keep the modified presets for the new project or discard them"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -7994,6 +8082,17 @@ msgstr ""
|
|||||||
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
|
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish 3MF file as:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Failed to export the published 3MF file.\n"
|
||||||
|
"Please check whether the folder exists online or if other programs have the file open."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "The nozzle type is not set. Please set the nozzle and try again."
|
msgid "The nozzle type is not set. Please set the nozzle and try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -8191,8 +8290,6 @@ msgstr ""
|
|||||||
msgid "Language selection"
|
msgid "Language selection"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Switching application language while some presets are modified."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Asia-Pacific"
|
msgid "Asia-Pacific"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -8472,6 +8569,15 @@ msgstr ""
|
|||||||
msgid "Pop up to select filament grouping mode"
|
msgid "Pop up to select filament grouping mode"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Visible plugin pages"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "pages"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Number of plugin pages shown as fixed tabs before the remaining pages collapse into a dropdown on the last tab."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Behaviour"
|
msgid "Behaviour"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -8797,6 +8903,14 @@ msgstr ""
|
|||||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "(Experimental) Use printer agents instead of print hosts"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Route print jobs for non-Bambu printers through printer plug-in agents instead of the classic print-host upload flow.\n"
|
||||||
|
"When disabled, OrcaSlicer uses the legacy print-host behavior."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Experimental Features"
|
msgid "Experimental Features"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -8997,6 +9111,9 @@ msgstr ""
|
|||||||
msgid "First layer filament sequence"
|
msgid "First layer filament sequence"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "The filament list contains mixed filaments. Custom filament sequence will not take effect."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "By Layer"
|
msgid "By Layer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -9024,9 +9141,6 @@ msgstr ""
|
|||||||
msgid "Note: The preparation may take several minutes. Please be patient."
|
msgid "Note: The preparation may take several minutes. Please be patient."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Publish"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Publish was canceled"
|
msgid "Publish was canceled"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -9042,6 +9156,64 @@ msgstr ""
|
|||||||
msgid "Jump to webpage"
|
msgid "Jump to webpage"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Material"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Some mixed filaments rely on filaments that will not be published:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#, possible-c-format, possible-boost-format
|
||||||
|
msgid "Filament %d (mixed)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "needs"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "not enabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "material not published"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish anyway"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish 3MF..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Select which settings to be published in the 3MF file"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish 3MF Wiki"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish 3MF Video Guide"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish this filament slot in the 3MF file"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Full Publish"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Embed the entire filament of this slot in the 3MF file"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Filter non-selected"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, possible-c-format, possible-boost-format
|
#, possible-c-format, possible-boost-format
|
||||||
msgid "Save %s as"
|
msgid "Save %s as"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -9052,9 +9224,21 @@ msgstr ""
|
|||||||
msgid "Preset Inside Project"
|
msgid "Preset Inside Project"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Copies all inherited values from the parent into this preset and removes the parent relationship. Presets compatible only with the parent may become unsupported."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Detach from parent"
|
msgid "Detach from parent"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Unique preset"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Parent preset"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "This preset does not inherit from another preset."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Name is unavailable."
|
msgid "Name is unavailable."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -9732,20 +9916,6 @@ msgstr ""
|
|||||||
msgid "Infill patterns are typically designed to handle rotation automatically to ensure proper printing and achieve their intended effects (e.g., Gyroid, Cubic). Rotating the current sparse infill pattern may lead to insufficient support. Please proceed with caution and thoroughly check for any potential printing issues. Are you sure you want to enable this option?"
|
msgid "Infill patterns are typically designed to handle rotation automatically to ensure proper printing and achieve their intended effects (e.g., Gyroid, Cubic). Rotating the current sparse infill pattern may lead to insufficient support. Please proceed with caution and thoroughly check for any potential printing issues. Are you sure you want to enable this option?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
|
||||||
"Layer height is too small.\n"
|
|
||||||
"It will set to min_layer_height\n"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Layer height exceeds the limit in Printer Settings -> Extruder -> Layer height limits, this may cause printing quality issues."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Adjust to the set range automatically?\n"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Adjust"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Experimental feature: Retracting and cutting off the filament at a greater distance during filament changes to minimize flush. Although it can notably reduce flush, it may also elevate the risk of nozzle clogs or other printing complications."
|
msgid "Experimental feature: Retracting and cutting off the filament at a greater distance during filament changes to minimize flush. Although it can notably reduce flush, it may also elevate the risk of nozzle clogs or other printing complications."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -9931,6 +10101,9 @@ msgstr ""
|
|||||||
msgid "Setting Overrides"
|
msgid "Setting Overrides"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Retraction when switching material"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Basic information"
|
msgid "Basic information"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -10057,6 +10230,12 @@ msgstr ""
|
|||||||
msgid "Printable space"
|
msgid "Printable space"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Printer Agent"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Select the network agent implementation for printer communication. Available agents are registered at startup."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. TRN: The first argument is the parameter's name; the second argument is its value.
|
#. TRN: The first argument is the parameter's name; the second argument is its value.
|
||||||
#, possible-boost-format
|
#, possible-boost-format
|
||||||
msgid "Invalid value provided for parameter %1%: %2%"
|
msgid "Invalid value provided for parameter %1%: %2%"
|
||||||
@@ -10179,9 +10358,6 @@ msgstr ""
|
|||||||
msgid "Z-Hop"
|
msgid "Z-Hop"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Retraction when switching material"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n"
|
"The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n"
|
||||||
"\n"
|
"\n"
|
||||||
@@ -10279,11 +10455,11 @@ msgstr ""
|
|||||||
msgid "No modifications need to be copied."
|
msgid "No modifications need to be copied."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Copy paramters"
|
msgid "Copy parameters"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, possible-c-format, possible-boost-format
|
#, possible-c-format, possible-boost-format
|
||||||
msgid "Modify paramters of %s"
|
msgid "Modify parameters of %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, possible-c-format, possible-boost-format
|
#, possible-c-format, possible-boost-format
|
||||||
@@ -10757,27 +10933,6 @@ msgstr ""
|
|||||||
msgid "Please choose the filament colour"
|
msgid "Please choose the filament colour"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Native Wayland liveview requires the GStreamer GTK video sink. Please install the gtksink plugin for GStreamer, then restart OrcaSlicer."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Failed to initialize the native Wayland GStreamer video sink. Please check your GStreamer GTK plugin installation."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Windows Media Player is required for this task! Do you want to enable 'Windows Media Player' for your operation system?"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "BambuSource has not correctly been registered for media playing! Press Yes to re-register it. You will be promoted twice"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Missing BambuSource component registered for media playing! Please re-install OrcaSlicer or seek community help."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Using a BambuSource from a different install, video play may not work correctly! Press Yes to fix it."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Your system is missing H.264 codecs for GStreamer, which are required to play video. (Try installing the gstreamer1.0-plugins-bad or gstreamer1.0-libav packages, then restart Orca Slicer?)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Cloud agent is not available. Please restart OrcaSlicer and try again."
|
msgid "Cloud agent is not available. Please restart OrcaSlicer and try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -11445,6 +11600,9 @@ msgstr ""
|
|||||||
msgid " is too close to clumping detection area, and collisions will be caused.\n"
|
msgid " is too close to clumping detection area, and collisions will be caused.\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid " is partially outside the printable area, and it cannot be printed.\n"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Selected nozzle temperatures are incompatible. Each filament's nozzle temperature must fall within the recommended nozzle temperature range of the other filaments. Otherwise, nozzle clogging or printer damage may occur."
|
msgid "Selected nozzle temperatures are incompatible. Each filament's nozzle temperature must fall within the recommended nozzle temperature range of the other filaments. Otherwise, nozzle clogging or printer damage may occur."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -11457,6 +11615,9 @@ msgstr ""
|
|||||||
msgid "No extrusions under current settings."
|
msgid "No extrusions under current settings."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Smooth mode of timelapse is not supported when \"by object\" sequence is enabled."
|
msgid "Smooth mode of timelapse is not supported when \"by object\" sequence is enabled."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -11493,6 +11654,9 @@ msgstr ""
|
|||||||
msgid "Variable layer height is not supported with Organic supports."
|
msgid "Variable layer height is not supported with Organic supports."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "The wipe tower filament cannot be a mixed filament."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Different nozzle diameters and different filament diameters may not work well when the prime tower is enabled. It's very experimental, so please proceed with caution."
|
msgid "Different nozzle diameters and different filament diameters may not work well when the prime tower is enabled. It's very experimental, so please proceed with caution."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -11740,9 +11904,6 @@ msgstr ""
|
|||||||
msgid "Enable this if the printer accepts a 3MF file as the print job. When enabled, Orca Slicer sends the sliced file as a .gcode.3mf, instead of a plain .gcode file."
|
msgid "Enable this if the printer accepts a 3MF file as the print job. When enabled, Orca Slicer sends the sliced file as a .gcode.3mf, instead of a plain .gcode file."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Printer Agent"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Select the network agent implementation for printer communication."
|
msgid "Select the network agent implementation for printer communication."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -11824,7 +11985,7 @@ msgstr ""
|
|||||||
msgid "Other layers"
|
msgid "Other layers"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Bed temperature for layers except the initial one. A value of 0 means the filament does not support printing on the Cool Plate SuperTack."
|
msgid "This is the bed temperature for layers except for the first one. A value of 0 means the filament does not support printing on the Cool Plate SuperTack."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "This is the bed temperature for layers except for the first one. A value of 0 means the filament does not support printing on the Cool Plate."
|
msgid "This is the bed temperature for layers except for the first one. A value of 0 means the filament does not support printing on the Cool Plate."
|
||||||
@@ -12279,9 +12440,6 @@ msgstr ""
|
|||||||
msgid "Speed of internal bridges. If the value is expressed as a percentage, it will be calculated based on the bridge_speed. Default value is 150%."
|
msgid "Speed of internal bridges. If the value is expressed as a percentage, it will be calculated based on the bridge_speed. Default value is 150%."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Brim width"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "This is the distance from the model to the outermost brim line."
|
msgid "This is the distance from the model to the outermost brim line."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -12347,6 +12505,12 @@ msgid ""
|
|||||||
"0 to deactivate."
|
"0 to deactivate."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Brim ears outer only"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Generate mouse ears only on the outer contour of the model, excluding holes and enclosed sections."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "upward compatible machine"
|
msgid "upward compatible machine"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -12905,6 +13069,7 @@ msgstr ""
|
|||||||
msgid "The part cooling fan will be enabled for layers where the estimated time is shorter than this value. Fan speed is interpolated between the minimum and maximum fan speeds according to layer printing time."
|
msgid "The part cooling fan will be enabled for layers where the estimated time is shorter than this value. Fan speed is interpolated between the minimum and maximum fan speeds according to layer printing time."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "second"
|
||||||
msgid "s"
|
msgid "s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -13198,6 +13363,48 @@ msgstr ""
|
|||||||
msgid "Support material is commonly used to print supports and support interfaces."
|
msgid "Support material is commonly used to print supports and support interfaces."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Is mixed filament"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Whether this filament slot is a mixed filament composed of multiple physical filaments"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament components"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Comma-separated 1-based indices of component filaments, e.g. \"1,3\""
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament sublayer ratios"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Comma-separated ratio values summing to 1.0, e.g. \"0.7,0.3\""
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament gradient"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Enable Z-direction gradient mode for mixed filament sub-layers. When enabled, the sub-layer ratios vary linearly across layers."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament gradient range"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Start and end ratios for the first component in gradient mode. Comma-separated pair, e.g. \"0.10,0.90\" means 10% to 90%."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament gradient curve"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Optional Photoshop-style custom curve mapping Z progress to the first component ratio. Encoded as pipe-separated control points, either \"x,y\" (legacy) or \"x,y,m_in,m_out\" when a tangent override is needed (empty token or \"nan\" means use PCHIP default). x in [0,1]; y is clamped to the configured ratio range, e.g. \"0,0.15|0.5,0.50|1,0.85\". When empty, the linear gradient_range is used instead."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament per-part gradient"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "When gradient mode is enabled, apply the gradient to each part of an assembly independently rather than treating the whole assembly as one Z range."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Filament printable"
|
msgid "Filament printable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -13359,6 +13566,12 @@ msgstr ""
|
|||||||
msgid "Gyroid"
|
msgid "Gyroid"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Sparse infill smooth factor"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Controls how strongly sparse infill corners are rounded. 0% keeps the original sharp path, while 100% produces the largest possible curves between adjacent infill lines."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -13839,6 +14052,12 @@ msgstr ""
|
|||||||
msgid "Klipper"
|
msgid "Klipper"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Skip G-code config block"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Do not write the CONFIG_BLOCK (slicer configuration key/value pairs) into the G-code file. This can help with printers whose firmware crashes when parsing these comment lines (e.g. Anycubic go-klipper). Note: the G-code file will no longer contain slicer settings, so importing it back into OrcaSlicer will not restore the configuration."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Pellet Modded Printer"
|
msgid "Pellet Modded Printer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -14333,6 +14552,7 @@ msgstr ""
|
|||||||
msgid "The allowed maximum output force of Y axis"
|
msgid "The allowed maximum output force of Y axis"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "Newton"
|
||||||
msgid "N"
|
msgid "N"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -14342,6 +14562,7 @@ msgstr ""
|
|||||||
msgid "The machine bed mass load of Y axis"
|
msgid "The machine bed mass load of Y axis"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "gram"
|
||||||
msgid "g"
|
msgid "g"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -14610,7 +14831,7 @@ msgstr ""
|
|||||||
msgid "Reduce infill retraction"
|
msgid "Reduce infill retraction"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Don't retract when the travel is entirely within an infill area. That means the oozing can't been seen. This can reduce times of retraction for complex model and save printing time, but make slicing and G-code generating slower. Note that z-hop is also not performed in areas where retraction is skipped."
|
msgid "Don't retract when the travel is entirely within an infill area. That means the oozing can't been seen. This can reduce times of retraction for complex model and save printing time, but make slicing and G-code generating slower. Note that Z-hop is also not performed in areas where retraction is skipped."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "This option will drop the temperature of the inactive extruders to prevent oozing."
|
msgid "This option will drop the temperature of the inactive extruders to prevent oozing."
|
||||||
@@ -14766,7 +14987,7 @@ msgstr ""
|
|||||||
|
|
||||||
#, no-c-format, no-boost-format
|
#, no-c-format, no-boost-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"The length of fast retraction after wipe, relative to retraction length.\n"
|
"This is the length of fast retraction after wipe, relative to retraction length.\n"
|
||||||
"The value will be clamped by 100% minus the retract amount before the wipe value."
|
"The value will be clamped by 100% minus the retract amount before the wipe value."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -14800,10 +15021,16 @@ msgstr ""
|
|||||||
msgid "Retraction distance when extruder change"
|
msgid "Retraction distance when extruder change"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Retraction Length (Toolchange)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "When retraction is triggered before changing tool, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Z-hop height"
|
msgid "Z-hop height"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Whenever there is a retraction, the nozzle is lifted a little to create clearance between the nozzle and the print. This prevents the nozzle from hitting the print when traveling more. Using spiral lines to lift z can prevent stringing."
|
msgid "Whenever there is a retraction, the nozzle is lifted a little to create clearance between the nozzle and the print. This prevents the nozzle from hitting the print when traveling more. Using spiral lines to lift Z can prevent stringing."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Z-hop lower boundary"
|
msgid "Z-hop lower boundary"
|
||||||
@@ -14893,6 +15120,9 @@ msgstr ""
|
|||||||
msgid "When the retraction is compensated after the travel move, the extruder will push this additional amount of filament. This setting is rarely needed."
|
msgid "When the retraction is compensated after the travel move, the extruder will push this additional amount of filament. This setting is rarely needed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Extra length on restart (Toolchange)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament."
|
msgid "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -15278,6 +15508,12 @@ msgstr ""
|
|||||||
msgid "Force the toolhead to travel to the wipe tower before issuing the tool change command (Tx). Only relevant for multi-extruder (multi-toolhead) printers using a Type 2 wipe tower. By default Orca skips the travel on multi-toolhead machines because the firmware handles the head swap, which can result in the Tx command being issued above the printed part. Enable this option if you want the tool change to always be issued above the wipe tower instead."
|
msgid "Force the toolhead to travel to the wipe tower before issuing the tool change command (Tx). Only relevant for multi-extruder (multi-toolhead) printers using a Type 2 wipe tower. By default Orca skips the travel on multi-toolhead machines because the firmware handles the head swap, which can result in the Tx command being issued above the printed part. Enable this option if you want the tool change to always be issued above the wipe tower instead."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Wait for temperature on wipe tower"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Pick up the new tool without waiting for it to reach printing temperature, travel to the wipe tower, and wait for the temperature there, right before purging. Ooze from the heat-up lands on the tower instead of the model, and the travel overlaps with the heating. Only relevant for multi-extruder (multi-toolhead) printers using a Type 2 wipe tower. The firmware or tool change macro must not wait for the temperature itself. When disabled, the temperature wait is issued right after the tool change command."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "No sparse layers (beta)"
|
msgid "No sparse layers (beta)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -15754,6 +15990,12 @@ msgid ""
|
|||||||
"Setting a value in the retract amount before wipe setting below will perform any excess retraction before the wipe, else it will be performed after."
|
"Setting a value in the retract amount before wipe setting below will perform any excess retraction before the wipe, else it will be performed after."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed color sublayer"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Enable mixed color sublayer splitting. When enabled, layers containing mixed color filaments will be split into sub-layers to achieve color mixing effects."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "The wiping tower can be used to clean up residue on the nozzle and stabilize the chamber pressure inside the nozzle in order to avoid appearance defects when printing objects."
|
msgid "The wiping tower can be used to clean up residue on the nozzle and stabilize the chamber pressure inside the nozzle in order to avoid appearance defects when printing objects."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -16781,6 +17023,9 @@ msgstr ""
|
|||||||
msgid "The supplied file couldn't be read because it's empty."
|
msgid "The supplied file couldn't be read because it's empty."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "The file format is incompatible and cannot be parsed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Unknown file format: input file must have .stl, .obj, or .amf(.xml) extension."
|
msgid "Unknown file format: input file must have .stl, .obj, or .amf(.xml) extension."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -18111,17 +18356,17 @@ msgstr ""
|
|||||||
msgid "Only display the filament names with changes to filament presets."
|
msgid "Only display the filament names with changes to filament presets."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Only printer names with user printer presets will be displayed, and each preset you choose will be exported as a zip."
|
msgid "Only printer names with user printer presets will be displayed, and each preset you choose will be exported as a ZIP archive."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Only the filament names with user filament presets will be displayed, \n"
|
"Only the filament names with user filament presets will be displayed, \n"
|
||||||
"and all user filament presets in each filament name you select will be exported as a zip."
|
"and all user filament presets in each filament name you select will be exported as a ZIP archive."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Only printer names with changed process presets will be displayed, \n"
|
"Only printer names with changed process presets will be displayed, \n"
|
||||||
"and all user process presets in each printer name you select will be exported as a zip."
|
"and all user process presets in each printer name you select will be exported as a ZIP archive."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Please select at least one printer or filament."
|
msgid "Please select at least one printer or filament."
|
||||||
@@ -18253,9 +18498,6 @@ msgstr ""
|
|||||||
msgid "Print Host upload"
|
msgid "Print Host upload"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Select the network agent implementation for printer communication. Available agents are registered at startup."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Select a Flashforge printer"
|
msgid "Select a Flashforge printer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -18339,7 +18581,7 @@ msgstr ""
|
|||||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
msgid "Pack button collects project file and logs of current session onto a ZIP archive."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||||
@@ -18381,7 +18623,7 @@ msgstr ""
|
|||||||
msgid "Stored logs"
|
msgid "Stored logs"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Packs all stored logs onto a zip file."
|
msgid "Packs all stored logs onto a ZIP archive."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Profiles"
|
msgid "Profiles"
|
||||||
@@ -18446,7 +18688,7 @@ msgstr ""
|
|||||||
msgid "Authorizing..."
|
msgid "Authorizing..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Error. Can't get api token for authorization"
|
msgid "Error. Can't get API token for authorization"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Could not parse server response."
|
msgid "Could not parse server response."
|
||||||
@@ -18884,7 +19126,7 @@ msgstr ""
|
|||||||
msgid "Enable smart filament assign: Assign one filament to multiple nozzles to maximize savings"
|
msgid "Enable smart filament assign: Assign one filament to multiple nozzles to maximize savings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Fila Saving"
|
msgid "File Saving"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Don't remind me again"
|
msgid "Don't remind me again"
|
||||||
@@ -19087,9 +19329,6 @@ msgstr ""
|
|||||||
msgid "User canceled."
|
msgid "User canceled."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Head diameter"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Max angle"
|
msgid "Max angle"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -19170,6 +19409,15 @@ msgstr ""
|
|||||||
msgid "Skipping objects."
|
msgid "Skipping objects."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Material Ratio"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Model Height"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Ratio"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Select Filament"
|
msgid "Select Filament"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -19247,6 +19495,9 @@ msgstr ""
|
|||||||
msgid "NO RAMMING AT ALL"
|
msgid "NO RAMMING AT ALL"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Volumetric speed"
|
msgid "Volumetric speed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -3,7 +3,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Orca Slicer\n"
|
"Project-Id-Version: Orca Slicer\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2026-07-29 17:40-0300\n"
|
"POT-Creation-Date: 2026-09-03 10:27+0800\n"
|
||||||
"PO-Revision-Date: 2026-06-17 15:44-0300\n"
|
"PO-Revision-Date: 2026-06-17 15:44-0300\n"
|
||||||
"Last-Translator: Alexandre Folle de Menezes\n"
|
"Last-Translator: Alexandre Folle de Menezes\n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
@@ -2289,8 +2289,6 @@ msgstr ""
|
|||||||
msgid "%s has been removed."
|
msgid "%s has been removed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Switching application language"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Select the language"
|
msgid "Select the language"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -2758,6 +2756,9 @@ msgstr ""
|
|||||||
msgid "Merge with"
|
msgid "Merge with"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Decompose Color"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Delete this filament"
|
msgid "Delete this filament"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -3035,6 +3036,9 @@ msgstr ""
|
|||||||
msgid "Merge parts to an object"
|
msgid "Merge parts to an object"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Using variable layer height together with mixed color sublayer may result in poor color mixing quality."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Add layers"
|
msgid "Add layers"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -4448,6 +4452,20 @@ msgstr ""
|
|||||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#, c-format, boost-format
|
||||||
|
msgid "Layer height is too small. It will be set to the minimum (%g mm)."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Layer height is outside the limits set in Printer Settings -> Extruder -> Layer height limits, this may cause printing quality issues."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#, c-format, boost-format
|
||||||
|
msgid "Adjust it to the limit (%g mm) automatically?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Adjust"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Layer height too small\n"
|
"Layer height too small\n"
|
||||||
"It has been reset to 0.2"
|
"It has been reset to 0.2"
|
||||||
@@ -4479,7 +4497,7 @@ msgid ""
|
|||||||
"The value will be reset to 0."
|
"The value will be reset to 0."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Alternate extra wall does't work well when ensure vertical shell thickness is set to All."
|
msgid "Alternate extra wall doesn't work well when ensure vertical shell thickness is set to All."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -4510,13 +4528,13 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"seam_slope_start_height need to be smaller than layer_height.\n"
|
"seam_slope_start_height needs to be smaller than layer_height.\n"
|
||||||
"Reset to 0."
|
"Reset to 0."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, no-c-format, no-boost-format
|
#, no-c-format, no-boost-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Lock depth should smaller than skin depth.\n"
|
"Lock depth should be smaller than skin depth.\n"
|
||||||
"Reset to 50% of skin depth."
|
"Reset to 50% of skin depth."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -4529,6 +4547,12 @@ msgid ""
|
|||||||
"No - Disable Arachne Wall Generator and set [Displacement] mode of the Fuzzy Skin"
|
"No - Disable Arachne Wall Generator and set [Displacement] mode of the Fuzzy Skin"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Brim ear radius"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Brim width"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Spiral mode only works when wall loops is 1, support is disabled, clumping detection by probing is disabled, top shell layers is 0, sparse infill density is 0 and timelapse type is traditional."
|
msgid "Spiral mode only works when wall loops is 1, support is disabled, clumping detection by probing is disabled, top shell layers is 0, sparse infill density is 0 and timelapse type is traditional."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -4541,6 +4565,9 @@ msgid ""
|
|||||||
"No - Cancel enabling spiral mode"
|
"No - Cancel enabling spiral mode"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "N/A"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Printing"
|
msgid "Printing"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -4780,6 +4807,12 @@ msgstr ""
|
|||||||
msgid "Calibration error"
|
msgid "Calibration error"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "This printer is not configured with the hardware this control needs."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "This control is not supported on this printer."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Network unavailable"
|
msgid "Network unavailable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -4958,9 +4991,7 @@ msgstr ""
|
|||||||
|
|
||||||
#, c-format, boost-format
|
#, c-format, boost-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Is it %s%% or %s %s?\n"
|
"Is it %s%% or %s %s?"
|
||||||
"YES for %s%%, \n"
|
|
||||||
"NO for %s %s."
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, boost-format
|
#, boost-format
|
||||||
@@ -4983,9 +5014,6 @@ msgstr ""
|
|||||||
msgid "Invalid format. Expected vector format: \"%1%\""
|
msgid "Invalid format. Expected vector format: \"%1%\""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "N/A"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "System agents"
|
msgid "System agents"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -5611,7 +5639,7 @@ msgstr ""
|
|||||||
msgid "Size:"
|
msgid "Size:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, c-format, boost-format
|
#, boost-format
|
||||||
msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)."
|
msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -5786,6 +5814,9 @@ msgstr ""
|
|||||||
msgid "Project"
|
msgid "Project"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Device (Web)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Yes"
|
msgid "Yes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -5912,16 +5943,22 @@ msgstr ""
|
|||||||
msgid "Save current project as"
|
msgid "Save current project as"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish 3MF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Export a 3MF file with the selected settings embedded"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
|
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Load a model"
|
msgid "Load a model"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Import Zip Archive"
|
msgid "Import ZIP Archive"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Load models contained within a zip archive"
|
msgid "Load models contained within a ZIP archive"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Import Configs"
|
msgid "Import Configs"
|
||||||
@@ -7370,6 +7407,9 @@ msgstr ""
|
|||||||
msgid "The %s nozzle can not print %s."
|
msgid "The %s nozzle can not print %s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Printing mixed-color filament on a single-extruder printer requires frequent filament changes and flushing, which may significantly increase waste and the risk of nozzle / waste-chute clogging."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, boost-format
|
#, boost-format
|
||||||
msgid "Mixing %1% with %2% in printing is not recommended.\n"
|
msgid "Mixing %1% with %2% in printing is not recommended.\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -7490,12 +7530,36 @@ msgstr ""
|
|||||||
msgid "Set filaments to use"
|
msgid "Set filaments to use"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Add Mixed Filament"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed Filament"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Remove last mixed filament"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Add mixed filament"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament has invalid or mismatched components. Please re-edit affected entries."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Search plate, object and part."
|
msgid "Search plate, object and part."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Pellets"
|
msgid "Pellets"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament has broken component references"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Edit / Delete / Merge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, c-format, boost-format
|
#, c-format, boost-format
|
||||||
msgid "After completing your operation, %s project will be closed and create a new project."
|
msgid "After completing your operation, %s project will be closed and create a new project."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -7630,7 +7694,13 @@ msgstr ""
|
|||||||
msgid "Customized Preset"
|
msgid "Customized Preset"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Component name(s) inside step file not in UTF8 format!"
|
msgid "Some published settings could not be applied:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Some filament slots were changed:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Component name(s) inside step file not in UTF-8 format!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Because of unsupported text encoding, garbage characters may appear!"
|
msgid "Because of unsupported text encoding, garbage characters may appear!"
|
||||||
@@ -7652,7 +7722,7 @@ msgstr ""
|
|||||||
#, c-format, boost-format
|
#, c-format, boost-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"The object from file %s is too small, and may be in meters or inches.\n"
|
"The object from file %s is too small, and may be in meters or inches.\n"
|
||||||
" Do you want to scale to millimeters?"
|
"Do you want to scale to millimeters?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Object too small"
|
msgid "Object too small"
|
||||||
@@ -7667,6 +7737,12 @@ msgstr ""
|
|||||||
msgid "Multi-part object detected"
|
msgid "Multi-part object detected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Matching textures to filaments"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Texture Import Warning"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Load these files as a single object with multiple parts?\n"
|
msgid "Load these files as a single object with multiple parts?\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -7776,19 +7852,19 @@ msgstr ""
|
|||||||
msgid "Replaced with 3D files from directory:\n"
|
msgid "Replaced with 3D files from directory:\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, c-format
|
#, c-format, boost-format
|
||||||
msgid "✖ Skipped %s: same file.\n"
|
msgid "✖ Skipped %s: same file.\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, c-format
|
#, c-format, boost-format
|
||||||
msgid "✖ Skipped %s: file does not exist.\n"
|
msgid "✖ Skipped %s: file does not exist.\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, c-format
|
#, c-format, boost-format
|
||||||
msgid "✖ Skipped %s: failed to replace.\n"
|
msgid "✖ Skipped %s: failed to replace.\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, c-format
|
#, c-format, boost-format
|
||||||
msgid "✔ Replaced %s.\n"
|
msgid "✔ Replaced %s.\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -7861,6 +7937,18 @@ msgstr ""
|
|||||||
msgid "Sync now"
|
msgid "Sync now"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Texture import failed. The model appears to contain texture data, but the texture import process could not be completed. The model will be imported as geometry only."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Applying texture colors..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Updating 3D view..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Texture colors applied."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "You can keep the modified presets for the new project or discard them"
|
msgid "You can keep the modified presets for the new project or discard them"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -7990,6 +8078,17 @@ msgstr ""
|
|||||||
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
|
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish 3MF file as:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Failed to export the published 3MF file.\n"
|
||||||
|
"Please check whether the folder exists online or if other programs have the file open."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "The nozzle type is not set. Please set the nozzle and try again."
|
msgid "The nozzle type is not set. Please set the nozzle and try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -8187,8 +8286,6 @@ msgstr ""
|
|||||||
msgid "Language selection"
|
msgid "Language selection"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Switching application language while some presets are modified."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Asia-Pacific"
|
msgid "Asia-Pacific"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -8468,6 +8565,15 @@ msgstr ""
|
|||||||
msgid "Pop up to select filament grouping mode"
|
msgid "Pop up to select filament grouping mode"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Visible plugin pages"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "pages"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Number of plugin pages shown as fixed tabs before the remaining pages collapse into a dropdown on the last tab."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Behaviour"
|
msgid "Behaviour"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -8793,6 +8899,14 @@ msgstr ""
|
|||||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "(Experimental) Use printer agents instead of print hosts"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Route print jobs for non-Bambu printers through printer plug-in agents instead of the classic print-host upload flow.\n"
|
||||||
|
"When disabled, OrcaSlicer uses the legacy print-host behavior."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Experimental Features"
|
msgid "Experimental Features"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -8993,6 +9107,9 @@ msgstr ""
|
|||||||
msgid "First layer filament sequence"
|
msgid "First layer filament sequence"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "The filament list contains mixed filaments. Custom filament sequence will not take effect."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "By Layer"
|
msgid "By Layer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -9020,9 +9137,6 @@ msgstr ""
|
|||||||
msgid "Note: The preparation may take several minutes. Please be patient."
|
msgid "Note: The preparation may take several minutes. Please be patient."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Publish"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Publish was canceled"
|
msgid "Publish was canceled"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -9038,6 +9152,64 @@ msgstr ""
|
|||||||
msgid "Jump to webpage"
|
msgid "Jump to webpage"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Material"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Some mixed filaments rely on filaments that will not be published:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#, c-format, boost-format
|
||||||
|
msgid "Filament %d (mixed)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "needs"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "not enabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "material not published"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish anyway"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish 3MF..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Select which settings to be published in the 3MF file"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish 3MF Wiki"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish 3MF Video Guide"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish this filament slot in the 3MF file"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Full Publish"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Embed the entire filament of this slot in the 3MF file"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Filter non-selected"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, c-format, boost-format
|
#, c-format, boost-format
|
||||||
msgid "Save %s as"
|
msgid "Save %s as"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -9048,9 +9220,21 @@ msgstr ""
|
|||||||
msgid "Preset Inside Project"
|
msgid "Preset Inside Project"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Copies all inherited values from the parent into this preset and removes the parent relationship. Presets compatible only with the parent may become unsupported."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Detach from parent"
|
msgid "Detach from parent"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Unique preset"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Parent preset"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "This preset does not inherit from another preset."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Name is unavailable."
|
msgid "Name is unavailable."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -9728,20 +9912,6 @@ msgstr ""
|
|||||||
msgid "Infill patterns are typically designed to handle rotation automatically to ensure proper printing and achieve their intended effects (e.g., Gyroid, Cubic). Rotating the current sparse infill pattern may lead to insufficient support. Please proceed with caution and thoroughly check for any potential printing issues. Are you sure you want to enable this option?"
|
msgid "Infill patterns are typically designed to handle rotation automatically to ensure proper printing and achieve their intended effects (e.g., Gyroid, Cubic). Rotating the current sparse infill pattern may lead to insufficient support. Please proceed with caution and thoroughly check for any potential printing issues. Are you sure you want to enable this option?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
|
||||||
"Layer height is too small.\n"
|
|
||||||
"It will set to min_layer_height\n"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Layer height exceeds the limit in Printer Settings -> Extruder -> Layer height limits, this may cause printing quality issues."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Adjust to the set range automatically?\n"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Adjust"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Experimental feature: Retracting and cutting off the filament at a greater distance during filament changes to minimize flush. Although it can notably reduce flush, it may also elevate the risk of nozzle clogs or other printing complications."
|
msgid "Experimental feature: Retracting and cutting off the filament at a greater distance during filament changes to minimize flush. Although it can notably reduce flush, it may also elevate the risk of nozzle clogs or other printing complications."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -9927,6 +10097,9 @@ msgstr ""
|
|||||||
msgid "Setting Overrides"
|
msgid "Setting Overrides"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Retraction when switching material"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Basic information"
|
msgid "Basic information"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -10053,6 +10226,12 @@ msgstr ""
|
|||||||
msgid "Printable space"
|
msgid "Printable space"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Printer Agent"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Select the network agent implementation for printer communication. Available agents are registered at startup."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. TRN: The first argument is the parameter's name; the second argument is its value.
|
#. TRN: The first argument is the parameter's name; the second argument is its value.
|
||||||
#, boost-format
|
#, boost-format
|
||||||
msgid "Invalid value provided for parameter %1%: %2%"
|
msgid "Invalid value provided for parameter %1%: %2%"
|
||||||
@@ -10175,9 +10354,6 @@ msgstr ""
|
|||||||
msgid "Z-Hop"
|
msgid "Z-Hop"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Retraction when switching material"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n"
|
"The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n"
|
||||||
"\n"
|
"\n"
|
||||||
@@ -10275,11 +10451,11 @@ msgstr ""
|
|||||||
msgid "No modifications need to be copied."
|
msgid "No modifications need to be copied."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Copy paramters"
|
msgid "Copy parameters"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, c-format, boost-format
|
#, c-format, boost-format
|
||||||
msgid "Modify paramters of %s"
|
msgid "Modify parameters of %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#, c-format, boost-format
|
#, c-format, boost-format
|
||||||
@@ -10753,27 +10929,6 @@ msgstr ""
|
|||||||
msgid "Please choose the filament colour"
|
msgid "Please choose the filament colour"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Native Wayland liveview requires the GStreamer GTK video sink. Please install the gtksink plugin for GStreamer, then restart OrcaSlicer."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Failed to initialize the native Wayland GStreamer video sink. Please check your GStreamer GTK plugin installation."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Windows Media Player is required for this task! Do you want to enable 'Windows Media Player' for your operation system?"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "BambuSource has not correctly been registered for media playing! Press Yes to re-register it. You will be promoted twice"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Missing BambuSource component registered for media playing! Please re-install OrcaSlicer or seek community help."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Using a BambuSource from a different install, video play may not work correctly! Press Yes to fix it."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Your system is missing H.264 codecs for GStreamer, which are required to play video. (Try installing the gstreamer1.0-plugins-bad or gstreamer1.0-libav packages, then restart Orca Slicer?)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Cloud agent is not available. Please restart OrcaSlicer and try again."
|
msgid "Cloud agent is not available. Please restart OrcaSlicer and try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -11441,6 +11596,9 @@ msgstr ""
|
|||||||
msgid " is too close to clumping detection area, and collisions will be caused.\n"
|
msgid " is too close to clumping detection area, and collisions will be caused.\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid " is partially outside the printable area, and it cannot be printed.\n"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Selected nozzle temperatures are incompatible. Each filament's nozzle temperature must fall within the recommended nozzle temperature range of the other filaments. Otherwise, nozzle clogging or printer damage may occur."
|
msgid "Selected nozzle temperatures are incompatible. Each filament's nozzle temperature must fall within the recommended nozzle temperature range of the other filaments. Otherwise, nozzle clogging or printer damage may occur."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -11453,6 +11611,9 @@ msgstr ""
|
|||||||
msgid "No extrusions under current settings."
|
msgid "No extrusions under current settings."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Smooth mode of timelapse is not supported when \"by object\" sequence is enabled."
|
msgid "Smooth mode of timelapse is not supported when \"by object\" sequence is enabled."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -11489,6 +11650,9 @@ msgstr ""
|
|||||||
msgid "Variable layer height is not supported with Organic supports."
|
msgid "Variable layer height is not supported with Organic supports."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "The wipe tower filament cannot be a mixed filament."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Different nozzle diameters and different filament diameters may not work well when the prime tower is enabled. It's very experimental, so please proceed with caution."
|
msgid "Different nozzle diameters and different filament diameters may not work well when the prime tower is enabled. It's very experimental, so please proceed with caution."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -11736,9 +11900,6 @@ msgstr ""
|
|||||||
msgid "Enable this if the printer accepts a 3MF file as the print job. When enabled, Orca Slicer sends the sliced file as a .gcode.3mf, instead of a plain .gcode file."
|
msgid "Enable this if the printer accepts a 3MF file as the print job. When enabled, Orca Slicer sends the sliced file as a .gcode.3mf, instead of a plain .gcode file."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Printer Agent"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Select the network agent implementation for printer communication."
|
msgid "Select the network agent implementation for printer communication."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -11820,7 +11981,7 @@ msgstr ""
|
|||||||
msgid "Other layers"
|
msgid "Other layers"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Bed temperature for layers except the initial one. A value of 0 means the filament does not support printing on the Cool Plate SuperTack."
|
msgid "This is the bed temperature for layers except for the first one. A value of 0 means the filament does not support printing on the Cool Plate SuperTack."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "This is the bed temperature for layers except for the first one. A value of 0 means the filament does not support printing on the Cool Plate."
|
msgid "This is the bed temperature for layers except for the first one. A value of 0 means the filament does not support printing on the Cool Plate."
|
||||||
@@ -12275,9 +12436,6 @@ msgstr ""
|
|||||||
msgid "Speed of internal bridges. If the value is expressed as a percentage, it will be calculated based on the bridge_speed. Default value is 150%."
|
msgid "Speed of internal bridges. If the value is expressed as a percentage, it will be calculated based on the bridge_speed. Default value is 150%."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Brim width"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "This is the distance from the model to the outermost brim line."
|
msgid "This is the distance from the model to the outermost brim line."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -12343,6 +12501,12 @@ msgid ""
|
|||||||
"0 to deactivate."
|
"0 to deactivate."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Brim ears outer only"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Generate mouse ears only on the outer contour of the model, excluding holes and enclosed sections."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "upward compatible machine"
|
msgid "upward compatible machine"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -12901,6 +13065,7 @@ msgstr ""
|
|||||||
msgid "The part cooling fan will be enabled for layers where the estimated time is shorter than this value. Fan speed is interpolated between the minimum and maximum fan speeds according to layer printing time."
|
msgid "The part cooling fan will be enabled for layers where the estimated time is shorter than this value. Fan speed is interpolated between the minimum and maximum fan speeds according to layer printing time."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "second"
|
||||||
msgid "s"
|
msgid "s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -13194,6 +13359,48 @@ msgstr ""
|
|||||||
msgid "Support material is commonly used to print supports and support interfaces."
|
msgid "Support material is commonly used to print supports and support interfaces."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Is mixed filament"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Whether this filament slot is a mixed filament composed of multiple physical filaments"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament components"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Comma-separated 1-based indices of component filaments, e.g. \"1,3\""
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament sublayer ratios"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Comma-separated ratio values summing to 1.0, e.g. \"0.7,0.3\""
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament gradient"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Enable Z-direction gradient mode for mixed filament sub-layers. When enabled, the sub-layer ratios vary linearly across layers."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament gradient range"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Start and end ratios for the first component in gradient mode. Comma-separated pair, e.g. \"0.10,0.90\" means 10% to 90%."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament gradient curve"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Optional Photoshop-style custom curve mapping Z progress to the first component ratio. Encoded as pipe-separated control points, either \"x,y\" (legacy) or \"x,y,m_in,m_out\" when a tangent override is needed (empty token or \"nan\" means use PCHIP default). x in [0,1]; y is clamped to the configured ratio range, e.g. \"0,0.15|0.5,0.50|1,0.85\". When empty, the linear gradient_range is used instead."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament per-part gradient"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "When gradient mode is enabled, apply the gradient to each part of an assembly independently rather than treating the whole assembly as one Z range."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Filament printable"
|
msgid "Filament printable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -13355,6 +13562,12 @@ msgstr ""
|
|||||||
msgid "Gyroid"
|
msgid "Gyroid"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Sparse infill smooth factor"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Controls how strongly sparse infill corners are rounded. 0% keeps the original sharp path, while 100% produces the largest possible curves between adjacent infill lines."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -13835,6 +14048,12 @@ msgstr ""
|
|||||||
msgid "Klipper"
|
msgid "Klipper"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Skip G-code config block"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Do not write the CONFIG_BLOCK (slicer configuration key/value pairs) into the G-code file. This can help with printers whose firmware crashes when parsing these comment lines (e.g. Anycubic go-klipper). Note: the G-code file will no longer contain slicer settings, so importing it back into OrcaSlicer will not restore the configuration."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Pellet Modded Printer"
|
msgid "Pellet Modded Printer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -14329,6 +14548,7 @@ msgstr ""
|
|||||||
msgid "The allowed maximum output force of Y axis"
|
msgid "The allowed maximum output force of Y axis"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "Newton"
|
||||||
msgid "N"
|
msgid "N"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -14338,6 +14558,7 @@ msgstr ""
|
|||||||
msgid "The machine bed mass load of Y axis"
|
msgid "The machine bed mass load of Y axis"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "gram"
|
||||||
msgid "g"
|
msgid "g"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -14606,7 +14827,7 @@ msgstr ""
|
|||||||
msgid "Reduce infill retraction"
|
msgid "Reduce infill retraction"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Don't retract when the travel is entirely within an infill area. That means the oozing can't been seen. This can reduce times of retraction for complex model and save printing time, but make slicing and G-code generating slower. Note that z-hop is also not performed in areas where retraction is skipped."
|
msgid "Don't retract when the travel is entirely within an infill area. That means the oozing can't been seen. This can reduce times of retraction for complex model and save printing time, but make slicing and G-code generating slower. Note that Z-hop is also not performed in areas where retraction is skipped."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "This option will drop the temperature of the inactive extruders to prevent oozing."
|
msgid "This option will drop the temperature of the inactive extruders to prevent oozing."
|
||||||
@@ -14762,7 +14983,7 @@ msgstr ""
|
|||||||
|
|
||||||
#, no-c-format, no-boost-format
|
#, no-c-format, no-boost-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"The length of fast retraction after wipe, relative to retraction length.\n"
|
"This is the length of fast retraction after wipe, relative to retraction length.\n"
|
||||||
"The value will be clamped by 100% minus the retract amount before the wipe value."
|
"The value will be clamped by 100% minus the retract amount before the wipe value."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -14796,10 +15017,16 @@ msgstr ""
|
|||||||
msgid "Retraction distance when extruder change"
|
msgid "Retraction distance when extruder change"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Retraction Length (Toolchange)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "When retraction is triggered before changing tool, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Z-hop height"
|
msgid "Z-hop height"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Whenever there is a retraction, the nozzle is lifted a little to create clearance between the nozzle and the print. This prevents the nozzle from hitting the print when traveling more. Using spiral lines to lift z can prevent stringing."
|
msgid "Whenever there is a retraction, the nozzle is lifted a little to create clearance between the nozzle and the print. This prevents the nozzle from hitting the print when traveling more. Using spiral lines to lift Z can prevent stringing."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Z-hop lower boundary"
|
msgid "Z-hop lower boundary"
|
||||||
@@ -14889,6 +15116,9 @@ msgstr ""
|
|||||||
msgid "When the retraction is compensated after the travel move, the extruder will push this additional amount of filament. This setting is rarely needed."
|
msgid "When the retraction is compensated after the travel move, the extruder will push this additional amount of filament. This setting is rarely needed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Extra length on restart (Toolchange)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament."
|
msgid "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -15274,6 +15504,12 @@ msgstr ""
|
|||||||
msgid "Force the toolhead to travel to the wipe tower before issuing the tool change command (Tx). Only relevant for multi-extruder (multi-toolhead) printers using a Type 2 wipe tower. By default Orca skips the travel on multi-toolhead machines because the firmware handles the head swap, which can result in the Tx command being issued above the printed part. Enable this option if you want the tool change to always be issued above the wipe tower instead."
|
msgid "Force the toolhead to travel to the wipe tower before issuing the tool change command (Tx). Only relevant for multi-extruder (multi-toolhead) printers using a Type 2 wipe tower. By default Orca skips the travel on multi-toolhead machines because the firmware handles the head swap, which can result in the Tx command being issued above the printed part. Enable this option if you want the tool change to always be issued above the wipe tower instead."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Wait for temperature on wipe tower"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Pick up the new tool without waiting for it to reach printing temperature, travel to the wipe tower, and wait for the temperature there, right before purging. Ooze from the heat-up lands on the tower instead of the model, and the travel overlaps with the heating. Only relevant for multi-extruder (multi-toolhead) printers using a Type 2 wipe tower. The firmware or tool change macro must not wait for the temperature itself. When disabled, the temperature wait is issued right after the tool change command."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "No sparse layers (beta)"
|
msgid "No sparse layers (beta)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -15750,6 +15986,12 @@ msgid ""
|
|||||||
"Setting a value in the retract amount before wipe setting below will perform any excess retraction before the wipe, else it will be performed after."
|
"Setting a value in the retract amount before wipe setting below will perform any excess retraction before the wipe, else it will be performed after."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed color sublayer"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Enable mixed color sublayer splitting. When enabled, layers containing mixed color filaments will be split into sub-layers to achieve color mixing effects."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "The wiping tower can be used to clean up residue on the nozzle and stabilize the chamber pressure inside the nozzle in order to avoid appearance defects when printing objects."
|
msgid "The wiping tower can be used to clean up residue on the nozzle and stabilize the chamber pressure inside the nozzle in order to avoid appearance defects when printing objects."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -16777,6 +17019,9 @@ msgstr ""
|
|||||||
msgid "The supplied file couldn't be read because it's empty."
|
msgid "The supplied file couldn't be read because it's empty."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "The file format is incompatible and cannot be parsed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Unknown file format: input file must have .stl, .obj, or .amf(.xml) extension."
|
msgid "Unknown file format: input file must have .stl, .obj, or .amf(.xml) extension."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -18107,17 +18352,17 @@ msgstr ""
|
|||||||
msgid "Only display the filament names with changes to filament presets."
|
msgid "Only display the filament names with changes to filament presets."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Only printer names with user printer presets will be displayed, and each preset you choose will be exported as a zip."
|
msgid "Only printer names with user printer presets will be displayed, and each preset you choose will be exported as a ZIP archive."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Only the filament names with user filament presets will be displayed, \n"
|
"Only the filament names with user filament presets will be displayed, \n"
|
||||||
"and all user filament presets in each filament name you select will be exported as a zip."
|
"and all user filament presets in each filament name you select will be exported as a ZIP archive."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Only printer names with changed process presets will be displayed, \n"
|
"Only printer names with changed process presets will be displayed, \n"
|
||||||
"and all user process presets in each printer name you select will be exported as a zip."
|
"and all user process presets in each printer name you select will be exported as a ZIP archive."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Please select at least one printer or filament."
|
msgid "Please select at least one printer or filament."
|
||||||
@@ -18249,9 +18494,6 @@ msgstr ""
|
|||||||
msgid "Print Host upload"
|
msgid "Print Host upload"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Select the network agent implementation for printer communication. Available agents are registered at startup."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Select a Flashforge printer"
|
msgid "Select a Flashforge printer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -18335,7 +18577,7 @@ msgstr ""
|
|||||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
msgid "Pack button collects project file and logs of current session onto a ZIP archive."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||||
@@ -18377,7 +18619,7 @@ msgstr ""
|
|||||||
msgid "Stored logs"
|
msgid "Stored logs"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Packs all stored logs onto a zip file."
|
msgid "Packs all stored logs onto a ZIP archive."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Profiles"
|
msgid "Profiles"
|
||||||
@@ -18442,7 +18684,7 @@ msgstr ""
|
|||||||
msgid "Authorizing..."
|
msgid "Authorizing..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Error. Can't get api token for authorization"
|
msgid "Error. Can't get API token for authorization"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Could not parse server response."
|
msgid "Could not parse server response."
|
||||||
@@ -18880,7 +19122,7 @@ msgstr ""
|
|||||||
msgid "Enable smart filament assign: Assign one filament to multiple nozzles to maximize savings"
|
msgid "Enable smart filament assign: Assign one filament to multiple nozzles to maximize savings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Fila Saving"
|
msgid "File Saving"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Don't remind me again"
|
msgid "Don't remind me again"
|
||||||
@@ -19083,9 +19325,6 @@ msgstr ""
|
|||||||
msgid "User canceled."
|
msgid "User canceled."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Head diameter"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Max angle"
|
msgid "Max angle"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -19166,6 +19405,15 @@ msgstr ""
|
|||||||
msgid "Skipping objects."
|
msgid "Skipping objects."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Material Ratio"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Model Height"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Ratio"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Select Filament"
|
msgid "Select Filament"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -19243,6 +19491,9 @@ msgstr ""
|
|||||||
msgid "NO RAMMING AT ALL"
|
msgid "NO RAMMING AT ALL"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Volumetric speed"
|
msgid "Volumetric speed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Orca Slicer\n"
|
"Project-Id-Version: Orca Slicer\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2026-07-29 17:40-0300\n"
|
"POT-Creation-Date: 2026-09-03 10:27+0800\n"
|
||||||
"PO-Revision-Date: \n"
|
"PO-Revision-Date: \n"
|
||||||
"Last-Translator: Ian A. Bassi <>\n"
|
"Last-Translator: Ian A. Bassi <>\n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
@@ -2356,8 +2356,6 @@ msgstr "Hay una actualización disponible. Abra el cuadro de diálogo del paquet
|
|||||||
msgid "%s has been removed."
|
msgid "%s has been removed."
|
||||||
msgstr "Se ha eliminado %s."
|
msgstr "Se ha eliminado %s."
|
||||||
|
|
||||||
msgid "Switching application language"
|
|
||||||
msgstr "Cambiando el idioma de la aplicación"
|
|
||||||
|
|
||||||
msgid "Select the language"
|
msgid "Select the language"
|
||||||
msgstr "Seleccionar el idioma"
|
msgstr "Seleccionar el idioma"
|
||||||
@@ -2832,6 +2830,9 @@ msgstr "Editar"
|
|||||||
msgid "Merge with"
|
msgid "Merge with"
|
||||||
msgstr "Fusionar con"
|
msgstr "Fusionar con"
|
||||||
|
|
||||||
|
msgid "Decompose Color"
|
||||||
|
msgstr "Descomponer color"
|
||||||
|
|
||||||
msgid "Delete this filament"
|
msgid "Delete this filament"
|
||||||
msgstr "Eliminar este filamento"
|
msgstr "Eliminar este filamento"
|
||||||
|
|
||||||
@@ -3113,6 +3114,9 @@ msgstr "Ensamblaje"
|
|||||||
msgid "Merge parts to an object"
|
msgid "Merge parts to an object"
|
||||||
msgstr "Fusionar piezas en un objeto"
|
msgstr "Fusionar piezas en un objeto"
|
||||||
|
|
||||||
|
msgid "Using variable layer height together with mixed color sublayer may result in poor color mixing quality."
|
||||||
|
msgstr "Usar altura de capa variable junto con la subcapa de color mezclado puede reducir la calidad de la mezcla de colores."
|
||||||
|
|
||||||
msgid "Add layers"
|
msgid "Add layers"
|
||||||
msgstr "Añadir capas"
|
msgstr "Añadir capas"
|
||||||
|
|
||||||
@@ -4564,6 +4568,23 @@ msgstr "La temperatura actual de la recámara es superior a la temperatura de se
|
|||||||
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
|
||||||
msgstr "La temperatura mínima de la recámara (%d℃) es superior a la temperatura objetivo de la recámara (%d℃). El valor mínimo es el umbral en el que comienza la impresión mientras la recámara continúa calentándose hacia el objetivo, por lo que no debería superarlo. Se ajustará al valor objetivo."
|
msgstr "La temperatura mínima de la recámara (%d℃) es superior a la temperatura objetivo de la recámara (%d℃). El valor mínimo es el umbral en el que comienza la impresión mientras la recámara continúa calentándose hacia el objetivo, por lo que no debería superarlo. Se ajustará al valor objetivo."
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
#, c-format, boost-format
|
||||||
|
msgid "Layer height is too small. It will be set to the minimum (%g mm)."
|
||||||
|
msgstr "La altura de capa es demasiado pequeña. Se establecerá en el mínimo (%g mm)."
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Layer height is outside the limits set in Printer Settings -> Extruder -> Layer height limits, this may cause printing quality issues."
|
||||||
|
msgstr "La altura de capa está fuera de los límites establecidos en Ajustes de la Impresora -> Extrusor -> Limite de Altura de Capa, esto puede causar problemas de calidad de impresión."
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
#, c-format, boost-format
|
||||||
|
msgid "Adjust it to the limit (%g mm) automatically?"
|
||||||
|
msgstr "¿Ajustarla automáticamente al límite (%g mm)?"
|
||||||
|
|
||||||
|
msgid "Adjust"
|
||||||
|
msgstr "Ajustar"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Layer height too small\n"
|
"Layer height too small\n"
|
||||||
"It has been reset to 0.2"
|
"It has been reset to 0.2"
|
||||||
@@ -4612,7 +4633,7 @@ msgstr ""
|
|||||||
"\n"
|
"\n"
|
||||||
"El valor se restablecerá a 0."
|
"El valor se restablecerá a 0."
|
||||||
|
|
||||||
msgid "Alternate extra wall does't work well when ensure vertical shell thickness is set to All."
|
msgid "Alternate extra wall doesn't work well when ensure vertical shell thickness is set to All."
|
||||||
msgstr "Perímetro adicional alternado no funciona bien cuando \"Garantizar el grosor vertical de las cubiertas\" se establece en Todos."
|
msgstr "Perímetro adicional alternado no funciona bien cuando \"Garantizar el grosor vertical de las cubiertas\" se establece en Todos."
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -4658,7 +4679,7 @@ msgstr ""
|
|||||||
"NO - Mantener la altura de capa de soportes independiente"
|
"NO - Mantener la altura de capa de soportes independiente"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"seam_slope_start_height need to be smaller than layer_height.\n"
|
"seam_slope_start_height needs to be smaller than layer_height.\n"
|
||||||
"Reset to 0."
|
"Reset to 0."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"seam_slope_start_height debe ser menor que layer_height.\n"
|
"seam_slope_start_height debe ser menor que layer_height.\n"
|
||||||
@@ -4666,7 +4687,7 @@ msgstr ""
|
|||||||
|
|
||||||
#, no-c-format, no-boost-format
|
#, no-c-format, no-boost-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Lock depth should smaller than skin depth.\n"
|
"Lock depth should be smaller than skin depth.\n"
|
||||||
"Reset to 50% of skin depth."
|
"Reset to 50% of skin depth."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"La profundidad de bloqueo debe ser menor que la profundidad de piel.\n"
|
"La profundidad de bloqueo debe ser menor que la profundidad de piel.\n"
|
||||||
@@ -4684,6 +4705,13 @@ msgstr ""
|
|||||||
"Sí: habilitar el generador de muros Arachne\n"
|
"Sí: habilitar el generador de muros Arachne\n"
|
||||||
"No: deshabilitar el generador de paredes Arachne y establecer el modo [Desplazamiento] de la piel rugosa"
|
"No: deshabilitar el generador de paredes Arachne y establecer el modo [Desplazamiento] de la piel rugosa"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Brim ear radius"
|
||||||
|
msgstr "Radio de las orejas de borde"
|
||||||
|
|
||||||
|
msgid "Brim width"
|
||||||
|
msgstr "Ancho del borde de adherencia"
|
||||||
|
|
||||||
msgid "Spiral mode only works when wall loops is 1, support is disabled, clumping detection by probing is disabled, top shell layers is 0, sparse infill density is 0 and timelapse type is traditional."
|
msgid "Spiral mode only works when wall loops is 1, support is disabled, clumping detection by probing is disabled, top shell layers is 0, sparse infill density is 0 and timelapse type is traditional."
|
||||||
msgstr "El modo espiral solo funciona cuando los bucles de perímetro son 1, el soporte está desactivado, la detección de agrupamientos mediante sondeo está desactivada, las capas superiores de la carcasa son 0, la densidad de relleno es 0 y el tipo de lapso de tiempo es tradicional."
|
msgstr "El modo espiral solo funciona cuando los bucles de perímetro son 1, el soporte está desactivado, la detección de agrupamientos mediante sondeo está desactivada, las capas superiores de la carcasa son 0, la densidad de relleno es 0 y el tipo de lapso de tiempo es tradicional."
|
||||||
|
|
||||||
@@ -4699,6 +4727,9 @@ msgstr ""
|
|||||||
"Sí - Cambiar estos ajustes y activar el modo espiral automáticamente\n"
|
"Sí - Cambiar estos ajustes y activar el modo espiral automáticamente\n"
|
||||||
"No - Dejar de usar el modo espiral esta vez"
|
"No - Dejar de usar el modo espiral esta vez"
|
||||||
|
|
||||||
|
msgid "N/A"
|
||||||
|
msgstr "N/A"
|
||||||
|
|
||||||
msgid "Printing"
|
msgid "Printing"
|
||||||
msgstr "Imprimiendo"
|
msgstr "Imprimiendo"
|
||||||
|
|
||||||
@@ -4938,6 +4969,14 @@ msgstr "Fallo al generar el G-Code de calibración"
|
|||||||
msgid "Calibration error"
|
msgid "Calibration error"
|
||||||
msgstr "Error de calibración"
|
msgstr "Error de calibración"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "This printer is not configured with the hardware this control needs."
|
||||||
|
msgstr "Esta impresora no está configurada con el hardware que necesita este control."
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "This control is not supported on this printer."
|
||||||
|
msgstr "Este control no es compatible con esta impresora."
|
||||||
|
|
||||||
msgid "Network unavailable"
|
msgid "Network unavailable"
|
||||||
msgstr "Red no disponible"
|
msgstr "Red no disponible"
|
||||||
|
|
||||||
@@ -5116,13 +5155,9 @@ msgstr "El valor %s está fuera de rango. El rango válido es de %d a %d."
|
|||||||
|
|
||||||
#, c-format, boost-format
|
#, c-format, boost-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Is it %s%% or %s %s?\n"
|
"Is it %s%% or %s %s?"
|
||||||
"YES for %s%%, \n"
|
|
||||||
"NO for %s %s."
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"¿Es %s%% o %s %s?\n"
|
"¿Es %s%% o %s %s?"
|
||||||
"SÍ para %s%%, \n"
|
|
||||||
"NO para %s %s."
|
|
||||||
|
|
||||||
#, boost-format
|
#, boost-format
|
||||||
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
|
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
|
||||||
@@ -5144,9 +5179,6 @@ msgstr "Patrón inválido. Use N, N#K, o una lista separada por comas con #K opc
|
|||||||
msgid "Invalid format. Expected vector format: \"%1%\""
|
msgid "Invalid format. Expected vector format: \"%1%\""
|
||||||
msgstr "Formato inválido. Formato de vector esperado: \"%1%\""
|
msgstr "Formato inválido. Formato de vector esperado: \"%1%\""
|
||||||
|
|
||||||
msgid "N/A"
|
|
||||||
msgstr "N/A"
|
|
||||||
|
|
||||||
msgid "System agents"
|
msgid "System agents"
|
||||||
msgstr "Agentes del sistema"
|
msgstr "Agentes del sistema"
|
||||||
|
|
||||||
@@ -5779,7 +5811,7 @@ msgstr "Volumen:"
|
|||||||
msgid "Size:"
|
msgid "Size:"
|
||||||
msgstr "Tamaño:"
|
msgstr "Tamaño:"
|
||||||
|
|
||||||
#, c-format, boost-format
|
#, boost-format
|
||||||
msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)."
|
msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)."
|
||||||
msgstr "Se han encontrado conflictos de rutas G-Code en la capa %d, Z = %.2lfmm. Por favor, separe más los objetos en conflicto (%s <-> %s)."
|
msgstr "Se han encontrado conflictos de rutas G-Code en la capa %d, Z = %.2lfmm. Por favor, separe más los objetos en conflicto (%s <-> %s)."
|
||||||
|
|
||||||
@@ -5960,6 +5992,10 @@ msgstr "Multi-dispositivo"
|
|||||||
msgid "Project"
|
msgid "Project"
|
||||||
msgstr "Proyecto"
|
msgstr "Proyecto"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Device (Web)"
|
||||||
|
msgstr "Dispositivo (Web)"
|
||||||
|
|
||||||
msgid "Yes"
|
msgid "Yes"
|
||||||
msgstr "Sí"
|
msgstr "Sí"
|
||||||
|
|
||||||
@@ -6087,16 +6123,22 @@ msgstr "Guardar proyecto como"
|
|||||||
msgid "Save current project as"
|
msgid "Save current project as"
|
||||||
msgstr "Guardar el proyecto actual como"
|
msgstr "Guardar el proyecto actual como"
|
||||||
|
|
||||||
|
msgid "Publish 3MF"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Export a 3MF file with the selected settings embedded"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
|
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
|
||||||
msgstr "Importar 3MF/STL/STEP/SVG/OBJ/AMF"
|
msgstr "Importar 3MF/STL/STEP/SVG/OBJ/AMF"
|
||||||
|
|
||||||
msgid "Load a model"
|
msgid "Load a model"
|
||||||
msgstr "Cargar un modelo"
|
msgstr "Cargar un modelo"
|
||||||
|
|
||||||
msgid "Import Zip Archive"
|
msgid "Import ZIP Archive"
|
||||||
msgstr "Importar archivo Zip"
|
msgstr "Importar archivo Zip"
|
||||||
|
|
||||||
msgid "Load models contained within a zip archive"
|
msgid "Load models contained within a ZIP archive"
|
||||||
msgstr "Cargar modelos contenidos en un archivo zip"
|
msgstr "Cargar modelos contenidos en un archivo zip"
|
||||||
|
|
||||||
msgid "Import Configs"
|
msgid "Import Configs"
|
||||||
@@ -7577,6 +7619,9 @@ msgstr "Personalizar cama actual"
|
|||||||
msgid "The %s nozzle can not print %s."
|
msgid "The %s nozzle can not print %s."
|
||||||
msgstr "La boquilla %s no puede imprimir %s."
|
msgstr "La boquilla %s no puede imprimir %s."
|
||||||
|
|
||||||
|
msgid "Printing mixed-color filament on a single-extruder printer requires frequent filament changes and flushing, which may significantly increase waste and the risk of nozzle / waste-chute clogging."
|
||||||
|
msgstr "Imprimir filamento de color mezclado en una impresora de un solo extrusor requiere cambios de filamento y purgas frecuentes, lo que puede aumentar considerablemente el desperdicio y el riesgo de obstrucción de la boquilla o del conducto de residuos."
|
||||||
|
|
||||||
#, boost-format
|
#, boost-format
|
||||||
msgid "Mixing %1% with %2% in printing is not recommended.\n"
|
msgid "Mixing %1% with %2% in printing is not recommended.\n"
|
||||||
msgstr "No se recomienda mezclar %1% con %2% en la impresión.\n"
|
msgstr "No se recomienda mezclar %1% con %2% en la impresión.\n"
|
||||||
@@ -7699,12 +7744,36 @@ msgstr "Sicronizar filamentos de la lista AMS"
|
|||||||
msgid "Set filaments to use"
|
msgid "Set filaments to use"
|
||||||
msgstr "Elegir filamentos para usar"
|
msgstr "Elegir filamentos para usar"
|
||||||
|
|
||||||
|
msgid "Add Mixed Filament"
|
||||||
|
msgstr "Añadir filamento mixto"
|
||||||
|
|
||||||
|
msgid "Mixed Filament"
|
||||||
|
msgstr "Filamento mixto"
|
||||||
|
|
||||||
|
msgid "Remove last mixed filament"
|
||||||
|
msgstr "Eliminar el último filamento mixto"
|
||||||
|
|
||||||
|
msgid "Add mixed filament"
|
||||||
|
msgstr "Añadir filamento mixto"
|
||||||
|
|
||||||
|
msgid "Mixed filament has invalid or mismatched components. Please re-edit affected entries."
|
||||||
|
msgstr "El filamento mixto tiene componentes no válidos o incoherentes. Vuelva a editar las entradas afectadas."
|
||||||
|
|
||||||
msgid "Search plate, object and part."
|
msgid "Search plate, object and part."
|
||||||
msgstr "Buscar cama, objeto y parte."
|
msgstr "Buscar cama, objeto y parte."
|
||||||
|
|
||||||
msgid "Pellets"
|
msgid "Pellets"
|
||||||
msgstr "Pellets"
|
msgstr "Pellets"
|
||||||
|
|
||||||
|
msgid "Mixed filament has broken component references"
|
||||||
|
msgstr "El filamento mixto tiene referencias de componentes rotas"
|
||||||
|
|
||||||
|
msgid "Edit / Delete / Merge"
|
||||||
|
msgstr "Editar / Borrar / Fusionar"
|
||||||
|
|
||||||
|
msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?"
|
||||||
|
msgstr "El filamento mixto de destino usa este filamento físico como componente. Al fusionarlos se eliminará este filamento físico y el filamento mixto puede quedar no válido. ¿Continuar?"
|
||||||
|
|
||||||
#, c-format, boost-format
|
#, c-format, boost-format
|
||||||
msgid "After completing your operation, %s project will be closed and create a new project."
|
msgid "After completing your operation, %s project will be closed and create a new project."
|
||||||
msgstr "Al completar la operación, el proyecto %s se cerrará y se creará un nuevo proyecto."
|
msgstr "Al completar la operación, el proyecto %s se cerrará y se creará un nuevo proyecto."
|
||||||
@@ -7841,8 +7910,14 @@ msgstr "¡Por favor, confirme que el G-Code dentro de los perfiles son seguros p
|
|||||||
msgid "Customized Preset"
|
msgid "Customized Preset"
|
||||||
msgstr "Perfil Personalizado"
|
msgstr "Perfil Personalizado"
|
||||||
|
|
||||||
msgid "Component name(s) inside step file not in UTF8 format!"
|
msgid "Some published settings could not be applied:"
|
||||||
msgstr "¡El nombre de los componentes dentro del archivo de pasos no tiene formato UTF8!"
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Some filament slots were changed:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Component name(s) inside step file not in UTF-8 format!"
|
||||||
|
msgstr "¡El nombre de los componentes dentro del archivo de pasos no tiene formato UTF-8!"
|
||||||
|
|
||||||
msgid "Because of unsupported text encoding, garbage characters may appear!"
|
msgid "Because of unsupported text encoding, garbage characters may appear!"
|
||||||
msgstr "¡El nombre puede mostrar caracteres no válidos!"
|
msgstr "¡El nombre puede mostrar caracteres no válidos!"
|
||||||
@@ -7863,10 +7938,10 @@ msgstr "El volumen del objeto es cero"
|
|||||||
#, c-format, boost-format
|
#, c-format, boost-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"The object from file %s is too small, and may be in meters or inches.\n"
|
"The object from file %s is too small, and may be in meters or inches.\n"
|
||||||
" Do you want to scale to millimeters?"
|
"Do you want to scale to millimeters?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"El objeto del archivo %s es demasiado pequeño, tal vez en metros o pulgadas.\n"
|
"El objeto del archivo %s es demasiado pequeño, tal vez en metros o pulgadas.\n"
|
||||||
" ¿Quiere escalar a milímetros?"
|
"¿Quiere escalar a milímetros?"
|
||||||
|
|
||||||
msgid "Object too small"
|
msgid "Object too small"
|
||||||
msgstr "Objeto demasiado pequeño"
|
msgstr "Objeto demasiado pequeño"
|
||||||
@@ -7883,6 +7958,12 @@ msgstr ""
|
|||||||
msgid "Multi-part object detected"
|
msgid "Multi-part object detected"
|
||||||
msgstr "Objeto multipieza detectado"
|
msgstr "Objeto multipieza detectado"
|
||||||
|
|
||||||
|
msgid "Matching textures to filaments"
|
||||||
|
msgstr "Asociando texturas a los filamentos"
|
||||||
|
|
||||||
|
msgid "Texture Import Warning"
|
||||||
|
msgstr "Aviso de importación de texturas"
|
||||||
|
|
||||||
msgid "Load these files as a single object with multiple parts?\n"
|
msgid "Load these files as a single object with multiple parts?\n"
|
||||||
msgstr "¿Cargar estos archivos como un objeto único con múltiples piezas?\n"
|
msgstr "¿Cargar estos archivos como un objeto único con múltiples piezas?\n"
|
||||||
|
|
||||||
@@ -7997,19 +8078,19 @@ msgstr "No se seleccionó el directorio para el reemplazo"
|
|||||||
msgid "Replaced with 3D files from directory:\n"
|
msgid "Replaced with 3D files from directory:\n"
|
||||||
msgstr "Reemplazado con archivos 3D desde el directorio:\n"
|
msgstr "Reemplazado con archivos 3D desde el directorio:\n"
|
||||||
|
|
||||||
#, c-format
|
#, c-format, boost-format
|
||||||
msgid "✖ Skipped %s: same file.\n"
|
msgid "✖ Skipped %s: same file.\n"
|
||||||
msgstr "✖ Omitido %s: mismo archivo.\n"
|
msgstr "✖ Omitido %s: mismo archivo.\n"
|
||||||
|
|
||||||
#, c-format
|
#, c-format, boost-format
|
||||||
msgid "✖ Skipped %s: file does not exist.\n"
|
msgid "✖ Skipped %s: file does not exist.\n"
|
||||||
msgstr "✖ Omitido %s: el archivo no existe.\n"
|
msgstr "✖ Omitido %s: el archivo no existe.\n"
|
||||||
|
|
||||||
#, c-format
|
#, c-format, boost-format
|
||||||
msgid "✖ Skipped %s: failed to replace.\n"
|
msgid "✖ Skipped %s: failed to replace.\n"
|
||||||
msgstr "✖ Omitido %s: fallo al reemplazar.\n"
|
msgstr "✖ Omitido %s: fallo al reemplazar.\n"
|
||||||
|
|
||||||
#, c-format
|
#, c-format, boost-format
|
||||||
msgid "✔ Replaced %s.\n"
|
msgid "✔ Replaced %s.\n"
|
||||||
msgstr "✔ Reemplazado %s.\n"
|
msgstr "✔ Reemplazado %s.\n"
|
||||||
|
|
||||||
@@ -8087,6 +8168,18 @@ msgstr ""
|
|||||||
msgid "Sync now"
|
msgid "Sync now"
|
||||||
msgstr "Sincronizar ahora"
|
msgstr "Sincronizar ahora"
|
||||||
|
|
||||||
|
msgid "Texture import failed. The model appears to contain texture data, but the texture import process could not be completed. The model will be imported as geometry only."
|
||||||
|
msgstr "No se ha podido importar la textura. El modelo parece contener datos de textura, pero no se ha podido completar el proceso de importación. El modelo se importará solo como geometría."
|
||||||
|
|
||||||
|
msgid "Applying texture colors..."
|
||||||
|
msgstr "Aplicando colores de textura..."
|
||||||
|
|
||||||
|
msgid "Updating 3D view..."
|
||||||
|
msgstr "Actualizando la vista 3D..."
|
||||||
|
|
||||||
|
msgid "Texture colors applied."
|
||||||
|
msgstr "Colores de textura aplicados."
|
||||||
|
|
||||||
msgid "You can keep the modified presets for the new project or discard them"
|
msgid "You can keep the modified presets for the new project or discard them"
|
||||||
msgstr "Puedes mantener los perfiles modificados en el nuevo proyecto o descartarlos"
|
msgstr "Puedes mantener los perfiles modificados en el nuevo proyecto o descartarlos"
|
||||||
|
|
||||||
@@ -8218,6 +8311,17 @@ msgstr "Guardar el archivo laminado como:"
|
|||||||
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
|
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
|
||||||
msgstr "El archivo %s ha sido mandado al almacenamiento de la impresora y puede ser visualizado en la impresora."
|
msgstr "El archivo %s ha sido mandado al almacenamiento de la impresora y puede ser visualizado en la impresora."
|
||||||
|
|
||||||
|
msgid "Publish 3MF file as:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Failed to export the published 3MF file.\n"
|
||||||
|
"Please check whether the folder exists online or if other programs have the file open."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish"
|
||||||
|
msgstr "Publicar"
|
||||||
|
|
||||||
msgid "The nozzle type is not set. Please set the nozzle and try again."
|
msgid "The nozzle type is not set. Please set the nozzle and try again."
|
||||||
msgstr "El tipo de boquilla no está establecido. Configure la boquilla e inténtelo de nuevo."
|
msgstr "El tipo de boquilla no está establecido. Configure la boquilla e inténtelo de nuevo."
|
||||||
|
|
||||||
@@ -8419,8 +8523,6 @@ msgstr "¿Quieres continuar?"
|
|||||||
msgid "Language selection"
|
msgid "Language selection"
|
||||||
msgstr "Selección de idiomas"
|
msgstr "Selección de idiomas"
|
||||||
|
|
||||||
msgid "Switching application language while some presets are modified."
|
|
||||||
msgstr "Cambiando idioma de la aplicación mientras se modifican algunos perfiles."
|
|
||||||
|
|
||||||
msgid "Asia-Pacific"
|
msgid "Asia-Pacific"
|
||||||
msgstr "Asia-Pacífico"
|
msgstr "Asia-Pacífico"
|
||||||
@@ -8725,6 +8827,18 @@ msgstr "Con esta opción activada, puede enviar una tarea a varios dispositivos
|
|||||||
msgid "Pop up to select filament grouping mode"
|
msgid "Pop up to select filament grouping mode"
|
||||||
msgstr "Ventana emergente para seleccionar el modo de agrupación de filamentos"
|
msgstr "Ventana emergente para seleccionar el modo de agrupación de filamentos"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Visible plugin pages"
|
||||||
|
msgstr "Páginas de plugins visibles"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "pages"
|
||||||
|
msgstr "páginas"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Number of plugin pages shown as fixed tabs before the remaining pages collapse into a dropdown on the last tab."
|
||||||
|
msgstr "Número de páginas de plugins que se muestran como pestañas fijas antes de que el resto de páginas se agrupe en un desplegable en la última pestaña."
|
||||||
|
|
||||||
msgid "Behaviour"
|
msgid "Behaviour"
|
||||||
msgstr "Comportamiento"
|
msgstr "Comportamiento"
|
||||||
|
|
||||||
@@ -9074,6 +9188,18 @@ msgstr "Mostrar ajustes preestablecidos no compatibles"
|
|||||||
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
|
||||||
msgstr "Mostrar los ajustes preestablecidos incompatibles o no compatibles en los menús desplegables de impresoras y filamentos. Estos ajustes preestablecidos no se pueden seleccionar."
|
msgstr "Mostrar los ajustes preestablecidos incompatibles o no compatibles en los menús desplegables de impresoras y filamentos. Estos ajustes preestablecidos no se pueden seleccionar."
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "(Experimental) Use printer agents instead of print hosts"
|
||||||
|
msgstr "(Experimental) Usar agentes de impresora en lugar de hosts de impresión"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid ""
|
||||||
|
"Route print jobs for non-Bambu printers through printer plug-in agents instead of the classic print-host upload flow.\n"
|
||||||
|
"When disabled, OrcaSlicer uses the legacy print-host behavior."
|
||||||
|
msgstr ""
|
||||||
|
"Envía los trabajos de impresión de impresoras que no son Bambu a través de los agentes de plugin de impresora en lugar del flujo clásico de subida al host de impresión.\n"
|
||||||
|
"Cuando está desactivado, OrcaSlicer utiliza el comportamiento heredado del host de impresión."
|
||||||
|
|
||||||
msgid "Experimental Features"
|
msgid "Experimental Features"
|
||||||
msgstr "Funciones experimentales"
|
msgstr "Funciones experimentales"
|
||||||
|
|
||||||
@@ -9278,6 +9404,9 @@ msgstr "Vaso en espiral"
|
|||||||
msgid "First layer filament sequence"
|
msgid "First layer filament sequence"
|
||||||
msgstr "Secuencia de primera capa de filamento"
|
msgstr "Secuencia de primera capa de filamento"
|
||||||
|
|
||||||
|
msgid "The filament list contains mixed filaments. Custom filament sequence will not take effect."
|
||||||
|
msgstr "La lista de filamentos contiene filamentos mixtos. La secuencia de filamentos personalizada no tendrá efecto."
|
||||||
|
|
||||||
msgid "By Layer"
|
msgid "By Layer"
|
||||||
msgstr "Por Capa"
|
msgstr "Por Capa"
|
||||||
|
|
||||||
@@ -9305,9 +9434,6 @@ msgstr "Ir a la página web de publicación de modelos"
|
|||||||
msgid "Note: The preparation may take several minutes. Please be patient."
|
msgid "Note: The preparation may take several minutes. Please be patient."
|
||||||
msgstr "Nota: La preparación puede llevar varios minutos. Por favor, sea paciente."
|
msgstr "Nota: La preparación puede llevar varios minutos. Por favor, sea paciente."
|
||||||
|
|
||||||
msgid "Publish"
|
|
||||||
msgstr "Publicar"
|
|
||||||
|
|
||||||
msgid "Publish was canceled"
|
msgid "Publish was canceled"
|
||||||
msgstr "La publicación fue cancelada"
|
msgstr "La publicación fue cancelada"
|
||||||
|
|
||||||
@@ -9323,6 +9449,64 @@ msgstr "Cargando datos"
|
|||||||
msgid "Jump to webpage"
|
msgid "Jump to webpage"
|
||||||
msgstr "Ir a la página web"
|
msgstr "Ir a la página web"
|
||||||
|
|
||||||
|
msgid "Material"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Some mixed filaments rely on filaments that will not be published:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#, c-format, boost-format
|
||||||
|
msgid "Filament %d (mixed)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "needs"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "not enabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "material not published"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish anyway"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish 3MF..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Select which settings to be published in the 3MF file"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish 3MF Wiki"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish 3MF Video Guide"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Publish this filament slot in the 3MF file"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Full Publish"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Embed the entire filament of this slot in the 3MF file"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Filter non-selected"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, c-format, boost-format
|
#, c-format, boost-format
|
||||||
msgid "Save %s as"
|
msgid "Save %s as"
|
||||||
msgstr "Guardar %s como"
|
msgstr "Guardar %s como"
|
||||||
@@ -9333,9 +9517,25 @@ msgstr "Perfil de usuario"
|
|||||||
msgid "Preset Inside Project"
|
msgid "Preset Inside Project"
|
||||||
msgstr "Perfil interno del proyecto"
|
msgstr "Perfil interno del proyecto"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Copies all inherited values from the parent into this preset and removes the parent relationship. Presets compatible only with the parent may become unsupported."
|
||||||
|
msgstr "Copia en este perfil todos los valores heredados del perfil padre y elimina la relación de herencia. Los perfiles compatibles solo con el perfil padre pueden dejar de ser compatibles."
|
||||||
|
|
||||||
msgid "Detach from parent"
|
msgid "Detach from parent"
|
||||||
msgstr "Separar del elemento padre"
|
msgstr "Separar del elemento padre"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Unique preset"
|
||||||
|
msgstr "Perfil único"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Parent preset"
|
||||||
|
msgstr "Perfil padre"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "This preset does not inherit from another preset."
|
||||||
|
msgstr "Este perfil no hereda de otro perfil."
|
||||||
|
|
||||||
msgid "Name is unavailable."
|
msgid "Name is unavailable."
|
||||||
msgstr "El nombre no está disponible."
|
msgstr "El nombre no está disponible."
|
||||||
|
|
||||||
@@ -10031,22 +10231,6 @@ msgstr "¿Está seguro de que desea activar esta opción?"
|
|||||||
msgid "Infill patterns are typically designed to handle rotation automatically to ensure proper printing and achieve their intended effects (e.g., Gyroid, Cubic). Rotating the current sparse infill pattern may lead to insufficient support. Please proceed with caution and thoroughly check for any potential printing issues. Are you sure you want to enable this option?"
|
msgid "Infill patterns are typically designed to handle rotation automatically to ensure proper printing and achieve their intended effects (e.g., Gyroid, Cubic). Rotating the current sparse infill pattern may lead to insufficient support. Please proceed with caution and thoroughly check for any potential printing issues. Are you sure you want to enable this option?"
|
||||||
msgstr "Los patrones de relleno suelen diseñarse para gestionar la rotación automáticamente y asegurar una impresión adecuada y lograr sus efectos previstos (p. ej., Giroide, Cúbico). Rotar el patrón de relleno actual puede provocar soporte insuficiente. Proceda con precaución y compruebe detenidamente posibles problemas de impresión. ¿Está seguro de que desea activar esta opción?"
|
msgstr "Los patrones de relleno suelen diseñarse para gestionar la rotación automáticamente y asegurar una impresión adecuada y lograr sus efectos previstos (p. ej., Giroide, Cúbico). Rotar el patrón de relleno actual puede provocar soporte insuficiente. Proceda con precaución y compruebe detenidamente posibles problemas de impresión. ¿Está seguro de que desea activar esta opción?"
|
||||||
|
|
||||||
msgid ""
|
|
||||||
"Layer height is too small.\n"
|
|
||||||
"It will set to min_layer_height\n"
|
|
||||||
msgstr ""
|
|
||||||
"La altura de la capa es demasiado pequeña.\n"
|
|
||||||
"Se establecerá en min_layer_height\n"
|
|
||||||
|
|
||||||
msgid "Layer height exceeds the limit in Printer Settings -> Extruder -> Layer height limits, this may cause printing quality issues."
|
|
||||||
msgstr "La altura de la capa excede el límite en Ajustes de la Impresora -> Extrusor -> Limite de Altura de Capa, esto puede causar problemas de calidad de impresión."
|
|
||||||
|
|
||||||
msgid "Adjust to the set range automatically?\n"
|
|
||||||
msgstr "¿Desea ajustar el rango automáticamente?\n"
|
|
||||||
|
|
||||||
msgid "Adjust"
|
|
||||||
msgstr "Ajustar"
|
|
||||||
|
|
||||||
msgid "Experimental feature: Retracting and cutting off the filament at a greater distance during filament changes to minimize flush. Although it can notably reduce flush, it may also elevate the risk of nozzle clogs or other printing complications."
|
msgid "Experimental feature: Retracting and cutting off the filament at a greater distance during filament changes to minimize flush. Although it can notably reduce flush, it may also elevate the risk of nozzle clogs or other printing complications."
|
||||||
msgstr "Función experimental: retraer y cortar el filamento a una mayor distancia durante los cambios de filamento para minimizar el purgado. Aunque puede reducir notablemente el purgado, también puede aumentar el riesgo de atascos de boquilla u otras complicaciones de impresión.Característica experimental: Retraer y cortar el filamento a mayor distancia durante los cambios de filamento para minimizar el descarte. Aunque puede reducir notablemente el descarte, también puede elevar el riesgo de atascos de boquillas u otros problemas en la impresión."
|
msgstr "Función experimental: retraer y cortar el filamento a una mayor distancia durante los cambios de filamento para minimizar el purgado. Aunque puede reducir notablemente el purgado, también puede aumentar el riesgo de atascos de boquilla u otras complicaciones de impresión.Característica experimental: Retraer y cortar el filamento a mayor distancia durante los cambios de filamento para minimizar el descarte. Aunque puede reducir notablemente el descarte, también puede elevar el riesgo de atascos de boquillas u otros problemas en la impresión."
|
||||||
|
|
||||||
@@ -10238,6 +10422,9 @@ msgstr "Palabras clave utilizadas y encontradas"
|
|||||||
msgid "Setting Overrides"
|
msgid "Setting Overrides"
|
||||||
msgstr "Sobreescribir Ajustes de impresora"
|
msgstr "Sobreescribir Ajustes de impresora"
|
||||||
|
|
||||||
|
msgid "Retraction when switching material"
|
||||||
|
msgstr "Retracción al cambiar de material"
|
||||||
|
|
||||||
msgid "Basic information"
|
msgid "Basic information"
|
||||||
msgstr "Información básica"
|
msgstr "Información básica"
|
||||||
|
|
||||||
@@ -10364,6 +10551,12 @@ msgstr "Perfiles de proceso compatibles"
|
|||||||
msgid "Printable space"
|
msgid "Printable space"
|
||||||
msgstr "Espacio imprimible"
|
msgstr "Espacio imprimible"
|
||||||
|
|
||||||
|
msgid "Printer Agent"
|
||||||
|
msgstr "Agente de impresora"
|
||||||
|
|
||||||
|
msgid "Select the network agent implementation for printer communication. Available agents are registered at startup."
|
||||||
|
msgstr "Seleccione la implementación del agente de red para la comunicación con la impresora. Los agentes disponibles se registran al iniciar el sistema."
|
||||||
|
|
||||||
#. TRN: The first argument is the parameter's name; the second argument is its value.
|
#. TRN: The first argument is the parameter's name; the second argument is its value.
|
||||||
#, boost-format
|
#, boost-format
|
||||||
msgid "Invalid value provided for parameter %1%: %2%"
|
msgid "Invalid value provided for parameter %1%: %2%"
|
||||||
@@ -10489,9 +10682,6 @@ msgstr "Límites de altura de la capa"
|
|||||||
msgid "Z-Hop"
|
msgid "Z-Hop"
|
||||||
msgstr "Salto en Z"
|
msgstr "Salto en Z"
|
||||||
|
|
||||||
msgid "Retraction when switching material"
|
|
||||||
msgstr "Retracción al cambiar de material"
|
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n"
|
"The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n"
|
||||||
"\n"
|
"\n"
|
||||||
@@ -10604,11 +10794,11 @@ msgstr "%s: %s"
|
|||||||
msgid "No modifications need to be copied."
|
msgid "No modifications need to be copied."
|
||||||
msgstr "No hay modificaciones que copiar."
|
msgstr "No hay modificaciones que copiar."
|
||||||
|
|
||||||
msgid "Copy paramters"
|
msgid "Copy parameters"
|
||||||
msgstr "Copiar parámetros"
|
msgstr "Copiar parámetros"
|
||||||
|
|
||||||
#, c-format, boost-format
|
#, c-format, boost-format
|
||||||
msgid "Modify paramters of %s"
|
msgid "Modify parameters of %s"
|
||||||
msgstr "Modificar parámetros de %s"
|
msgstr "Modificar parámetros de %s"
|
||||||
|
|
||||||
#, c-format, boost-format
|
#, c-format, boost-format
|
||||||
@@ -11115,27 +11305,6 @@ msgstr "Volúmenes de purgado para el cambio de filamentos"
|
|||||||
msgid "Please choose the filament colour"
|
msgid "Please choose the filament colour"
|
||||||
msgstr "Por favor, elija el color del filamento"
|
msgstr "Por favor, elija el color del filamento"
|
||||||
|
|
||||||
msgid "Native Wayland liveview requires the GStreamer GTK video sink. Please install the gtksink plugin for GStreamer, then restart OrcaSlicer."
|
|
||||||
msgstr "La función de visualización en directo nativa de Wayland requiere el receptor de vídeo GTK de GStreamer. Instale el plugin gtksink para GStreamer y, a continuación, reinicie OrcaSlicer."
|
|
||||||
|
|
||||||
msgid "Failed to initialize the native Wayland GStreamer video sink. Please check your GStreamer GTK plugin installation."
|
|
||||||
msgstr "No se pudo inicializar el receptor de vídeo nativo de Wayland GStreamer. Compruebe la instalación del plugin GTK de GStreamer."
|
|
||||||
|
|
||||||
msgid "Windows Media Player is required for this task! Do you want to enable 'Windows Media Player' for your operation system?"
|
|
||||||
msgstr "Para esta tarea se necesita el Reproductor de Windows Media. ¿Desea activar el \"Reproductor de Windows Media\" en su sistema operativo?"
|
|
||||||
|
|
||||||
msgid "BambuSource has not correctly been registered for media playing! Press Yes to re-register it. You will be promoted twice"
|
|
||||||
msgstr "BambuSource no se ha registrado correctamente para la reproducción multimedia. Pulse Sí para volver a registrarlo. Será promocionado dos veces"
|
|
||||||
|
|
||||||
msgid "Missing BambuSource component registered for media playing! Please re-install OrcaSlicer or seek community help."
|
|
||||||
msgstr "¡Falta el componente BambuSource para la reproducción de medios! Reinstale OrcaSlicer o busque ayuda en la comunidad."
|
|
||||||
|
|
||||||
msgid "Using a BambuSource from a different install, video play may not work correctly! Press Yes to fix it."
|
|
||||||
msgstr "Si utiliza una BambuSource de una instalación diferente, es posible que la reproducción de vídeo no funcione correctamente. Pulsa Sí para solucionarlo."
|
|
||||||
|
|
||||||
msgid "Your system is missing H.264 codecs for GStreamer, which are required to play video. (Try installing the gstreamer1.0-plugins-bad or gstreamer1.0-libav packages, then restart Orca Slicer?)"
|
|
||||||
msgstr "A tu sistema le faltan los codecs H.264 para GStreamer, necesarios para reproducir vídeo. (Prueba a instalar los paquetes gstreamer1.0-plugins-bad o gstreamer1.0-libav y, a continuación, reinicia Orca Slicer...)."
|
|
||||||
|
|
||||||
msgid "Cloud agent is not available. Please restart OrcaSlicer and try again."
|
msgid "Cloud agent is not available. Please restart OrcaSlicer and try again."
|
||||||
msgstr "El proveedor de servicios en la nube no está disponible. Reinicia OrcaSlicer e inténtalo de nuevo."
|
msgstr "El proveedor de servicios en la nube no está disponible. Reinicia OrcaSlicer e inténtalo de nuevo."
|
||||||
|
|
||||||
@@ -11809,6 +11978,10 @@ msgstr " está demasiado cerca de una zona de exclusión, lo que provocará coli
|
|||||||
msgid " is too close to clumping detection area, and collisions will be caused.\n"
|
msgid " is too close to clumping detection area, and collisions will be caused.\n"
|
||||||
msgstr " está demasiado cerca del área de detección de aglomeraciones, y se producirán colisiones.\n"
|
msgstr " está demasiado cerca del área de detección de aglomeraciones, y se producirán colisiones.\n"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid " is partially outside the printable area, and it cannot be printed.\n"
|
||||||
|
msgstr " está parcialmente fuera del área imprimible, y no se puede imprimir.\n"
|
||||||
|
|
||||||
msgid "Selected nozzle temperatures are incompatible. Each filament's nozzle temperature must fall within the recommended nozzle temperature range of the other filaments. Otherwise, nozzle clogging or printer damage may occur."
|
msgid "Selected nozzle temperatures are incompatible. Each filament's nozzle temperature must fall within the recommended nozzle temperature range of the other filaments. Otherwise, nozzle clogging or printer damage may occur."
|
||||||
msgstr "Las temperaturas de boquilla seleccionadas son incompatibles. La temperatura de boquilla de cada filamento debe estar dentro del rango de temperaturas recomendado para los demás filamentos. De lo contrario, podrían producirse atascos en la boquilla o daños en la impresora."
|
msgstr "Las temperaturas de boquilla seleccionadas son incompatibles. La temperatura de boquilla de cada filamento debe estar dentro del rango de temperaturas recomendado para los demás filamentos. De lo contrario, podrían producirse atascos en la boquilla o daños en la impresora."
|
||||||
|
|
||||||
@@ -11821,6 +11994,9 @@ msgstr "Si aún así quieres imprimir, puedes activar la opción en Preferencias
|
|||||||
msgid "No extrusions under current settings."
|
msgid "No extrusions under current settings."
|
||||||
msgstr "No hay extrusiones con los ajustes actuales."
|
msgstr "No hay extrusiones con los ajustes actuales."
|
||||||
|
|
||||||
|
msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed."
|
||||||
|
msgstr "Se está usando un filamento mixto con degradado, pero 'Subcapa de color mezclado' está desactivado. El degradado no se imprimirá."
|
||||||
|
|
||||||
msgid "Smooth mode of timelapse is not supported when \"by object\" sequence is enabled."
|
msgid "Smooth mode of timelapse is not supported when \"by object\" sequence is enabled."
|
||||||
msgstr "Modo de timelapse suave no está soportado cuando la secuencia \"por objeto\" está activada."
|
msgstr "Modo de timelapse suave no está soportado cuando la secuencia \"por objeto\" está activada."
|
||||||
|
|
||||||
@@ -11857,6 +12033,9 @@ msgstr "Es posible que desee reducir el tamaño de su modelo o cambiar la config
|
|||||||
msgid "Variable layer height is not supported with Organic supports."
|
msgid "Variable layer height is not supported with Organic supports."
|
||||||
msgstr "La altura de capa adaptativa no es compatible con los soportes orgánicos."
|
msgstr "La altura de capa adaptativa no es compatible con los soportes orgánicos."
|
||||||
|
|
||||||
|
msgid "The wipe tower filament cannot be a mixed filament."
|
||||||
|
msgstr "El filamento de la torre de purga no puede ser un filamento mixto."
|
||||||
|
|
||||||
msgid "Different nozzle diameters and different filament diameters may not work well when the prime tower is enabled. It's very experimental, so please proceed with caution."
|
msgid "Different nozzle diameters and different filament diameters may not work well when the prime tower is enabled. It's very experimental, so please proceed with caution."
|
||||||
msgstr "Diámetros de boquillas y diámetros de filamento diferentes pueden no funcionar correctamente cuando la torre de purga está activada. Esta función es experimental, así que proceda con cautela."
|
msgstr "Diámetros de boquillas y diámetros de filamento diferentes pueden no funcionar correctamente cuando la torre de purga está activada. Esta función es experimental, así que proceda con cautela."
|
||||||
|
|
||||||
@@ -12116,9 +12295,6 @@ msgstr "Utiliza 3MF en lugar de G-code"
|
|||||||
msgid "Enable this if the printer accepts a 3MF file as the print job. When enabled, Orca Slicer sends the sliced file as a .gcode.3mf, instead of a plain .gcode file."
|
msgid "Enable this if the printer accepts a 3MF file as the print job. When enabled, Orca Slicer sends the sliced file as a .gcode.3mf, instead of a plain .gcode file."
|
||||||
msgstr "Activa esta opción si la impresora admite un archivo 3MF como trabajo de impresión. Cuando está activada, Orca Slicer envía el archivo cortado como un archivo .gcode.3mf, en lugar de como un archivo .gcode convencional."
|
msgstr "Activa esta opción si la impresora admite un archivo 3MF como trabajo de impresión. Cuando está activada, Orca Slicer envía el archivo cortado como un archivo .gcode.3mf, en lugar de como un archivo .gcode convencional."
|
||||||
|
|
||||||
msgid "Printer Agent"
|
|
||||||
msgstr "Agente de impresora"
|
|
||||||
|
|
||||||
msgid "Select the network agent implementation for printer communication."
|
msgid "Select the network agent implementation for printer communication."
|
||||||
msgstr "Seleccione la implementación del agente de red para la comunicación con la impresora."
|
msgstr "Seleccione la implementación del agente de red para la comunicación con la impresora."
|
||||||
|
|
||||||
@@ -12200,8 +12376,8 @@ msgstr "mm o %"
|
|||||||
msgid "Other layers"
|
msgid "Other layers"
|
||||||
msgstr "Otras capas"
|
msgstr "Otras capas"
|
||||||
|
|
||||||
msgid "Bed temperature for layers except the initial one. A value of 0 means the filament does not support printing on the Cool Plate SuperTack."
|
msgid "This is the bed temperature for layers except for the first one. A value of 0 means the filament does not support printing on the Cool Plate SuperTack."
|
||||||
msgstr "Temperatura de la cama para las capas, excepto la inicial. Un valor de 0 significa que el filamento no es compatible con la Cama Fría SuperTack."
|
msgstr "Esta es la temperatura de la cama para las capas excepto la inicial. Un valor de 0 significa que el filamento no es compatible con la Cama Fría SuperTack."
|
||||||
|
|
||||||
msgid "This is the bed temperature for layers except for the first one. A value of 0 means the filament does not support printing on the Cool Plate."
|
msgid "This is the bed temperature for layers except for the first one. A value of 0 means the filament does not support printing on the Cool Plate."
|
||||||
msgstr "Esta es la temperatura de la cama para las capas excepto la inicial. Un valor de 0 significa que el filamento no admite la impresión en la Cama Fría."
|
msgstr "Esta es la temperatura de la cama para las capas excepto la inicial. Un valor de 0 significa que el filamento no admite la impresión en la Cama Fría."
|
||||||
@@ -12794,9 +12970,6 @@ msgstr ""
|
|||||||
msgid "Speed of internal bridges. If the value is expressed as a percentage, it will be calculated based on the bridge_speed. Default value is 150%."
|
msgid "Speed of internal bridges. If the value is expressed as a percentage, it will be calculated based on the bridge_speed. Default value is 150%."
|
||||||
msgstr "Velocidad de los puntes internos. Si se expresa como un porcentaje, será Calculado en base a la velocidad de puente. El valor por defecto es 150%."
|
msgstr "Velocidad de los puntes internos. Si se expresa como un porcentaje, será Calculado en base a la velocidad de puente. El valor por defecto es 150%."
|
||||||
|
|
||||||
msgid "Brim width"
|
|
||||||
msgstr "Ancho del borde de adherencia"
|
|
||||||
|
|
||||||
msgid "This is the distance from the model to the outermost brim line."
|
msgid "This is the distance from the model to the outermost brim line."
|
||||||
msgstr "Distancia del modelo a la línea más externa del borde de adherencia."
|
msgstr "Distancia del modelo a la línea más externa del borde de adherencia."
|
||||||
|
|
||||||
@@ -12876,6 +13049,14 @@ msgstr ""
|
|||||||
"La geometría se verá diezmada antes de detectar angulos agudos. Este parámetro indica la longitud mínima de desviación para el diezmado\n"
|
"La geometría se verá diezmada antes de detectar angulos agudos. Este parámetro indica la longitud mínima de desviación para el diezmado\n"
|
||||||
"0 para desactivar."
|
"0 para desactivar."
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Brim ears outer only"
|
||||||
|
msgstr "Orejas de borde solo en el exterior"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Generate mouse ears only on the outer contour of the model, excluding holes and enclosed sections."
|
||||||
|
msgstr "Genera orejas de ratón únicamente en el contorno exterior del modelo, excluyendo agujeros y secciones cerradas."
|
||||||
|
|
||||||
msgid "upward compatible machine"
|
msgid "upward compatible machine"
|
||||||
msgstr "máquina compatible ascendente"
|
msgstr "máquina compatible ascendente"
|
||||||
|
|
||||||
@@ -13539,6 +13720,7 @@ msgstr "Tiempo de capa"
|
|||||||
msgid "The part cooling fan will be enabled for layers where the estimated time is shorter than this value. Fan speed is interpolated between the minimum and maximum fan speeds according to layer printing time."
|
msgid "The part cooling fan will be enabled for layers where the estimated time is shorter than this value. Fan speed is interpolated between the minimum and maximum fan speeds according to layer printing time."
|
||||||
msgstr "El ventilador de refrigeración de la pieza se activará para las capas cuyo tiempo estimado sea inferior a este valor. La velocidad del ventilador se interpola entre las velocidades mínima y máxima del ventilador en función del tiempo de impresión de cada capa."
|
msgstr "El ventilador de refrigeración de la pieza se activará para las capas cuyo tiempo estimado sea inferior a este valor. La velocidad del ventilador se interpola entre las velocidades mínima y máxima del ventilador en función del tiempo de impresión de cada capa."
|
||||||
|
|
||||||
|
msgctxt "second"
|
||||||
msgid "s"
|
msgid "s"
|
||||||
msgstr "s"
|
msgstr "s"
|
||||||
|
|
||||||
@@ -13844,6 +14026,50 @@ msgstr "Material de soporte"
|
|||||||
msgid "Support material is commonly used to print supports and support interfaces."
|
msgid "Support material is commonly used to print supports and support interfaces."
|
||||||
msgstr "El material de soporte se utiliza habitualmente para imprimir soportes y la interfaz de los soportes."
|
msgstr "El material de soporte se utiliza habitualmente para imprimir soportes y la interfaz de los soportes."
|
||||||
|
|
||||||
|
msgid "Is mixed filament"
|
||||||
|
msgstr "Es filamento mixto"
|
||||||
|
|
||||||
|
msgid "Whether this filament slot is a mixed filament composed of multiple physical filaments"
|
||||||
|
msgstr "Indica si esta ranura de filamento es un filamento mixto compuesto por varios filamentos físicos"
|
||||||
|
|
||||||
|
msgid "Mixed filament components"
|
||||||
|
msgstr "Componentes del filamento mixto"
|
||||||
|
|
||||||
|
msgid "Comma-separated 1-based indices of component filaments, e.g. \"1,3\""
|
||||||
|
msgstr "Índices (empezando en 1) de los filamentos componentes, separados por comas; p. ej. \"1,3\""
|
||||||
|
|
||||||
|
msgid "Mixed filament sublayer ratios"
|
||||||
|
msgstr "Proporciones de subcapa del filamento mixto"
|
||||||
|
|
||||||
|
msgid "Comma-separated ratio values summing to 1.0, e.g. \"0.7,0.3\""
|
||||||
|
msgstr "Valores de proporción separados por comas cuya suma sea 1.0; p. ej. \"0.7,0.3\""
|
||||||
|
|
||||||
|
msgid "Mixed filament gradient"
|
||||||
|
msgstr "Degradado del filamento mixto"
|
||||||
|
|
||||||
|
msgid "Enable Z-direction gradient mode for mixed filament sub-layers. When enabled, the sub-layer ratios vary linearly across layers."
|
||||||
|
msgstr "Activa el modo de degradado en dirección Z para las subcapas del filamento mixto. Al activarlo, las proporciones de las subcapas varían linealmente entre capas."
|
||||||
|
|
||||||
|
msgid "Mixed filament gradient range"
|
||||||
|
msgstr "Rango del degradado del filamento mixto"
|
||||||
|
|
||||||
|
msgid "Start and end ratios for the first component in gradient mode. Comma-separated pair, e.g. \"0.10,0.90\" means 10% to 90%."
|
||||||
|
msgstr "Proporciones inicial y final del primer componente en el modo de degradado. Par separado por comas; p. ej. \"0.10,0.90\" significa del 10% al 90%."
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Mixed filament gradient curve"
|
||||||
|
msgstr "Curva del degradado del filamento mixto"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Optional Photoshop-style custom curve mapping Z progress to the first component ratio. Encoded as pipe-separated control points, either \"x,y\" (legacy) or \"x,y,m_in,m_out\" when a tangent override is needed (empty token or \"nan\" means use PCHIP default). x in [0,1]; y is clamped to the configured ratio range, e.g. \"0,0.15|0.5,0.50|1,0.85\". When empty, the linear gradient_range is used instead."
|
||||||
|
msgstr "Curva personalizada opcional, al estilo de Photoshop, que asigna el progreso en Z a la proporción del primer componente. Se codifica como puntos de control separados por barras verticales, con el formato \"x,y\" (heredado) o \"x,y,m_in,m_out\" cuando se necesita anular la tangente (un valor vacío o \"nan\" usa el valor PCHIP predeterminado). x está en [0,1]; y se limita al rango de proporciones configurado; p. ej. \"0,0.15|0.5,0.50|1,0.85\". Si se deja vacío, se usa el gradient_range lineal."
|
||||||
|
|
||||||
|
msgid "Mixed filament per-part gradient"
|
||||||
|
msgstr "Degradado por pieza del filamento mixto"
|
||||||
|
|
||||||
|
msgid "When gradient mode is enabled, apply the gradient to each part of an assembly independently rather than treating the whole assembly as one Z range."
|
||||||
|
msgstr "Cuando el modo de degradado está activado, aplica el degradado a cada pieza de un ensamblaje de forma independiente en lugar de tratar todo el ensamblaje como un único rango Z."
|
||||||
|
|
||||||
msgid "Filament printable"
|
msgid "Filament printable"
|
||||||
msgstr "Filamento imprimible"
|
msgstr "Filamento imprimible"
|
||||||
|
|
||||||
@@ -14011,6 +14237,14 @@ msgstr "TPMS-FK"
|
|||||||
msgid "Gyroid"
|
msgid "Gyroid"
|
||||||
msgstr "Giroide"
|
msgstr "Giroide"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Sparse infill smooth factor"
|
||||||
|
msgstr "Factor de suavizado del relleno poco denso"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Controls how strongly sparse infill corners are rounded. 0% keeps the original sharp path, while 100% produces the largest possible curves between adjacent infill lines."
|
||||||
|
msgstr "Controla cuánto se redondean las esquinas del relleno poco denso. 0% mantiene el trazado original con esquinas vivas, mientras que 100% produce las curvas más amplias posibles entre líneas de relleno adyacentes."
|
||||||
|
|
||||||
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
|
||||||
msgstr "Aceleración del relleno de la superficie superior. El uso de un valor más bajo puede mejorar la calidad de la superficie superior."
|
msgstr "Aceleración del relleno de la superficie superior. El uso de un valor más bajo puede mejorar la calidad de la superficie superior."
|
||||||
|
|
||||||
@@ -14544,6 +14778,14 @@ msgstr "Con qué tipo de G-Code es compatible la impresora."
|
|||||||
msgid "Klipper"
|
msgid "Klipper"
|
||||||
msgstr "Klipper"
|
msgstr "Klipper"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Skip G-code config block"
|
||||||
|
msgstr "Omitir el bloque de configuración del G-code"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Do not write the CONFIG_BLOCK (slicer configuration key/value pairs) into the G-code file. This can help with printers whose firmware crashes when parsing these comment lines (e.g. Anycubic go-klipper). Note: the G-code file will no longer contain slicer settings, so importing it back into OrcaSlicer will not restore the configuration."
|
||||||
|
msgstr "No escribe el CONFIG_BLOCK (los pares clave/valor de la configuración del laminador) en el archivo G-code. Esto puede ayudar con impresoras cuyo firmware falla al analizar esas líneas de comentario (p. ej. Anycubic go-klipper). Nota: el archivo G-code ya no contendrá los ajustes del laminador, por lo que al importarlo de nuevo en OrcaSlicer no se restaurará la configuración."
|
||||||
|
|
||||||
msgid "Pellet Modded Printer"
|
msgid "Pellet Modded Printer"
|
||||||
msgstr "Impresora Modificada para Pellets"
|
msgstr "Impresora Modificada para Pellets"
|
||||||
|
|
||||||
@@ -15062,6 +15304,7 @@ msgstr "Fuerza máxima del eje Y"
|
|||||||
msgid "The allowed maximum output force of Y axis"
|
msgid "The allowed maximum output force of Y axis"
|
||||||
msgstr "La fuerza máxima permitida del eje Y"
|
msgstr "La fuerza máxima permitida del eje Y"
|
||||||
|
|
||||||
|
msgctxt "Newton"
|
||||||
msgid "N"
|
msgid "N"
|
||||||
msgstr "N"
|
msgstr "N"
|
||||||
|
|
||||||
@@ -15071,6 +15314,7 @@ msgstr "Masa de la cama del eje Y"
|
|||||||
msgid "The machine bed mass load of Y axis"
|
msgid "The machine bed mass load of Y axis"
|
||||||
msgstr "La carga de la masa de la cama de la máquina del eje Y"
|
msgstr "La carga de la masa de la cama de la máquina del eje Y"
|
||||||
|
|
||||||
|
msgctxt "gram"
|
||||||
msgid "g"
|
msgid "g"
|
||||||
msgstr "g"
|
msgstr "g"
|
||||||
|
|
||||||
@@ -15382,7 +15626,7 @@ msgstr "Los puntos de inicio y fin, desde la zona de corte al cubo de basura."
|
|||||||
msgid "Reduce infill retraction"
|
msgid "Reduce infill retraction"
|
||||||
msgstr "Reducir la retracción del relleno"
|
msgstr "Reducir la retracción del relleno"
|
||||||
|
|
||||||
msgid "Don't retract when the travel is entirely within an infill area. That means the oozing can't been seen. This can reduce times of retraction for complex model and save printing time, but make slicing and G-code generating slower. Note that z-hop is also not performed in areas where retraction is skipped."
|
msgid "Don't retract when the travel is entirely within an infill area. That means the oozing can't been seen. This can reduce times of retraction for complex model and save printing time, but make slicing and G-code generating slower. Note that Z-hop is also not performed in areas where retraction is skipped."
|
||||||
msgstr "Desactiva la retracción cuando el desplazamiento se realiza en su totalidad dentro de un área de relleno, donde los artefactos causados por un rezumado no son visibles. Puede reducir el número de retracciones y por ende el tiempo total de retracción al imprimir modelos complejos, reduciendo el tiempo total de impresión. Sin embargo, puede que las operaciones de laminado y de generación del archivo G-Code sean más lentas."
|
msgstr "Desactiva la retracción cuando el desplazamiento se realiza en su totalidad dentro de un área de relleno, donde los artefactos causados por un rezumado no son visibles. Puede reducir el número de retracciones y por ende el tiempo total de retracción al imprimir modelos complejos, reduciendo el tiempo total de impresión. Sin embargo, puede que las operaciones de laminado y de generación del archivo G-Code sean más lentas."
|
||||||
|
|
||||||
msgid "This option will drop the temperature of the inactive extruders to prevent oozing."
|
msgid "This option will drop the temperature of the inactive extruders to prevent oozing."
|
||||||
@@ -15547,7 +15791,7 @@ msgstr "Cantidad de retracción después de la limpieza"
|
|||||||
|
|
||||||
#, no-c-format, no-boost-format
|
#, no-c-format, no-boost-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"The length of fast retraction after wipe, relative to retraction length.\n"
|
"This is the length of fast retraction after wipe, relative to retraction length.\n"
|
||||||
"The value will be clamped by 100% minus the retract amount before the wipe value."
|
"The value will be clamped by 100% minus the retract amount before the wipe value."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"La longitud de la retracción rápida después de la limpieza, relativa a la longitud de retracción.\n"
|
"La longitud de la retracción rápida después de la limpieza, relativa a la longitud de retracción.\n"
|
||||||
@@ -15583,10 +15827,18 @@ msgstr "Retracción larga al cambiar de extrusor"
|
|||||||
msgid "Retraction distance when extruder change"
|
msgid "Retraction distance when extruder change"
|
||||||
msgstr "Distancia de retracción al cambiar de extrusor"
|
msgstr "Distancia de retracción al cambiar de extrusor"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Retraction Length (Toolchange)"
|
||||||
|
msgstr "Longitud de retracción (Cambio de herramienta)"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "When retraction is triggered before changing tool, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)."
|
||||||
|
msgstr "Cuando se activa la retracción antes de un cambio de herramienta, el filamento se retrae la cantidad especificada (la longitud se mide sobre el filamento en bruto, antes de entrar en el extrusor)."
|
||||||
|
|
||||||
msgid "Z-hop height"
|
msgid "Z-hop height"
|
||||||
msgstr "Altura de Salto en Z"
|
msgstr "Altura de Salto en Z"
|
||||||
|
|
||||||
msgid "Whenever there is a retraction, the nozzle is lifted a little to create clearance between the nozzle and the print. This prevents the nozzle from hitting the print when traveling more. Using spiral lines to lift z can prevent stringing."
|
msgid "Whenever there is a retraction, the nozzle is lifted a little to create clearance between the nozzle and the print. This prevents the nozzle from hitting the print when traveling more. Using spiral lines to lift Z can prevent stringing."
|
||||||
msgstr "Cada vez que se realiza una retracción, la boquilla se levanta un poco para crear un pequeño margen entre la boquilla y la impresión. Esto evita que la boquilla golpee la pieza cuando se desplaza. El uso de la línea espiral para levantar z puede evitar la aparición de hilos."
|
msgstr "Cada vez que se realiza una retracción, la boquilla se levanta un poco para crear un pequeño margen entre la boquilla y la impresión. Esto evita que la boquilla golpee la pieza cuando se desplaza. El uso de la línea espiral para levantar z puede evitar la aparición de hilos."
|
||||||
|
|
||||||
msgid "Z-hop lower boundary"
|
msgid "Z-hop lower boundary"
|
||||||
@@ -15676,6 +15928,10 @@ msgstr "Longitud extra de reinicio"
|
|||||||
msgid "When the retraction is compensated after the travel move, the extruder will push this additional amount of filament. This setting is rarely needed."
|
msgid "When the retraction is compensated after the travel move, the extruder will push this additional amount of filament. This setting is rarely needed."
|
||||||
msgstr "Cuando la retracción se compensa después de un desplazamiento, el extrusor expulsará esta cantidad adicional de filamento. Esta función no suele ser necesaria."
|
msgstr "Cuando la retracción se compensa después de un desplazamiento, el extrusor expulsará esta cantidad adicional de filamento. Esta función no suele ser necesaria."
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Extra length on restart (Toolchange)"
|
||||||
|
msgstr "Longitud extra de reinicio (Cambio de herramienta)"
|
||||||
|
|
||||||
msgid "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament."
|
msgid "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament."
|
||||||
msgstr "Cuando se compensa la retracción después de cambiar de cabezal, el extrusor expulsará esta cantidad adicional de filamento."
|
msgstr "Cuando se compensa la retracción después de cambiar de cabezal, el extrusor expulsará esta cantidad adicional de filamento."
|
||||||
|
|
||||||
@@ -16082,6 +16338,14 @@ msgstr "Cambio de herramienta en la torre de purga"
|
|||||||
msgid "Force the toolhead to travel to the wipe tower before issuing the tool change command (Tx). Only relevant for multi-extruder (multi-toolhead) printers using a Type 2 wipe tower. By default Orca skips the travel on multi-toolhead machines because the firmware handles the head swap, which can result in the Tx command being issued above the printed part. Enable this option if you want the tool change to always be issued above the wipe tower instead."
|
msgid "Force the toolhead to travel to the wipe tower before issuing the tool change command (Tx). Only relevant for multi-extruder (multi-toolhead) printers using a Type 2 wipe tower. By default Orca skips the travel on multi-toolhead machines because the firmware handles the head swap, which can result in the Tx command being issued above the printed part. Enable this option if you want the tool change to always be issued above the wipe tower instead."
|
||||||
msgstr "Obliga al cabezal a desplazarse hasta la torre de purga antes de emitir el comando de cambio de herramienta (Tx). Solo es relevante para impresoras con múltiples extrusores (múltiples cabezales) que utilicen una torre de limpieza de tipo 2. Por defecto, Orca omite el desplazamiento en máquinas con múltiples cabezales porque el firmware se encarga del cambio de cabezal, lo que puede provocar que el comando Tx se emita por encima de la pieza impresa. Habilita esta opción si deseas que el cambio de herramienta se emita siempre por encima de la torre de purga."
|
msgstr "Obliga al cabezal a desplazarse hasta la torre de purga antes de emitir el comando de cambio de herramienta (Tx). Solo es relevante para impresoras con múltiples extrusores (múltiples cabezales) que utilicen una torre de limpieza de tipo 2. Por defecto, Orca omite el desplazamiento en máquinas con múltiples cabezales porque el firmware se encarga del cambio de cabezal, lo que puede provocar que el comando Tx se emita por encima de la pieza impresa. Habilita esta opción si deseas que el cambio de herramienta se emita siempre por encima de la torre de purga."
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Wait for temperature on wipe tower"
|
||||||
|
msgstr "Esperar la temperatura en la torre de purga"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Pick up the new tool without waiting for it to reach printing temperature, travel to the wipe tower, and wait for the temperature there, right before purging. Ooze from the heat-up lands on the tower instead of the model, and the travel overlaps with the heating. Only relevant for multi-extruder (multi-toolhead) printers using a Type 2 wipe tower. The firmware or tool change macro must not wait for the temperature itself. When disabled, the temperature wait is issued right after the tool change command."
|
||||||
|
msgstr "Recoge la nueva herramienta sin esperar a que alcance la temperatura de impresión, se desplaza a la torre de purga y espera allí la temperatura, justo antes de purgar. El rezumado del calentamiento cae sobre la torre en lugar de sobre el modelo, y el desplazamiento se solapa con el calentamiento. Solo es relevante para impresoras multiextrusor (multicabezal) que usan una torre de purga de tipo 2. El firmware o la macro de cambio de herramienta no deben esperar la temperatura por su cuenta. Cuando está desactivado, la espera de temperatura se emite justo después del comando de cambio de herramienta."
|
||||||
|
|
||||||
msgid "No sparse layers (beta)"
|
msgid "No sparse layers (beta)"
|
||||||
msgstr "Sin capas de baja densidad (beta)"
|
msgstr "Sin capas de baja densidad (beta)"
|
||||||
|
|
||||||
@@ -16607,6 +16871,14 @@ msgstr ""
|
|||||||
"\n"
|
"\n"
|
||||||
"Fijando un valor en la cantidad de retracción antes del purgado se realizará cualquier exceso de retracción antes del purgado, de lo contrario se realizará después."
|
"Fijando un valor en la cantidad de retracción antes del purgado se realizará cualquier exceso de retracción antes del purgado, de lo contrario se realizará después."
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Mixed color sublayer"
|
||||||
|
msgstr "Subcapa de color mezclado"
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "Enable mixed color sublayer splitting. When enabled, layers containing mixed color filaments will be split into sub-layers to achieve color mixing effects."
|
||||||
|
msgstr "Activa la división en subcapas de color mezclado. Al activarlo, las capas que contienen filamentos de color mezclado se dividen en subcapas para lograr efectos de mezcla de colores."
|
||||||
|
|
||||||
msgid "The wiping tower can be used to clean up residue on the nozzle and stabilize the chamber pressure inside the nozzle in order to avoid appearance defects when printing objects."
|
msgid "The wiping tower can be used to clean up residue on the nozzle and stabilize the chamber pressure inside the nozzle in order to avoid appearance defects when printing objects."
|
||||||
msgstr "La torre de purga puede utilizarse para limpiar los residuos de la boquilla y estabilizar la presión de la recámara en el interior de la boquilla, con el fin de evitar defectos visuales al imprimir objetos."
|
msgstr "La torre de purga puede utilizarse para limpiar los residuos de la boquilla y estabilizar la presión de la recámara en el interior de la boquilla, con el fin de evitar defectos visuales al imprimir objetos."
|
||||||
|
|
||||||
@@ -17315,7 +17587,7 @@ msgid "Current Z-hop"
|
|||||||
msgstr "Z-Hop actual"
|
msgstr "Z-Hop actual"
|
||||||
|
|
||||||
msgid "Contains Z-hop present at the beginning of the custom G-code block."
|
msgid "Contains Z-hop present at the beginning of the custom G-code block."
|
||||||
msgstr "Contiene el z-hop presente al principio del bloque de G-Code personalizado."
|
msgstr "Contiene el Z-hop presente al principio del bloque de G-Code personalizado."
|
||||||
|
|
||||||
msgid "Position of the extruder at the beginning of the custom G-code block. If the custom G-code travels somewhere else, it should write to this variable so OrcaSlicer knows where it travels from when it gets control back."
|
msgid "Position of the extruder at the beginning of the custom G-code block. If the custom G-code travels somewhere else, it should write to this variable so OrcaSlicer knows where it travels from when it gets control back."
|
||||||
msgstr "Posición del extrusor al comienzo del bloque de G-Code personalizado. Si el G-Code personalizado viaja a otro lugar, debe escribir en esta variable para que OrcaSlicer sepa desde dónde viaja cuando recupere el control."
|
msgstr "Posición del extrusor al comienzo del bloque de G-Code personalizado. Si el G-Code personalizado viaja a otro lugar, debe escribir en esta variable para que OrcaSlicer sepa desde dónde viaja cuando recupere el control."
|
||||||
@@ -17663,6 +17935,10 @@ msgstr "La generación de la malla del archivo del modelo falló o no hay una fo
|
|||||||
msgid "The supplied file couldn't be read because it's empty."
|
msgid "The supplied file couldn't be read because it's empty."
|
||||||
msgstr "No se ha podido leer el archivo proporcionado porque está vacío."
|
msgstr "No se ha podido leer el archivo proporcionado porque está vacío."
|
||||||
|
|
||||||
|
# AI Translated
|
||||||
|
msgid "The file format is incompatible and cannot be parsed."
|
||||||
|
msgstr "El formato del archivo es incompatible y no se puede analizar."
|
||||||
|
|
||||||
msgid "Unknown file format: input file must have .stl, .obj, or .amf(.xml) extension."
|
msgid "Unknown file format: input file must have .stl, .obj, or .amf(.xml) extension."
|
||||||
msgstr "Formato de archivo desconocido: el archivo de entrada debe tener extensión .STL, .obj o .amf (.xml)."
|
msgstr "Formato de archivo desconocido: el archivo de entrada debe tener extensión .STL, .obj o .amf (.xml)."
|
||||||
|
|
||||||
@@ -19125,17 +19401,17 @@ msgstr "Mostrar sólo los nombres de impresora con cambios en los perfiles de im
|
|||||||
msgid "Only display the filament names with changes to filament presets."
|
msgid "Only display the filament names with changes to filament presets."
|
||||||
msgstr "Mostrar sólo los nombres de impresora con cambios en los perfiles de filamento."
|
msgstr "Mostrar sólo los nombres de impresora con cambios en los perfiles de filamento."
|
||||||
|
|
||||||
msgid "Only printer names with user printer presets will be displayed, and each preset you choose will be exported as a zip."
|
msgid "Only printer names with user printer presets will be displayed, and each preset you choose will be exported as a ZIP archive."
|
||||||
msgstr "Sólo se mostrarán los nombres de impresoras con perfiles de impresora de usuario, y cada perfil que elija se exportará como un archivo zip."
|
msgstr "Sólo se mostrarán los nombres de impresoras con perfiles de impresora de usuario, y cada perfil que elija se exportará como un archivo zip."
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Only the filament names with user filament presets will be displayed, \n"
|
"Only the filament names with user filament presets will be displayed, \n"
|
||||||
"and all user filament presets in each filament name you select will be exported as a zip."
|
"and all user filament presets in each filament name you select will be exported as a ZIP archive."
|
||||||
msgstr "Sólo se mostrarán los nombres de filamento con perfiles de filamento de usuario, y todos los perfiles de filamento de usuario de cada nombre de filamento que seleccione se exportarán como un archivo zip."
|
msgstr "Sólo se mostrarán los nombres de filamento con perfiles de filamento de usuario, y todos los perfiles de filamento de usuario de cada nombre de filamento que seleccione se exportarán como un archivo zip."
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Only printer names with changed process presets will be displayed, \n"
|
"Only printer names with changed process presets will be displayed, \n"
|
||||||
"and all user process presets in each printer name you select will be exported as a zip."
|
"and all user process presets in each printer name you select will be exported as a ZIP archive."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Sólo se mostrarán los nombres de impresoras con perfiles de procesos modificados, \n"
|
"Sólo se mostrarán los nombres de impresoras con perfiles de procesos modificados, \n"
|
||||||
"y todos los perfiles de procesos de usuario de cada nombre de impresora que seleccione se exportarán como un archivo zip."
|
"y todos los perfiles de procesos de usuario de cada nombre de impresora que seleccione se exportarán como un archivo zip."
|
||||||
@@ -19281,9 +19557,6 @@ msgstr "Impresora física"
|
|||||||
msgid "Print Host upload"
|
msgid "Print Host upload"
|
||||||
msgstr "Mandar al servidor de impresión"
|
msgstr "Mandar al servidor de impresión"
|
||||||
|
|
||||||
msgid "Select the network agent implementation for printer communication. Available agents are registered at startup."
|
|
||||||
msgstr "Seleccione la implementación del agente de red para la comunicación con la impresora. Los agentes disponibles se registran al iniciar el sistema."
|
|
||||||
|
|
||||||
msgid "Select a Flashforge printer"
|
msgid "Select a Flashforge printer"
|
||||||
msgstr "Selecciona una impresora Flashforge"
|
msgstr "Selecciona una impresora Flashforge"
|
||||||
|
|
||||||
@@ -19367,7 +19640,7 @@ msgstr "Copiar información del sistema al portapapeles"
|
|||||||
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
msgid "We need information for diagnosing source of the issue. Check wiki page for detailed guide."
|
||||||
msgstr "Necesitamos información para diagnosticar el origen del problema. Consulta la página wiki para una guía detallada."
|
msgstr "Necesitamos información para diagnosticar el origen del problema. Consulta la página wiki para una guía detallada."
|
||||||
|
|
||||||
msgid "Pack button collects project file and logs of current session onto a zip file."
|
msgid "Pack button collects project file and logs of current session onto a ZIP archive."
|
||||||
msgstr "El botón Empaquetar recopila el archivo del proyecto y los registros de la sesión actual en un archivo zip."
|
msgstr "El botón Empaquetar recopila el archivo del proyecto y los registros de la sesión actual en un archivo zip."
|
||||||
|
|
||||||
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
msgid "Any additional visual examples like images or screen recordings might be helpful while reporting the issue."
|
||||||
@@ -19409,7 +19682,7 @@ msgstr "Nivel de registro"
|
|||||||
msgid "Stored logs"
|
msgid "Stored logs"
|
||||||
msgstr "Registros almacenados"
|
msgstr "Registros almacenados"
|
||||||
|
|
||||||
msgid "Packs all stored logs onto a zip file."
|
msgid "Packs all stored logs onto a ZIP archive."
|
||||||
msgstr "Empaqueta todos los registros almacenados en un archivo zip."
|
msgstr "Empaqueta todos los registros almacenados en un archivo zip."
|
||||||
|
|
||||||
msgid "Profiles"
|
msgid "Profiles"
|
||||||
@@ -19476,7 +19749,7 @@ msgstr "No se ha encontrado el tipo de impresora; selecciónelo manualmente."
|
|||||||
msgid "Authorizing..."
|
msgid "Authorizing..."
|
||||||
msgstr "Autorizando..."
|
msgstr "Autorizando..."
|
||||||
|
|
||||||
msgid "Error. Can't get api token for authorization"
|
msgid "Error. Can't get API token for authorization"
|
||||||
msgstr "Error. No se puede obtener el token de la API para la autorización"
|
msgstr "Error. No se puede obtener el token de la API para la autorización"
|
||||||
|
|
||||||
msgid "Could not parse server response."
|
msgid "Could not parse server response."
|
||||||
@@ -19922,8 +20195,9 @@ msgstr "Eliminado"
|
|||||||
msgid "Enable smart filament assign: Assign one filament to multiple nozzles to maximize savings"
|
msgid "Enable smart filament assign: Assign one filament to multiple nozzles to maximize savings"
|
||||||
msgstr "Activar la asignación inteligente de filamento: asigna un filamento a varias boquillas para maximizar el ahorro"
|
msgstr "Activar la asignación inteligente de filamento: asigna un filamento a varias boquillas para maximizar el ahorro"
|
||||||
|
|
||||||
msgid "Fila Saving"
|
# AI Translated
|
||||||
msgstr "Ahorro de filamento"
|
msgid "File Saving"
|
||||||
|
msgstr "Guardado de archivo"
|
||||||
|
|
||||||
msgid "Don't remind me again"
|
msgid "Don't remind me again"
|
||||||
msgstr "No me recuerdes de nuevo"
|
msgstr "No me recuerdes de nuevo"
|
||||||
@@ -20125,9 +20399,6 @@ msgstr "Ha ocurrido algo inesperado al intentar iniciar sesión, inténtelo de n
|
|||||||
msgid "User canceled."
|
msgid "User canceled."
|
||||||
msgstr "Cancelado por el usuario."
|
msgstr "Cancelado por el usuario."
|
||||||
|
|
||||||
msgid "Head diameter"
|
|
||||||
msgstr "Diámetro de la cabeza"
|
|
||||||
|
|
||||||
msgid "Max angle"
|
msgid "Max angle"
|
||||||
msgstr "Ángulo máximo"
|
msgstr "Ángulo máximo"
|
||||||
|
|
||||||
@@ -20208,6 +20479,15 @@ msgstr "Esta acción no se puede deshacer. ¿Continuar?"
|
|||||||
msgid "Skipping objects."
|
msgid "Skipping objects."
|
||||||
msgstr "Omitiendo objetos."
|
msgstr "Omitiendo objetos."
|
||||||
|
|
||||||
|
msgid "Material Ratio"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Model Height"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Ratio"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Select Filament"
|
msgid "Select Filament"
|
||||||
msgstr "Seleccionar Filamento"
|
msgstr "Seleccionar Filamento"
|
||||||
|
|
||||||
@@ -20285,6 +20565,9 @@ msgstr "Reiniciar ahora"
|
|||||||
msgid "NO RAMMING AT ALL"
|
msgid "NO RAMMING AT ALL"
|
||||||
msgstr "NO CHOCAR EN ABSOLUTO"
|
msgstr "NO CHOCAR EN ABSOLUTO"
|
||||||
|
|
||||||
|
msgid "s"
|
||||||
|
msgstr "s"
|
||||||
|
|
||||||
msgid "Volumetric speed"
|
msgid "Volumetric speed"
|
||||||
msgstr "Velocidad volumétrica"
|
msgstr "Velocidad volumétrica"
|
||||||
|
|
||||||
@@ -20861,6 +21144,52 @@ msgstr ""
|
|||||||
"Evita la deformación\n"
|
"Evita la deformación\n"
|
||||||
"¿Sabías que al imprimir materiales propensos a la deformación como el ABS, aumentar adecuadamente la temperatura de la cama térmica puede reducir la probabilidad de deformaciones?"
|
"¿Sabías que al imprimir materiales propensos a la deformación como el ABS, aumentar adecuadamente la temperatura de la cama térmica puede reducir la probabilidad de deformaciones?"
|
||||||
|
|
||||||
|
#~ msgid "Native Wayland liveview requires the GStreamer GTK video sink. Please install the gtksink plugin for GStreamer, then restart OrcaSlicer."
|
||||||
|
#~ msgstr "La función de visualización en directo nativa de Wayland requiere el receptor de vídeo GTK de GStreamer. Instale el plugin gtksink para GStreamer y, a continuación, reinicie OrcaSlicer."
|
||||||
|
|
||||||
|
#~ msgid "Failed to initialize the native Wayland GStreamer video sink. Please check your GStreamer GTK plugin installation."
|
||||||
|
#~ msgstr "No se pudo inicializar el receptor de vídeo nativo de Wayland GStreamer. Compruebe la instalación del plugin GTK de GStreamer."
|
||||||
|
|
||||||
|
#~ msgid "Windows Media Player is required for this task! Do you want to enable 'Windows Media Player' for your operation system?"
|
||||||
|
#~ msgstr "Para esta tarea se necesita el Reproductor de Windows Media. ¿Desea activar el \"Reproductor de Windows Media\" en su sistema operativo?"
|
||||||
|
|
||||||
|
#~ msgid "BambuSource has not correctly been registered for media playing! Press Yes to re-register it. You will be promoted twice"
|
||||||
|
#~ msgstr "BambuSource no se ha registrado correctamente para la reproducción multimedia. Pulse Sí para volver a registrarlo. Será promocionado dos veces"
|
||||||
|
|
||||||
|
#~ msgid "Missing BambuSource component registered for media playing! Please re-install OrcaSlicer or seek community help."
|
||||||
|
#~ msgstr "¡Falta el componente BambuSource para la reproducción de medios! Reinstale OrcaSlicer o busque ayuda en la comunidad."
|
||||||
|
|
||||||
|
#~ msgid "Using a BambuSource from a different install, video play may not work correctly! Press Yes to fix it."
|
||||||
|
#~ msgstr "Si utiliza una BambuSource de una instalación diferente, es posible que la reproducción de vídeo no funcione correctamente. Pulsa Sí para solucionarlo."
|
||||||
|
|
||||||
|
#~ msgid "Your system is missing H.264 codecs for GStreamer, which are required to play video. (Try installing the gstreamer1.0-plugins-bad or gstreamer1.0-libav packages, then restart Orca Slicer?)"
|
||||||
|
#~ msgstr "A tu sistema le faltan los codecs H.264 para GStreamer, necesarios para reproducir vídeo. (Prueba a instalar los paquetes gstreamer1.0-plugins-bad o gstreamer1.0-libav y, a continuación, reinicia Orca Slicer...)."
|
||||||
|
|
||||||
|
#~ msgid "N"
|
||||||
|
#~ msgstr "N"
|
||||||
|
|
||||||
|
#~ msgid "g"
|
||||||
|
#~ msgstr "g"
|
||||||
|
|
||||||
|
#~ msgid "Fila Saving"
|
||||||
|
#~ msgstr "Ahorro de filamento"
|
||||||
|
|
||||||
|
#~ msgid ""
|
||||||
|
#~ "Layer height is too small.\n"
|
||||||
|
#~ "It will set to min_layer_height\n"
|
||||||
|
#~ msgstr ""
|
||||||
|
#~ "La altura de la capa es demasiado pequeña.\n"
|
||||||
|
#~ "Se establecerá en min_layer_height\n"
|
||||||
|
|
||||||
|
#~ msgid "Layer height exceeds the limit in Printer Settings -> Extruder -> Layer height limits, this may cause printing quality issues."
|
||||||
|
#~ msgstr "La altura de la capa excede el límite en Ajustes de la Impresora -> Extrusor -> Limite de Altura de Capa, esto puede causar problemas de calidad de impresión."
|
||||||
|
|
||||||
|
#~ msgid "Adjust to the set range automatically?\n"
|
||||||
|
#~ msgstr "¿Desea ajustar el rango automáticamente?\n"
|
||||||
|
|
||||||
|
#~ msgid "Head diameter"
|
||||||
|
#~ msgstr "Diámetro de la cabeza"
|
||||||
|
|
||||||
#~ msgid "Print order within a single layer."
|
#~ msgid "Print order within a single layer."
|
||||||
#~ msgstr "Orden de impresión dentro de cada capa."
|
#~ msgstr "Orden de impresión dentro de cada capa."
|
||||||
|
|
||||||
@@ -20924,7 +21253,7 @@ msgstr ""
|
|||||||
#~ msgid "Select Filament && Hotends"
|
#~ msgid "Select Filament && Hotends"
|
||||||
#~ msgstr "Seleccionar Filamento && Hotends"
|
#~ msgstr "Seleccionar Filamento && Hotends"
|
||||||
|
|
||||||
#~ msgid "External spools is not supported since Filament Track Switch has been installed. If you want to use external spool, please uninstall it."
|
#~ msgid "External spools are not supported since Filament Track Switch has been installed. If you want to use external spool, please uninstall it."
|
||||||
#~ msgstr "Los carretes externos no son compatibles porque se ha instalado el Filament Track Switch. Si desea utilizar un carrete externo, desinstálelo."
|
#~ msgstr "Los carretes externos no son compatibles porque se ha instalado el Filament Track Switch. Si desea utilizar un carrete externo, desinstálelo."
|
||||||
|
|
||||||
#, c-format, boost-format
|
#, c-format, boost-format
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -136,6 +136,7 @@ src/slic3r/GUI/BackgroundSlicingProcess.cpp
|
|||||||
src/slic3r/GUI/BedShapeDialog.cpp
|
src/slic3r/GUI/BedShapeDialog.cpp
|
||||||
src/slic3r/GUI/BedShapeDialog.hpp
|
src/slic3r/GUI/BedShapeDialog.hpp
|
||||||
src/slic3r/GUI/ConfigManipulation.cpp
|
src/slic3r/GUI/ConfigManipulation.cpp
|
||||||
|
src/slic3r/GUI/ConfigValueFormatter.cpp
|
||||||
src/slic3r/GUI/DeviceManager.cpp
|
src/slic3r/GUI/DeviceManager.cpp
|
||||||
src/slic3r/GUI/DeviceErrorDialog.cpp
|
src/slic3r/GUI/DeviceErrorDialog.cpp
|
||||||
src/slic3r/GUI/ExtraRenderers.cpp
|
src/slic3r/GUI/ExtraRenderers.cpp
|
||||||
@@ -175,6 +176,7 @@ src/slic3r/GUI/ProgressStatusBar.cpp
|
|||||||
src/slic3r/GUI/PlateSettingsDialog.cpp
|
src/slic3r/GUI/PlateSettingsDialog.cpp
|
||||||
src/slic3r/GUI/PrivacyUpdateDialog.cpp
|
src/slic3r/GUI/PrivacyUpdateDialog.cpp
|
||||||
src/slic3r/GUI/PublishDialog.cpp
|
src/slic3r/GUI/PublishDialog.cpp
|
||||||
|
src/slic3r/GUI/PublishSettingsDialog.cpp
|
||||||
src/slic3r/GUI/SavePresetDialog.cpp
|
src/slic3r/GUI/SavePresetDialog.cpp
|
||||||
src/slic3r/GUI/Search.cpp
|
src/slic3r/GUI/Search.cpp
|
||||||
src/slic3r/GUI/Selection.cpp
|
src/slic3r/GUI/Selection.cpp
|
||||||
@@ -193,7 +195,6 @@ src/slic3r/GUI/ObjColorDialog.cpp
|
|||||||
src/slic3r/GUI/SyncAmsInfoDialog.cpp
|
src/slic3r/GUI/SyncAmsInfoDialog.cpp
|
||||||
src/slic3r/GUI/WipeTowerDialog.cpp
|
src/slic3r/GUI/WipeTowerDialog.cpp
|
||||||
src/slic3r/GUI/wxExtensions.cpp
|
src/slic3r/GUI/wxExtensions.cpp
|
||||||
src/slic3r/GUI/wxMediaCtrl2.cpp
|
|
||||||
src/slic3r/GUI/WebUserLoginDialog.cpp
|
src/slic3r/GUI/WebUserLoginDialog.cpp
|
||||||
src/slic3r/GUI/WebGuideDialog.cpp
|
src/slic3r/GUI/WebGuideDialog.cpp
|
||||||
src/slic3r/GUI/KBShortcutsDialog.hpp
|
src/slic3r/GUI/KBShortcutsDialog.hpp
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -75,7 +75,7 @@ documentation_link = https://www.orcaslicer.com/wiki/material_temperatures#print
|
|||||||
|
|
||||||
[hint:Calibration]
|
[hint:Calibration]
|
||||||
text = Calibration\nDid you know that calibrating your printer can do wonders? Check out our beloved calibration solution in OrcaSlicer.
|
text = Calibration\nDid you know that calibrating your printer can do wonders? Check out our beloved calibration solution in OrcaSlicer.
|
||||||
documentation_link = https://www.orcaslicer.com/wiki/calibration
|
documentation_link = https://www.orcaslicer.com/wiki/calibration_guide
|
||||||
|
|
||||||
[hint:Auxiliary fan]
|
[hint:Auxiliary fan]
|
||||||
text = Auxiliary fan\nDid you know that OrcaSlicer supports Auxiliary part cooling fan?
|
text = Auxiliary fan\nDid you know that OrcaSlicer supports Auxiliary part cooling fan?
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 579 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M1.5,8 14.5,1.5 7.5,14.5 6.3,9.7 Z" style="fill:none;stroke:gray;stroke-linecap:round;stroke-linejoin:round"/></svg>
|
||||||
|
After Width: | Height: | Size: 209 B |
@@ -1,8 +1,4 @@
|
|||||||
<svg width="25" height="25" xmlns="http://www.w3.org/2000/svg" fill="none">
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||||
|
<line x1="0.5" y1="7.5" x2="14.5" y2="7.5" style="fill:none;stroke:#949494;stroke-linecap:round;stroke-linejoin:round"/>
|
||||||
<g>
|
<line x1="7.5" y1="0.5" x2="7.5" y2="14.5" style="fill:none;stroke:#949494;stroke-linecap:round;stroke-linejoin:round"/>
|
||||||
<title>Layer 1</title>
|
</svg>
|
||||||
<path id="svg_1" stroke-linecap="round" stroke-width="2" stroke="#262E30" d="m1,12.5l23,0"/>
|
|
||||||
<path id="svg_2" stroke-linecap="round" stroke-width="2" stroke="#262E30" d="m12.5,24l0,-23"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 312 B After Width: | Height: | Size: 332 B |
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M12.00,12.00 L12.00,11.96 L12.01,11.92 L12.03,11.89 L12.05,11.85 L12.08,11.82 L12.12,11.80 L12.16,11.78 L12.20,11.76 L12.25,11.75 L12.30,11.75 L12.35,11.75 L12.40,11.77 L12.46,11.79 L12.51,11.81 L12.56,11.85 L12.61,11.89 L12.66,11.94 L12.70,12.00 L12.74,12.06 L12.77,12.14 L12.79,12.21 L12.80,12.29 L12.81,12.38 L12.81,12.47 L12.80,12.56 L12.77,12.65 L12.74,12.74 L12.70,12.83 L12.65,12.92 L12.58,13.01 L12.51,13.09 L12.43,13.17 L12.33,13.24 L12.23,13.30 L12.12,13.36 L12.00,13.40 L11.87,13.43 L11.74,13.46 L11.61,13.46 L11.47,13.46 L11.33,13.45 L11.18,13.41 L11.04,13.37 L10.90,13.31 L10.76,13.24 L10.63,13.15 L10.50,13.05 L10.38,12.93 L10.27,12.81 L10.17,12.67 L10.08,12.51 L10.01,12.35 L9.95,12.18 L9.90,12.00 L9.87,11.81 L9.86,11.62 L9.86,11.43 L9.88,11.23 L9.92,11.03 L9.98,10.83 L10.06,10.64 L10.15,10.45 L10.27,10.27 L10.40,10.09 L10.55,9.93 L10.72,9.78 L10.90,9.64 L11.10,9.52 L11.31,9.41 L11.53,9.32 L11.76,9.25 L12.00,9.20 L12.25,9.17 L12.50,9.17 L12.75,9.18 L13.01,9.22 L13.27,9.29 L13.52,9.37 L13.76,9.48 L14.00,9.62 L14.23,9.77 L14.44,9.95 L14.64,10.15 L14.83,10.37 L15.00,10.60 L15.14,10.86 L15.27,11.12 L15.37,11.41 L15.45,11.70 L15.50,12.00 L15.53,12.31 L15.52,12.62 L15.49,12.94 L15.44,13.25 L15.35,13.56 L15.23,13.87 L15.09,14.16 L14.92,14.45 L14.72,14.72 L14.50,14.98 L14.25,15.22 L13.98,15.44 L13.69,15.63 L13.38,15.80 L13.06,15.94 L12.72,16.06 L12.36,16.15 L12.00,16.20 L11.63,16.22 L11.26,16.21 L10.88,16.17 L10.51,16.09 L10.14,15.98 L9.78,15.84 L9.43,15.66 L9.10,15.46 L8.78,15.22 L8.48,14.95 L8.21,14.65 L7.96,14.33 L7.74,13.99 L7.54,13.62 L7.38,13.24 L7.25,12.84 L7.16,12.42 L7.10,12.00 L7.08,11.57 L7.10,11.14 L7.15,10.70 L7.25,10.27 L7.38,9.85 L7.55,9.43 L7.76,9.03 L8.01,8.65 L8.29,8.29 L8.60,7.95 L8.94,7.64 L9.32,7.35 L9.72,7.10 L10.14,6.88 L10.58,6.70 L11.04,6.56 L11.52,6.46 L12.00,6.40 L12.49,6.38 L12.99,6.41 L13.48,6.48 L13.97,6.59 L14.45,6.75 L14.92,6.95 L15.37,7.19 L15.80,7.47 L16.21,7.79 L16.59,8.15 L16.94,8.54 L17.25,8.97 L17.53,9.42 L17.77,9.90 L17.97,10.40 L18.13,10.92 L18.24,11.45 L18.30,12.00 L18.31,12.55 L18.28,13.11 L18.20,13.66 L18.07,14.21 L17.89,14.74 L17.66,15.27 L17.38,15.77 L17.06,16.25 L16.70,16.70 L16.30,17.12 L15.86,17.51 L15.38,17.86 L14.88,18.17 L14.34,18.43 L13.78,18.65 L13.20,18.82 L12.61,18.93 L12.00,19.00 L11.39,19.01 L10.77,18.97 L10.16,18.87 L9.55,18.72 L8.96,18.52 L8.38,18.26 L7.83,17.96 L7.30,17.60 L6.80,17.20 L6.34,16.75 L5.92,16.26 L5.53,15.73 L5.20,15.17 L4.91,14.58 L4.68,13.96 L4.49,13.32 L4.37,12.67 L4.30,12.00 L4.29,11.33 L4.34,10.65 L4.45,9.98 L4.62,9.31 L4.85,8.66 L5.13,8.03 L5.47,7.43 L5.86,6.85 L6.31,6.31 L6.80,5.80 L7.34,5.34 L7.92,4.93 L8.53,4.56 L9.18,4.25 L9.86,4.00 L10.55,3.80 L11.27,3.67 L12.00,3.60" style="fill:none;stroke:#009688;stroke-linecap:round;stroke-linejoin:round"/><rect x="1.5" y="1.5" width="21" height="21" rx="2" style="fill:none;stroke:#949494;stroke-linecap:round;stroke-linejoin:round"/></svg>
|
||||||
|
After Width: | Height: | Size: 2.9 KiB |
@@ -0,0 +1,607 @@
|
|||||||
|
{
|
||||||
|
"bambustudio_commit": "66e405477",
|
||||||
|
"filaments": {
|
||||||
|
"OF0UJcb6": {
|
||||||
|
"bambu_id": "GFG60",
|
||||||
|
"name": "PolyLite PETG",
|
||||||
|
"type": "PETG",
|
||||||
|
"vendor": "Polymaker"
|
||||||
|
},
|
||||||
|
"OF0wBGNx": {
|
||||||
|
"bambu_id": "GFB51",
|
||||||
|
"name": "Bambu ASA-CF",
|
||||||
|
"type": "ASA-CF",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OF1UNk9P": {
|
||||||
|
"bambu_id": "GFP97",
|
||||||
|
"name": "Generic PP",
|
||||||
|
"type": "PP",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OF2GCW1l": {
|
||||||
|
"bambu_id": "GFSNL08",
|
||||||
|
"name": "SUNLU PETG",
|
||||||
|
"type": "PETG",
|
||||||
|
"vendor": "SUNLU"
|
||||||
|
},
|
||||||
|
"OF2VFe4J": {
|
||||||
|
"bambu_id": "GFN04",
|
||||||
|
"name": "Bambu PAHT-CF",
|
||||||
|
"type": "PA-CF",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OF342jVN": {
|
||||||
|
"bambu_id": "GFA10",
|
||||||
|
"name": "Bambu PLA Tough+",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OF4RvVuU": {
|
||||||
|
"bambu_id": "GFT02",
|
||||||
|
"name": "Bambu PPS-CF",
|
||||||
|
"type": "PPS-CF",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OF54B0S0": {
|
||||||
|
"bambu_id": "GFN06",
|
||||||
|
"name": "Bambu PPA-CF",
|
||||||
|
"type": "PPA-CF",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OF5CgdDq": {
|
||||||
|
"bambu_id": "GFL00",
|
||||||
|
"name": "PolyLite PLA",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Polymaker"
|
||||||
|
},
|
||||||
|
"OF6rdQ6M": {
|
||||||
|
"bambu_id": "GFT98",
|
||||||
|
"name": "Generic PPS-CF",
|
||||||
|
"type": "PPS-CF",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OF74KeQR": {
|
||||||
|
"bambu_id": "GFR98",
|
||||||
|
"name": "Generic PHA",
|
||||||
|
"type": "PHA",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OF7lOgYF": {
|
||||||
|
"bambu_id": "GFG96",
|
||||||
|
"name": "Generic PETG HF",
|
||||||
|
"type": "PETG",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OF8Tlg47": {
|
||||||
|
"bambu_id": "GFN96",
|
||||||
|
"name": "Generic PPA-GF",
|
||||||
|
"type": "PPA-GF",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OF8tPByX": {
|
||||||
|
"bambu_id": "GFN97",
|
||||||
|
"name": "Generic PPA-CF",
|
||||||
|
"type": "PPA-CF",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OF9OlTWH": {
|
||||||
|
"bambu_id": "GFA07",
|
||||||
|
"name": "Bambu PLA Marble",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFAnyRUI": {
|
||||||
|
"bambu_id": "GFS02",
|
||||||
|
"name": "Bambu Support For PLA",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFBSW57R": {
|
||||||
|
"bambu_id": "GFA11",
|
||||||
|
"name": "Bambu PLA Aero",
|
||||||
|
"type": "PLA-AERO",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFBw6eEG": {
|
||||||
|
"bambu_id": "GFL05",
|
||||||
|
"name": "Overture Matte PLA",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Overture"
|
||||||
|
},
|
||||||
|
"OFCD8qiU": {
|
||||||
|
"bambu_id": "GFR99",
|
||||||
|
"name": "Generic EVA",
|
||||||
|
"type": "EVA",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFDGigEI": {
|
||||||
|
"bambu_id": "GFA13",
|
||||||
|
"name": "Bambu PLA Dynamic",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFDSrzZ8": {
|
||||||
|
"bambu_id": "GFL99",
|
||||||
|
"name": "Generic PLA",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFDvXujf": {
|
||||||
|
"bambu_id": "GFS99",
|
||||||
|
"name": "Generic PVA",
|
||||||
|
"type": "PVA",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFDxfPgH": {
|
||||||
|
"bambu_id": "GFA08",
|
||||||
|
"name": "Bambu PLA Sparkle",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFEGNJD4": {
|
||||||
|
"bambu_id": "GFA05",
|
||||||
|
"name": "Bambu PLA Silk",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFEkPBwx": {
|
||||||
|
"bambu_id": "GFA12",
|
||||||
|
"name": "Bambu PLA Glow",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFEswT5W": {
|
||||||
|
"bambu_id": "GFA50",
|
||||||
|
"name": "Bambu PLA-CF",
|
||||||
|
"type": "PLA-CF",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFFNYwWR": {
|
||||||
|
"bambu_id": "GFN03",
|
||||||
|
"name": "Bambu PA-CF",
|
||||||
|
"type": "PA-CF",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFFbSnCD": {
|
||||||
|
"bambu_id": "GFA17",
|
||||||
|
"name": "Bambu PLA Translucent",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFFvzqcd": {
|
||||||
|
"bambu_id": "GFG00",
|
||||||
|
"name": "Bambu PETG Basic",
|
||||||
|
"type": "PETG",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFHWSM21": {
|
||||||
|
"bambu_id": "GFL54",
|
||||||
|
"name": "Fiberon PET-CF",
|
||||||
|
"type": "PET-CF",
|
||||||
|
"vendor": "Polymaker"
|
||||||
|
},
|
||||||
|
"OFHa48An": {
|
||||||
|
"bambu_id": "GFT01",
|
||||||
|
"name": "Bambu PET-CF",
|
||||||
|
"type": "PET-CF",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFHmPYRy": {
|
||||||
|
"bambu_id": "GFSNL04",
|
||||||
|
"name": "SUNLU PLA+ 2.0",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "SUNLU"
|
||||||
|
},
|
||||||
|
"OFIBbYO5": {
|
||||||
|
"bambu_id": "GFU02",
|
||||||
|
"name": "Bambu TPU for AMS",
|
||||||
|
"type": "TPU-AMS",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFIfnzxC": {
|
||||||
|
"bambu_id": "GFS05",
|
||||||
|
"name": "Bambu Support For PLA/PETG",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFKhMPeX": {
|
||||||
|
"bambu_id": "GFC00",
|
||||||
|
"name": "Bambu PC",
|
||||||
|
"type": "PC",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFLJ8S6I": {
|
||||||
|
"bambu_id": "GFSNL07",
|
||||||
|
"name": "SUNLU Wood PLA",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "SUNLU"
|
||||||
|
},
|
||||||
|
"OFLPAxz3": {
|
||||||
|
"bambu_id": "GFB98",
|
||||||
|
"name": "Generic ASA",
|
||||||
|
"type": "ASA",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFLakOUI": {
|
||||||
|
"bambu_id": "GFC99",
|
||||||
|
"name": "Generic PC",
|
||||||
|
"type": "PC",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFMTK0UC": {
|
||||||
|
"bambu_id": "GFS03",
|
||||||
|
"name": "Bambu Support For PA/PET",
|
||||||
|
"type": "PA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFMUWNkp": {
|
||||||
|
"bambu_id": "GFSNL03",
|
||||||
|
"name": "SUNLU PLA+",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "SUNLU"
|
||||||
|
},
|
||||||
|
"OFMjtqTC": {
|
||||||
|
"bambu_id": "GFA16",
|
||||||
|
"name": "Bambu PLA Wood",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFNk8bxk": {
|
||||||
|
"bambu_id": "GFN08",
|
||||||
|
"name": "Bambu PA6-GF",
|
||||||
|
"type": "PA-GF",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFOvv91M": {
|
||||||
|
"bambu_id": "GFB60",
|
||||||
|
"name": "PolyLite ABS",
|
||||||
|
"type": "ABS",
|
||||||
|
"vendor": "Polymaker"
|
||||||
|
},
|
||||||
|
"OFPklMI1": {
|
||||||
|
"bambu_id": "GFP99",
|
||||||
|
"name": "Generic PE",
|
||||||
|
"type": "PE",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFQ3e56w": {
|
||||||
|
"bambu_id": "GFA15",
|
||||||
|
"name": "Bambu PLA Galaxy",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFQHiNJs": {
|
||||||
|
"bambu_id": "GFS01",
|
||||||
|
"name": "Bambu Support G",
|
||||||
|
"type": "PA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFQLcbps": {
|
||||||
|
"bambu_id": "GFN98",
|
||||||
|
"name": "Generic PA-CF",
|
||||||
|
"type": "PA-CF",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFS2tn6G": {
|
||||||
|
"bambu_id": "GFL53",
|
||||||
|
"name": "Fiberon PA612-CF",
|
||||||
|
"type": "PA",
|
||||||
|
"vendor": "Polymaker"
|
||||||
|
},
|
||||||
|
"OFTHDCqA": {
|
||||||
|
"bambu_id": "GFA19",
|
||||||
|
"name": "Bambu PLA Pure",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFTRZ8Y4": {
|
||||||
|
"bambu_id": "GFG50",
|
||||||
|
"name": "Bambu PETG-CF",
|
||||||
|
"type": "PETG-CF",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFUanySo": {
|
||||||
|
"bambu_id": "GFA06",
|
||||||
|
"name": "Bambu PLA Silk+",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFVCkX5w": {
|
||||||
|
"bambu_id": "GFU01",
|
||||||
|
"name": "Bambu TPU 95A",
|
||||||
|
"type": "TPU",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFW29a9R": {
|
||||||
|
"bambu_id": "GFL01",
|
||||||
|
"name": "PolyTerra PLA",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Polymaker"
|
||||||
|
},
|
||||||
|
"OFWbdGsC": {
|
||||||
|
"bambu_id": "GFL98",
|
||||||
|
"name": "Generic PLA-CF",
|
||||||
|
"type": "PLA-CF",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFX0ycRQ": {
|
||||||
|
"bambu_id": "GFL52",
|
||||||
|
"name": "Fiberon PA12-CF",
|
||||||
|
"type": "PA-CF",
|
||||||
|
"vendor": "Polymaker"
|
||||||
|
},
|
||||||
|
"OFXIbw5D": {
|
||||||
|
"bambu_id": "GFA01",
|
||||||
|
"name": "Bambu PLA Matte",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFXkm8q1": {
|
||||||
|
"bambu_id": "GFP96",
|
||||||
|
"name": "Generic PP-CF",
|
||||||
|
"type": "PP-CF",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFXzQ4yL": {
|
||||||
|
"bambu_id": "GFB02",
|
||||||
|
"name": "Bambu ASA-Aero",
|
||||||
|
"type": "ASA-AERO",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFY9muEs": {
|
||||||
|
"bambu_id": "GFB99",
|
||||||
|
"name": "Generic ABS",
|
||||||
|
"type": "ABS",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFYPdQJh": {
|
||||||
|
"bambu_id": "GFG99",
|
||||||
|
"name": "Generic PETG",
|
||||||
|
"type": "PETG",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFaQMgRH": {
|
||||||
|
"bambu_id": "GFA09",
|
||||||
|
"name": "Bambu PLA Tough",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFc3xdm9": {
|
||||||
|
"bambu_id": "GFL04",
|
||||||
|
"name": "Overture PLA",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Overture"
|
||||||
|
},
|
||||||
|
"OFcytyoA": {
|
||||||
|
"bambu_id": "GFL06",
|
||||||
|
"name": "Fiberon PETG-ESD",
|
||||||
|
"type": "PETG",
|
||||||
|
"vendor": "Polymaker"
|
||||||
|
},
|
||||||
|
"OFd0Fv0k": {
|
||||||
|
"bambu_id": "GFP98",
|
||||||
|
"name": "Generic PE-CF",
|
||||||
|
"type": "PE-CF",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFdyfQvU": {
|
||||||
|
"bambu_id": "GFG03",
|
||||||
|
"name": "Bambu PETG Matte",
|
||||||
|
"type": "PETG",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFesA6rF": {
|
||||||
|
"bambu_id": "GFL96",
|
||||||
|
"name": "Generic PLA Silk",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFf6mfQO": {
|
||||||
|
"bambu_id": "GFS06",
|
||||||
|
"name": "Bambu Support for ABS",
|
||||||
|
"type": "ABS",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFfBpSRI": {
|
||||||
|
"bambu_id": "GFB01",
|
||||||
|
"name": "Bambu ASA",
|
||||||
|
"type": "ASA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFg57Nmc": {
|
||||||
|
"bambu_id": "GFC01",
|
||||||
|
"name": "Bambu PC FR",
|
||||||
|
"type": "PC",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFg8ndtj": {
|
||||||
|
"bambu_id": "GFN99",
|
||||||
|
"name": "Generic PA",
|
||||||
|
"type": "PA",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFgbpcy9": {
|
||||||
|
"bambu_id": "GFU99",
|
||||||
|
"name": "Generic TPU",
|
||||||
|
"type": "TPU",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFhuaUQB": {
|
||||||
|
"bambu_id": "GFB00",
|
||||||
|
"name": "Bambu ABS",
|
||||||
|
"type": "ABS",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFk8t9mz": {
|
||||||
|
"bambu_id": "GFL55",
|
||||||
|
"name": "Fiberon PETG-rCF",
|
||||||
|
"type": "PETG-CF",
|
||||||
|
"vendor": "Polymaker"
|
||||||
|
},
|
||||||
|
"OFkOviHk": {
|
||||||
|
"bambu_id": "GFL50",
|
||||||
|
"name": "Fiberon PA6-CF",
|
||||||
|
"type": "PA6-CF",
|
||||||
|
"vendor": "Polymaker"
|
||||||
|
},
|
||||||
|
"OFknl9Iz": {
|
||||||
|
"bambu_id": "GFB50",
|
||||||
|
"name": "Bambu ABS-GF",
|
||||||
|
"type": "ABS-GF",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFlfuj2k": {
|
||||||
|
"bambu_id": "GFU04",
|
||||||
|
"name": "Bambu TPU 85A",
|
||||||
|
"type": "TPU",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFmN2lvw": {
|
||||||
|
"bambu_id": "GFU98",
|
||||||
|
"name": "Generic TPU for AMS",
|
||||||
|
"type": "TPU-AMS",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFmpMwxS": {
|
||||||
|
"bambu_id": "GFL95",
|
||||||
|
"name": "Generic PLA High Speed",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFnfxTvi": {
|
||||||
|
"bambu_id": "GFA18",
|
||||||
|
"name": "Bambu PLA Lite",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFniMuTN": {
|
||||||
|
"bambu_id": "GFN05",
|
||||||
|
"name": "Bambu PA6-CF",
|
||||||
|
"type": "PA6-CF",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFo2UF2C": {
|
||||||
|
"bambu_id": "GFS97",
|
||||||
|
"name": "Generic BVOH",
|
||||||
|
"type": "BVOH",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFoYSJKi": {
|
||||||
|
"bambu_id": "GFG98",
|
||||||
|
"name": "Generic PETG-CF",
|
||||||
|
"type": "PETG-CF",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFoiVqVM": {
|
||||||
|
"bambu_id": "GFA00",
|
||||||
|
"name": "Bambu PLA Basic",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFovEIbw": {
|
||||||
|
"bambu_id": "GFG02",
|
||||||
|
"name": "Bambu PETG HF",
|
||||||
|
"type": "PETG",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFpPGSKG": {
|
||||||
|
"bambu_id": "GFSNL05",
|
||||||
|
"name": "SUNLU Silk PLA+",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "SUNLU"
|
||||||
|
},
|
||||||
|
"OFpW4gdi": {
|
||||||
|
"bambu_id": "GFSNL02",
|
||||||
|
"name": "SUNLU PLA Matte",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "SUNLU"
|
||||||
|
},
|
||||||
|
"OFq9svOz": {
|
||||||
|
"bambu_id": "GFT97",
|
||||||
|
"name": "Generic PPS",
|
||||||
|
"type": "PPS",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFqINlYj": {
|
||||||
|
"bambu_id": "GFL03",
|
||||||
|
"name": "eSUN PLA+",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "eSUN"
|
||||||
|
},
|
||||||
|
"OFrKLeE3": {
|
||||||
|
"bambu_id": "GFA02",
|
||||||
|
"name": "Bambu PLA Metal",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFsFon5l": {
|
||||||
|
"bambu_id": "GFS98",
|
||||||
|
"name": "Generic HIPS",
|
||||||
|
"type": "HIPS",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFsHSVZc": {
|
||||||
|
"bambu_id": "GFS00",
|
||||||
|
"name": "Bambu Support W",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFsijjtH": {
|
||||||
|
"bambu_id": "GFP95",
|
||||||
|
"name": "Generic PP-GF",
|
||||||
|
"type": "PP-GF",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFtkLO6q": {
|
||||||
|
"bambu_id": "GFU03",
|
||||||
|
"name": "Bambu TPU 90A",
|
||||||
|
"type": "TPU",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFu1evlr": {
|
||||||
|
"bambu_id": "GFG97",
|
||||||
|
"name": "Generic PCTG",
|
||||||
|
"type": "PCTG",
|
||||||
|
"vendor": "Generic"
|
||||||
|
},
|
||||||
|
"OFvKUnLh": {
|
||||||
|
"bambu_id": "GFU00",
|
||||||
|
"name": "Bambu TPU 95A HF",
|
||||||
|
"type": "TPU",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFvrXuV7": {
|
||||||
|
"bambu_id": "GFB61",
|
||||||
|
"name": "PolyLite ASA",
|
||||||
|
"type": "ASA",
|
||||||
|
"vendor": "Polymaker"
|
||||||
|
},
|
||||||
|
"OFwPrlCM": {
|
||||||
|
"bambu_id": "GFG01",
|
||||||
|
"name": "Bambu PETG Translucent",
|
||||||
|
"type": "PETG",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
},
|
||||||
|
"OFwaYjL6": {
|
||||||
|
"bambu_id": "GFL51",
|
||||||
|
"name": "Fiberon PA6-GF",
|
||||||
|
"type": "PA-GF",
|
||||||
|
"vendor": "Polymaker"
|
||||||
|
},
|
||||||
|
"OFxUwUeW": {
|
||||||
|
"bambu_id": "GFSNL06",
|
||||||
|
"name": "SUNLU PLA Marble",
|
||||||
|
"type": "PLA",
|
||||||
|
"vendor": "SUNLU"
|
||||||
|
},
|
||||||
|
"OFzyIxba": {
|
||||||
|
"bambu_id": "GFS04",
|
||||||
|
"name": "Bambu PVA",
|
||||||
|
"type": "PVA",
|
||||||
|
"vendor": "Bambu Lab"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"generated": "2026-09-04",
|
||||||
|
"source": "https://github.com/bambulab/BambuStudio"
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "Afinia",
|
"name": "Afinia",
|
||||||
"version": "02.04.00.02",
|
"version": "02.04.00.03",
|
||||||
"force_update": "0",
|
"force_update": "0",
|
||||||
"description": "Afinia configurations",
|
"description": "Afinia configurations",
|
||||||
"machine_model_list": [
|
"machine_model_list": [
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"type": "filament",
|
"type": "filament",
|
||||||
"filament_id": "GFB00_01",
|
"filament_id": "OFLfywkp",
|
||||||
"setting_id": "wAJTMxtCY7EoavRi",
|
"setting_id": "wAJTMxtCY7EoavRi",
|
||||||
"name": "Afinia ABS+@HS",
|
"name": "Afinia ABS+@HS",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"type": "filament",
|
"type": "filament",
|
||||||
"filament_id": "GFB00_01",
|
"filament_id": "OFV5wEMe",
|
||||||
"setting_id": "qCDnb2iBaz4hd4vX",
|
"setting_id": "qCDnb2iBaz4hd4vX",
|
||||||
"name": "Afinia ABS@HS",
|
"name": "Afinia ABS@HS",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"type": "filament",
|
"type": "filament",
|
||||||
"filament_id": "GFA00_01",
|
"filament_id": "OF9HCdyQ",
|
||||||
"setting_id": "N3sCgjdjvp6FTtw9",
|
"setting_id": "N3sCgjdjvp6FTtw9",
|
||||||
"name": "Afinia PLA@HS",
|
"name": "Afinia PLA@HS",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
"inherits": "fdm_filament_tpu",
|
"inherits": "fdm_filament_tpu",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
"setting_id": "zUqTgAEbqTN1EdRl",
|
"setting_id": "zUqTgAEbqTN1EdRl",
|
||||||
"filament_id": "GFU01_01",
|
"filament_id": "OFDJU6R3",
|
||||||
"instantiation": "true",
|
"instantiation": "true",
|
||||||
"filament_vendor": [
|
"filament_vendor": [
|
||||||
"Afinia"
|
"Afinia"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"type": "filament",
|
"type": "filament",
|
||||||
"filament_id": "GFB00_01",
|
"filament_id": "OFXi59OX",
|
||||||
"setting_id": "OxIiEYjbhEvSykaQ",
|
"setting_id": "OxIiEYjbhEvSykaQ",
|
||||||
"name": "Afinia Value ABS@HS",
|
"name": "Afinia Value ABS@HS",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"type": "filament",
|
"type": "filament",
|
||||||
"filament_id": "GFA00_01",
|
"filament_id": "OFgHh8ly",
|
||||||
"setting_id": "BASsUdyvElEVJ9AA",
|
"setting_id": "BASsUdyvElEVJ9AA",
|
||||||
"name": "Afinia Value PLA@HS",
|
"name": "Afinia Value PLA@HS",
|
||||||
"from": "system",
|
"from": "system",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "Anker",
|
"name": "Anker",
|
||||||
"version": "02.04.00.01",
|
"version": "02.04.00.02",
|
||||||
"force_update": "0",
|
"force_update": "0",
|
||||||
"description": "Anker configurations",
|
"description": "Anker configurations",
|
||||||
"machine_model_list": [
|
"machine_model_list": [
|
||||||
@@ -161,172 +161,172 @@
|
|||||||
"sub_path": "filament/fdm_filament_tpu.json"
|
"sub_path": "filament/fdm_filament_tpu.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic ABS @base",
|
"name": "Generic ABS @Anker base",
|
||||||
"sub_path": "filament/Anker Generic ABS @base.json"
|
"sub_path": "filament/Generic ABS @Anker base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic ASA @base",
|
"name": "Generic ASA @Anker base",
|
||||||
"sub_path": "filament/Anker Generic ASA @base.json"
|
"sub_path": "filament/Generic ASA @Anker base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PA @base",
|
"name": "Generic PA @Anker base",
|
||||||
"sub_path": "filament/Anker Generic PA @base.json"
|
"sub_path": "filament/Generic PA @Anker base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PA-CF @base",
|
"name": "Generic PA-CF @Anker base",
|
||||||
"sub_path": "filament/Anker Generic PA-CF @base.json"
|
"sub_path": "filament/Generic PA-CF @Anker base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PC @base",
|
"name": "Generic PC @Anker base",
|
||||||
"sub_path": "filament/Anker Generic PC @base.json"
|
"sub_path": "filament/Generic PC @Anker base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PETG @base",
|
"name": "Generic PETG @Anker base",
|
||||||
"sub_path": "filament/Anker Generic PETG @base.json"
|
"sub_path": "filament/Generic PETG @Anker base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PETG-CF @base",
|
"name": "Generic PETG-CF @Anker base",
|
||||||
"sub_path": "filament/Anker Generic PETG-CF @base.json"
|
"sub_path": "filament/Generic PETG-CF @Anker base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PLA @base",
|
"name": "Generic PLA @Anker base",
|
||||||
"sub_path": "filament/Anker Generic PLA @base.json"
|
"sub_path": "filament/Generic PLA @Anker base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PLA Silk @base",
|
"name": "Generic PLA Silk @Anker base",
|
||||||
"sub_path": "filament/Anker Generic PLA Silk @base.json"
|
"sub_path": "filament/Generic PLA Silk @Anker base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PLA+ @base",
|
"name": "Generic PLA+ @Anker base",
|
||||||
"sub_path": "filament/Anker Generic PLA+ @base.json"
|
"sub_path": "filament/Generic PLA+ @Anker base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PLA-CF @base",
|
"name": "Generic PLA-CF @Anker base",
|
||||||
"sub_path": "filament/Anker Generic PLA-CF @base.json"
|
"sub_path": "filament/Generic PLA-CF @Anker base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PVA @base",
|
"name": "Generic PVA @Anker base",
|
||||||
"sub_path": "filament/Anker Generic PVA @base.json"
|
"sub_path": "filament/Generic PVA @Anker base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic TPU @base",
|
"name": "Generic TPU @Anker base",
|
||||||
"sub_path": "filament/Anker Generic TPU @base.json"
|
"sub_path": "filament/Generic TPU @Anker base.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic ABS",
|
"name": "Generic ABS @Anker",
|
||||||
"sub_path": "filament/Anker Generic ABS.json"
|
"sub_path": "filament/Generic ABS @Anker.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic ABS 0.2 nozzle",
|
"name": "Generic ABS @Anker 0.2 nozzle",
|
||||||
"sub_path": "filament/Anker Generic ABS 0.2 nozzle.json"
|
"sub_path": "filament/Generic ABS @Anker 0.2 nozzle.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic ABS 0.25 nozzle",
|
"name": "Generic ABS @Anker 0.25 nozzle",
|
||||||
"sub_path": "filament/Anker Generic ABS 0.25 nozzle.json"
|
"sub_path": "filament/Generic ABS @Anker 0.25 nozzle.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic ASA",
|
"name": "Generic ASA @Anker",
|
||||||
"sub_path": "filament/Anker Generic ASA.json"
|
"sub_path": "filament/Generic ASA @Anker.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic ASA 0.2 nozzle",
|
"name": "Generic ASA @Anker 0.2 nozzle",
|
||||||
"sub_path": "filament/Anker Generic ASA 0.2 nozzle.json"
|
"sub_path": "filament/Generic ASA @Anker 0.2 nozzle.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic ASA 0.25 nozzle",
|
"name": "Generic ASA @Anker 0.25 nozzle",
|
||||||
"sub_path": "filament/Anker Generic ASA 0.25 nozzle.json"
|
"sub_path": "filament/Generic ASA @Anker 0.25 nozzle.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PA",
|
"name": "Generic PA @Anker",
|
||||||
"sub_path": "filament/Anker Generic PA.json"
|
"sub_path": "filament/Generic PA @Anker.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PA 0.2 nozzle",
|
"name": "Generic PA @Anker 0.2 nozzle",
|
||||||
"sub_path": "filament/Anker Generic PA 0.2 nozzle.json"
|
"sub_path": "filament/Generic PA @Anker 0.2 nozzle.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PA 0.25 nozzle",
|
"name": "Generic PA @Anker 0.25 nozzle",
|
||||||
"sub_path": "filament/Anker Generic PA 0.25 nozzle.json"
|
"sub_path": "filament/Generic PA @Anker 0.25 nozzle.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PA-CF",
|
"name": "Generic PA-CF @Anker",
|
||||||
"sub_path": "filament/Anker Generic PA-CF.json"
|
"sub_path": "filament/Generic PA-CF @Anker.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PC",
|
"name": "Generic PC @Anker",
|
||||||
"sub_path": "filament/Anker Generic PC.json"
|
"sub_path": "filament/Generic PC @Anker.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PC 0.2 nozzle",
|
"name": "Generic PC @Anker 0.2 nozzle",
|
||||||
"sub_path": "filament/Anker Generic PC 0.2 nozzle.json"
|
"sub_path": "filament/Generic PC @Anker 0.2 nozzle.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PC 0.25 nozzle",
|
"name": "Generic PC @Anker 0.25 nozzle",
|
||||||
"sub_path": "filament/Anker Generic PC 0.25 nozzle.json"
|
"sub_path": "filament/Generic PC @Anker 0.25 nozzle.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PETG",
|
"name": "Generic PETG @Anker",
|
||||||
"sub_path": "filament/Anker Generic PETG.json"
|
"sub_path": "filament/Generic PETG @Anker.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PETG 0.2 nozzle",
|
"name": "Generic PETG @Anker 0.2 nozzle",
|
||||||
"sub_path": "filament/Anker Generic PETG 0.2 nozzle.json"
|
"sub_path": "filament/Generic PETG @Anker 0.2 nozzle.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PETG 0.25 nozzle",
|
"name": "Generic PETG @Anker 0.25 nozzle",
|
||||||
"sub_path": "filament/Anker Generic PETG 0.25 nozzle.json"
|
"sub_path": "filament/Generic PETG @Anker 0.25 nozzle.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PETG-CF",
|
"name": "Generic PETG-CF @Anker",
|
||||||
"sub_path": "filament/Anker Generic PETG-CF.json"
|
"sub_path": "filament/Generic PETG-CF @Anker.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PLA",
|
"name": "Generic PLA @Anker",
|
||||||
"sub_path": "filament/Anker Generic PLA.json"
|
"sub_path": "filament/Generic PLA @Anker.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PLA 0.2 nozzle",
|
"name": "Generic PLA @Anker 0.2 nozzle",
|
||||||
"sub_path": "filament/Anker Generic PLA 0.2 nozzle.json"
|
"sub_path": "filament/Generic PLA @Anker 0.2 nozzle.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PLA 0.25 nozzle",
|
"name": "Generic PLA @Anker 0.25 nozzle",
|
||||||
"sub_path": "filament/Anker Generic PLA 0.25 nozzle.json"
|
"sub_path": "filament/Generic PLA @Anker 0.25 nozzle.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PLA Silk",
|
"name": "Generic PLA Silk @Anker",
|
||||||
"sub_path": "filament/Anker Generic PLA Silk.json"
|
"sub_path": "filament/Generic PLA Silk @Anker.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PLA Silk 0.2 nozzle",
|
"name": "Generic PLA Silk @Anker 0.2 nozzle",
|
||||||
"sub_path": "filament/Anker Generic PLA Silk 0.2 nozzle.json"
|
"sub_path": "filament/Generic PLA Silk @Anker 0.2 nozzle.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PLA Silk 0.25 nozzle",
|
"name": "Generic PLA Silk @Anker 0.25 nozzle",
|
||||||
"sub_path": "filament/Anker Generic PLA Silk 0.25 nozzle.json"
|
"sub_path": "filament/Generic PLA Silk @Anker 0.25 nozzle.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PLA+",
|
"name": "Generic PLA+ @Anker",
|
||||||
"sub_path": "filament/Anker Generic PLA+.json"
|
"sub_path": "filament/Generic PLA+ @Anker.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PLA+ 0.2 nozzle",
|
"name": "Generic PLA+ @Anker 0.2 nozzle",
|
||||||
"sub_path": "filament/Anker Generic PLA+ 0.2 nozzle.json"
|
"sub_path": "filament/Generic PLA+ @Anker 0.2 nozzle.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PLA+ 0.25 nozzle",
|
"name": "Generic PLA+ @Anker 0.25 nozzle",
|
||||||
"sub_path": "filament/Anker Generic PLA+ 0.25 nozzle.json"
|
"sub_path": "filament/Generic PLA+ @Anker 0.25 nozzle.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PLA-CF",
|
"name": "Generic PLA-CF @Anker",
|
||||||
"sub_path": "filament/Anker Generic PLA-CF.json"
|
"sub_path": "filament/Generic PLA-CF @Anker.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic PVA",
|
"name": "Generic PVA @Anker",
|
||||||
"sub_path": "filament/Anker Generic PVA.json"
|
"sub_path": "filament/Generic PVA @Anker.json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Anker Generic TPU",
|
"name": "Generic TPU @Anker",
|
||||||
"sub_path": "filament/Anker Generic TPU.json"
|
"sub_path": "filament/Generic TPU @Anker.json"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"machine_list": [
|
"machine_list": [
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
"type": "filament",
|
|
||||||
"name": "Anker Generic PLA Silk 0.2 nozzle",
|
|
||||||
"inherits": "Anker Generic PLA Silk @base",
|
|
||||||
"from": "system",
|
|
||||||
"setting_id": "A1l6NiwRrasdV556",
|
|
||||||
"instantiation": "true",
|
|
||||||
"filament_max_volumetric_speed": [
|
|
||||||
"2"
|
|
||||||
],
|
|
||||||
"compatible_printers": [
|
|
||||||
"Anker M5 0.2 nozzle",
|
|
||||||
"Anker M5 All-Metal 0.2 nozzle",
|
|
||||||
"Anker M5C 0.2 nozzle"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
"type": "filament",
|
|
||||||
"name": "Anker Generic PLA Silk 0.25 nozzle",
|
|
||||||
"inherits": "Anker Generic PLA Silk @base",
|
|
||||||
"from": "system",
|
|
||||||
"setting_id": "yzHmKTOtA9JamlNf",
|
|
||||||
"instantiation": "true",
|
|
||||||
"filament_max_volumetric_speed": [
|
|
||||||
"3"
|
|
||||||
],
|
|
||||||
"compatible_printers": [
|
|
||||||
"Anker M5 0.25 nozzle",
|
|
||||||
"Anker M5 All-Metal 0.25 nozzle",
|
|
||||||
"Anker M5C 0.25 nozzle"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
"type": "filament",
|
|
||||||
"name": "Anker Generic PLA Silk",
|
|
||||||
"inherits": "Anker Generic PLA Silk @base",
|
|
||||||
"from": "system",
|
|
||||||
"setting_id": "BGttYO9m2rGcnrEG",
|
|
||||||
"instantiation": "true",
|
|
||||||
"compatible_printers": [
|
|
||||||
"Anker M5 0.4 nozzle",
|
|
||||||
"Anker M5 0.6 nozzle",
|
|
||||||
"Anker M5 All-Metal 0.4 nozzle",
|
|
||||||
"Anker M5 All-Metal 0.6 nozzle",
|
|
||||||
"Anker M5C 0.4 nozzle",
|
|
||||||
"Anker M5C 0.6 nozzle"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
"type": "filament",
|
|
||||||
"name": "Anker Generic PLA+ 0.2 nozzle",
|
|
||||||
"inherits": "Anker Generic PLA+ @base",
|
|
||||||
"from": "system",
|
|
||||||
"setting_id": "6IcMSjyxt0szdUuY",
|
|
||||||
"instantiation": "true",
|
|
||||||
"filament_max_volumetric_speed": [
|
|
||||||
"2"
|
|
||||||
],
|
|
||||||
"compatible_printers": [
|
|
||||||
"Anker M5 0.2 nozzle",
|
|
||||||
"Anker M5 All-Metal 0.2 nozzle",
|
|
||||||
"Anker M5C 0.2 nozzle"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
"type": "filament",
|
|
||||||
"name": "Anker Generic PLA+ 0.25 nozzle",
|
|
||||||
"inherits": "Anker Generic PLA+ @base",
|
|
||||||
"from": "system",
|
|
||||||
"setting_id": "a2Rf07ZUhpTPONN1",
|
|
||||||
"instantiation": "true",
|
|
||||||
"filament_max_volumetric_speed": [
|
|
||||||
"3"
|
|
||||||
],
|
|
||||||
"compatible_printers": [
|
|
||||||
"Anker M5 0.25 nozzle",
|
|
||||||
"Anker M5 All-Metal 0.25 nozzle",
|
|
||||||
"Anker M5C 0.25 nozzle"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
"type": "filament",
|
|
||||||
"name": "Anker Generic PLA+",
|
|
||||||
"inherits": "Anker Generic PLA+ @base",
|
|
||||||
"from": "system",
|
|
||||||
"setting_id": "0yQN44WNvLVjQu2b",
|
|
||||||
"instantiation": "true",
|
|
||||||
"compatible_printers": [
|
|
||||||
"Anker M5 0.4 nozzle",
|
|
||||||
"Anker M5 0.6 nozzle",
|
|
||||||
"Anker M5 All-Metal 0.4 nozzle",
|
|
||||||
"Anker M5 All-Metal 0.6 nozzle",
|
|
||||||
"Anker M5C 0.4 nozzle",
|
|
||||||
"Anker M5C 0.6 nozzle"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
"type": "filament",
|
|
||||||
"name": "Anker Generic PLA-CF",
|
|
||||||
"inherits": "Anker Generic PLA-CF @base",
|
|
||||||
"from": "system",
|
|
||||||
"setting_id": "diNUVM7UcHLnOr9J",
|
|
||||||
"instantiation": "true",
|
|
||||||
"compatible_printers": [
|
|
||||||
"Anker M5 0.4 nozzle",
|
|
||||||
"Anker M5 0.6 nozzle",
|
|
||||||
"Anker M5 All-Metal 0.4 nozzle",
|
|
||||||
"Anker M5 All-Metal 0.6 nozzle",
|
|
||||||
"Anker M5C 0.4 nozzle",
|
|
||||||
"Anker M5C 0.6 nozzle"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
"type": "filament",
|
|
||||||
"name": "Anker Generic PLA",
|
|
||||||
"inherits": "Anker Generic PLA @base",
|
|
||||||
"from": "system",
|
|
||||||
"setting_id": "qfKC91VAAFZSExhm",
|
|
||||||
"instantiation": "true",
|
|
||||||
"compatible_printers": [
|
|
||||||
"Anker M5 0.4 nozzle",
|
|
||||||
"Anker M5 0.6 nozzle",
|
|
||||||
"Anker M5 All-Metal 0.4 nozzle",
|
|
||||||
"Anker M5 All-Metal 0.6 nozzle",
|
|
||||||
"Anker M5C 0.4 nozzle",
|
|
||||||
"Anker M5C 0.6 nozzle"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
"type": "filament",
|
|
||||||
"name": "Anker Generic PVA",
|
|
||||||
"inherits": "Anker Generic PVA @base",
|
|
||||||
"from": "system",
|
|
||||||
"setting_id": "GRtdOKUkQfZ5eDH4",
|
|
||||||
"instantiation": "true",
|
|
||||||
"compatible_printers": [
|
|
||||||
"Anker M5 0.4 nozzle",
|
|
||||||
"Anker M5 0.6 nozzle",
|
|
||||||
"Anker M5 All-Metal 0.4 nozzle",
|
|
||||||
"Anker M5 All-Metal 0.6 nozzle",
|
|
||||||
"Anker M5C 0.4 nozzle",
|
|
||||||
"Anker M5C 0.6 nozzle"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user