This commit is contained in:
YuSanka 2019-09-02 14:02:47 +02:00
commit dba5dd36f7
4 changed files with 50 additions and 8 deletions

View File

@ -398,8 +398,10 @@ endif()
# Resources install target, configure fhs.hpp on UNIX # Resources install target, configure fhs.hpp on UNIX
if (WIN32) if (WIN32)
install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${CMAKE_INSTALL_PREFIX}/resources") install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${CMAKE_INSTALL_PREFIX}/resources")
else () elseif (SLIC3R_FHS)
set(SLIC3R_FHS_RESOURCES "${CMAKE_INSTALL_FULL_DATAROOTDIR}/PrusaSlicer") set(SLIC3R_FHS_RESOURCES "${CMAKE_INSTALL_FULL_DATAROOTDIR}/PrusaSlicer")
install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${SLIC3R_FHS_RESOURCES}") install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${SLIC3R_FHS_RESOURCES}")
else ()
install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${CMAKE_INSTALL_PREFIX}/resources")
endif () endif ()
configure_file(${LIBDIR}/platform/unix/fhs.hpp.in ${LIBDIR_BIN}/platform/unix/fhs.hpp) configure_file(${LIBDIR}/platform/unix/fhs.hpp.in ${LIBDIR_BIN}/platform/unix/fhs.hpp)

View File

@ -9,6 +9,7 @@
#include "3mf.hpp" #include "3mf.hpp"
#include <limits> #include <limits>
#include <stdexcept>
#include <boost/algorithm/string/classification.hpp> #include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp> #include <boost/algorithm/string/split.hpp>
@ -102,6 +103,13 @@ const char* INVALID_OBJECT_TYPES[] =
"other" "other"
}; };
class version_error : public std::runtime_error
{
public:
version_error(const std::string& what_arg) : std::runtime_error(what_arg) {}
version_error(const char* what_arg) : std::runtime_error(what_arg) {}
};
const char* get_attribute_value_charptr(const char** attributes, unsigned int attributes_size, const char* attribute_key) const char* get_attribute_value_charptr(const char** attributes, unsigned int attributes_size, const char* attribute_key)
{ {
if ((attributes == nullptr) || (attributes_size == 0) || (attributes_size % 2 != 0) || (attribute_key == nullptr)) if ((attributes == nullptr) || (attributes_size == 0) || (attributes_size % 2 != 0) || (attribute_key == nullptr))
@ -731,6 +739,11 @@ namespace Slic3r {
return n; return n;
}, &data, 0); }, &data, 0);
} }
catch (const version_error& e)
{
// rethrow the exception
throw std::runtime_error(e.what());
}
catch (std::exception& e) catch (std::exception& e)
{ {
add_error(e.what()); add_error(e.what());
@ -1439,8 +1452,8 @@ namespace Slic3r {
if (m_check_version && (m_version > VERSION_3MF)) if (m_check_version && (m_version > VERSION_3MF))
{ {
std::string msg = _(L("The selected 3mf file has been saved with a newer version of " + std::string(SLIC3R_APP_NAME) + " and is not compatibile.")); std::string msg = _(L("The selected 3mf file has been saved with a newer version of " + std::string(SLIC3R_APP_NAME) + " and is not compatible."));
throw std::runtime_error(msg.c_str()); throw version_error(msg.c_str());
} }
} }

View File

@ -827,7 +827,7 @@ bool extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_fi
if (check_version && (ctx.m_version > VERSION_AMF)) if (check_version && (ctx.m_version > VERSION_AMF))
{ {
std::string msg = _(L("The selected amf file has been saved with a newer version of " + std::string(SLIC3R_APP_NAME) + " and is not compatibile.")); std::string msg = _(L("The selected amf file has been saved with a newer version of " + std::string(SLIC3R_APP_NAME) + " and is not compatible."));
throw std::runtime_error(msg.c_str()); throw std::runtime_error(msg.c_str());
} }

View File

@ -2152,9 +2152,36 @@ void GLCanvas3D::load_gcode_preview(const GCodePreviewData& preview_data, const
if (!m_volumes.empty()) if (!m_volumes.empty())
{ {
// removes empty volumes // Remove empty volumes from both m_volumes, update m_gcode_preview_volume_index.
m_volumes.volumes.erase(std::remove_if(m_volumes.volumes.begin(), m_volumes.volumes.end(), {
[](const GLVolume* volume) { return volume->print_zs.empty(); }), m_volumes.volumes.end()); size_t idx_volume_src = 0;
size_t idx_volume_dst = 0;
size_t idx_volume_index_src = 0;
size_t idx_volume_index_dst = 0;
size_t idx_volume_of_this_type_last = (idx_volume_index_src + 1 == m_gcode_preview_volume_index.first_volumes.size()) ? m_volumes.volumes.size() : m_gcode_preview_volume_index.first_volumes[idx_volume_index_src + 1].id;
size_t idx_volume_of_this_type_first_new = 0;
for (;;) {
if (idx_volume_src == idx_volume_of_this_type_last) {
if (idx_volume_of_this_type_first_new < idx_volume_dst) {
// There are some volumes of this type left, therefore their entry in the index has to be maintained.
if (idx_volume_index_dst < idx_volume_index_src)
m_gcode_preview_volume_index.first_volumes[idx_volume_index_dst] = m_gcode_preview_volume_index.first_volumes[idx_volume_index_src];
m_gcode_preview_volume_index.first_volumes[idx_volume_index_dst].id = idx_volume_of_this_type_first_new;
++ idx_volume_index_dst;
}
if (idx_volume_of_this_type_last == m_volumes.volumes.size())
break;
++ idx_volume_index_src;
idx_volume_of_this_type_last = (idx_volume_index_src + 1 == m_gcode_preview_volume_index.first_volumes.size()) ? m_volumes.volumes.size() : m_gcode_preview_volume_index.first_volumes[idx_volume_index_src + 1].id;
idx_volume_of_this_type_first_new = idx_volume_dst;
}
if (! m_volumes.volumes[idx_volume_src]->print_zs.empty())
m_volumes.volumes[idx_volume_dst ++] = m_volumes.volumes[idx_volume_src];
++ idx_volume_src;
}
m_volumes.volumes.erase(m_volumes.volumes.begin() + idx_volume_dst, m_volumes.volumes.end());
m_gcode_preview_volume_index.first_volumes.erase(m_gcode_preview_volume_index.first_volumes.begin() + idx_volume_index_dst, m_gcode_preview_volume_index.first_volumes.end());
}
_load_fff_shells(); _load_fff_shells();
} }
@ -5097,7 +5124,7 @@ void GLCanvas3D::_load_gcode_extrusion_paths(const GCodePreviewData& preview_dat
unsigned int role = (unsigned int)(&filters - &roles_filters.front()); unsigned int role = (unsigned int)(&filters - &roles_filters.front());
for (std::pair<float, GLVolume*> &filter : filters) for (std::pair<float, GLVolume*> &filter : filters)
if (filter.second->indexed_vertex_array.vertices_and_normals_interleaved.size() > MAX_VERTEX_BUFFER_SIZE) { if (filter.second->indexed_vertex_array.vertices_and_normals_interleaved.size() > MAX_VERTEX_BUFFER_SIZE) {
if (m_gcode_preview_volume_index.first_volumes.back().id != role) if (m_gcode_preview_volume_index.first_volumes.back().type != GCodePreviewVolumeIndex::Extrusion || m_gcode_preview_volume_index.first_volumes.back().flag != role)
m_gcode_preview_volume_index.first_volumes.emplace_back(GCodePreviewVolumeIndex::Extrusion, role, (unsigned int)m_volumes.volumes.size()); m_gcode_preview_volume_index.first_volumes.emplace_back(GCodePreviewVolumeIndex::Extrusion, role, (unsigned int)m_volumes.volumes.size());
GLVolume& vol = *filter.second; GLVolume& vol = *filter.second;
filter.second = m_volumes.new_toolpath_volume(vol.color); filter.second = m_volumes.new_toolpath_volume(vol.color);