Merge branch 'dev' of https://github.com/prusa3d/PrusaSlicer into dev
This commit is contained in:
commit
aea68c75f3
12 changed files with 117 additions and 59 deletions
|
@ -823,6 +823,26 @@ std::string CLI::output_filepath(const Model &model, IO::ExportFormat format) co
|
||||||
return proposed_path.string();
|
return proposed_path.string();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// __has_feature() is used later for Clang, this is for compatibility with other compilers (such as GCC and MSVC)
|
||||||
|
#ifndef __has_feature
|
||||||
|
# define __has_feature(x) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
|
||||||
|
extern "C" {
|
||||||
|
// Based on https://github.com/google/skia/blob/main/tools/LsanSuppressions.cpp
|
||||||
|
const char *__lsan_default_suppressions() {
|
||||||
|
return "leak:libfontconfig\n" // FontConfig looks like it leaks, but it doesn't.
|
||||||
|
"leak:libfreetype\n" // Unsure, appeared upgrading Debian 9->10.
|
||||||
|
"leak:libGLX_nvidia.so\n" // For NVidia driver.
|
||||||
|
"leak:libnvidia-glcore.so\n" // For NVidia driver.
|
||||||
|
"leak:libnvidia-tls.so\n" // For NVidia driver.
|
||||||
|
"leak:terminator_CreateDevice\n" // For Intel Vulkan drivers.
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(_MSC_VER) || defined(__MINGW32__)
|
#if defined(_MSC_VER) || defined(__MINGW32__)
|
||||||
extern "C" {
|
extern "C" {
|
||||||
__declspec(dllexport) int __stdcall slic3r_main(int argc, wchar_t **argv)
|
__declspec(dllexport) int __stdcall slic3r_main(int argc, wchar_t **argv)
|
||||||
|
|
|
@ -56,12 +56,9 @@ ExtrusionEntityCollection::operator ExtrusionPaths() const
|
||||||
return paths;
|
return paths;
|
||||||
}
|
}
|
||||||
|
|
||||||
ExtrusionEntity* ExtrusionEntityCollection::clone() const
|
ExtrusionEntity *ExtrusionEntityCollection::clone() const
|
||||||
{
|
{
|
||||||
ExtrusionEntityCollection* coll = new ExtrusionEntityCollection(*this);
|
return new ExtrusionEntityCollection(*this);
|
||||||
for (size_t i = 0; i < coll->entities.size(); ++i)
|
|
||||||
coll->entities[i] = this->entities[i]->clone();
|
|
||||||
return coll;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExtrusionEntityCollection::reverse()
|
void ExtrusionEntityCollection::reverse()
|
||||||
|
|
|
@ -501,6 +501,7 @@ namespace client
|
||||||
boost::throw_exception(qi::expectation_failure<Iterator>(
|
boost::throw_exception(qi::expectation_failure<Iterator>(
|
||||||
lhs.it_range.begin(), rhs.it_range.end(), spirit::info("*Cannot compare the types.")));
|
lhs.it_range.begin(), rhs.it_range.end(), spirit::info("*Cannot compare the types.")));
|
||||||
}
|
}
|
||||||
|
lhs.reset();
|
||||||
lhs.type = TYPE_BOOL;
|
lhs.type = TYPE_BOOL;
|
||||||
lhs.data.b = invert ? ! value : value;
|
lhs.data.b = invert ? ! value : value;
|
||||||
}
|
}
|
||||||
|
|
|
@ -346,8 +346,12 @@ private:
|
||||||
friend class Print;
|
friend class Print;
|
||||||
|
|
||||||
PrintObject(Print* print, ModelObject* model_object, const Transform3d& trafo, PrintInstances&& instances);
|
PrintObject(Print* print, ModelObject* model_object, const Transform3d& trafo, PrintInstances&& instances);
|
||||||
~PrintObject() { if (m_shared_regions && -- m_shared_regions->m_ref_cnt == 0) delete m_shared_regions; }
|
~PrintObject() {
|
||||||
|
if (m_shared_regions && --m_shared_regions->m_ref_cnt == 0)
|
||||||
|
delete m_shared_regions;
|
||||||
|
clear_layers();
|
||||||
|
}
|
||||||
|
|
||||||
void config_apply(const ConfigBase &other, bool ignore_nonexistent = false) { m_config.apply(other, ignore_nonexistent); }
|
void config_apply(const ConfigBase &other, bool ignore_nonexistent = false) { m_config.apply(other, ignore_nonexistent); }
|
||||||
void config_apply_only(const ConfigBase &other, const t_config_option_keys &keys, bool ignore_nonexistent = false) { m_config.apply_only(other, keys, ignore_nonexistent); }
|
void config_apply_only(const ConfigBase &other, const t_config_option_keys &keys, bool ignore_nonexistent = false) { m_config.apply_only(other, keys, ignore_nonexistent); }
|
||||||
PrintBase::ApplyStatus set_instances(PrintInstances &&instances);
|
PrintBase::ApplyStatus set_instances(PrintInstances &&instances);
|
||||||
|
|
|
@ -110,10 +110,30 @@ public:
|
||||||
void set_maj(int maj) { ver.major = maj; }
|
void set_maj(int maj) { ver.major = maj; }
|
||||||
void set_min(int min) { ver.minor = min; }
|
void set_min(int min) { ver.minor = min; }
|
||||||
void set_patch(int patch) { ver.patch = patch; }
|
void set_patch(int patch) { ver.patch = patch; }
|
||||||
void set_metadata(boost::optional<const std::string&> meta) { ver.metadata = meta ? strdup(*meta) : nullptr; }
|
void set_metadata(boost::optional<const std::string &> meta)
|
||||||
void set_metadata(const char *meta) { ver.metadata = meta ? strdup(meta) : nullptr; }
|
{
|
||||||
void set_prerelease(boost::optional<const std::string&> pre) { ver.prerelease = pre ? strdup(*pre) : nullptr; }
|
if (ver.metadata)
|
||||||
void set_prerelease(const char *pre) { ver.prerelease = pre ? strdup(pre) : nullptr; }
|
free(ver.metadata);
|
||||||
|
ver.metadata = meta ? strdup(*meta) : nullptr;
|
||||||
|
}
|
||||||
|
void set_metadata(const char *meta)
|
||||||
|
{
|
||||||
|
if (ver.metadata)
|
||||||
|
free(ver.metadata);
|
||||||
|
ver.metadata = meta ? strdup(meta) : nullptr;
|
||||||
|
}
|
||||||
|
void set_prerelease(boost::optional<const std::string &> pre)
|
||||||
|
{
|
||||||
|
if (ver.prerelease)
|
||||||
|
free(ver.prerelease);
|
||||||
|
ver.prerelease = pre ? strdup(*pre) : nullptr;
|
||||||
|
}
|
||||||
|
void set_prerelease(const char *pre)
|
||||||
|
{
|
||||||
|
if (ver.prerelease)
|
||||||
|
free(ver.prerelease);
|
||||||
|
ver.prerelease = pre ? strdup(pre) : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
// Comparison
|
// Comparison
|
||||||
bool operator<(const Semver &b) const { return ::semver_compare(ver, b.ver) == -1; }
|
bool operator<(const Semver &b) const { return ::semver_compare(ver, b.ver) == -1; }
|
||||||
|
|
|
@ -18,6 +18,7 @@ namespace GUI {
|
||||||
class ConfigOptionsGroup;
|
class ConfigOptionsGroup;
|
||||||
|
|
||||||
using ConfigOptionsGroupShp = std::shared_ptr<ConfigOptionsGroup>;
|
using ConfigOptionsGroupShp = std::shared_ptr<ConfigOptionsGroup>;
|
||||||
|
using ConfigOptionsGroupWkp = std::weak_ptr<ConfigOptionsGroup>;
|
||||||
|
|
||||||
struct BedShape
|
struct BedShape
|
||||||
{
|
{
|
||||||
|
|
|
@ -6366,10 +6366,14 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c
|
||||||
|
|
||||||
BOOST_LOG_TRIVIAL(debug) << "Loading print object toolpaths in parallel - finalizing results" << m_volumes.log_memory_info() << log_memory_info();
|
BOOST_LOG_TRIVIAL(debug) << "Loading print object toolpaths in parallel - finalizing results" << m_volumes.log_memory_info() << log_memory_info();
|
||||||
// Remove empty volumes from the newly added volumes.
|
// Remove empty volumes from the newly added volumes.
|
||||||
m_volumes.volumes.erase(
|
{
|
||||||
std::remove_if(m_volumes.volumes.begin() + volumes_cnt_initial, m_volumes.volumes.end(),
|
for (auto ptr_it = m_volumes.volumes.begin() + volumes_cnt_initial; ptr_it != m_volumes.volumes.end(); ++ptr_it)
|
||||||
[](const GLVolume *volume) { return volume->empty(); }),
|
if ((*ptr_it)->empty()) {
|
||||||
m_volumes.volumes.end());
|
delete *ptr_it;
|
||||||
|
*ptr_it = nullptr;
|
||||||
|
}
|
||||||
|
m_volumes.volumes.erase(std::remove(m_volumes.volumes.begin() + volumes_cnt_initial, m_volumes.volumes.end(), nullptr), m_volumes.volumes.end());
|
||||||
|
}
|
||||||
for (size_t i = volumes_cnt_initial; i < m_volumes.volumes.size(); ++i) {
|
for (size_t i = volumes_cnt_initial; i < m_volumes.volumes.size(); ++i) {
|
||||||
GLVolume* v = m_volumes.volumes[i];
|
GLVolume* v = m_volumes.volumes[i];
|
||||||
v->is_outside = ! build_volume.all_paths_inside_vertices_and_normals_interleaved(v->indexed_vertex_array.vertices_and_normals_interleaved, v->indexed_vertex_array.bounding_box());
|
v->is_outside = ! build_volume.all_paths_inside_vertices_and_normals_interleaved(v->indexed_vertex_array.vertices_and_normals_interleaved, v->indexed_vertex_array.bounding_box());
|
||||||
|
@ -6527,10 +6531,14 @@ void GLCanvas3D::_load_wipe_tower_toolpaths(const BuildVolume& build_volume, con
|
||||||
|
|
||||||
BOOST_LOG_TRIVIAL(debug) << "Loading wipe tower toolpaths in parallel - finalizing results" << m_volumes.log_memory_info() << log_memory_info();
|
BOOST_LOG_TRIVIAL(debug) << "Loading wipe tower toolpaths in parallel - finalizing results" << m_volumes.log_memory_info() << log_memory_info();
|
||||||
// Remove empty volumes from the newly added volumes.
|
// Remove empty volumes from the newly added volumes.
|
||||||
m_volumes.volumes.erase(
|
{
|
||||||
std::remove_if(m_volumes.volumes.begin() + volumes_cnt_initial, m_volumes.volumes.end(),
|
for (auto ptr_it = m_volumes.volumes.begin() + volumes_cnt_initial; ptr_it != m_volumes.volumes.end(); ++ptr_it)
|
||||||
[](const GLVolume *volume) { return volume->empty(); }),
|
if ((*ptr_it)->empty()) {
|
||||||
m_volumes.volumes.end());
|
delete *ptr_it;
|
||||||
|
*ptr_it = nullptr;
|
||||||
|
}
|
||||||
|
m_volumes.volumes.erase(std::remove(m_volumes.volumes.begin() + volumes_cnt_initial, m_volumes.volumes.end(), nullptr), m_volumes.volumes.end());
|
||||||
|
}
|
||||||
for (size_t i = volumes_cnt_initial; i < m_volumes.volumes.size(); ++i) {
|
for (size_t i = volumes_cnt_initial; i < m_volumes.volumes.size(); ++i) {
|
||||||
GLVolume* v = m_volumes.volumes[i];
|
GLVolume* v = m_volumes.volumes[i];
|
||||||
v->is_outside = ! build_volume.all_paths_inside_vertices_and_normals_interleaved(v->indexed_vertex_array.vertices_and_normals_interleaved, v->indexed_vertex_array.bounding_box());
|
v->is_outside = ! build_volume.all_paths_inside_vertices_and_normals_interleaved(v->indexed_vertex_array.vertices_and_normals_interleaved, v->indexed_vertex_array.bounding_box());
|
||||||
|
|
|
@ -239,6 +239,7 @@ ObjectList::ObjectList(wxWindow* parent) :
|
||||||
|
|
||||||
ObjectList::~ObjectList()
|
ObjectList::~ObjectList()
|
||||||
{
|
{
|
||||||
|
delete m_objects_model;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectList::set_min_height()
|
void ObjectList::set_min_height()
|
||||||
|
|
|
@ -191,7 +191,7 @@ private:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ObjectList(wxWindow* parent);
|
ObjectList(wxWindow* parent);
|
||||||
~ObjectList();
|
~ObjectList() override;
|
||||||
|
|
||||||
void set_min_height();
|
void set_min_height();
|
||||||
void update_min_height();
|
void update_min_height();
|
||||||
|
|
|
@ -1808,8 +1808,8 @@ bool Tab::validate_custom_gcode(const wxString& title, const std::string& gcode)
|
||||||
return !invalid;
|
return !invalid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void validate_custom_gcode_cb(Tab* tab, ConfigOptionsGroupShp opt_group, const t_config_option_key& opt_key, const boost::any& value) {
|
static void validate_custom_gcode_cb(Tab* tab, const wxString& title, const t_config_option_key& opt_key, const boost::any& value) {
|
||||||
tab->validate_custom_gcodes_was_shown = !Tab::validate_custom_gcode(opt_group->title, boost::any_cast<std::string>(value));
|
tab->validate_custom_gcodes_was_shown = !Tab::validate_custom_gcode(title, boost::any_cast<std::string>(value));
|
||||||
tab->update_dirty();
|
tab->update_dirty();
|
||||||
tab->on_value_change(opt_key, value);
|
tab->on_value_change(opt_key, value);
|
||||||
}
|
}
|
||||||
|
@ -1830,18 +1830,19 @@ void TabFilament::add_filament_overrides_page()
|
||||||
else
|
else
|
||||||
line = optgroup->create_single_option_line(optgroup->get_option(opt_key));
|
line = optgroup->create_single_option_line(optgroup->get_option(opt_key));
|
||||||
|
|
||||||
line.near_label_widget = [this, optgroup, opt_key, opt_index](wxWindow* parent) {
|
line.near_label_widget = [this, optgroup_wk = ConfigOptionsGroupWkp(optgroup), opt_key, opt_index](wxWindow* parent) {
|
||||||
wxCheckBox* check_box = new wxCheckBox(parent, wxID_ANY, "");
|
wxCheckBox* check_box = new wxCheckBox(parent, wxID_ANY, "");
|
||||||
|
|
||||||
check_box->Bind(wxEVT_CHECKBOX, [optgroup, opt_key, opt_index](wxCommandEvent& evt) {
|
check_box->Bind(wxEVT_CHECKBOX, [optgroup_wk, opt_key, opt_index](wxCommandEvent& evt) {
|
||||||
const bool is_checked = evt.IsChecked();
|
const bool is_checked = evt.IsChecked();
|
||||||
Field* field = optgroup->get_fieldc(opt_key, opt_index);
|
if (auto optgroup_sh = optgroup_wk.lock(); optgroup_sh) {
|
||||||
if (field != nullptr) {
|
if (Field *field = optgroup_sh->get_fieldc(opt_key, opt_index); field != nullptr) {
|
||||||
field->toggle(is_checked);
|
field->toggle(is_checked);
|
||||||
if (is_checked)
|
if (is_checked)
|
||||||
field->set_last_meaningful_value();
|
field->set_last_meaningful_value();
|
||||||
else
|
else
|
||||||
field->set_na_value();
|
field->set_na_value();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}, check_box->GetId());
|
}, check_box->GetId());
|
||||||
|
|
||||||
|
@ -1926,7 +1927,7 @@ void TabFilament::build()
|
||||||
optgroup->append_single_option_line("filament_cost");
|
optgroup->append_single_option_line("filament_cost");
|
||||||
optgroup->append_single_option_line("filament_spool_weight");
|
optgroup->append_single_option_line("filament_spool_weight");
|
||||||
|
|
||||||
optgroup->m_on_change = [this, optgroup](t_config_option_key opt_key, boost::any value)
|
optgroup->m_on_change = [this](t_config_option_key opt_key, boost::any value)
|
||||||
{
|
{
|
||||||
update_dirty();
|
update_dirty();
|
||||||
if (opt_key == "filament_spool_weight") {
|
if (opt_key == "filament_spool_weight") {
|
||||||
|
@ -2038,8 +2039,8 @@ void TabFilament::build()
|
||||||
|
|
||||||
page = add_options_page(L("Custom G-code"), "cog");
|
page = add_options_page(L("Custom G-code"), "cog");
|
||||||
optgroup = page->new_optgroup(L("Start G-code"), 0);
|
optgroup = page->new_optgroup(L("Start G-code"), 0);
|
||||||
optgroup->m_on_change = [this, optgroup](const t_config_option_key& opt_key, const boost::any& value) {
|
optgroup->m_on_change = [this, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
|
||||||
validate_custom_gcode_cb(this, optgroup, opt_key, value);
|
validate_custom_gcode_cb(this, optgroup_title, opt_key, value);
|
||||||
};
|
};
|
||||||
option = optgroup->get_option("start_filament_gcode");
|
option = optgroup->get_option("start_filament_gcode");
|
||||||
option.opt.full_width = true;
|
option.opt.full_width = true;
|
||||||
|
@ -2048,8 +2049,8 @@ void TabFilament::build()
|
||||||
optgroup->append_single_option_line(option);
|
optgroup->append_single_option_line(option);
|
||||||
|
|
||||||
optgroup = page->new_optgroup(L("End G-code"), 0);
|
optgroup = page->new_optgroup(L("End G-code"), 0);
|
||||||
optgroup->m_on_change = [this, optgroup](const t_config_option_key& opt_key, const boost::any& value) {
|
optgroup->m_on_change = [this, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
|
||||||
validate_custom_gcode_cb(this, optgroup, opt_key, value);
|
validate_custom_gcode_cb(this, optgroup_title, opt_key, value);
|
||||||
};
|
};
|
||||||
option = optgroup->get_option("end_filament_gcode");
|
option = optgroup->get_option("end_filament_gcode");
|
||||||
option.opt.full_width = true;
|
option.opt.full_width = true;
|
||||||
|
@ -2260,11 +2261,15 @@ void TabPrinter::build_fff()
|
||||||
optgroup->append_single_option_line(option);
|
optgroup->append_single_option_line(option);
|
||||||
optgroup->append_single_option_line("single_extruder_multi_material");
|
optgroup->append_single_option_line("single_extruder_multi_material");
|
||||||
|
|
||||||
optgroup->m_on_change = [this, optgroup](t_config_option_key opt_key, boost::any value) {
|
optgroup->m_on_change = [this, optgroup_wk = ConfigOptionsGroupWkp(optgroup)](t_config_option_key opt_key, boost::any value) {
|
||||||
|
auto optgroup_sh = optgroup_wk.lock();
|
||||||
|
if (!optgroup_sh)
|
||||||
|
return;
|
||||||
|
|
||||||
// optgroup->get_value() return int for def.type == coInt,
|
// optgroup->get_value() return int for def.type == coInt,
|
||||||
// Thus, there should be boost::any_cast<int> !
|
// Thus, there should be boost::any_cast<int> !
|
||||||
// Otherwise, boost::any_cast<size_t> causes an "unhandled unknown exception"
|
// Otherwise, boost::any_cast<size_t> causes an "unhandled unknown exception"
|
||||||
size_t extruders_count = size_t(boost::any_cast<int>(optgroup->get_value("extruders_count")));
|
size_t extruders_count = size_t(boost::any_cast<int>(optgroup_sh->get_value("extruders_count")));
|
||||||
wxTheApp->CallAfter([this, opt_key, value, extruders_count]() {
|
wxTheApp->CallAfter([this, opt_key, value, extruders_count]() {
|
||||||
if (opt_key == "extruders_count" || opt_key == "single_extruder_multi_material") {
|
if (opt_key == "extruders_count" || opt_key == "single_extruder_multi_material") {
|
||||||
extruders_count_changed(extruders_count);
|
extruders_count_changed(extruders_count);
|
||||||
|
@ -2323,7 +2328,7 @@ void TabPrinter::build_fff()
|
||||||
optgroup->append_single_option_line("silent_mode");
|
optgroup->append_single_option_line("silent_mode");
|
||||||
optgroup->append_single_option_line("remaining_times");
|
optgroup->append_single_option_line("remaining_times");
|
||||||
|
|
||||||
optgroup->m_on_change = [this, optgroup](t_config_option_key opt_key, boost::any value) {
|
optgroup->m_on_change = [this](t_config_option_key opt_key, boost::any value) {
|
||||||
wxTheApp->CallAfter([this, opt_key, value]() {
|
wxTheApp->CallAfter([this, opt_key, value]() {
|
||||||
if (opt_key == "silent_mode") {
|
if (opt_key == "silent_mode") {
|
||||||
bool val = boost::any_cast<bool>(value);
|
bool val = boost::any_cast<bool>(value);
|
||||||
|
@ -2358,8 +2363,8 @@ void TabPrinter::build_fff()
|
||||||
const int notes_field_height = 25; // 250
|
const int notes_field_height = 25; // 250
|
||||||
page = add_options_page(L("Custom G-code"), "cog");
|
page = add_options_page(L("Custom G-code"), "cog");
|
||||||
optgroup = page->new_optgroup(L("Start G-code"), 0);
|
optgroup = page->new_optgroup(L("Start G-code"), 0);
|
||||||
optgroup->m_on_change = [this, optgroup](const t_config_option_key& opt_key, const boost::any& value) {
|
optgroup->m_on_change = [this, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
|
||||||
validate_custom_gcode_cb(this, optgroup, opt_key, value);
|
validate_custom_gcode_cb(this, optgroup_title, opt_key, value);
|
||||||
};
|
};
|
||||||
option = optgroup->get_option("start_gcode");
|
option = optgroup->get_option("start_gcode");
|
||||||
option.opt.full_width = true;
|
option.opt.full_width = true;
|
||||||
|
@ -2368,8 +2373,8 @@ void TabPrinter::build_fff()
|
||||||
optgroup->append_single_option_line(option);
|
optgroup->append_single_option_line(option);
|
||||||
|
|
||||||
optgroup = page->new_optgroup(L("End G-code"), 0);
|
optgroup = page->new_optgroup(L("End G-code"), 0);
|
||||||
optgroup->m_on_change = [this, optgroup](const t_config_option_key& opt_key, const boost::any& value) {
|
optgroup->m_on_change = [this, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
|
||||||
validate_custom_gcode_cb(this, optgroup, opt_key, value);
|
validate_custom_gcode_cb(this, optgroup_title, opt_key, value);
|
||||||
};
|
};
|
||||||
option = optgroup->get_option("end_gcode");
|
option = optgroup->get_option("end_gcode");
|
||||||
option.opt.full_width = true;
|
option.opt.full_width = true;
|
||||||
|
@ -2378,8 +2383,8 @@ void TabPrinter::build_fff()
|
||||||
optgroup->append_single_option_line(option);
|
optgroup->append_single_option_line(option);
|
||||||
|
|
||||||
optgroup = page->new_optgroup(L("Before layer change G-code"), 0);
|
optgroup = page->new_optgroup(L("Before layer change G-code"), 0);
|
||||||
optgroup->m_on_change = [this, optgroup](const t_config_option_key& opt_key, const boost::any& value) {
|
optgroup->m_on_change = [this, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
|
||||||
validate_custom_gcode_cb(this, optgroup, opt_key, value);
|
validate_custom_gcode_cb(this, optgroup_title, opt_key, value);
|
||||||
};
|
};
|
||||||
option = optgroup->get_option("before_layer_gcode");
|
option = optgroup->get_option("before_layer_gcode");
|
||||||
option.opt.full_width = true;
|
option.opt.full_width = true;
|
||||||
|
@ -2388,8 +2393,8 @@ void TabPrinter::build_fff()
|
||||||
optgroup->append_single_option_line(option);
|
optgroup->append_single_option_line(option);
|
||||||
|
|
||||||
optgroup = page->new_optgroup(L("After layer change G-code"), 0);
|
optgroup = page->new_optgroup(L("After layer change G-code"), 0);
|
||||||
optgroup->m_on_change = [this, optgroup](const t_config_option_key& opt_key, const boost::any& value) {
|
optgroup->m_on_change = [this, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
|
||||||
validate_custom_gcode_cb(this, optgroup, opt_key, value);
|
validate_custom_gcode_cb(this, optgroup_title, opt_key, value);
|
||||||
};
|
};
|
||||||
option = optgroup->get_option("layer_gcode");
|
option = optgroup->get_option("layer_gcode");
|
||||||
option.opt.full_width = true;
|
option.opt.full_width = true;
|
||||||
|
@ -2398,8 +2403,8 @@ void TabPrinter::build_fff()
|
||||||
optgroup->append_single_option_line(option);
|
optgroup->append_single_option_line(option);
|
||||||
|
|
||||||
optgroup = page->new_optgroup(L("Tool change G-code"), 0);
|
optgroup = page->new_optgroup(L("Tool change G-code"), 0);
|
||||||
optgroup->m_on_change = [this, optgroup](const t_config_option_key& opt_key, const boost::any& value) {
|
optgroup->m_on_change = [this, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
|
||||||
validate_custom_gcode_cb(this, optgroup, opt_key, value);
|
validate_custom_gcode_cb(this, optgroup_title, opt_key, value);
|
||||||
};
|
};
|
||||||
option = optgroup->get_option("toolchange_gcode");
|
option = optgroup->get_option("toolchange_gcode");
|
||||||
option.opt.full_width = true;
|
option.opt.full_width = true;
|
||||||
|
@ -2408,8 +2413,8 @@ void TabPrinter::build_fff()
|
||||||
optgroup->append_single_option_line(option);
|
optgroup->append_single_option_line(option);
|
||||||
|
|
||||||
optgroup = page->new_optgroup(L("Between objects G-code (for sequential printing)"), 0);
|
optgroup = page->new_optgroup(L("Between objects G-code (for sequential printing)"), 0);
|
||||||
optgroup->m_on_change = [this, optgroup](const t_config_option_key& opt_key, const boost::any& value) {
|
optgroup->m_on_change = [this, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
|
||||||
validate_custom_gcode_cb(this, optgroup, opt_key, value);
|
validate_custom_gcode_cb(this, optgroup_title, opt_key, value);
|
||||||
};
|
};
|
||||||
option = optgroup->get_option("between_objects_gcode");
|
option = optgroup->get_option("between_objects_gcode");
|
||||||
option.opt.full_width = true;
|
option.opt.full_width = true;
|
||||||
|
@ -2418,8 +2423,8 @@ void TabPrinter::build_fff()
|
||||||
optgroup->append_single_option_line(option);
|
optgroup->append_single_option_line(option);
|
||||||
|
|
||||||
optgroup = page->new_optgroup(L("Color Change G-code"), 0);
|
optgroup = page->new_optgroup(L("Color Change G-code"), 0);
|
||||||
optgroup->m_on_change = [this, optgroup](const t_config_option_key& opt_key, const boost::any& value) {
|
optgroup->m_on_change = [this, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
|
||||||
validate_custom_gcode_cb(this, optgroup, opt_key, value);
|
validate_custom_gcode_cb(this, optgroup_title, opt_key, value);
|
||||||
};
|
};
|
||||||
option = optgroup->get_option("color_change_gcode");
|
option = optgroup->get_option("color_change_gcode");
|
||||||
option.opt.is_code = true;
|
option.opt.is_code = true;
|
||||||
|
@ -2427,8 +2432,8 @@ void TabPrinter::build_fff()
|
||||||
optgroup->append_single_option_line(option);
|
optgroup->append_single_option_line(option);
|
||||||
|
|
||||||
optgroup = page->new_optgroup(L("Pause Print G-code"), 0);
|
optgroup = page->new_optgroup(L("Pause Print G-code"), 0);
|
||||||
optgroup->m_on_change = [this, optgroup](const t_config_option_key& opt_key, const boost::any& value) {
|
optgroup->m_on_change = [this, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
|
||||||
validate_custom_gcode_cb(this, optgroup, opt_key, value);
|
validate_custom_gcode_cb(this, optgroup_title, opt_key, value);
|
||||||
};
|
};
|
||||||
option = optgroup->get_option("pause_print_gcode");
|
option = optgroup->get_option("pause_print_gcode");
|
||||||
option.opt.is_code = true;
|
option.opt.is_code = true;
|
||||||
|
@ -2436,8 +2441,8 @@ void TabPrinter::build_fff()
|
||||||
optgroup->append_single_option_line(option);
|
optgroup->append_single_option_line(option);
|
||||||
|
|
||||||
optgroup = page->new_optgroup(L("Template Custom G-code"), 0);
|
optgroup = page->new_optgroup(L("Template Custom G-code"), 0);
|
||||||
optgroup->m_on_change = [this, optgroup](const t_config_option_key& opt_key, const boost::any& value) {
|
optgroup->m_on_change = [this, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
|
||||||
validate_custom_gcode_cb(this, optgroup, opt_key, value);
|
validate_custom_gcode_cb(this, optgroup_title, opt_key, value);
|
||||||
};
|
};
|
||||||
option = optgroup->get_option("template_custom_gcode");
|
option = optgroup->get_option("template_custom_gcode");
|
||||||
option.opt.is_code = true;
|
option.opt.is_code = true;
|
||||||
|
@ -4468,7 +4473,7 @@ void TabSLAMaterial::build()
|
||||||
optgroup->append_single_option_line("bottle_weight");
|
optgroup->append_single_option_line("bottle_weight");
|
||||||
optgroup->append_single_option_line("material_density");
|
optgroup->append_single_option_line("material_density");
|
||||||
|
|
||||||
optgroup->m_on_change = [this, optgroup](t_config_option_key opt_key, boost::any value)
|
optgroup->m_on_change = [this](t_config_option_key opt_key, boost::any value)
|
||||||
{
|
{
|
||||||
if (opt_key == "material_colour") {
|
if (opt_key == "material_colour") {
|
||||||
update_dirty();
|
update_dirty();
|
||||||
|
|
|
@ -204,7 +204,7 @@ class DiffViewCtrl : public wxDataViewCtrl
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DiffViewCtrl(wxWindow* parent, wxSize size);
|
DiffViewCtrl(wxWindow* parent, wxSize size);
|
||||||
~DiffViewCtrl() {}
|
~DiffViewCtrl() override { Clear(); delete model; }
|
||||||
|
|
||||||
DiffModel* model{ nullptr };
|
DiffModel* model{ nullptr };
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <wx/menu.h>
|
#include <wx/menu.h>
|
||||||
#include <wx/bmpcbox.h>
|
#include <wx/bmpcbox.h>
|
||||||
#include <wx/statbmp.h>
|
#include <wx/statbmp.h>
|
||||||
|
#include <wx/timer.h>
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|
Loading…
Reference in a new issue