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) {