├── Mark 2 expansion board
├── Eagle files
│ ├── Expansion board rev1.brd
│ └── Expansion board rev1.sch
├── Expansion board BOM rev1.xls
├── Expansion board schematic rev1.jpg
├── Gerber files
│ └── Expansion board rev1.zip
└── License.txt
├── Mark2-BOM.xlsx
├── README.md
├── calibration
├── Mark2-XY-Calibration.pdf
├── mark2_xy_calibration_part_a.stl
├── mark2_xy_calibration_part_b.stl
└── xy_calibration.V03.gcode
├── cura-3.2-resources
├── definitions
│ └── Mark2_for_Ultimaker2.def.json
├── extruders
│ ├── Mark2_extruder1.def.json
│ └── Mark2_extruder2.def.json
├── images
│ └── Mark2_for_Ultimaker2_backplate.png
├── scripts
│ └── Mark2Tweaks.py
└── variants
│ ├── Mark2_for_Ultimaker2_0.25.inst.cfg
│ ├── Mark2_for_Ultimaker2_0.4.inst.cfg
│ ├── Mark2_for_Ultimaker2_0.6.inst.cfg
│ └── Mark2_for_Ultimaker2_0.8.inst.cfg
├── cura-resources
├── README.md
├── definitions
│ └── Mark2_for_Ultimaker2.def.json
├── extruders
│ ├── Mark2_extruder1.def.json
│ └── Mark2_extruder2.def.json
├── images
│ ├── Mark2_for_Ultimaker2_backplate.png
│ └── foo
├── scripts
│ └── Mark2Tweaks.py
└── variants
│ ├── Mark2_for_Ultimaker2_0.25.inst.cfg
│ ├── Mark2_for_Ultimaker2_0.4.inst.cfg
│ ├── Mark2_for_Ultimaker2_0.6.inst.cfg
│ └── Mark2_for_Ultimaker2_0.8.inst.cfg
├── firmware
├── V17.02.2
│ ├── Mark2-dual-17.02.2.hex
│ ├── Mark2-dual-ext-17.02.2.hex
│ ├── Tinker-Mark2-dual-17.02.2.hex
│ ├── Tinker-Mark2-expansion-board-17.02.2.hex
│ ├── Tinker-Mark2-extended-dual-17.02.2.hex
│ └── Tinker-Mark2-extended-expansion-board-17.02.2.hex
├── V17.06
│ ├── Mark2-dual-17.06.hex
│ ├── Mark2-dual-ext-17.06.hex
│ ├── Tinker-Mark2-dual-17.06.hex
│ ├── Tinker-Mark2-expansion-board-17.06.hex
│ ├── Tinker-Mark2-extended-dual-17.06.hex
│ └── Tinker-Mark2-extended-expansion-board-17.06.hex
├── V17.09
│ ├── Tinker-Mark2-dual-17.09.hex
│ ├── Tinker-Mark2-expansion-board-17.09.hex
│ ├── Tinker-Mark2-extended-dual-17.09.hex
│ └── Tinker-Mark2-extended-expansion-board-17.09.hex
└── V19.03
│ ├── Tinker-Mark2-dual-19.03.1.hex
│ ├── Tinker-Mark2-expansion-board-19.03.1.hex
│ ├── Tinker-Mark2-extended-dual-19.03.1.hex
│ └── Tinker-Mark2-extended-expansion-board-19.03.1.hex
└── part-files
├── README.md
├── adjustable-feeder-mount-with-motorhole.stl
├── adjustable-feeder-mount.stl
├── adjustable-feeder-mount.stp
├── adjustable-plate.stl
├── cable-clamp.stl
├── cable-clamp.stp
├── clamping-dock.stl
├── clamping-dock.stp
├── coupling.stl
├── coupling.stp
├── expansion-pcb-cable-clamp.stl
├── expansion-pcb-carrier.stl
├── expansion-pcb-cover.stl
├── feeder-mount-roof.stl
├── feeder-mount-roof.stp
├── feeder-mount.stl
├── feeder-mount.stp
├── flex-wedge.stl
├── flex-wedge.stp
├── head-a.stl
├── head-b.stl
├── head.stl
├── head.stp
├── license.txt
├── tesa-stick-dock-a.stl
├── tesa-stick-dock-b.stl
└── tesa-stick-dock.stp
/Mark 2 expansion board/Expansion board BOM rev1.xls:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/Mark 2 expansion board/Expansion board BOM rev1.xls
--------------------------------------------------------------------------------
/Mark 2 expansion board/Expansion board schematic rev1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/Mark 2 expansion board/Expansion board schematic rev1.jpg
--------------------------------------------------------------------------------
/Mark 2 expansion board/Gerber files/Expansion board rev1.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/Mark 2 expansion board/Gerber files/Expansion board rev1.zip
--------------------------------------------------------------------------------
/Mark 2 expansion board/License.txt:
--------------------------------------------------------------------------------
1 |
2 | Mark 2 print head expansion board
3 | https://github.com/foehnsturm/Mark2/Mark 2 expansion board/
4 | CC-BY-SA 3.0
5 |
6 | This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/.
7 |
8 | Michael Eklund, 2017
9 | i.ubergeek@gmail.com
10 |
--------------------------------------------------------------------------------
/Mark2-BOM.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/Mark2-BOM.xlsx
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Mark2
--------------------------------------------------------------------------------
/calibration/Mark2-XY-Calibration.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/calibration/Mark2-XY-Calibration.pdf
--------------------------------------------------------------------------------
/calibration/mark2_xy_calibration_part_a.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/calibration/mark2_xy_calibration_part_a.stl
--------------------------------------------------------------------------------
/calibration/mark2_xy_calibration_part_b.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/calibration/mark2_xy_calibration_part_b.stl
--------------------------------------------------------------------------------
/calibration/xy_calibration.V03.gcode:
--------------------------------------------------------------------------------
1 | ;FLAVOR:UltiGCode
2 | ;TIME:355
3 | ;MATERIAL:270
4 | ;MATERIAL2:286
5 | ;NOZZLE_DIAMETER:0.4
6 | ;POSTPROCESSED
7 | ;Generated with Cura_SteamEngine 2.3.1
8 |
9 | ;LAYER_COUNT:1
10 | ;LAYER:0
11 | M107
12 | M204 S375
13 | M205 X6
14 | G10
15 | G0 F6000 X27.151 Y65.7 Z.3
16 | M204 S250
17 | M205 X5
18 | ;TYPE:WALL-INNER
19 | G11
20 | G1 F1200 X27.551 Y65.7 E0.048
21 | G1 X27.551 Y192.999 E15.32388
22 | G1 X27.151 Y192.999 E15.37188
23 | G1 X27.151 Y65.7 E30.64776
24 | M204 S375
25 | M205 X6
26 | G0 F6000 X27.221 Y65.77
27 | G0 X27.481 Y65.77
28 | G0 X27.951 Y65.4
29 | M204 S250
30 | M205 X5
31 | ;TYPE:WALL-OUTER
32 | G1 F1200 X27.951 Y68.5 E31.01976
33 | G1 X39.951 Y68.5 E32.45976
34 | G1 X39.951 Y68.6 E32.47176
35 | G1 X27.951 Y68.6 E32.83176
36 | G1 X27.951 Y71.7 E33.20376
37 | G1 X39.951 Y71.7 E34.64376
38 | G1 X39.951 Y71.8 E34.65576
39 | G1 X27.951 Y71.8 E35.01576
40 | G1 X27.951 Y74.9 E35.38776
41 | G1 X39.951 Y74.9 E36.82776
42 | G1 X39.951 Y75 E36.83976
43 | G1 X27.951 Y75 E37.19976
44 | G1 X27.951 Y78.101 E37.57188
45 | G1 X39.951 Y78.101 E39.01188
46 | G1 X39.951 Y78.201 E39.02388
47 | G1 X27.951 Y78.201 E39.38388
48 | G1 X27.951 Y81.3 E39.75576
49 | G1 X39.951 Y81.3 E41.19576
50 | G1 X39.951 Y81.4 E41.20776
51 | G1 X27.951 Y81.4 E41.56776
52 | G1 X27.951 Y84.5 E41.93976
53 | G1 X39.951 Y84.5 E43.37976
54 | G1 X39.951 Y84.6 E43.39176
55 | G1 X27.951 Y84.6 E43.75176
56 | G1 X27.951 Y87.7 E44.12376
57 | G1 X39.951 Y87.7 E45.56376
58 | G1 X39.951 Y87.8 E45.57576
59 | G1 X27.951 Y87.8 E45.93576
60 | G1 X27.951 Y90.9 E46.30776
61 | G1 X39.951 Y90.9 E47.74776
62 | G1 X39.951 Y91 E47.75976
63 | G1 X27.951 Y91 E48.11976
64 | G1 X27.951 Y94.101 E48.49188
65 | G1 X39.951 Y94.101 E49.93188
66 | G1 X39.951 Y94.201 E49.94388
67 | G1 X27.951 Y94.201 E50.30388
68 | G1 X27.951 Y97.3 E50.67576
69 | G1 X39.951 Y97.3 E52.11576
70 | G1 X39.951 Y97.4 E52.12776
71 | G1 X27.951 Y97.4 E52.48776
72 | G1 X27.951 Y100.5 E52.85976
73 | G1 X39.951 Y100.5 E54.29976
74 | G1 X39.951 Y100.6 E54.31176
75 | G1 X27.951 Y100.6 E54.67176
76 | G1 X27.951 Y103.7 E55.04376
77 | G1 X39.951 Y103.7 E56.48376
78 | G1 X39.951 Y103.8 E56.49576
79 | G1 X27.951 Y103.8 E56.85576
80 | G1 X27.951 Y106.9 E57.22776
81 | G1 X39.951 Y106.9 E58.66776
82 | G1 X39.951 Y107 E58.67976
83 | G1 X27.951 Y107 E59.03976
84 | G1 X27.951 Y110.101 E59.41188
85 | G1 X39.951 Y110.101 E60.85188
86 | G1 X39.951 Y110.201 E60.86388
87 | G1 X27.951 Y110.201 E61.22388
88 | G1 X27.951 Y113.299 E61.59564
89 | G1 X39.951 Y113.299 E63.03564
90 | G1 X39.951 Y113.399 E63.04764
91 | G1 X27.951 Y113.399 E63.40764
92 | G1 X27.951 Y116.499 E63.77964
93 | G1 X39.951 Y116.499 E65.21964
94 | G1 X39.951 Y116.599 E65.23164
95 | G1 X27.951 Y116.599 E65.59164
96 | G1 X27.951 Y119.7 E65.96376
97 | G1 X39.951 Y119.7 E67.40376
98 | G1 X39.951 Y119.8 E67.41576
99 | G1 X27.951 Y119.8 E67.77576
100 | G1 X27.951 Y122.899 E68.14764
101 | G1 X39.956 Y122.899 E69.58824
102 | G1 X39.956 Y122.939 E69.59304
103 | G0 X39.951 Y122.939
104 | G1 X39.951 Y122.999 E69.59999
105 | G1 X27.951 Y122.999 E69.95976
106 | G1 X27.951 Y126.1 E70.33188
107 | G1 X39.956 Y126.1 E71.77248
108 | G1 X39.956 Y126.18 E71.78208
109 | G0 X39.951 Y126.18
110 | G1 X39.951 Y126.2 E71.78419
111 | G1 X27.951 Y126.2 E72.14397
112 | G1 X27.951 Y129.299 E72.51585
113 | G1 X39.956 Y129.299 E73.95645
114 | G1 X39.956 Y129.399 E73.96845
115 | G1 X27.951 Y129.399 E74.3286
116 | G1 X27.951 Y132.499 E74.7006
117 | G1 X39.951 Y132.499 E76.1406
118 | G1 X39.951 Y132.519 E76.143
119 | G0 X39.956 Y132.519
120 | G1 X39.956 Y132.599 E76.15236
121 | G1 X27.951 Y132.599 E76.51274
122 | G1 X27.951 Y135.7 E76.88486
123 | G1 X39.951 Y135.7 E78.32486
124 | G1 X39.951 Y135.76 E78.33206
125 | G0 X39.956 Y135.76
126 | G1 X39.956 Y135.8 E78.33659
127 | G1 X27.951 Y135.8 E78.69696
128 | G1 X27.951 Y138.899 E79.06884
129 | G1 X39.951 Y138.899 E80.50884
130 | G1 X39.951 Y138.999 E80.52084
131 | G1 X27.951 Y138.999 E80.88084
132 | G1 X27.951 Y142.1 E81.25296
133 | G1 X39.951 Y142.1 E82.69296
134 | G1 X39.951 Y142.2 E82.70496
135 | G1 X27.951 Y142.2 E83.06496
136 | G1 X27.951 Y145.299 E83.43684
137 | G1 X39.951 Y145.299 E84.87684
138 | G1 X39.951 Y145.399 E84.88884
139 | G1 X27.951 Y145.399 E85.24884
140 | G1 X27.951 Y148.499 E85.62084
141 | G1 X39.951 Y148.499 E87.06084
142 | G1 X39.951 Y148.599 E87.07284
143 | G1 X27.951 Y148.599 E87.43284
144 | G1 X27.951 Y151.699 E87.80484
145 | G1 X39.951 Y151.699 E89.24484
146 | G1 X39.951 Y151.799 E89.25684
147 | G1 X27.951 Y151.799 E89.61684
148 | G1 X27.951 Y154.9 E89.98896
149 | G1 X39.951 Y154.9 E91.42896
150 | G1 X39.951 Y155 E91.44096
151 | G1 X27.951 Y155 E91.80096
152 | G1 X27.951 Y158.1 E92.17296
153 | G1 X39.951 Y158.1 E93.61296
154 | G1 X39.951 Y158.2 E93.62496
155 | G1 X27.951 Y158.2 E93.98496
156 | G1 X27.951 Y161.299 E94.35684
157 | G1 X39.951 Y161.299 E95.79684
158 | G1 X39.951 Y161.399 E95.80884
159 | G1 X27.951 Y161.399 E96.16884
160 | G1 X27.951 Y164.499 E96.54084
161 | G1 X39.951 Y164.499 E97.98084
162 | G1 X39.951 Y164.599 E97.99284
163 | G1 X27.951 Y164.599 E98.35284
164 | G1 X27.951 Y167.699 E98.72484
165 | G1 X39.951 Y167.699 E100.16484
166 | G1 X39.951 Y167.799 E100.17684
167 | G1 X27.951 Y167.799 E100.53684
168 | G1 X27.951 Y170.9 E100.90896
169 | G1 X39.951 Y170.9 E102.34896
170 | G1 X39.951 Y171 E102.36096
171 | G1 X27.951 Y171 E102.72096
172 | G1 X27.951 Y174.1 E103.09296
173 | G1 X39.951 Y174.1 E104.53296
174 | G1 X39.951 Y174.2 E104.54496
175 | G1 X27.951 Y174.2 E104.90496
176 | G1 X27.951 Y177.299 E105.27684
177 | G1 X39.951 Y177.299 E106.71684
178 | G1 X39.951 Y177.399 E106.72884
179 | G1 X27.951 Y177.399 E107.08884
180 | G1 X27.951 Y180.499 E107.46084
181 | G1 X39.951 Y180.499 E108.90084
182 | G1 X39.951 Y180.599 E108.91284
183 | G1 X27.951 Y180.599 E109.27284
184 | G1 X27.951 Y183.699 E109.64484
185 | G1 X39.951 Y183.699 E111.08484
186 | G1 X39.951 Y183.799 E111.09684
187 | G1 X27.951 Y183.799 E111.45684
188 | G1 X27.951 Y186.9 E111.82896
189 | G1 X39.951 Y186.9 E113.26896
190 | G1 X39.951 Y187 E113.28096
191 | G1 X27.951 Y187 E113.64096
192 | G1 X27.951 Y190.1 E114.01296
193 | G1 X39.951 Y190.1 E115.45296
194 | G1 X39.951 Y190.2 E115.46496
195 | G1 X27.951 Y190.2 E115.82496
196 | G1 X27.951 Y193.299 E116.19684
197 | G1 X39.951 Y193.299 E117.63684
198 | G1 X39.951 Y193.399 E117.64884
199 | G1 X27.951 Y193.399 E118.00884
200 | G1 X26.751 Y193.399 E118.15284
201 | G1 X26.751 Y65.3 E133.52472
202 | G1 X27.951 Y65.3 E133.66872
203 | G1 X39.951 Y65.3 E135.10872
204 | G1 X39.951 Y65.4 E135.12072
205 | G1 X27.951 Y65.4 E135.48072
206 | M204 S375
207 | M205 X6
208 | G10
209 | G0 F6000 X27.481 Y65.77
210 | G0 X27.523 Y192.971
211 | G0 X27.523 Y195.139
212 | G0 X38.622 Y195.928
213 | G0 X61.278 Y195.928
214 | G0 X73.61 Y193.727
215 | G0 X75.778 Y193.727
216 | G0 X75.82 Y193.769
217 | G0 X75.75 Y193.699
218 | M204 S250
219 | M205 X5
220 | ;TYPE:WALL-INNER
221 | G11
222 | G1 F1200 X203.05 Y193.699 E150.75672
223 | G1 X203.05 Y194.1 E150.80484
224 | G1 X75.75 Y194.1 E166.08084
225 | G1 X75.75 Y193.699 E166.12896
226 | M204 S375
227 | M205 X6
228 | G0 F6000 X75.45 Y193.299
229 | M204 S250
230 | M205 X5
231 | ;TYPE:WALL-OUTER
232 | G1 F1200 X78.55 Y193.299 E166.50096
233 | G1 X78.55 Y181.299 E167.94096
234 | G1 X78.65 Y181.299 E167.95296
235 | G1 X78.65 Y193.299 E168.31296
236 | G1 X81.75 Y193.299 E168.68496
237 | G1 X81.75 Y181.299 E170.12496
238 | G1 X81.85 Y181.299 E170.13696
239 | G1 X81.85 Y193.299 E170.49696
240 | G1 X84.95 Y193.299 E170.86896
241 | G1 X84.95 Y181.299 E172.30896
242 | G1 X85.05 Y181.299 E172.32096
243 | G1 X85.05 Y193.299 E172.68096
244 | G1 X88.151 Y193.299 E173.05308
245 | G1 X88.151 Y181.299 E174.49308
246 | G1 X88.251 Y181.299 E174.50508
247 | G1 X88.251 Y193.299 E174.86508
248 | G1 X91.35 Y193.299 E175.23696
249 | G1 X91.35 Y181.299 E176.67696
250 | G1 X91.45 Y181.299 E176.68896
251 | G1 X91.45 Y193.299 E177.04896
252 | G1 X94.55 Y193.299 E177.42096
253 | G1 X94.55 Y181.299 E178.86096
254 | G1 X94.65 Y181.299 E178.87296
255 | G1 X94.65 Y193.299 E179.23296
256 | G1 X97.751 Y193.299 E179.60508
257 | G1 X97.751 Y181.299 E181.04508
258 | G1 X97.851 Y181.299 E181.05708
259 | G1 X97.851 Y193.299 E181.41708
260 | G1 X100.95 Y193.299 E181.78896
261 | G1 X100.95 Y181.299 E183.22896
262 | G1 X101.05 Y181.299 E183.24096
263 | G1 X101.05 Y193.299 E183.60096
264 | G1 X104.151 Y193.299 E183.97308
265 | G1 X104.151 Y181.299 E185.41308
266 | G1 X104.251 Y181.299 E185.42508
267 | G1 X104.251 Y193.299 E185.78508
268 | G1 X107.35 Y193.299 E186.15696
269 | G1 X107.35 Y181.299 E187.59696
270 | G1 X107.45 Y181.299 E187.60896
271 | G1 X107.45 Y193.299 E187.96896
272 | G1 X110.55 Y193.299 E188.34096
273 | G1 X110.55 Y181.299 E189.78096
274 | G1 X110.65 Y181.299 E189.79296
275 | G1 X110.65 Y193.299 E190.15296
276 | G1 X113.75 Y193.299 E190.52496
277 | G1 X113.75 Y181.299 E191.96496
278 | G1 X113.85 Y181.299 E191.97696
279 | G1 X113.85 Y193.299 E192.33696
280 | G1 X116.949 Y193.299 E192.70884
281 | G1 X116.949 Y181.299 E194.14884
282 | G1 X117.049 Y181.299 E194.16084
283 | G1 X117.049 Y193.299 E194.52084
284 | G1 X120.15 Y193.299 E194.89296
285 | G1 X120.15 Y181.299 E196.33296
286 | G1 X120.25 Y181.299 E196.34496
287 | G1 X120.25 Y193.299 E196.70496
288 | G1 X123.349 Y193.299 E197.07684
289 | G1 X123.349 Y181.299 E198.51684
290 | G1 X123.449 Y181.299 E198.52884
291 | G1 X123.449 Y193.299 E198.88884
292 | G1 X126.549 Y193.299 E199.26084
293 | G1 X126.549 Y181.299 E200.70084
294 | G1 X126.649 Y181.299 E200.71284
295 | G1 X126.649 Y193.299 E201.07284
296 | G1 X129.749 Y193.299 E201.44484
297 | G1 X129.749 Y181.299 E202.88484
298 | G1 X129.849 Y181.299 E202.89684
299 | G1 X129.849 Y193.299 E203.25684
300 | G1 X132.95 Y193.299 E203.62896
301 | G1 X132.95 Y181.294 E205.06956
302 | G1 X132.989 Y181.294 E205.07424
303 | G0 X132.989 Y181.299
304 | G1 X133.05 Y181.299 E205.08131
305 | G1 X133.05 Y193.299 E205.44108
306 | G1 X136.15 Y193.299 E205.81308
307 | G1 X136.15 Y181.294 E207.25368
308 | G1 X136.229 Y181.294 E207.26316
309 | G0 X136.229 Y181.299
310 | G1 X136.25 Y181.299 E207.2654
311 | G1 X136.25 Y193.299 E207.62517
312 | M104 T1 S200
313 | G1 X139.349 Y193.299 E207.99705
314 | G1 X139.349 Y181.294 E209.43765
315 | G1 X139.449 Y181.294 E209.44965
316 | G1 X139.449 Y193.299 E209.8098
317 | G1 X142.549 Y193.299 E210.1818
318 | G1 X142.549 Y181.299 E211.6218
319 | G1 X142.569 Y181.299 E211.6242
320 | G0 X142.569 Y181.294
321 | G1 X142.649 Y181.294 E211.63356
322 | G1 X142.649 Y193.299 E211.99394
323 | G1 X145.749 Y193.299 E212.36594
324 | G1 X145.749 Y181.299 E213.80594
325 | G1 X145.809 Y181.299 E213.81314
326 | G0 X145.809 Y181.294
327 | G1 X145.849 Y181.294 E213.81767
328 | G1 X145.849 Y193.299 E214.17804
329 | G1 X148.95 Y193.299 E214.55016
330 | G1 X148.95 Y181.299 E215.99016
331 | G1 X149.049 Y181.299 E216.00204
332 | G1 X149.05 Y193.299 E216.36024
333 | G1 X152.15 Y193.299 E216.73224
334 | G1 X152.15 Y181.299 E218.17224
335 | G1 X152.25 Y181.299 E218.18424
336 | G1 X152.25 Y193.299 E218.54424
337 | G1 X155.349 Y193.299 E218.91612
338 | G1 X155.349 Y181.299 E220.35612
339 | G1 X155.449 Y181.299 E220.36812
340 | G1 X155.449 Y193.299 E220.72812
341 | G1 X158.549 Y193.299 E221.10012
342 | G1 X158.549 Y181.299 E222.54012
343 | G1 X158.649 Y181.299 E222.55212
344 | G1 X158.649 Y193.299 E222.91212
345 | G1 X161.749 Y193.299 E223.28412
346 | G1 X161.749 Y181.299 E224.72412
347 | G1 X161.849 Y181.299 E224.73612
348 | G1 X161.849 Y193.299 E225.09612
349 | G1 X164.95 Y193.299 E225.46824
350 | G1 X164.95 Y181.299 E226.90824
351 | G1 X165.05 Y181.299 E226.92024
352 | G1 X165.05 Y193.299 E227.28024
353 | G1 X168.15 Y193.299 E227.65224
354 | G1 X168.15 Y181.299 E229.09224
355 | G1 X168.25 Y181.299 E229.10424
356 | G1 X168.25 Y193.299 E229.46424
357 | G1 X171.349 Y193.299 E229.83612
358 | G1 X171.349 Y181.299 E231.27612
359 | G1 X171.449 Y181.299 E231.28812
360 | G1 X171.449 Y193.299 E231.64812
361 | G1 X174.549 Y193.299 E232.02012
362 | G1 X174.549 Y181.299 E233.46012
363 | G1 X174.649 Y181.299 E233.47212
364 | G1 X174.649 Y193.299 E233.83212
365 | G1 X177.749 Y193.299 E234.20412
366 | G1 X177.749 Y181.299 E235.64412
367 | G1 X177.849 Y181.299 E235.65612
368 | G1 X177.849 Y193.299 E236.01612
369 | G1 X180.95 Y193.299 E236.38824
370 | G1 X180.95 Y181.299 E237.82824
371 | G1 X181.05 Y181.299 E237.84024
372 | G1 X181.05 Y193.299 E238.20024
373 | G1 X184.15 Y193.299 E238.57224
374 | G1 X184.15 Y181.299 E240.01224
375 | G1 X184.25 Y181.299 E240.02424
376 | G1 X184.25 Y193.299 E240.38424
377 | G1 X187.35 Y193.299 E240.75624
378 | G1 X187.35 Y181.299 E242.19624
379 | G1 X187.45 Y181.299 E242.20824
380 | G1 X187.45 Y193.299 E242.56824
381 | G1 X190.549 Y193.299 E242.94012
382 | G1 X190.549 Y181.299 E244.38012
383 | G1 X190.649 Y181.299 E244.39212
384 | G1 X190.649 Y193.299 E244.75212
385 | G1 X193.749 Y193.299 E245.12412
386 | G1 X193.749 Y181.299 E246.56412
387 | G1 X193.849 Y181.299 E246.57612
388 | G1 X193.849 Y193.299 E246.93612
389 | G1 X196.95 Y193.299 E247.30824
390 | G1 X196.95 Y181.299 E248.74824
391 | G1 X197.05 Y181.299 E248.76024
392 | G1 X197.05 Y193.299 E249.12024
393 | G1 X200.15 Y193.299 E249.49224
394 | G1 X200.15 Y181.299 E250.93224
395 | G1 X200.25 Y181.299 E250.94424
396 | G1 X200.25 Y193.299 E251.30424
397 | G1 X203.35 Y193.299 E251.67624
398 | G1 X203.35 Y181.299 E253.11624
399 | G1 X203.45 Y181.299 E253.12824
400 | G1 X203.45 Y193.299 E253.48824
401 | G1 X203.45 Y194.5 E253.63236
402 | G1 X75.35 Y194.5 E269.00436
403 | G1 X75.35 Y193.299 E269.14848
404 | G1 X75.35 Y181.299 E270.58848
405 | G1 X75.45 Y181.299 E270.60048
406 | G1 X75.45 Y193.299 E270.96048
407 | M204 S375
408 | M205 X6
409 | G0 F6000 X76.032 Y193.7
410 | G10 S1
411 | G92 E0
412 |
413 | T1
414 | G92 E0
415 |
416 | M109 S200
417 | G10
418 | M104 T0 S125
419 | G0 F6000.0 X53.15 Y193.8 Z0.3
420 | M204 S250
421 | M205 X5
422 | ;TYPE:WALL-INNER
423 | G11
424 | G1 F1200 X52.75 Y193.8 E0.048
425 | G1 X52.75 Y64.9 E15.516
426 | G1 X53.15 Y64.9 E15.564
427 | G1 X53.15 Y193.8 E31.032
428 | M204 S375
429 | M205 X6
430 | G0 F6000 X53.55 Y194.1
431 | M204 S250
432 | M205 X5
433 | ;TYPE:WALL-OUTER
434 | G1 F1200 X59.55 Y194.1 E31.752
435 | G1 X59.55 Y194.2 E31.764
436 | G1 X53.55 Y194.2 E31.944
437 | G1 X52.35 Y194.2 E32.088
438 | G1 X40.35 Y194.2 E33.528
439 | G1 X40.35 Y194.1 E33.54
440 | G1 X52.35 Y194.1 E33.9
441 | G1 X52.35 Y190.959 E34.27692
442 | G1 X40.35 Y190.959 E35.71692
443 | G1 X40.35 Y190.859 E35.72892
444 | G1 X52.35 Y190.859 E36.08892
445 | G1 X52.35 Y187.72 E36.4656
446 | G1 X40.35 Y187.72 E37.9056
447 | G1 X40.35 Y187.62 E37.9176
448 | G1 X52.35 Y187.62 E38.2776
449 | G1 X52.35 Y184.48 E38.6544
450 | G1 X40.35 Y184.48 E40.0944
451 | G1 X40.35 Y184.38 E40.1064
452 | G1 X52.35 Y184.38 E40.4664
453 | G1 X52.35 Y181.239 E40.84332
454 | G1 X40.35 Y181.239 E42.28332
455 | G1 X40.35 Y181.139 E42.29532
456 | G1 X52.35 Y181.139 E42.65532
457 | G1 X52.35 Y178 E43.032
458 | G1 X40.35 Y178 E44.472
459 | G1 X40.35 Y177.9 E44.484
460 | G1 X52.35 Y177.9 E44.844
461 | G1 X52.35 Y174.759 E45.22092
462 | G1 X40.35 Y174.759 E46.66092
463 | G1 X40.35 Y174.659 E46.67292
464 | G1 X52.35 Y174.659 E47.03292
465 | G1 X52.35 Y171.519 E47.40972
466 | G1 X40.35 Y171.519 E48.84972
467 | G1 X40.35 Y171.419 E48.86172
468 | G1 X52.35 Y171.419 E49.22172
469 | G1 X52.35 Y168.28 E49.5984
470 | G1 X40.35 Y168.28 E51.0384
471 | G1 X40.35 Y168.18 E51.0504
472 | G1 X52.35 Y168.18 E51.4104
473 | G1 X52.35 Y165.039 E51.78732
474 | G1 X40.35 Y165.039 E53.22732
475 | G1 X40.35 Y164.939 E53.23932
476 | G1 X52.35 Y164.939 E53.59932
477 | G1 X52.35 Y161.799 E53.97612
478 | G1 X40.35 Y161.799 E55.41612
479 | G1 X40.35 Y161.699 E55.42812
480 | G1 X52.35 Y161.699 E55.78812
481 | G1 X52.35 Y158.56 E56.1648
482 | G1 X40.35 Y158.56 E57.6048
483 | G1 X40.35 Y158.46 E57.6168
484 | G1 X52.35 Y158.46 E57.9768
485 | G1 X52.35 Y155.319 E58.35372
486 | G1 X40.35 Y155.319 E59.79372
487 | G1 X40.35 Y155.219 E59.80572
488 | G1 X52.35 Y155.219 E60.16572
489 | G1 X52.35 Y152.079 E60.54252
490 | G1 X40.35 Y152.079 E61.98252
491 | G1 X40.35 Y151.979 E61.99452
492 | G1 X52.35 Y151.979 E62.35452
493 | G1 X52.35 Y148.84 E62.7312
494 | G1 X40.35 Y148.84 E64.1712
495 | G1 X40.35 Y148.74 E64.1832
496 | G1 X52.35 Y148.74 E64.5432
497 | G1 X52.35 Y145.599 E64.92012
498 | G1 X40.35 Y145.599 E66.36012
499 | G1 X40.35 Y145.499 E66.37212
500 | G1 X52.35 Y145.499 E66.73212
501 | G1 X52.35 Y142.36 E67.1088
502 | G1 X40.35 Y142.36 E68.5488
503 | G1 X40.35 Y142.26 E68.5608
504 | G1 X52.35 Y142.26 E68.9208
505 | G1 X52.35 Y139.119 E69.29772
506 | G1 X40.35 Y139.119 E70.73772
507 | G1 X40.346 Y139.019 E70.74973
508 | G1 X52.35 Y139.019 E71.11003
509 | G1 X52.35 Y135.88 E71.48671
510 | G1 X40.35 Y135.88 E72.92671
511 | G1 X40.346 Y135.78 E72.93872
512 | G1 X52.35 Y135.78 E73.29902
513 | G1 X52.35 Y132.639 E73.67594
514 | G1 X40.35 Y132.639 E75.11594
515 | G1 X40.346 Y132.539 E75.12795
516 | G1 X52.35 Y132.539 E75.48825
517 | G1 X52.35 Y129.399 E75.86505
518 | G1 X40.346 Y129.399 E77.30553
519 | G1 X40.346 Y129.299 E77.31753
520 | G1 X52.35 Y129.299 E77.67765
521 | G1 X52.35 Y126.16 E78.05433
522 | G1 X40.346 Y126.16 E79.49481
523 | G1 X40.35 Y126.06 E79.50682
524 | G1 X52.35 Y126.06 E79.86664
525 | G1 X52.35 Y122.919 E80.24356
526 | G1 X40.346 Y122.919 E81.68404
527 | G1 X40.35 Y122.819 E81.69605
528 | G1 X52.35 Y122.819 E82.05587
529 | G1 X52.35 Y119.679 E82.43267
530 | G1 X40.346 Y119.675 E83.87315
531 | G1 X40.35 Y119.579 E83.88468
532 | G1 X52.35 Y119.579 E84.2373
533 | G1 X52.35 Y116.439 E84.6141
534 | G1 X40.35 Y116.439 E86.0541
535 | G1 X40.35 Y116.339 E86.0661
536 | G1 X52.35 Y116.339 E86.4261
537 | G1 X52.35 Y113.2 E86.80278
538 | G1 X40.35 Y113.2 E88.24278
539 | G1 X40.35 Y113.1 E88.25478
540 | G1 X52.35 Y113.1 E88.61478
541 | G1 X52.35 Y109.96 E88.99158
542 | G1 X40.35 Y109.96 E90.43158
543 | G1 X40.35 Y109.86 E90.44358
544 | G1 X52.35 Y109.86 E90.80358
545 | G1 X52.35 Y106.72 E91.18038
546 | G1 X40.35 Y106.72 E92.62038
547 | G1 X40.35 Y106.62 E92.63238
548 | G1 X52.35 Y106.62 E92.99238
549 | G1 X52.35 Y103.481 E93.36906
550 | G1 X40.35 Y103.481 E94.80906
551 | G1 X40.35 Y103.381 E94.82106
552 | G1 X52.35 Y103.381 E95.18106
553 | G1 X52.35 Y100.24 E95.55798
554 | G1 X40.35 Y100.24 E96.99798
555 | G1 X40.35 Y100.14 E97.00998
556 | G1 X52.35 Y100.14 E97.36998
557 | G1 X52.35 Y97 E97.74678
558 | G1 X40.35 Y97 E99.18678
559 | G1 X40.35 Y96.9 E99.19878
560 | G1 X52.35 Y96.9 E99.55878
561 | G1 X52.35 Y93.76 E99.93558
562 | G1 X40.35 Y93.76 E101.37558
563 | G1 X40.35 Y93.66 E101.38758
564 | G1 X52.35 Y93.66 E101.74758
565 | G1 X52.35 Y90.521 E102.12426
566 | G1 X40.35 Y90.521 E103.56426
567 | G1 X40.35 Y90.421 E103.57626
568 | G1 X52.35 Y90.421 E103.93626
569 | G1 X52.35 Y87.28 E104.31318
570 | G1 X40.35 Y87.28 E105.75318
571 | G1 X40.35 Y87.18 E105.76518
572 | G1 X52.35 Y87.18 E106.12518
573 | G1 X52.35 Y84.04 E106.50198
574 | G1 X40.35 Y84.04 E107.94198
575 | G1 X40.35 Y83.94 E107.95398
576 | G1 X52.35 Y83.94 E108.31398
577 | G1 X52.35 Y80.8 E108.69078
578 | G1 X40.35 Y80.8 E110.13078
579 | G1 X40.35 Y80.7 E110.14278
580 | G1 X52.35 Y80.7 E110.50278
581 | G1 X52.35 Y77.561 E110.87946
582 | G1 X40.35 Y77.561 E112.31946
583 | G1 X40.35 Y77.461 E112.33146
584 | G1 X52.35 Y77.461 E112.69146
585 | G1 X52.35 Y74.32 E113.06838
586 | G1 X40.35 Y74.32 E114.50838
587 | G1 X40.35 Y74.22 E114.52038
588 | G1 X52.35 Y74.22 E114.88038
589 | G1 X52.35 Y71.08 E115.25718
590 | G1 X40.35 Y71.08 E116.69718
591 | G1 X40.35 Y70.98 E116.70918
592 | G1 X52.35 Y70.98 E117.06918
593 | G1 X52.35 Y67.84 E117.44598
594 | G1 X40.35 Y67.84 E118.88598
595 | G1 X40.35 Y67.74 E118.89798
596 | G1 X52.35 Y67.74 E119.25798
597 | G1 X52.35 Y64.6 E119.63478
598 | G1 X40.35 Y64.6 E121.07478
599 | G1 X40.35 Y64.5 E121.08678
600 | G1 X52.35 Y64.5 E121.44678
601 | G1 X53.55 Y64.5 E121.59078
602 | G1 X59.55 Y64.5 E122.31078
603 | G1 X59.55 Y64.6 E122.32278
604 | G1 X53.55 Y64.6 E122.50278
605 | G1 X53.55 Y80.7 E124.43478
606 | G1 X57.55 Y80.7 E124.91478
607 | G1 X57.55 Y80.8 E124.92678
608 | G1 X53.55 Y80.8 E125.04678
609 | G1 X53.55 Y96.9 E126.97878
610 | G1 X59.55 Y96.9 E127.69878
611 | G1 X59.55 Y97 E127.71078
612 | G1 X53.55 Y97 E127.89078
613 | G1 X53.55 Y113.1 E129.82278
614 | G1 X57.55 Y113.1 E130.30278
615 | G1 X57.55 Y113.2 E130.31478
616 | G1 X53.55 Y113.2 E130.43478
617 | G1 X53.55 Y129.299 E132.36666
618 | G1 X61.55 Y129.299 E133.32666
619 | G1 X61.55 Y129.399 E133.33866
620 | G1 X53.55 Y129.399 E133.57866
621 | G1 X53.55 Y145.499 E135.51066
622 | G1 X57.55 Y145.499 E135.99066
623 | G1 X57.55 Y145.599 E136.00266
624 | G1 X53.55 Y145.599 E136.12266
625 | G1 X53.55 Y161.699 E138.05466
626 | G1 X59.55 Y161.699 E138.77466
627 | G1 X59.55 Y161.799 E138.78666
628 | G1 X53.55 Y161.799 E138.96666
629 | G1 X53.55 Y177.9 E140.89878
630 | G1 X57.55 Y177.9 E141.37878
631 | G1 X57.55 Y178 E141.39078
632 | G1 X53.55 Y178 E141.51078
633 | G1 X53.55 Y194.1 E143.44278
634 | M204 S375
635 | M205 X6
636 | G10
637 | G0 F6000 X53.08 Y193.73
638 | G0 X53.11 Y168.429
639 | G0 X55.29 Y168.429
640 | G0 X72.81 Y168.429
641 | G0 X74.99 Y168.429
642 | G0 X75.02 Y168.429
643 | G0 X74.95 Y168.499
644 | M204 S250
645 | M205 X5
646 | ;TYPE:WALL-INNER
647 | G11
648 | G1 F1200 X74.95 Y168.099 E143.49078
649 | G1 X203.849 Y168.099 E158.95866
650 | G1 X203.849 Y168.499 E159.00666
651 | G1 X74.95 Y168.499 E174.47454
652 | M204 S375
653 | M205 X6
654 | G0 F6000 X74.65 Y168.899
655 | M204 S250
656 | M205 X5
657 | ;TYPE:WALL-OUTER
658 | G1 F1200 X74.65 Y180.899 E175.91454
659 | G1 X74.55 Y180.899 E175.92654
660 | G1 X74.55 Y168.899 E176.28654
661 | G1 X74.55 Y167.699 E176.43054
662 | G1 X74.55 Y161.699 E177.15054
663 | G1 X74.65 Y161.699 E177.16254
664 | G1 X74.65 Y167.699 E177.34254
665 | G1 X90.75 Y167.699 E179.27454
666 | G1 X90.75 Y163.699 E179.75454
667 | G1 X90.85 Y163.699 E179.76654
668 | G1 X90.85 Y167.699 E179.88654
669 | G1 X106.95 Y167.699 E181.81854
670 | G1 X106.95 Y161.699 E182.53854
671 | G1 X107.05 Y161.699 E182.55054
672 | G1 X107.05 Y167.699 E182.73054
673 | G1 X123.149 Y167.699 E184.66242
674 | G1 X123.149 Y163.699 E185.14242
675 | G1 X123.249 Y163.699 E185.15442
676 | G1 X123.249 Y167.699 E185.27442
677 | G1 X139.349 Y167.699 E187.20642
678 | G1 X139.349 Y159.699 E188.16642
679 | G1 X139.449 Y159.699 E188.17842
680 | G1 X139.449 Y167.699 E188.41842
681 | G1 X155.549 Y167.699 E190.35042
682 | G1 X155.549 Y163.699 E190.83042
683 | G1 X155.649 Y163.699 E190.84242
684 | G1 X155.649 Y167.699 E190.96242
685 | G1 X171.749 Y167.699 E192.89442
686 | G1 X171.749 Y161.699 E193.61442
687 | G1 X171.849 Y161.699 E193.62642
688 | G1 X171.849 Y167.699 E193.80642
689 | G1 X187.95 Y167.699 E195.73854
690 | G1 X187.95 Y163.699 E196.21854
691 | G1 X188.05 Y163.699 E196.23054
692 | G1 X188.05 Y167.699 E196.35054
693 | G1 X204.149 Y167.699 E198.28242
694 | G1 X204.149 Y161.699 E199.00242
695 | G1 X204.249 Y161.699 E199.01442
696 | G1 X204.249 Y167.699 E199.19442
697 | G1 X204.249 Y168.899 E199.33842
698 | G1 X204.249 Y180.899 E200.77842
699 | G1 X204.149 Y180.899 E200.79042
700 | G1 X204.149 Y168.899 E201.15042
701 | G1 X201.009 Y168.899 E201.52722
702 | G1 X201.009 Y180.899 E202.96722
703 | G1 X200.909 Y180.899 E202.97922
704 | G1 X200.909 Y168.899 E203.33922
705 | G1 X197.77 Y168.899 E203.7159
706 | G1 X197.77 Y180.899 E205.1559
707 | G1 X197.67 Y180.899 E205.1679
708 | G1 X197.67 Y168.899 E205.5279
709 | G1 X194.529 Y168.899 E205.90482
710 | G1 X194.529 Y180.899 E207.34482
711 | G1 X194.429 Y180.899 E207.35682
712 | G1 X194.429 Y168.899 E207.71682
713 | G1 X191.289 Y168.899 E208.09362
714 | G1 X191.289 Y180.899 E209.53362
715 | G1 X191.189 Y180.899 E209.54562
716 | G1 X191.189 Y168.899 E209.90562
717 | G1 X188.05 Y168.899 E210.2823
718 | G1 X188.05 Y180.899 E211.7223
719 | G1 X187.95 Y180.899 E211.7343
720 | G1 X187.95 Y168.899 E212.0943
721 | G1 X184.809 Y168.899 E212.47122
722 | G1 X184.809 Y180.899 E213.91122
723 | G1 X184.709 Y180.899 E213.92322
724 | G1 X184.709 Y168.899 E214.28322
725 | G1 X181.569 Y168.899 E214.66002
726 | G1 X181.569 Y180.899 E216.10002
727 | G1 X181.469 Y180.899 E216.11202
728 | G1 X181.469 Y168.899 E216.47202
729 | G1 X178.329 Y168.899 E216.84882
730 | G1 X178.329 Y180.899 E218.28882
731 | G1 X178.229 Y180.899 E218.30082
732 | G1 X178.229 Y168.899 E218.66082
733 | G1 X175.089 Y168.899 E219.03762
734 | G1 X175.089 Y180.899 E220.47762
735 | G1 X174.989 Y180.899 E220.48962
736 | G1 X174.989 Y168.899 E220.84962
737 | G1 X171.849 Y168.899 E221.22642
738 | G1 X171.849 Y180.899 E222.66642
739 | G1 X171.749 Y180.899 E222.67842
740 | G1 X171.749 Y168.899 E223.03842
741 | G1 X168.609 Y168.899 E223.41522
742 | G1 X168.609 Y180.899 E224.85522
743 | G1 X168.509 Y180.899 E224.86722
744 | G1 X168.509 Y168.899 E225.22722
745 | G1 X165.369 Y168.899 E225.60402
746 | G1 X165.369 Y180.899 E227.04402
747 | G1 X165.269 Y180.899 E227.05602
748 | G1 X165.269 Y168.899 E227.41602
749 | G1 X162.129 Y168.899 E227.79282
750 | G1 X162.129 Y180.899 E229.23282
751 | G1 X162.029 Y180.899 E229.24482
752 | G1 X162.029 Y168.899 E229.60482
753 | G1 X158.889 Y168.899 E229.98162
754 | G1 X158.889 Y180.899 E231.42162
755 | G1 X158.789 Y180.899 E231.43362
756 | G1 X158.789 Y168.899 E231.79362
757 | G1 X155.649 Y168.899 E232.17042
758 | G1 X155.649 Y180.899 E233.61042
759 | G1 X155.549 Y180.899 E233.62242
760 | G1 X155.549 Y168.899 E233.98242
761 | G1 X152.41 Y168.899 E234.3591
762 | G1 X152.41 Y180.899 E235.7991
763 | G1 X152.31 Y180.899 E235.8111
764 | G1 X152.31 Y168.899 E236.1711
765 | G1 X149.169 Y168.899 E236.54802
766 | G1 X149.169 Y180.899 E237.98802
767 | G1 X149.075 Y180.899 E237.9993
768 | G1 X149.069 Y180.904 E238.00023
769 | G1 X149.069 Y168.899 E238.36061
770 | G1 X145.929 Y168.899 E238.73741
771 | G1 X145.929 Y180.899 E240.17741
772 | G1 X145.874 Y180.899 E240.18401
773 | G0 X145.874 Y180.904
774 | G1 X145.829 Y180.904 E240.18914
775 | G1 X145.829 Y168.899 E240.54952
776 | G1 X142.689 Y168.899 E240.92632
777 | G1 X142.689 Y180.899 E242.36632
778 | G1 X142.674 Y180.899 E242.36812
779 | G0 X142.674 Y180.904
780 | G1 X142.589 Y180.904 E242.37808
781 | G1 X142.589 Y168.899 E242.73846
782 | G1 X139.449 Y168.899 E243.11526
783 | G1 X139.449 Y180.904 E244.55586
784 | G1 X139.349 Y180.904 E244.56786
785 | G1 X139.349 Y168.899 E244.92801
786 | G1 X136.209 Y168.899 E245.30481
787 | G1 X136.209 Y180.904 E246.74541
788 | G1 X136.125 Y180.904 E246.75549
789 | G0 X136.125 Y180.899
790 | G1 X136.109 Y180.899 E246.75712
791 | G1 X136.109 Y168.899 E247.11689
792 | G1 X132.969 Y168.899 E247.49369
793 | G1 X132.969 Y180.904 E248.93429
794 | G1 X132.925 Y180.904 E248.93957
795 | G0 X132.925 Y180.899
796 | G1 X132.869 Y180.899 E248.94604
797 | G1 X132.869 Y168.899 E249.30581
798 | G1 X129.729 Y168.899 E249.68261
799 | G1 X129.729 Y180.904 E251.12321
800 | G1 X129.724 Y180.899 E251.12406
801 | G1 X129.629 Y180.899 E251.13546
802 | G1 X129.629 Y168.899 E251.49523
803 | G1 X126.489 Y168.899 E251.87203
804 | G1 X126.489 Y180.899 E253.31203
805 | G1 X126.389 Y180.899 E253.32403
806 | G1 X126.389 Y168.899 E253.68403
807 | G1 X123.249 Y168.899 E254.06083
808 | G1 X123.249 Y180.899 E255.50083
809 | G1 X123.149 Y180.899 E255.51283
810 | G1 X123.149 Y168.899 E255.87283
811 | G1 X120.009 Y168.899 E256.24963
812 | G1 X120.009 Y180.899 E257.68963
813 | G1 X119.909 Y180.899 E257.70163
814 | G1 X119.909 Y168.899 E258.06163
815 | G1 X116.769 Y168.899 E258.43843
816 | G1 X116.769 Y180.899 E259.87843
817 | G1 X116.669 Y180.899 E259.89043
818 | G1 X116.669 Y168.899 E260.25043
819 | G1 X113.529 Y168.899 E260.62723
820 | G1 X113.529 Y180.899 E262.06723
821 | G1 X113.429 Y180.899 E262.07923
822 | G1 X113.429 Y168.899 E262.43923
823 | G1 X110.29 Y168.899 E262.81591
824 | G1 X110.29 Y180.899 E264.25591
825 | G1 X110.19 Y180.899 E264.26791
826 | G1 X110.19 Y168.899 E264.62791
827 | G1 X107.05 Y168.899 E265.00471
828 | G1 X107.05 Y180.899 E266.44471
829 | G1 X106.95 Y180.899 E266.45671
830 | G1 X106.95 Y168.899 E266.81671
831 | G1 X103.81 Y168.899 E267.19351
832 | G1 X103.81 Y180.899 E268.63351
833 | G1 X103.71 Y180.899 E268.64551
834 | G1 X103.71 Y168.899 E269.00551
835 | G1 X100.57 Y168.899 E269.38231
836 | G1 X100.57 Y180.899 E270.82231
837 | G1 X100.47 Y180.899 E270.83431
838 | G1 X100.47 Y168.899 E271.19431
839 | G1 X97.33 Y168.899 E271.57111
840 | G1 X97.33 Y180.899 E273.01111
841 | G1 X97.23 Y180.899 E273.02311
842 | G1 X97.23 Y168.899 E273.38311
843 | G1 X94.09 Y168.899 E273.75991
844 | G1 X94.09 Y180.899 E275.19991
845 | G1 X93.99 Y180.899 E275.21191
846 | G1 X93.99 Y168.899 E275.57191
847 | G1 X90.85 Y168.899 E275.94871
848 | G1 X90.85 Y180.899 E277.38871
849 | G1 X90.75 Y180.899 E277.40071
850 | G1 X90.75 Y168.899 E277.76071
851 | G1 X87.61 Y168.899 E278.13751
852 | G1 X87.61 Y180.899 E279.57751
853 | G1 X87.51 Y180.899 E279.58951
854 | G1 X87.51 Y168.899 E279.94951
855 | G1 X84.37 Y168.899 E280.32631
856 | G1 X84.37 Y180.899 E281.76631
857 | G1 X84.27 Y180.899 E281.77831
858 | G1 X84.27 Y168.899 E282.13831
859 | G1 X81.13 Y168.899 E282.51511
860 | G1 X81.13 Y180.899 E283.95511
861 | G1 X81.03 Y180.899 E283.96711
862 | G1 X81.03 Y168.899 E284.32711
863 | G1 X77.89 Y168.899 E284.70391
864 | G1 X77.89 Y180.899 E286.14391
865 | G1 X77.79 Y180.899 E286.15591
866 | G1 X77.79 Y168.899 E286.51591
867 | G1 X74.65 Y168.899 E286.89271
868 | ;TIME_ELAPSED:355.224205
869 | G10
870 | M204 S3000
871 | M205 X20
872 |
873 | M104 T0 S0
874 | M104 S0
875 | ;End of Gcode
876 | ;SETTING_3 {"extruder_quality": ["[general]\\nversion = 2\\nname = stormtrooper\
877 | ;SETTING_3 \ndefinition = ultimaker2_mark2\\n\\n[metadata]\\nextruder = ultimake
878 | ;SETTING_3 r2_extruder1\\ntype = quality_changes\\nquality_type = normal\\n\\n[v
879 | ;SETTING_3 alues]\\njerk_infill = 12\\ninfill_line_width = 0.4\\nspeed_wall_0 =
880 | ;SETTING_3 32\\nretraction_extrusion_window = =retraction_amount\\nmaterial_stan
881 | ;SETTING_3 dby_temperature = 125\\ntravel_avoid_other_parts = True\\nbottom_laye
882 | ;SETTING_3 rs = =999999 if infill_sparse_density == 100 else math.ceil(round(bot
883 | ;SETTING_3 tom_thickness / resolveOrValue('layer_height'), 4))\\nspeed_infill =
884 | ;SETTING_3 40\\nline_width = 0.4\\nmultiple_mesh_overlap = 0.01\\ncool_min_layer
885 | ;SETTING_3 _time = 8\\nretraction_hop = 1.5\\nretraction_hop_enabled = False\\nt
886 | ;SETTING_3 op_bottom_pattern = lines\\ncool_fan_full_layer = 4\\nskirt_brim_mini
887 | ;SETTING_3 mal_length = 0\\ntravel_avoid_distance = 1.5\\ncool_min_layer_time_fa
888 | ;SETTING_3 n_speed_max = 16\\nskirt_line_count = 0\\ninfill_pattern = lines\\nwa
889 | ;SETTING_3 ll_line_count = 2\\nspeed_wall_x = 36\\ncool_min_speed = 10\\ntop_lay
890 | ;SETTING_3 ers = =0 if infill_sparse_density == 100 else math.ceil(round(top_thi
891 | ;SETTING_3 ckness / resolveOrValue('layer_height'), 4))\\nmaterial_print_tempera
892 | ;SETTING_3 ture = 200\\nwall_line_width_x = 0.4\\nspeed_topbottom = 36\\nbrim_wi
893 | ;SETTING_3 dth = 0\\ninfill_sparse_density = 0\\nspeed_print = 70\\nspeed_travel
894 | ;SETTING_3 _layer_0 = 100\\nskirt_gap = 0\\ntop_bottom_thickness = 0\\n\\n", "[g
895 | ;SETTING_3 eneral]\\nversion = 2\\nname = stormtrooper\\ndefinition = ultimaker2
896 | ;SETTING_3 _mark2\\n\\n[metadata]\\nextruder = ultimaker2_extruder2\\ntype = qua
897 | ;SETTING_3 lity_changes\\nquality_type = normal\\n\\n[values]\\njerk_infill = 12
898 | ;SETTING_3 \\ninfill_line_width = 0.4\\nspeed_wall_0 = 32\\nretraction_extrusion
899 | ;SETTING_3 _window = =retraction_amount\\nmaterial_standby_temperature = 125\\nt
900 | ;SETTING_3 ravel_avoid_other_parts = True\\nspeed_infill = 40\\nline_width = 0.4
901 | ;SETTING_3 \\nmultiple_mesh_overlap = 0.01\\ncool_min_layer_time = 10\\nretracti
902 | ;SETTING_3 on_hop = 1.5\\ntop_bottom_pattern = lines\\ncool_fan_full_layer = 6\\
903 | ;SETTING_3 nskirt_brim_minimal_length = 0\\ntravel_avoid_distance = 1.5\\ncool_m
904 | ;SETTING_3 in_layer_time_fan_speed_max = 16\\nskirt_line_count = 0\\ninfill_patt
905 | ;SETTING_3 ern = lines\\nwall_line_count = 2\\nspeed_wall_x = 36\\nwall_line_wid
906 | ;SETTING_3 th_x = 0.4\\nmaterial_print_temperature = 200\\nspeed_travel = 150\\n
907 | ;SETTING_3 speed_topbottom = 36\\nbrim_width = 0\\ntop_bottom_thickness = 0\\nin
908 | ;SETTING_3 fill_sparse_density = 0\\nspeed_print = 70\\nspeed_travel_layer_0 = 1
909 | ;SETTING_3 00\\nskirt_gap = 0\\nretraction_hop_enabled = False\\n\\n"], "global_
910 | ;SETTING_3 quality": "[general]\\nversion = 2\\nname = stormtrooper\\ndefinition
911 | ;SETTING_3 = ultimaker2_mark2\\n\\n[metadata]\\ntype = quality_changes\\nqualit
912 | ;SETTING_3 y_type = normal\\n\\n[values]\\nadhesion_extruder_nr = 0\\nprime_towe
913 | ;SETTING_3 r_size = 12\\nprime_tower_position_x = 100\\nlayer_height_0 = 0.3\\nl
914 | ;SETTING_3 ayer_height = 0.1\\nprime_tower_enable = False\\nretraction_combing =
915 | ;SETTING_3 all\\nprime_tower_position_y = 60\\nadhesion_type = brim\\n\\n"}
916 |
--------------------------------------------------------------------------------
/cura-3.2-resources/definitions/Mark2_for_Ultimaker2.def.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": "Mark2_for_Ultimaker2",
3 | "version": 2,
4 | "name": "Mark2 for Ultimaker2",
5 | "inherits": "ultimaker2_plus",
6 | "metadata": {
7 | "visible": true,
8 | "author": "TheUltimakerCommunity",
9 | "manufacturer": "Foehnsturm",
10 | "category": "Other",
11 | "has_variants": true,
12 | "has_materials": true,
13 | "has_machine_materials": false,
14 | "has_machine_quality": false,
15 | "has_variant_materials": false,
16 | "weight": 2,
17 | "file_formats": "text/x-gcode",
18 | "icon": "icon_ultimaker.png",
19 | "platform": "ultimaker2_platform.obj",
20 | "platform_texture": "Mark2_for_Ultimaker2_backplate.png",
21 | "machine_extruder_trains":
22 | {
23 | "0": "Mark2_extruder1",
24 | "1": "Mark2_extruder2"
25 | },
26 | "supported_actions": ["MachineSettingsAction", "UpgradeFirmware"]
27 | },
28 | "overrides": {
29 | "machine_name": { "default_value": "Mark2_for_Ultimaker2" },
30 | "machine_width": {
31 | "default_value": 223
32 | },
33 | "machine_depth": {
34 | "default_value": 223
35 | },
36 | "machine_height": {
37 | "default_value": 203
38 | },
39 | "gantry_height": {
40 | "default_value": 52
41 | },
42 | "machine_center_is_zero": {
43 | "default_value": false
44 | },
45 | "machine_nozzle_size": {
46 | "default_value": 0.4
47 | },
48 | "machine_nozzle_heat_up_speed": {
49 | "default_value": 3.5
50 | },
51 | "machine_nozzle_cool_down_speed": {
52 | "default_value": 1.5
53 | },
54 | "machine_min_cool_heat_time_window":
55 | {
56 | "default_value": 15.0
57 | },
58 | "machine_show_variants": {
59 | "default_value": true
60 | },
61 | "machine_nozzle_head_distance": {
62 | "default_value": 5
63 | },
64 | "machine_nozzle_expansion_angle": {
65 | "default_value": 45
66 | },
67 | "machine_heat_zone_length": {
68 | "default_value": 20
69 | },
70 | "machine_heated_bed": {
71 | "default_value": true
72 | },
73 | "speed_infill": {
74 | "value": "speed_print"
75 | },
76 | "speed_wall_x": {
77 | "value": "speed_wall"
78 | },
79 | "layer_height_0": {
80 | "value": "round(machine_nozzle_size / 1.5, 2)"
81 | },
82 | "line_width": {
83 | "value": "round(machine_nozzle_size * 0.875, 2)"
84 | },
85 | "speed_layer_0": {
86 | "default_value": 20
87 | },
88 | "speed_support": {
89 | "value": "speed_wall_0"
90 | },
91 | "machine_max_feedrate_x": {
92 | "default_value": 250
93 | },
94 | "machine_max_feedrate_y": {
95 | "default_value": 250
96 | },
97 | "machine_max_feedrate_z": {
98 | "default_value": 40
99 | },
100 | "machine_max_feedrate_e": {
101 | "default_value": 45
102 | },
103 | "machine_acceleration": {
104 | "default_value": 3000
105 | },
106 | "retraction_amount": {
107 | "default_value": 5.1
108 | },
109 | "retraction_speed": {
110 | "default_value": 25
111 | },
112 | "switch_extruder_retraction_amount": {
113 | "default_value": 0,
114 | "value": "retraction_amount",
115 | "enabled": false
116 | },
117 | "switch_extruder_retraction_speeds": {
118 | "default_value": 25,
119 | "value": "retraction_speed",
120 | "enabled": false
121 | },
122 | "switch_extruder_retraction_speed": {
123 | "default_value": 25,
124 | "value": "retraction_retract_speed",
125 | "enabled": false
126 | },
127 | "switch_extruder_prime_speed": {
128 | "default_value": 25,
129 | "value": "retraction_prime_speed",
130 | "enabled": false
131 | },
132 | "machine_head_with_fans_polygon":
133 | {
134 | "default_value": [
135 | [ -44, 14 ],
136 | [ -44, -34 ],
137 | [ 64, 14 ],
138 | [ 64, -34 ]
139 | ]
140 | },
141 | "machine_use_extruder_offset_to_offset_coords": {
142 | "default_value": false
143 | },
144 | "machine_gcode_flavor": {
145 | "default_value": "RepRap (Marlin/Sprinter)"
146 | },
147 | "machine_start_gcode" : {
148 | "default_value": "",
149 | "value": "\"\" if machine_gcode_flavor == \"UltiGCode\" else \";material_bed_temperature={material_bed_temperature} material_print_temperature={material_print_temperature} material_print_temperature_layer_0={material_print_temperature_layer_0}\\nM190 S{material_bed_temperature_layer_0}\\nM109 T0 S{material_standby_temperature, 0}\\nM109 T1 S{material_print_temperature_layer_0, 1}\\nM104 T0 S{material_print_temperature_layer_0, 0}\\nG21 ;metric values\\nG90 ;absolute positioning\\nM82 ;set extruder to absolute mode\\nM107 ;start with the fan off\\nM200 D0 T0 ;reset filament diameter\\nM200 D0 T1\\nG28 Z0; home all\\nG28 X0 Y0\\nG0 Z20 F2400 ;move the platform to 20mm\\nG92 E0\\nT1 ; move to the 2th head\\nG0 Z20 F2400\\nG92 E-7.0 ;prime distance\\nG1 E0 F45 ;purge nozzle\\nG1 E-5.1 F1500 ; retract\\nG1 X90 Z0.01 F5000 ; move away from the prime poop\\nG1 X50 F9000\\nG0 Z20 F2400\\nT0 ; move to the first head\\nM104 T1 S{material_standby_temperature, 1}\\nG0 Z20 F2400\\nM104 T{initial_extruder_nr} S{material_print_temperature_layer_0, initial_extruder_nr}\\nG92 E-7.0\\nG1 E0 F45 ;purge nozzle\\nG1 E-5.1 F1500\\nG1 X60 Z0.01 F5000 ; move away from the prime poop\\nG1 X20 F9000\\nM400 ;finish all moves\\nG92 E0\\n;end of startup sequence\\n\""
150 | },
151 | "machine_end_gcode" : {
152 | "default_value": "",
153 | "value": "\"\" if machine_gcode_flavor == \"UltiGCode\" else \"G90 ;absolute positioning\\nM104 S0 T0 ;extruder heater off\\nM104 S0 T1\\nM140 S0 ;turn off bed\\nT0 ; move to the first head\\nM107 ;fan off\""
154 | },
155 | "machine_extruder_count": {
156 | "default_value": 2
157 | },
158 | "acceleration_enabled":
159 | {
160 | "default_value": true
161 | },
162 | "acceleration_print":
163 | {
164 | "default_value": 2000,
165 | "value": "2000"
166 | },
167 | "acceleration_travel":
168 | {
169 | "default_value": 3000,
170 | "value": "acceleration_print if magic_spiralize else 3000"
171 | },
172 | "acceleration_layer_0": { "value": "acceleration_topbottom" },
173 | "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" },
174 | "acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" },
175 | "acceleration_support_interface": { "value": "acceleration_topbottom" },
176 | "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 500 / 4000)" },
177 | "acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 4000)" },
178 | "acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 500 / 1000)" },
179 | "jerk_enabled":
180 | {
181 | "default_value": true
182 | },
183 | "jerk_print":
184 | {
185 | "default_value": 12
186 | },
187 | "jerk_travel":
188 | {
189 | "default_value": 20,
190 | "value": "jerk_print if magic_spiralize else 20"
191 | },
192 | "jerk_layer_0": { "value": "jerk_topbottom" },
193 | "jerk_prime_tower": { "value": "10 if jerk_print < 16 else math.ceil(jerk_print * 15 / 25)" },
194 | "jerk_support": { "value": "10 if jerk_print < 16 else math.ceil(jerk_print * 15 / 25)" },
195 | "jerk_support_interface": { "value": "jerk_topbottom" },
196 | "jerk_topbottom": { "value": "10 if jerk_print < 25 else math.ceil(jerk_print * 10 / 25)" },
197 | "jerk_wall": { "value": "10 if jerk_print < 16 else math.ceil(jerk_print * 15 / 25)" },
198 | "jerk_wall_0": { "value": "10 if jerk_wall < 16 else math.ceil(jerk_wall * 6 / 10)" },
199 | "jerk_travel_layer_0": { "value": "math.ceil(jerk_layer_0 * jerk_travel / jerk_print)" },
200 | "extruder_prime_pos_abs": { "default_value": false },
201 | "machine_extruder_start_pos_abs": { "default_value": false },
202 | "machine_extruder_start_pos_x": { "value": 0.0 },
203 | "machine_extruder_start_pos_y": { "value": 0.0 },
204 | "machine_extruder_end_pos_abs": { "default_value": false },
205 | "machine_extruder_end_pos_x": { "value": 0.0 },
206 | "machine_extruder_end_pos_y": { "value": 0.0 },
207 | "extruder_prime_pos_x": { "default_value": 0.0, "enabled": false },
208 | "extruder_prime_pos_y": { "default_value": 0.0, "enabled": false },
209 | "extruder_prime_pos_z": { "default_value": 0.0, "enabled": false },
210 | "start_layers_at_same_position":
211 | {
212 | "default_value": false,
213 | "enabled": false,
214 | "value": false
215 | },
216 | "layer_start_x":
217 | {
218 | "default_value": 105.0,
219 | "enabled": false
220 | },
221 | "layer_start_y":
222 | {
223 | "default_value": 27.0,
224 | "enabled": false
225 | },
226 | "prime_tower_position_x": {
227 | "default_value": 185
228 | },
229 | "prime_tower_position_y": {
230 | "default_value": 160
231 | },
232 | "machine_disallowed_areas": {
233 | "default_value": [
234 | [[-115, 112.5], [ -10, 112.5], [ -10, 72.5], [-115, 72.5]],
235 | [[ 115, 112.5], [ 115, 72.5], [ 15, 72.5], [ 15, 112.5]],
236 | [[-115, -112.5], [-115, -87.5], [ 115, -87.5], [ 115, -112.5]],
237 | [[-115, 72.5], [-97, 72.5], [-97, -112.5], [-115, -112.5]]
238 | ]
239 | }
240 | }
241 | }
242 |
--------------------------------------------------------------------------------
/cura-3.2-resources/extruders/Mark2_extruder1.def.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": "Mark2_extruder1",
3 | "version": 2,
4 | "name": "Extruder 1",
5 | "inherits": "fdmextruder",
6 | "metadata": {
7 | "machine": "Mark2_for_Ultimaker2",
8 | "position": "0",
9 | "quality_definition": "mark2_extruder1"
10 | },
11 |
12 | "overrides": {
13 | "extruder_nr": {
14 | "default_value": 0,
15 | "maximum_value": "1"
16 | },
17 | "machine_nozzle_offset_x": { "default_value": 0.0 },
18 | "machine_nozzle_offset_y": { "default_value": 0.0 }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/cura-3.2-resources/extruders/Mark2_extruder2.def.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": "Mark2_extruder2",
3 | "version": 2,
4 | "name": "Extruder 2",
5 | "inherits": "fdmextruder",
6 | "metadata": {
7 | "machine": "Mark2_for_Ultimaker2",
8 | "position": "1",
9 | "quality_definition": "mark2_extruder2"
10 | },
11 |
12 | "overrides": {
13 | "extruder_nr": {
14 | "default_value": 1,
15 | "maximum_value": "1"
16 | },
17 | "machine_nozzle_offset_x": { "default_value": 0.0 },
18 | "machine_nozzle_offset_y": { "default_value": 0.0 }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/cura-3.2-resources/images/Mark2_for_Ultimaker2_backplate.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/cura-3.2-resources/images/Mark2_for_Ultimaker2_backplate.png
--------------------------------------------------------------------------------
/cura-3.2-resources/scripts/Mark2Tweaks.py:
--------------------------------------------------------------------------------
1 | ##
2 | ## Mark2Plugin - Mark2Tweaks: Cura PostProcessingPlugin script for the Mark 2.
3 | ## Copyright (C) 2016,2017 Krys Lawrence
4 | ##
5 | ## This program is free software: you can redistribute it and/or modify
6 | ## it under the terms of the GNU Affero General Public License as
7 | ## published by the Free Software Foundation, either version 3 of the
8 | ## License, or (at your option) any later version.
9 | ##
10 | ## This program is distributed in the hope that it will be useful,
11 | ## but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | ## GNU Affero General Public License for more details.
14 | ##
15 | ## You should have received a copy of the GNU Affero General Public License
16 | ## along with this program. If not, see .
17 | ##
18 |
19 | """Add-on script for nallath's PostProcessingPlugin to help the Mark 2.
20 |
21 | See https://github.com/nallath/PostProcessingPlugin for details about the
22 | plugin.
23 |
24 | Put this script in PostProcessingPlugin's scripts folder.
25 | """
26 |
27 |
28 | import re
29 | import traceback
30 | import contextlib
31 | from UM.Logger import Logger
32 | from ..Script import Script
33 |
34 |
35 | """Convenience alias for UM.Logger.Logger.log."""
36 | log = Logger.log
37 |
38 |
39 | @contextlib.contextmanager
40 | def exception_handler(layer_num, log_not_raise=False):
41 | """Either raise or just log the last exception."""
42 | try:
43 | yield
44 | except:
45 | if log_not_raise:
46 | layer_log(layer_num, 'e', ''.join(traceback.format_exc()))
47 | else:
48 | layer_log(layer_num, 'e', 'Exception! Traceback follows.')
49 | raise
50 |
51 |
52 | def layer_log(layer_num, message_type, message):
53 | """Log a message prefixed with the curent layer number."""
54 | log(message_type, 'Layer {:.0f}: {}'.format(layer_num, message))
55 |
56 |
57 | class Mark2Tweaks(Script):
58 | """Optimize the G-code output for the Mark 2."""
59 |
60 | def getSettingDataString(self):
61 | """Return script identification and GUI options."""
62 | # Note: The "version" key is not this script's version, but the API
63 | # version of the PostProcessingPlugin.
64 | return '''\
65 | {
66 | "name": "Mark 2 Tweaks",
67 | "key": "Mark2Tweaks",
68 | "metadata": {},
69 | "version": 2,
70 | "settings": {
71 | "remove_hack": {
72 | "label": "Clean Up Cura Workaround",
73 | "description":
74 | "The Mark 2 settings include a workaround to a Cura limitation. This tweak cleans up after it.",
75 | "type": "bool",
76 | "default_value": true
77 | },
78 | "remove_superfluous": {
79 | "label": "Remove Extra Movements",
80 | "description":
81 | "Remove superfluous movements after each tool change. This can improve print quality by preventing materials from incorrectly touching immediately after a tool change.",
82 | "type": "bool",
83 | "default_value": true
84 | },
85 | "ignore_errors": {
86 | "label": "Ignore Errors",
87 | "description":
88 | "If any errors occur while performing the tweaks, skip them keep going",
89 | "type": "bool",
90 | "default_value": true
91 | }
92 | }
93 | }'''
94 |
95 | def execute(self, data):
96 | """Process all G-code and apply selected tweaks."""
97 | log('d', '*** MARK 2 TWEAKS START ***')
98 | remove_hack = self.getSettingValueByKey('remove_hack')
99 | remove_superfluous = self.getSettingValueByKey('remove_superfluous')
100 | ignore_errors = self.getSettingValueByKey('ignore_errors')
101 | log('d', 'Remove Hack: {}'.format(remove_hack))
102 | log('d', 'Remove Superfluous: {}'.format(remove_superfluous))
103 | log('d', 'Ignore Errors: {}'.format(ignore_errors))
104 | for layer_idx, layer in enumerate(data):
105 | lines = layer.split('\n')
106 | layer_num = self.find_layer_num(lines)
107 | if layer_num is None:
108 | continue
109 | # Copy of lines so lines can be deleted or inserted in loop
110 | for line_idx, line in enumerate(lines[:]):
111 | if not line in ('T0', 'T1'):
112 | continue
113 | if remove_hack:
114 | with exception_handler(layer_num, ignore_errors):
115 | self.remove_hack(layer_num, lines, line_idx)
116 | if remove_superfluous:
117 | with exception_handler(layer_num, ignore_errors):
118 | self.remove_superfluous(layer_num, lines, line_idx)
119 | data[layer_idx] = '\n'.join(lines)
120 | log('d', '*** MARK 2 TWEAKS END ***')
121 | return data
122 |
123 | def find_layer_num(self, lines):
124 | """Return the current layer number as a float."""
125 | result = self.find_line(lines, ';LAYER:', whole=False)
126 | if result is not None:
127 | return self.getValue(result, ";LAYER:")
128 |
129 | def remove_hack(self, layer_num, lines, t_idx):
130 | """Remove TinkerGnome's Cura print area workaround line.
131 |
132 | If there is a G0 between T and G10/M104, remove it.
133 | There should only be one.
134 | TinkerGnome says adding it was a hack/workaround so we can kill it.
135 | """
136 | end_idx = self.find_g10_or_m104(layer_num, lines, t_idx)
137 | hack = self.find_line_and_index(lines, 'G0', ('X', 'Y', 'Z'), t_idx,
138 | end_idx)
139 | if hack is None:
140 | return
141 | hack_line, hack_idx = hack
142 | if (self.getValue(hack_line, 'Z') == 14
143 | and self.getValue(hack_line, 'Y') == 35):
144 | layer_log(layer_num, 'd', 'Striping Cura print area hack.')
145 | del lines[hack_idx]
146 |
147 | def remove_superfluous(self, layer_num, lines, t_idx):
148 | """Collapse any post tool change movents into a single movement.
149 |
150 | Any non-extrusion movements after tool change should be collapsed into
151 | a single line. Keep only the last G0/G1 but add the F and Z of the
152 | first G0/G1. But only collapse if there is more than one line.
153 | """
154 | start_idx = self.find_g10_or_m104(layer_num, lines, t_idx)
155 | end_idx = self.find_line_index(lines, ('G0', 'G1'), 'E', start_idx)
156 | assert end_idx is not None, \
157 | 'Cannot find extruding G0/G1 line after tool change.'
158 |
159 | first_g = self.find_line_and_index(lines, ('G0', 'G1'), None,
160 | start_idx, end_idx)
161 | assert first_g is not None, \
162 | 'Sanity Check: Could not find a G0/G1 line before extrusion and ' \
163 | 'after tool change.'
164 | first_g_line, first_g_idx = first_g
165 | assert first_g_idx < end_idx, \
166 | 'Sanity Check: First G0/G1 is >= to first extrusion.'
167 |
168 | f_value = self.getValue(first_g_line, 'F')
169 | z_value = self.getValue(first_g_line, 'Z')
170 | assert z_value is not None, \
171 | 'Sanity Check: Z value not found in first G0/G1 line.'
172 |
173 | self.delete_all_g0_or_g1_except_last(layer_num, lines, first_g_idx,
174 | 'Collapsing post tool change movements.')
175 | assert self.is_g0_or_g1(lines[first_g_idx]), \
176 | 'Sanity Check: Missing G0/G1 after collapse.'
177 | assert not self.is_g0_or_g1(lines[first_g_idx+1]), \
178 | 'Sanity Check: More than one G0/G1 after collapse.'
179 |
180 | self.add_f_and_z_values(layer_num, lines, first_g_idx, z_value,
181 | f_value)
182 | assert self.getValue(lines[first_g_idx], 'Z') is not None, \
183 | 'Sanity Check: Missing required Z value.'
184 |
185 | def find_g10_or_m104(self, layer_num, lines, t_idx):
186 | """Find the next G10 or M104 line.
187 |
188 | G10 is for UltiGCode-style G-code.
189 | M104 is for RepRap-style G-code.
190 | """
191 | idx = self.find_line_index(lines, 'G10', start=t_idx)
192 | if idx is None: # Assume RepRap style G-code
193 | idx = self.find_line_index(lines, 'M104', start=t_idx)
194 | assert idx is not None, \
195 | 'Cannot find G10/M104 after tool change.'
196 | assert t_idx < idx < t_idx + 10, \
197 | 'Sanity Check: G10/M104 too far from T'
198 | return idx
199 |
200 | def delete_all_g0_or_g1_except_last(self, layer_num, lines, first_g_idx,
201 | log_msg):
202 | """Delete all G0/G1 lines, except the last one.
203 |
204 | As long as there is more than one G line, delete the first.
205 | Subsequent G line indices move up by one == first_g_idx.
206 | This works only if lines are deleted and not just replaced.
207 | If only one G, never run. Last G is not deleted.
208 |
209 | Also log only once if one or more deletes occurs.
210 | """
211 | has_logged = False
212 | while self.is_g0_or_g1(lines[first_g_idx+1]):
213 | if not has_logged:
214 | # Never log on single line. Only log once if multiple lines.
215 | layer_log(layer_num, 'd', log_msg)
216 | has_logged = True
217 | del lines[first_g_idx]
218 |
219 | def is_g0_or_g1(self, line):
220 | """Return true is line is a G0 or G1 command."""
221 | return line.startswith('G0 ') or line.startswith('G1 ')
222 |
223 | def add_f_and_z_values(self, layer_num, lines, g_idx, z_value,
224 | f_value=None):
225 | """Add Z and F values to the indicated G0/G1 line.
226 |
227 | f_value is optional.
228 | Existing Z and F values will not be replaced.
229 | """
230 | line = lines[g_idx]
231 | fields = line.split(' ')
232 | if f_value is not None and self.getValue(line, 'F') is None:
233 | fields.insert(1, 'F{}'.format(f_value))
234 | if self.getValue(line, 'Z') is None:
235 | fields.append('Z{}'.format(z_value))
236 | lines[g_idx] = ' '.join(fields)
237 |
238 | def find_line(self, *args, **kwargs):
239 | """Return just the line from self.find_line_and_index()."""
240 | result = self.find_line_and_index(*args, **kwargs)
241 | if result is not None:
242 | return result[0]
243 |
244 | def find_line_index(self, *args, **kwargs):
245 | """Return just the index from self.find_line_and_index()."""
246 | result = self.find_line_and_index(*args, **kwargs)
247 | if result is not None:
248 | return result[1]
249 |
250 | def find_line_and_index(self, lines, commands, parameters=None, start=0,
251 | end=None, whole=True):
252 | """Find the first line in lines that matches the given criteria.
253 |
254 | lines: The iterable of strings to search
255 | commands: The command string (or iterable thereof) with which the
256 | line must start. If given an iterable (e.g. list), the
257 | line can match *any* given command.
258 | parameters: The parameter string (or iterable thereof) that the line
259 | must contain. Specifically, self.getValue() must return
260 | a value. If gien an iterable, the line must contain
261 | *all* of the given parameters. (Optional)
262 | start: The index after which to search lines. (Optional)
263 | end: The index before witch to seach lines. (Optional)
264 | whole: If true, only match on whole commands. If false, match
265 | any command prefix. E.g. with whole=True, G1 will match
266 | only G1 commands. With whole=False, G1 would match G1 and
267 | G10 commands, or even G1butterfly commands. :) E.g. To
268 | find all T commands, use commands='T' and whole=False.
269 |
270 | Returns: The matching line string and its index in lines as a tuple, or
271 | None if not match was found.
272 | """
273 | if isinstance(commands, str):
274 | commands = (commands,)
275 | if isinstance(parameters, str):
276 | parameters = (parameters,)
277 | if end is None:
278 | end = len(lines)
279 | for i, line in enumerate(lines[start:end], start):
280 | for command in commands:
281 | # Commands must be standalone, or there must be a space before
282 | # the first parameter. This distinguise between G1 and G10,
283 | # for example.
284 | if (line == command
285 | or line.startswith(command + (' ' if whole else ''))):
286 | if parameters is None:
287 | return line, i
288 | else:
289 | values = (self.getValue(line, p) for p in parameters)
290 | values = (v for v in values if v is not None)
291 | # Consume iterators/generators and force into sequences
292 | if len(tuple(values)) == len(tuple(parameters)):
293 | return line, i
294 |
295 | def getValue(self, line, key, default = None):
296 | """Replacement version of getValue that fixes a couple bugs.
297 |
298 | Specifically, it allows variable length keys and should support missing
299 | leading zeros on values < 1mm (e.g. X.45). CuraEngine likes to emit
300 | those sometimes now. :(
301 | """
302 | key_pos = line.find(key)
303 | if key_pos == -1 or (';' in line and key_pos > line.find(';')):
304 | return default
305 | sub_part = line[key_pos + len(key):]
306 | m = re.search('^[0-9]*\.?[0-9]*', sub_part)
307 | if m is None:
308 | return default
309 | try:
310 | return float(m.group(0))
311 | except:
312 | return default
--------------------------------------------------------------------------------
/cura-3.2-resources/variants/Mark2_for_Ultimaker2_0.25.inst.cfg:
--------------------------------------------------------------------------------
1 | [general]
2 | name = 0.25 mm
3 | version = 2
4 | definition = Mark2_for_Ultimaker2
5 |
6 | [metadata]
7 | author = Ultimaker
8 | type = variant
9 | setting_version = 4
10 |
11 | [values]
12 | machine_nozzle_size = 0.25
13 | machine_nozzle_tip_outer_diameter = 0.8
14 | coasting_volume = 0.1
15 | coasting_min_volume = 0.17
16 | speed_wall = =round(speed_print / 1.2, 1)
17 | speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5)
18 | speed_topbottom = =round(speed_print / 1.5, 1)
19 |
--------------------------------------------------------------------------------
/cura-3.2-resources/variants/Mark2_for_Ultimaker2_0.4.inst.cfg:
--------------------------------------------------------------------------------
1 | [general]
2 | name = 0.4 mm
3 | version = 2
4 | definition = Mark2_for_Ultimaker2
5 |
6 | [metadata]
7 | author = Ultimaker
8 | type = variant
9 | setting_version = 4
10 |
11 | [values]
12 | machine_nozzle_size = 0.4
13 | machine_nozzle_tip_outer_diameter = 1.05
14 | speed_wall = =round(speed_print / 1.25, 1)
15 | speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10)
16 | speed_topbottom = =round(speed_print / 2.25, 1)
17 |
--------------------------------------------------------------------------------
/cura-3.2-resources/variants/Mark2_for_Ultimaker2_0.6.inst.cfg:
--------------------------------------------------------------------------------
1 | [general]
2 | name = 0.6 mm
3 | version = 2
4 | definition = Mark2_for_Ultimaker2
5 |
6 | [metadata]
7 | author = Ultimaker
8 | type = variant
9 | setting_version = 4
10 |
11 | [values]
12 | machine_nozzle_size = 0.6
13 | machine_nozzle_tip_outer_diameter = 1.25
14 | coasting_volume = 1.36
15 | speed_wall = =round(speed_print * 4 / 3, 1)
16 | speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10)
17 | speed_topbottom = =round(speed_print / 2, 1)
18 |
--------------------------------------------------------------------------------
/cura-3.2-resources/variants/Mark2_for_Ultimaker2_0.8.inst.cfg:
--------------------------------------------------------------------------------
1 | [general]
2 | name = 0.8 mm
3 | version = 2
4 | definition = Mark2_for_Ultimaker2
5 |
6 | [metadata]
7 | author = Ultimaker
8 | type = variant
9 | setting_version = 4
10 |
11 | [values]
12 | machine_nozzle_size = 0.8
13 | machine_nozzle_tip_outer_diameter = 1.35
14 | coasting_volume = 3.22
15 | speed_wall = =round(speed_print * 4 / 3, 1)
16 | speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10)
17 | speed_topbottom = =round(speed_print / 2, 1)
18 |
--------------------------------------------------------------------------------
/cura-resources/README.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/cura-resources/definitions/Mark2_for_Ultimaker2.def.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": "Mark2_for_Ultimaker2",
3 | "version": 2,
4 | "name": "Mark2 for Ultimaker2",
5 | "inherits": "ultimaker2_plus",
6 | "metadata": {
7 | "visible": true,
8 | "author": "TheUltimakerCommunity",
9 | "manufacturer": "Foehnsturm",
10 | "category": "Other",
11 | "quality_definition": "ultimaker2_plus",
12 | "weight": 1,
13 | "file_formats": "text/x-gcode",
14 | "icon": "icon_ultimaker.png",
15 | "platform": "ultimaker2_platform.obj",
16 | "platform_texture": "Mark2_for_Ultimaker2_backplate.png",
17 | "machine_extruder_trains":
18 | {
19 | "0": "Mark2_extruder1",
20 | "1": "Mark2_extruder2"
21 | },
22 | "supported_actions": ["MachineSettingsAction", "UpgradeFirmware"]
23 | },
24 | "overrides": {
25 | "machine_name": { "default_value": "Mark2_for_Ultimaker2" },
26 | "machine_width": {
27 | "default_value": 223
28 | },
29 | "machine_depth": {
30 | "default_value": 223
31 | },
32 | "machine_height": {
33 | "default_value": 203
34 | },
35 | "gantry_height": {
36 | "default_value": 52
37 | },
38 | "machine_center_is_zero": {
39 | "default_value": false
40 | },
41 | "machine_nozzle_size": {
42 | "default_value": 0.4
43 | },
44 | "machine_nozzle_heat_up_speed": {
45 | "default_value": 3.5
46 | },
47 | "machine_nozzle_cool_down_speed": {
48 | "default_value": 1.5
49 | },
50 | "machine_min_cool_heat_time_window":
51 | {
52 | "default_value": 15.0
53 | },
54 | "machine_show_variants": {
55 | "default_value": true
56 | },
57 | "machine_nozzle_head_distance": {
58 | "default_value": 5
59 | },
60 | "machine_nozzle_expansion_angle": {
61 | "default_value": 45
62 | },
63 | "machine_heat_zone_length": {
64 | "default_value": 20
65 | },
66 | "machine_heated_bed": {
67 | "default_value": true
68 | },
69 | "speed_infill": {
70 | "value": "speed_print"
71 | },
72 | "speed_wall_x": {
73 | "value": "speed_wall"
74 | },
75 | "layer_height_0": {
76 | "value": "round(machine_nozzle_size / 1.5, 2)"
77 | },
78 | "line_width": {
79 | "value": "round(machine_nozzle_size * 0.875, 2)"
80 | },
81 | "speed_layer_0": {
82 | "default_value": 20
83 | },
84 | "speed_support": {
85 | "value": "speed_wall_0"
86 | },
87 | "machine_max_feedrate_x": {
88 | "default_value": 250
89 | },
90 | "machine_max_feedrate_y": {
91 | "default_value": 250
92 | },
93 | "machine_max_feedrate_z": {
94 | "default_value": 40
95 | },
96 | "machine_max_feedrate_e": {
97 | "default_value": 45
98 | },
99 | "machine_acceleration": {
100 | "default_value": 3000
101 | },
102 | "retraction_amount": {
103 | "default_value": 5.1
104 | },
105 | "retraction_speed": {
106 | "default_value": 25
107 | },
108 | "switch_extruder_retraction_amount": {
109 | "default_value": 0,
110 | "value": "retraction_amount",
111 | "enabled": false
112 | },
113 | "switch_extruder_retraction_speeds": {
114 | "default_value": 25,
115 | "value": "retraction_speed",
116 | "enabled": false
117 | },
118 | "switch_extruder_retraction_speed": {
119 | "default_value": 25,
120 | "value": "retraction_retract_speed",
121 | "enabled": false
122 | },
123 | "switch_extruder_prime_speed": {
124 | "default_value": 25,
125 | "value": "retraction_prime_speed",
126 | "enabled": false
127 | },
128 | "machine_head_with_fans_polygon":
129 | {
130 | "default_value": [
131 | [ -44, 14 ],
132 | [ -44, -34 ],
133 | [ 64, 14 ],
134 | [ 64, -34 ]
135 | ]
136 | },
137 | "machine_use_extruder_offset_to_offset_coords": {
138 | "default_value": false
139 | },
140 | "machine_gcode_flavor": {
141 | "default_value": "RepRap (Marlin/Sprinter)"
142 | },
143 | "machine_start_gcode" : {
144 | "default_value": "",
145 | "value": "\"\" if machine_gcode_flavor == \"UltiGCode\" else \"G21 ;metric values\\nG90 ;absolute positioning\\nM82 ;set extruder to absolute mode\\nM107 ;start with the fan off\\nM200 D0 T0 ;reset filament diameter\\nM200 D0 T1\\nG28 Z0; home all\\nG28 X0 Y0\\nG0 Z20 F2400 ;move the platform to 20mm\\nG92 E0\\nT1 ; move to the 2th head\\nG0 Z20 F2400\\nG92 E-7.0 ;prime distance\\nG1 E0 F45 ;purge nozzle\\nG1 E-5.1 F1500 ; retract\\nG1 X90 Z0.01 F5000 ; move away from the prime poop\\nG1 X50 F9000\\nG0 Z20 F2400\\nT0 ; move to the first head\\nG0 Z20 F2400\\nG92 E-7.0\\nG1 E0 F45 ;purge nozzle\\nG1 E-5.1 F1500\\nG1 X60 Z0.01 F5000 ; move away from the prime poop\\nG1 X20 F9000\\nM400 ;finish all moves\\nG92 E0\\n;end of startup sequence\\n\""
146 | },
147 | "machine_end_gcode" : {
148 | "default_value": "",
149 | "value": "\"\" if machine_gcode_flavor == \"UltiGCode\" else \"G90 ;absolute positioning\\nM104 S0 T0 ;extruder heater off\\nM104 S0 T1\\nM140 S0 ;turn off bed\\nT0 ; move to the first head\\nM107 ;fan off\""
150 | },
151 | "machine_extruder_count": {
152 | "default_value": 2
153 | },
154 | "acceleration_enabled":
155 | {
156 | "default_value": true
157 | },
158 | "acceleration_print":
159 | {
160 | "default_value": 2000,
161 | "value": "2000"
162 | },
163 | "acceleration_travel":
164 | {
165 | "default_value": 3000,
166 | "value": "acceleration_print if magic_spiralize else 3000"
167 | },
168 | "acceleration_layer_0": { "value": "acceleration_topbottom" },
169 | "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" },
170 | "acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" },
171 | "acceleration_support_interface": { "value": "acceleration_topbottom" },
172 | "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 500 / 4000)" },
173 | "acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 4000)" },
174 | "acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 500 / 1000)" },
175 | "jerk_enabled":
176 | {
177 | "default_value": true
178 | },
179 | "jerk_print":
180 | {
181 | "default_value": 12
182 | },
183 | "jerk_travel":
184 | {
185 | "default_value": 20,
186 | "value": "jerk_print if magic_spiralize else 20"
187 | },
188 | "jerk_layer_0": { "value": "jerk_topbottom" },
189 | "jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" },
190 | "jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" },
191 | "jerk_support_interface": { "value": "jerk_topbottom" },
192 | "jerk_topbottom": { "value": "math.ceil(jerk_print * 10 / 25)" },
193 | "jerk_wall": { "value": "math.ceil(jerk_print * 15 / 25)" },
194 | "jerk_wall_0": { "value": "math.ceil(jerk_wall * 6 / 10)" },
195 | "jerk_travel_layer_0": { "value": "math.ceil(jerk_layer_0 * jerk_travel / jerk_print)" },
196 | "extruder_prime_pos_abs": { "default_value": false },
197 | "machine_extruder_start_pos_abs": { "default_value": false },
198 | "machine_extruder_start_pos_x": { "value": 0.0 },
199 | "machine_extruder_start_pos_y": { "value": 0.0 },
200 | "machine_extruder_end_pos_abs": { "default_value": false },
201 | "machine_extruder_end_pos_x": { "value": 0.0 },
202 | "machine_extruder_end_pos_y": { "value": 0.0 },
203 | "extruder_prime_pos_x": { "default_value": 0.0, "enabled": false },
204 | "extruder_prime_pos_y": { "default_value": 0.0, "enabled": false },
205 | "extruder_prime_pos_z": { "default_value": 0.0, "enabled": false },
206 | "start_layers_at_same_position":
207 | {
208 | "default_value": false,
209 | "enabled": false,
210 | "value": false
211 | },
212 | "layer_start_x":
213 | {
214 | "default_value": 105.0,
215 | "enabled": false
216 | },
217 | "layer_start_y":
218 | {
219 | "default_value": 27.0,
220 | "enabled": false
221 | },
222 | "prime_tower_position_x": {
223 | "default_value": 185
224 | },
225 | "prime_tower_position_y": {
226 | "default_value": 160
227 | },
228 | "machine_disallowed_areas": {
229 | "default_value": [
230 | [[-115, 112.5], [ -10, 112.5], [ -10, 72.5], [-115, 72.5]],
231 | [[ 115, 112.5], [ 115, 72.5], [ 15, 72.5], [ 15, 112.5]],
232 | [[-115, -112.5], [-115, -87.5], [ 115, -87.5], [ 115, -112.5]],
233 | [[-115, 72.5], [-97, 72.5], [-97, -112.5], [-115, -112.5]]
234 | ]
235 | }
236 | }
237 | }
238 |
--------------------------------------------------------------------------------
/cura-resources/extruders/Mark2_extruder1.def.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": "Mark2_extruder1",
3 | "version": 2,
4 | "name": "Extruder 1",
5 | "inherits": "fdmextruder",
6 | "metadata": {
7 | "machine": "Mark2_for_Ultimaker2",
8 | "position": "0"
9 | },
10 |
11 | "overrides": {
12 | "extruder_nr": {
13 | "default_value": 0,
14 | "maximum_value": "1"
15 | },
16 | "machine_nozzle_offset_x": { "default_value": 0.0 },
17 | "machine_nozzle_offset_y": { "default_value": 0.0 }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/cura-resources/extruders/Mark2_extruder2.def.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": "Mark2_extruder2",
3 | "version": 2,
4 | "name": "Extruder 2",
5 | "inherits": "fdmextruder",
6 | "metadata": {
7 | "machine": "Mark2_for_Ultimaker2",
8 | "position": "1"
9 | },
10 |
11 | "overrides": {
12 | "extruder_nr": {
13 | "default_value": 1,
14 | "maximum_value": "1"
15 | },
16 | "machine_nozzle_offset_x": { "default_value": 0.0 },
17 | "machine_nozzle_offset_y": { "default_value": 0.0 }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/cura-resources/images/Mark2_for_Ultimaker2_backplate.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/cura-resources/images/Mark2_for_Ultimaker2_backplate.png
--------------------------------------------------------------------------------
/cura-resources/images/foo:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/cura-resources/scripts/Mark2Tweaks.py:
--------------------------------------------------------------------------------
1 | ##
2 | ## Mark2Plugin - Mark2Tweaks: Cura PostProcessingPlugin script for the Mark 2.
3 | ## Copyright (C) 2016,2017 Krys Lawrence
4 | ##
5 | ## This program is free software: you can redistribute it and/or modify
6 | ## it under the terms of the GNU Affero General Public License as
7 | ## published by the Free Software Foundation, either version 3 of the
8 | ## License, or (at your option) any later version.
9 | ##
10 | ## This program is distributed in the hope that it will be useful,
11 | ## but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | ## GNU Affero General Public License for more details.
14 | ##
15 | ## You should have received a copy of the GNU Affero General Public License
16 | ## along with this program. If not, see .
17 | ##
18 |
19 | """Add-on script for nallath's PostProcessingPlugin to help the Mark 2.
20 |
21 | See https://github.com/nallath/PostProcessingPlugin for details about the
22 | plugin.
23 |
24 | Put this script in PostProcessingPlugin's scripts folder.
25 | """
26 |
27 |
28 | import re
29 | import traceback
30 | import contextlib
31 | from UM.Logger import Logger
32 | from ..Script import Script
33 |
34 |
35 | """Convenience alias for UM.Logger.Logger.log."""
36 | log = Logger.log
37 |
38 |
39 | @contextlib.contextmanager
40 | def exception_handler(layer_num, log_not_raise=False):
41 | """Either raise or just log the last exception."""
42 | try:
43 | yield
44 | except:
45 | if log_not_raise:
46 | layer_log(layer_num, 'e', ''.join(traceback.format_exc()))
47 | else:
48 | layer_log(layer_num, 'e', 'Exception! Traceback follows.')
49 | raise
50 |
51 |
52 | def layer_log(layer_num, message_type, message):
53 | """Log a message prefixed with the curent layer number."""
54 | log(message_type, 'Layer {:.0f}: {}'.format(layer_num, message))
55 |
56 |
57 | class Mark2Tweaks(Script):
58 | """Optimize the G-code output for the Mark 2."""
59 |
60 | def getSettingDataString(self):
61 | """Return script identification and GUI options."""
62 | # Note: The "version" key is not this script's version, but the API
63 | # version of the PostProcessingPlugin.
64 | return '''\
65 | {
66 | "name": "Mark 2 Tweaks",
67 | "key": "Mark2Tweaks",
68 | "metadata": {},
69 | "version": 2,
70 | "settings": {
71 | "remove_hack": {
72 | "label": "Clean Up Cura Workaround",
73 | "description":
74 | "The Mark 2 settings include a workaround to a Cura limitation. This tweak cleans up after it.",
75 | "type": "bool",
76 | "default_value": true
77 | },
78 | "remove_superfluous": {
79 | "label": "Remove Extra Movements",
80 | "description":
81 | "Remove superfluous movements after each tool change. This can improve print quality by preventing materials from incorrectly touching immediately after a tool change.",
82 | "type": "bool",
83 | "default_value": true
84 | },
85 | "ignore_errors": {
86 | "label": "Ignore Errors",
87 | "description":
88 | "If any errors occur while performing the tweaks, skip them keep going",
89 | "type": "bool",
90 | "default_value": true
91 | }
92 | }
93 | }'''
94 |
95 | def execute(self, data):
96 | """Process all G-code and apply selected tweaks."""
97 | log('d', '*** MARK 2 TWEAKS START ***')
98 | remove_hack = self.getSettingValueByKey('remove_hack')
99 | remove_superfluous = self.getSettingValueByKey('remove_superfluous')
100 | ignore_errors = self.getSettingValueByKey('ignore_errors')
101 | log('d', 'Remove Hack: {}'.format(remove_hack))
102 | log('d', 'Remove Superfluous: {}'.format(remove_superfluous))
103 | log('d', 'Ignore Errors: {}'.format(ignore_errors))
104 | for layer_idx, layer in enumerate(data):
105 | lines = layer.split('\n')
106 | layer_num = self.find_layer_num(lines)
107 | if layer_num is None:
108 | continue
109 | # Copy of lines so lines can be deleted or inserted in loop
110 | for line_idx, line in enumerate(lines[:]):
111 | if not line in ('T0', 'T1'):
112 | continue
113 | if remove_hack:
114 | with exception_handler(layer_num, ignore_errors):
115 | self.remove_hack(layer_num, lines, line_idx)
116 | if remove_superfluous:
117 | with exception_handler(layer_num, ignore_errors):
118 | self.remove_superfluous(layer_num, lines, line_idx)
119 | data[layer_idx] = '\n'.join(lines)
120 | log('d', '*** MARK 2 TWEAKS END ***')
121 | return data
122 |
123 | def find_layer_num(self, lines):
124 | """Return the current layer number as a float."""
125 | result = self.find_line(lines, ';LAYER:', whole=False)
126 | if result is not None:
127 | return self.getValue(result, ";LAYER:")
128 |
129 | def remove_hack(self, layer_num, lines, t_idx):
130 | """Remove TinkerGnome's Cura print area workaround line.
131 |
132 | If there is a G0 between T and G10/M104, remove it.
133 | There should only be one.
134 | TinkerGnome says adding it was a hack/workaround so we can kill it.
135 | """
136 | end_idx = self.find_g10_or_m104(layer_num, lines, t_idx)
137 | hack = self.find_line_and_index(lines, 'G0', ('X', 'Y', 'Z'), t_idx,
138 | end_idx)
139 | if hack is None:
140 | return
141 | hack_line, hack_idx = hack
142 | if (self.getValue(hack_line, 'Z') == 14
143 | and self.getValue(hack_line, 'Y') == 35):
144 | layer_log(layer_num, 'd', 'Striping Cura print area hack.')
145 | del lines[hack_idx]
146 |
147 | def remove_superfluous(self, layer_num, lines, t_idx):
148 | """Collapse any post tool change movents into a single movement.
149 |
150 | Any non-extrusion movements after tool change should be collapsed into
151 | a single line. Keep only the last G0/G1 but add the F and Z of the
152 | first G0/G1. But only collapse if there is more than one line.
153 | """
154 | start_idx = self.find_g10_or_m104(layer_num, lines, t_idx)
155 | end_idx = self.find_line_index(lines, ('G0', 'G1'), 'E', start_idx)
156 | assert end_idx is not None, \
157 | 'Cannot find extruding G0/G1 line after tool change.'
158 |
159 | first_g = self.find_line_and_index(lines, ('G0', 'G1'), None,
160 | start_idx, end_idx)
161 | assert first_g is not None, \
162 | 'Sanity Check: Could not find a G0/G1 line before extrusion and ' \
163 | 'after tool change.'
164 | first_g_line, first_g_idx = first_g
165 | assert first_g_idx < end_idx, \
166 | 'Sanity Check: First G0/G1 is >= to first extrusion.'
167 |
168 | f_value = self.getValue(first_g_line, 'F')
169 | z_value = self.getValue(first_g_line, 'Z')
170 | assert z_value is not None, \
171 | 'Sanity Check: Z value not found in first G0/G1 line.'
172 |
173 | self.delete_all_g0_or_g1_except_last(layer_num, lines, first_g_idx,
174 | 'Collapsing post tool change movements.')
175 | assert self.is_g0_or_g1(lines[first_g_idx]), \
176 | 'Sanity Check: Missing G0/G1 after collapse.'
177 | assert not self.is_g0_or_g1(lines[first_g_idx+1]), \
178 | 'Sanity Check: More than one G0/G1 after collapse.'
179 |
180 | self.add_f_and_z_values(layer_num, lines, first_g_idx, z_value,
181 | f_value)
182 | assert self.getValue(lines[first_g_idx], 'Z') is not None, \
183 | 'Sanity Check: Missing required Z value.'
184 |
185 | def find_g10_or_m104(self, layer_num, lines, t_idx):
186 | """Find the next G10 or M104 line.
187 |
188 | G10 is for UltiGCode-style G-code.
189 | M104 is for RepRap-style G-code.
190 | """
191 | idx = self.find_line_index(lines, 'G10', start=t_idx)
192 | if idx is None: # Assume RepRap style G-code
193 | idx = self.find_line_index(lines, 'M104', start=t_idx)
194 | assert idx is not None, \
195 | 'Cannot find G10/M104 after tool change.'
196 | assert t_idx < idx < t_idx + 10, \
197 | 'Sanity Check: G10/M104 too far from T'
198 | return idx
199 |
200 | def delete_all_g0_or_g1_except_last(self, layer_num, lines, first_g_idx,
201 | log_msg):
202 | """Delete all G0/G1 lines, except the last one.
203 |
204 | As long as there is more than one G line, delete the first.
205 | Subsequent G line indices move up by one == first_g_idx.
206 | This works only if lines are deleted and not just replaced.
207 | If only one G, never run. Last G is not deleted.
208 |
209 | Also log only once if one or more deletes occurs.
210 | """
211 | has_logged = False
212 | while self.is_g0_or_g1(lines[first_g_idx+1]):
213 | if not has_logged:
214 | # Never log on single line. Only log once if multiple lines.
215 | layer_log(layer_num, 'd', log_msg)
216 | has_logged = True
217 | del lines[first_g_idx]
218 |
219 | def is_g0_or_g1(self, line):
220 | """Return true is line is a G0 or G1 command."""
221 | return line.startswith('G0 ') or line.startswith('G1 ')
222 |
223 | def add_f_and_z_values(self, layer_num, lines, g_idx, z_value,
224 | f_value=None):
225 | """Add Z and F values to the indicated G0/G1 line.
226 |
227 | f_value is optional.
228 | Existing Z and F values will not be replaced.
229 | """
230 | line = lines[g_idx]
231 | fields = line.split(' ')
232 | if f_value is not None and self.getValue(line, 'F') is None:
233 | fields.insert(1, 'F{}'.format(f_value))
234 | if self.getValue(line, 'Z') is None:
235 | fields.append('Z{}'.format(z_value))
236 | lines[g_idx] = ' '.join(fields)
237 |
238 | def find_line(self, *args, **kwargs):
239 | """Return just the line from self.find_line_and_index()."""
240 | result = self.find_line_and_index(*args, **kwargs)
241 | if result is not None:
242 | return result[0]
243 |
244 | def find_line_index(self, *args, **kwargs):
245 | """Return just the index from self.find_line_and_index()."""
246 | result = self.find_line_and_index(*args, **kwargs)
247 | if result is not None:
248 | return result[1]
249 |
250 | def find_line_and_index(self, lines, commands, parameters=None, start=0,
251 | end=None, whole=True):
252 | """Find the first line in lines that matches the given criteria.
253 |
254 | lines: The iterable of strings to search
255 | commands: The command string (or iterable thereof) with which the
256 | line must start. If given an iterable (e.g. list), the
257 | line can match *any* given command.
258 | parameters: The parameter string (or iterable thereof) that the line
259 | must contain. Specifically, self.getValue() must return
260 | a value. If gien an iterable, the line must contain
261 | *all* of the given parameters. (Optional)
262 | start: The index after which to search lines. (Optional)
263 | end: The index before witch to seach lines. (Optional)
264 | whole: If true, only match on whole commands. If false, match
265 | any command prefix. E.g. with whole=True, G1 will match
266 | only G1 commands. With whole=False, G1 would match G1 and
267 | G10 commands, or even G1butterfly commands. :) E.g. To
268 | find all T commands, use commands='T' and whole=False.
269 |
270 | Returns: The matching line string and its index in lines as a tuple, or
271 | None if not match was found.
272 | """
273 | if isinstance(commands, str):
274 | commands = (commands,)
275 | if isinstance(parameters, str):
276 | parameters = (parameters,)
277 | if end is None:
278 | end = len(lines)
279 | for i, line in enumerate(lines[start:end], start):
280 | for command in commands:
281 | # Commands must be standalone, or there must be a space before
282 | # the first parameter. This distinguise between G1 and G10,
283 | # for example.
284 | if (line == command
285 | or line.startswith(command + (' ' if whole else ''))):
286 | if parameters is None:
287 | return line, i
288 | else:
289 | values = (self.getValue(line, p) for p in parameters)
290 | values = (v for v in values if v is not None)
291 | # Consume iterators/generators and force into sequences
292 | if len(tuple(values)) == len(tuple(parameters)):
293 | return line, i
294 |
295 | def getValue(self, line, key, default = None):
296 | """Replacement version of getValue that fixes a couple bugs.
297 |
298 | Specifically, it allows variable length keys and should support missing
299 | leading zeros on values < 1mm (e.g. X.45). CuraEngine likes to emit
300 | those sometimes now. :(
301 | """
302 | key_pos = line.find(key)
303 | if key_pos == -1 or (';' in line and key_pos > line.find(';')):
304 | return default
305 | sub_part = line[key_pos + len(key):]
306 | m = re.search('^[0-9]*\.?[0-9]*', sub_part)
307 | if m is None:
308 | return default
309 | try:
310 | return float(m.group(0))
311 | except:
312 | return default
--------------------------------------------------------------------------------
/cura-resources/variants/Mark2_for_Ultimaker2_0.25.inst.cfg:
--------------------------------------------------------------------------------
1 | [general]
2 | name = 0.25 mm
3 | version = 2
4 | definition = Mark2_for_Ultimaker2
5 |
6 | [metadata]
7 | author = Ultimaker
8 | type = variant
9 | setting_version = 1
10 |
11 | [values]
12 | machine_nozzle_size = 0.25
13 | machine_nozzle_tip_outer_diameter = 0.8
14 | coasting_volume = 0.1
15 | coasting_min_volume = 0.17
16 | speed_wall = =round(speed_print / 1.2, 1)
17 | speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5)
18 | speed_topbottom = =round(speed_print / 1.5, 1)
19 |
--------------------------------------------------------------------------------
/cura-resources/variants/Mark2_for_Ultimaker2_0.4.inst.cfg:
--------------------------------------------------------------------------------
1 | [general]
2 | name = 0.4 mm
3 | version = 2
4 | definition = Mark2_for_Ultimaker2
5 |
6 | [metadata]
7 | author = Ultimaker
8 | type = variant
9 | setting_version = 1
10 |
11 | [values]
12 | machine_nozzle_size = 0.4
13 | machine_nozzle_tip_outer_diameter = 1.05
14 | speed_wall = =round(speed_print / 1.25, 1)
15 | speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10)
16 | speed_topbottom = =round(speed_print / 2.25, 1)
17 |
--------------------------------------------------------------------------------
/cura-resources/variants/Mark2_for_Ultimaker2_0.6.inst.cfg:
--------------------------------------------------------------------------------
1 | [general]
2 | name = 0.6 mm
3 | version = 2
4 | definition = Mark2_for_Ultimaker2
5 |
6 | [metadata]
7 | author = Ultimaker
8 | type = variant
9 | setting_version = 1
10 |
11 | [values]
12 | machine_nozzle_size = 0.6
13 | machine_nozzle_tip_outer_diameter = 1.25
14 | coasting_volume = 1.36
15 | speed_wall = =round(speed_print * 4 / 3, 1)
16 | speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10)
17 | speed_topbottom = =round(speed_print / 2, 1)
18 |
--------------------------------------------------------------------------------
/cura-resources/variants/Mark2_for_Ultimaker2_0.8.inst.cfg:
--------------------------------------------------------------------------------
1 | [general]
2 | name = 0.8 mm
3 | version = 2
4 | definition = Mark2_for_Ultimaker2
5 |
6 | [metadata]
7 | author = Ultimaker
8 | type = variant
9 | setting_version = 1
10 |
11 | [values]
12 | machine_nozzle_size = 0.8
13 | machine_nozzle_tip_outer_diameter = 1.35
14 | coasting_volume = 3.22
15 | speed_wall = =round(speed_print * 4 / 3, 1)
16 | speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10)
17 | speed_topbottom = =round(speed_print / 2, 1)
18 |
--------------------------------------------------------------------------------
/part-files/README.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/part-files/adjustable-feeder-mount-with-motorhole.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/part-files/adjustable-feeder-mount-with-motorhole.stl
--------------------------------------------------------------------------------
/part-files/adjustable-feeder-mount.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/part-files/adjustable-feeder-mount.stl
--------------------------------------------------------------------------------
/part-files/adjustable-plate.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/part-files/adjustable-plate.stl
--------------------------------------------------------------------------------
/part-files/cable-clamp.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/part-files/cable-clamp.stl
--------------------------------------------------------------------------------
/part-files/clamping-dock.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/part-files/clamping-dock.stl
--------------------------------------------------------------------------------
/part-files/coupling.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/part-files/coupling.stl
--------------------------------------------------------------------------------
/part-files/expansion-pcb-cable-clamp.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/part-files/expansion-pcb-cable-clamp.stl
--------------------------------------------------------------------------------
/part-files/expansion-pcb-carrier.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/part-files/expansion-pcb-carrier.stl
--------------------------------------------------------------------------------
/part-files/expansion-pcb-cover.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/part-files/expansion-pcb-cover.stl
--------------------------------------------------------------------------------
/part-files/feeder-mount-roof.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/part-files/feeder-mount-roof.stl
--------------------------------------------------------------------------------
/part-files/feeder-mount.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/part-files/feeder-mount.stl
--------------------------------------------------------------------------------
/part-files/flex-wedge.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/part-files/flex-wedge.stl
--------------------------------------------------------------------------------
/part-files/head-a.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/part-files/head-a.stl
--------------------------------------------------------------------------------
/part-files/head-b.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/part-files/head-b.stl
--------------------------------------------------------------------------------
/part-files/head.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/part-files/head.stl
--------------------------------------------------------------------------------
/part-files/license.txt:
--------------------------------------------------------------------------------
1 | Mark2 part files
2 | https://github.com/foehnsturm/Mark2/part-files
3 | CC BY-NC-SA 3.0
4 |
5 | This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/.
6 |
7 | Markus Seidt, 2017
8 | seidt@foehnsturm.de
9 |
--------------------------------------------------------------------------------
/part-files/tesa-stick-dock-a.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/part-files/tesa-stick-dock-a.stl
--------------------------------------------------------------------------------
/part-files/tesa-stick-dock-b.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foehnsturm/Mark2/0d2028f1f7908d5537472bf77071d71157cda740/part-files/tesa-stick-dock-b.stl
--------------------------------------------------------------------------------