Compare commits

...
Author SHA1 Message Date
Hanif Koh 68c72c6b80 Remove using namespace std from json_diff.hpp
The directive sat at global scope in a header that DeviceManager.hpp
includes, so most of the GUI compiled with all of std in the global
namespace. 42 files had come to rely on it, mostly for string, vector
and unordered_map, four of them for the ""sv and ""ms literals.

Those sites are qualified. GCodeViewer.cpp spelled the type as
std::vector<::string>, which only resolved through the directive.
2026-10-07 01:39:17 +08:00
Rodrigo Faselli 13d4a0d922 Avoid center plug for internal solid infill (spiral inset) (#15705)
avoid center plug for internal solid infill
2026-10-06 11:41:25 -03:00
Ian Bassi c74ac8a6c3 Keep FPS/timings overlay below the toolbar on narrow canvases (#16215) 2026-10-06 11:36:47 -03:00
Ian Bassi 2d90345d1e Move fill-pattern-tops wiki under 3D Honeycomb (#16214) 2026-10-06 10:34:28 -03:00
Ioannis Giannakas 5a8eb3f14e Fix one wall on top dropping inner walls of narrow Arachne walls (#16174)
* Fix one wall on top dropping inner walls of narrow Arachne walls

* Fix clang tidy errors on the test suite
2026-10-06 14:07:01 +01:00
Kris Austin e7d6f5e6c0 fix: crash in LAN mode when the printer type is not known yet (#16191)
* fix: crash in LAN mode when the printer type is not known yet

InputIpAddressDialog::set_machine_obj() built the help image name from
the printer config with no fallback. If the printer type is empty or
unknown, for example before the first push_all arrives on a flaky LAN
link, the lookup returns "" and create_scaled_bitmap("_en") throws.
The dialog is opened by the "LAN Connection Failed" handlers in
MediaPlayCtrl and MediaFilePanel, where nothing catches the exception,
so the app crashes.

Use input_access_code_x1 when there is no image, and the _cn image for
zh_CN, the same as ConnectPrinterDialog::init_bitmap().

Ported from Bambu Studio 52ca2ec5d1.

* fix: return an empty bitmap for an empty icon name

create_scaled_bitmap() threw when a caller passed an empty name. That
happens when a printer config lookup has no entry, for example in
AMSSetting::update_ams_img() for a printer type with no AMS image.
Log an error and return wxNullBitmap instead.

Ported from Bambu Studio 52ca2ec5d1.
2026-10-06 09:55:25 -03:00
47 changed files with 384 additions and 139 deletions
+2 -2
View File
@@ -3524,7 +3524,7 @@ int CLI::run(int argc, char **argv)
ConfigOptionStrings *curr_variant_opt = m_print_config.option<ConfigOptionStrings>("filament_extruder_variant"); ConfigOptionStrings *curr_variant_opt = m_print_config.option<ConfigOptionStrings>("filament_extruder_variant");
if (!curr_variant_opt) { if (!curr_variant_opt) {
curr_variant_opt = m_print_config.option<ConfigOptionStrings>("filament_extruder_variant", true); curr_variant_opt = m_print_config.option<ConfigOptionStrings>("filament_extruder_variant", true);
std::vector<string>& filament_variants = curr_variant_opt->values; std::vector<std::string>& filament_variants = curr_variant_opt->values;
filament_variants.resize(filament_count, get_extruder_variant_string(etDirectDrive, nvtStandard)); filament_variants.resize(filament_count, get_extruder_variant_string(etDirectDrive, nvtStandard));
} }
const ConfigOptionStrings *new_variant_opt = dynamic_cast<const ConfigOptionStrings*>(config.option("filament_extruder_variant", true)); const ConfigOptionStrings *new_variant_opt = dynamic_cast<const ConfigOptionStrings*>(config.option("filament_extruder_variant", true));
@@ -6554,7 +6554,7 @@ int CLI::run(int argc, char **argv)
std::vector<int> result_filaments; std::vector<int> result_filaments;
//result_filaments.reserve(conflict_filaments.size()); //result_filaments.reserve(conflict_filaments.size());
std::set_intersection(conflict_filament_vector.begin(), conflict_filament_vector.end(), unprintable_filament_vec[index].begin(), std::set_intersection(conflict_filament_vector.begin(), conflict_filament_vector.end(), unprintable_filament_vec[index].begin(),
unprintable_filament_vec[index].end(), insert_iterator<vector<int>>(result_filaments, result_filaments.begin())); unprintable_filament_vec[index].end(), std::insert_iterator<std::vector<int>>(result_filaments, result_filaments.begin()));
conflict_filament_vector = result_filaments; conflict_filament_vector = result_filaments;
} }
} }
+10
View File
@@ -352,6 +352,16 @@ void FillSpiralInset::_fill_surface_single(const FillParams& params,
assert(params.use_arachne); assert(params.use_arachne);
assert(this->print_config != nullptr && this->print_object_config != nullptr); assert(this->print_config != nullptr && this->print_object_config != nullptr);
// Internal solid infill must not add Arachne's standalone thin walls: one of those walls can
// become the extra centre point after the spiral has finished. Top and bottom surfaces keep
// Arachne, including the centre plug handled by generate_spiral_insets().
if (params.extrusion_role == erSolidInfill) {
Polylines polylines;
this->_fill_surface_single(params, thickness_layers, direction, expolygon, polylines);
append(thick_polylines_out, to_thick_polylines(std::move(polylines), scaled<coord_t>(this->spacing)));
return;
}
// Only a solid surface is worth the variable width walls; a sparse one falls back to plain loops. // Only a solid surface is worth the variable width walls; a sparse one falls back to plain loops.
if (params.density <= 0.9999f || params.dont_adjust) { if (params.density <= 0.9999f || params.dont_adjust) {
Polylines polylines; Polylines polylines;
+125 -26
View File
@@ -759,6 +759,59 @@ static void clip_inner_walls_over_top(std::vector<Arachne::VariableWidthLines> &
} }
} }
// ORCA: only_one_wall_top - widest bead of the given walls.
static coord_t widest_bead(const std::vector<Arachne::VariableWidthLines> &walls)
{
coord_t widest = 0;
for (const Arachne::VariableWidthLines &group : walls)
for (const Arachne::ExtrusionLine &el : group)
for (const Arachne::ExtrusionJunction &j : el.junctions)
widest = std::max(widest, j.w);
return widest;
}
// ORCA: only_one_wall_top - length of the walls running further than tolerance from the reference walls, outside the
// excluded area.
static double length_off_reference(const std::vector<Arachne::VariableWidthLines> &walls, const Arachne::VariableWidthLines &reference,
const ExPolygons &excluded, coord_t tolerance)
{
auto append_centerlines = [](const Arachne::VariableWidthLines &lines, Polylines &out) {
for (const Arachne::ExtrusionLine &el : lines) {
if (el.junctions.size() < 2)
continue;
Polyline &centerline = out.emplace_back();
centerline.points.reserve(el.junctions.size());
for (const Arachne::ExtrusionJunction &j : el.junctions)
centerline.points.emplace_back(j.p);
}
};
Polylines wall_centerlines;
Polylines reference_centerlines;
for (const Arachne::VariableWidthLines &group : walls)
append_centerlines(group, wall_centerlines);
append_centerlines(reference, reference_centerlines);
Polylines off_reference = diff_pl(wall_centerlines, offset(reference_centerlines, float(tolerance)));
if (! excluded.empty())
off_reference = diff_pl(off_reference, excluded);
return total_length(off_reference);
}
// ORCA: only_one_wall_top - area covered by the given walls at their local widths.
static Polygons walls_footprint(const Arachne::VariableWidthLines &walls)
{
Polygons footprint;
for (const Arachne::ExtrusionLine &el : walls)
for (size_t i = 1; i < el.junctions.size(); ++ i) {
const Arachne::ExtrusionJunction &a = el.junctions[i - 1];
const Arachne::ExtrusionJunction &b = el.junctions[i];
const coord_t width = std::max(a.w, b.w);
if (width > 0)
append(footprint, offset(Polyline(a.p, b.p), float(width) / 2.f));
}
return union_(footprint);
}
void PerimeterGenerator::split_top_surfaces(const ExPolygons &orig_polygons, ExPolygons &top_fills, void PerimeterGenerator::split_top_surfaces(const ExPolygons &orig_polygons, ExPolygons &top_fills,
ExPolygons &non_top_polygons, ExPolygons &fill_clip) const { ExPolygons &non_top_polygons, ExPolygons &fill_clip) const {
// other perimeters // other perimeters
@@ -2546,44 +2599,90 @@ void PerimeterGenerator::process_arachne()
if (inner_loop_number >= 0) { if (inner_loop_number >= 0) {
assert(upper_slices != nullptr); assert(upper_slices != nullptr);
// Infill contour bounding box.
BoundingBox infill_contour_bbox = get_extents(infill_contour);
infill_contour_bbox.offset(SCALED_EPSILON);
coord_t perimeter_width = this->perimeter_flow.scaled_width(); coord_t perimeter_width = this->perimeter_flow.scaled_width();
// Get top ExPolygons from current infill contour. // Filter out areas that are too thin and expand top surface polygons a bit to hide the wall line.
Polygons upper_slices_clipped; // ORCA: skip if the top surface area is smaller than "min_width_top_surface"
if (object_config->interface_shells) { const float top_surface_min_width = std::max<float>(float(ext_perimeter_spacing) / 4.f + scaled<float>(0.00001), float(scale_(config->min_width_top_surface.get_abs_value(unscale_(perimeter_width)))) / 4.f);
auto upper_slicer_same_region = to_expolygons(this->upper_slices_same_region->surfaces);
upper_slices_clipped = ClipperUtils::clip_clipper_polygons_with_subject_bbox(upper_slicer_same_region, infill_contour_bbox);
} else
upper_slices_clipped = ClipperUtils::clip_clipper_polygons_with_subject_bbox(*upper_slices, infill_contour_bbox);
top_expolygons = diff_ex(infill_contour, upper_slices_clipped); // Get top ExPolygons from the given contour. uncovered reports whether the upper layer leaves any of the
// contour uncovered, before bridges and too thin areas are filtered out.
auto get_top_expolygons = [&](const ExPolygons &contour, bool &uncovered) {
// Contour bounding box.
BoundingBox contour_bbox = get_extents(contour);
contour_bbox.offset(SCALED_EPSILON);
Polygons upper_slices_clipped;
if (object_config->interface_shells) {
auto upper_slicer_same_region = to_expolygons(this->upper_slices_same_region->surfaces);
upper_slices_clipped = ClipperUtils::clip_clipper_polygons_with_subject_bbox(upper_slicer_same_region, contour_bbox);
} else
upper_slices_clipped = ClipperUtils::clip_clipper_polygons_with_subject_bbox(*upper_slices, contour_bbox);
ExPolygons top = diff_ex(contour, upper_slices_clipped);
uncovered = !top.empty();
if (top.empty())
return top;
if (!top_expolygons.empty()) {
if (lower_slices != nullptr) { if (lower_slices != nullptr) {
const float bridge_offset = float(std::max<coord_t>(ext_perimeter_spacing, perimeter_width)); const float bridge_offset = float(std::max<coord_t>(ext_perimeter_spacing, perimeter_width));
const Polygons lower_slices_clipped = ClipperUtils::clip_clipper_polygons_with_subject_bbox(*lower_slices, infill_contour_bbox); const Polygons lower_slices_clipped = ClipperUtils::clip_clipper_polygons_with_subject_bbox(*lower_slices, contour_bbox);
const ExPolygons current_slices_bridges = offset_ex(diff_ex(top_expolygons, lower_slices_clipped), bridge_offset); const ExPolygons current_slices_bridges = offset_ex(diff_ex(top, lower_slices_clipped), bridge_offset);
// Remove bridges from top surface polygons. // Remove bridges from top surface polygons.
top_expolygons = diff_ex(top_expolygons, current_slices_bridges); top = diff_ex(top, current_slices_bridges);
} }
// Filter out areas that are too thin and expand top surface polygons a bit to hide the wall line.
// ORCA: skip if the top surface area is smaller than "min_width_top_surface"
const float top_surface_min_width = std::max<float>(float(ext_perimeter_spacing) / 4.f + scaled<float>(0.00001), float(scale_(config->min_width_top_surface.get_abs_value(unscale_(perimeter_width)))) / 4.f);
// Shrink the polygon to remove the small areas, then expand it back out plus a maragin to hide the wall line a little. // Shrink the polygon to remove the small areas, then expand it back out plus a maragin to hide the wall line a little.
// ORCA: Expand the polygon with half the perimeter width in addition to the contracted amount, // ORCA: Expand the polygon with half the perimeter width in addition to the contracted amount,
// not the full perimeter width as PS does, to enable thin lettering to print on the top surface without nozzle collisions // not the full perimeter width as PS does, to enable thin lettering to print on the top surface without nozzle collisions
// due to thin lines being generated // due to thin lines being generated
top_expolygons = offset2_ex(top_expolygons, -top_surface_min_width, top_surface_min_width + float(perimeter_width * 0.85)); top = offset2_ex(top, -top_surface_min_width, top_surface_min_width + float(perimeter_width * 0.85));
// Get final top ExPolygons (bridges were excluded above, so they stay walled). // Get final top ExPolygons (bridges were excluded above, so they stay walled).
top_expolygons = intersection_ex(top_expolygons, infill_contour); return intersection_ex(top, contour);
};
// Walls with the full count, as generated when the single perimeter feature is disabled. Generated on first use.
std::vector<Arachne::VariableWidthLines> full_perimeters;
Polygons full_inner_contour;
bool full_perimeters_generated = false;
auto generate_full_perimeters = [&]() {
if (full_perimeters_generated)
return;
Arachne::WallToolPaths full_tool_paths(last_p, bead_width_0, perimeter_spacing, coord_t(inner_loop_number + 2), wall_0_inset, layer_height, input_params_tmp);
full_perimeters = full_tool_paths.getToolPaths();
full_inner_contour = full_tool_paths.getInnerContour();
full_perimeters_generated = true;
};
// ORCA: the single wall pass allows Arachne 2 beads across a wall, so it fills a wall narrower than 3 outer wall
// widths by widening both, where the full pass adds a middle bead. Over the top surface that is the intent;
// anywhere else it leaves no room for the inner walls. When the single wall pass's outer walls run away from
// the full pass's outside the top surface, take the full pass's outer walls and the area inside them instead.
// Walls closer than outer_wall_tolerance count as the same wall: a widened bead's centerline moves by half
// the width added, and only beads widened by more than twice the tolerance are looked for.
const coord_t outer_wall_tolerance = bead_width_0 / 10;
if (widest_bead(perimeters) > bead_width_0 + 2 * outer_wall_tolerance) {
// The single wall pass's inner contour where it widens no bead: inside nominal width outer walls.
const ExPolygons nominal_infill_contour = offset_ex(last, -float(bead_width_0 + wall_0_inset));
bool nominal_uncovered = false;
// Grown by an outer wall width to take in the outer walls bordering the top surface.
const ExPolygons top_zone = offset_ex(get_top_expolygons(nominal_infill_contour, nominal_uncovered), float(bead_width_0));
if (nominal_uncovered) {
generate_full_perimeters();
if (! full_perimeters.empty() && ! full_perimeters.front().empty() &&
length_off_reference(perimeters, full_perimeters.front(), top_zone, outer_wall_tolerance) > double(perimeter_width)) {
perimeters = { full_perimeters.front() };
infill_contour = diff_ex(nominal_infill_contour, walls_footprint(full_perimeters.front()), ApplySafetyOffset::Yes);
}
}
}
bool uncovered = false;
top_expolygons = get_top_expolygons(infill_contour, uncovered);
if (uncovered) {
// ORCA: onion the real region (inside the outer wall) so the remaining walls follow the actual // ORCA: onion the real region (inside the outer wall) so the remaining walls follow the actual
// geometry, then cut away the parts over the top surface. Re-onioning the non-top complement // geometry, then cut away the parts over the top surface. Re-onioning the non-top complement
// instead - the fallback when there is no top fill - walls the top/non-top interface and rings // instead - the fallback when there is no top fill - walls the top/non-top interface and rings
@@ -2612,11 +2711,11 @@ void PerimeterGenerator::process_arachne()
perimeters.insert(perimeters.end(), inner_perimeters.begin(), inner_perimeters.end()); perimeters.insert(perimeters.end(), inner_perimeters.begin(), inner_perimeters.end());
infill_contour = union_ex(top_expolygons, inner_wall_tool_paths.getInnerContour()); infill_contour = union_ex(top_expolygons, inner_wall_tool_paths.getInnerContour());
} else { } else {
// There is no top surface ExPolygon, so we call Arachne again with parameters // There is no top surface ExPolygon, so use the walls generated like when the single perimeter
// like when the single perimeter feature is disabled. // feature is disabled.
Arachne::WallToolPaths no_single_perimeter_tool_paths(last_p, bead_width_0, perimeter_spacing, coord_t(inner_loop_number + 2), wall_0_inset, layer_height, input_params_tmp); generate_full_perimeters();
perimeters = no_single_perimeter_tool_paths.getToolPaths(); perimeters = std::move(full_perimeters);
infill_contour = union_ex(no_single_perimeter_tool_paths.getInnerContour()); infill_contour = union_ex(full_inner_contour);
} }
} }
//PS //PS
+1 -1
View File
@@ -1580,7 +1580,7 @@ bool GLVolumeCollection::check_outside_state(const BuildVolume &build_volume, Mo
{ {
std::vector<int> result_filaments; std::vector<int> result_filaments;
//result_filaments.reserve(conflict_filaments.size()); //result_filaments.reserve(conflict_filaments.size());
std::set_intersection (conflict_filament_vector.begin(), conflict_filament_vector.end(), unprintable_filament_vec[index].begin(), unprintable_filament_vec[index].end(), insert_iterator<vector<int>>(result_filaments, result_filaments.begin())); std::set_intersection (conflict_filament_vector.begin(), conflict_filament_vector.end(), unprintable_filament_vec[index].begin(), unprintable_filament_vec[index].end(), std::insert_iterator<std::vector<int>>(result_filaments, result_filaments.begin()));
conflict_filament_vector = result_filaments; conflict_filament_vector = result_filaments;
} }
} }
+2 -2
View File
@@ -974,8 +974,8 @@ bool AMSMaterialsSetting::Show(bool show)
static void _collect_filament_info(const wxString& shown_name, static void _collect_filament_info(const wxString& shown_name,
const Preset& filament, const Preset& filament,
unordered_map<wxString, wxString>& query_filament_vendors, std::unordered_map<wxString, wxString>& query_filament_vendors,
unordered_map<wxString, wxString>& query_filament_types) std::unordered_map<wxString, wxString>& query_filament_types)
{ {
query_filament_vendors[shown_name] = filament.config.get_filament_vendor(); query_filament_vendors[shown_name] = filament.config.get_filament_vendor();
query_filament_types[shown_name] = filament.config.get_filament_type(); query_filament_types[shown_name] = filament.config.get_filament_type();
+3 -3
View File
@@ -855,14 +855,14 @@ void AuxiliaryPanel::Split(const std::string &src, const std::string &separator,
dest.clear(); dest.clear();
index = str.find_first_of(separator, start); index = str.find_first_of(separator, start);
do { do {
if (index != string::npos) { if (index != std::string::npos) {
substring = str.substr(start, index - start); substring = str.substr(start, index - start);
dest.push_back(substring); dest.push_back(substring);
start = index + separator.size(); start = index + separator.size();
index = str.find(separator, start); index = str.find(separator, start);
if (start == string::npos) break; if (start == std::string::npos) break;
} }
} while (index != string::npos); } while (index != std::string::npos);
// the last part // the last part
substring = str.substr(start); substring = str.substr(start);
@@ -1307,7 +1307,7 @@ void CalibrationPresetPage::stripWhiteSpace(std::string& str)
{ {
if (str == "") { return; } if (str == "") { return; }
string::iterator cur_it; std::string::iterator cur_it;
cur_it = str.begin(); cur_it = str.begin();
while (cur_it != str.end()) { while (cur_it != str.end()) {
@@ -2597,7 +2597,7 @@ void CalibrationPresetPage::update_multi_extruder_filament_combobox(const std::s
int ams_id_int = 0; int ams_id_int = 0;
try { try {
if (!ams_id.empty()) if (!ams_id.empty())
ams_id_int = stoi(ams_id.c_str()); ams_id_int = std::stoi(ams_id.c_str());
} catch (...) {} } catch (...) {}
@@ -2685,7 +2685,7 @@ void CalibrationPresetPage::update_filament_combobox(std::string ams_id)
int ams_id_int = 0; int ams_id_int = 0;
try { try {
if (!ams_id.empty()) if (!ams_id.empty())
ams_id_int = stoi(ams_id.c_str()); ams_id_int = std::stoi(ams_id.c_str());
} catch (...) {} } catch (...) {}
+4 -4
View File
@@ -345,7 +345,7 @@ static std::string get_curr_timestmp()
// return timestampString; // return timestampString;
} }
static void get_filament_compatible_printer(Preset* preset, vector<std::string>& printers) static void get_filament_compatible_printer(Preset* preset, std::vector<std::string>& printers)
{ {
auto compatible_printers = dynamic_cast<ConfigOptionStrings *>(preset->config.option("compatible_printers")); auto compatible_printers = dynamic_cast<ConfigOptionStrings *>(preset->config.option("compatible_printers"));
if (compatible_printers == nullptr) return; if (compatible_printers == nullptr) return;
@@ -1579,7 +1579,7 @@ void CreateFilamentPresetDialog::sort_printer_by_nozzle(std::vector<std::pair<st
{ {
std::unordered_map<std::string, float> nozzle_diameter = nozzle_diameter_map; std::unordered_map<std::string, float> nozzle_diameter = nozzle_diameter_map;
std::sort(printer_name_to_filament_preset.begin(), printer_name_to_filament_preset.end(), std::sort(printer_name_to_filament_preset.begin(), printer_name_to_filament_preset.end(),
[&nozzle_diameter](const std::pair<string, T> &a, const std::pair<string, T> &b) { [&nozzle_diameter](const std::pair<std::string, T> &a, const std::pair<std::string, T> &b) {
size_t nozzle_index_a = a.first.find(" nozzle"); size_t nozzle_index_a = a.first.find(" nozzle");
size_t nozzle_index_b = b.first.find(" nozzle"); size_t nozzle_index_b = b.first.find(" nozzle");
if (nozzle_index_a == std::string::npos || nozzle_index_b == std::string::npos) return a.first < b.first; if (nozzle_index_a == std::string::npos || nozzle_index_b == std::string::npos) return a.first < b.first;
@@ -3141,7 +3141,7 @@ void CreatePrinterPresetDialog::set_current_visible_printer()
wxArrayString CreatePrinterPresetDialog::printer_preset_sort_with_nozzle_diameter(const VendorProfile &vendor_profile, float nozzle_diameter) wxArrayString CreatePrinterPresetDialog::printer_preset_sort_with_nozzle_diameter(const VendorProfile &vendor_profile, float nozzle_diameter)
{ {
std::vector<pair<float, std::string>> preset_sort; std::vector<std::pair<float, std::string>> preset_sort;
auto get_nozzle_size_for_printer_model = [this](const std::string & model_name) -> size_t { auto get_nozzle_size_for_printer_model = [this](const std::string & model_name) -> size_t {
auto iter = m_printer_name_to_preset.find(model_name); auto iter = m_printer_name_to_preset.find(model_name);
@@ -4962,7 +4962,7 @@ wxBoxSizer *CreatePresetForPrinterDialog::create_selected_filament_preset_sizer(
m_selected_printer->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &e) { m_selected_printer->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &e) {
wxString printer_name = m_selected_printer->GetStringSelection(); wxString printer_name = m_selected_printer->GetStringSelection();
std::unordered_map<string, std::vector<std::shared_ptr<Preset>>>::iterator filament_iter = m_printer_compatible_filament_presets.find(into_u8(printer_name)); std::unordered_map<std::string, std::vector<std::shared_ptr<Preset>>>::iterator filament_iter = m_printer_compatible_filament_presets.find(into_u8(printer_name));
if (m_printer_compatible_filament_presets.end() != filament_iter) { if (m_printer_compatible_filament_presets.end() != filament_iter) {
filament_choice_to_filament_preset.clear(); filament_choice_to_filament_preset.clear();
wxArrayString filament_choices; wxArrayString filament_choices;
+1 -1
View File
@@ -161,7 +161,7 @@ DevAms::~DevAms()
m_trays.clear(); m_trays.clear();
} }
static unordered_map<int, wxString> s_ams_display_formats = { static std::unordered_map<int, wxString> s_ams_display_formats = {
{DevAms::AMS, "AMS-%d"}, {DevAms::AMS, "AMS-%d"},
{DevAms::AMS_LITE, "AMS Lite-%d"}, {DevAms::AMS_LITE, "AMS Lite-%d"},
{DevAms::N3F, "AMS 2 PRO-%d"}, {DevAms::N3F, "AMS 2 PRO-%d"},
+3 -3
View File
@@ -51,10 +51,10 @@ public:
bool isCuttingModule() const { return product_name.Contains("Cutting Module"); } bool isCuttingModule() const { return product_name.Contains("Cutting Module"); }
bool isRotary() const { return product_name.Contains("Rotary"); }// Rotary Attachment bool isRotary() const { return product_name.Contains("Rotary"); }// Rotary Attachment
bool isExtinguishSystem() const { return product_name.Contains("Extinguishing System"); }// Auto Fire Extinguishing System bool isExtinguishSystem() const { return product_name.Contains("Extinguishing System"); }// Auto Fire Extinguishing System
bool isWTM() const { return name.find("wtm") != string::npos; } // nozzle bool isWTM() const { return name.find("wtm") != std::string::npos; } // nozzle
bool isExhaustFan() const { return product_name.Contains("Exhaust Fan"); } bool isExhaustFan() const { return product_name.Contains("Exhaust Fan"); }
bool isHmshub() const { return product_name.find("Filament Buffer") != string::npos; } bool isHmshub() const { return product_name.find("Filament Buffer") != std::string::npos; }
bool isFilaTrackSwitch() const { return product_name.find("Filament Track") != string::npos; } bool isFilaTrackSwitch() const { return product_name.find("Filament Track") != std::string::npos; }
}; };
@@ -251,7 +251,7 @@ int DevNozzleMappingCtrl::CtrlGetAutoNozzleMappingV1(Slic3r::GUI::Plater* plater
void DevNozzleMappingCtrl::ParseAutoNozzleMapping(const json& print_jj) void DevNozzleMappingCtrl::ParseAutoNozzleMapping(const json& print_jj)
{ {
if (print_jj.contains("command") && print_jj["command"].get<string>() == "get_auto_nozzle_mapping") { if (print_jj.contains("command") && print_jj["command"].get<std::string>() == "get_auto_nozzle_mapping") {
if (print_jj.contains("sequence_id") && print_jj["sequence_id"] == m_sequence_id) { if (print_jj.contains("sequence_id") && print_jj["sequence_id"] == m_sequence_id) {
Clear(); Clear();
DevJsonValParser::ParseVal(print_jj, "result", m_result); DevJsonValParser::ParseVal(print_jj, "result", m_result);
@@ -424,7 +424,7 @@ void DevNozzleSystem::ClearNozzles()
// ---- parsing ---------------------------------------------------------------------------------------- // ---- parsing ----------------------------------------------------------------------------------------
static unordered_map<string, NozzleFlowType> _str2_nozzle_flow_type = { static std::unordered_map<std::string, NozzleFlowType> _str2_nozzle_flow_type = {
{"S", NozzleFlowType::S_FLOW}, {"S", NozzleFlowType::S_FLOW},
{"H", NozzleFlowType::H_FLOW}, {"H", NozzleFlowType::H_FLOW},
{"A", NozzleFlowType::S_FLOW}, {"A", NozzleFlowType::S_FLOW},
@@ -434,7 +434,7 @@ static unordered_map<string, NozzleFlowType> _str2_nozzle_flow_type = {
{"B", NozzleFlowType::E_FLOW}, // E3D High Flow -> nvtE3DHighFlow {"B", NozzleFlowType::E_FLOW}, // E3D High Flow -> nvtE3DHighFlow
}; };
static unordered_map<string, NozzleType> _str2_nozzle_type = { static std::unordered_map<std::string, NozzleType> _str2_nozzle_type = {
{"00", NozzleType::ntStainlessSteel}, {"00", NozzleType::ntStainlessSteel},
{"01", NozzleType::ntHardenedSteel}, {"01", NozzleType::ntHardenedSteel},
{"05", NozzleType::ntTungstenCarbide} {"05", NozzleType::ntTungstenCarbide}
+1 -1
View File
@@ -368,7 +368,7 @@ wxString DeviceErrorDialog::parse_error_level(int error_code)
} }
} }
static const std::unordered_set<string> s_jump_liveview_error_codes = { "0300-8003", "0300-8002", "0300-800A"}; static const std::unordered_set<std::string> s_jump_liveview_error_codes = { "0300-8003", "0300-8002", "0300-800A"};
wxString DeviceErrorDialog::show_error_code(int error_code) wxString DeviceErrorDialog::show_error_code(int error_code)
{ {
if (m_error_code == error_code) { return wxEmptyString;} if (m_error_code == error_code) { return wxEmptyString;}
+2 -2
View File
@@ -3029,7 +3029,7 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_
uint64_t t_utc = j.value("t_utc", 0ULL); uint64_t t_utc = j.value("t_utc", 0ULL);
if (t_utc > 0) { if (t_utc > 0) {
last_utc_time = std::chrono::system_clock::time_point(t_utc * 1ms); last_utc_time = std::chrono::system_clock::time_point(t_utc * std::chrono::milliseconds(1));
std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
auto millisec_since_epoch = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count(); auto millisec_since_epoch = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count();
auto delay = millisec_since_epoch - t_utc; //ms auto delay = millisec_since_epoch - t_utc; //ms
@@ -3103,7 +3103,7 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_
DevFirmwareVersionInfo ver_info; DevFirmwareVersionInfo ver_info;
ver_info.name = (*it)["name"].get<std::string>(); ver_info.name = (*it)["name"].get<std::string>();
if ((*it).contains("product_name")) if ((*it).contains("product_name"))
ver_info.product_name = wxString::FromUTF8((*it)["product_name"].get<string>()); ver_info.product_name = wxString::FromUTF8((*it)["product_name"].get<std::string>());
if ((*it).contains("sw_ver")) if ((*it).contains("sw_ver"))
ver_info.sw_ver = (*it)["sw_ver"].get<std::string>(); ver_info.sw_ver = (*it)["sw_ver"].get<std::string>();
if ((*it).contains("sw_new_ver")) if ((*it).contains("sw_new_ver"))
+3 -3
View File
@@ -294,8 +294,8 @@ wxDataViewItem EditGCodeDialog::add_presets_placeholders()
// Orca: create subgroups from the pages of the tabs // Orca: create subgroups from the pages of the tabs
auto init_from_tab = [this, full_config](wxDataViewItem parent, Tab* tab, const set<string>& preset_keys){ auto init_from_tab = [this, full_config](wxDataViewItem parent, Tab* tab, const std::set<std::string>& preset_keys){
set extra_keys(preset_keys); std::set extra_keys(preset_keys);
for (const auto& page : tab->m_pages) { for (const auto& page : tab->m_pages) {
// ORCA: Pull icons from tabs for subgroups, icons are hidden on tabs // ORCA: Pull icons from tabs for subgroups, icons are hidden on tabs
std::string icon_name = "empty"; // use empty icon if not defined std::string icon_name = "empty"; // use empty icon if not defined
@@ -549,7 +549,7 @@ void ParamsNode::RefreshSearch(const wxString& search_text)
if (GetEnabledChildren().empty()) if (GetEnabledChildren().empty())
if (auto pos = text.find(search_text); IsParamNode() && pos != wxString::npos) { if (auto pos = text.find(search_text); IsParamNode() && pos != wxString::npos) {
m_highlight_index = make_unique<pair<int, int>>(pos, search_text.Len()); m_highlight_index = make_unique<std::pair<int, int>>(pos, search_text.Len());
Enable(); Enable();
} else { } else {
Disable(); Disable();
+4 -4
View File
@@ -702,11 +702,11 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true
set_value(str, true); set_value(str, true);
} }
} else if (m_opt.opt_key == "sparse_infill_rotate_template" || m_opt.opt_key == "solid_infill_rotate_template") { } else if (m_opt.opt_key == "sparse_infill_rotate_template" || m_opt.opt_key == "solid_infill_rotate_template") {
string ustr(str.utf8_string()); std::string ustr(str.utf8_string());
if (!ConfigOptionFloats::validate_string(ustr)) { if (!ConfigOptionFloats::validate_string(ustr)) {
string v; std::string v;
std::smatch match; std::smatch match;
string ps = (m_opt.opt_key == "sparse_infill_rotate_template") ? std::string ps = (m_opt.opt_key == "sparse_infill_rotate_template") ?
u8"[BT][!]?|[#][\\d]+[!]?|[+\\-]?[\\d.]+[%]?[*]?[\\d]*[/NnZz$LlUuQq~^|#]?[+\\-]?[\\d.]*[%#\'\"cm]?[m]?[BT]?[!*]?" : u8"[BT][!]?|[#][\\d]+[!]?|[+\\-]?[\\d.]+[%]?[*]?[\\d]*[/NnZz$LlUuQq~^|#]?[+\\-]?[\\d.]*[%#\'\"cm]?[m]?[BT]?[!*]?" :
u8"[#][\\d]+[!]?|[+\\-]?[\\d.]+[%]?[*]?[\\d]*[/NnZz$LlUuQq~^|#]?[+\\-]?[\\d.]*[%#\'\"cm]?[m]?[!*]?"; u8"[#][\\d]+[!]?|[+\\-]?[\\d.]+[%]?[*]?[\\d]*[/NnZz$LlUuQq~^|#]?[+\\-]?[\\d.]*[%#\'\"cm]?[m]?[!*]?";
@@ -729,7 +729,7 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true
} }
break; break;
} else if (m_opt.opt_key == "extra_solid_infills") { } else if (m_opt.opt_key == "extra_solid_infills") {
string ustr(str.utf8_string()); std::string ustr(str.utf8_string());
// New rule: accept either interval form (N or N#K) or explicit list (e.g. 1,7,9), with optional quotes. // New rule: accept either interval form (N or N#K) or explicit list (e.g. 1,7,9), with optional quotes.
const std::regex rx_interval(u8R"(^\s*['"]?\s*\d+\s*(?:#\s*\d*)?\s*['"]?\s*$)"); const std::regex rx_interval(u8R"(^\s*['"]?\s*\d+\s*(?:#\s*\d*)?\s*['"]?\s*$)");
// List entries may be plain numbers or number with optional #K count, e.g., 5, 9#2, 18 // List entries may be plain numbers or number with optional #K count, e.g., 5, 9#2, 18
+7 -7
View File
@@ -2816,7 +2816,7 @@ void GCodeViewer::render_all_plates_stats(const std::vector<const GCodeProcessor
} }
return ret; return ret;
}; };
auto calculate_offsets = [max_width, window_padding](const std::vector<std::pair<std::string, std::vector<::string>>>& title_columns, float extra_size = 0.0f) { auto calculate_offsets = [max_width, window_padding](const std::vector<std::pair<std::string, std::vector<std::string>>>& title_columns, float extra_size = 0.0f) {
const ImGuiStyle& style = ImGui::GetStyle(); const ImGuiStyle& style = ImGui::GetStyle();
std::vector<float> offsets; std::vector<float> offsets;
offsets.push_back(max_width(title_columns[0].second, title_columns[0].first, extra_size) + 3.0f * style.ItemSpacing.x + style.WindowPadding.x); offsets.push_back(max_width(title_columns[0].second, title_columns[0].first, extra_size) + 3.0f * style.ItemSpacing.x + style.WindowPadding.x);
@@ -2963,7 +2963,7 @@ void GCodeViewer::render_all_plates_stats(const std::vector<const GCodeProcessor
} }
::sprintf(buff, "%.2f", longest_str); ::sprintf(buff, "%.2f", longest_str);
std::vector<std::pair<std::string, std::vector<::string>>> title_columns; std::vector<std::pair<std::string, std::vector<std::string>>> title_columns;
if (displayed_columns & ColumnData::Model) { if (displayed_columns & ColumnData::Model) {
title_columns.push_back({ _u8L("Filament"), {""} }); title_columns.push_back({ _u8L("Filament"), {""} });
title_columns.push_back({ _u8L("Model"), {buff} }); title_columns.push_back({ _u8L("Model"), {buff} });
@@ -3184,7 +3184,7 @@ void GCodeViewer::render_legend_color_arr_recommen(float window_padding)
float ams_item_height = 0; float ams_item_height = 0;
float filament_group_item_align_width = 0; float filament_group_item_align_width = 0;
{ {
float three_words_width = imgui.calc_text_size("ABC"sv).x; float three_words_width = imgui.calc_text_size(std::string_view("ABC")).x;
const int line_capacity = 4; const int line_capacity = 4;
for (const auto& extruder_filaments : {m_left_extruder_filament,m_right_extruder_filament }) for (const auto& extruder_filaments : {m_left_extruder_filament,m_right_extruder_filament })
@@ -3195,8 +3195,8 @@ void GCodeViewer::render_legend_color_arr_recommen(float window_padding)
for (int j = idx; j < extruder_filaments.size() && j < idx + line_capacity; ++j) { for (int j = idx; j < extruder_filaments.size() && j < idx + line_capacity; ++j) {
auto text_info = imgui.calculate_filament_group_text_size(get_filament_display_type(extruder_filaments[j])); auto text_info = imgui.calculate_filament_group_text_size(get_filament_display_type(extruder_filaments[j]));
auto text_size = std::get<0>(text_info); auto text_size = std::get<0>(text_info);
filament_group_item_align_width = max(filament_group_item_align_width, text_size.x); filament_group_item_align_width = std::max(filament_group_item_align_width, text_size.x);
text_line_height = max(text_line_height, text_size.y); text_line_height = std::max(text_line_height, text_size.y);
} }
container_height += (three_words_width * 1.3f + text_line_height ); container_height += (three_words_width * 1.3f + text_line_height );
} }
@@ -3589,7 +3589,7 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv
return ret; return ret;
}; };
auto calculate_offsets = [max_width, this](const std::vector<std::pair<std::string, std::vector<::string>>>& title_columns, float extra_size = 0.0f) { auto calculate_offsets = [max_width, this](const std::vector<std::pair<std::string, std::vector<std::string>>>& title_columns, float extra_size = 0.0f) {
const ImGuiStyle& style = ImGui::GetStyle(); const ImGuiStyle& style = ImGui::GetStyle();
std::vector<float> offsets; std::vector<float> offsets;
// ORCA increase spacing for more readable format. Using direct number requires much less code change in here. GetTextLineHeight for additional spacing for icon_size // ORCA increase spacing for more readable format. Using direct number requires much less code change in here. GetTextLineHeight for additional spacing for icon_size
@@ -4014,7 +4014,7 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv
total_filaments.push_back(buffer); total_filaments.push_back(buffer);
std::vector<std::pair<std::string, std::vector<::string>>> title_columns; std::vector<std::pair<std::string, std::vector<std::string>>> title_columns;
if (displayed_columns & ColumnData::Model) { if (displayed_columns & ColumnData::Model) {
title_columns.push_back({ _u8L("Filament"), {""} }); title_columns.push_back({ _u8L("Filament"), {""} });
title_columns.push_back({ _u8L("Model"), total_filaments }); title_columns.push_back({ _u8L("Model"), total_filaments });
+10 -3
View File
@@ -7970,9 +7970,16 @@ void GLCanvas3D::_render_fps_overlay(int fps) const
const float margin = 10.0f * get_scale(); const float margin = 10.0f * get_scale();
const ImVec2 display_size = ImGui::GetIO().DisplaySize; const ImVec2 display_size = ImGui::GetIO().DisplaySize;
ImVec2 pos(display_size.x - margin, margin); ImVec2 pos(display_size.x - margin, margin);
// Last frame's size; zero until the overlay has been shown once.
const ImGuiWindow* self = ImGui::FindWindowByName("###fps_overlay");
const float left = pos.x - (self != nullptr ? self->Size.x : 0.0f);
// The Preview legend takes the top-right corner. // The Preview legend takes the top-right corner.
if (const ImGuiWindow* legend = ImGui::FindWindowByName("Legend"); m_canvas_type == ECanvasType::CanvasPreview && legend != nullptr && legend->Active) if (const ImGuiWindow* legend = ImGui::FindWindowByName("Legend"); m_canvas_type == ECanvasType::CanvasPreview && legend != nullptr && legend->Active)
pos = ImVec2(legend->Pos.x - margin, legend->Pos.y); pos = ImVec2(legend->Pos.x - margin, legend->Pos.y);
// The toolbar row can reach the corner on a narrow canvas; stack the overlay below it then.
else if (m_main_toolbar.is_enabled() &&
get_main_toolbar_offset() + m_main_toolbar.get_width() + m_separator_toolbar.get_width() + m_gizmos.get_scaled_total_width() + m_assemble_view_toolbar.get_width() > left)
pos.y = std::max(m_main_toolbar.get_height(), m_gizmos.get_scaled_total_height()) + margin;
ImGui::SetNextWindowPos(pos, ImGuiCond_Always, ImVec2(1.0f, 0.0f)); ImGui::SetNextWindowPos(pos, ImGuiCond_Always, ImVec2(1.0f, 0.0f));
ImGui::SetNextWindowBgAlpha(0.35f); ImGui::SetNextWindowBgAlpha(0.35f);
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 8.0f * get_scale()); ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 8.0f * get_scale());
@@ -10553,7 +10560,7 @@ float GLCanvas3D::_render_assembly_tooltip_button(ImGuiWrapper* imgui_wrapper) c
float same_line_width = button_size.x * 1.8; // with an space size float same_line_width = button_size.x * 1.8; // with an space size
ImGui::SameLine(same_line_width); ImGui::SameLine(same_line_width);
same_line_width = imgui_wrapper->calc_text_size("|"sv).x + same_line_width + imgui_wrapper->calc_text_size(" "sv).x; same_line_width = imgui_wrapper->calc_text_size(std::string_view("|")).x + same_line_width + imgui_wrapper->calc_text_size(std::string_view(" ")).x;
imgui_wrapper->text_colored(ImGuiWrapper::COL_ACTIVE, "|"); imgui_wrapper->text_colored(ImGuiWrapper::COL_ACTIVE, "|");
ImGui::SameLine(same_line_width); ImGui::SameLine(same_line_width);
@@ -10579,7 +10586,7 @@ void GLCanvas3D::_render_assemble_control()
const float text_padding = 7.0f; const float text_padding = 7.0f;
const float slider_width = 60.0f; const float slider_width = 60.0f;
const float value_size = imgui->calc_text_size("3.00"sv).x + text_padding * 2; const float value_size = imgui->calc_text_size(std::string_view("3.00")).x + text_padding * 2;
const float item_spacing = imgui->get_item_spacing().x; const float item_spacing = imgui->get_item_spacing().x;
ImVec2 window_padding = ImGui::GetStyle().WindowPadding; ImVec2 window_padding = ImGui::GetStyle().WindowPadding;
@@ -10616,7 +10623,7 @@ void GLCanvas3D::_render_assemble_control()
int selection_idx = m_selection.get_volume_selection_mode() == Selection::Instance ? 0 : 1; int selection_idx = m_selection.get_volume_selection_mode() == Selection::Instance ? 0 : 1;
auto label = _u8L("Selection Mode") + ":" ; auto label = _u8L("Selection Mode") + ":" ;
auto label_width = imgui->calc_text_size(label).x ; auto label_width = imgui->calc_text_size(label).x ;
auto item_width = imgui->calc_text_size(_u8L("Object")).x * 2.5 + imgui->calc_text_size("xx"sv).x+ item_spacing; auto item_width = imgui->calc_text_size(_u8L("Object")).x * 2.5 + imgui->calc_text_size(std::string_view("xx")).x+ item_spacing;
//render imgui //render imgui
ImGui::AlignTextToFramePadding(); ImGui::AlignTextToFramePadding();
ImGui::PushItemWidth(label_width); ImGui::PushItemWidth(label_width);
+3 -3
View File
@@ -9035,7 +9035,7 @@ std::map<std::string, std::string> GUI_App::get_delete_cache_presets_lock()
void GUI_App::process_delete_presets() void GUI_App::process_delete_presets()
{ {
std::map<string, string> delete_cache_presets = get_delete_cache_presets_lock(); std::map<std::string, std::string> delete_cache_presets = get_delete_cache_presets_lock();
for (auto it = delete_cache_presets.begin(); it != delete_cache_presets.end();) { for (auto it = delete_cache_presets.begin(); it != delete_cache_presets.end();) {
if (it->first.empty()) continue; if (it->first.empty()) continue;
std::string del_setting_id = it->first; std::string del_setting_id = it->first;
@@ -10063,7 +10063,7 @@ bool is_soluble_filament(int extruder_id)
return support_option->get_at(0); return support_option->get_at(0);
}; };
bool has_filaments(const std::vector<string>& model_filaments) { bool has_filaments(const std::vector<std::string>& model_filaments) {
auto &filament_presets = Slic3r::GUI::wxGetApp().preset_bundle->filament_presets; auto &filament_presets = Slic3r::GUI::wxGetApp().preset_bundle->filament_presets;
if (!Slic3r::GUI::wxGetApp().plater()) return false; if (!Slic3r::GUI::wxGetApp().plater()) return false;
auto model_objects = Slic3r::GUI::wxGetApp().plater()->model().objects; auto model_objects = Slic3r::GUI::wxGetApp().plater()->model().objects;
@@ -10098,7 +10098,7 @@ bool is_support_filament(int extruder_id, bool strict_check)
Slic3r::ConfigOptionBools *support_option = dynamic_cast<Slic3r::ConfigOptionBools *>(filament->config.option("filament_is_support")); Slic3r::ConfigOptionBools *support_option = dynamic_cast<Slic3r::ConfigOptionBools *>(filament->config.option("filament_is_support"));
if(!strict_check &&(filament_type == "PETG" || filament_type == "PLA")) { if(!strict_check &&(filament_type == "PETG" || filament_type == "PLA")) {
std::vector<string> model_filaments; std::vector<std::string> model_filaments;
if (filament_type == "PETG") if (filament_type == "PETG")
model_filaments.emplace_back("PLA"); model_filaments.emplace_back("PLA");
else { else {
+2 -2
View File
@@ -1108,7 +1108,7 @@ void ObjectList::update_name_column_width() const
} }
} }
GetColumn(colName)->SetWidth(max(0, client_size.x - (others_width)*em)); GetColumn(colName)->SetWidth(std::max(0, client_size.x - (others_width)*em));
} }
void ObjectList::set_filament_column_hidden(const bool hide) const void ObjectList::set_filament_column_hidden(const bool hide) const
@@ -3970,7 +3970,7 @@ wxDataViewItem ObjectList::add_settings_item(wxDataViewItem parent_item, const D
if (config->opt_float("layer_height") == object_cfg->opt_float("layer_height")) { if (config->opt_float("layer_height") == object_cfg->opt_float("layer_height")) {
SettingsFactory::Bundle new_cat_options; SettingsFactory::Bundle new_cat_options;
for (auto cat_opt : cat_options) { for (auto cat_opt : cat_options) {
std::vector<string> temp; std::vector<std::string> temp;
for (auto value : cat_opt.second) { for (auto value : cat_opt.second) {
if (value != "layer_height") if (value != "layer_height")
temp.push_back(value); temp.push_back(value);
+1 -1
View File
@@ -3651,7 +3651,7 @@ void GLGizmoCut3D::perform_cut(const Selection& selection)
// model_name failing reason // model_name failing reason
std::vector<std::pair<std::string, std::string>> failed_models; std::vector<std::pair<std::string, std::string>> failed_models;
auto plater = wxGetApp().plater(); auto plater = wxGetApp().plater();
auto fix_and_update_progress = [keep_painting](ModelObject *model_object, const int vol_idx, const string &model_name, ProgressDialog &progress_dlg, auto fix_and_update_progress = [keep_painting](ModelObject *model_object, const int vol_idx, const std::string &model_name, ProgressDialog &progress_dlg,
std::vector<std::string> &succes_models, std::vector<std::pair<std::string, std::string>> &failed_models) { std::vector<std::string> &succes_models, std::vector<std::pair<std::string, std::string>> &failed_models) {
wxString msg = _L("Repairing model object"); wxString msg = _L("Repairing model object");
msg += ": " + from_u8(model_name) + "\n"; msg += ": " + from_u8(model_name) + "\n";
@@ -801,7 +801,7 @@ void GizmoObjectManipulation::do_render_move_window(ImGuiWrapper *imgui_wrapper,
imgui_wrapper->calc_text_size(_L("World")).x, imgui_wrapper->calc_text_size(_L("World")).x,
imgui_wrapper->calc_text_size(_L("Object")).x, imgui_wrapper->calc_text_size(_L("Object")).x,
imgui_wrapper->calc_text_size(_L("Part")).x imgui_wrapper->calc_text_size(_L("Part")).x
}) + imgui_wrapper->calc_text_size("xxx"sv).x + imgui_wrapper->scaled(3.5f); }) + imgui_wrapper->calc_text_size(std::string_view("xxx")).x + imgui_wrapper->scaled(3.5f);
float label_max = std::max({ float label_max = std::max({
imgui_wrapper->calc_text_size(_L("Position")).x, imgui_wrapper->calc_text_size(_L("Position")).x,
imgui_wrapper->calc_text_size(_L("Relative")).x imgui_wrapper->calc_text_size(_L("Relative")).x
@@ -1181,7 +1181,7 @@ void GizmoObjectManipulation::do_render_scale_input_window(ImGuiWrapper* imgui_w
imgui_wrapper->calc_text_size(_L("World")).x, imgui_wrapper->calc_text_size(_L("World")).x,
imgui_wrapper->calc_text_size(_L("Object")).x, imgui_wrapper->calc_text_size(_L("Object")).x,
imgui_wrapper->calc_text_size(_L("Part")).x imgui_wrapper->calc_text_size(_L("Part")).x
}) + imgui_wrapper->calc_text_size("xxx"sv).x + imgui_wrapper->scaled(3.5f); }) + imgui_wrapper->calc_text_size(std::string_view("xxx")).x + imgui_wrapper->scaled(3.5f);
float label_max = std::max({ float label_max = std::max({
imgui_wrapper->calc_text_size(_L_CONTEXT("Scale", "Noun")).x, imgui_wrapper->calc_text_size(_L_CONTEXT("Scale", "Noun")).x,
imgui_wrapper->calc_text_size(_L("Size")).x imgui_wrapper->calc_text_size(_L("Size")).x
+7 -7
View File
@@ -32,7 +32,7 @@ static const char* HMS_LOCAL_IMG_PATH = "hms/local_image";
// the local HMS info // the local HMS info
// Orca: dev-id-type set trimmed to the devices Orca ships local HMS images for // Orca: dev-id-type set trimmed to the devices Orca ships local HMS images for
static unordered_set<string> package_dev_id_types {"094", "239", "093", "22E"}; static std::unordered_set<std::string> package_dev_id_types {"094", "239", "093", "22E"};
// Orca: HMS should be disabled when stealth mode is on or networking is not installed // Orca: HMS should be disabled when stealth mode is on or networking is not installed
static bool should_disable_hms() static bool should_disable_hms()
@@ -344,17 +344,17 @@ wxString HMSQuery::query_hms_msg(const std::string& dev_id, const std::string& l
return _query_hms_msg(dev_id.substr(0, 3), long_error_code, lang_code); return _query_hms_msg(dev_id.substr(0, 3), long_error_code, lang_code);
} }
string HMSQuery::get_dev_id_type(const MachineObject* obj) const std::string HMSQuery::get_dev_id_type(const MachineObject* obj) const
{ {
if (obj) if (obj)
{ {
return obj->get_dev_id().substr(0, 3); return obj->get_dev_id().substr(0, 3);
} }
return string(); return std::string();
} }
wxString HMSQuery::_query_hms_msg(const string& dev_id_type, const string& long_error_code, const string& lang_code) wxString HMSQuery::_query_hms_msg(const std::string& dev_id_type, const std::string& long_error_code, const std::string& lang_code)
{ {
if (long_error_code.empty()) if (long_error_code.empty())
{ {
@@ -425,9 +425,9 @@ wxString HMSQuery::_query_hms_msg(const string& dev_id_type, const string& long_
return wxEmptyString; return wxEmptyString;
} }
bool HMSQuery::_is_internal_error(const string &dev_id_type, bool HMSQuery::_is_internal_error(const std::string &dev_id_type,
const string &error_code, const std::string &error_code,
const string &lang_code) const std::string &lang_code)
{ {
init_hms_info(dev_id_type); init_hms_info(dev_id_type);
auto iter = m_hms_info_jsons.find(dev_id_type); auto iter = m_hms_info_jsons.find(dev_id_type);
+1 -1
View File
@@ -1405,7 +1405,7 @@ void IMSlider::render_input_custom_gcode(std::string custom_gcode)
} }
void IMSlider::do_go_to_layer(size_t layer_number) { void IMSlider::do_go_to_layer(size_t layer_number) {
layer_number = clamp((int)layer_number, m_min_value, m_max_value); layer_number = std::clamp((int)layer_number, m_min_value, m_max_value);
GetSelection() == ssLower ? SetLowerValue(layer_number) : SetHigherValue(layer_number); GetSelection() == ssLower ? SetLowerValue(layer_number) : SetHigherValue(layer_number);
} }
+1 -1
View File
@@ -334,7 +334,7 @@ void PrintJob::process(Ctl &ctl)
auto origin_profile_id = model_info->metadata_items.find(BBL_DESIGNER_PROFILE_ID_TAG); auto origin_profile_id = model_info->metadata_items.find(BBL_DESIGNER_PROFILE_ID_TAG);
if (origin_profile_id != model_info->metadata_items.end()) { if (origin_profile_id != model_info->metadata_items.end()) {
try { try {
params.origin_profile_id = stoi(origin_profile_id->second.c_str()); params.origin_profile_id = std::stoi(origin_profile_id->second.c_str());
} }
catch(...) {} catch(...) {}
} }
+5 -5
View File
@@ -536,12 +536,12 @@ void NotificationManager::PopNotification::count_lines()
return; return;
// handle with marks // handle with marks
if (pos_start == string::npos && pos_end == string::npos) { if (pos_start == std::string::npos && pos_end == std::string::npos) {
pos_start = text.find(error_start); pos_start = text.find(error_start);
if (pos_start != string::npos) { if (pos_start != std::string::npos) {
text.erase(pos_start, error_start.length()); text.erase(pos_start, error_start.length());
pos_end = text.find(error_end); pos_end = text.find(error_end);
if (pos_end != string::npos) { if (pos_end != std::string::npos) {
text.erase(pos_end, error_end.length()); text.erase(pos_end, error_end.length());
} }
} }
@@ -675,7 +675,7 @@ void NotificationManager::PopNotification::bbl_render_block_notif_text(ImGuiWrap
if (m_text1.size() > m_endlines[i]) if (m_text1.size() > m_endlines[i])
last_end += (m_text1[m_endlines[i]] == '\n' || m_text1[m_endlines[i]] == ' ' ? 1 : 0); last_end += (m_text1[m_endlines[i]] == '\n' || m_text1[m_endlines[i]] == ' ' ? 1 : 0);
if (pos_start != string::npos && pos_end != string::npos && m_endlines[i] - line.length() >= pos_start && m_endlines[i] <= pos_end) { if (pos_start != std::string::npos && pos_end != std::string::npos && m_endlines[i] - line.length() >= pos_start && m_endlines[i] <= pos_end) {
push_style_color(ImGuiCol_Text, m_ErrorColor, m_state == EState::FadingOut, m_current_fade_opacity); push_style_color(ImGuiCol_Text, m_ErrorColor, m_state == EState::FadingOut, m_current_fade_opacity);
imgui.text(line.c_str()); imgui.text(line.c_str());
ImGui::PopStyleColor(); ImGui::PopStyleColor();
@@ -737,7 +737,7 @@ void NotificationManager::PopNotification::render_text(ImGuiWrapper& imgui, cons
if (m_text1.size() > m_endlines[i]) if (m_text1.size() > m_endlines[i])
last_end += (m_text1[m_endlines[i]] == '\n' || m_text1[m_endlines[i]] == ' ' ? 1 : 0); last_end += (m_text1[m_endlines[i]] == '\n' || m_text1[m_endlines[i]] == ' ' ? 1 : 0);
if (pos_start != string::npos && pos_end != string::npos&& m_endlines[i] - line.length() >= pos_start && m_endlines[i] <= pos_end) { if (pos_start != std::string::npos && pos_end != std::string::npos&& m_endlines[i] - line.length() >= pos_start && m_endlines[i] <= pos_end) {
push_style_color(ImGuiCol_Text, m_ErrorColor, m_state == EState::FadingOut, m_current_fade_opacity); push_style_color(ImGuiCol_Text, m_ErrorColor, m_state == EState::FadingOut, m_current_fade_opacity);
imgui.text(line.c_str()); imgui.text(line.c_str());
ImGui::PopStyleColor(); ImGui::PopStyleColor();
+2 -2
View File
@@ -631,8 +631,8 @@ private:
// Aditional text after hypertext - currently not used // Aditional text after hypertext - currently not used
std::string m_text2; std::string m_text2;
// mark for render operation // mark for render operation
size_t pos_start = string::npos; size_t pos_start = std::string::npos;
size_t pos_end = string::npos; size_t pos_end = std::string::npos;
std::string error_start = "<Error>"; std::string error_start = "<Error>";
std::string error_end = "</Error>"; std::string error_end = "</Error>";
+4 -4
View File
@@ -86,7 +86,7 @@ PartSkipDialog::PartSkipDialog(wxWindow *parent) : DPIDialog(parent, wxID_ANY, _
{ {
std::time_t t = std::time(0); std::time_t t = std::time(0);
std::stringstream buf; std::stringstream buf;
buf << put_time(std::localtime(&t), "%a_%b_%d_%H_%M_%S/"); buf << std::put_time(std::localtime(&t), "%a_%b_%d_%H_%M_%S/");
m_timestamp = buf.str(); m_timestamp = buf.str();
SetBackgroundColour(*wxWHITE); SetBackgroundColour(*wxWHITE);
@@ -402,7 +402,7 @@ std::string PartSkipDialog::create_tmp_path()
return tmp_path; return tmp_path;
} }
bool PartSkipDialog::is_local_file_existed(const std::vector<string> &local_paths) bool PartSkipDialog::is_local_file_existed(const std::vector<std::string> &local_paths)
{ {
for (auto path : local_paths) { for (auto path : local_paths) {
if (!std::filesystem::exists(path)) { return false; } if (!std::filesystem::exists(path)) { return false; }
@@ -703,8 +703,8 @@ void PartSkipDialog::InitDialogUI()
m_parts_state.clear(); m_parts_state.clear();
m_parts_name.clear(); m_parts_name.clear();
string pick_img = m_local_paths[0]; std::string pick_img = m_local_paths[0];
string slice_info = m_local_paths[2]; std::string slice_info = m_local_paths[2];
m_switch_drag_btn->SetIcon("canvas_drag"); m_switch_drag_btn->SetIcon("canvas_drag");
m_switch_drag_btn->SetBackgroundColor(*wxWHITE); m_switch_drag_btn->SetBackgroundColor(*wxWHITE);
+3 -3
View File
@@ -139,11 +139,11 @@ private:
boost::shared_ptr<PrinterFileSystem> m_file_sys; boost::shared_ptr<PrinterFileSystem> m_file_sys;
std::string m_timestamp; std::string m_timestamp;
std::string m_tmp_path; std::string m_tmp_path;
std::vector<string> m_local_paths; std::vector<std::string> m_local_paths;
std::vector<string> m_target_paths; std::vector<std::string> m_target_paths;
std::string create_tmp_path(); std::string create_tmp_path();
bool is_local_file_existed(const std::vector<string> &local_paths); bool is_local_file_existed(const std::vector<std::string> &local_paths);
void DownloadPartsFile(); void DownloadPartsFile();
void OnFileSystemEvent(wxCommandEvent &event); void OnFileSystemEvent(wxCommandEvent &event);
+4 -4
View File
@@ -361,7 +361,7 @@ wxDEFINE_EVENT(EVT_NOTICE_FULL_SCREEN_CHANGED, IntEvent);
#define PRINTER_PANEL_RADIUS (6) // ORCA #define PRINTER_PANEL_RADIUS (6) // ORCA
#define BTN_SYNC_SIZE (wxSize(FromDIP(96), FromDIP(98))) #define BTN_SYNC_SIZE (wxSize(FromDIP(96), FromDIP(98)))
static string get_diameter_string(float diameter) static std::string get_diameter_string(float diameter)
{ {
std::ostringstream stream; // ORCA ensure 0.25 returned as 0.25. previous code returned as 0.2 because of std::setprecision(1) std::ostringstream stream; // ORCA ensure 0.25 returned as 0.25. previous code returned as 0.2 because of std::setprecision(1)
stream << std::fixed << std::setprecision(2) << diameter; // Use 2 decimals to capture 0.25 / 0.15 reliably stream << std::fixed << std::setprecision(2) << diameter; // Use 2 decimals to capture 0.25 / 0.15 reliably
@@ -6327,7 +6327,7 @@ void Sidebar::sync_ams_list(bool is_from_big_sync_btn)
} }
// BBS:Record consumables information before synchronization // BBS:Record consumables information before synchronization
std::vector<string> color_before_sync; std::vector<std::string> color_before_sync;
std::vector<bool> is_support_before; std::vector<bool> is_support_before;
DynamicPrintConfig& project_config = wxGetApp().preset_bundle->project_config; DynamicPrintConfig& project_config = wxGetApp().preset_bundle->project_config;
ConfigOptionStrings* color_opt = project_config.option<ConfigOptionStrings>("filament_colour"); ConfigOptionStrings* color_opt = project_config.option<ConfigOptionStrings>("filament_colour");
@@ -12766,7 +12766,7 @@ void Plater::priv::on_select_preset(wxCommandEvent &evt)
Vec3d old_plate_pos = old_plate->get_center_origin(); Vec3d old_plate_pos = old_plate->get_center_origin();
// BBS: Save the model in the current platelist // BBS: Save the model in the current platelist
std::vector<vector<int> > plate_object; std::vector<std::vector<int> > plate_object;
for (size_t i = 0; i < old_plate_list.get_plate_count(); ++i) { for (size_t i = 0; i < old_plate_list.get_plate_count(); ++i) {
PartPlate* plate = old_plate_list.get_plate(i); PartPlate* plate = old_plate_list.get_plate(i);
std::vector<int> obj_idxs; std::vector<int> obj_idxs;
@@ -17979,7 +17979,7 @@ bool Plater::load_files(const wxArrayString& filenames)
// Orca: Iters through given paths and imports files from zip then remove zip from paths // Orca: Iters through given paths and imports files from zip then remove zip from paths
// returns true if zip files were found // returns true if zip files were found
auto handle_zips = [this](vector<fs::path>& paths) { // NOLINT(*-no-recursion) - Recursion is intended and should be managed properly auto handle_zips = [this](std::vector<fs::path>& paths) { // NOLINT(*-no-recursion) - Recursion is intended and should be managed properly
bool res = false; bool res = false;
for (auto it = paths.begin(); it != paths.end();) { for (auto it = paths.begin(); it != paths.end();) {
if (boost::algorithm::iends_with(it->string(), ".zip")) { if (boost::algorithm::iends_with(it->string(), ".zip")) {
+2 -2
View File
@@ -378,7 +378,7 @@ wxBoxSizer *PreferencesDialog::create_item_combobox(wxString title, wxString too
auto current_setting = app_config->get(param); auto current_setting = app_config->get(param);
if (!current_setting.empty()) { if (!current_setting.empty()) {
auto compare = [current_setting](string possible_setting) { return current_setting == possible_setting; }; auto compare = [current_setting](std::string possible_setting) { return current_setting == possible_setting; };
auto iterator = find_if(config_name_index.begin(), config_name_index.end(), compare); auto iterator = find_if(config_name_index.begin(), config_name_index.end(), compare);
if (iterator != config_name_index.end()) if (iterator != config_name_index.end())
current_index = static_cast<unsigned int>(iterator - config_name_index.begin()); current_index = static_cast<unsigned int>(iterator - config_name_index.begin());
@@ -1714,7 +1714,7 @@ void PreferencesDialog::create_items()
g_sizer->Add(create_item_title(_L("Project")), 1, wxEXPAND); g_sizer->Add(create_item_title(_L("Project")), 1, wxEXPAND);
std::vector<wxString> projectLoadSettingsBehaviourOptions = {_L("Load All"), _L("Ask When Relevant"), _L("Always Ask"), _L("Load Geometry Only")}; std::vector<wxString> projectLoadSettingsBehaviourOptions = {_L("Load All"), _L("Ask When Relevant"), _L("Always Ask"), _L("Load Geometry Only")};
std::vector<string> projectLoadSettingsConfigOptions = { OPTION_PROJECT_LOAD_BEHAVIOUR_LOAD_ALL, OPTION_PROJECT_LOAD_BEHAVIOUR_ASK_WHEN_RELEVANT, OPTION_PROJECT_LOAD_BEHAVIOUR_ALWAYS_ASK, OPTION_PROJECT_LOAD_BEHAVIOUR_LOAD_GEOMETRY }; std::vector<std::string> projectLoadSettingsConfigOptions = { OPTION_PROJECT_LOAD_BEHAVIOUR_LOAD_ALL, OPTION_PROJECT_LOAD_BEHAVIOUR_ASK_WHEN_RELEVANT, OPTION_PROJECT_LOAD_BEHAVIOUR_ALWAYS_ASK, OPTION_PROJECT_LOAD_BEHAVIOUR_LOAD_GEOMETRY };
auto item_project_load = create_item_combobox(_L("Load behavior"), _L("Should printer/filament/process settings be loaded when opening a 3MF file?"), SETTING_PROJECT_LOAD_BEHAVIOUR, projectLoadSettingsBehaviourOptions, projectLoadSettingsConfigOptions); auto item_project_load = create_item_combobox(_L("Load behavior"), _L("Should printer/filament/process settings be loaded when opening a 3MF file?"), SETTING_PROJECT_LOAD_BEHAVIOUR, projectLoadSettingsBehaviourOptions, projectLoadSettingsConfigOptions);
g_sizer->Add(item_project_load); g_sizer->Add(item_project_load);
+1 -1
View File
@@ -238,7 +238,7 @@ void ProjectPanel::on_reload(wxCommandEvent& evt)
} }
bool has_content = false; bool has_content = false;
for (const string& v : { for (const std::string& v : {
update_type, update_type,
license, license,
model_name, model_name,
+4 -1
View File
@@ -1816,7 +1816,10 @@ void InputIpAddressDialog::set_machine_obj(MachineObject* obj)
m_input_printer_name->GetTextCtrl()->SetLabelText(m_obj->get_dev_name()); m_input_printer_name->GetTextCtrl()->SetLabelText(m_obj->get_dev_name());
std::string img_str = DevPrinterConfigUtil::get_printer_connect_help_img(m_obj->printer_type); std::string img_str = DevPrinterConfigUtil::get_printer_connect_help_img(m_obj->printer_type);
auto diagram_bmp = create_scaled_bitmap(img_str + "_en", this, 198); if (img_str.empty()) { img_str = "input_access_code_x1"; }
std::string language = wxGetApp().app_config->get("language");
auto diagram_bmp = create_scaled_bitmap(img_str + (language == "zh_CN" ? "_cn" : "_en"), this, 198);
m_img_help->SetBitmap(diagram_bmp); m_img_help->SetBitmap(diagram_bmp);
+4 -4
View File
@@ -180,7 +180,7 @@ std::string get_nozzle_volume_type_cloud_string(NozzleVolumeType nozzle_volume_t
static int s_nozzle_mapping_last_request_time = 0; static int s_nozzle_mapping_last_request_time = 0;
std::vector<wxString> SelectMachineDialog::MACHINE_BED_TYPE_STRING; std::vector<wxString> SelectMachineDialog::MACHINE_BED_TYPE_STRING;
std::vector<string> SelectMachineDialog::MachineBedTypeString; std::vector<std::string> SelectMachineDialog::MachineBedTypeString;
void SelectMachineDialog::init_machine_bed_types() void SelectMachineDialog::init_machine_bed_types()
{ {
if (MACHINE_BED_TYPE_STRING.size() == 0) { if (MACHINE_BED_TYPE_STRING.size() == 0) {
@@ -2746,8 +2746,8 @@ void SelectMachineDialog::on_ok_btn(wxCommandEvent &event)
std::vector<ConfirmBeforeSendInfo> confirm_text; std::vector<ConfirmBeforeSendInfo> confirm_text;
// check more than one using in same external spool // check more than one using in same external spool
std::unordered_set<string> main_external_spool_filas; std::unordered_set<std::string> main_external_spool_filas;
std::unordered_set<string> deputy_external_spool_filas; std::unordered_set<std::string> deputy_external_spool_filas;
for (const auto& mapping_info : m_ams_mapping_result) { for (const auto& mapping_info : m_ams_mapping_result) {
if (mapping_info.ams_id == VIRTUAL_AMS_MAIN_ID_STR){ if (mapping_info.ams_id == VIRTUAL_AMS_MAIN_ID_STR){
main_external_spool_filas.insert(mapping_info.filament_id); main_external_spool_filas.insert(mapping_info.filament_id);
@@ -5237,7 +5237,7 @@ void SelectMachineDialog::update_show_status(MachineObject* obj_)
/*Check high temperture slicing*/ /*Check high temperture slicing*/
if (m_print_type == PrintFromType::FROM_NORMAL) { if (m_print_type == PrintFromType::FROM_NORMAL) {
std::set<string> high_temp_filaments; std::set<std::string> high_temp_filaments;
std::unordered_set<int> known_fila_soften_extruders; std::unordered_set<int> known_fila_soften_extruders;
std::unordered_set<int> unknown_fila_soften_extruders; std::unordered_set<int> unknown_fila_soften_extruders;
auto preset_full_config = wxGetApp().preset_bundle->full_config(); auto preset_full_config = wxGetApp().preset_bundle->full_config();
+1 -1
View File
@@ -337,7 +337,7 @@ private:
wxColour m_colour_bold_color{wxColour(38, 46, 48)}; wxColour m_colour_bold_color{wxColour(38, 46, 48)};
StateColor m_btn_bg_enable; StateColor m_btn_bg_enable;
std::unordered_map<string, PrintOption*> m_checkbox_list; std::unordered_map<std::string, PrintOption*> m_checkbox_list;
std::list<PrintOption*> m_checkbox_list_order; std::list<PrintOption*> m_checkbox_list_order;
std::shared_ptr<int> m_token = std::make_shared<int>(0); std::shared_ptr<int> m_token = std::make_shared<int>(0);
+1 -1
View File
@@ -126,7 +126,7 @@ void SendToPrinterDialog::stripWhiteSpace(std::string& str)
{ {
if (str == "") { return; } if (str == "") { return; }
string::iterator cur_it; std::string::iterator cur_it;
cur_it = str.begin(); cur_it = str.begin();
while (cur_it != str.end()) { while (cur_it != str.end()) {
+2 -2
View File
@@ -171,7 +171,7 @@ public:
std::string current_nozzle_loc = ""; std::string current_nozzle_loc = "";
wxColour m_colour; wxColour m_colour;
string m_file_name; std::string m_file_name;
bool m_ams_loading{false}; bool m_ams_loading{false};
void doRender(wxDC &dc); void doRender(wxDC &dc);
ExtruderImage(wxWindow *parent, wxWindowID id, int nozzle_num, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); ExtruderImage(wxWindow *parent, wxWindowID id, int nozzle_num, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize);
@@ -244,7 +244,7 @@ protected:
{ {
wxString local_image_url; //local image path wxString local_image_url; //local image path
std::string img_url_paths; // oss url path std::string img_url_paths; // oss url path
vector<wxPanel *> image_broad; std::vector<wxPanel *> image_broad;
bool is_selected; bool is_selected;
bool is_uploaded; // load bool is_uploaded; // load
wxBoxSizer * image_tb_broad = nullptr; wxBoxSizer * image_tb_broad = nullptr;
+2 -2
View File
@@ -1578,7 +1578,7 @@ bool SyncAmsInfoDialog::is_nozzle_type_match(DevExtderSystem data, wxString &err
} }
} }
vector<int> map_extruders = {1, 0}; std::vector<int> map_extruders = {1, 0};
// The default two extruders are left, right, but the order of the extruders on the machine is right, left. // The default two extruders are left, right, but the order of the extruders on the machine is right, left.
std::vector<std::string> flow_type_of_machine; std::vector<std::string> flow_type_of_machine;
@@ -1678,7 +1678,7 @@ void SyncAmsInfoDialog::stripWhiteSpace(std::string &str)
{ {
if (str == "") { return; } if (str == "") { return; }
string::iterator cur_it; std::string::iterator cur_it;
cur_it = str.begin(); cur_it = str.begin();
while (cur_it != str.end()) { while (cur_it != str.end()) {
+2 -2
View File
@@ -2257,7 +2257,7 @@ void Tab::on_value_change(const std::string& opt_key, const boost::any& value)
wxGetApp().plater()->update(); wxGetApp().plater()->update();
} }
string opt_key_without_idx = opt_key.substr(0, opt_key.find('#')); std::string opt_key_without_idx = opt_key.substr(0, opt_key.find('#'));
if (opt_key_without_idx == "long_retractions_when_cut") { if (opt_key_without_idx == "long_retractions_when_cut") {
unsigned char activate = boost::any_cast<unsigned char>(value); unsigned char activate = boost::any_cast<unsigned char>(value);
@@ -2928,7 +2928,7 @@ void TabPrint::build()
optgroup->append_single_option_line("skin_infill_line_width", "strength_settings_patterns#locked-zag"); optgroup->append_single_option_line("skin_infill_line_width", "strength_settings_patterns#locked-zag");
optgroup->append_single_option_line("skeleton_infill_line_width", "strength_settings_patterns#locked-zag"); optgroup->append_single_option_line("skeleton_infill_line_width", "strength_settings_patterns#locked-zag");
optgroup->append_single_option_line("symmetric_infill_y_axis", "strength_settings_infill#symmetric-infill-y-axis"); optgroup->append_single_option_line("symmetric_infill_y_axis", "strength_settings_infill#symmetric-infill-y-axis");
optgroup->append_single_option_line("infill_complete_top", "strength_settings_infill#infill-complete-top"); optgroup->append_single_option_line("infill_complete_top", "strength_settings_patterns#fill-pattern-tops");
optgroup->append_single_option_line("infill_shift_step", "strength_settings_patterns#cross-hatch"); optgroup->append_single_option_line("infill_shift_step", "strength_settings_patterns#cross-hatch");
optgroup->append_single_option_line("lateral_lattice_angle_1", "strength_settings_patterns#lateral-lattice"); optgroup->append_single_option_line("lateral_lattice_angle_1", "strength_settings_patterns#lateral-lattice");
optgroup->append_single_option_line("lateral_lattice_angle_2", "strength_settings_patterns#lateral-lattice"); optgroup->append_single_option_line("lateral_lattice_angle_2", "strength_settings_patterns#lateral-lattice");
+5 -5
View File
@@ -1685,13 +1685,13 @@ int GuideFrame::SaveProfileData()
return 0; return 0;
} }
void StringReplace(string &strBase, string strSrc, string strDes) void StringReplace(std::string &strBase, std::string strSrc, std::string strDes)
{ {
string::size_type pos = 0; std::string::size_type pos = 0;
string::size_type srcLen = strSrc.size(); std::string::size_type srcLen = strSrc.size();
string::size_type desLen = strDes.size(); std::string::size_type desLen = strDes.size();
pos = strBase.find(strSrc, pos); pos = strBase.find(strSrc, pos);
while ((pos != string::npos)) { while ((pos != std::string::npos)) {
strBase.replace(pos, srcLen, strDes); strBase.replace(pos, srcLen, strDes);
pos = strBase.find(strSrc, (pos + desLen)); pos = strBase.find(strSrc, (pos + desLen));
} }
+1 -1
View File
@@ -1052,7 +1052,7 @@ void AMSControl::UpdateAms(const std::string &series_name,
/*update humidity popup*/ /*update humidity popup*/
if (m_percent_humidity_dry_popup->IsShown()) if (m_percent_humidity_dry_popup->IsShown())
{ {
string target_id = m_percent_humidity_dry_popup->get_owner_ams_id(); std::string target_id = m_percent_humidity_dry_popup->get_owner_ams_id();
for (const auto& the_info : ams_info) for (const auto& the_info : ams_info)
{ {
if (target_id == the_info.ams_id) if (target_id == the_info.ams_id)
+2 -2
View File
@@ -63,7 +63,7 @@ protected:
std::string m_dev_id; std::string m_dev_id;
std::vector<std::vector<std::string>> m_item_ids{ {}, {} }; std::vector<std::vector<std::string>> m_item_ids{ {}, {} };
std::vector<std::pair<string, string>> pair_id; std::vector<std::pair<std::string, std::string>> pair_id;
int m_total_ext_count = 1; int m_total_ext_count = 1;
AMSextruder *m_extruder{nullptr}; AMSextruder *m_extruder{nullptr};
@@ -181,7 +181,7 @@ public:
std::tuple<bool, bool> isFilaSwitchReady(); std::tuple<bool, bool> isFilaSwitchReady();
void show_switcher_status(bool show); void show_switcher_status(bool show);
void UpdatePassRoad(string ams_id, AMSPassRoadType type, AMSPassRoadSTEP step); void UpdatePassRoad(std::string ams_id, AMSPassRoadType type, AMSPassRoadSTEP step);
void CreateAms(); void CreateAms();
void CreateAmsDoubleNozzle(const std::string &series_name, const std::string& printer_type); void CreateAmsDoubleNozzle(const std::string &series_name, const std::string& printer_type);
void CreateAmsSingleNozzle(const std::string &series_name, const std::string &printer_type); void CreateAmsSingleNozzle(const std::string &series_name, const std::string &printer_type);
+3 -3
View File
@@ -634,7 +634,7 @@ void AMSextruderImage::doRender(wxDC &dc)
} }
AMSextruderImage::AMSextruderImage(wxWindow *parent, wxWindowID id, string file_name, const wxSize& size, const wxPoint &pos) AMSextruderImage::AMSextruderImage(wxWindow *parent, wxWindowID id, std::string file_name, const wxSize& size, const wxPoint &pos)
{ {
wxWindow::Create(parent, id, pos, size); wxWindow::Create(parent, id, pos, size);
SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE)); SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE));
@@ -823,7 +823,7 @@ void SwitcherImage::doRender(wxDC &dc)
Layout(); Layout();
} }
SwitcherImage::SwitcherImage(wxWindow *parent, wxWindowID id, string file_name, const wxSize& size, const wxPoint &pos) SwitcherImage::SwitcherImage(wxWindow *parent, wxWindowID id, std::string file_name, const wxSize& size, const wxPoint &pos)
{ {
wxWindow::Create(parent, id, pos, size); wxWindow::Create(parent, id, pos, size);
SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE)); SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE));
@@ -899,7 +899,7 @@ void AMSextruder::OnAmsLoading(bool load, int nozzle_id, wxColour col /*= AMS_CO
} }
/*return true if something is updated*/ /*return true if something is updated*/
bool AMSextruder::updateNozzleNum(int nozzle_num, const string& series_name) bool AMSextruder::updateNozzleNum(int nozzle_num, const std::string& series_name)
{ {
if (m_nozzle_num == nozzle_num && m_series_name == series_name) return false; if (m_nozzle_num == nozzle_num && m_series_name == series_name) return false;
m_series_name = series_name; m_series_name = series_name;
+6 -6
View File
@@ -393,10 +393,10 @@ public:
bool m_show_state = {false}; bool m_show_state = {false};
wxColour m_colour; wxColour m_colour;
ScalableBitmap m_ams_extruder; ScalableBitmap m_ams_extruder;
string m_file_name; std::string m_file_name;
bool m_ams_loading{ false }; bool m_ams_loading{ false };
void doRender(wxDC &dc); void doRender(wxDC &dc);
AMSextruderImage(wxWindow *parent, wxWindowID id, string file_name, const wxSize& size, const wxPoint &pos = wxDefaultPosition); AMSextruderImage(wxWindow *parent, wxWindowID id, std::string file_name, const wxSize& size, const wxPoint &pos = wxDefaultPosition);
~AMSextruderImage(); ~AMSextruderImage();
}; };
@@ -444,10 +444,10 @@ public:
bool m_show_state = {false}; bool m_show_state = {false};
wxColour m_colour; wxColour m_colour;
ScalableBitmap m_switcher; ScalableBitmap m_switcher;
string m_file_name; std::string m_file_name;
// bool m_ams_loading{ false }; // bool m_ams_loading{ false };
void doRender(wxDC &dc); void doRender(wxDC &dc);
SwitcherImage(wxWindow *parent, wxWindowID id, string file_name, const wxSize& size, const wxPoint &pos = wxDefaultPosition); SwitcherImage(wxWindow *parent, wxWindowID id, std::string file_name, const wxSize& size, const wxPoint &pos = wxDefaultPosition);
~SwitcherImage(); ~SwitcherImage();
}; };
@@ -456,7 +456,7 @@ class AMSextruder : public wxWindow
{ {
private: private:
int m_nozzle_num = -1; int m_nozzle_num = -1;
string m_series_name; std::string m_series_name;
public: public:
void TurnOn(wxColour col); void TurnOn(wxColour col);
@@ -466,7 +466,7 @@ public:
void msw_rescale(); void msw_rescale();
void has_ams(bool hams) {m_has_vams = hams; Refresh();}; void has_ams(bool hams) {m_has_vams = hams; Refresh();};
void no_ams_mode(bool mode) {m_none_ams_mode = mode; Refresh();}; void no_ams_mode(bool mode) {m_none_ams_mode = mode; Refresh();};
bool updateNozzleNum(int nozzle_num, const std::string& series_name = string()); bool updateNozzleNum(int nozzle_num, const std::string& series_name = std::string());
bool m_none_ams_mode{true}; bool m_none_ams_mode{true};
bool m_has_vams{false}; bool m_has_vams{false};
+9 -2
View File
@@ -453,9 +453,16 @@ wxBitmap create_scaled_bitmap( const std::string& bmp_name_in,
const bool menu_bitmap/* = false*/, const bool menu_bitmap/* = false*/,
const bool resize/* = false*/, const bool resize/* = false*/,
const bool bitmap2/* = false*/, const bool bitmap2/* = false*/,
const vector<std::string>& array_new_color/* = vector<std::string>*/)//used for semi transparent material) const std::vector<std::string>& array_new_color/* = vector<std::string>*/)//used for semi transparent material)
{ {
static Slic3r::GUI::BitmapCache cache; static Slic3r::GUI::BitmapCache cache;
// An empty name means the caller's icon lookup failed
if (bmp_name_in.empty() || bmp_name_in == ".png") {
BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << ": empty bitmap name";
return wxNullBitmap;
}
if (bitmap2) { if (bitmap2) {
return create_scaled_bitmap2(bmp_name_in, cache, win, px_cnt, grayscale, resize, array_new_color); return create_scaled_bitmap2(bmp_name_in, cache, win, px_cnt, grayscale, resize, array_new_color);
} }
@@ -494,7 +501,7 @@ wxBitmap create_scaled_bitmap( const std::string& bmp_name_in,
wxBitmap create_scaled_bitmap2(const std::string& bmp_name_in, Slic3r::GUI::BitmapCache& cache, wxWindow* win/* = nullptr*/ , wxBitmap create_scaled_bitmap2(const std::string& bmp_name_in, Slic3r::GUI::BitmapCache& cache, wxWindow* win/* = nullptr*/ ,
const int px_cnt/* = 16*/, const bool grayscale/* = false*/ , const bool resize/* = false*/ , const int px_cnt/* = 16*/, const bool grayscale/* = false*/ , const bool resize/* = false*/ ,
const vector<std::string>& array_new_color/* = vector<std::string>()*/) // color witch will used instead of orange const std::vector<std::string>& array_new_color/* = vector<std::string>()*/) // color witch will used instead of orange
{ {
unsigned int width = 0; unsigned int width = 0;
// win may be nullptr; see create_scaled_bitmap() above. // win may be nullptr; see create_scaled_bitmap() above.
-1
View File
@@ -9,7 +9,6 @@
using json = nlohmann::json; using json = nlohmann::json;
using namespace std;
class json_diff class json_diff
{ {
+120
View File
@@ -19,8 +19,10 @@
#include <cstddef> #include <cstddef>
#include "libslic3r/libslic3r.h" #include "libslic3r/libslic3r.h"
#include "libslic3r/BoundingBox.hpp" #include "libslic3r/BoundingBox.hpp"
#include "libslic3r/ClipperUtils.hpp"
#include "libslic3r/ExPolygon.hpp" #include "libslic3r/ExPolygon.hpp"
#include "libslic3r/Point.hpp" #include "libslic3r/Point.hpp"
#include "libslic3r/Polyline.hpp"
#include <limits> #include <limits>
#include <string> #include <string>
#include <utility> #include <utility>
@@ -275,6 +277,124 @@ TEST_CASE("Only one wall on the first layer needs a bottom shell", "[Perimeters]
namespace { namespace {
// The last layer of the tab, whose top surface shares an island with the tube walls rising past it.
const double tab_top_z = 5.0;
// With the widths below the tube walls are 1.10mm wide once the precise outer wall offset (0.043mm a side) is
// taken off. That is narrower than 3 outer wall spacings (3 x 0.377 = 1.131mm), so an Arachne pass limited to a
// single wall fills it by widening its 2 beads, yet wide enough for the full 2 wall pass to add a middle wall
// (from 1.062mm).
const double narrow_wall = 1.186;
// A 20x30x10 tube with narrow_wall thick walls, and a 20x8x5 tab against its -Y side.
Print &tube_with_tab(Print &print, Model &model, const DynamicPrintConfig &config)
{
ModelObject *object = model.add_object();
object->name = "tube_with_tab.stl";
object->add_volume(make_cube(20., 30., 10.), ModelVolumeType::MODEL_PART, false);
// Overlaps the tube wall by 0.5mm so the two parts slice as one island.
TriangleMesh tab = make_cube(20., 8.5, 5.);
tab.translate(0.f, -8.f, 0.f);
object->add_volume(std::move(tab), ModelVolumeType::MODEL_PART, false);
TriangleMesh bore = make_cube(20. - 2. * narrow_wall, 30. - 2. * narrow_wall, 12.);
bore.translate(float(narrow_wall), float(narrow_wall), -1.f);
object->add_volume(std::move(bore), ModelVolumeType::NEGATIVE_VOLUME, false);
object->add_instance();
object->ensure_on_bed();
print.auto_assign_extruders(object);
print.apply(model, config);
print.validate();
print.set_status_silent();
return print;
}
// Every width the narrow_wall arithmetic depends on, so none of them rests on a default.
DynamicPrintConfig narrow_wall_config(bool only_one_wall_top, double top_surface_expansion)
{
DynamicPrintConfig config = base_config("arachne");
config.set_deserialize_strict({
{ "wall_loops", 2 },
{ "nozzle_diameter", "0.4" },
{ "line_width", 0.42 },
{ "outer_wall_line_width", 0.42 },
{ "inner_wall_line_width", 0.45 },
{ "min_bead_width", "85%" },
{ "precise_outer_wall", true },
{ "wall_sequence", "inner wall/outer wall" },
{ "only_one_wall_top", only_one_wall_top },
{ "top_surface_expansion", top_surface_expansion },
});
return config;
}
// Inner wall length the layer at print_z extrudes within 3mm of its +Y edge: the tube wall facing away from the tab.
double far_wall_inner_wall_length(const Print &print, double print_z)
{
for (const Layer *layer : print.objects().front()->layers()) {
if (std::abs(layer->print_z - print_z) > EPSILON)
continue;
BoundingBox band = get_extents(layer->lslices);
band.min.y() = band.max.y() - scaled<coord_t>(3.);
Polylines inner_walls;
auto collect = [&inner_walls](const ExtrusionPaths &paths) {
for (const ExtrusionPath &path : paths)
if (path.role() == erPerimeter)
inner_walls.emplace_back(path.as_polyline());
};
for (const LayerRegion *region : layer->regions()) {
const ExtrusionEntityCollection walls = region->perimeters.flatten();
for (const ExtrusionEntity *entity : walls.entities) {
if (const auto *loop = dynamic_cast<const ExtrusionLoop*>(entity))
collect(loop->paths);
else if (const auto *multi_path = dynamic_cast<const ExtrusionMultiPath*>(entity))
collect(multi_path->paths);
else if (const auto *path = dynamic_cast<const ExtrusionPath*>(entity))
collect({ *path });
}
}
return unscaled<double>(total_length(intersection_pl(inner_walls, band.polygon())));
}
return 0.;
}
} // namespace
// only_one_wall_top first lays out an island with a single Arachne wall and generates the inner walls inside it.
// On a wall narrower than 3 outer wall spacings that single wall pass widens its 2 beads to fill the wall and leaves
// no room for the middle wall, which is only intended over the top surface. The tube walls away from the tab are not
// under the tab's top surface, so on the tab's last layer they keep the inner wall they get with the option off.
TEST_CASE("Only one wall on top surfaces keeps the inner walls of narrow walls away from the top surface", "[Perimeters]")
{
// 0 re-onions the region beside the top surface, 2 clips the inner walls over it.
const double top_surface_expansion = GENERATE(0.0, 2.0);
CAPTURE(top_surface_expansion);
struct TabTopLayer {
double perimeters;
double far_wall_inner_walls;
};
auto tab_top_layer_for = [top_surface_expansion](bool only_one_wall_top) {
Print print;
Model model;
tube_with_tab(print, model, narrow_wall_config(only_one_wall_top, top_surface_expansion));
print.process();
REQUIRE_FALSE(print.objects().empty());
return TabTopLayer{ perimeter_length_at(print, tab_top_z), far_wall_inner_wall_length(print, tab_top_z) };
};
const TabTopLayer plain = tab_top_layer_for(false);
const TabTopLayer one_wall = tab_top_layer_for(true);
// The option acts on this layer: the inner walls under the tab's top surface are gone.
REQUIRE(plain.far_wall_inner_walls > 10.);
CHECK(one_wall.perimeters < plain.perimeters);
CHECK_THAT(one_wall.far_wall_inner_walls, Catch::Matchers::WithinAbs(plain.far_wall_inner_walls, 1.0));
}
namespace {
// The layer that closes the cavity of box_over_cavity(), the first one printed over air. // The layer that closes the cavity of box_over_cavity(), the first one printed over air.
const double cavity_ceiling_z = 6.2; const double cavity_ceiling_z = 6.2;