diff --git a/lib/Slic3r/GUI/3DScene.pm b/lib/Slic3r/GUI/3DScene.pm index 1b6adf800..9d343c3ef 100644 --- a/lib/Slic3r/GUI/3DScene.pm +++ b/lib/Slic3r/GUI/3DScene.pm @@ -679,8 +679,6 @@ sub select_view { # Avoid gimball lock. $self->_stheta(GIMBALL_LOCK_THETA_MAX) if $self->_stheta > GIMBALL_LOCK_THETA_MAX; $self->_stheta(0) if $self->_stheta < 0; - # View everything. - $self->zoom_to_bounding_box($bb); $self->on_viewport_changed->() if $self->on_viewport_changed; $self->Refresh; } diff --git a/xs/src/libslic3r/Format/AMF.cpp b/xs/src/libslic3r/Format/AMF.cpp index b446f456b..83b50ec9e 100644 --- a/xs/src/libslic3r/Format/AMF.cpp +++ b/xs/src/libslic3r/Format/AMF.cpp @@ -674,6 +674,33 @@ bool load_amf(const char *path, PresetBundle* bundle, Model *model) return false; } +std::string xml_escape(std::string text) +{ + std::string::size_type pos = 0; + for (;;) + { + pos = text.find_first_of("\"\'&<>", pos); + if (pos == std::string::npos) + break; + + std::string replacement; + switch (text[pos]) + { + case '\"': replacement = """; break; + case '\'': replacement = "'"; break; + case '&': replacement = "&"; break; + case '<': replacement = "<"; break; + case '>': replacement = ">"; break; + default: break; + } + + text.replace(pos, 1, replacement); + pos += replacement.size(); + } + + return text; +} + bool store_amf(const char *path, Model *model, Print* print, bool export_print_config) { if ((path == nullptr) || (model == nullptr) || (print == nullptr)) @@ -701,7 +728,7 @@ bool store_amf(const char *path, Model *model, Print* print, bool export_print_c { std::string config = "\n"; GCode::append_full_config(*print, config); - stream << "" << config << "\n"; + stream << "" << xml_escape(config) << "\n"; } for (const auto &material : model->materials) {