Merge branch 'master' into fs_simplify_wireframe

This commit is contained in:
Filip Sykala 2021-09-30 13:03:32 +02:00
commit a2d2dec107
4 changed files with 43 additions and 70 deletions

View File

@ -6,6 +6,7 @@
#include "../GCode.hpp" #include "../GCode.hpp"
#include "../Geometry.hpp" #include "../Geometry.hpp"
#include "../GCode/ThumbnailData.hpp" #include "../GCode/ThumbnailData.hpp"
#include "../Semver.hpp"
#include "../Time.hpp" #include "../Time.hpp"
#include "../I18N.hpp" #include "../I18N.hpp"
@ -411,6 +412,8 @@ namespace Slic3r {
unsigned int m_version; unsigned int m_version;
bool m_check_version; bool m_check_version;
// Semantic version of PrusaSlicer, that generated this 3MF.
boost::optional<Semver> m_prusaslicer_generator_version;
unsigned int m_fdm_supports_painting_version = 0; unsigned int m_fdm_supports_painting_version = 0;
unsigned int m_seam_painting_version = 0; unsigned int m_seam_painting_version = 0;
unsigned int m_mm_painting_version = 0; unsigned int m_mm_painting_version = 0;
@ -1712,21 +1715,20 @@ namespace Slic3r {
const std::string msg = (boost::format(_(L("The selected 3mf file has been saved with a newer version of %1% and is not compatible."))) % std::string(SLIC3R_APP_NAME)).str(); const std::string msg = (boost::format(_(L("The selected 3mf file has been saved with a newer version of %1% and is not compatible."))) % std::string(SLIC3R_APP_NAME)).str();
throw version_error(msg); throw version_error(msg);
} }
} } else if (m_curr_metadata_name == "Application") {
// Generator application of the 3MF.
if (m_curr_metadata_name == SLIC3RPE_FDM_SUPPORTS_PAINTING_VERSION) { // SLIC3R_APP_KEY - SLIC3R_VERSION
if (boost::starts_with(m_curr_characters, "PrusaSlicer-"))
m_prusaslicer_generator_version = Semver::parse(m_curr_characters.substr(12));
} else if (m_curr_metadata_name == SLIC3RPE_FDM_SUPPORTS_PAINTING_VERSION) {
m_fdm_supports_painting_version = (unsigned int) atoi(m_curr_characters.c_str()); m_fdm_supports_painting_version = (unsigned int) atoi(m_curr_characters.c_str());
check_painting_version(m_fdm_supports_painting_version, FDM_SUPPORTS_PAINTING_VERSION, check_painting_version(m_fdm_supports_painting_version, FDM_SUPPORTS_PAINTING_VERSION,
_(L("The selected 3MF contains FDM supports painted object using a newer version of PrusaSlicer and is not compatible."))); _(L("The selected 3MF contains FDM supports painted object using a newer version of PrusaSlicer and is not compatible.")));
} } else if (m_curr_metadata_name == SLIC3RPE_SEAM_PAINTING_VERSION) {
if (m_curr_metadata_name == SLIC3RPE_SEAM_PAINTING_VERSION) {
m_seam_painting_version = (unsigned int) atoi(m_curr_characters.c_str()); m_seam_painting_version = (unsigned int) atoi(m_curr_characters.c_str());
check_painting_version(m_seam_painting_version, SEAM_PAINTING_VERSION, check_painting_version(m_seam_painting_version, SEAM_PAINTING_VERSION,
_(L("The selected 3MF contains seam painted object using a newer version of PrusaSlicer and is not compatible."))); _(L("The selected 3MF contains seam painted object using a newer version of PrusaSlicer and is not compatible.")));
} } else if (m_curr_metadata_name == SLIC3RPE_MM_PAINTING_VERSION) {
if (m_curr_metadata_name == SLIC3RPE_MM_PAINTING_VERSION) {
m_mm_painting_version = (unsigned int) atoi(m_curr_characters.c_str()); m_mm_painting_version = (unsigned int) atoi(m_curr_characters.c_str());
check_painting_version(m_mm_painting_version, MM_PAINTING_VERSION, check_painting_version(m_mm_painting_version, MM_PAINTING_VERSION,
_(L("The selected 3MF contains multi-material painted object using a newer version of PrusaSlicer and is not compatible."))); _(L("The selected 3MF contains multi-material painted object using a newer version of PrusaSlicer and is not compatible.")));
@ -1890,7 +1892,6 @@ namespace Slic3r {
unsigned int geo_tri_count = (unsigned int)geometry.triangles.size(); unsigned int geo_tri_count = (unsigned int)geometry.triangles.size();
unsigned int renamed_volumes_count = 0; unsigned int renamed_volumes_count = 0;
int processed_vertices_max_id = 0;
for (const ObjectMetadata::VolumeMetadata& volume_data : volumes) { for (const ObjectMetadata::VolumeMetadata& volume_data : volumes) {
if (geo_tri_count <= volume_data.first_triangle_id || geo_tri_count <= volume_data.last_triangle_id || volume_data.last_triangle_id < volume_data.first_triangle_id) { if (geo_tri_count <= volume_data.first_triangle_id || geo_tri_count <= volume_data.last_triangle_id || volume_data.last_triangle_id < volume_data.first_triangle_id) {
@ -1910,33 +1911,43 @@ namespace Slic3r {
} }
// splits volume out of imported geometry // splits volume out of imported geometry
std::vector<Vec3i> faces(geometry.triangles.begin() + volume_data.first_triangle_id, geometry.triangles.begin() + volume_data.last_triangle_id + 1); indexed_triangle_set its;
const size_t triangles_count = faces.size(); its.indices.assign(geometry.triangles.begin() + volume_data.first_triangle_id, geometry.triangles.begin() + volume_data.last_triangle_id + 1);
const size_t triangles_count = its.indices.size();
if (triangles_count == 0) {
add_error("An empty triangle mesh found");
return false;
}
int min_id = faces.front()[0]; {
int max_id = faces.front()[0]; int min_id = its.indices.front()[0];
for (const Vec3i& face : faces) { int max_id = min_id;
for (const int tri_id : face) { for (const Vec3i& face : its.indices) {
if (tri_id < 0 || tri_id >= int(geometry.vertices.size())) { for (const int tri_id : face) {
add_error("Found invalid vertex id"); if (tri_id < 0 || tri_id >= int(geometry.vertices.size())) {
return false; add_error("Found invalid vertex id");
return false;
}
min_id = std::min(min_id, tri_id);
max_id = std::max(max_id, tri_id);
} }
min_id = std::min(min_id, tri_id);
max_id = std::max(max_id, tri_id);
} }
its.vertices.assign(geometry.vertices.begin() + min_id, geometry.vertices.begin() + max_id + 1);
// rebase indices to the current vertices list
for (Vec3i& face : its.indices)
for (int& tri_id : face)
tri_id -= min_id;
} }
// rebase indices to the current vertices list if (m_prusaslicer_generator_version &&
for (Vec3i& face : faces) { *m_prusaslicer_generator_version >= *Semver::parse("2.4.0-alpha1") &&
for (int& tri_id : face) { *m_prusaslicer_generator_version < *Semver::parse("2.4.0-alpha3"))
tri_id -= min_id; // PrusaSlicer 2.4.0-alpha2 contained a bug, where all vertices of a single object were saved for each volume the object contained.
} // Remove the vertices, that are not referenced by any face.
} its_compactify_vertices(its, true);
processed_vertices_max_id = 1 + std::max(processed_vertices_max_id, max_id); TriangleMesh triangle_mesh(std::move(its));
std::vector<Vec3f> vertices(geometry.vertices.begin() + min_id, geometry.vertices.begin() + max_id + 1);
TriangleMesh triangle_mesh(std::move(vertices), std::move(faces));
if (m_version == 0) { if (m_version == 0) {
// if the 3mf was not produced by PrusaSlicer and there is only one instance, // if the 3mf was not produced by PrusaSlicer and there is only one instance,

View File

@ -298,8 +298,6 @@ void GLGizmoFdmSupports::select_facets_by_angle(float threshold_deg, bool block)
} }
} }
activate_internal_undo_redo_stack(true);
Plater::TakeSnapshot snapshot(wxGetApp().plater(), block ? _L("Block supports by angle") Plater::TakeSnapshot snapshot(wxGetApp().plater(), block ? _L("Block supports by angle")
: _L("Add supports by angle")); : _L("Add supports by angle"));
update_model_object(); update_model_object();

View File

@ -26,35 +26,6 @@ GLGizmoPainterBase::GLGizmoPainterBase(GLCanvas3D& parent, const std::string& ic
m_vbo_sphere.finalize_geometry(true); m_vbo_sphere.finalize_geometry(true);
} }
// port of 948bc382655993721d93d3b9fce9b0186fcfb211
void GLGizmoPainterBase::activate_internal_undo_redo_stack(bool activate)
{
Plater* plater = wxGetApp().plater();
// Following is needed to prevent taking an extra snapshot when the activation of
// the internal stack happens when the gizmo is already active (such as open gizmo,
// close gizmo, undo, start painting). The internal stack does not activate on the
// undo, because that would obliterate all future of the main stack (user would
// have to close the gizmo himself, he has no access to main undo/redo after the
// internal stack opens). We don't want the "entering" snapshot taken in this case,
// because there already is one.
std::string last_snapshot_name;
plater->undo_redo_topmost_string_getter(plater->can_undo(), last_snapshot_name);
if (activate && !m_internal_stack_active) {
if (std::string str = this->get_gizmo_entering_text(); last_snapshot_name != str)
Plater::TakeSnapshot(plater, str, UndoRedo::SnapshotType::EnteringGizmo);
plater->enter_gizmos_stack();
m_internal_stack_active = true;
}
if (!activate && m_internal_stack_active) {
plater->leave_gizmos_stack();
if (std::string str = this->get_gizmo_leaving_text(); last_snapshot_name != str)
Plater::TakeSnapshot(plater, str, UndoRedo::SnapshotType::LeavingGizmoWithAction);
m_internal_stack_active = false;
}
}
void GLGizmoPainterBase::set_painter_gizmo_data(const Selection& selection) void GLGizmoPainterBase::set_painter_gizmo_data(const Selection& selection)
{ {
if (m_state != On) if (m_state != On)
@ -450,7 +421,6 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous
&& m_button_down != Button::None) { && m_button_down != Button::None) {
// Take snapshot and update ModelVolume data. // Take snapshot and update ModelVolume data.
wxString action_name = this->handle_snapshot_action_name(shift_down, m_button_down); wxString action_name = this->handle_snapshot_action_name(shift_down, m_button_down);
activate_internal_undo_redo_stack(true);
Plater::TakeSnapshot snapshot(wxGetApp().plater(), action_name); Plater::TakeSnapshot snapshot(wxGetApp().plater(), action_name);
update_model_object(); update_model_object();
@ -548,16 +518,10 @@ void GLGizmoPainterBase::on_set_state()
if (m_state == On && m_old_state != On) { // the gizmo was just turned on if (m_state == On && m_old_state != On) { // the gizmo was just turned on
on_opening(); on_opening();
if (! m_parent.get_gizmos_manager().is_serializing()) {
wxGetApp().CallAfter([this]() {
activate_internal_undo_redo_stack(true);
});
}
} }
if (m_state == Off && m_old_state != Off) { // the gizmo was just turned Off if (m_state == Off && m_old_state != Off) { // the gizmo was just turned Off
// we are actually shutting down // we are actually shutting down
on_shutdown(); on_shutdown();
activate_internal_undo_redo_stack(false);
m_old_mo_id = -1; m_old_mo_id = -1;
//m_iva.release_geometry(); //m_iva.release_geometry();
m_triangle_selectors.clear(); m_triangle_selectors.clear();

View File

@ -90,7 +90,6 @@ protected:
void render_cursor_sphere(const Transform3d& trafo) const; void render_cursor_sphere(const Transform3d& trafo) const;
virtual void update_model_object() const = 0; virtual void update_model_object() const = 0;
virtual void update_from_model_object() = 0; virtual void update_from_model_object() = 0;
void activate_internal_undo_redo_stack(bool activate);
virtual std::array<float, 4> get_cursor_sphere_left_button_color() const { return {0.f, 0.f, 1.f, 0.25f}; } virtual std::array<float, 4> get_cursor_sphere_left_button_color() const { return {0.f, 0.f, 1.f, 0.25f}; }
virtual std::array<float, 4> get_cursor_sphere_right_button_color() const { return {1.f, 0.f, 0.f, 0.25f}; } virtual std::array<float, 4> get_cursor_sphere_right_button_color() const { return {1.f, 0.f, 0.f, 0.25f}; }
@ -172,6 +171,7 @@ protected:
void on_load(cereal::BinaryInputArchive& ar) override; void on_load(cereal::BinaryInputArchive& ar) override;
void on_save(cereal::BinaryOutputArchive& ar) const override {} void on_save(cereal::BinaryOutputArchive& ar) const override {}
CommonGizmosDataID on_get_requirements() const override; CommonGizmosDataID on_get_requirements() const override;
bool wants_enter_leave_snapshots() const override { return true; }
virtual wxString handle_snapshot_action_name(bool shift_down, Button button_down) const = 0; virtual wxString handle_snapshot_action_name(bool shift_down, Button button_down) const = 0;