Compare commits

..
Author SHA1 Message Date
HanifKoh 6639a32b0c Remove using namespace std from json_diff.hpp (#16222)
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. The
files that use the ""sv and ""ms literals get a file-scope
"using namespace std::string_view_literals;" or
"using namespace std::chrono_literals;", as other sources already do.
2026-10-07 14:58:49 +08:00
SoftFever 1ec195a221 Update build commands in AGENTS.md to use Release configuration 2026-10-07 14:44:04 +08:00
40 changed files with 119 additions and 138 deletions
+6 -4
View File
@@ -4,15 +4,17 @@ OrcaSlicer — open-source C++17 3D slicer. wxWidgets GUI, CMake build system.
## Build Commands ## Build Commands
Build the Release configuration unless asked otherwise.
```bash ```bash
# macOS # macOS
cmake --build build/arm64 --config RelWithDebInfo --target all -- cmake --build build/arm64 --config Release --target all --
# Linux # Linux
cmake --build build --config RelWithDebInfo --target all -- cmake --build build --config Release --target all --
# Windows (replace %build_type% with Debug/Release/RelWithDebInfo) # Windows
cmake --build . --config %build_type% --target ALL_BUILD -- -m cmake --build . --config Release --target ALL_BUILD -- -m
``` ```
## Testing ## Testing
+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
@@ -856,14 +856,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
@@ -347,7 +347,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;
@@ -1581,7 +1581,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;
@@ -3143,7 +3143,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);
@@ -4964,7 +4964,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
@@ -160,7 +160,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"},
@@ -250,7 +250,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);
@@ -426,7 +426,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},
@@ -436,7 +436,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 -1
View File
@@ -110,6 +110,7 @@ using json = nlohmann::json;
class wxWindow; class wxWindow;
namespace fs = boost::filesystem; namespace fs = boost::filesystem;
using namespace std::chrono_literals;
#define CALI_DEBUG #define CALI_DEBUG
#define MINUTE_30 1800000 //ms #define MINUTE_30 1800000 //ms
@@ -3103,7 +3104,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
+3 -1
View File
@@ -94,6 +94,8 @@
#include "slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp" #include "slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp"
#include "slic3r/GUI/PartPlate.hpp" #include "slic3r/GUI/PartPlate.hpp"
using namespace std::string_view_literals;
namespace Slic3r { class PrintBase; } namespace Slic3r { class PrintBase; }
@@ -3184,7 +3186,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(std::string_view("ABC")).x; float three_words_width = imgui.calc_text_size("ABC"sv).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 })
+2
View File
@@ -177,6 +177,8 @@ extern wxPopupWindow* wxCurrentPopupWindow;
#endif #endif
#endif #endif
using namespace std::string_view_literals;
static constexpr const float TRACKBALLSIZE = 0.8f; static constexpr const float TRACKBALLSIZE = 0.8f;
static Slic3r::ColorRGBA DEFAULT_BG_LIGHT_COLOR = { 0.906f, 0.906f, 0.906f, 1.0f }; static Slic3r::ColorRGBA DEFAULT_BG_LIGHT_COLOR = { 0.906f, 0.906f, 0.906f, 1.0f };
+3 -3
View File
@@ -9040,7 +9040,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;
@@ -10068,7 +10068,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;
@@ -10103,7 +10103,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);
@@ -44,6 +44,8 @@
#define MAX_NUM 9999.99 #define MAX_NUM 9999.99
#define MAX_SIZE std::string_view{"9999.99"} #define MAX_SIZE std::string_view{"9999.99"}
using namespace std::string_view_literals;
namespace Slic3r namespace Slic3r
{ {
namespace GUI namespace GUI
+7 -7
View File
@@ -33,7 +33,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()
@@ -345,17 +345,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())
{ {
@@ -426,9 +426,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
@@ -335,7 +335,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();
+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
@@ -357,7 +357,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
@@ -6323,7 +6323,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");
@@ -12762,7 +12762,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;
@@ -17975,7 +17975,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
@@ -239,7 +239,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 -4
View File
@@ -182,7 +182,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) {
@@ -2748,8 +2748,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);
@@ -5239,7 +5239,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
@@ -1576,7 +1576,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;
@@ -1676,7 +1676,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()) {
+1 -1
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);
+5 -5
View File
@@ -1682,13 +1682,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};
-3
View File
@@ -7,9 +7,6 @@
#include "nlohmann/json.hpp" #include "nlohmann/json.hpp"
using namespace std;
class json_diff class json_diff
{ {
private: private:
+6 -25
View File
@@ -346,20 +346,8 @@ std::vector<std::string> PluginAuditManager::default_denied_path_keywords()
// must never be able to reach a secret, a certificate, or a configuration file just because // must never be able to reach a secret, a certificate, or a configuration file just because
// it happens to live inside an otherwise-allowed root (e.g. the bundled TLS client cert at // it happens to live inside an otherwise-allowed root (e.g. the bundled TLS client cert at
// resources_dir()/cert/..., which would become reachable the moment resources_dir() is // resources_dir()/cert/..., which would become reachable the moment resources_dir() is
// granted as a read-only allowed root). Match as whole path components, not substrings, so // granted as a read-only allowed root).
// imports such as numpy/__config__.py and stdlib configparser.py remain usable. return {"secret", "cert", "conf"};
return {"secret", "secrets", "cert", "certs", "certificate", "certificates", "conf", "config"};
}
static bool has_denied_config_extension(std::string name)
{
const size_t stream_pos = name.find(':');
if (stream_pos != std::string::npos)
name.erase(stream_pos);
const boost::filesystem::path path(name);
const std::string extension = path.extension().string();
return extension == ".conf" || extension == ".ini";
} }
bool PluginAuditManager::is_denied_path_keyword(const boost::filesystem::path& candidate) const bool PluginAuditManager::is_denied_path_keyword(const boost::filesystem::path& candidate) const
@@ -384,7 +372,7 @@ bool PluginAuditManager::is_denied_path_keyword(const boost::filesystem::path& c
continue; continue;
std::transform(name.begin(), name.end(), name.begin(), [](unsigned char c) { return std::tolower(c); }); std::transform(name.begin(), name.end(), name.begin(), [](unsigned char c) { return std::tolower(c); });
for (const auto& keyword : m_denied_path_keywords) { for (const auto& keyword : m_denied_path_keywords) {
if (name == keyword || (keyword == "conf" && has_denied_config_extension(name))) if (name.find(keyword) != std::string::npos)
return true; return true;
} }
} }
@@ -808,8 +796,7 @@ bool persist_permission(const std::string& plugin_key,
int report_denied(PluginAuditManager& mgr, int report_denied(PluginAuditManager& mgr,
const std::string& event_name, const std::string& event_name,
const AuditDecision& decision, const AuditDecision& decision)
const std::string& target = {})
{ {
AuditViolation violation; AuditViolation violation;
violation.plugin_key = mgr.current_plugin(); violation.plugin_key = mgr.current_plugin();
@@ -817,13 +804,7 @@ int report_denied(PluginAuditManager& mgr,
violation.reason = decision.reason; violation.reason = decision.reason;
mgr.report_violation(violation); mgr.report_violation(violation);
std::string message = "Plugin attempted audited operation \"" + event_name + "\" without permission"; PyErr_SetString(PyExc_PermissionError, "Plugin attempted an audited operation without permission");
if (!decision.reason.empty())
message += ": " + decision.reason;
if (!target.empty())
message += ": " + target;
PyErr_SetString(PyExc_PermissionError, message.c_str());
return -1; return -1;
} }
@@ -935,7 +916,7 @@ int PluginAuditManager::audit_hook(const char* event, PyObject* args, void* user
if (fs_category) { if (fs_category) {
for (const auto& target : targets) { for (const auto& target : targets) {
if (mgr->is_denied_path(boost::filesystem::path(target))) if (mgr->is_denied_path(boost::filesystem::path(target)))
return PluginAuditDetail::report_denied(*mgr, event_name, {false, "denied path"}, target); return PluginAuditDetail::report_denied(*mgr, event_name, {false, "denied path"});
} }
} }
+11 -8
View File
@@ -4,6 +4,7 @@
// Via pybind11 so this file requests the same python3xx.lib as everything else. // Via pybind11 so this file requests the same python3xx.lib as everything else.
#include <boost/filesystem/path.hpp> #include <boost/filesystem/path.hpp>
#include <pybind11/conduit/wrap_include_python_h.h> #include <pybind11/conduit/wrap_include_python_h.h>
#include <memory>
#include <mutex> #include <mutex>
#include <string> #include <string>
#include <unordered_map> #include <unordered_map>
@@ -102,20 +103,22 @@ public:
bool is_denied_filename(const boost::filesystem::path& candidate) const; bool is_denied_filename(const boost::filesystem::path& candidate) const;
// --- denied-path-keyword registry --- // --- denied-path-keyword registry ---
// Keywords that categorically deny a path if ANY component matches one case-insensitively -- // Keywords that categorically deny a path if ANY of its components (directory or file
// e.g. a "secrets" subfolder, a "certificates" folder, a "conf"/"config" directory, or a // name), not just the base name, contains one case-insensitively -- e.g. a "secrets"
// .conf/.ini file anywhere the plugin can otherwise reach, including inside an allowed root. // subfolder, a "certificates" folder, or a "conf"/"config" file anywhere the plugin can
// This is broader than the exact-name is_denied_filename registry, but it is not a substring // otherwise reach, including inside an allowed root. This is intentionally broader and
// match: importable modules such as numpy/__config__.py, configparser.py, sysconfig.py, or // fuzzier than the exact-name is_denied_filename registry: it exists to categorically rule
// user folders such as "Conference" and "Concert" are unrelated names and must stay promptable. // out whole classes of sensitive paths (secrets, certificates, config) rather than name
// specific known files, at the cost of over-blocking an unrelated name that happens to
// contain the keyword -- the fail-safe direction, same rationale as is_denied_filename.
void add_denied_path_keyword(const std::string& keyword); void add_denied_path_keyword(const std::string& keyword);
// The list install_hook() seeds into the keyword registry. Exposed so tests seed the exact // The list install_hook() seeds into the keyword registry. Exposed so tests seed the exact
// same set without a live interpreter. // same set without a live interpreter.
static std::vector<std::string> default_denied_path_keywords(); static std::vector<std::string> default_denied_path_keywords();
// True when any component of candidate's (canonicalized) path matches a registered keyword, // True when any component of candidate's (canonicalized) path contains a registered
// case-insensitively. A registered "conf" keyword also blocks .conf/.ini file components. // keyword, case-insensitively.
bool is_denied_path_keyword(const boost::filesystem::path& candidate) const; bool is_denied_path_keyword(const boost::filesystem::path& candidate) const;
// is_denied_filename(candidate) || is_denied_path_keyword(candidate). Convenience for // is_denied_filename(candidate) || is_denied_path_keyword(candidate). Convenience for
+3 -12
View File
@@ -222,19 +222,18 @@ TEST_CASE("Plugin audit denies secret/certificate/config-like paths by keyword",
CHECK(mgr.is_denied_path_keyword(fs::path("/resources/certificates/ca.pem"))); CHECK(mgr.is_denied_path_keyword(fs::path("/resources/certificates/ca.pem")));
} }
SECTION("a 'conf'/'config' directory or config file component is denied") SECTION("a 'conf'/'config' directory or file component is denied")
{ {
CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/conf/settings.json"))); CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/conf/settings.json")));
CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/config/settings.json"))); CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/config/settings.json")));
CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/plugin.conf"))); CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/plugin.conf")));
CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/plugin.ini")));
} }
SECTION("matching is case-insensitive") SECTION("matching is case-insensitive")
{ {
CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/SECRETS/token.txt"))); CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/SECRETS/token.txt")));
CHECK(mgr.is_denied_path_keyword(fs::path("/resources/Certificates/ca.pem"))); CHECK(mgr.is_denied_path_keyword(fs::path("/resources/CertBundle/ca.pem")));
CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/PLUGIN.CONF"))); CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/CONFIG.JSON")));
} }
SECTION("matching is not limited to the base name -- any ancestor component counts") SECTION("matching is not limited to the base name -- any ancestor component counts")
@@ -246,14 +245,6 @@ TEST_CASE("Plugin audit denies secret/certificate/config-like paths by keyword",
{ {
CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/plugin/output/model.gcode"))); CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/plugin/output/model.gcode")));
CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/plugin/storage/state.json"))); CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/plugin/storage/state.json")));
CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/python/packages/cp312/numpy/__config__.py")));
CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/python/packages/cp312/numpy/_core/_ufunc_config.py")));
CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/python/Lib/configparser.py")));
CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/python/Lib/sysconfig.py")));
CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/python/Lib/logging/config.py")));
CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/python/packages/cp312/certifi/cacert.pem")));
CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/users/Conference/output.txt")));
CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/users/Concert/output.txt")));
} }
SECTION("an empty path is not denied") SECTION("an empty path is not denied")