├── 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 --------------------------------------------------------------------------------