~ubuntu-branches/ubuntu/utopic/slic3r/utopic

« back to all changes in this revision

Viewing changes to xs/src/PrintConfig.hpp

  • Committer: Package Import Robot
  • Author(s): Chow Loong Jin
  • Date: 2014-06-17 01:27:26 UTC
  • Revision ID: package-import@ubuntu.com-20140617012726-2wrs4zdo251nr4vg
Tags: upstream-1.1.4+dfsg
ImportĀ upstreamĀ versionĀ 1.1.4+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#ifndef slic3r_PrintConfig_hpp_
 
2
#define slic3r_PrintConfig_hpp_
 
3
 
 
4
#include "Config.hpp"
 
5
 
 
6
namespace Slic3r {
 
7
 
 
8
enum GCodeFlavor {
 
9
    gcfRepRap, gcfTeacup, gcfMakerWare, gcfSailfish, gcfMach3, gcfNoExtrusion,
 
10
};
 
11
 
 
12
enum InfillPattern {
 
13
    ipRectilinear, ipLine, ipConcentric, ipHoneycomb,
 
14
    ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral,
 
15
};
 
16
 
 
17
enum SupportMaterialPattern {
 
18
    smpRectilinear, smpRectilinearGrid, smpHoneycomb, smpPillars,
 
19
};
 
20
 
 
21
enum SeamPosition {
 
22
    spRandom, spNearest, spAligned
 
23
};
 
24
 
 
25
template<> inline t_config_enum_values ConfigOptionEnum<GCodeFlavor>::get_enum_values() {
 
26
    t_config_enum_values keys_map;
 
27
    keys_map["reprap"]          = gcfRepRap;
 
28
    keys_map["teacup"]          = gcfTeacup;
 
29
    keys_map["makerware"]       = gcfMakerWare;
 
30
    keys_map["sailfish"]        = gcfSailfish;
 
31
    keys_map["mach3"]           = gcfMach3;
 
32
    keys_map["no-extrusion"]    = gcfNoExtrusion;
 
33
    return keys_map;
 
34
}
 
35
 
 
36
template<> inline t_config_enum_values ConfigOptionEnum<InfillPattern>::get_enum_values() {
 
37
    t_config_enum_values keys_map;
 
38
    keys_map["rectilinear"]         = ipRectilinear;
 
39
    keys_map["line"]                = ipLine;
 
40
    keys_map["concentric"]          = ipConcentric;
 
41
    keys_map["honeycomb"]           = ipHoneycomb;
 
42
    keys_map["hilbertcurve"]        = ipHilbertCurve;
 
43
    keys_map["archimedeanchords"]   = ipArchimedeanChords;
 
44
    keys_map["octagramspiral"]      = ipOctagramSpiral;
 
45
    return keys_map;
 
46
}
 
47
 
 
48
template<> inline t_config_enum_values ConfigOptionEnum<SupportMaterialPattern>::get_enum_values() {
 
49
    t_config_enum_values keys_map;
 
50
    keys_map["rectilinear"]         = smpRectilinear;
 
51
    keys_map["rectilinear-grid"]    = smpRectilinearGrid;
 
52
    keys_map["honeycomb"]           = smpHoneycomb;
 
53
    keys_map["pillars"]             = smpPillars;
 
54
    return keys_map;
 
55
}
 
56
 
 
57
template<> inline t_config_enum_values ConfigOptionEnum<SeamPosition>::get_enum_values() {
 
58
    t_config_enum_values keys_map;
 
59
    keys_map["random"]              = spRandom;
 
60
    keys_map["nearest"]             = spNearest;
 
61
    keys_map["aligned"]             = spAligned;
 
62
    return keys_map;
 
63
}
 
64
 
 
65
class PrintConfigDef
 
66
{
 
67
    public:
 
68
    static t_optiondef_map def;
 
69
    
 
70
    static t_optiondef_map build_def () {
 
71
        t_optiondef_map Options;
 
72
        
 
73
        Options["avoid_crossing_perimeters"].type = coBool;
 
74
        Options["avoid_crossing_perimeters"].label = "Avoid crossing perimeters";
 
75
        Options["avoid_crossing_perimeters"].tooltip = "Optimize travel moves in order to minimize the crossing of perimeters. This is mostly useful with Bowden extruders which suffer from oozing. This feature slows down both the print and the G-code generation.";
 
76
        Options["avoid_crossing_perimeters"].cli = "avoid-crossing-perimeters!";
 
77
 
 
78
        Options["bed_size"].type = coPoint;
 
79
        Options["bed_size"].label = "Bed size";
 
80
        Options["bed_size"].tooltip = "Size of your bed. This is used to adjust the preview in the plater and for auto-arranging parts in it.";
 
81
        Options["bed_size"].sidetext = "mm";
 
82
        Options["bed_size"].cli = "bed-size=s";
 
83
 
 
84
        Options["bed_temperature"].type = coInt;
 
85
        Options["bed_temperature"].label = "Other layers";
 
86
        Options["bed_temperature"].tooltip = "Bed temperature for layers after the first one. Set this to zero to disable bed temperature control commands in the output.";
 
87
        Options["bed_temperature"].sidetext = "Ā°C";
 
88
        Options["bed_temperature"].cli = "bed-temperature=i";
 
89
        Options["bed_temperature"].full_label = "Bed temperature";
 
90
        Options["bed_temperature"].min = 0;
 
91
        Options["bed_temperature"].max = 300;
 
92
 
 
93
        Options["bottom_solid_layers"].type = coInt;
 
94
        Options["bottom_solid_layers"].label = "Bottom";
 
95
        Options["bottom_solid_layers"].category = "Layers and Perimeters";
 
96
        Options["bottom_solid_layers"].tooltip = "Number of solid layers to generate on bottom surfaces.";
 
97
        Options["bottom_solid_layers"].cli = "bottom-solid-layers=i";
 
98
        Options["bottom_solid_layers"].full_label = "Bottom solid layers";
 
99
 
 
100
        Options["bridge_acceleration"].type = coFloat;
 
101
        Options["bridge_acceleration"].label = "Bridge";
 
102
        Options["bridge_acceleration"].tooltip = "This is the acceleration your printer will use for bridges. Set zero to disable acceleration control for bridges.";
 
103
        Options["bridge_acceleration"].sidetext = "mm/sĀ²";
 
104
        Options["bridge_acceleration"].cli = "bridge-acceleration=f";
 
105
 
 
106
        Options["bridge_fan_speed"].type = coInt;
 
107
        Options["bridge_fan_speed"].label = "Bridges fan speed";
 
108
        Options["bridge_fan_speed"].tooltip = "This fan speed is enforced during all bridges and overhangs.";
 
109
        Options["bridge_fan_speed"].sidetext = "%";
 
110
        Options["bridge_fan_speed"].cli = "bridge-fan-speed=i";
 
111
        Options["bridge_fan_speed"].max = 100;
 
112
 
 
113
        Options["bridge_flow_ratio"].type = coFloat;
 
114
        Options["bridge_flow_ratio"].label = "Bridge flow ratio";
 
115
        Options["bridge_flow_ratio"].tooltip = "This factor affects the amount of plastic for bridging. You can decrease it slightly to pull the extrudates and prevent sagging, although default settings are usually good and you should experiment with cooling (use a fan) before tweaking this.";
 
116
        Options["bridge_flow_ratio"].cli = "bridge-flow-ratio=f";
 
117
 
 
118
        Options["bridge_speed"].type = coFloat;
 
119
        Options["bridge_speed"].label = "Bridges";
 
120
        Options["bridge_speed"].category = "Speed";
 
121
        Options["bridge_speed"].tooltip = "Speed for printing bridges.";
 
122
        Options["bridge_speed"].sidetext = "mm/s";
 
123
        Options["bridge_speed"].cli = "bridge-speed=f";
 
124
        Options["bridge_speed"].aliases.push_back("bridge_feed_rate");
 
125
 
 
126
        Options["brim_width"].type = coFloat;
 
127
        Options["brim_width"].label = "Brim width";
 
128
        Options["brim_width"].tooltip = "Horizontal width of the brim that will be printed around each object on the first layer.";
 
129
        Options["brim_width"].sidetext = "mm";
 
130
        Options["brim_width"].cli = "brim-width=f";
 
131
 
 
132
        Options["complete_objects"].type = coBool;
 
133
        Options["complete_objects"].label = "Complete individual objects";
 
134
        Options["complete_objects"].tooltip = "When printing multiple objects or copies, this feature will complete each object before moving onto next one (and starting it from its bottom layer). This feature is useful to avoid the risk of ruined prints. Slic3r should warn and prevent you from extruder collisions, but beware.";
 
135
        Options["complete_objects"].cli = "complete-objects!";
 
136
 
 
137
        Options["cooling"].type = coBool;
 
138
        Options["cooling"].label = "Enable auto cooling";
 
139
        Options["cooling"].tooltip = "This flag enables the automatic cooling logic that adjusts print speed and fan speed according to layer printing time.";
 
140
        Options["cooling"].cli = "cooling!";
 
141
 
 
142
        Options["default_acceleration"].type = coFloat;
 
143
        Options["default_acceleration"].label = "Default";
 
144
        Options["default_acceleration"].tooltip = "This is the acceleration your printer will be reset to after the role-specific acceleration values are used (perimeter/infill). Set zero to prevent resetting acceleration at all.";
 
145
        Options["default_acceleration"].sidetext = "mm/sĀ²";
 
146
        Options["default_acceleration"].cli = "default-acceleration=f";
 
147
 
 
148
        Options["disable_fan_first_layers"].type = coInt;
 
149
        Options["disable_fan_first_layers"].label = "Disable fan for the first";
 
150
        Options["disable_fan_first_layers"].tooltip = "You can set this to a positive value to disable fan at all during the first layers, so that it does not make adhesion worse.";
 
151
        Options["disable_fan_first_layers"].sidetext = "layers";
 
152
        Options["disable_fan_first_layers"].cli = "disable-fan-first-layers=i";
 
153
        Options["disable_fan_first_layers"].max = 1000;
 
154
 
 
155
        Options["dont_support_bridges"].type = coBool;
 
156
        Options["dont_support_bridges"].label = "Don't support bridges";
 
157
        Options["dont_support_bridges"].tooltip = "Experimental option for preventing support material from being generated under bridged areas.";
 
158
        Options["dont_support_bridges"].cli = "dont-support-bridges!";
 
159
 
 
160
        Options["duplicate_distance"].type = coFloat;
 
161
        Options["duplicate_distance"].label = "Distance between copies";
 
162
        Options["duplicate_distance"].tooltip = "Distance used for the auto-arrange feature of the plater.";
 
163
        Options["duplicate_distance"].sidetext = "mm";
 
164
        Options["duplicate_distance"].cli = "duplicate-distance=f";
 
165
        Options["duplicate_distance"].aliases.push_back("multiply_distance");
 
166
 
 
167
        Options["end_gcode"].type = coString;
 
168
        Options["end_gcode"].label = "End G-code";
 
169
        Options["end_gcode"].tooltip = "This end procedure is inserted at the end of the output file. Note that you can use placeholder variables for all Slic3r settings.";
 
170
        Options["end_gcode"].cli = "end-gcode=s";
 
171
        Options["end_gcode"].multiline = true;
 
172
        Options["end_gcode"].full_width = true;
 
173
        Options["end_gcode"].height = 120;
 
174
 
 
175
        Options["external_perimeter_speed"].type = coFloatOrPercent;
 
176
        Options["external_perimeter_speed"].label = "External perimeters";
 
177
        Options["external_perimeter_speed"].category = "Speed";
 
178
        Options["external_perimeter_speed"].tooltip = "This separate setting will affect the speed of external perimeters (the visible ones). If expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above.";
 
179
        Options["external_perimeter_speed"].sidetext = "mm/s or %";
 
180
        Options["external_perimeter_speed"].cli = "external-perimeter-speed=s";
 
181
        Options["external_perimeter_speed"].ratio_over = "perimeter_speed";
 
182
 
 
183
        Options["external_perimeters_first"].type = coBool;
 
184
        Options["external_perimeters_first"].label = "External perimeters first";
 
185
        Options["external_perimeters_first"].tooltip = "Print contour perimeters from the outermost one to the innermost one instead of the default inverse order.";
 
186
        Options["external_perimeters_first"].cli = "external-perimeters-first!";
 
187
 
 
188
        Options["extra_perimeters"].type = coBool;
 
189
        Options["extra_perimeters"].label = "Extra perimeters if needed";
 
190
        Options["extra_perimeters"].category = "Layers and Perimeters";
 
191
        Options["extra_perimeters"].tooltip = "Add more perimeters when needed for avoiding gaps in sloping walls.";
 
192
        Options["extra_perimeters"].cli = "extra-perimeters!";
 
193
 
 
194
        Options["extruder"].type = coInt;
 
195
        Options["extruder"].label = "Default extruder";
 
196
        Options["extruder"].category = "Extruders";
 
197
        Options["extruder"].tooltip = "The extruder to use (unless more specific extruder settings are specified).";
 
198
        Options["extruder"].cli = "extruder=i";
 
199
        Options["extruder"].min = 1;
 
200
 
 
201
        Options["extruder_clearance_height"].type = coFloat;
 
202
        Options["extruder_clearance_height"].label = "Height";
 
203
        Options["extruder_clearance_height"].tooltip = "Set this to the vertical distance between your nozzle tip and (usually) the X carriage rods. In other words, this is the height of the clearance cylinder around your extruder, and it represents the maximum depth the extruder can peek before colliding with other printed objects.";
 
204
        Options["extruder_clearance_height"].sidetext = "mm";
 
205
        Options["extruder_clearance_height"].cli = "extruder-clearance-height=f";
 
206
 
 
207
        Options["extruder_clearance_radius"].type = coFloat;
 
208
        Options["extruder_clearance_radius"].label = "Radius";
 
209
        Options["extruder_clearance_radius"].tooltip = "Set this to the clearance radius around your extruder. If the extruder is not centered, choose the largest value for safety. This setting is used to check for collisions and to display the graphical preview in the plater.";
 
210
        Options["extruder_clearance_radius"].sidetext = "mm";
 
211
        Options["extruder_clearance_radius"].cli = "extruder-clearance-radius=f";
 
212
 
 
213
        Options["extruder_offset"].type = coPoints;
 
214
        Options["extruder_offset"].label = "Extruder offset";
 
215
        Options["extruder_offset"].tooltip = "If your firmware doesn't handle the extruder displacement you need the G-code to take it into account. This option lets you specify the displacement of each extruder with respect to the first one. It expects positive coordinates (they will be subtracted from the XY coordinate).";
 
216
        Options["extruder_offset"].sidetext = "mm";
 
217
        Options["extruder_offset"].cli = "extruder-offset=s@";
 
218
 
 
219
        Options["extrusion_axis"].type = coString;
 
220
        Options["extrusion_axis"].label = "Extrusion axis";
 
221
        Options["extrusion_axis"].tooltip = "Use this option to set the axis letter associated to your printer's extruder (usually E but some printers use A).";
 
222
        Options["extrusion_axis"].cli = "extrusion-axis=s";
 
223
 
 
224
        Options["extrusion_multiplier"].type = coFloats;
 
225
        Options["extrusion_multiplier"].label = "Extrusion multiplier";
 
226
        Options["extrusion_multiplier"].tooltip = "This factor changes the amount of flow proportionally. You may need to tweak this setting to get nice surface finish and correct single wall widths. Usual values are between 0.9 and 1.1. If you think you need to change this more, check filament diameter and your firmware E steps.";
 
227
        Options["extrusion_multiplier"].cli = "extrusion-multiplier=f@";
 
228
 
 
229
        Options["extrusion_width"].type = coFloatOrPercent;
 
230
        Options["extrusion_width"].label = "Default extrusion width";
 
231
        Options["extrusion_width"].category = "Extrusion Width";
 
232
        Options["extrusion_width"].tooltip = "Set this to a non-zero value to set a manual extrusion width. If left to zero, Slic3r calculates a width automatically. If expressed as percentage (for example: 230%) it will be computed over layer height.";
 
233
        Options["extrusion_width"].sidetext = "mm or % (leave 0 for auto)";
 
234
        Options["extrusion_width"].cli = "extrusion-width=s";
 
235
 
 
236
        Options["fan_always_on"].type = coBool;
 
237
        Options["fan_always_on"].label = "Keep fan always on";
 
238
        Options["fan_always_on"].tooltip = "If this is enabled, fan will never be disabled and will be kept running at least at its minimum speed. Useful for PLA, harmful for ABS.";
 
239
        Options["fan_always_on"].cli = "fan-always-on!";
 
240
 
 
241
        Options["fan_below_layer_time"].type = coInt;
 
242
        Options["fan_below_layer_time"].label = "Enable fan if layer print time is below";
 
243
        Options["fan_below_layer_time"].tooltip = "If layer print time is estimated below this number of seconds, fan will be enabled and its speed will be calculated by interpolating the minimum and maximum speeds.";
 
244
        Options["fan_below_layer_time"].sidetext = "approximate seconds";
 
245
        Options["fan_below_layer_time"].cli = "fan-below-layer-time=i";
 
246
        Options["fan_below_layer_time"].width = 60;
 
247
        Options["fan_below_layer_time"].min = 0;
 
248
        Options["fan_below_layer_time"].max = 1000;
 
249
 
 
250
        Options["filament_diameter"].type = coFloats;
 
251
        Options["filament_diameter"].label = "Diameter";
 
252
        Options["filament_diameter"].tooltip = "Enter your filament diameter here. Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average.";
 
253
        Options["filament_diameter"].sidetext = "mm";
 
254
        Options["filament_diameter"].cli = "filament-diameter=f@";
 
255
        Options["filament_diameter"].min = 0;
 
256
 
 
257
        Options["fill_angle"].type = coInt;
 
258
        Options["fill_angle"].label = "Fill angle";
 
259
        Options["fill_angle"].category = "Infill";
 
260
        Options["fill_angle"].tooltip = "Default base angle for infill orientation. Cross-hatching will be applied to this. Bridges will be infilled using the best direction Slic3r can detect, so this setting does not affect them.";
 
261
        Options["fill_angle"].sidetext = "Ā°";
 
262
        Options["fill_angle"].cli = "fill-angle=i";
 
263
        Options["fill_angle"].min = 0;
 
264
        Options["fill_angle"].max = 359;
 
265
 
 
266
        Options["fill_density"].type = coPercent;
 
267
        Options["fill_density"].label = "Fill density";
 
268
        Options["fill_density"].category = "Infill";
 
269
        Options["fill_density"].tooltip = "Density of internal infill, expressed in the range 0% - 100%.";
 
270
        Options["fill_density"].sidetext = "%";
 
271
        Options["fill_density"].cli = "fill-density=s";
 
272
        Options["fill_density"].min = 0;
 
273
        Options["fill_density"].max = 100;
 
274
        Options["fill_density"].enum_values.push_back("0");
 
275
        Options["fill_density"].enum_values.push_back("5");
 
276
        Options["fill_density"].enum_values.push_back("10");
 
277
        Options["fill_density"].enum_values.push_back("15");
 
278
        Options["fill_density"].enum_values.push_back("20");
 
279
        Options["fill_density"].enum_values.push_back("25");
 
280
        Options["fill_density"].enum_values.push_back("30");
 
281
        Options["fill_density"].enum_values.push_back("40");
 
282
        Options["fill_density"].enum_values.push_back("50");
 
283
        Options["fill_density"].enum_values.push_back("60");
 
284
        Options["fill_density"].enum_values.push_back("70");
 
285
        Options["fill_density"].enum_values.push_back("80");
 
286
        Options["fill_density"].enum_values.push_back("90");
 
287
        Options["fill_density"].enum_values.push_back("100");
 
288
        Options["fill_density"].enum_labels.push_back("0%");
 
289
        Options["fill_density"].enum_labels.push_back("5%");
 
290
        Options["fill_density"].enum_labels.push_back("10%");
 
291
        Options["fill_density"].enum_labels.push_back("15%");
 
292
        Options["fill_density"].enum_labels.push_back("20%");
 
293
        Options["fill_density"].enum_labels.push_back("25%");
 
294
        Options["fill_density"].enum_labels.push_back("30%");
 
295
        Options["fill_density"].enum_labels.push_back("40%");
 
296
        Options["fill_density"].enum_labels.push_back("50%");
 
297
        Options["fill_density"].enum_labels.push_back("60%");
 
298
        Options["fill_density"].enum_labels.push_back("70%");
 
299
        Options["fill_density"].enum_labels.push_back("80%");
 
300
        Options["fill_density"].enum_labels.push_back("90%");
 
301
        Options["fill_density"].enum_labels.push_back("100%");
 
302
 
 
303
        Options["fill_pattern"].type = coEnum;
 
304
        Options["fill_pattern"].label = "Fill pattern";
 
305
        Options["fill_pattern"].category = "Infill";
 
306
        Options["fill_pattern"].tooltip = "Fill pattern for general low-density infill.";
 
307
        Options["fill_pattern"].cli = "fill-pattern=s";
 
308
        Options["fill_pattern"].enum_keys_map = ConfigOptionEnum<InfillPattern>::get_enum_values();
 
309
        Options["fill_pattern"].enum_values.push_back("rectilinear");
 
310
        Options["fill_pattern"].enum_values.push_back("line");
 
311
        Options["fill_pattern"].enum_values.push_back("concentric");
 
312
        Options["fill_pattern"].enum_values.push_back("honeycomb");
 
313
        Options["fill_pattern"].enum_values.push_back("hilbertcurve");
 
314
        Options["fill_pattern"].enum_values.push_back("archimedeanchords");
 
315
        Options["fill_pattern"].enum_values.push_back("octagramspiral");
 
316
        Options["fill_pattern"].enum_labels.push_back("rectilinear");
 
317
        Options["fill_pattern"].enum_labels.push_back("line");
 
318
        Options["fill_pattern"].enum_labels.push_back("concentric");
 
319
        Options["fill_pattern"].enum_labels.push_back("honeycomb");
 
320
        Options["fill_pattern"].enum_labels.push_back("hilbertcurve (slow)");
 
321
        Options["fill_pattern"].enum_labels.push_back("archimedeanchords (slow)");
 
322
        Options["fill_pattern"].enum_labels.push_back("octagramspiral (slow)");
 
323
 
 
324
        Options["first_layer_acceleration"].type = coFloat;
 
325
        Options["first_layer_acceleration"].label = "First layer";
 
326
        Options["first_layer_acceleration"].tooltip = "This is the acceleration your printer will use for first layer. Set zero to disable acceleration control for first layer.";
 
327
        Options["first_layer_acceleration"].sidetext = "mm/sĀ²";
 
328
        Options["first_layer_acceleration"].cli = "first-layer-acceleration=f";
 
329
 
 
330
        Options["first_layer_bed_temperature"].type = coInt;
 
331
        Options["first_layer_bed_temperature"].label = "First layer";
 
332
        Options["first_layer_bed_temperature"].tooltip = "Heated build plate temperature for the first layer. Set this to zero to disable bed temperature control commands in the output.";
 
333
        Options["first_layer_bed_temperature"].sidetext = "Ā°C";
 
334
        Options["first_layer_bed_temperature"].cli = "first-layer-bed-temperature=i";
 
335
        Options["first_layer_bed_temperature"].max = 0;
 
336
        Options["first_layer_bed_temperature"].max = 300;
 
337
 
 
338
        Options["first_layer_extrusion_width"].type = coFloatOrPercent;
 
339
        Options["first_layer_extrusion_width"].label = "First layer";
 
340
        Options["first_layer_extrusion_width"].tooltip = "Set this to a non-zero value to set a manual extrusion width for first layer. You can use this to force fatter extrudates for better adhesion. If expressed as percentage (for example 120%) it will be computed over first layer height.";
 
341
        Options["first_layer_extrusion_width"].sidetext = "mm or % (leave 0 for default)";
 
342
        Options["first_layer_extrusion_width"].cli = "first-layer-extrusion-width=s";
 
343
        Options["first_layer_extrusion_width"].ratio_over = "first_layer_height";
 
344
 
 
345
        Options["first_layer_height"].type = coFloatOrPercent;
 
346
        Options["first_layer_height"].label = "First layer height";
 
347
        Options["first_layer_height"].category = "Layers and Perimeters";
 
348
        Options["first_layer_height"].tooltip = "When printing with very low layer heights, you might still want to print a thicker bottom layer to improve adhesion and tolerance for non perfect build plates. This can be expressed as an absolute value or as a percentage (for example: 150%) over the default layer height.";
 
349
        Options["first_layer_height"].sidetext = "mm or %";
 
350
        Options["first_layer_height"].cli = "first-layer-height=s";
 
351
        Options["first_layer_height"].ratio_over = "layer_height";
 
352
 
 
353
        Options["first_layer_speed"].type = coFloatOrPercent;
 
354
        Options["first_layer_speed"].label = "First layer speed";
 
355
        Options["first_layer_speed"].tooltip = "If expressed as absolute value in mm/s, this speed will be applied to all the print moves of the first layer, regardless of their type. If expressed as a percentage (for example: 40%) it will scale the default speeds.";
 
356
        Options["first_layer_speed"].sidetext = "mm/s or %";
 
357
        Options["first_layer_speed"].cli = "first-layer-speed=s";
 
358
 
 
359
        Options["first_layer_temperature"].type = coInts;
 
360
        Options["first_layer_temperature"].label = "First layer";
 
361
        Options["first_layer_temperature"].tooltip = "Extruder temperature for first layer. If you want to control temperature manually during print, set this to zero to disable temperature control commands in the output file.";
 
362
        Options["first_layer_temperature"].sidetext = "Ā°C";
 
363
        Options["first_layer_temperature"].cli = "first-layer-temperature=i@";
 
364
        Options["first_layer_temperature"].max = 0;
 
365
        Options["first_layer_temperature"].max = 400;
 
366
 
 
367
        Options["g0"].type = coBool;
 
368
        Options["g0"].label = "Use G0 for travel moves";
 
369
        Options["g0"].tooltip = "Only enable this if your firmware supports G0 properly (thus decouples all axes using their maximum speeds instead of synchronizing them). Travel moves and retractions will be combined in single commands, speeding them print up.";
 
370
        Options["g0"].cli = "g0!";
 
371
 
 
372
        Options["gap_fill_speed"].type = coFloat;
 
373
        Options["gap_fill_speed"].label = "Gap fill";
 
374
        Options["gap_fill_speed"].category = "Speed";
 
375
        Options["gap_fill_speed"].tooltip = "Speed for filling small gaps using short zigzag moves. Keep this reasonably low to avoid too much shaking and resonance issues. Set zero to disable gaps filling.";
 
376
        Options["gap_fill_speed"].sidetext = "mm/s";
 
377
        Options["gap_fill_speed"].cli = "gap-fill-speed=f";
 
378
 
 
379
        Options["gcode_arcs"].type = coBool;
 
380
        Options["gcode_arcs"].label = "Use native G-code arcs";
 
381
        Options["gcode_arcs"].tooltip = "This experimental feature tries to detect arcs from segments and generates G2/G3 arc commands instead of multiple straight G1 commands.";
 
382
        Options["gcode_arcs"].cli = "gcode-arcs!";
 
383
 
 
384
        Options["gcode_comments"].type = coBool;
 
385
        Options["gcode_comments"].label = "Verbose G-code";
 
386
        Options["gcode_comments"].tooltip = "Enable this to get a commented G-code file, with each line explained by a descriptive text. If you print from SD card, the additional weight of the file could make your firmware slow down.";
 
387
        Options["gcode_comments"].cli = "gcode-comments!";
 
388
 
 
389
        Options["gcode_flavor"].type = coEnum;
 
390
        Options["gcode_flavor"].label = "G-code flavor";
 
391
        Options["gcode_flavor"].tooltip = "Some G/M-code commands, including temperature control and others, are not universal. Set this option to your printer's firmware to get a compatible output. The \"No extrusion\" flavor prevents Slic3r from exporting any extrusion value at all.";
 
392
        Options["gcode_flavor"].cli = "gcode-flavor=s";
 
393
        Options["gcode_flavor"].enum_keys_map = ConfigOptionEnum<GCodeFlavor>::get_enum_values();
 
394
        Options["gcode_flavor"].enum_values.push_back("reprap");
 
395
        Options["gcode_flavor"].enum_values.push_back("teacup");
 
396
        Options["gcode_flavor"].enum_values.push_back("makerware");
 
397
        Options["gcode_flavor"].enum_values.push_back("sailfish");
 
398
        Options["gcode_flavor"].enum_values.push_back("mach3");
 
399
        Options["gcode_flavor"].enum_values.push_back("no-extrusion");
 
400
        Options["gcode_flavor"].enum_labels.push_back("RepRap (Marlin/Sprinter/Repetier)");
 
401
        Options["gcode_flavor"].enum_labels.push_back("Teacup");
 
402
        Options["gcode_flavor"].enum_labels.push_back("MakerWare (MakerBot)");
 
403
        Options["gcode_flavor"].enum_labels.push_back("Sailfish (MakerBot)");
 
404
        Options["gcode_flavor"].enum_labels.push_back("Mach3/LinuxCNC");
 
405
        Options["gcode_flavor"].enum_labels.push_back("No extrusion");
 
406
 
 
407
        Options["infill_acceleration"].type = coFloat;
 
408
        Options["infill_acceleration"].label = "Infill";
 
409
        Options["infill_acceleration"].tooltip = "This is the acceleration your printer will use for infill. Set zero to disable acceleration control for infill.";
 
410
        Options["infill_acceleration"].sidetext = "mm/sĀ²";
 
411
        Options["infill_acceleration"].cli = "infill-acceleration=f";
 
412
 
 
413
        Options["infill_every_layers"].type = coInt;
 
414
        Options["infill_every_layers"].label = "Combine infill every";
 
415
        Options["infill_every_layers"].category = "Infill";
 
416
        Options["infill_every_layers"].tooltip = "This feature allows to combine infill and speed up your print by extruding thicker infill layers while preserving thin perimeters, thus accuracy.";
 
417
        Options["infill_every_layers"].sidetext = "layers";
 
418
        Options["infill_every_layers"].cli = "infill-every-layers=i";
 
419
        Options["infill_every_layers"].full_label = "Combine infill every n layers";
 
420
        Options["infill_every_layers"].min = 1;
 
421
 
 
422
        Options["infill_extruder"].type = coInt;
 
423
        Options["infill_extruder"].label = "Infill extruder";
 
424
        Options["infill_extruder"].category = "Extruders";
 
425
        Options["infill_extruder"].tooltip = "The extruder to use when printing infill.";
 
426
        Options["infill_extruder"].cli = "infill-extruder=i";
 
427
        Options["infill_extruder"].min = 1;
 
428
 
 
429
        Options["infill_extrusion_width"].type = coFloatOrPercent;
 
430
        Options["infill_extrusion_width"].label = "Infill";
 
431
        Options["infill_extrusion_width"].category = "Extrusion Width";
 
432
        Options["infill_extrusion_width"].tooltip = "Set this to a non-zero value to set a manual extrusion width for infill. You may want to use fatter extrudates to speed up the infill and make your parts stronger. If expressed as percentage (for example 90%) it will be computed over layer height.";
 
433
        Options["infill_extrusion_width"].sidetext = "mm or % (leave 0 for default)";
 
434
        Options["infill_extrusion_width"].cli = "infill-extrusion-width=s";
 
435
 
 
436
        Options["infill_first"].type = coBool;
 
437
        Options["infill_first"].label = "Infill before perimeters";
 
438
        Options["infill_first"].tooltip = "This option will switch the print order of perimeters and infill, making the latter first.";
 
439
        Options["infill_first"].cli = "infill-first!";
 
440
 
 
441
        Options["infill_only_where_needed"].type = coBool;
 
442
        Options["infill_only_where_needed"].label = "Only infill where needed";
 
443
        Options["infill_only_where_needed"].category = "Infill";
 
444
        Options["infill_only_where_needed"].tooltip = "This option will limit infill to the areas actually needed for supporting ceilings (it will act as internal support material).";
 
445
        Options["infill_only_where_needed"].cli = "infill-only-where-needed!";
 
446
 
 
447
        Options["infill_speed"].type = coFloat;
 
448
        Options["infill_speed"].label = "Infill";
 
449
        Options["infill_speed"].category = "Speed";
 
450
        Options["infill_speed"].tooltip = "Speed for printing the internal fill.";
 
451
        Options["infill_speed"].sidetext = "mm/s";
 
452
        Options["infill_speed"].cli = "infill-speed=f";
 
453
        Options["infill_speed"].aliases.push_back("print_feed_rate");
 
454
        Options["infill_speed"].aliases.push_back("infill_feed_rate");
 
455
 
 
456
        Options["interface_shells"].type = coBool;
 
457
        Options["interface_shells"].label = "Interface shells";
 
458
        Options["interface_shells"].tooltip = "Force the generation of solid shells between adjacent materials/volumes. Useful for multi-extruder prints with translucent materials or manual soluble support material.";
 
459
        Options["interface_shells"].cli = "interface-shells!";
 
460
        Options["interface_shells"].category = "Layers and Perimeters";
 
461
 
 
462
        Options["layer_gcode"].type = coString;
 
463
        Options["layer_gcode"].label = "Layer change G-code";
 
464
        Options["layer_gcode"].tooltip = "This custom code is inserted at every layer change, right after the Z move and before the extruder moves to the first layer point. Note that you can use placeholder variables for all Slic3r settings.";
 
465
        Options["layer_gcode"].cli = "layer-gcode=s";
 
466
        Options["layer_gcode"].multiline = true;
 
467
        Options["layer_gcode"].full_width = true;
 
468
        Options["layer_gcode"].height = 50;
 
469
 
 
470
        Options["layer_height"].type = coFloat;
 
471
        Options["layer_height"].label = "Layer height";
 
472
        Options["layer_height"].category = "Layers and Perimeters";
 
473
        Options["layer_height"].tooltip = "This setting controls the height (and thus the total number) of the slices/layers. Thinner layers give better accuracy but take more time to print.";
 
474
        Options["layer_height"].sidetext = "mm";
 
475
        Options["layer_height"].cli = "layer-height=f";
 
476
 
 
477
        Options["max_fan_speed"].type = coInt;
 
478
        Options["max_fan_speed"].label = "Max";
 
479
        Options["max_fan_speed"].tooltip = "This setting represents the maximum speed of your fan.";
 
480
        Options["max_fan_speed"].sidetext = "%";
 
481
        Options["max_fan_speed"].cli = "max-fan-speed=i";
 
482
        Options["max_fan_speed"].max = 100;
 
483
 
 
484
        Options["min_fan_speed"].type = coInt;
 
485
        Options["min_fan_speed"].label = "Min";
 
486
        Options["min_fan_speed"].tooltip = "This setting represents the minimum PWM your fan needs to work.";
 
487
        Options["min_fan_speed"].sidetext = "%";
 
488
        Options["min_fan_speed"].cli = "min-fan-speed=i";
 
489
        Options["min_fan_speed"].max = 100;
 
490
 
 
491
        Options["min_print_speed"].type = coInt;
 
492
        Options["min_print_speed"].label = "Min print speed";
 
493
        Options["min_print_speed"].tooltip = "Slic3r will not scale speed down below this speed.";
 
494
        Options["min_print_speed"].sidetext = "mm/s";
 
495
        Options["min_print_speed"].cli = "min-print-speed=f";
 
496
        Options["min_print_speed"].max = 1000;
 
497
 
 
498
        Options["min_skirt_length"].type = coFloat;
 
499
        Options["min_skirt_length"].label = "Minimum extrusion length";
 
500
        Options["min_skirt_length"].tooltip = "Generate no less than the number of skirt loops required to consume the specified amount of filament on the bottom layer. For multi-extruder machines, this minimum applies to each extruder.";
 
501
        Options["min_skirt_length"].sidetext = "mm";
 
502
        Options["min_skirt_length"].cli = "min-skirt-length=f";
 
503
        Options["min_skirt_length"].min = 0;
 
504
 
 
505
        Options["notes"].type = coString;
 
506
        Options["notes"].label = "Configuration notes";
 
507
        Options["notes"].tooltip = "You can put here your personal notes. This text will be added to the G-code header comments.";
 
508
        Options["notes"].cli = "notes=s";
 
509
        Options["notes"].multiline = true;
 
510
        Options["notes"].full_width = true;
 
511
        Options["notes"].height = 130;
 
512
 
 
513
        Options["nozzle_diameter"].type = coFloats;
 
514
        Options["nozzle_diameter"].label = "Nozzle diameter";
 
515
        Options["nozzle_diameter"].tooltip = "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)";
 
516
        Options["nozzle_diameter"].sidetext = "mm";
 
517
        Options["nozzle_diameter"].cli = "nozzle-diameter=f@";
 
518
 
 
519
        Options["only_retract_when_crossing_perimeters"].type = coBool;
 
520
        Options["only_retract_when_crossing_perimeters"].label = "Only retract when crossing perimeters";
 
521
        Options["only_retract_when_crossing_perimeters"].tooltip = "Disables retraction when the travel path does not exceed the upper layer's perimeters (and thus any ooze will be probably invisible).";
 
522
        Options["only_retract_when_crossing_perimeters"].cli = "only-retract-when-crossing-perimeters!";
 
523
 
 
524
        Options["ooze_prevention"].type = coBool;
 
525
        Options["ooze_prevention"].label = "Enable";
 
526
        Options["ooze_prevention"].tooltip = "This option will drop the temperature of the inactive extruders to prevent oozing. It will enable a tall skirt automatically and move extruders outside such skirt when changing temperatures.";
 
527
        Options["ooze_prevention"].cli = "ooze-prevention!";
 
528
 
 
529
        Options["output_filename_format"].type = coString;
 
530
        Options["output_filename_format"].label = "Output filename format";
 
531
        Options["output_filename_format"].tooltip = "You can use all configuration options as variables inside this template. For example: [layer_height], [fill_density] etc. You can also use [timestamp], [year], [month], [day], [hour], [minute], [second], [version], [input_filename], [input_filename_base].";
 
532
        Options["output_filename_format"].cli = "output-filename-format=s";
 
533
        Options["output_filename_format"].full_width = true;
 
534
 
 
535
        Options["overhangs"].type = coBool;
 
536
        Options["overhangs"].label = "Detect bridging perimeters";
 
537
        Options["overhangs"].category = "Layers and Perimeters";
 
538
        Options["overhangs"].tooltip = "Experimental option to adjust flow for overhangs (bridge flow will be used), to apply bridge speed to them and enable fan.";
 
539
        Options["overhangs"].cli = "overhangs!";
 
540
 
 
541
        Options["perimeter_acceleration"].type = coFloat;
 
542
        Options["perimeter_acceleration"].label = "Perimeters";
 
543
        Options["perimeter_acceleration"].tooltip = "This is the acceleration your printer will use for perimeters. A high value like 9000 usually gives good results if your hardware is up to the job. Set zero to disable acceleration control for perimeters.";
 
544
        Options["perimeter_acceleration"].sidetext = "mm/sĀ²";
 
545
        Options["perimeter_acceleration"].cli = "perimeter-acceleration=f";
 
546
 
 
547
        Options["perimeter_extruder"].type = coInt;
 
548
        Options["perimeter_extruder"].label = "Perimeter extruder";
 
549
        Options["perimeter_extruder"].category = "Extruders";
 
550
        Options["perimeter_extruder"].tooltip = "The extruder to use when printing perimeters. First extruder is 1.";
 
551
        Options["perimeter_extruder"].cli = "perimeter-extruder=i";
 
552
        Options["perimeter_extruder"].aliases.push_back("perimeters_extruder");
 
553
        Options["perimeter_extruder"].min = 1;
 
554
 
 
555
        Options["perimeter_extrusion_width"].type = coFloatOrPercent;
 
556
        Options["perimeter_extrusion_width"].label = "Perimeters";
 
557
        Options["perimeter_extrusion_width"].category = "Extrusion Width";
 
558
        Options["perimeter_extrusion_width"].tooltip = "Set this to a non-zero value to set a manual extrusion width for perimeters. You may want to use thinner extrudates to get more accurate surfaces. If expressed as percentage (for example 90%) it will be computed over layer height.";
 
559
        Options["perimeter_extrusion_width"].sidetext = "mm or % (leave 0 for default)";
 
560
        Options["perimeter_extrusion_width"].cli = "perimeter-extrusion-width=s";
 
561
        Options["perimeter_extrusion_width"].aliases.push_back("perimeters_extrusion_width");
 
562
 
 
563
        Options["perimeter_speed"].type = coFloat;
 
564
        Options["perimeter_speed"].label = "Perimeters";
 
565
        Options["perimeter_speed"].category = "Speed";
 
566
        Options["perimeter_speed"].tooltip = "Speed for perimeters (contours, aka vertical shells).";
 
567
        Options["perimeter_speed"].sidetext = "mm/s";
 
568
        Options["perimeter_speed"].cli = "perimeter-speed=f";
 
569
        Options["perimeter_speed"].aliases.push_back("perimeter_feed_rate");
 
570
 
 
571
        Options["perimeters"].type = coInt;
 
572
        Options["perimeters"].label = "Perimeters (minimum)";
 
573
        Options["perimeters"].category = "Layers and Perimeters";
 
574
        Options["perimeters"].tooltip = "This option sets the number of perimeters to generate for each layer. Note that Slic3r may increase this number automatically when it detects sloping surfaces which benefit from a higher number of perimeters if the Extra Perimeters option is enabled.";
 
575
        Options["perimeters"].cli = "perimeters=i";
 
576
        Options["perimeters"].aliases.push_back("perimeter_offsets");
 
577
 
 
578
        Options["post_process"].type = coStrings;
 
579
        Options["post_process"].label = "Post-processing scripts";
 
580
        Options["post_process"].tooltip = "If you want to process the output G-code through custom scripts, just list their absolute paths here. Separate multiple scripts with a semicolon. Scripts will be passed the absolute path to the G-code file as the first argument, and they can access the Slic3r config settings by reading environment variables.";
 
581
        Options["post_process"].cli = "post-process=s@";
 
582
        Options["post_process"].multiline = true;
 
583
        Options["post_process"].full_width = true;
 
584
        Options["post_process"].height = 60;
 
585
 
 
586
        Options["print_center"].type = coPoint;
 
587
        Options["print_center"].label = "Print center";
 
588
        Options["print_center"].tooltip = "These G-code coordinates are used to center your plater viewport.";
 
589
        Options["print_center"].sidetext = "mm";
 
590
        Options["print_center"].cli = "print-center=s";
 
591
 
 
592
        Options["raft_layers"].type = coInt;
 
593
        Options["raft_layers"].label = "Raft layers";
 
594
        Options["raft_layers"].category = "Support material";
 
595
        Options["raft_layers"].tooltip = "The object will be raised by this number of layers, and support material will be generated under it.";
 
596
        Options["raft_layers"].sidetext = "layers";
 
597
        Options["raft_layers"].cli = "raft-layers=i";
 
598
 
 
599
        Options["resolution"].type = coFloat;
 
600
        Options["resolution"].label = "Resolution";
 
601
        Options["resolution"].tooltip = "Minimum detail resolution, used to simplify the input file for speeding up the slicing job and reducing memory usage. High-resolution models often carry more detail than printers can render. Set to zero to disable any simplification and use full resolution from input.";
 
602
        Options["resolution"].sidetext = "mm";
 
603
        Options["resolution"].cli = "resolution=f";
 
604
        Options["resolution"].min = 0;
 
605
 
 
606
        Options["retract_before_travel"].type = coFloats;
 
607
        Options["retract_before_travel"].label = "Minimum travel after retraction";
 
608
        Options["retract_before_travel"].tooltip = "Retraction is not triggered when travel moves are shorter than this length.";
 
609
        Options["retract_before_travel"].sidetext = "mm";
 
610
        Options["retract_before_travel"].cli = "retract-before-travel=f@";
 
611
 
 
612
        Options["retract_layer_change"].type = coBools;
 
613
        Options["retract_layer_change"].label = "Retract on layer change";
 
614
        Options["retract_layer_change"].tooltip = "This flag enforces a retraction whenever a Z move is done.";
 
615
        Options["retract_layer_change"].cli = "retract-layer-change!";
 
616
 
 
617
        Options["retract_length"].type = coFloats;
 
618
        Options["retract_length"].label = "Length";
 
619
        Options["retract_length"].tooltip = "When retraction is triggered, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder).";
 
620
        Options["retract_length"].sidetext = "mm (zero to disable)";
 
621
        Options["retract_length"].cli = "retract-length=f@";
 
622
 
 
623
        Options["retract_length_toolchange"].type = coFloats;
 
624
        Options["retract_length_toolchange"].label = "Length";
 
625
        Options["retract_length_toolchange"].tooltip = "When retraction is triggered before changing tool, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder).";
 
626
        Options["retract_length_toolchange"].sidetext = "mm (zero to disable)";
 
627
        Options["retract_length_toolchange"].cli = "retract-length-toolchange=f@";
 
628
 
 
629
        Options["retract_lift"].type = coFloats;
 
630
        Options["retract_lift"].label = "Lift Z";
 
631
        Options["retract_lift"].tooltip = "If you set this to a positive value, Z is quickly raised every time a retraction is triggered. When using multiple extruders, only the setting for the first extruder will be considered.";
 
632
        Options["retract_lift"].sidetext = "mm";
 
633
        Options["retract_lift"].cli = "retract-lift=f@";
 
634
 
 
635
        Options["retract_restart_extra"].type = coFloats;
 
636
        Options["retract_restart_extra"].label = "Extra length on restart";
 
637
        Options["retract_restart_extra"].tooltip = "When the retraction is compensated after the travel move, the extruder will push this additional amount of filament. This setting is rarely needed.";
 
638
        Options["retract_restart_extra"].sidetext = "mm";
 
639
        Options["retract_restart_extra"].cli = "retract-restart-extra=f@";
 
640
 
 
641
        Options["retract_restart_extra_toolchange"].type = coFloats;
 
642
        Options["retract_restart_extra_toolchange"].label = "Extra length on restart";
 
643
        Options["retract_restart_extra_toolchange"].tooltip = "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament.";
 
644
        Options["retract_restart_extra_toolchange"].sidetext = "mm";
 
645
        Options["retract_restart_extra_toolchange"].cli = "retract-restart-extra-toolchange=f@";
 
646
 
 
647
        Options["retract_speed"].type = coInts;
 
648
        Options["retract_speed"].label = "Speed";
 
649
        Options["retract_speed"].tooltip = "The speed for retractions (it only applies to the extruder motor).";
 
650
        Options["retract_speed"].sidetext = "mm/s";
 
651
        Options["retract_speed"].cli = "retract-speed=f@";
 
652
        Options["retract_speed"].max = 1000;
 
653
 
 
654
        Options["seam_position"].type = coEnum;
 
655
        Options["seam_position"].label = "Seam position";
 
656
        Options["seam_position"].category = "Layers and perimeters";
 
657
        Options["seam_position"].tooltip = "Position of perimeters starting points.";
 
658
        Options["seam_position"].cli = "seam-position=s";
 
659
        Options["seam_position"].enum_keys_map = ConfigOptionEnum<SeamPosition>::get_enum_values();
 
660
        Options["seam_position"].enum_values.push_back("random");
 
661
        Options["seam_position"].enum_values.push_back("nearest");
 
662
        Options["seam_position"].enum_values.push_back("aligned");
 
663
        Options["seam_position"].enum_labels.push_back("Random");
 
664
        Options["seam_position"].enum_labels.push_back("Nearest");
 
665
        Options["seam_position"].enum_labels.push_back("Aligned");
 
666
 
 
667
        Options["skirt_distance"].type = coFloat;
 
668
        Options["skirt_distance"].label = "Distance from object";
 
669
        Options["skirt_distance"].tooltip = "Distance between skirt and object(s). Set this to zero to attach the skirt to the object(s) and get a brim for better adhesion.";
 
670
        Options["skirt_distance"].sidetext = "mm";
 
671
        Options["skirt_distance"].cli = "skirt-distance=f";
 
672
 
 
673
        Options["skirt_height"].type = coInt;
 
674
        Options["skirt_height"].label = "Skirt height";
 
675
        Options["skirt_height"].tooltip = "Height of skirt expressed in layers. Set this to a tall value to use skirt as a shield against drafts.";
 
676
        Options["skirt_height"].sidetext = "layers";
 
677
        Options["skirt_height"].cli = "skirt-height=i";
 
678
 
 
679
        Options["skirts"].type = coInt;
 
680
        Options["skirts"].label = "Loops";
 
681
        Options["skirts"].tooltip = "Number of loops for this skirt, in other words its thickness. Set this to zero to disable skirt.";
 
682
        Options["skirts"].cli = "skirts=i";
 
683
 
 
684
        Options["slowdown_below_layer_time"].type = coInt;
 
685
        Options["slowdown_below_layer_time"].label = "Slow down if layer print time is below";
 
686
        Options["slowdown_below_layer_time"].tooltip = "If layer print time is estimated below this number of seconds, print moves speed will be scaled down to extend duration to this value.";
 
687
        Options["slowdown_below_layer_time"].sidetext = "approximate seconds";
 
688
        Options["slowdown_below_layer_time"].cli = "slowdown-below-layer-time=i";
 
689
        Options["slowdown_below_layer_time"].width = 60;
 
690
        Options["slowdown_below_layer_time"].max = 1000;
 
691
 
 
692
        Options["small_perimeter_speed"].type = coFloatOrPercent;
 
693
        Options["small_perimeter_speed"].label = "Small perimeters";
 
694
        Options["small_perimeter_speed"].category = "Speed";
 
695
        Options["small_perimeter_speed"].tooltip = "This separate setting will affect the speed of perimeters having radius <= 6.5mm (usually holes). If expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above.";
 
696
        Options["small_perimeter_speed"].sidetext = "mm/s or %";
 
697
        Options["small_perimeter_speed"].cli = "small-perimeter-speed=s";
 
698
        Options["small_perimeter_speed"].ratio_over = "perimeter_speed";
 
699
 
 
700
        Options["solid_fill_pattern"].type = coEnum;
 
701
        Options["solid_fill_pattern"].label = "Top/bottom fill pattern";
 
702
        Options["solid_fill_pattern"].category = "Infill";
 
703
        Options["solid_fill_pattern"].tooltip = "Fill pattern for top/bottom infill.";
 
704
        Options["solid_fill_pattern"].cli = "solid-fill-pattern=s";
 
705
        Options["solid_fill_pattern"].enum_keys_map = ConfigOptionEnum<InfillPattern>::get_enum_values();
 
706
        Options["solid_fill_pattern"].enum_values.push_back("rectilinear");
 
707
        Options["solid_fill_pattern"].enum_values.push_back("concentric");
 
708
        Options["solid_fill_pattern"].enum_values.push_back("hilbertcurve");
 
709
        Options["solid_fill_pattern"].enum_values.push_back("archimedeanchords");
 
710
        Options["solid_fill_pattern"].enum_values.push_back("octagramspiral");
 
711
        Options["solid_fill_pattern"].enum_labels.push_back("rectilinear");
 
712
        Options["solid_fill_pattern"].enum_labels.push_back("concentric");
 
713
        Options["solid_fill_pattern"].enum_labels.push_back("hilbertcurve (slow)");
 
714
        Options["solid_fill_pattern"].enum_labels.push_back("archimedeanchords (slow)");
 
715
        Options["solid_fill_pattern"].enum_labels.push_back("octagramspiral (slow)");
 
716
 
 
717
        Options["solid_infill_below_area"].type = coFloat;
 
718
        Options["solid_infill_below_area"].label = "Solid infill threshold area";
 
719
        Options["solid_infill_below_area"].category = "Infill";
 
720
        Options["solid_infill_below_area"].tooltip = "Force solid infill for regions having a smaller area than the specified threshold.";
 
721
        Options["solid_infill_below_area"].sidetext = "mmĀ²";
 
722
        Options["solid_infill_below_area"].cli = "solid-infill-below-area=f";
 
723
 
 
724
        Options["solid_infill_every_layers"].type = coInt;
 
725
        Options["solid_infill_every_layers"].label = "Solid infill every";
 
726
        Options["solid_infill_every_layers"].category = "Infill";
 
727
        Options["solid_infill_every_layers"].tooltip = "This feature allows to force a solid layer every given number of layers. Zero to disable. You can set this to any value (for example 9999); Slic3r will automatically choose the maximum possible number of layers to combine according to nozzle diameter and layer height.";
 
728
        Options["solid_infill_every_layers"].sidetext = "layers";
 
729
        Options["solid_infill_every_layers"].cli = "solid-infill-every-layers=i";
 
730
        Options["solid_infill_every_layers"].min = 0;
 
731
 
 
732
        Options["solid_infill_extrusion_width"].type = coFloatOrPercent;
 
733
        Options["solid_infill_extrusion_width"].label = "Solid infill";
 
734
        Options["solid_infill_extrusion_width"].category = "Extrusion Width";
 
735
        Options["solid_infill_extrusion_width"].tooltip = "Set this to a non-zero value to set a manual extrusion width for infill for solid surfaces. If expressed as percentage (for example 90%) it will be computed over layer height.";
 
736
        Options["solid_infill_extrusion_width"].sidetext = "mm or % (leave 0 for default)";
 
737
        Options["solid_infill_extrusion_width"].cli = "solid-infill-extrusion-width=s";
 
738
 
 
739
        Options["solid_infill_speed"].type = coFloatOrPercent;
 
740
        Options["solid_infill_speed"].label = "Solid infill";
 
741
        Options["solid_infill_speed"].category = "Speed";
 
742
        Options["solid_infill_speed"].tooltip = "Speed for printing solid regions (top/bottom/internal horizontal shells). This can be expressed as a percentage (for example: 80%) over the default infill speed above.";
 
743
        Options["solid_infill_speed"].sidetext = "mm/s or %";
 
744
        Options["solid_infill_speed"].cli = "solid-infill-speed=s";
 
745
        Options["solid_infill_speed"].ratio_over = "infill_speed";
 
746
        Options["solid_infill_speed"].aliases.push_back("solid_infill_feed_rate");
 
747
 
 
748
        Options["solid_layers"].type = coInt;
 
749
        Options["solid_layers"].label = "Solid layers";
 
750
        Options["solid_layers"].tooltip = "Number of solid layers to generate on top and bottom surfaces.";
 
751
        Options["solid_layers"].cli = "solid-layers=i";
 
752
        Options["solid_layers"].shortcut.push_back("top_solid_layers");
 
753
        Options["solid_layers"].shortcut.push_back("bottom_solid_layers");
 
754
 
 
755
        Options["spiral_vase"].type = coBool;
 
756
        Options["spiral_vase"].label = "Spiral vase";
 
757
        Options["spiral_vase"].tooltip = "This experimental feature will raise Z gradually while printing a single-walled object in order to remove any visible seam. By enabling this option other settings will be overridden to enforce a single perimeter, no infill, no top solid layers, no support material. You can still set any number of bottom solid layers as well as skirt/brim loops. It won't work when printing more than an object.";
 
758
        Options["spiral_vase"].cli = "spiral-vase!";
 
759
 
 
760
        Options["standby_temperature_delta"].type = coInt;
 
761
        Options["standby_temperature_delta"].label = "Temperature variation";
 
762
        Options["standby_temperature_delta"].tooltip = "Temperature difference to be applied when an extruder is not active.";
 
763
        Options["standby_temperature_delta"].sidetext = "āˆ†Ā°C";
 
764
        Options["standby_temperature_delta"].cli = "standby-temperature-delta=i";
 
765
        Options["standby_temperature_delta"].min = -400;
 
766
        Options["standby_temperature_delta"].max = 400;
 
767
 
 
768
        Options["start_gcode"].type = coString;
 
769
        Options["start_gcode"].label = "Start G-code";
 
770
        Options["start_gcode"].tooltip = "This start procedure is inserted at the beginning, after bed has reached the target temperature and extruder just started heating, and before extruder has finished heating. If Slic3r detects M104 or M190 in your custom codes, such commands will not be prepended automatically so you're free to customize the order of heating commands and other custom actions. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want.";
 
771
        Options["start_gcode"].cli = "start-gcode=s";
 
772
        Options["start_gcode"].multiline = true;
 
773
        Options["start_gcode"].full_width = true;
 
774
        Options["start_gcode"].height = 120;
 
775
 
 
776
        Options["support_material"].type = coBool;
 
777
        Options["support_material"].label = "Generate support material";
 
778
        Options["support_material"].category = "Support material";
 
779
        Options["support_material"].tooltip = "Enable support material generation.";
 
780
        Options["support_material"].cli = "support-material!";
 
781
 
 
782
        Options["support_material_angle"].type = coInt;
 
783
        Options["support_material_angle"].label = "Pattern angle";
 
784
        Options["support_material_angle"].category = "Support material";
 
785
        Options["support_material_angle"].tooltip = "Use this setting to rotate the support material pattern on the horizontal plane.";
 
786
        Options["support_material_angle"].sidetext = "Ā°";
 
787
        Options["support_material_angle"].cli = "support-material-angle=i";
 
788
 
 
789
        Options["support_material_enforce_layers"].type = coInt;
 
790
        Options["support_material_enforce_layers"].label = "Enforce support for the first";
 
791
        Options["support_material_enforce_layers"].category = "Support material";
 
792
        Options["support_material_enforce_layers"].tooltip = "Generate support material for the specified number of layers counting from bottom, regardless of whether normal support material is enabled or not and regardless of any angle threshold. This is useful for getting more adhesion of objects having a very thin or poor footprint on the build plate.";
 
793
        Options["support_material_enforce_layers"].sidetext = "layers";
 
794
        Options["support_material_enforce_layers"].cli = "support-material-enforce-layers=f";
 
795
        Options["support_material_enforce_layers"].full_label = "Enforce support for the first n layers";
 
796
 
 
797
        Options["support_material_extruder"].type = coInt;
 
798
        Options["support_material_extruder"].label = "Support material extruder";
 
799
        Options["support_material_extruder"].category = "Extruders";
 
800
        Options["support_material_extruder"].tooltip = "The extruder to use when printing support material. This affects brim and raft too.";
 
801
        Options["support_material_extruder"].cli = "support-material-extruder=i";
 
802
        Options["support_material_extruder"].min = 1;
 
803
 
 
804
        Options["support_material_extrusion_width"].type = coFloatOrPercent;
 
805
        Options["support_material_extrusion_width"].label = "Support material";
 
806
        Options["support_material_extrusion_width"].category = "Extrusion Width";
 
807
        Options["support_material_extrusion_width"].tooltip = "Set this to a non-zero value to set a manual extrusion width for support material. If expressed as percentage (for example 90%) it will be computed over layer height.";
 
808
        Options["support_material_extrusion_width"].sidetext = "mm or % (leave 0 for default)";
 
809
        Options["support_material_extrusion_width"].cli = "support-material-extrusion-width=s";
 
810
 
 
811
        Options["support_material_interface_extruder"].type = coInt;
 
812
        Options["support_material_interface_extruder"].label = "Support material interface extruder";
 
813
        Options["support_material_interface_extruder"].category = "Extruders";
 
814
        Options["support_material_interface_extruder"].tooltip = "The extruder to use when printing support material interface. This affects raft too.";
 
815
        Options["support_material_interface_extruder"].cli = "support-material-interface-extruder=i";
 
816
        Options["support_material_interface_extruder"].min = 1;
 
817
 
 
818
        Options["support_material_interface_layers"].type = coInt;
 
819
        Options["support_material_interface_layers"].label = "Interface layers";
 
820
        Options["support_material_interface_layers"].category = "Support material";
 
821
        Options["support_material_interface_layers"].tooltip = "Number of interface layers to insert between the object(s) and support material.";
 
822
        Options["support_material_interface_layers"].sidetext = "layers";
 
823
        Options["support_material_interface_layers"].cli = "support-material-interface-layers=i";
 
824
 
 
825
        Options["support_material_interface_spacing"].type = coFloat;
 
826
        Options["support_material_interface_spacing"].label = "Interface pattern spacing";
 
827
        Options["support_material_interface_spacing"].category = "Support material";
 
828
        Options["support_material_interface_spacing"].tooltip = "Spacing between interface lines. Set zero to get a solid interface.";
 
829
        Options["support_material_interface_spacing"].sidetext = "mm";
 
830
        Options["support_material_interface_spacing"].cli = "support-material-interface-spacing=f";
 
831
 
 
832
        Options["support_material_interface_speed"].type = coFloatOrPercent;
 
833
        Options["support_material_interface_speed"].label = "Support material interface";
 
834
        Options["support_material_interface_speed"].category = "Support material";
 
835
        Options["support_material_interface_speed"].tooltip = "Speed for printing support material interface layers. If expressed as percentage (for example 50%) it will be calculated over support material speed.";
 
836
        Options["support_material_interface_speed"].sidetext = "mm/s or %";
 
837
        Options["support_material_interface_speed"].cli = "support-material-interface-speed=s";
 
838
        Options["support_material_interface_speed"].ratio_over = "support_material_speed";
 
839
 
 
840
        Options["support_material_pattern"].type = coEnum;
 
841
        Options["support_material_pattern"].label = "Pattern";
 
842
        Options["support_material_pattern"].category = "Support material";
 
843
        Options["support_material_pattern"].tooltip = "Pattern used to generate support material.";
 
844
        Options["support_material_pattern"].cli = "support-material-pattern=s";
 
845
        Options["support_material_pattern"].enum_keys_map = ConfigOptionEnum<SupportMaterialPattern>::get_enum_values();
 
846
        Options["support_material_pattern"].enum_values.push_back("rectilinear");
 
847
        Options["support_material_pattern"].enum_values.push_back("rectilinear-grid");
 
848
        Options["support_material_pattern"].enum_values.push_back("honeycomb");
 
849
        Options["support_material_pattern"].enum_values.push_back("pillars");
 
850
        Options["support_material_pattern"].enum_labels.push_back("rectilinear");
 
851
        Options["support_material_pattern"].enum_labels.push_back("rectilinear grid");
 
852
        Options["support_material_pattern"].enum_labels.push_back("honeycomb");
 
853
        Options["support_material_pattern"].enum_labels.push_back("pillars");
 
854
 
 
855
        Options["support_material_spacing"].type = coFloat;
 
856
        Options["support_material_spacing"].label = "Pattern spacing";
 
857
        Options["support_material_spacing"].category = "Support material";
 
858
        Options["support_material_spacing"].tooltip = "Spacing between support material lines.";
 
859
        Options["support_material_spacing"].sidetext = "mm";
 
860
        Options["support_material_spacing"].cli = "support-material-spacing=f";
 
861
 
 
862
        Options["support_material_speed"].type = coFloat;
 
863
        Options["support_material_speed"].label = "Support material";
 
864
        Options["support_material_speed"].category = "Support material";
 
865
        Options["support_material_speed"].tooltip = "Speed for printing support material.";
 
866
        Options["support_material_speed"].sidetext = "mm/s";
 
867
        Options["support_material_speed"].cli = "support-material-speed=f";
 
868
 
 
869
        Options["support_material_threshold"].type = coInt;
 
870
        Options["support_material_threshold"].label = "Overhang threshold";
 
871
        Options["support_material_threshold"].category = "Support material";
 
872
        Options["support_material_threshold"].tooltip = "Support material will not be generated for overhangs whose slope angle (90Ā° = vertical) is above the given threshold. In other words, this value represent the most horizontal slope (measured from the horizontal plane) that you can print without support material. Set to zero for automatic detection (recommended).";
 
873
        Options["support_material_threshold"].sidetext = "Ā°";
 
874
        Options["support_material_threshold"].cli = "support-material-threshold=i";
 
875
 
 
876
        Options["temperature"].type = coInts;
 
877
        Options["temperature"].label = "Other layers";
 
878
        Options["temperature"].tooltip = "Extruder temperature for layers after the first one. Set this to zero to disable temperature control commands in the output.";
 
879
        Options["temperature"].sidetext = "Ā°C";
 
880
        Options["temperature"].cli = "temperature=i@";
 
881
        Options["temperature"].full_label = "Temperature";
 
882
        Options["temperature"].max = 0;
 
883
        Options["temperature"].max = 400;
 
884
 
 
885
        Options["thin_walls"].type = coBool;
 
886
        Options["thin_walls"].label = "Detect thin walls";
 
887
        Options["thin_walls"].category = "Layers and Perimeters";
 
888
        Options["thin_walls"].tooltip = "Detect single-width walls (parts where two extrusions don't fit and we need to collapse them into a single trace).";
 
889
        Options["thin_walls"].cli = "thin-walls!";
 
890
 
 
891
        Options["threads"].type = coInt;
 
892
        Options["threads"].label = "Threads";
 
893
        Options["threads"].tooltip = "Threads are used to parallelize long-running tasks. Optimal threads number is slightly above the number of available cores/processors. Beware that more threads consume more memory.";
 
894
        Options["threads"].sidetext = "(more speed but more memory usage)";
 
895
        Options["threads"].cli = "threads|j=i";
 
896
        Options["threads"].readonly = true;
 
897
        Options["threads"].min = 1;
 
898
        Options["threads"].max = 16;
 
899
 
 
900
        Options["toolchange_gcode"].type = coString;
 
901
        Options["toolchange_gcode"].label = "Tool change G-code";
 
902
        Options["toolchange_gcode"].tooltip = "This custom code is inserted at every extruder change. Note that you can use placeholder variables for all Slic3r settings as well as [previous_extruder] and [next_extruder].";
 
903
        Options["toolchange_gcode"].cli = "toolchange-gcode=s";
 
904
        Options["toolchange_gcode"].multiline = true;
 
905
        Options["toolchange_gcode"].full_width = true;
 
906
        Options["toolchange_gcode"].height = 50;
 
907
 
 
908
        Options["top_infill_extrusion_width"].type = coFloatOrPercent;
 
909
        Options["top_infill_extrusion_width"].label = "Top solid infill";
 
910
        Options["top_infill_extrusion_width"].category = "Extrusion Width";
 
911
        Options["top_infill_extrusion_width"].tooltip = "Set this to a non-zero value to set a manual extrusion width for infill for top surfaces. You may want to use thinner extrudates to fill all narrow regions and get a smoother finish. If expressed as percentage (for example 90%) it will be computed over layer height.";
 
912
        Options["top_infill_extrusion_width"].sidetext = "mm or % (leave 0 for default)";
 
913
        Options["top_infill_extrusion_width"].cli = "top-infill-extrusion-width=s";
 
914
 
 
915
        Options["top_solid_infill_speed"].type = coFloatOrPercent;
 
916
        Options["top_solid_infill_speed"].label = "Top solid infill";
 
917
        Options["top_solid_infill_speed"].category = "Speed";
 
918
        Options["top_solid_infill_speed"].tooltip = "Speed for printing top solid layers (it only applies to the uppermost external layers and not to their internal solid layers). You may want to slow down this to get a nicer surface finish. This can be expressed as a percentage (for example: 80%) over the solid infill speed above.";
 
919
        Options["top_solid_infill_speed"].sidetext = "mm/s or %";
 
920
        Options["top_solid_infill_speed"].cli = "top-solid-infill-speed=s";
 
921
        Options["top_solid_infill_speed"].ratio_over = "solid_infill_speed";
 
922
 
 
923
        Options["top_solid_layers"].type = coInt;
 
924
        Options["top_solid_layers"].label = "Top";
 
925
        Options["top_solid_layers"].category = "Layers and Perimeters";
 
926
        Options["top_solid_layers"].tooltip = "Number of solid layers to generate on top surfaces.";
 
927
        Options["top_solid_layers"].cli = "top-solid-layers=i";
 
928
        Options["top_solid_layers"].full_label = "Top solid layers";
 
929
 
 
930
        Options["travel_speed"].type = coFloat;
 
931
        Options["travel_speed"].label = "Travel";
 
932
        Options["travel_speed"].tooltip = "Speed for travel moves (jumps between distant extrusion points).";
 
933
        Options["travel_speed"].sidetext = "mm/s";
 
934
        Options["travel_speed"].cli = "travel-speed=f";
 
935
        Options["travel_speed"].aliases.push_back("travel_feed_rate");
 
936
 
 
937
        Options["use_firmware_retraction"].type = coBool;
 
938
        Options["use_firmware_retraction"].label = "Use firmware retraction";
 
939
        Options["use_firmware_retraction"].tooltip = "This experimental setting uses G10 and G11 commands to have the firmware handle the retraction. This is only supported in recent Marlin.";
 
940
        Options["use_firmware_retraction"].cli = "use-firmware-retraction!";
 
941
 
 
942
        Options["use_relative_e_distances"].type = coBool;
 
943
        Options["use_relative_e_distances"].label = "Use relative E distances";
 
944
        Options["use_relative_e_distances"].tooltip = "If your firmware requires relative E values, check this, otherwise leave it unchecked. Most firmwares use absolute values.";
 
945
        Options["use_relative_e_distances"].cli = "use-relative-e-distances!";
 
946
 
 
947
        Options["vibration_limit"].type = coFloat;
 
948
        Options["vibration_limit"].label = "Vibration limit";
 
949
        Options["vibration_limit"].tooltip = "This experimental option will slow down those moves hitting the configured frequency limit. The purpose of limiting vibrations is to avoid mechanical resonance. Set zero to disable.";
 
950
        Options["vibration_limit"].sidetext = "Hz";
 
951
        Options["vibration_limit"].cli = "vibration-limit=f";
 
952
 
 
953
        Options["wipe"].type = coBools;
 
954
        Options["wipe"].label = "Wipe while retracting";
 
955
        Options["wipe"].tooltip = "This flag will move the nozzle while retracting to minimize the possible blob on leaky extruders.";
 
956
        Options["wipe"].cli = "wipe!";
 
957
 
 
958
        Options["z_offset"].type = coFloat;
 
959
        Options["z_offset"].label = "Z offset";
 
960
        Options["z_offset"].tooltip = "This value will be added (or subtracted) from all the Z coordinates in the output G-code. It is used to compensate for bad Z endstop position: for example, if your endstop zero actually leaves the nozzle 0.3mm far from the print bed, set this to -0.3 (or fix your endstop).";
 
961
        Options["z_offset"].sidetext = "mm";
 
962
        Options["z_offset"].cli = "z-offset=f";
 
963
        
 
964
        return Options;
 
965
    };
 
966
};
 
967
 
 
968
class DynamicPrintConfig : public DynamicConfig
 
969
{
 
970
    public:
 
971
    DynamicPrintConfig() {
 
972
        this->def = &PrintConfigDef::def;
 
973
    };
 
974
    
 
975
    void normalize() {
 
976
        if (this->has("extruder")) {
 
977
            int extruder = this->option("extruder")->getInt();
 
978
            this->erase("extruder");
 
979
            if (!this->has("infill_extruder"))
 
980
                this->option("infill_extruder", true)->setInt(extruder);
 
981
            if (!this->has("perimeter_extruder"))
 
982
                this->option("perimeter_extruder", true)->setInt(extruder);
 
983
            if (!this->has("support_material_extruder"))
 
984
                this->option("support_material_extruder", true)->setInt(extruder);
 
985
            if (!this->has("support_material_interface_extruder"))
 
986
                this->option("support_material_interface_extruder", true)->setInt(extruder);
 
987
        }
 
988
        if (this->has("spiral_vase") && this->opt<ConfigOptionBool>("spiral_vase", true)->value) {
 
989
            {
 
990
                // this should be actually done only on the spiral layers instead of all
 
991
                ConfigOptionBools* opt = this->opt<ConfigOptionBools>("retract_layer_change", true);
 
992
                opt->values.assign(opt->values.size(), false);  // set all values to false
 
993
            }
 
994
        }
 
995
    };
 
996
};
 
997
 
 
998
class StaticPrintConfig : public virtual StaticConfig
 
999
{
 
1000
    public:
 
1001
    StaticPrintConfig() {
 
1002
        this->def = &PrintConfigDef::def;
 
1003
    };
 
1004
};
 
1005
 
 
1006
class PrintObjectConfig : public virtual StaticPrintConfig
 
1007
{
 
1008
    public:
 
1009
    ConfigOptionBool                dont_support_bridges;
 
1010
    ConfigOptionFloatOrPercent      extrusion_width;
 
1011
    ConfigOptionFloatOrPercent      first_layer_height;
 
1012
    ConfigOptionBool                infill_only_where_needed;
 
1013
    ConfigOptionBool                interface_shells;
 
1014
    ConfigOptionFloat               layer_height;
 
1015
    ConfigOptionInt                 raft_layers;
 
1016
    ConfigOptionEnum<SeamPosition>  seam_position;
 
1017
    ConfigOptionBool                support_material;
 
1018
    ConfigOptionInt                 support_material_angle;
 
1019
    ConfigOptionInt                 support_material_enforce_layers;
 
1020
    ConfigOptionInt                 support_material_extruder;
 
1021
    ConfigOptionFloatOrPercent      support_material_extrusion_width;
 
1022
    ConfigOptionInt                 support_material_interface_extruder;
 
1023
    ConfigOptionInt                 support_material_interface_layers;
 
1024
    ConfigOptionFloat               support_material_interface_spacing;
 
1025
    ConfigOptionFloatOrPercent      support_material_interface_speed;
 
1026
    ConfigOptionEnum<SupportMaterialPattern> support_material_pattern;
 
1027
    ConfigOptionFloat               support_material_spacing;
 
1028
    ConfigOptionFloat               support_material_speed;
 
1029
    ConfigOptionInt                 support_material_threshold;
 
1030
    
 
1031
    PrintObjectConfig() : StaticPrintConfig() {
 
1032
        this->dont_support_bridges.value                         = true;
 
1033
        this->extrusion_width.value                              = 0;
 
1034
        this->extrusion_width.percent                            = false;
 
1035
        this->first_layer_height.value                           = 0.35;
 
1036
        this->first_layer_height.percent                         = false;
 
1037
        this->infill_only_where_needed.value                     = false;
 
1038
        this->interface_shells.value                             = false;
 
1039
        this->layer_height.value                                 = 0.4;
 
1040
        this->raft_layers.value                                  = 0;
 
1041
        this->seam_position.value                                = spAligned;
 
1042
        this->support_material.value                             = false;
 
1043
        this->support_material_angle.value                       = 0;
 
1044
        this->support_material_enforce_layers.value              = 0;
 
1045
        this->support_material_extruder.value                    = 1;
 
1046
        this->support_material_extrusion_width.value             = 0;
 
1047
        this->support_material_extrusion_width.percent           = false;
 
1048
        this->support_material_interface_extruder.value          = 1;
 
1049
        this->support_material_interface_layers.value            = 3;
 
1050
        this->support_material_interface_spacing.value           = 0;
 
1051
        this->support_material_interface_speed.value             = 100;
 
1052
        this->support_material_interface_speed.percent           = true;
 
1053
        this->support_material_pattern.value                     = smpPillars;
 
1054
        this->support_material_spacing.value                     = 2.5;
 
1055
        this->support_material_speed.value                       = 60;
 
1056
        this->support_material_threshold.value                   = 0;
 
1057
    };
 
1058
    
 
1059
    ConfigOption* option(const t_config_option_key opt_key, bool create = false) {
 
1060
        if (opt_key == "dont_support_bridges")                       return &this->dont_support_bridges;
 
1061
        if (opt_key == "extrusion_width")                            return &this->extrusion_width;
 
1062
        if (opt_key == "first_layer_height")                         return &this->first_layer_height;
 
1063
        if (opt_key == "infill_only_where_needed")                   return &this->infill_only_where_needed;
 
1064
        if (opt_key == "interface_shells")                           return &this->interface_shells;
 
1065
        if (opt_key == "layer_height")                               return &this->layer_height;
 
1066
        if (opt_key == "raft_layers")                                return &this->raft_layers;
 
1067
        if (opt_key == "seam_position")                              return &this->seam_position;
 
1068
        if (opt_key == "support_material")                           return &this->support_material;
 
1069
        if (opt_key == "support_material_angle")                     return &this->support_material_angle;
 
1070
        if (opt_key == "support_material_enforce_layers")            return &this->support_material_enforce_layers;
 
1071
        if (opt_key == "support_material_extruder")                  return &this->support_material_extruder;
 
1072
        if (opt_key == "support_material_extrusion_width")           return &this->support_material_extrusion_width;
 
1073
        if (opt_key == "support_material_interface_extruder")        return &this->support_material_interface_extruder;
 
1074
        if (opt_key == "support_material_interface_layers")          return &this->support_material_interface_layers;
 
1075
        if (opt_key == "support_material_interface_spacing")         return &this->support_material_interface_spacing;
 
1076
        if (opt_key == "support_material_interface_speed")           return &this->support_material_interface_speed;
 
1077
        if (opt_key == "support_material_pattern")                   return &this->support_material_pattern;
 
1078
        if (opt_key == "support_material_spacing")                   return &this->support_material_spacing;
 
1079
        if (opt_key == "support_material_speed")                     return &this->support_material_speed;
 
1080
        if (opt_key == "support_material_threshold")                 return &this->support_material_threshold;
 
1081
        
 
1082
        return NULL;
 
1083
    };
 
1084
};
 
1085
 
 
1086
class PrintRegionConfig : public virtual StaticPrintConfig
 
1087
{
 
1088
    public:
 
1089
    ConfigOptionInt                 bottom_solid_layers;
 
1090
    ConfigOptionFloat               bridge_speed;
 
1091
    ConfigOptionFloatOrPercent      external_perimeter_speed;
 
1092
    ConfigOptionBool                extra_perimeters;
 
1093
    ConfigOptionInt                 fill_angle;
 
1094
    ConfigOptionPercent             fill_density;
 
1095
    ConfigOptionEnum<InfillPattern> fill_pattern;
 
1096
    ConfigOptionFloat               gap_fill_speed;
 
1097
    ConfigOptionInt                 infill_extruder;
 
1098
    ConfigOptionFloatOrPercent      infill_extrusion_width;
 
1099
    ConfigOptionInt                 infill_every_layers;
 
1100
    ConfigOptionFloat               infill_speed;
 
1101
    ConfigOptionBool                overhangs;
 
1102
    ConfigOptionInt                 perimeter_extruder;
 
1103
    ConfigOptionFloatOrPercent      perimeter_extrusion_width;
 
1104
    ConfigOptionFloat               perimeter_speed;
 
1105
    ConfigOptionInt                 perimeters;
 
1106
    ConfigOptionFloatOrPercent      small_perimeter_speed;
 
1107
    ConfigOptionEnum<InfillPattern> solid_fill_pattern;
 
1108
    ConfigOptionFloat               solid_infill_below_area;
 
1109
    ConfigOptionFloatOrPercent      solid_infill_extrusion_width;
 
1110
    ConfigOptionInt                 solid_infill_every_layers;
 
1111
    ConfigOptionFloatOrPercent      solid_infill_speed;
 
1112
    ConfigOptionBool                thin_walls;
 
1113
    ConfigOptionFloatOrPercent      top_infill_extrusion_width;
 
1114
    ConfigOptionInt                 top_solid_layers;
 
1115
    ConfigOptionFloatOrPercent      top_solid_infill_speed;
 
1116
    
 
1117
    PrintRegionConfig() : StaticPrintConfig() {
 
1118
        this->bottom_solid_layers.value                          = 3;
 
1119
        this->bridge_speed.value                                 = 60;
 
1120
        this->external_perimeter_speed.value                     = 70;
 
1121
        this->external_perimeter_speed.percent                   = true;
 
1122
        this->extra_perimeters.value                             = true;
 
1123
        this->fill_angle.value                                   = 45;
 
1124
        this->fill_density.value                                 = 40;
 
1125
        this->fill_pattern.value                                 = ipHoneycomb;
 
1126
        this->gap_fill_speed.value                               = 20;
 
1127
        this->infill_extruder.value                              = 1;
 
1128
        this->infill_extrusion_width.value                       = 0;
 
1129
        this->infill_extrusion_width.percent                     = false;
 
1130
        this->infill_every_layers.value                          = 1;
 
1131
        this->infill_speed.value                                 = 60;
 
1132
        this->overhangs.value                                    = true;
 
1133
        this->perimeter_extruder.value                           = 1;
 
1134
        this->perimeter_extrusion_width.value                    = 0;
 
1135
        this->perimeter_extrusion_width.percent                  = false;
 
1136
        this->perimeter_speed.value                              = 30;
 
1137
        this->perimeters.value                                   = 3;
 
1138
        this->small_perimeter_speed.value                        = 30;
 
1139
        this->small_perimeter_speed.percent                      = false;
 
1140
        this->solid_fill_pattern.value                           = ipRectilinear;
 
1141
        this->solid_infill_below_area.value                      = 70;
 
1142
        this->solid_infill_extrusion_width.value                 = 0;
 
1143
        this->solid_infill_extrusion_width.percent               = false;
 
1144
        this->solid_infill_every_layers.value                    = 0;
 
1145
        this->solid_infill_speed.value                           = 60;
 
1146
        this->solid_infill_speed.percent                         = false;
 
1147
        this->thin_walls.value                                   = true;
 
1148
        this->top_infill_extrusion_width.value                   = 0;
 
1149
        this->top_infill_extrusion_width.percent                 = false;
 
1150
        this->top_solid_infill_speed.value                       = 50;
 
1151
        this->top_solid_infill_speed.percent                     = false;
 
1152
        this->top_solid_layers.value                             = 3;
 
1153
    };
 
1154
    
 
1155
    ConfigOption* option(const t_config_option_key opt_key, bool create = false) {
 
1156
        if (opt_key == "bottom_solid_layers")                        return &this->bottom_solid_layers;
 
1157
        if (opt_key == "bridge_speed")                               return &this->bridge_speed;
 
1158
        if (opt_key == "external_perimeter_speed")                   return &this->external_perimeter_speed;
 
1159
        if (opt_key == "extra_perimeters")                           return &this->extra_perimeters;
 
1160
        if (opt_key == "fill_angle")                                 return &this->fill_angle;
 
1161
        if (opt_key == "fill_density")                               return &this->fill_density;
 
1162
        if (opt_key == "fill_pattern")                               return &this->fill_pattern;
 
1163
        if (opt_key == "gap_fill_speed")                             return &this->gap_fill_speed;
 
1164
        if (opt_key == "infill_extruder")                            return &this->infill_extruder;
 
1165
        if (opt_key == "infill_extrusion_width")                     return &this->infill_extrusion_width;
 
1166
        if (opt_key == "infill_every_layers")                        return &this->infill_every_layers;
 
1167
        if (opt_key == "infill_speed")                               return &this->infill_speed;
 
1168
        if (opt_key == "overhangs")                                  return &this->overhangs;
 
1169
        if (opt_key == "perimeter_extruder")                         return &this->perimeter_extruder;
 
1170
        if (opt_key == "perimeter_extrusion_width")                  return &this->perimeter_extrusion_width;
 
1171
        if (opt_key == "perimeter_speed")                            return &this->perimeter_speed;
 
1172
        if (opt_key == "perimeters")                                 return &this->perimeters;
 
1173
        if (opt_key == "small_perimeter_speed")                      return &this->small_perimeter_speed;
 
1174
        if (opt_key == "solid_fill_pattern")                         return &this->solid_fill_pattern;
 
1175
        if (opt_key == "solid_infill_below_area")                    return &this->solid_infill_below_area;
 
1176
        if (opt_key == "solid_infill_extrusion_width")               return &this->solid_infill_extrusion_width;
 
1177
        if (opt_key == "solid_infill_every_layers")                  return &this->solid_infill_every_layers;
 
1178
        if (opt_key == "solid_infill_speed")                         return &this->solid_infill_speed;
 
1179
        if (opt_key == "thin_walls")                                 return &this->thin_walls;
 
1180
        if (opt_key == "top_infill_extrusion_width")                 return &this->top_infill_extrusion_width;
 
1181
        if (opt_key == "top_solid_infill_speed")                     return &this->top_solid_infill_speed;
 
1182
        if (opt_key == "top_solid_layers")                           return &this->top_solid_layers;
 
1183
        
 
1184
        return NULL;
 
1185
    };
 
1186
};
 
1187
 
 
1188
class PrintConfig : public virtual StaticPrintConfig
 
1189
{
 
1190
    public:
 
1191
    ConfigOptionBool                avoid_crossing_perimeters;
 
1192
    ConfigOptionPoint               bed_size;
 
1193
    ConfigOptionInt                 bed_temperature;
 
1194
    ConfigOptionFloat               bridge_acceleration;
 
1195
    ConfigOptionInt                 bridge_fan_speed;
 
1196
    ConfigOptionFloat               bridge_flow_ratio;
 
1197
    ConfigOptionFloat               brim_width;
 
1198
    ConfigOptionBool                complete_objects;
 
1199
    ConfigOptionBool                cooling;
 
1200
    ConfigOptionFloat               default_acceleration;
 
1201
    ConfigOptionInt                 disable_fan_first_layers;
 
1202
    ConfigOptionFloat               duplicate_distance;
 
1203
    ConfigOptionString              end_gcode;
 
1204
    ConfigOptionBool                external_perimeters_first;
 
1205
    ConfigOptionFloat               extruder_clearance_height;
 
1206
    ConfigOptionFloat               extruder_clearance_radius;
 
1207
    ConfigOptionPoints              extruder_offset;
 
1208
    ConfigOptionString              extrusion_axis;
 
1209
    ConfigOptionFloats              extrusion_multiplier;
 
1210
    ConfigOptionBool                fan_always_on;
 
1211
    ConfigOptionInt                 fan_below_layer_time;
 
1212
    ConfigOptionFloats              filament_diameter;
 
1213
    ConfigOptionFloat               first_layer_acceleration;
 
1214
    ConfigOptionInt                 first_layer_bed_temperature;
 
1215
    ConfigOptionFloatOrPercent      first_layer_extrusion_width;
 
1216
    ConfigOptionFloatOrPercent      first_layer_speed;
 
1217
    ConfigOptionInts                first_layer_temperature;
 
1218
    ConfigOptionBool                g0;
 
1219
    ConfigOptionBool                gcode_arcs;
 
1220
    ConfigOptionBool                gcode_comments;
 
1221
    ConfigOptionEnum<GCodeFlavor>   gcode_flavor;
 
1222
    ConfigOptionFloat               infill_acceleration;
 
1223
    ConfigOptionBool                infill_first;
 
1224
    ConfigOptionString              layer_gcode;
 
1225
    ConfigOptionInt                 max_fan_speed;
 
1226
    ConfigOptionInt                 min_fan_speed;
 
1227
    ConfigOptionInt                 min_print_speed;
 
1228
    ConfigOptionFloat               min_skirt_length;
 
1229
    ConfigOptionString              notes;
 
1230
    ConfigOptionFloats              nozzle_diameter;
 
1231
    ConfigOptionBool                only_retract_when_crossing_perimeters;
 
1232
    ConfigOptionBool                ooze_prevention;
 
1233
    ConfigOptionString              output_filename_format;
 
1234
    ConfigOptionFloat               perimeter_acceleration;
 
1235
    ConfigOptionStrings             post_process;
 
1236
    ConfigOptionPoint               print_center;
 
1237
    ConfigOptionFloat               resolution;
 
1238
    ConfigOptionFloats              retract_before_travel;
 
1239
    ConfigOptionBools               retract_layer_change;
 
1240
    ConfigOptionFloats              retract_length;
 
1241
    ConfigOptionFloats              retract_length_toolchange;
 
1242
    ConfigOptionFloats              retract_lift;
 
1243
    ConfigOptionFloats              retract_restart_extra;
 
1244
    ConfigOptionFloats              retract_restart_extra_toolchange;
 
1245
    ConfigOptionInts                retract_speed;
 
1246
    ConfigOptionFloat               skirt_distance;
 
1247
    ConfigOptionInt                 skirt_height;
 
1248
    ConfigOptionInt                 skirts;
 
1249
    ConfigOptionInt                 slowdown_below_layer_time;
 
1250
    ConfigOptionBool                spiral_vase;
 
1251
    ConfigOptionInt                 standby_temperature_delta;
 
1252
    ConfigOptionString              start_gcode;
 
1253
    ConfigOptionInts                temperature;
 
1254
    ConfigOptionInt                 threads;
 
1255
    ConfigOptionString              toolchange_gcode;
 
1256
    ConfigOptionFloat               travel_speed;
 
1257
    ConfigOptionBool                use_firmware_retraction;
 
1258
    ConfigOptionBool                use_relative_e_distances;
 
1259
    ConfigOptionFloat               vibration_limit;
 
1260
    ConfigOptionBools               wipe;
 
1261
    ConfigOptionFloat               z_offset;
 
1262
    
 
1263
    PrintConfig() : StaticPrintConfig() {
 
1264
        this->avoid_crossing_perimeters.value                    = false;
 
1265
        this->bed_size.point                                     = Pointf(200,200);
 
1266
        this->bed_temperature.value                              = 0;
 
1267
        this->bridge_acceleration.value                          = 0;
 
1268
        this->bridge_fan_speed.value                             = 100;
 
1269
        this->bridge_flow_ratio.value                            = 1;
 
1270
        this->brim_width.value                                   = 0;
 
1271
        this->complete_objects.value                             = false;
 
1272
        this->cooling.value                                      = true;
 
1273
        this->default_acceleration.value                         = 0;
 
1274
        this->disable_fan_first_layers.value                     = 1;
 
1275
        this->duplicate_distance.value                           = 6;
 
1276
        this->end_gcode.value                                    = "M104 S0 ; turn off temperature\nG28 X0  ; home X axis\nM84     ; disable motors\n";
 
1277
        this->external_perimeters_first.value                    = false;
 
1278
        this->extruder_clearance_height.value                    = 20;
 
1279
        this->extruder_clearance_radius.value                    = 20;
 
1280
        this->extruder_offset.values.resize(1);
 
1281
        this->extruder_offset.values[0]                          = Pointf(0,0);
 
1282
        this->extrusion_axis.value                               = "E";
 
1283
        this->extrusion_multiplier.values.resize(1);
 
1284
        this->extrusion_multiplier.values[0]                     = 1;
 
1285
        this->fan_always_on.value                                = false;
 
1286
        this->fan_below_layer_time.value                         = 60;
 
1287
        this->filament_diameter.values.resize(1);
 
1288
        this->filament_diameter.values[0]                        = 3;
 
1289
        this->first_layer_acceleration.value                     = 0;
 
1290
        this->first_layer_bed_temperature.value                  = 0;
 
1291
        this->first_layer_extrusion_width.value                  = 200;
 
1292
        this->first_layer_extrusion_width.percent                = true;
 
1293
        this->first_layer_speed.value                            = 30;
 
1294
        this->first_layer_speed.percent                          = true;
 
1295
        this->first_layer_temperature.values.resize(1);
 
1296
        this->first_layer_temperature.values[0]                  = 200;
 
1297
        this->g0.value                                           = false;
 
1298
        this->gcode_arcs.value                                   = false;
 
1299
        this->gcode_comments.value                               = false;
 
1300
        this->gcode_flavor.value                                 = gcfRepRap;
 
1301
        this->infill_acceleration.value                          = 0;
 
1302
        this->infill_first.value                                 = false;
 
1303
        this->layer_gcode.value                                  = "";
 
1304
        this->max_fan_speed.value                                = 100;
 
1305
        this->min_fan_speed.value                                = 35;
 
1306
        this->min_print_speed.value                              = 10;
 
1307
        this->min_skirt_length.value                             = 0;
 
1308
        this->notes.value                                        = "";
 
1309
        this->nozzle_diameter.values.resize(1);
 
1310
        this->nozzle_diameter.values[0]                          = 0.5;
 
1311
        this->only_retract_when_crossing_perimeters.value        = true;
 
1312
        this->ooze_prevention.value                              = false;
 
1313
        this->output_filename_format.value                       = "[input_filename_base].gcode";
 
1314
        this->perimeter_acceleration.value                       = 0;
 
1315
        this->print_center.point                                 = Pointf(100,100);
 
1316
        this->resolution.value                                   = 0;
 
1317
        this->retract_before_travel.values.resize(1);
 
1318
        this->retract_before_travel.values[0]                    = 2;
 
1319
        this->retract_layer_change.values.resize(1);
 
1320
        this->retract_layer_change.values[0]                     = true;
 
1321
        this->retract_length.values.resize(1);
 
1322
        this->retract_length.values[0]                           = 1;
 
1323
        this->retract_length_toolchange.values.resize(1);
 
1324
        this->retract_length_toolchange.values[0]                = 10;
 
1325
        this->retract_lift.values.resize(1);
 
1326
        this->retract_lift.values[0]                             = 0;
 
1327
        this->retract_restart_extra.values.resize(1);
 
1328
        this->retract_restart_extra.values[0]                    = 0;
 
1329
        this->retract_restart_extra_toolchange.values.resize(1);
 
1330
        this->retract_restart_extra_toolchange.values[0]         = 0;
 
1331
        this->retract_speed.values.resize(1);
 
1332
        this->retract_speed.values[0]                            = 30;
 
1333
        this->skirt_distance.value                               = 6;
 
1334
        this->skirt_height.value                                 = 1;
 
1335
        this->skirts.value                                       = 1;
 
1336
        this->slowdown_below_layer_time.value                    = 30;
 
1337
        this->spiral_vase.value                                  = false;
 
1338
        this->standby_temperature_delta.value                    = -5;
 
1339
        this->start_gcode.value                                  = "G28 ; home all axes\nG1 Z5 F5000 ; lift nozzle\n";
 
1340
        this->temperature.values.resize(1);
 
1341
        this->temperature.values[0]                              = 200;
 
1342
        this->threads.value                                      = 2;
 
1343
        this->toolchange_gcode.value                             = "";
 
1344
        this->travel_speed.value                                 = 130;
 
1345
        this->use_firmware_retraction.value                      = false;
 
1346
        this->use_relative_e_distances.value                     = false;
 
1347
        this->vibration_limit.value                              = 0;
 
1348
        this->wipe.values.resize(1);
 
1349
        this->wipe.values[0]                                     = false;
 
1350
        this->z_offset.value                                     = 0;
 
1351
    };
 
1352
    
 
1353
    ConfigOption* option(const t_config_option_key opt_key, bool create = false) {
 
1354
        if (opt_key == "avoid_crossing_perimeters")                  return &this->avoid_crossing_perimeters;
 
1355
        if (opt_key == "bed_size")                                   return &this->bed_size;
 
1356
        if (opt_key == "bed_temperature")                            return &this->bed_temperature;
 
1357
        if (opt_key == "bridge_acceleration")                        return &this->bridge_acceleration;
 
1358
        if (opt_key == "bridge_fan_speed")                           return &this->bridge_fan_speed;
 
1359
        if (opt_key == "bridge_flow_ratio")                          return &this->bridge_flow_ratio;
 
1360
        if (opt_key == "brim_width")                                 return &this->brim_width;
 
1361
        if (opt_key == "complete_objects")                           return &this->complete_objects;
 
1362
        if (opt_key == "cooling")                                    return &this->cooling;
 
1363
        if (opt_key == "default_acceleration")                       return &this->default_acceleration;
 
1364
        if (opt_key == "disable_fan_first_layers")                   return &this->disable_fan_first_layers;
 
1365
        if (opt_key == "duplicate_distance")                         return &this->duplicate_distance;
 
1366
        if (opt_key == "end_gcode")                                  return &this->end_gcode;
 
1367
        if (opt_key == "external_perimeters_first")                  return &this->external_perimeters_first;
 
1368
        if (opt_key == "extruder_clearance_height")                  return &this->extruder_clearance_height;
 
1369
        if (opt_key == "extruder_clearance_radius")                  return &this->extruder_clearance_radius;
 
1370
        if (opt_key == "extruder_offset")                            return &this->extruder_offset;
 
1371
        if (opt_key == "extrusion_axis")                             return &this->extrusion_axis;
 
1372
        if (opt_key == "extrusion_multiplier")                       return &this->extrusion_multiplier;
 
1373
        if (opt_key == "fan_always_on")                              return &this->fan_always_on;
 
1374
        if (opt_key == "fan_below_layer_time")                       return &this->fan_below_layer_time;
 
1375
        if (opt_key == "filament_diameter")                          return &this->filament_diameter;
 
1376
        if (opt_key == "first_layer_acceleration")                   return &this->first_layer_acceleration;
 
1377
        if (opt_key == "first_layer_bed_temperature")                return &this->first_layer_bed_temperature;
 
1378
        if (opt_key == "first_layer_extrusion_width")                return &this->first_layer_extrusion_width;
 
1379
        if (opt_key == "first_layer_speed")                          return &this->first_layer_speed;
 
1380
        if (opt_key == "first_layer_temperature")                    return &this->first_layer_temperature;
 
1381
        if (opt_key == "g0")                                         return &this->g0;
 
1382
        if (opt_key == "gcode_arcs")                                 return &this->gcode_arcs;
 
1383
        if (opt_key == "gcode_comments")                             return &this->gcode_comments;
 
1384
        if (opt_key == "gcode_flavor")                               return &this->gcode_flavor;
 
1385
        if (opt_key == "infill_acceleration")                        return &this->infill_acceleration;
 
1386
        if (opt_key == "infill_first")                               return &this->infill_first;
 
1387
        if (opt_key == "layer_gcode")                                return &this->layer_gcode;
 
1388
        if (opt_key == "max_fan_speed")                              return &this->max_fan_speed;
 
1389
        if (opt_key == "min_fan_speed")                              return &this->min_fan_speed;
 
1390
        if (opt_key == "min_print_speed")                            return &this->min_print_speed;
 
1391
        if (opt_key == "min_skirt_length")                           return &this->min_skirt_length;
 
1392
        if (opt_key == "notes")                                      return &this->notes;
 
1393
        if (opt_key == "nozzle_diameter")                            return &this->nozzle_diameter;
 
1394
        if (opt_key == "only_retract_when_crossing_perimeters")      return &this->only_retract_when_crossing_perimeters;
 
1395
        if (opt_key == "ooze_prevention")                            return &this->ooze_prevention;
 
1396
        if (opt_key == "output_filename_format")                     return &this->output_filename_format;
 
1397
        if (opt_key == "perimeter_acceleration")                     return &this->perimeter_acceleration;
 
1398
        if (opt_key == "post_process")                               return &this->post_process;
 
1399
        if (opt_key == "print_center")                               return &this->print_center;
 
1400
        if (opt_key == "resolution")                                 return &this->resolution;
 
1401
        if (opt_key == "retract_before_travel")                      return &this->retract_before_travel;
 
1402
        if (opt_key == "retract_layer_change")                       return &this->retract_layer_change;
 
1403
        if (opt_key == "retract_length")                             return &this->retract_length;
 
1404
        if (opt_key == "retract_length_toolchange")                  return &this->retract_length_toolchange;
 
1405
        if (opt_key == "retract_lift")                               return &this->retract_lift;
 
1406
        if (opt_key == "retract_restart_extra")                      return &this->retract_restart_extra;
 
1407
        if (opt_key == "retract_restart_extra_toolchange")           return &this->retract_restart_extra_toolchange;
 
1408
        if (opt_key == "retract_speed")                              return &this->retract_speed;
 
1409
        if (opt_key == "skirt_distance")                             return &this->skirt_distance;
 
1410
        if (opt_key == "skirt_height")                               return &this->skirt_height;
 
1411
        if (opt_key == "skirts")                                     return &this->skirts;
 
1412
        if (opt_key == "slowdown_below_layer_time")                  return &this->slowdown_below_layer_time;
 
1413
        if (opt_key == "spiral_vase")                                return &this->spiral_vase;
 
1414
        if (opt_key == "standby_temperature_delta")                  return &this->standby_temperature_delta;
 
1415
        if (opt_key == "start_gcode")                                return &this->start_gcode;
 
1416
        if (opt_key == "temperature")                                return &this->temperature;
 
1417
        if (opt_key == "threads")                                    return &this->threads;
 
1418
        if (opt_key == "toolchange_gcode")                           return &this->toolchange_gcode;
 
1419
        if (opt_key == "travel_speed")                               return &this->travel_speed;
 
1420
        if (opt_key == "use_firmware_retraction")                    return &this->use_firmware_retraction;
 
1421
        if (opt_key == "use_relative_e_distances")                   return &this->use_relative_e_distances;
 
1422
        if (opt_key == "vibration_limit")                            return &this->vibration_limit;
 
1423
        if (opt_key == "wipe")                                       return &this->wipe;
 
1424
        if (opt_key == "z_offset")                                   return &this->z_offset;
 
1425
        
 
1426
        return NULL;
 
1427
    };
 
1428
};
 
1429
 
 
1430
class FullPrintConfig : public PrintObjectConfig, public PrintRegionConfig, public PrintConfig {
 
1431
    public:
 
1432
    ConfigOption* option(const t_config_option_key opt_key, bool create = false) {
 
1433
        ConfigOption* opt;
 
1434
        if ((opt = PrintObjectConfig::option(opt_key, create)) != NULL) return opt;
 
1435
        if ((opt = PrintRegionConfig::option(opt_key, create)) != NULL) return opt;
 
1436
        if ((opt = PrintConfig::option(opt_key, create)) != NULL) return opt;
 
1437
        return NULL;
 
1438
    };
 
1439
    
 
1440
    std::string get_extrusion_axis() {
 
1441
        if (this->gcode_flavor == gcfMach3) {
 
1442
            return std::string("A");
 
1443
        } else if (this->gcode_flavor == gcfNoExtrusion) {
 
1444
            return std::string("");
 
1445
        }
 
1446
        return this->extrusion_axis;
 
1447
    }
 
1448
};
 
1449
 
 
1450
}
 
1451
 
 
1452
#endif