mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-03 01:20:35 +08:00
Ported expanded_output_filepath() to C++/XS
This commit is contained in:
parent
e585b18373
commit
c5a285f435
@ -426,7 +426,7 @@ sub quick_slice {
|
|||||||
if ($params{reslice}) {
|
if ($params{reslice}) {
|
||||||
$output_file = $qs_last_output_file if defined $qs_last_output_file;
|
$output_file = $qs_last_output_file if defined $qs_last_output_file;
|
||||||
} elsif ($params{save_as}) {
|
} elsif ($params{save_as}) {
|
||||||
$output_file = $sprint->expanded_output_filepath;
|
$output_file = $sprint->output_filepath;
|
||||||
$output_file =~ s/\.gcode$/.svg/i if $params{export_svg};
|
$output_file =~ s/\.gcode$/.svg/i if $params{export_svg};
|
||||||
my $dlg = Wx::FileDialog->new($self, 'Save ' . ($params{export_svg} ? 'SVG' : 'G-code') . ' file as:',
|
my $dlg = Wx::FileDialog->new($self, 'Save ' . ($params{export_svg} ? 'SVG' : 'G-code') . ' file as:',
|
||||||
wxTheApp->output_path(dirname($output_file)),
|
wxTheApp->output_path(dirname($output_file)),
|
||||||
|
@ -251,7 +251,7 @@ sub new {
|
|||||||
$self->{print_file} = $self->export_gcode(Wx::StandardPaths::Get->GetTempDir());
|
$self->{print_file} = $self->export_gcode(Wx::StandardPaths::Get->GetTempDir());
|
||||||
});
|
});
|
||||||
EVT_BUTTON($self, $self->{btn_send_gcode}, sub {
|
EVT_BUTTON($self, $self->{btn_send_gcode}, sub {
|
||||||
my $filename = basename($self->{print}->expanded_output_filepath($main::opt{output}));
|
my $filename = basename($self->{print}->output_filepath($main::opt{output}));
|
||||||
$filename = Wx::GetTextFromUser("Save to printer with the following name:",
|
$filename = Wx::GetTextFromUser("Save to printer with the following name:",
|
||||||
"OctoPrint", $filename, $self);
|
"OctoPrint", $filename, $self);
|
||||||
|
|
||||||
@ -1218,9 +1218,9 @@ sub export_gcode {
|
|||||||
|
|
||||||
# select output file
|
# select output file
|
||||||
if ($output_file) {
|
if ($output_file) {
|
||||||
$self->{export_gcode_output_file} = $self->{print}->expanded_output_filepath($output_file);
|
$self->{export_gcode_output_file} = $self->{print}->output_filepath($output_file);
|
||||||
} else {
|
} else {
|
||||||
my $default_output_file = $self->{print}->expanded_output_filepath($main::opt{output});
|
my $default_output_file = $self->{print}->output_filepath($main::opt{output});
|
||||||
my $dlg = Wx::FileDialog->new($self, 'Save G-code file as:', wxTheApp->output_path(dirname($default_output_file)),
|
my $dlg = Wx::FileDialog->new($self, 'Save G-code file as:', wxTheApp->output_path(dirname($default_output_file)),
|
||||||
basename($default_output_file), &Slic3r::GUI::FILE_WILDCARDS->{gcode}, wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
|
basename($default_output_file), &Slic3r::GUI::FILE_WILDCARDS->{gcode}, wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
|
||||||
if ($dlg->ShowModal != wxID_OK) {
|
if ($dlg->ShowModal != wxID_OK) {
|
||||||
@ -1477,7 +1477,7 @@ sub _get_export_file {
|
|||||||
|
|
||||||
my $output_file = $main::opt{output};
|
my $output_file = $main::opt{output};
|
||||||
{
|
{
|
||||||
$output_file = $self->{print}->expanded_output_filepath($output_file);
|
$output_file = $self->{print}->output_filepath($output_file);
|
||||||
$output_file =~ s/\.gcode$/$suffix/i;
|
$output_file =~ s/\.gcode$/$suffix/i;
|
||||||
my $dlg = Wx::FileDialog->new($self, "Save $format file as:", dirname($output_file),
|
my $dlg = Wx::FileDialog->new($self, "Save $format file as:", dirname($output_file),
|
||||||
basename($output_file), &Slic3r::GUI::MODEL_WILDCARD, wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
|
basename($output_file), &Slic3r::GUI::MODEL_WILDCARD, wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
|
||||||
|
@ -77,7 +77,7 @@ sub export_gcode {
|
|||||||
$self->process;
|
$self->process;
|
||||||
|
|
||||||
# output everything to a G-code file
|
# output everything to a G-code file
|
||||||
my $output_file = $self->expanded_output_filepath($params{output_file});
|
my $output_file = $self->output_filepath($params{output_file} // '');
|
||||||
$self->status_cb->(90, "Exporting G-code" . ($output_file ? " to $output_file" : ""));
|
$self->status_cb->(90, "Exporting G-code" . ($output_file ? " to $output_file" : ""));
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -128,7 +128,7 @@ sub export_svg {
|
|||||||
|
|
||||||
my $fh = $params{output_fh};
|
my $fh = $params{output_fh};
|
||||||
if (!$fh) {
|
if (!$fh) {
|
||||||
my $output_file = $self->expanded_output_filepath($params{output_file});
|
my $output_file = $self->output_filepath($params{output_file});
|
||||||
$output_file =~ s/\.gcode$/.svg/i;
|
$output_file =~ s/\.gcode$/.svg/i;
|
||||||
Slic3r::open(\$fh, ">", $output_file) or die "Failed to open $output_file for writing\n";
|
Slic3r::open(\$fh, ">", $output_file) or die "Failed to open $output_file for writing\n";
|
||||||
print "Exporting to $output_file..." unless $params{quiet};
|
print "Exporting to $output_file..." unless $params{quiet};
|
||||||
@ -354,45 +354,6 @@ sub make_brim {
|
|||||||
$self->_make_brim;
|
$self->_make_brim;
|
||||||
}
|
}
|
||||||
|
|
||||||
# this method will return the supplied input file path after expanding its
|
|
||||||
# format variables with their values
|
|
||||||
sub expanded_output_filepath {
|
|
||||||
my $self = shift;
|
|
||||||
my ($path) = @_;
|
|
||||||
|
|
||||||
return undef if !@{$self->objects};
|
|
||||||
my $input_file = first { defined $_ } map $_->model_object->input_file, @{$self->objects};
|
|
||||||
return undef if !defined $input_file;
|
|
||||||
|
|
||||||
my $filename = my $filename_base = basename($input_file);
|
|
||||||
$filename_base =~ s/\.[^.]+$//; # without suffix
|
|
||||||
|
|
||||||
# set filename in placeholder parser so that it's available also in custom G-code
|
|
||||||
$self->placeholder_parser->set(input_filename => $filename);
|
|
||||||
$self->placeholder_parser->set(input_filename_base => $filename_base);
|
|
||||||
|
|
||||||
# set other variables from model object
|
|
||||||
$self->placeholder_parser->set_multiple(
|
|
||||||
scale => [ map $_->model_object->instances->[0]->scaling_factor * 100 . "%", @{$self->objects} ],
|
|
||||||
);
|
|
||||||
|
|
||||||
if ($path && -d $path) {
|
|
||||||
# if output path is an existing directory, we take that and append
|
|
||||||
# the specified filename format
|
|
||||||
$path = File::Spec->join($path, $self->config->output_filename_format);
|
|
||||||
} elsif (!$path) {
|
|
||||||
# if no explicit output file was defined, we take the input
|
|
||||||
# file directory and append the specified filename format
|
|
||||||
$path = (fileparse($input_file))[1] . $self->config->output_filename_format;
|
|
||||||
} else {
|
|
||||||
# path is a full path to a file so we use it as it is
|
|
||||||
}
|
|
||||||
|
|
||||||
# make sure we use an up-to-date timestamp
|
|
||||||
$self->placeholder_parser->update_timestamp;
|
|
||||||
return $self->placeholder_parser->process($path);
|
|
||||||
}
|
|
||||||
|
|
||||||
# Wrapper around the C++ Slic3r::Print::validate()
|
# Wrapper around the C++ Slic3r::Print::validate()
|
||||||
# to produce a Perl exception without a hang-up on some Strawberry perls.
|
# to produce a Perl exception without a hang-up on some Strawberry perls.
|
||||||
sub validate
|
sub validate
|
||||||
|
@ -13,7 +13,7 @@ use Slic3r::Geometry qw(X Y);
|
|||||||
has '_print' => (
|
has '_print' => (
|
||||||
is => 'ro',
|
is => 'ro',
|
||||||
default => sub { Slic3r::Print->new },
|
default => sub { Slic3r::Print->new },
|
||||||
handles => [qw(apply_config extruders expanded_output_filepath
|
handles => [qw(apply_config extruders output_filepath
|
||||||
total_used_filament total_extruded_volume
|
total_used_filament total_extruded_volume
|
||||||
placeholder_parser process)],
|
placeholder_parser process)],
|
||||||
);
|
);
|
||||||
|
@ -60,7 +60,7 @@ use Slic3r::Test;
|
|||||||
$config->set('start_gcode', "TRAVEL:[travel_speed] HEIGHT:[layer_height]\n");
|
$config->set('start_gcode', "TRAVEL:[travel_speed] HEIGHT:[layer_height]\n");
|
||||||
my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
|
my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
|
||||||
|
|
||||||
my $output_file = $print->print->expanded_output_filepath;
|
my $output_file = $print->print->output_filepath;
|
||||||
my ($t, $h) = map $config->$_, qw(travel_speed layer_height);
|
my ($t, $h) = map $config->$_, qw(travel_speed layer_height);
|
||||||
ok $output_file =~ /ts_${t}_/, 'print config options are replaced in output filename';
|
ok $output_file =~ /ts_${t}_/, 'print config options are replaced in output filename';
|
||||||
ok $output_file =~ /lh_$h\./, 'region config options are replaced in output filename';
|
ok $output_file =~ /lh_$h\./, 'region config options are replaced in output filename';
|
||||||
|
@ -6,6 +6,8 @@
|
|||||||
#include "Geometry.hpp"
|
#include "Geometry.hpp"
|
||||||
#include "SupportMaterial.hpp"
|
#include "SupportMaterial.hpp"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <boost/filesystem.hpp>
|
||||||
|
#include <boost/lexical_cast.hpp>
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
|
|
||||||
@ -973,4 +975,57 @@ Print::auto_assign_extruders(ModelObject* model_object) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
Print::output_filename() const
|
||||||
|
{
|
||||||
|
PlaceholderParser pp = this->placeholder_parser;
|
||||||
|
|
||||||
|
// get input file name
|
||||||
|
std::string input_file;
|
||||||
|
FOREACH_OBJECT(this, object) {
|
||||||
|
input_file = (*object)->model_object()->input_file;
|
||||||
|
if (!input_file.empty()) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get basename with and without suffix and set placeholders
|
||||||
|
const std::string input_basename = boost::filesystem::path(input_file).filename().string();
|
||||||
|
pp.set("input_filename", input_basename);
|
||||||
|
const std::string input_basename_base = input_basename.substr(0, input_basename.find_last_of("."));
|
||||||
|
pp.set("input_filename_base", input_basename_base);
|
||||||
|
|
||||||
|
// set other variables from model object
|
||||||
|
{
|
||||||
|
std::vector<std::string> v_scale;
|
||||||
|
FOREACH_OBJECT(this, object)
|
||||||
|
v_scale.push_back( boost::lexical_cast<std::string>((*object)->model_object()->instances[0]->scaling_factor*100) + "%" );
|
||||||
|
pp.set("scale", v_scale);
|
||||||
|
}
|
||||||
|
|
||||||
|
pp.update_timestamp();
|
||||||
|
return pp.process(this->config.output_filename_format.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
Print::output_filepath(const std::string &path) const
|
||||||
|
{
|
||||||
|
// if we were supplied no path, generate an automatic one based on our first object's input file
|
||||||
|
if (path.empty()) {
|
||||||
|
// get the first input file name
|
||||||
|
std::string input_file;
|
||||||
|
FOREACH_OBJECT(this, object) {
|
||||||
|
input_file = (*object)->model_object()->input_file;
|
||||||
|
if (!input_file.empty()) break;
|
||||||
|
}
|
||||||
|
return (boost::filesystem::path(input_file).parent_path() / this->output_filename()).string();
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we were supplied a directory, use it and append our automatically generated filename
|
||||||
|
boost::filesystem::path p(path);
|
||||||
|
if (boost::filesystem::is_directory(p))
|
||||||
|
return (p / this->output_filename()).string();
|
||||||
|
|
||||||
|
// if we were supplied a file which is not a directory, use it
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -212,6 +212,8 @@ class Print
|
|||||||
double max_allowed_layer_height() const;
|
double max_allowed_layer_height() const;
|
||||||
bool has_support_material() const;
|
bool has_support_material() const;
|
||||||
void auto_assign_extruders(ModelObject* model_object) const;
|
void auto_assign_extruders(ModelObject* model_object) const;
|
||||||
|
std::string output_filename() const;
|
||||||
|
std::string output_filepath(const std::string &path) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void clear_regions();
|
void clear_regions();
|
||||||
|
@ -215,6 +215,8 @@ _constant()
|
|||||||
double max_allowed_layer_height() const;
|
double max_allowed_layer_height() const;
|
||||||
bool has_support_material() const;
|
bool has_support_material() const;
|
||||||
void auto_assign_extruders(ModelObject* model_object);
|
void auto_assign_extruders(ModelObject* model_object);
|
||||||
|
std::string output_filename();
|
||||||
|
std::string output_filepath(std::string path = "");
|
||||||
|
|
||||||
void add_model_object(ModelObject* model_object, int idx = -1);
|
void add_model_object(ModelObject* model_object, int idx = -1);
|
||||||
bool apply_config(DynamicPrintConfig* config)
|
bool apply_config(DynamicPrintConfig* config)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user