diff --git a/resources/calibration/filament_flow/fr_filament_flow.html b/resources/calibration/filament_flow/fr_filament_flow.html
index 6041f690626..e12a0dad124 100644
--- a/resources/calibration/filament_flow/fr_filament_flow.html
+++ b/resources/calibration/filament_flow/fr_filament_flow.html
@@ -62,9 +62,9 @@
Deuxième étape, à partir de +20%.:
Bon |
-Ici, nous pouvons voir que la boucle n'est pas très bonne dans les -8 et -6. Le -4 est presque rond mais pas tout à fait, il indique donc que la buse a perdu de la pression. Le -2 est presque bon mais le 0 est le seul qui peut être considéré comme "bon", et même ainsi la boucle n'est pas parfaite.
+Ici, nous pouvons voir que le cercle n'est pas très bon dans les modèles -8 et -6. Le -4 est presque rond mais pas tout à fait, il indique donc que la buse a perdu de la pression. Le -2 est presque bon mais le 0 est le seul qui peut être considéré comme "bon", et même ainsi le cercle n'est pas parfaite.
Comment régler votre imprimante
-Vous devez modifier le multiplicateur d'extrusion pour le filament pour lequel vous calibrez (et le sauvegarder). Formule pour le nouveau multiplicateur d'extrusion : new_multiplier = ( (100 + nombre_choisi) / 100 ) * old_multiplier
+
Vous devez modifier le multiplicateur d'extrusion pour le filament pour lequel vous calibrez (et le sauvegarder). Formule pour le nouveau multiplicateur d'extrusion : nouveau_multiplicateur = ( (100 + nombre_choisi) / 100 ) * ancien_multiplicateur
Exemple : première étape, je choisis le -10, donc j'ai ((100-10)/100) * 1 = (0.9) * 1 = 0.9
deuxième étape, je choisis +5, donc j'ai ((100+5)/100) * 0.9 = (1.05) * 0.9 = 0.945
diff --git a/resources/icons/PrusaSlicer_256_icns.png b/resources/icons/PrusaSlicer_256_icns.png
new file mode 100644
index 00000000000..6dd7c132d79
Binary files /dev/null and b/resources/icons/PrusaSlicer_256_icns.png differ
diff --git a/resources/icons/Slic3r_256_icns.png b/resources/icons/Slic3r_256_icns.png
new file mode 100644
index 00000000000..e6318a0c9b7
Binary files /dev/null and b/resources/icons/Slic3r_256_icns.png differ
diff --git a/resources/icons/SuperSlicer_256_icns.png b/resources/icons/SuperSlicer_256_icns.png
new file mode 100644
index 00000000000..1a75b265ec1
Binary files /dev/null and b/resources/icons/SuperSlicer_256_icns.png differ
diff --git a/resources/localization/fr/Slic3r.po b/resources/localization/fr/Slic3r.po
index 3ef07653ab8..807f15512c8 100644
--- a/resources/localization/fr/Slic3r.po
+++ b/resources/localization/fr/Slic3r.po
@@ -5,8 +5,8 @@
msgid ""
msgstr ""
"Project-Id-Version: Slic3r\n"
-"POT-Creation-Date: 2021-06-26 00:00\n"
-"PO-Revision-Date: 2021-06-26 00:00\n"
+"POT-Creation-Date: 2021-07-10 00:00\n"
+"PO-Revision-Date: 2021-07-10 00:00\n"
"Last-Translator: 5axes\n"
"Language-Team:5axes, supermerill\n"
"MIME-Version: 1.0\n"
@@ -1440,6 +1440,9 @@ msgstr ""
"Peut être utile pour éviter que les engrenages bondtech ne déforment les pointes encore un peu chaudes,"
" mais ce n'est généralement pas nécessaire."
+msgid "Can't process the repetier return message: missing field '%s'"
+msgstr "Impossible d'interpréter le message retourné par Repetier: champ '%s' manquant"
+
msgid "Cancel"
msgstr "Annuler"
@@ -2039,7 +2042,9 @@ msgid ""
"Cracks smaller than 2x gap closing radius are being filled during the "
"triangle mesh slicing. The gap closing operation may reduce the final print "
"resolution, therefore it is advisable to keep the value reasonably low."
-msgstr "Les fentes d'une taille inférieure à 2x le rayon de fermeture de l'espacement sont remplies au cours du tranchage par maillage triangulaire. L'opération de fermeture de l'espacement peut réduire la résolution de l'impression finale, aussi est-il conseillé de conserver une valeur relativement basse."
+msgstr ""
+"Les fentes d'une taille inférieure à 2x le rayon de fermeture de l'espacement sont remplies au cours du tranchage du maillage triangulaire."
+" L'opération de fermeture de l'espacement peut réduire la résolution de l'impression finale, aussi est-il conseillé de conserver une valeur relativement basse."
msgid "CRC-32 check failed"
msgstr "Échec du test CRC-32"
@@ -3620,7 +3625,7 @@ msgid "Filament notes"
msgstr "Notes du filament"
msgid "Filament Overrides"
-msgstr "Annulations de Filament"
+msgstr "Rétractions de Filament"
msgid "Filament parking position"
msgstr "Position d'attente du filament"
@@ -4440,7 +4445,6 @@ msgstr ""
"* Si vous voulez seulement sauvegarder les valeurs, choisissez l'option ‘Utiliser aussi pour l'estimation du temps’ et écrivez vous-même les limites dans la section G-Code personnalisé.\n"
"* L’option ‘Utiliser uniquement pour sauvegarde’ ne fera d’écrire les données dans les paramètres sauvegardés du G-Code."
-
msgid ""
"How to compute the vertical z-distance.\n"
"From filament: it uses the nearest bit of the filament. When a bridge is "
@@ -5685,7 +5689,7 @@ msgid "Material Settings Tab"
msgstr "Onglet de réglages du matériau"
msgid "material_correction"
-msgstr "material_correction"
+msgstr "Correction matière"
msgid "Materials"
msgstr "Matériaux"
@@ -8508,7 +8512,7 @@ msgid "Sequential printing"
msgstr "Impression séquentielle"
msgid "Sequential slider applied only to top layer"
-msgstr "Barre de défilement séquentielle appliquée uniquement à la couche du dessus"
+msgstr "Barre de défilement séquentielle appliquée uniquement à la couche active"
msgid "Serial port:"
msgstr "Port série :"
@@ -9181,7 +9185,7 @@ msgid "Slice a file into a G-code, save as"
msgstr "Découper un fichier en G-Code, enregistrer sous"
msgid "Slice gap closing radius"
-msgstr "Découper le rayon de fermeture de l'espacement"
+msgstr "Distance de fermeture des faces disjointes"
msgid "Slice now"
msgstr "Découper maintenant"
diff --git a/resources/profiles b/resources/profiles
index 1ad1be82da2..118aa919c16 160000
--- a/resources/profiles
+++ b/resources/profiles
@@ -1 +1 @@
-Subproject commit 1ad1be82da2c8477b87055e00998f094b31868a2
+Subproject commit 118aa919c16837eb2ff6ba97e2934fa4144ef806
diff --git a/src/libslic3r/MedialAxis.cpp b/src/libslic3r/MedialAxis.cpp
index e040ec99a1a..8b33bc3f5b8 100644
--- a/src/libslic3r/MedialAxis.cpp
+++ b/src/libslic3r/MedialAxis.cpp
@@ -1579,6 +1579,28 @@ MedialAxis::taper_ends(ThickPolylines& pp)
}
}
+double
+check_circular(ExPolygon& expolygon, coord_t max_variation) {
+ if (expolygon.holes.size() > 0) return 0;
+
+ //test if convex
+ if (expolygon.contour.concave_points().empty() && expolygon.contour.points.size() > 3) {
+ // Computing circle center
+ Point center = expolygon.contour.centroid();
+ double radius_min = std::numeric_limits::max(), radius_max = 0;
+ for (int i = 0; i < expolygon.contour.points.size(); ++i) {
+ double dist = expolygon.contour.points[i].distance_to(center);
+ radius_min = std::min(radius_min, dist);
+ radius_max = std::max(radius_max, dist);
+ }
+ // check with max_variation to be sure it's round enough
+ if (radius_max - radius_min < max_variation) {
+ return radius_max;
+ }
+ }
+ return 0;
+}
+
void
MedialAxis::build(ThickPolylines &polylines_out)
{
@@ -1603,6 +1625,23 @@ MedialAxis::build(ThickPolylines &polylines_out)
if (this->expolygon.area() < this->min_width * this->min_width) this->expolygon = this->surface;
if (this->expolygon.area() < this->min_width * this->min_width) return;
+ //check for circular shape
+ double radius = check_circular(this->expolygon, this->min_width/4);
+ if (radius > 0) {
+ ExPolygons miniPeri = offset_ex(this->expolygon.contour, -radius / 2);
+ if (miniPeri.size() == 1 && miniPeri[0].holes.size() == 0) {
+ ThickPolyline thickPoly;
+ thickPoly.points = miniPeri[0].contour.points;
+ thickPoly.endpoints.first = false;
+ thickPoly.endpoints.second = false;
+ for (int i = 0; i < thickPoly.points.size(); i++) {
+ thickPoly.width.push_back(radius);
+ }
+ polylines_out.insert(polylines_out.end(), thickPoly);
+ return;
+ }
+ }
+
//std::cout << "simplify_polygon_frontier\n";
// compute the Voronoi diagram and extract medial axis polylines
ThickPolylines pp;
diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp
index 10cbe401b47..9990027b549 100644
--- a/src/libslic3r/Print.cpp
+++ b/src/libslic3r/Print.cpp
@@ -2338,8 +2338,10 @@ void Print::_make_brim_ears(const Flow &flow, const PrintObjectPtrs &objects, Ex
Points points = poly.contour.points;
points.push_back(points.front());
points = MultiPoint::_douglas_peucker(points, scale_(object->config().brim_ears_detection_length.value));
- if(points.size()>1)
+ if (points.size() > 1) {
points.erase(points.end() - 1);
+ decimated_polygon.points = points;
+ }
}
for (const Point &p : decimated_polygon.convex_points(brim_config.brim_ears_max_angle.value * PI / 180.0)) {
pt_ears.push_back(p);
diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp
index 2e9065b7891..9bb37680c05 100644
--- a/src/slic3r/GUI/MainFrame.cpp
+++ b/src/slic3r/GUI/MainFrame.cpp
@@ -132,7 +132,7 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S
default:
case GUI_App::EAppMode::Editor:
m_taskbar_icon = std::make_unique(wxTBI_DOCK);
- m_taskbar_icon->SetIcon(wxIcon(Slic3r::var(SLIC3R_APP_KEY "_128px.png"), wxBITMAP_TYPE_PNG), SLIC3R_APP_KEY);
+ m_taskbar_icon->SetIcon(wxIcon(Slic3r::var(SLIC3R_APP_KEY "_256_icns.png"), wxBITMAP_TYPE_PNG), SLIC3R_APP_KEY);
break;
case GUI_App::EAppMode::GCodeViewer:
m_taskbar_icon = std::make_unique(wxTBI_DOCK);
diff --git a/src/slic3r/GUI/PhysicalPrinterDialog.cpp b/src/slic3r/GUI/PhysicalPrinterDialog.cpp
index a98ef459349..57a8f770080 100644
--- a/src/slic3r/GUI/PhysicalPrinterDialog.cpp
+++ b/src/slic3r/GUI/PhysicalPrinterDialog.cpp
@@ -271,31 +271,35 @@ void PhysicalPrinterDialog::update_printers()
wxArrayString printers;
Field* rs = m_optgroup->get_field("printhost_port");
- if (!host->get_printers(printers)) {
- std::vector slugs;
+ try {
+ if (!host->get_printers(printers)) {
+ std::vector slugs;
- Choice* choice = dynamic_cast(rs);
- choice->set_values(slugs);
+ Choice* choice = dynamic_cast(rs);
+ choice->set_values(slugs);
- rs->disable();
- } else {
- std::vector slugs;
- for (int i = 0; i < printers.size(); i++) {
- slugs.push_back(printers[i].ToStdString());
- }
+ rs->disable();
+ } else {
+ std::vector slugs;
+ for (int i = 0; i < printers.size(); i++) {
+ slugs.push_back(printers[i].ToStdString());
+ }
- Choice* choice = dynamic_cast(rs);
- choice->set_values(slugs);
- boost::any val = choice->get_value();
- boost::any any_string_type = std::string("");
- auto value_idx = std::find(slugs.begin(), slugs.end(), m_config->opt("printhost_port")->value);
- if ((val.empty() || (any_string_type.type() == val.type() && boost::any_cast(val) == "")) && !slugs.empty() && value_idx == slugs.end()) {
- change_opt_value(*m_config, "printhost_port", slugs[0]);
- choice->set_value(slugs[0],false);
- } else if(value_idx != slugs.end() ){
- choice->set_value(m_config->option("printhost_port")->value, false);
+ Choice* choice = dynamic_cast(rs);
+ choice->set_values(slugs);
+ boost::any val = choice->get_value();
+ boost::any any_string_type = std::string("");
+ auto value_idx = std::find(slugs.begin(), slugs.end(), m_config->opt("printhost_port")->value);
+ if ((val.empty() || (any_string_type.type() == val.type() && boost::any_cast(val) == "")) && !slugs.empty() && value_idx == slugs.end()) {
+ change_opt_value(*m_config, "printhost_port", slugs[0]);
+ choice->set_value(slugs[0], false);
+ } else if (value_idx != slugs.end()) {
+ choice->set_value(m_config->option("printhost_port")->value, false);
+ }
+ rs->enable();
}
- rs->enable();
+ } catch (HostNetworkError error) {
+ show_error(this, error.what());
}
}
diff --git a/src/slic3r/Utils/Repetier.cpp b/src/slic3r/Utils/Repetier.cpp
index c3c24c38ee7..7bae531ea18 100644
--- a/src/slic3r/Utils/Repetier.cpp
+++ b/src/slic3r/Utils/Repetier.cpp
@@ -62,11 +62,14 @@ bool Repetier::test(wxString &msg) const
std::stringstream ss(body);
pt::ptree ptree;
pt::read_json(ss, ptree);
-
- const auto text = ptree.get_optional("name");
- res = validate_version_text(text);
- if (! res) {
- msg = GUI::from_u8((boost::format(_u8L("Mismatched type of print host: %s")) % (text ? *text : "Repetier")).str());
+
+ res = ptree.get_optional("name").has_value();
+ if (!res)
+ msg = GUI::from_u8((boost::format(_u8L("Can't process the repetier return message: missing field '%s'")) % ("name")).str());
+ else {
+ res = ptree.get_optional("printers").has_value();
+ if (!res)
+ msg = GUI::from_u8((boost::format(_u8L("Can't process the repetier return message: missing field '%s'")) % ("printers")).str());
}
}
catch (const std::exception &) {