Merge remote-tracking branch 'origin/3mf_io'

This commit is contained in:
bubnikv 2018-04-04 11:05:29 +02:00
commit 261f391ee3
9 changed files with 96 additions and 29 deletions

View File

@ -1560,7 +1560,7 @@ sub export_amf {
return if !@{$self->{objects}}; return if !@{$self->{objects}};
# Ask user for a file name to write into. # Ask user for a file name to write into.
my $output_file = $self->_get_export_file('AMF') or return; my $output_file = $self->_get_export_file('AMF') or return;
my $res = $self->{model}->store_amf($output_file, $self->{print}); my $res = $self->{model}->store_amf($output_file, $self->{print}, $self->{export_option});
if ($res) if ($res)
{ {
$self->statusbar->SetStatusText(L("AMF file exported to ").$output_file); $self->statusbar->SetStatusText(L("AMF file exported to ").$output_file);
@ -1576,7 +1576,7 @@ sub export_3mf {
return if !@{$self->{objects}}; return if !@{$self->{objects}};
# Ask user for a file name to write into. # Ask user for a file name to write into.
my $output_file = $self->_get_export_file('3MF') or return; my $output_file = $self->_get_export_file('3MF') or return;
my $res = $self->{model}->store_3mf($output_file, $self->{print}); my $res = $self->{model}->store_3mf($output_file, $self->{print}, $self->{export_option});
if ($res) if ($res)
{ {
$self->statusbar->SetStatusText(L("3MF file exported to ").$output_file); $self->statusbar->SetStatusText(L("3MF file exported to ").$output_file);
@ -1618,11 +1618,13 @@ sub _get_export_file {
$output_file =~ s/\.[gG][cC][oO][dD][eE]$/$suffix/; $output_file =~ s/\.[gG][cC][oO][dD][eE]$/$suffix/;
my $dlg = Wx::FileDialog->new($self, L("Save ").$format.L(" file as:"), dirname($output_file), my $dlg = Wx::FileDialog->new($self, L("Save ").$format.L(" file as:"), dirname($output_file),
basename($output_file), &Slic3r::GUI::FILE_WILDCARDS->{$wildcard}, wxFD_SAVE | wxFD_OVERWRITE_PROMPT); basename($output_file), &Slic3r::GUI::FILE_WILDCARDS->{$wildcard}, wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
Slic3r::GUI::add_export_option($dlg, $format);
if ($dlg->ShowModal != wxID_OK) { if ($dlg->ShowModal != wxID_OK) {
$dlg->Destroy; $dlg->Destroy;
return undef; return undef;
} }
$output_file = $dlg->GetPath; $output_file = $dlg->GetPath;
$self->{export_option} = Slic3r::GUI::get_export_option($dlg);
$dlg->Destroy; $dlg->Destroy;
return $output_file; return $output_file;
} }

View File

@ -1443,10 +1443,10 @@ namespace Slic3r {
IdToObjectDataMap m_objects_data; IdToObjectDataMap m_objects_data;
public: public:
bool save_model_to_file(const std::string& filename, Model& model, const Print& print); bool save_model_to_file(const std::string& filename, Model& model, const Print& print, bool export_print_config);
private: private:
bool _save_model_to_file(const std::string& filename, Model& model, const Print& print); bool _save_model_to_file(const std::string& filename, Model& model, const Print& print, bool export_print_config);
bool _add_content_types_file_to_archive(mz_zip_archive& archive); bool _add_content_types_file_to_archive(mz_zip_archive& archive);
bool _add_relationships_file_to_archive(mz_zip_archive& archive); bool _add_relationships_file_to_archive(mz_zip_archive& archive);
bool _add_model_file_to_archive(mz_zip_archive& archive, Model& model); bool _add_model_file_to_archive(mz_zip_archive& archive, Model& model);
@ -1457,13 +1457,13 @@ namespace Slic3r {
bool _add_model_config_file_to_archive(mz_zip_archive& archive, const Model& model); bool _add_model_config_file_to_archive(mz_zip_archive& archive, const Model& model);
}; };
bool _3MF_Exporter::save_model_to_file(const std::string& filename, Model& model, const Print& print) bool _3MF_Exporter::save_model_to_file(const std::string& filename, Model& model, const Print& print, bool export_print_config)
{ {
clear_errors(); clear_errors();
return _save_model_to_file(filename, model, print); return _save_model_to_file(filename, model, print, export_print_config);
} }
bool _3MF_Exporter::_save_model_to_file(const std::string& filename, Model& model, const Print& print) bool _3MF_Exporter::_save_model_to_file(const std::string& filename, Model& model, const Print& print, bool export_print_config)
{ {
mz_zip_archive archive; mz_zip_archive archive;
mz_zip_zero_struct(&archive); mz_zip_zero_struct(&archive);
@ -1502,11 +1502,14 @@ namespace Slic3r {
} }
// adds slic3r print config file // adds slic3r print config file
if (!_add_print_config_file_to_archive(archive, print)) if (export_print_config)
{ {
mz_zip_writer_end(&archive); if (!_add_print_config_file_to_archive(archive, print))
boost::filesystem::remove(filename); {
return false; mz_zip_writer_end(&archive);
boost::filesystem::remove(filename);
return false;
}
} }
// adds slic3r model config file // adds slic3r model config file
@ -1863,13 +1866,13 @@ namespace Slic3r {
return res; return res;
} }
bool store_3mf(const char* path, Model* model, Print* print) bool store_3mf(const char* path, Model* model, Print* print, bool export_print_config)
{ {
if ((path == nullptr) || (model == nullptr) || (print == nullptr)) if ((path == nullptr) || (model == nullptr) || (print == nullptr))
return false; return false;
_3MF_Exporter exporter; _3MF_Exporter exporter;
bool res = exporter.save_model_to_file(path, *model, *print); bool res = exporter.save_model_to_file(path, *model, *print, export_print_config);
if (!res) if (!res)
exporter.log_errors(); exporter.log_errors();

View File

@ -12,7 +12,7 @@ namespace Slic3r {
// Save the given model and the config data contained in the given Print into a 3mf file. // Save the given model and the config data contained in the given Print into a 3mf file.
// The model could be modified during the export process if meshes are not repaired or have no shared vertices // The model could be modified during the export process if meshes are not repaired or have no shared vertices
extern bool store_3mf(const char* path, Model* model, Print* print); extern bool store_3mf(const char* path, Model* model, Print* print, bool export_print_config);
}; // namespace Slic3r }; // namespace Slic3r

View File

@ -576,8 +576,7 @@ bool load_amf_archive(const char *path, PresetBundle* bundle, Model *model)
return false; return false;
} }
std::string internal_amf_filename = boost::ireplace_last_copy(boost::filesystem::path(path).filename().string(), ".zip.amf", ".amf"); if (!boost::iends_with(stat.m_filename, ".amf"))
if (internal_amf_filename != stat.m_filename)
{ {
printf("Found invalid internal filename\n"); printf("Found invalid internal filename\n");
mz_zip_reader_end(&archive); mz_zip_reader_end(&archive);
@ -644,15 +643,20 @@ bool load_amf(const char *path, PresetBundle* bundle, Model *model)
return false; return false;
} }
bool store_amf(const char *path, Model *model, Print* print) bool store_amf(const char *path, Model *model, Print* print, bool export_print_config)
{ {
if ((path == nullptr) || (model == nullptr) || (print == nullptr)) if ((path == nullptr) || (model == nullptr) || (print == nullptr))
return false; return false;
// forces ".zip.amf" extension
std::string export_path = path;
if (!boost::iends_with(export_path, ".zip.amf"))
export_path = boost::filesystem::path(export_path).replace_extension(".zip.amf").string();
mz_zip_archive archive; mz_zip_archive archive;
mz_zip_zero_struct(&archive); mz_zip_zero_struct(&archive);
mz_bool res = mz_zip_writer_init_file(&archive, path, 0); mz_bool res = mz_zip_writer_init_file(&archive, export_path.c_str(), 0);
if (res == 0) if (res == 0)
return false; return false;
@ -661,9 +665,12 @@ bool store_amf(const char *path, Model *model, Print* print)
stream << "<amf unit=\"millimeter\">\n"; stream << "<amf unit=\"millimeter\">\n";
stream << "<metadata type=\"cad\">Slic3r " << SLIC3R_VERSION << "</metadata>\n"; stream << "<metadata type=\"cad\">Slic3r " << SLIC3R_VERSION << "</metadata>\n";
std::string config = "\n"; if (export_print_config)
GCode::append_full_config(*print, config); {
stream << "<metadata type=\"" << SLIC3R_CONFIG_TYPE << "\">" << config << "</metadata>\n"; std::string config = "\n";
GCode::append_full_config(*print, config);
stream << "<metadata type=\"" << SLIC3R_CONFIG_TYPE << "\">" << config << "</metadata>\n";
}
for (const auto &material : model->materials) { for (const auto &material : model->materials) {
if (material.first.empty()) if (material.first.empty())
@ -767,20 +774,20 @@ bool store_amf(const char *path, Model *model, Print* print)
} }
stream << "</amf>\n"; stream << "</amf>\n";
std::string internal_amf_filename = boost::ireplace_last_copy(boost::filesystem::path(path).filename().string(), ".zip.amf", ".amf"); std::string internal_amf_filename = boost::ireplace_last_copy(boost::filesystem::path(export_path).filename().string(), ".zip.amf", ".amf");
std::string out = stream.str(); std::string out = stream.str();
if (!mz_zip_writer_add_mem(&archive, internal_amf_filename.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) if (!mz_zip_writer_add_mem(&archive, internal_amf_filename.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION))
{ {
mz_zip_writer_end(&archive); mz_zip_writer_end(&archive);
boost::filesystem::remove(path); boost::filesystem::remove(export_path);
return false; return false;
} }
if (!mz_zip_writer_finalize_archive(&archive)) if (!mz_zip_writer_finalize_archive(&archive))
{ {
mz_zip_writer_end(&archive); mz_zip_writer_end(&archive);
boost::filesystem::remove(path); boost::filesystem::remove(export_path);
return false; return false;
} }

View File

@ -12,7 +12,7 @@ extern bool load_amf(const char *path, PresetBundle* bundle, Model *model);
// Save the given model and the config data contained in the given Print into an amf file. // Save the given model and the config data contained in the given Print into an amf file.
// The model could be modified during the export process if meshes are not repaired or have no shared vertices // The model could be modified during the export process if meshes are not repaired or have no shared vertices
extern bool store_amf(const char *path, Model *model, Print* print); extern bool store_amf(const char *path, Model *model, Print* print, bool export_print_config);
}; // namespace Slic3r }; // namespace Slic3r

View File

@ -686,4 +686,49 @@ ConfigOptionsGroup* get_optgroup()
return m_optgroup.get(); return m_optgroup.get();
} }
wxWindow* export_option_creator(wxWindow* parent)
{
wxPanel* panel = new wxPanel(parent, -1);
wxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
wxCheckBox* cbox = new wxCheckBox(panel, wxID_HIGHEST + 1, L("Export print config"));
sizer->AddSpacer(5);
sizer->Add(cbox, 0, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, 5);
panel->SetSizer(sizer);
sizer->SetSizeHints(panel);
return panel;
}
void add_export_option(wxFileDialog* dlg, const std::string& format)
{
if ((dlg != nullptr) && (format == "AMF") || (format == "3MF"))
{
if (dlg->SupportsExtraControl())
dlg->SetExtraControlCreator(export_option_creator);
}
}
int get_export_option(wxFileDialog* dlg)
{
if (dlg != nullptr)
{
wxWindow* wnd = dlg->GetExtraControl();
if (wnd != nullptr)
{
wxPanel* panel = dynamic_cast<wxPanel*>(wnd);
if (panel != nullptr)
{
wxWindow* child = panel->FindWindow(wxID_HIGHEST + 1);
if (child != nullptr)
{
wxCheckBox* cbox = dynamic_cast<wxCheckBox*>(child);
if (cbox != nullptr)
return cbox->IsChecked() ? 1 : 0;
}
}
}
}
return 0;
}
} } } }

View File

@ -18,6 +18,7 @@ class wxArrayLong;
class wxColour; class wxColour;
class wxBoxSizer; class wxBoxSizer;
class wxFlexGridSizer; class wxFlexGridSizer;
class wxFileDialog;
namespace Slic3r { namespace Slic3r {
@ -130,6 +131,8 @@ void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFl
ConfigOptionsGroup* get_optgroup(); ConfigOptionsGroup* get_optgroup();
void add_export_option(wxFileDialog* dlg, const std::string& format);
int get_export_option(wxFileDialog* dlg);
} }
} }

View File

@ -67,3 +67,10 @@ void add_frequently_changed_parameters(SV *ui_parent, SV *ui_sizer, SV *ui_p_siz
std::string fold_utf8_to_ascii(const char *src) std::string fold_utf8_to_ascii(const char *src)
%code%{ RETVAL = Slic3r::fold_utf8_to_ascii(src); %}; %code%{ RETVAL = Slic3r::fold_utf8_to_ascii(src); %};
void add_export_option(SV *ui, std::string format)
%code%{ Slic3r::GUI::add_export_option((wxFileDialog*)wxPli_sv_2_object(aTHX_ ui, "Wx::FileDialog"), format); %};
int get_export_option(SV *ui)
%code%{ RETVAL = Slic3r::GUI::get_export_option((wxFileDialog*)wxPli_sv_2_object(aTHX_ ui, "Wx::FileDialog")); %};

View File

@ -104,10 +104,10 @@
bool store_stl(char *path, bool binary) bool store_stl(char *path, bool binary)
%code%{ TriangleMesh mesh = THIS->mesh(); RETVAL = Slic3r::store_stl(path, &mesh, binary); %}; %code%{ TriangleMesh mesh = THIS->mesh(); RETVAL = Slic3r::store_stl(path, &mesh, binary); %};
bool store_amf(char *path, Print* print) bool store_amf(char *path, Print* print, bool export_print_config)
%code%{ RETVAL = Slic3r::store_amf(path, THIS, print); %}; %code%{ RETVAL = Slic3r::store_amf(path, THIS, print, export_print_config); %};
bool store_3mf(char *path, Print* print) bool store_3mf(char *path, Print* print, bool export_print_config)
%code%{ RETVAL = Slic3r::store_3mf(path, THIS, print); %}; %code%{ RETVAL = Slic3r::store_3mf(path, THIS, print, export_print_config); %};
%{ %{