Merge branch 'master' of https://github.com/prusa3d/PrusaSlicer
This commit is contained in:
commit
36fb615d2b
10 changed files with 124 additions and 101 deletions
|
@ -163,6 +163,8 @@ add_library(libslic3r STATIC
|
||||||
MTUtils.hpp
|
MTUtils.hpp
|
||||||
Zipper.hpp
|
Zipper.hpp
|
||||||
Zipper.cpp
|
Zipper.cpp
|
||||||
|
miniz_extension.hpp
|
||||||
|
miniz_extension.cpp
|
||||||
SLA/SLABoilerPlate.hpp
|
SLA/SLABoilerPlate.hpp
|
||||||
SLA/SLABasePool.hpp
|
SLA/SLABasePool.hpp
|
||||||
SLA/SLABasePool.cpp
|
SLA/SLABasePool.cpp
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
|
|
||||||
#include <expat.h>
|
#include <expat.h>
|
||||||
#include <Eigen/Dense>
|
#include <Eigen/Dense>
|
||||||
#include <miniz.h>
|
#include "miniz_extension.hpp"
|
||||||
|
|
||||||
// VERSION NUMBERS
|
// VERSION NUMBERS
|
||||||
// 0 : .3mf, files saved by older slic3r or other applications. No version definition in them.
|
// 0 : .3mf, files saved by older slic3r or other applications. No version definition in them.
|
||||||
|
@ -188,24 +188,6 @@ bool is_valid_object_type(const std::string& type)
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
|
|
||||||
namespace {
|
|
||||||
void close_archive_reader(mz_zip_archive *arch) {
|
|
||||||
if (arch) {
|
|
||||||
FILE *f = mz_zip_get_cfile(arch);
|
|
||||||
mz_zip_reader_end(arch);
|
|
||||||
if (f) fclose(f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void close_archive_writer(mz_zip_archive *arch) {
|
|
||||||
if (arch) {
|
|
||||||
FILE *f = mz_zip_get_cfile(arch);
|
|
||||||
mz_zip_writer_end(arch);
|
|
||||||
if (f) fclose(f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Base class with error messages management
|
// Base class with error messages management
|
||||||
class _3MF_Base
|
class _3MF_Base
|
||||||
{
|
{
|
||||||
|
@ -522,10 +504,7 @@ void close_archive_writer(mz_zip_archive *arch) {
|
||||||
mz_zip_archive archive;
|
mz_zip_archive archive;
|
||||||
mz_zip_zero_struct(&archive);
|
mz_zip_zero_struct(&archive);
|
||||||
|
|
||||||
FILE *f = boost::nowide::fopen(filename.c_str(), "rb");
|
if (!open_zip_reader(&archive, filename)) {
|
||||||
auto res = mz_bool(f != nullptr && mz_zip_reader_init_cfile(&archive, f, -1, 0));
|
|
||||||
if (res == 0)
|
|
||||||
{
|
|
||||||
add_error("Unable to open the file");
|
add_error("Unable to open the file");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -549,7 +528,7 @@ void close_archive_writer(mz_zip_archive *arch) {
|
||||||
// valid model name -> extract model
|
// valid model name -> extract model
|
||||||
if (!_extract_model_from_archive(archive, stat))
|
if (!_extract_model_from_archive(archive, stat))
|
||||||
{
|
{
|
||||||
close_archive_reader(&archive);
|
close_zip_reader(&archive);
|
||||||
add_error("Archive does not contain a valid model");
|
add_error("Archive does not contain a valid model");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -585,7 +564,7 @@ void close_archive_writer(mz_zip_archive *arch) {
|
||||||
// extract slic3r model config file
|
// extract slic3r model config file
|
||||||
if (!_extract_model_config_from_archive(archive, stat, model))
|
if (!_extract_model_config_from_archive(archive, stat, model))
|
||||||
{
|
{
|
||||||
close_archive_reader(&archive);
|
close_zip_reader(&archive);
|
||||||
add_error("Archive does not contain a valid model config");
|
add_error("Archive does not contain a valid model config");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -593,7 +572,7 @@ void close_archive_writer(mz_zip_archive *arch) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
close_archive_reader(&archive);
|
close_zip_reader(&archive);
|
||||||
|
|
||||||
for (const IdToModelObjectMap::value_type& object : m_objects)
|
for (const IdToModelObjectMap::value_type& object : m_objects)
|
||||||
{
|
{
|
||||||
|
@ -1659,10 +1638,7 @@ void close_archive_writer(mz_zip_archive *arch) {
|
||||||
mz_zip_archive archive;
|
mz_zip_archive archive;
|
||||||
mz_zip_zero_struct(&archive);
|
mz_zip_zero_struct(&archive);
|
||||||
|
|
||||||
FILE *f = boost::nowide::fopen(filename.c_str(), "wb");
|
if (!open_zip_writer(&archive, filename)) {
|
||||||
auto res = mz_bool(f != nullptr && mz_zip_writer_init_cfile(&archive, f, 0));
|
|
||||||
if (res == 0)
|
|
||||||
{
|
|
||||||
add_error("Unable to open the file");
|
add_error("Unable to open the file");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1671,7 +1647,7 @@ void close_archive_writer(mz_zip_archive *arch) {
|
||||||
// The content of this file is the same for each PrusaSlicer 3mf.
|
// The content of this file is the same for each PrusaSlicer 3mf.
|
||||||
if (!_add_content_types_file_to_archive(archive))
|
if (!_add_content_types_file_to_archive(archive))
|
||||||
{
|
{
|
||||||
close_archive_writer(&archive);
|
close_zip_writer(&archive);
|
||||||
boost::filesystem::remove(filename);
|
boost::filesystem::remove(filename);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1681,7 +1657,7 @@ void close_archive_writer(mz_zip_archive *arch) {
|
||||||
// The relationshis file contains a reference to the geometry file "3D/3dmodel.model", the name was chosen to be compatible with CURA.
|
// The relationshis file contains a reference to the geometry file "3D/3dmodel.model", the name was chosen to be compatible with CURA.
|
||||||
if (!_add_relationships_file_to_archive(archive))
|
if (!_add_relationships_file_to_archive(archive))
|
||||||
{
|
{
|
||||||
close_archive_writer(&archive);
|
close_zip_writer(&archive);
|
||||||
boost::filesystem::remove(filename);
|
boost::filesystem::remove(filename);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1691,7 +1667,7 @@ void close_archive_writer(mz_zip_archive *arch) {
|
||||||
IdToObjectDataMap objects_data;
|
IdToObjectDataMap objects_data;
|
||||||
if (!_add_model_file_to_archive(archive, model, objects_data))
|
if (!_add_model_file_to_archive(archive, model, objects_data))
|
||||||
{
|
{
|
||||||
close_archive_writer(&archive);
|
close_zip_writer(&archive);
|
||||||
boost::filesystem::remove(filename);
|
boost::filesystem::remove(filename);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1701,7 +1677,7 @@ void close_archive_writer(mz_zip_archive *arch) {
|
||||||
// The index differes from the index of an object ID of an object instance of a 3MF file!
|
// The index differes from the index of an object ID of an object instance of a 3MF file!
|
||||||
if (!_add_layer_height_profile_file_to_archive(archive, model))
|
if (!_add_layer_height_profile_file_to_archive(archive, model))
|
||||||
{
|
{
|
||||||
close_archive_writer(&archive);
|
close_zip_writer(&archive);
|
||||||
boost::filesystem::remove(filename);
|
boost::filesystem::remove(filename);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1711,7 +1687,7 @@ void close_archive_writer(mz_zip_archive *arch) {
|
||||||
// The index differes from the index of an object ID of an object instance of a 3MF file!
|
// The index differes from the index of an object ID of an object instance of a 3MF file!
|
||||||
if (!_add_sla_support_points_file_to_archive(archive, model))
|
if (!_add_sla_support_points_file_to_archive(archive, model))
|
||||||
{
|
{
|
||||||
close_archive_writer(&archive);
|
close_zip_writer(&archive);
|
||||||
boost::filesystem::remove(filename);
|
boost::filesystem::remove(filename);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1722,7 +1698,7 @@ void close_archive_writer(mz_zip_archive *arch) {
|
||||||
{
|
{
|
||||||
if (!_add_print_config_file_to_archive(archive, *config))
|
if (!_add_print_config_file_to_archive(archive, *config))
|
||||||
{
|
{
|
||||||
close_archive_writer(&archive);
|
close_zip_writer(&archive);
|
||||||
boost::filesystem::remove(filename);
|
boost::filesystem::remove(filename);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1734,20 +1710,20 @@ void close_archive_writer(mz_zip_archive *arch) {
|
||||||
// is stored here as well.
|
// is stored here as well.
|
||||||
if (!_add_model_config_file_to_archive(archive, model, objects_data))
|
if (!_add_model_config_file_to_archive(archive, model, objects_data))
|
||||||
{
|
{
|
||||||
close_archive_writer(&archive);
|
close_zip_writer(&archive);
|
||||||
boost::filesystem::remove(filename);
|
boost::filesystem::remove(filename);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mz_zip_writer_finalize_archive(&archive))
|
if (!mz_zip_writer_finalize_archive(&archive))
|
||||||
{
|
{
|
||||||
close_archive_writer(&archive);
|
close_zip_writer(&archive);
|
||||||
boost::filesystem::remove(filename);
|
boost::filesystem::remove(filename);
|
||||||
add_error("Unable to finalize the archive");
|
add_error("Unable to finalize the archive");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
close_archive_writer(&archive);
|
close_zip_writer(&archive);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#include <boost/filesystem/operations.hpp>
|
#include <boost/filesystem/operations.hpp>
|
||||||
#include <boost/algorithm/string.hpp>
|
#include <boost/algorithm/string.hpp>
|
||||||
#include <boost/nowide/fstream.hpp>
|
#include <boost/nowide/fstream.hpp>
|
||||||
#include <miniz.h>
|
#include "miniz_extension.hpp"
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
// Enable debugging and assert in this file.
|
// Enable debugging and assert in this file.
|
||||||
|
@ -712,37 +712,19 @@ bool load_amf_file(const char *path, DynamicPrintConfig *config, Model *model)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
|
||||||
void close_archive_reader(mz_zip_archive *arch) {
|
|
||||||
if (arch) {
|
|
||||||
FILE *f = mz_zip_get_cfile(arch);
|
|
||||||
mz_zip_reader_end(arch);
|
|
||||||
if (f) fclose(f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void close_archive_writer(mz_zip_archive *arch) {
|
|
||||||
if (arch) {
|
|
||||||
FILE *f = mz_zip_get_cfile(arch);
|
|
||||||
mz_zip_writer_end(arch);
|
|
||||||
if (f) fclose(f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, DynamicPrintConfig* config, Model* model, unsigned int& version)
|
bool extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, DynamicPrintConfig* config, Model* model, unsigned int& version)
|
||||||
{
|
{
|
||||||
if (stat.m_uncomp_size == 0)
|
if (stat.m_uncomp_size == 0)
|
||||||
{
|
{
|
||||||
printf("Found invalid size\n");
|
printf("Found invalid size\n");
|
||||||
close_archive_reader(&archive);
|
close_zip_reader(&archive);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
XML_Parser parser = XML_ParserCreate(nullptr); // encoding
|
XML_Parser parser = XML_ParserCreate(nullptr); // encoding
|
||||||
if (!parser) {
|
if (!parser) {
|
||||||
printf("Couldn't allocate memory for parser\n");
|
printf("Couldn't allocate memory for parser\n");
|
||||||
close_archive_reader(&archive);
|
close_zip_reader(&archive);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -755,7 +737,7 @@ bool extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_fi
|
||||||
if (parser_buffer == nullptr)
|
if (parser_buffer == nullptr)
|
||||||
{
|
{
|
||||||
printf("Unable to create buffer\n");
|
printf("Unable to create buffer\n");
|
||||||
close_archive_reader(&archive);
|
close_zip_reader(&archive);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -763,14 +745,14 @@ bool extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_fi
|
||||||
if (res == 0)
|
if (res == 0)
|
||||||
{
|
{
|
||||||
printf("Error while reading model data to buffer\n");
|
printf("Error while reading model data to buffer\n");
|
||||||
close_archive_reader(&archive);
|
close_zip_reader(&archive);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!XML_ParseBuffer(parser, (int)stat.m_uncomp_size, 1))
|
if (!XML_ParseBuffer(parser, (int)stat.m_uncomp_size, 1))
|
||||||
{
|
{
|
||||||
printf("Error (%s) while parsing xml file at line %d\n", XML_ErrorString(XML_GetErrorCode(parser)), XML_GetCurrentLineNumber(parser));
|
printf("Error (%s) while parsing xml file at line %d\n", XML_ErrorString(XML_GetErrorCode(parser)), XML_GetCurrentLineNumber(parser));
|
||||||
close_archive_reader(&archive);
|
close_zip_reader(&archive);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -792,10 +774,7 @@ bool load_amf_archive(const char *path, DynamicPrintConfig *config, Model *model
|
||||||
mz_zip_archive archive;
|
mz_zip_archive archive;
|
||||||
mz_zip_zero_struct(&archive);
|
mz_zip_zero_struct(&archive);
|
||||||
|
|
||||||
FILE * f = boost::nowide::fopen(path, "rb");
|
if (!open_zip_reader(&archive, path))
|
||||||
auto res = mz_bool(f == nullptr ? MZ_FALSE : MZ_TRUE);
|
|
||||||
res = res && mz_zip_reader_init_cfile(&archive, f, -1, 0);
|
|
||||||
if (res == MZ_FALSE)
|
|
||||||
{
|
{
|
||||||
printf("Unable to init zip reader\n");
|
printf("Unable to init zip reader\n");
|
||||||
return false;
|
return false;
|
||||||
|
@ -813,7 +792,7 @@ bool load_amf_archive(const char *path, DynamicPrintConfig *config, Model *model
|
||||||
{
|
{
|
||||||
if (!extract_model_from_archive(archive, stat, config, model, version))
|
if (!extract_model_from_archive(archive, stat, config, model, version))
|
||||||
{
|
{
|
||||||
close_archive_reader(&archive);
|
close_zip_reader(&archive);
|
||||||
printf("Archive does not contain a valid model");
|
printf("Archive does not contain a valid model");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -834,7 +813,7 @@ bool load_amf_archive(const char *path, DynamicPrintConfig *config, Model *model
|
||||||
}
|
}
|
||||||
#endif // forward compatibility
|
#endif // forward compatibility
|
||||||
|
|
||||||
close_archive_reader(&archive);
|
close_zip_reader(&archive);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -874,10 +853,7 @@ bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config)
|
||||||
mz_zip_archive archive;
|
mz_zip_archive archive;
|
||||||
mz_zip_zero_struct(&archive);
|
mz_zip_zero_struct(&archive);
|
||||||
|
|
||||||
FILE *f = boost::nowide::fopen(export_path.c_str(), "wb");
|
if (!open_zip_writer(&archive, export_path)) return false;
|
||||||
auto res = mz_bool(f != nullptr && mz_zip_writer_init_cfile(&archive, f, 0));
|
|
||||||
if (res == 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
std::stringstream stream;
|
std::stringstream stream;
|
||||||
// https://en.cppreference.com/w/cpp/types/numeric_limits/max_digits10
|
// https://en.cppreference.com/w/cpp/types/numeric_limits/max_digits10
|
||||||
|
@ -1039,20 +1015,19 @@ bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config)
|
||||||
|
|
||||||
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))
|
||||||
{
|
{
|
||||||
close_archive_writer(&archive);
|
close_zip_writer(&archive);
|
||||||
if (f) fclose(f);
|
|
||||||
boost::filesystem::remove(export_path);
|
boost::filesystem::remove(export_path);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mz_zip_writer_finalize_archive(&archive))
|
if (!mz_zip_writer_finalize_archive(&archive))
|
||||||
{
|
{
|
||||||
close_archive_writer(&archive);
|
close_zip_writer(&archive);
|
||||||
boost::filesystem::remove(export_path);
|
boost::filesystem::remove(export_path);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
close_archive_writer(&archive);
|
close_zip_writer(&archive);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
#include <boost/nowide/convert.hpp>
|
#include <boost/nowide/convert.hpp>
|
||||||
#include <boost/nowide/cstdio.hpp>
|
#include <boost/nowide/cstdio.hpp>
|
||||||
|
|
||||||
#include <miniz.h>
|
#include "miniz_extension.hpp"
|
||||||
|
|
||||||
#include <Eigen/Geometry>
|
#include <Eigen/Geometry>
|
||||||
|
|
||||||
|
@ -300,11 +300,10 @@ bool load_prus(const char *path, Model *model)
|
||||||
mz_zip_archive archive;
|
mz_zip_archive archive;
|
||||||
mz_zip_zero_struct(&archive);
|
mz_zip_zero_struct(&archive);
|
||||||
|
|
||||||
FILE *f = boost::nowide::fopen(path, "rb");
|
|
||||||
auto res = mz_bool(f != nullptr && mz_zip_reader_init_cfile(&archive, f, -1, 0));
|
|
||||||
size_t n_models_initial = model->objects.size();
|
size_t n_models_initial = model->objects.size();
|
||||||
|
mz_bool res = MZ_FALSE;
|
||||||
try {
|
try {
|
||||||
if (res == MZ_FALSE)
|
if (!open_zip_reader(&archive, path))
|
||||||
throw std::runtime_error(std::string("Unable to init zip reader for ") + path);
|
throw std::runtime_error(std::string("Unable to init zip reader for ") + path);
|
||||||
std::vector<char> scene_xml_data;
|
std::vector<char> scene_xml_data;
|
||||||
// For grouping multiple STLs into a single ModelObject for multi-material prints.
|
// For grouping multiple STLs into a single ModelObject for multi-material prints.
|
||||||
|
@ -329,13 +328,11 @@ bool load_prus(const char *path, Model *model)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (std::exception &ex) {
|
} catch (std::exception &ex) {
|
||||||
mz_zip_reader_end(&archive);
|
close_zip_reader(&archive);
|
||||||
if(f) fclose(f);
|
|
||||||
throw ex;
|
throw ex;
|
||||||
}
|
}
|
||||||
|
|
||||||
mz_zip_reader_end(&archive);
|
close_zip_reader(&archive);
|
||||||
if(f) fclose(f);
|
|
||||||
return model->objects.size() > n_models_initial;
|
return model->objects.size() > n_models_initial;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
#include <exception>
|
#include <exception>
|
||||||
|
|
||||||
#include "Zipper.hpp"
|
#include "Zipper.hpp"
|
||||||
#include <miniz.h>
|
#include "miniz_extension.hpp"
|
||||||
#include <boost/log/trivial.hpp>
|
#include <boost/log/trivial.hpp>
|
||||||
#include <boost/nowide/cstdio.hpp>
|
|
||||||
#include "I18N.hpp"
|
#include "I18N.hpp"
|
||||||
|
|
||||||
//! macro used to mark string used at localization,
|
//! macro used to mark string used at localization,
|
||||||
|
@ -124,16 +123,9 @@ Zipper::Zipper(const std::string &zipfname, e_compression compression)
|
||||||
|
|
||||||
memset(&m_impl->arch, 0, sizeof(m_impl->arch));
|
memset(&m_impl->arch, 0, sizeof(m_impl->arch));
|
||||||
|
|
||||||
FILE *f = boost::nowide::fopen(zipfname.c_str(), "wb");
|
if (!open_zip_writer(&m_impl->arch, zipfname)) {
|
||||||
|
|
||||||
if (f == nullptr) {
|
|
||||||
m_impl->arch.m_last_error = MZ_ZIP_FILE_OPEN_FAILED;
|
|
||||||
m_impl->blow_up();
|
m_impl->blow_up();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize the archive data
|
|
||||||
if(!mz_zip_writer_init_cfile(&m_impl->arch, f, 0))
|
|
||||||
m_impl->blow_up();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Zipper::~Zipper()
|
Zipper::~Zipper()
|
||||||
|
@ -148,13 +140,9 @@ Zipper::~Zipper()
|
||||||
BOOST_LOG_TRIVIAL(error) << m_impl->formatted_errorstr();
|
BOOST_LOG_TRIVIAL(error) << m_impl->formatted_errorstr();
|
||||||
}
|
}
|
||||||
|
|
||||||
FILE *f = mz_zip_get_cfile(&m_impl->arch);
|
|
||||||
|
|
||||||
// The file should be closed no matter what...
|
// The file should be closed no matter what...
|
||||||
if(!mz_zip_writer_end(&m_impl->arch))
|
if(!close_zip_writer(&m_impl->arch))
|
||||||
BOOST_LOG_TRIVIAL(error) << m_impl->formatted_errorstr();
|
BOOST_LOG_TRIVIAL(error) << m_impl->formatted_errorstr();
|
||||||
|
|
||||||
if(f != nullptr) fclose(f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Zipper::Zipper(Zipper &&m):
|
Zipper::Zipper(Zipper &&m):
|
||||||
|
|
59
src/libslic3r/miniz_extension.cpp
Normal file
59
src/libslic3r/miniz_extension.cpp
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
#include "miniz_extension.hpp"
|
||||||
|
|
||||||
|
#if defined(_MSC_VER) || defined(__MINGW64__)
|
||||||
|
#include "boost/nowide/cstdio.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace Slic3r {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
bool open_zip(mz_zip_archive *zip, const char *fname, bool isread)
|
||||||
|
{
|
||||||
|
if (!zip) return false;
|
||||||
|
const char *mode = isread ? "rb" : "wb";
|
||||||
|
|
||||||
|
FILE *f = nullptr;
|
||||||
|
#if defined(_MSC_VER) || defined(__MINGW64__)
|
||||||
|
f = boost::nowide::fopen(fname, mode);
|
||||||
|
#elif defined(__GNUC__) && defined(_LARGEFILE64_SOURCE)
|
||||||
|
f = fopen64(fname, mode);
|
||||||
|
#else
|
||||||
|
f = fopen(fname, mode);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!f) {
|
||||||
|
zip->m_last_error = MZ_ZIP_FILE_OPEN_FAILED;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return isread ? mz_zip_reader_init_cfile(zip, f, 0, 0)
|
||||||
|
: mz_zip_writer_init_cfile(zip, f, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool close_zip(mz_zip_archive *zip, bool isread)
|
||||||
|
{
|
||||||
|
bool ret = false;
|
||||||
|
if (zip) {
|
||||||
|
FILE *f = mz_zip_get_cfile(zip);
|
||||||
|
ret = bool(isread ? mz_zip_reader_end(zip)
|
||||||
|
: mz_zip_writer_end(zip));
|
||||||
|
if (f) fclose(f);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool open_zip_reader(mz_zip_archive *zip, const std::string &fname)
|
||||||
|
{
|
||||||
|
return open_zip(zip, fname.c_str(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool open_zip_writer(mz_zip_archive *zip, const std::string &fname)
|
||||||
|
{
|
||||||
|
return open_zip(zip, fname.c_str(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool close_zip_reader(mz_zip_archive *zip) { return close_zip(zip, true); }
|
||||||
|
bool close_zip_writer(mz_zip_archive *zip) { return close_zip(zip, false); }
|
||||||
|
|
||||||
|
}
|
16
src/libslic3r/miniz_extension.hpp
Normal file
16
src/libslic3r/miniz_extension.hpp
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
#ifndef MINIZ_EXTENSION_HPP
|
||||||
|
#define MINIZ_EXTENSION_HPP
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <miniz.h>
|
||||||
|
|
||||||
|
namespace Slic3r {
|
||||||
|
|
||||||
|
bool open_zip_reader(mz_zip_archive *zip, const std::string &fname_utf8);
|
||||||
|
bool open_zip_writer(mz_zip_archive *zip, const std::string &fname_utf8);
|
||||||
|
bool close_zip_reader(mz_zip_archive *zip);
|
||||||
|
bool close_zip_writer(mz_zip_archive *zip);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // MINIZ_EXTENSION_HPP
|
|
@ -939,6 +939,7 @@ wxNotebook* GUI_App::tab_panel() const
|
||||||
return mainframe->m_tabpanel;
|
return mainframe->m_tabpanel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// extruders count from selected printer preset
|
||||||
int GUI_App::extruders_cnt() const
|
int GUI_App::extruders_cnt() const
|
||||||
{
|
{
|
||||||
const Preset& preset = preset_bundle->printers.get_selected_preset();
|
const Preset& preset = preset_bundle->printers.get_selected_preset();
|
||||||
|
@ -946,6 +947,14 @@ int GUI_App::extruders_cnt() const
|
||||||
preset.config.option<ConfigOptionFloats>("nozzle_diameter")->values.size();
|
preset.config.option<ConfigOptionFloats>("nozzle_diameter")->values.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// extruders count from edited printer preset
|
||||||
|
int GUI_App::extruders_edited_cnt() const
|
||||||
|
{
|
||||||
|
const Preset& preset = preset_bundle->printers.get_edited_preset();
|
||||||
|
return preset.printer_technology() == ptSLA ? 1 :
|
||||||
|
preset.config.option<ConfigOptionFloats>("nozzle_diameter")->values.size();
|
||||||
|
}
|
||||||
|
|
||||||
void GUI_App::open_web_page_localized(const std::string &http_address)
|
void GUI_App::open_web_page_localized(const std::string &http_address)
|
||||||
{
|
{
|
||||||
wxLaunchDefaultBrowser(http_address + "&lng=" + this->current_language_code());
|
wxLaunchDefaultBrowser(http_address + "&lng=" + this->current_language_code());
|
||||||
|
|
|
@ -166,6 +166,7 @@ public:
|
||||||
|
|
||||||
wxNotebook* tab_panel() const ;
|
wxNotebook* tab_panel() const ;
|
||||||
int extruders_cnt() const;
|
int extruders_cnt() const;
|
||||||
|
int extruders_edited_cnt() const;
|
||||||
|
|
||||||
std::vector<Tab *> tabs_list;
|
std::vector<Tab *> tabs_list;
|
||||||
|
|
||||||
|
|
|
@ -321,7 +321,7 @@ wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(15 *
|
||||||
/* In a case of a multi-material printing, for editing another Filament Preset
|
/* In a case of a multi-material printing, for editing another Filament Preset
|
||||||
* it's needed to select this preset for the "Filament settings" Tab
|
* it's needed to select this preset for the "Filament settings" Tab
|
||||||
*/
|
*/
|
||||||
if (preset_type == Preset::TYPE_FILAMENT && wxGetApp().extruders_cnt() > 1)
|
if (preset_type == Preset::TYPE_FILAMENT && wxGetApp().extruders_edited_cnt() > 1)
|
||||||
{
|
{
|
||||||
const std::string& selected_preset = GetString(GetSelection()).ToUTF8().data();
|
const std::string& selected_preset = GetString(GetSelection()).ToUTF8().data();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue