slic3r.pl 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. BEGIN {
  5. use FindBin;
  6. use lib "$FindBin::Bin/lib";
  7. }
  8. use Getopt::Long qw(:config no_auto_abbrev);
  9. use List::Util qw(first);
  10. use POSIX qw(setlocale LC_NUMERIC);
  11. use Slic3r;
  12. use Time::HiRes qw(gettimeofday tv_interval);
  13. $|++;
  14. our %opt = ();
  15. my %cli_options = ();
  16. {
  17. my %options = (
  18. 'help' => sub { usage() },
  19. 'version' => sub { print "$Slic3r::VERSION\n"; exit 0 },
  20. 'debug' => \$Slic3r::debug,
  21. 'gui' => \$opt{gui},
  22. 'o|output=s' => \$opt{output},
  23. 'save=s' => \$opt{save},
  24. 'load=s@' => \$opt{load},
  25. 'autosave=s' => \$opt{autosave},
  26. 'ignore-nonexistent-config' => \$opt{ignore_nonexistent_config},
  27. 'no-plater' => \$opt{no_plater},
  28. 'gui-mode=s' => \$opt{gui_mode},
  29. 'datadir=s' => \$opt{datadir},
  30. 'export-svg' => \$opt{export_svg},
  31. 'merge|m' => \$opt{merge},
  32. 'repair' => \$opt{repair},
  33. 'cut=f' => \$opt{cut},
  34. 'info' => \$opt{info},
  35. 'scale=f' => \$opt{scale},
  36. 'rotate=i' => \$opt{rotate},
  37. 'duplicate=i' => \$opt{duplicate},
  38. 'duplicate-grid=s' => \$opt{duplicate_grid},
  39. );
  40. foreach my $opt_key (keys %{$Slic3r::Config::Options}) {
  41. my $cli = $Slic3r::Config::Options->{$opt_key}->{cli} or next;
  42. # allow both the dash-separated option name and the full opt_key
  43. $options{ "$opt_key|$cli" } = \$cli_options{$opt_key};
  44. }
  45. GetOptions(%options) or usage(1);
  46. }
  47. # process command line options
  48. my $cli_config = Slic3r::Config->new_from_cli(%cli_options);
  49. # load configuration files
  50. my @external_configs = ();
  51. if ($opt{load}) {
  52. foreach my $configfile (@{$opt{load}}) {
  53. if (-e $configfile) {
  54. push @external_configs, Slic3r::Config->load($configfile);
  55. } elsif (-e "$FindBin::Bin/$configfile") {
  56. printf STDERR "Loading $FindBin::Bin/$configfile\n";
  57. push @external_configs, Slic3r::Config->load("$FindBin::Bin/$configfile");
  58. } else {
  59. $opt{ignore_nonexistent_config} or die "Cannot find specified configuration file ($configfile).\n";
  60. }
  61. }
  62. }
  63. # merge configuration
  64. my $config = Slic3r::Config->new_from_defaults;
  65. foreach my $c (@external_configs, $cli_config) {
  66. $c->normalize; # expand shortcuts before applying, otherwise destination values would be already filled with defaults
  67. $config->apply($c);
  68. }
  69. # save configuration
  70. if ($opt{save}) {
  71. $config->validate;
  72. $config->save($opt{save});
  73. }
  74. # launch GUI
  75. my $gui;
  76. if (!@ARGV && !$opt{save} && eval "require Slic3r::GUI; 1") {
  77. {
  78. no warnings 'once';
  79. $Slic3r::GUI::datadir = $opt{datadir};
  80. $Slic3r::GUI::no_plater = $opt{no_plater};
  81. $Slic3r::GUI::mode = $opt{gui_mode};
  82. $Slic3r::GUI::autosave = $opt{autosave};
  83. }
  84. $gui = Slic3r::GUI->new;
  85. setlocale(LC_NUMERIC, 'C');
  86. $gui->{skeinpanel}->load_config_file($_) for @{$opt{load}};
  87. $gui->{skeinpanel}->load_config($cli_config);
  88. $gui->MainLoop;
  89. exit;
  90. }
  91. die $@ if $@ && $opt{gui};
  92. if (@ARGV) { # slicing from command line
  93. $config->validate;
  94. if ($opt{repair}) {
  95. foreach my $file (@ARGV) {
  96. die "Repair is currently supported only on STL files\n"
  97. if $file !~ /\.stl$/i;
  98. my $output_file = $file;
  99. $output_file =~ s/\.(stl)$/_fixed.obj/i;
  100. my $tmesh = Slic3r::TriangleMesh->new;
  101. $tmesh->ReadSTLFile($file);
  102. $tmesh->repair;
  103. $tmesh->WriteOBJFile($output_file);
  104. }
  105. exit;
  106. }
  107. if ($opt{cut}) {
  108. foreach my $file (@ARGV) {
  109. my $model = Slic3r::Model->read_from_file($file);
  110. $model->add_default_instances;
  111. my $mesh = $model->mesh;
  112. $mesh->translate(0, 0, -$mesh->bounding_box->z_min);
  113. my $upper = Slic3r::TriangleMesh->new;
  114. my $lower = Slic3r::TriangleMesh->new;
  115. $mesh->cut($opt{cut}, $upper, $lower);
  116. $upper->repair;
  117. $lower->repair;
  118. $upper->write_ascii("${file}_upper.stl")
  119. if $upper->facets_count > 0;
  120. $lower->write_ascii("${file}_lower.stl")
  121. if $lower->facets_count > 0;
  122. }
  123. exit;
  124. }
  125. while (my $input_file = shift @ARGV) {
  126. my $model;
  127. if ($opt{merge}) {
  128. my @models = map Slic3r::Model->read_from_file($_), $input_file, (splice @ARGV, 0);
  129. $model = Slic3r::Model->merge(@models);
  130. } else {
  131. $model = Slic3r::Model->read_from_file($input_file);
  132. }
  133. if ($opt{info}) {
  134. $model->print_info;
  135. next;
  136. }
  137. if (defined $opt{duplicate_grid}) {
  138. $opt{duplicate_grid} = [ split /[,x]/, $opt{duplicate_grid}, 2 ];
  139. }
  140. my $sprint = Slic3r::Print::Simple->new(
  141. scale => $opt{scale} // 1,
  142. rotate => $opt{rotate} // 0,
  143. duplicate => $opt{duplicate} // 1,
  144. duplicate_grid => $opt{duplicate_grid} // [1,1],
  145. status_cb => sub {
  146. my ($percent, $message) = @_;
  147. printf "=> %s\n", $message;
  148. },
  149. output_file => $opt{output},
  150. );
  151. $sprint->apply_config($config);
  152. $sprint->set_model($model);
  153. if ($opt{export_svg}) {
  154. $sprint->export_svg;
  155. } else {
  156. my $t0 = [gettimeofday];
  157. $sprint->export_gcode;
  158. # output some statistics
  159. {
  160. my $duration = tv_interval($t0);
  161. printf "Done. Process took %d minutes and %.3f seconds\n",
  162. int($duration/60), ($duration - int($duration/60)*60); # % truncates to integer
  163. }
  164. printf "Filament required: %.1fmm (%.1fcm3)\n",
  165. $sprint->total_used_filament, $sprint->total_extruded_volume/1000;
  166. }
  167. }
  168. } else {
  169. usage(1) unless $opt{save};
  170. }
  171. sub usage {
  172. my ($exit_code) = @_;
  173. my $config = Slic3r::Config->new_from_defaults->as_hash;
  174. my $j = '';
  175. if ($Slic3r::have_threads) {
  176. $j = <<"EOF";
  177. -j, --threads <num> Number of threads to use (1+, default: $config->{threads})
  178. EOF
  179. }
  180. print <<"EOF";
  181. Slic3r $Slic3r::VERSION is a STL-to-GCODE translator for RepRap 3D printers
  182. written by Alessandro Ranellucci <aar\@cpan.org> - http://slic3r.org/
  183. Usage: slic3r.pl [ OPTIONS ] [ file.stl ] [ file2.stl ] ...
  184. --help Output this usage screen and exit
  185. --version Output the version of Slic3r and exit
  186. --save <file> Save configuration to the specified file
  187. --load <file> Load configuration from the specified file. It can be used
  188. more than once to load options from multiple files.
  189. -o, --output <file> File to output gcode to (by default, the file will be saved
  190. into the same directory as the input file using the
  191. --output-filename-format to generate the filename.) If a
  192. directory is specified for this option, the output will
  193. be saved under that directory, and the filename will be
  194. generated by --output-filename-format.
  195. Non-slicing actions (no G-code will be generated):
  196. --repair Repair given STL files and save them as <name>_fixed.obj
  197. --cut <z> Cut given input files at given Z (relative) and export
  198. them as <name>_upper.stl and <name>_lower.stl
  199. --info Output information about the supplied file(s) and exit
  200. $j
  201. GUI options:
  202. --no-plater Disable the plater tab
  203. --gui-mode Overrides the configured mode (simple/expert)
  204. --autosave <file> Automatically export current configuration to the specified file
  205. Output options:
  206. --output-filename-format
  207. Output file name format; all config options enclosed in brackets
  208. will be replaced by their values, as well as [input_filename_base]
  209. and [input_filename] (default: $config->{output_filename_format})
  210. --post-process Generated G-code will be processed with the supplied script;
  211. call this more than once to process through multiple scripts.
  212. --export-svg Export a SVG file containing slices instead of G-code.
  213. -m, --merge If multiple files are supplied, they will be composed into a single
  214. print rather than processed individually.
  215. Printer options:
  216. --nozzle-diameter Diameter of nozzle in mm (default: $config->{nozzle_diameter}->[0])
  217. --print-center Coordinates in mm of the point to center the print around
  218. (default: $config->{print_center}->[0],$config->{print_center}->[1])
  219. --z-offset Additional height in mm to add to vertical coordinates
  220. (+/-, default: $config->{z_offset})
  221. --gcode-flavor The type of G-code to generate (reprap/teacup/makerware/sailfish/mach3/no-extrusion,
  222. default: $config->{gcode_flavor})
  223. --use-relative-e-distances Enable this to get relative E values (default: no)
  224. --use-firmware-retraction Enable firmware-controlled retraction using G10/G11 (default: no)
  225. --gcode-arcs Use G2/G3 commands for native arcs (experimental, not supported
  226. by all firmwares)
  227. --g0 Use G0 commands for retraction (experimental, not supported by all
  228. firmwares)
  229. --gcode-comments Make G-code verbose by adding comments (default: no)
  230. --vibration-limit Limit the frequency of moves on X and Y axes (Hz, set zero to disable;
  231. default: $config->{vibration_limit})
  232. Filament options:
  233. --filament-diameter Diameter in mm of your raw filament (default: $config->{filament_diameter}->[0])
  234. --extrusion-multiplier
  235. Change this to alter the amount of plastic extruded. There should be
  236. very little need to change this value, which is only useful to
  237. compensate for filament packing (default: $config->{extrusion_multiplier}->[0])
  238. --temperature Extrusion temperature in degree Celsius, set 0 to disable (default: $config->{temperature}->[0])
  239. --first-layer-temperature Extrusion temperature for the first layer, in degree Celsius,
  240. set 0 to disable (default: same as --temperature)
  241. --bed-temperature Heated bed temperature in degree Celsius, set 0 to disable (default: $config->{bed_temperature})
  242. --first-layer-bed-temperature Heated bed temperature for the first layer, in degree Celsius,
  243. set 0 to disable (default: same as --bed-temperature)
  244. Speed options:
  245. --travel-speed Speed of non-print moves in mm/s (default: $config->{travel_speed})
  246. --perimeter-speed Speed of print moves for perimeters in mm/s (default: $config->{perimeter_speed})
  247. --small-perimeter-speed
  248. Speed of print moves for small perimeters in mm/s or % over perimeter speed
  249. (default: $config->{small_perimeter_speed})
  250. --external-perimeter-speed
  251. Speed of print moves for the external perimeter in mm/s or % over perimeter speed
  252. (default: $config->{external_perimeter_speed})
  253. --infill-speed Speed of print moves in mm/s (default: $config->{infill_speed})
  254. --solid-infill-speed Speed of print moves for solid surfaces in mm/s or % over infill speed
  255. (default: $config->{solid_infill_speed})
  256. --top-solid-infill-speed Speed of print moves for top surfaces in mm/s or % over solid infill speed
  257. (default: $config->{top_solid_infill_speed})
  258. --support-material-speed
  259. Speed of support material print moves in mm/s (default: $config->{support_material_speed})
  260. --support-material-interface-speed
  261. Speed of support material interface print moves in mm/s or % over support material
  262. speed (default: $config->{support_material_interface_speed})
  263. --bridge-speed Speed of bridge print moves in mm/s (default: $config->{bridge_speed})
  264. --gap-fill-speed Speed of gap fill print moves in mm/s (default: $config->{gap_fill_speed})
  265. --first-layer-speed Speed of print moves for bottom layer, expressed either as an absolute
  266. value or as a percentage over normal speeds (default: $config->{first_layer_speed})
  267. Acceleration options:
  268. --perimeter-acceleration
  269. Overrides firmware's default acceleration for perimeters. (mm/s^2, set zero
  270. to disable; default: $config->{perimeter_acceleration})
  271. --infill-acceleration
  272. Overrides firmware's default acceleration for infill. (mm/s^2, set zero
  273. to disable; default: $config->{infill_acceleration})
  274. --bridge-acceleration
  275. Overrides firmware's default acceleration for bridges. (mm/s^2, set zero
  276. to disable; default: $config->{bridge_acceleration})
  277. --first-layer-acceleration
  278. Overrides firmware's default acceleration for first layer. (mm/s^2, set zero
  279. to disable; default: $config->{first_layer_acceleration})
  280. --default-acceleration
  281. Acceleration will be reset to this value after the specific settings above
  282. have been applied. (mm/s^2, set zero to disable; default: $config->{travel_speed})
  283. Accuracy options:
  284. --layer-height Layer height in mm (default: $config->{layer_height})
  285. --first-layer-height Layer height for first layer (mm or %, default: $config->{first_layer_height})
  286. --infill-every-layers
  287. Infill every N layers (default: $config->{infill_every_layers})
  288. --solid-infill-every-layers
  289. Force a solid layer every N layers (default: $config->{solid_infill_every_layers})
  290. Print options:
  291. --perimeters Number of perimeters/horizontal skins (range: 0+, default: $config->{perimeters})
  292. --top-solid-layers Number of solid layers to do for top surfaces (range: 0+, default: $config->{top_solid_layers})
  293. --bottom-solid-layers Number of solid layers to do for bottom surfaces (range: 0+, default: $config->{bottom_solid_layers})
  294. --solid-layers Shortcut for setting the two options above at once
  295. --fill-density Infill density (range: 0%-100%, default: $config->{fill_density}%)
  296. --fill-angle Infill angle in degrees (range: 0-90, default: $config->{fill_angle})
  297. --fill-pattern Pattern to use to fill non-solid layers (default: $config->{fill_pattern})
  298. --solid-fill-pattern Pattern to use to fill solid layers (default: $config->{solid_fill_pattern})
  299. --start-gcode Load initial G-code from the supplied file. This will overwrite
  300. the default command (home all axes [G28]).
  301. --end-gcode Load final G-code from the supplied file. This will overwrite
  302. the default commands (turn off temperature [M104 S0],
  303. home X axis [G28 X], disable motors [M84]).
  304. --layer-gcode Load layer-change G-code from the supplied file (default: nothing).
  305. --toolchange-gcode Load tool-change G-code from the supplied file (default: nothing).
  306. --seal-position Position of loop starting points (random/nearest/aligned, default: $config->{seal_position}).
  307. --external-perimeters-first Reverse perimeter order. (default: no)
  308. --spiral-vase Experimental option to raise Z gradually when printing single-walled vases
  309. (default: no)
  310. --only-retract-when-crossing-perimeters
  311. Disable retraction when travelling between infill paths inside the same island.
  312. (default: no)
  313. --solid-infill-below-area
  314. Force solid infill when a region has a smaller area than this threshold
  315. (mm^2, default: $config->{solid_infill_below_area})
  316. --infill-only-where-needed
  317. Only infill under ceilings (default: no)
  318. --infill-first Make infill before perimeters (default: no)
  319. Quality options (slower slicing):
  320. --extra-perimeters Add more perimeters when needed (default: yes)
  321. --avoid-crossing-perimeters Optimize travel moves so that no perimeters are crossed (default: no)
  322. --thin-walls Detect single-width walls (default: yes)
  323. --overhangs Experimental option to use bridge flow, speed and fan for overhangs
  324. (default: yes)
  325. Support material options:
  326. --support-material Generate support material for overhangs
  327. --support-material-threshold
  328. Overhang threshold angle (range: 0-90, set 0 for automatic detection,
  329. default: $config->{support_material_threshold})
  330. --support-material-pattern
  331. Pattern to use for support material (default: $config->{support_material_pattern})
  332. --support-material-spacing
  333. Spacing between pattern lines (mm, default: $config->{support_material_spacing})
  334. --support-material-angle
  335. Support material angle in degrees (range: 0-90, default: $config->{support_material_angle})
  336. --support-material-interface-layers
  337. Number of perpendicular layers between support material and object (0+, default: $config->{support_material_interface_layers})
  338. --support-material-interface-spacing
  339. Spacing between interface pattern lines (mm, set 0 to get a solid layer, default: $config->{support_material_interface_spacing})
  340. --raft-layers Number of layers to raise the printed objects by (range: 0+, default: $config->{raft_layers})
  341. --support-material-enforce-layers
  342. Enforce support material on the specified number of layers from bottom,
  343. regardless of --support-material and threshold (0+, default: $config->{support_material_enforce_layers})
  344. --dont-support-bridges
  345. Experimental option for preventing support material from being generated under bridged areas (default: yes)
  346. Retraction options:
  347. --retract-length Length of retraction in mm when pausing extrusion (default: $config->{retract_length}[0])
  348. --retract-speed Speed for retraction in mm/s (default: $config->{retract_speed}[0])
  349. --retract-restart-extra
  350. Additional amount of filament in mm to push after
  351. compensating retraction (default: $config->{retract_restart_extra}[0])
  352. --retract-before-travel
  353. Only retract before travel moves of this length in mm (default: $config->{retract_before_travel}[0])
  354. --retract-lift Lift Z by the given distance in mm when retracting (default: $config->{retract_lift}[0])
  355. --retract-layer-change
  356. Enforce a retraction before each Z move (default: yes)
  357. --wipe Wipe the nozzle while doing a retraction (default: no)
  358. Retraction options for multi-extruder setups:
  359. --retract-length-toolchange
  360. Length of retraction in mm when disabling tool (default: $config->{retract_length}[0])
  361. --retract-restart-extra-toolchnage
  362. Additional amount of filament in mm to push after
  363. switching tool (default: $config->{retract_restart_extra}[0])
  364. Cooling options:
  365. --cooling Enable fan and cooling control
  366. --min-fan-speed Minimum fan speed (default: $config->{min_fan_speed}%)
  367. --max-fan-speed Maximum fan speed (default: $config->{max_fan_speed}%)
  368. --bridge-fan-speed Fan speed to use when bridging (default: $config->{bridge_fan_speed}%)
  369. --fan-below-layer-time Enable fan if layer print time is below this approximate number
  370. of seconds (default: $config->{fan_below_layer_time})
  371. --slowdown-below-layer-time Slow down if layer print time is below this approximate number
  372. of seconds (default: $config->{slowdown_below_layer_time})
  373. --min-print-speed Minimum print speed (mm/s, default: $config->{min_print_speed})
  374. --disable-fan-first-layers Disable fan for the first N layers (default: $config->{disable_fan_first_layers})
  375. --fan-always-on Keep fan always on at min fan speed, even for layers that don't need
  376. cooling
  377. Skirt options:
  378. --skirts Number of skirts to draw (0+, default: $config->{skirts})
  379. --skirt-distance Distance in mm between innermost skirt and object
  380. (default: $config->{skirt_distance})
  381. --skirt-height Height of skirts to draw (expressed in layers, 0+, default: $config->{skirt_height})
  382. --min-skirt-length Generate no less than the number of loops required to consume this length
  383. of filament on the first layer, for each extruder (mm, 0+, default: $config->{min_skirt_length})
  384. --brim-width Width of the brim that will get added to each object to help adhesion
  385. (mm, default: $config->{brim_width})
  386. Transform options:
  387. --scale Factor for scaling input object (default: 1)
  388. --rotate Rotation angle in degrees (0-360, default: 0)
  389. --duplicate Number of items with auto-arrange (1+, default: 1)
  390. --bed-size Bed size, only used for auto-arrange (mm, default: $config->{bed_size}->[0],$config->{bed_size}->[1])
  391. --duplicate-grid Number of items with grid arrangement (default: 1,1)
  392. --duplicate-distance Distance in mm between copies (default: $config->{duplicate_distance})
  393. Sequential printing options:
  394. --complete-objects When printing multiple objects and/or copies, complete each one before
  395. starting the next one; watch out for extruder collisions (default: no)
  396. --extruder-clearance-radius Radius in mm above which extruder won't collide with anything
  397. (default: $config->{extruder_clearance_radius})
  398. --extruder-clearance-height Maximum vertical extruder depth; i.e. vertical distance from
  399. extruder tip and carriage bottom (default: $config->{extruder_clearance_height})
  400. Miscellaneous options:
  401. --notes Notes to be added as comments to the output file
  402. --resolution Minimum detail resolution (mm, set zero for full resolution, default: $config->{resolution})
  403. Flow options (advanced):
  404. --extrusion-width Set extrusion width manually; it accepts either an absolute value in mm
  405. (like 0.65) or a percentage over layer height (like 200%)
  406. --first-layer-extrusion-width
  407. Set a different extrusion width for first layer
  408. --perimeter-extrusion-width
  409. Set a different extrusion width for perimeters
  410. --infill-extrusion-width
  411. Set a different extrusion width for infill
  412. --solid-infill-extrusion-width
  413. Set a different extrusion width for solid infill
  414. --top-infill-extrusion-width
  415. Set a different extrusion width for top infill
  416. --support-material-extrusion-width
  417. Set a different extrusion width for support material
  418. --bridge-flow-ratio Multiplier for extrusion when bridging (> 0, default: $config->{bridge_flow_ratio})
  419. Multiple extruder options:
  420. --extruder-offset Offset of each extruder, if firmware doesn't handle the displacement
  421. (can be specified multiple times, default: 0x0)
  422. --perimeter-extruder
  423. Extruder to use for perimeters (1+, default: $config->{perimeter_extruder})
  424. --infill-extruder Extruder to use for infill (1+, default: $config->{infill_extruder})
  425. --support-material-extruder
  426. Extruder to use for support material (1+, default: $config->{support_material_extruder})
  427. --support-material-interface-extruder
  428. Extruder to use for support material interface (1+, default: $config->{support_material_interface_extruder})
  429. --ooze-prevention Drop temperature and park extruders outside a full skirt for automatic wiping
  430. (default: no)
  431. --standby-temperature-delta
  432. Temperature difference to be applied when an extruder is not active and
  433. --ooze-prevention is enabled (default: $config->{standby_temperature_delta})
  434. EOF
  435. exit ($exit_code || 0);
  436. }
  437. __END__