mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-13 09:47:58 -06:00
parent
255b23f0fc
commit
aee136cedd
14 changed files with 168 additions and 164 deletions
|
@ -197,7 +197,7 @@ static ExtrusionEntityCollection traverse_loops(const PerimeterGenerator &perime
|
||||||
fuzzified = loop.polygon;
|
fuzzified = loop.polygon;
|
||||||
fuzzy_polygon(fuzzified, scaled<float>(perimeter_generator.config->fuzzy_skin_thickness.value), scaled<float>(perimeter_generator.config->fuzzy_skin_point_dist.value));
|
fuzzy_polygon(fuzzified, scaled<float>(perimeter_generator.config->fuzzy_skin_thickness.value), scaled<float>(perimeter_generator.config->fuzzy_skin_point_dist.value));
|
||||||
}
|
}
|
||||||
if (perimeter_generator.config->overhangs && perimeter_generator.layer_id > 0
|
if (perimeter_generator.config->overhangs && perimeter_generator.layer_id > perimeter_generator.object_config->raft_layers
|
||||||
&& ! ((perimeter_generator.object_config->support_material || perimeter_generator.object_config->support_material_enforce_layers > 0) &&
|
&& ! ((perimeter_generator.object_config->support_material || perimeter_generator.object_config->support_material_enforce_layers > 0) &&
|
||||||
perimeter_generator.object_config->support_material_contact_distance.value == 0)) {
|
perimeter_generator.object_config->support_material_contact_distance.value == 0)) {
|
||||||
// get non-overhang paths by intersecting this loop with the grown lower slices
|
// get non-overhang paths by intersecting this loop with the grown lower slices
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
// !!! If you needed to translate some string,
|
// !!! If you needed to translate some string,
|
||||||
// !!! please use _L(string)
|
// !!! please use _L(string)
|
||||||
// !!! _() - is a standard wxWidgets macro to translate
|
// !!! _() - is a standard wxWidgets macro to translate
|
||||||
// !!! L() is used only for marking localizable string
|
// !!! L() is used only for marking localizable string
|
||||||
// !!! It will be used in "xgettext" to create a Locating Message Catalog.
|
// !!! It will be used in "xgettext" to create a Locating Message Catalog.
|
||||||
#define L(s) s
|
#define L(s) s
|
||||||
#endif /* L */
|
#endif /* L */
|
||||||
|
@ -392,7 +392,7 @@ void Preset::set_visible_from_appconfig(const AppConfig &app_config)
|
||||||
} else if (type == TYPE_FILAMENT || type == TYPE_SLA_MATERIAL) {
|
} else if (type == TYPE_FILAMENT || type == TYPE_SLA_MATERIAL) {
|
||||||
const std::string §ion_name = (type == TYPE_FILAMENT) ? AppConfig::SECTION_FILAMENTS : AppConfig::SECTION_MATERIALS;
|
const std::string §ion_name = (type == TYPE_FILAMENT) ? AppConfig::SECTION_FILAMENTS : AppConfig::SECTION_MATERIALS;
|
||||||
if (app_config.has_section(section_name)) {
|
if (app_config.has_section(section_name)) {
|
||||||
// Check whether this profile is marked as "installed" in PrusaSlicer.ini,
|
// Check whether this profile is marked as "installed" in PrusaSlicer.ini,
|
||||||
// or whether a profile is marked as "installed", which this profile may have been renamed from.
|
// or whether a profile is marked as "installed", which this profile may have been renamed from.
|
||||||
const std::map<std::string, std::string> &installed = app_config.get_section(section_name);
|
const std::map<std::string, std::string> &installed = app_config.get_section(section_name);
|
||||||
auto has = [&installed](const std::string &name) {
|
auto has = [&installed](const std::string &name) {
|
||||||
|
@ -409,12 +409,12 @@ void Preset::set_visible_from_appconfig(const AppConfig &app_config)
|
||||||
const std::vector<std::string>& Preset::print_options()
|
const std::vector<std::string>& Preset::print_options()
|
||||||
{
|
{
|
||||||
static std::vector<std::string> s_opts {
|
static std::vector<std::string> s_opts {
|
||||||
"layer_height", "first_layer_height", "perimeters", "spiral_vase", "slice_closing_radius",
|
"layer_height", "first_layer_height", "perimeters", "spiral_vase", "slice_closing_radius",
|
||||||
"top_solid_layers", "top_solid_min_thickness", "bottom_solid_layers", "bottom_solid_min_thickness",
|
"top_solid_layers", "top_solid_min_thickness", "bottom_solid_layers", "bottom_solid_min_thickness",
|
||||||
"extra_perimeters", "ensure_vertical_shell_thickness", "avoid_crossing_perimeters", "thin_walls", "overhangs",
|
"extra_perimeters", "ensure_vertical_shell_thickness", "avoid_crossing_perimeters", "thin_walls", "overhangs",
|
||||||
"seam_position", "external_perimeters_first", "fill_density", "fill_pattern", "top_fill_pattern", "bottom_fill_pattern",
|
"seam_position", "external_perimeters_first", "fill_density", "fill_pattern", "top_fill_pattern", "bottom_fill_pattern",
|
||||||
"infill_every_layers", "infill_only_where_needed", "solid_infill_every_layers", "fill_angle", "bridge_angle",
|
"infill_every_layers", "infill_only_where_needed", "solid_infill_every_layers", "fill_angle", "bridge_angle",
|
||||||
"solid_infill_below_area", "only_retract_when_crossing_perimeters", "infill_first",
|
"solid_infill_below_area", "only_retract_when_crossing_perimeters", "infill_first",
|
||||||
"ironing", "ironing_type", "ironing_flowrate", "ironing_speed", "ironing_spacing",
|
"ironing", "ironing_type", "ironing_flowrate", "ironing_speed", "ironing_spacing",
|
||||||
"max_print_speed", "max_volumetric_speed", "avoid_crossing_perimeters_max_detour",
|
"max_print_speed", "max_volumetric_speed", "avoid_crossing_perimeters_max_detour",
|
||||||
"fuzzy_skin", "fuzzy_skin_thickness", "fuzzy_skin_point_dist",
|
"fuzzy_skin", "fuzzy_skin_thickness", "fuzzy_skin_point_dist",
|
||||||
|
@ -426,7 +426,7 @@ const std::vector<std::string>& Preset::print_options()
|
||||||
"bridge_speed", "gap_fill_speed", "gap_fill_enabled", "travel_speed", "first_layer_speed", "perimeter_acceleration", "infill_acceleration",
|
"bridge_speed", "gap_fill_speed", "gap_fill_enabled", "travel_speed", "first_layer_speed", "perimeter_acceleration", "infill_acceleration",
|
||||||
"bridge_acceleration", "first_layer_acceleration", "default_acceleration", "skirts", "skirt_distance", "skirt_height", "draft_shield",
|
"bridge_acceleration", "first_layer_acceleration", "default_acceleration", "skirts", "skirt_distance", "skirt_height", "draft_shield",
|
||||||
"min_skirt_length", "brim_width", "brim_offset", "brim_type", "support_material", "support_material_auto", "support_material_threshold", "support_material_enforce_layers",
|
"min_skirt_length", "brim_width", "brim_offset", "brim_type", "support_material", "support_material_auto", "support_material_threshold", "support_material_enforce_layers",
|
||||||
"raft_layers", "raft_first_layer_density", "raft_first_layer_expansion",
|
"raft_layers", "raft_first_layer_density", "raft_first_layer_expansion", "raft_contact_distance", "raft_expansion",
|
||||||
"support_material_pattern", "support_material_with_sheath", "support_material_spacing",
|
"support_material_pattern", "support_material_with_sheath", "support_material_spacing",
|
||||||
"support_material_synchronize_layers", "support_material_angle", "support_material_interface_layers",
|
"support_material_synchronize_layers", "support_material_angle", "support_material_interface_layers",
|
||||||
"support_material_interface_spacing", "support_material_interface_contact_loops", "support_material_contact_distance",
|
"support_material_interface_spacing", "support_material_interface_contact_loops", "support_material_contact_distance",
|
||||||
|
@ -492,7 +492,7 @@ const std::vector<std::string>& Preset::printer_options()
|
||||||
"between_objects_gcode", "printer_vendor", "printer_model", "printer_variant", "printer_notes", "cooling_tube_retraction",
|
"between_objects_gcode", "printer_vendor", "printer_model", "printer_variant", "printer_notes", "cooling_tube_retraction",
|
||||||
"cooling_tube_length", "high_current_on_filament_swap", "parking_pos_retraction", "extra_loading_move", "max_print_height",
|
"cooling_tube_length", "high_current_on_filament_swap", "parking_pos_retraction", "extra_loading_move", "max_print_height",
|
||||||
"default_print_profile", "inherits",
|
"default_print_profile", "inherits",
|
||||||
"remaining_times", "silent_mode",
|
"remaining_times", "silent_mode",
|
||||||
"machine_limits_usage", "thumbnails"
|
"machine_limits_usage", "thumbnails"
|
||||||
};
|
};
|
||||||
s_opts.insert(s_opts.end(), Preset::machine_limits_options().begin(), Preset::machine_limits_options().end());
|
s_opts.insert(s_opts.end(), Preset::machine_limits_options().begin(), Preset::machine_limits_options().end());
|
||||||
|
@ -653,7 +653,7 @@ void PresetCollection::add_default_preset(const std::vector<std::string> &keys,
|
||||||
// Throws an exception on error.
|
// Throws an exception on error.
|
||||||
void PresetCollection::load_presets(const std::string &dir_path, const std::string &subdir)
|
void PresetCollection::load_presets(const std::string &dir_path, const std::string &subdir)
|
||||||
{
|
{
|
||||||
// Don't use boost::filesystem::canonical() on Windows, it is broken in regard to reparse points,
|
// Don't use boost::filesystem::canonical() on Windows, it is broken in regard to reparse points,
|
||||||
// see https://github.com/prusa3d/PrusaSlicer/issues/732
|
// see https://github.com/prusa3d/PrusaSlicer/issues/732
|
||||||
boost::filesystem::path dir = boost::filesystem::absolute(boost::filesystem::path(dir_path) / subdir).make_preferred();
|
boost::filesystem::path dir = boost::filesystem::absolute(boost::filesystem::path(dir_path) / subdir).make_preferred();
|
||||||
m_dir_path = dir.string();
|
m_dir_path = dir.string();
|
||||||
|
@ -977,7 +977,7 @@ const Preset* PresetCollection::get_selected_preset_parent() const
|
||||||
// Resolve the "renamed_from" field.
|
// Resolve the "renamed_from" field.
|
||||||
assert(! inherits.empty());
|
assert(! inherits.empty());
|
||||||
auto it = this->find_preset_renamed(inherits);
|
auto it = this->find_preset_renamed(inherits);
|
||||||
if (it != m_presets.end())
|
if (it != m_presets.end())
|
||||||
preset = &(*it);
|
preset = &(*it);
|
||||||
}
|
}
|
||||||
return (preset == nullptr/* || preset->is_default*/ || preset->is_external) ? nullptr : preset;
|
return (preset == nullptr/* || preset->is_default*/ || preset->is_external) ? nullptr : preset;
|
||||||
|
@ -992,17 +992,17 @@ const Preset* PresetCollection::get_preset_parent(const Preset& child) const
|
||||||
const Preset* preset = this->find_preset(inherits, false);
|
const Preset* preset = this->find_preset(inherits, false);
|
||||||
if (preset == nullptr) {
|
if (preset == nullptr) {
|
||||||
auto it = this->find_preset_renamed(inherits);
|
auto it = this->find_preset_renamed(inherits);
|
||||||
if (it != m_presets.end())
|
if (it != m_presets.end())
|
||||||
preset = &(*it);
|
preset = &(*it);
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
// not found
|
// not found
|
||||||
(preset == nullptr/* || preset->is_default */||
|
(preset == nullptr/* || preset->is_default */||
|
||||||
// this should not happen, user profile should not derive from an external profile
|
// this should not happen, user profile should not derive from an external profile
|
||||||
preset->is_external ||
|
preset->is_external ||
|
||||||
// this should not happen, however people are creative, see GH #4996
|
// this should not happen, however people are creative, see GH #4996
|
||||||
preset == &child) ?
|
preset == &child) ?
|
||||||
nullptr :
|
nullptr :
|
||||||
preset;
|
preset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1029,7 +1029,7 @@ const std::string& PresetCollection::get_preset_name_by_alias(const std::string&
|
||||||
// Continue over all profile names with the same alias.
|
// Continue over all profile names with the same alias.
|
||||||
it != m_map_alias_to_profile_name.end() && it->first == alias; ++ it)
|
it != m_map_alias_to_profile_name.end() && it->first == alias; ++ it)
|
||||||
if (auto it_preset = this->find_preset_internal(it->second);
|
if (auto it_preset = this->find_preset_internal(it->second);
|
||||||
it_preset != m_presets.end() && it_preset->name == it->second &&
|
it_preset != m_presets.end() && it_preset->name == it->second &&
|
||||||
it_preset->is_visible && (it_preset->is_compatible || size_t(it_preset - m_presets.begin()) == m_idx_selected))
|
it_preset->is_visible && (it_preset->is_compatible || size_t(it_preset - m_presets.begin()) == m_idx_selected))
|
||||||
return it_preset->name;
|
return it_preset->name;
|
||||||
return alias;
|
return alias;
|
||||||
|
@ -1099,7 +1099,7 @@ size_t PresetCollection::update_compatible_internal(const PresetWithVendorProfil
|
||||||
some_compatible |= preset_edited.is_compatible;
|
some_compatible |= preset_edited.is_compatible;
|
||||||
if (active_print != nullptr)
|
if (active_print != nullptr)
|
||||||
preset_edited.is_compatible &= is_compatible_with_print(this_preset_with_vendor_profile, *active_print, active_printer);
|
preset_edited.is_compatible &= is_compatible_with_print(this_preset_with_vendor_profile, *active_print, active_printer);
|
||||||
if (! preset_edited.is_compatible && selected &&
|
if (! preset_edited.is_compatible && selected &&
|
||||||
(unselect_if_incompatible == PresetSelectCompatibleType::Always || (unselect_if_incompatible == PresetSelectCompatibleType::OnlyIfWasCompatible && was_compatible)))
|
(unselect_if_incompatible == PresetSelectCompatibleType::Always || (unselect_if_incompatible == PresetSelectCompatibleType::OnlyIfWasCompatible && was_compatible)))
|
||||||
m_idx_selected = size_t(-1);
|
m_idx_selected = size_t(-1);
|
||||||
if (selected)
|
if (selected)
|
||||||
|
@ -1440,13 +1440,13 @@ const std::set<std::string>& PhysicalPrinter::get_preset_names() const
|
||||||
return preset_names;
|
return preset_names;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PhysicalPrinter::has_empty_config() const
|
bool PhysicalPrinter::has_empty_config() const
|
||||||
{
|
{
|
||||||
return config.opt_string("print_host" ).empty() &&
|
return config.opt_string("print_host" ).empty() &&
|
||||||
config.opt_string("printhost_apikey" ).empty() &&
|
config.opt_string("printhost_apikey" ).empty() &&
|
||||||
config.opt_string("printhost_cafile" ).empty() &&
|
config.opt_string("printhost_cafile" ).empty() &&
|
||||||
config.opt_string("printhost_port" ).empty() &&
|
config.opt_string("printhost_port" ).empty() &&
|
||||||
config.opt_string("printhost_user" ).empty() &&
|
config.opt_string("printhost_user" ).empty() &&
|
||||||
config.opt_string("printhost_password").empty();
|
config.opt_string("printhost_password").empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1458,7 +1458,7 @@ void PhysicalPrinter::update_preset_names_in_config()
|
||||||
name += el + ";";
|
name += el + ";";
|
||||||
name.pop_back();
|
name.pop_back();
|
||||||
config.set_key_value("preset_name", new ConfigOptionString(name));
|
config.set_key_value("preset_name", new ConfigOptionString(name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhysicalPrinter::save(const std::string& file_name_from, const std::string& file_name_to)
|
void PhysicalPrinter::save(const std::string& file_name_from, const std::string& file_name_to)
|
||||||
|
@ -1507,7 +1507,7 @@ bool PhysicalPrinter::delete_preset(const std::string& preset_name)
|
||||||
return preset_names.erase(preset_name) > 0;
|
return preset_names.erase(preset_name) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
PhysicalPrinter::PhysicalPrinter(const std::string& name, const DynamicPrintConfig& default_config) :
|
PhysicalPrinter::PhysicalPrinter(const std::string& name, const DynamicPrintConfig& default_config) :
|
||||||
name(name), config(default_config)
|
name(name), config(default_config)
|
||||||
{
|
{
|
||||||
update_from_config(config);
|
update_from_config(config);
|
||||||
|
@ -1564,7 +1564,7 @@ PhysicalPrinterCollection::PhysicalPrinterCollection( const std::vector<std::str
|
||||||
// Throws an exception on error.
|
// Throws an exception on error.
|
||||||
void PhysicalPrinterCollection::load_printers(const std::string& dir_path, const std::string& subdir)
|
void PhysicalPrinterCollection::load_printers(const std::string& dir_path, const std::string& subdir)
|
||||||
{
|
{
|
||||||
// Don't use boost::filesystem::canonical() on Windows, it is broken in regard to reparse points,
|
// Don't use boost::filesystem::canonical() on Windows, it is broken in regard to reparse points,
|
||||||
// see https://github.com/prusa3d/PrusaSlicer/issues/732
|
// see https://github.com/prusa3d/PrusaSlicer/issues/732
|
||||||
boost::filesystem::path dir = boost::filesystem::absolute(boost::filesystem::path(dir_path) / subdir).make_preferred();
|
boost::filesystem::path dir = boost::filesystem::absolute(boost::filesystem::path(dir_path) / subdir).make_preferred();
|
||||||
m_dir_path = dir.string();
|
m_dir_path = dir.string();
|
||||||
|
@ -1716,7 +1716,7 @@ PhysicalPrinter* PhysicalPrinterCollection::find_printer_with_same_config(const
|
||||||
for (const char *opt : legacy_print_host_options)
|
for (const char *opt : legacy_print_host_options)
|
||||||
if (is_equal && printer.config.opt_string(opt) != config.opt_string(opt))
|
if (is_equal && printer.config.opt_string(opt) != config.opt_string(opt))
|
||||||
is_equal = false;
|
is_equal = false;
|
||||||
|
|
||||||
if (is_equal)
|
if (is_equal)
|
||||||
return find_printer(printer.name);
|
return find_printer(printer.name);
|
||||||
}
|
}
|
||||||
|
@ -1732,7 +1732,7 @@ std::string PhysicalPrinterCollection::path_from_name(const std::string& new_nam
|
||||||
|
|
||||||
void PhysicalPrinterCollection::save_printer(PhysicalPrinter& edited_printer, const std::string& renamed_from/* = ""*/)
|
void PhysicalPrinterCollection::save_printer(PhysicalPrinter& edited_printer, const std::string& renamed_from/* = ""*/)
|
||||||
{
|
{
|
||||||
// controll and update preset_names in edited_printer config
|
// controll and update preset_names in edited_printer config
|
||||||
edited_printer.update_preset_names_in_config();
|
edited_printer.update_preset_names_in_config();
|
||||||
|
|
||||||
std::string name = renamed_from.empty() ? edited_printer.name : renamed_from;
|
std::string name = renamed_from.empty() ? edited_printer.name : renamed_from;
|
||||||
|
@ -1824,7 +1824,7 @@ std::vector<std::string> PhysicalPrinterCollection::get_printers_with_preset(con
|
||||||
|
|
||||||
for (auto printer : m_printers) {
|
for (auto printer : m_printers) {
|
||||||
if (printer.preset_names.size() == 1)
|
if (printer.preset_names.size() == 1)
|
||||||
continue;
|
continue;
|
||||||
if (printer.preset_names.find(preset_name) != printer.preset_names.end())
|
if (printer.preset_names.find(preset_name) != printer.preset_names.end())
|
||||||
printers.emplace_back(printer.name);
|
printers.emplace_back(printer.name);
|
||||||
}
|
}
|
||||||
|
@ -1894,7 +1894,7 @@ void PhysicalPrinterCollection::unselect_printer()
|
||||||
|
|
||||||
bool PhysicalPrinterCollection::is_selected(PhysicalPrinterCollection::ConstIterator it, const std::string& preset_name) const
|
bool PhysicalPrinterCollection::is_selected(PhysicalPrinterCollection::ConstIterator it, const std::string& preset_name) const
|
||||||
{
|
{
|
||||||
return m_idx_selected == size_t(it - m_printers.begin()) &&
|
return m_idx_selected == size_t(it - m_printers.begin()) &&
|
||||||
m_selected_preset == preset_name;
|
m_selected_preset == preset_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1775,6 +1775,24 @@ void PrintConfigDef::init_fff_params()
|
||||||
def->set_default_value(new ConfigOptionString(""));
|
def->set_default_value(new ConfigOptionString(""));
|
||||||
def->cli = ConfigOptionDef::nocli;
|
def->cli = ConfigOptionDef::nocli;
|
||||||
|
|
||||||
|
def = this->add("raft_contact_distance", coFloat);
|
||||||
|
def->label = L("Raft contact Z distance");
|
||||||
|
def->category = L("Support material");
|
||||||
|
def->tooltip = L("The vertical distance between object and raft. Ignored for soluble interface.");
|
||||||
|
def->sidetext = L("mm");
|
||||||
|
def->min = 0;
|
||||||
|
def->mode = comAdvanced;
|
||||||
|
def->set_default_value(new ConfigOptionFloat(0.1));
|
||||||
|
|
||||||
|
def = this->add("raft_expansion", coFloat);
|
||||||
|
def->label = L("Raft expansion");
|
||||||
|
def->category = L("Support material");
|
||||||
|
def->tooltip = L("Expansion of the raft in XY plane for better stability.");
|
||||||
|
def->sidetext = L("mm");
|
||||||
|
def->min = 0;
|
||||||
|
def->mode = comExpert;
|
||||||
|
def->set_default_value(new ConfigOptionFloat(1.5));
|
||||||
|
|
||||||
def = this->add("raft_first_layer_density", coPercent);
|
def = this->add("raft_first_layer_density", coPercent);
|
||||||
def->label = L("First layer density");
|
def->label = L("First layer density");
|
||||||
def->category = L("Support material");
|
def->category = L("Support material");
|
||||||
|
|
|
@ -473,6 +473,8 @@ public:
|
||||||
// Force the generation of solid shells between adjacent materials/volumes.
|
// Force the generation of solid shells between adjacent materials/volumes.
|
||||||
ConfigOptionBool interface_shells;
|
ConfigOptionBool interface_shells;
|
||||||
ConfigOptionFloat layer_height;
|
ConfigOptionFloat layer_height;
|
||||||
|
ConfigOptionFloat raft_contact_distance;
|
||||||
|
ConfigOptionFloat raft_expansion;
|
||||||
ConfigOptionPercent raft_first_layer_density;
|
ConfigOptionPercent raft_first_layer_density;
|
||||||
ConfigOptionFloat raft_first_layer_expansion;
|
ConfigOptionFloat raft_first_layer_expansion;
|
||||||
ConfigOptionInt raft_layers;
|
ConfigOptionInt raft_layers;
|
||||||
|
@ -522,6 +524,8 @@ protected:
|
||||||
OPT_PTR(infill_only_where_needed);
|
OPT_PTR(infill_only_where_needed);
|
||||||
OPT_PTR(interface_shells);
|
OPT_PTR(interface_shells);
|
||||||
OPT_PTR(layer_height);
|
OPT_PTR(layer_height);
|
||||||
|
OPT_PTR(raft_contact_distance);
|
||||||
|
OPT_PTR(raft_expansion);
|
||||||
OPT_PTR(raft_first_layer_density);
|
OPT_PTR(raft_first_layer_density);
|
||||||
OPT_PTR(raft_first_layer_expansion);
|
OPT_PTR(raft_first_layer_expansion);
|
||||||
OPT_PTR(raft_layers);
|
OPT_PTR(raft_layers);
|
||||||
|
@ -1090,7 +1094,7 @@ public:
|
||||||
// The percentage of smaller pillars compared to the normal pillar diameter
|
// The percentage of smaller pillars compared to the normal pillar diameter
|
||||||
// which are used in problematic areas where a normal pilla cannot fit.
|
// which are used in problematic areas where a normal pilla cannot fit.
|
||||||
ConfigOptionPercent support_small_pillar_diameter_percent;
|
ConfigOptionPercent support_small_pillar_diameter_percent;
|
||||||
|
|
||||||
// How much bridge (supporting another pinhead) can be placed on a pillar.
|
// How much bridge (supporting another pinhead) can be placed on a pillar.
|
||||||
ConfigOptionInt support_max_bridges_on_pillar;
|
ConfigOptionInt support_max_bridges_on_pillar;
|
||||||
|
|
||||||
|
@ -1142,7 +1146,7 @@ public:
|
||||||
|
|
||||||
// The height of the pad from the bottom to the top not considering the pit
|
// The height of the pad from the bottom to the top not considering the pit
|
||||||
ConfigOptionFloat pad_wall_height /*= 5*/;
|
ConfigOptionFloat pad_wall_height /*= 5*/;
|
||||||
|
|
||||||
// How far should the pad extend around the contained geometry
|
// How far should the pad extend around the contained geometry
|
||||||
ConfigOptionFloat pad_brim_size;
|
ConfigOptionFloat pad_brim_size;
|
||||||
|
|
||||||
|
@ -1166,7 +1170,7 @@ public:
|
||||||
|
|
||||||
// Disable the elevation (ignore its value) and use the zero elevation mode
|
// Disable the elevation (ignore its value) and use the zero elevation mode
|
||||||
ConfigOptionBool pad_around_object;
|
ConfigOptionBool pad_around_object;
|
||||||
|
|
||||||
ConfigOptionBool pad_around_object_everywhere;
|
ConfigOptionBool pad_around_object_everywhere;
|
||||||
|
|
||||||
// This is the gap between the object bottom and the generated pad
|
// This is the gap between the object bottom and the generated pad
|
||||||
|
@ -1180,7 +1184,7 @@ public:
|
||||||
|
|
||||||
// How much should the tiny connectors penetrate into the model body
|
// How much should the tiny connectors penetrate into the model body
|
||||||
ConfigOptionFloat pad_object_connector_penetration;
|
ConfigOptionFloat pad_object_connector_penetration;
|
||||||
|
|
||||||
// /////////////////////////////////////////////////////////////////////////
|
// /////////////////////////////////////////////////////////////////////////
|
||||||
// Model hollowing parameters:
|
// Model hollowing parameters:
|
||||||
// - Models can be hollowed out as part of the SLA print process
|
// - Models can be hollowed out as part of the SLA print process
|
||||||
|
@ -1189,17 +1193,17 @@ public:
|
||||||
// - Additional holes will be drilled into the hollow model to allow for
|
// - Additional holes will be drilled into the hollow model to allow for
|
||||||
// - resin removal.
|
// - resin removal.
|
||||||
// /////////////////////////////////////////////////////////////////////////
|
// /////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
ConfigOptionBool hollowing_enable;
|
ConfigOptionBool hollowing_enable;
|
||||||
|
|
||||||
// The minimum thickness of the model walls to maintain. Note that the
|
// The minimum thickness of the model walls to maintain. Note that the
|
||||||
// resulting walls may be thicker due to smoothing out fine cavities where
|
// resulting walls may be thicker due to smoothing out fine cavities where
|
||||||
// resin could stuck.
|
// resin could stuck.
|
||||||
ConfigOptionFloat hollowing_min_thickness;
|
ConfigOptionFloat hollowing_min_thickness;
|
||||||
|
|
||||||
// Indirectly controls the voxel size (resolution) used by openvdb
|
// Indirectly controls the voxel size (resolution) used by openvdb
|
||||||
ConfigOptionFloat hollowing_quality;
|
ConfigOptionFloat hollowing_quality;
|
||||||
|
|
||||||
// Indirectly controls the minimum size of created cavities.
|
// Indirectly controls the minimum size of created cavities.
|
||||||
ConfigOptionFloat hollowing_closing_distance;
|
ConfigOptionFloat hollowing_closing_distance;
|
||||||
|
|
||||||
|
@ -1421,13 +1425,13 @@ Points get_bed_shape(const SLAPrinterConfig &cfg);
|
||||||
// ModelConfig is a wrapper around DynamicPrintConfig with an addition of a timestamp.
|
// ModelConfig is a wrapper around DynamicPrintConfig with an addition of a timestamp.
|
||||||
// Each change of ModelConfig is tracked by assigning a new timestamp from a global counter.
|
// Each change of ModelConfig is tracked by assigning a new timestamp from a global counter.
|
||||||
// The counter is used for faster synchronization of the background slicing thread
|
// The counter is used for faster synchronization of the background slicing thread
|
||||||
// with the front end by skipping synchronization of equal config dictionaries.
|
// with the front end by skipping synchronization of equal config dictionaries.
|
||||||
// The global counter is also used for avoiding unnecessary serialization of config
|
// The global counter is also used for avoiding unnecessary serialization of config
|
||||||
// dictionaries when taking an Undo snapshot.
|
// dictionaries when taking an Undo snapshot.
|
||||||
//
|
//
|
||||||
// The global counter is NOT thread safe, therefore it is recommended to use ModelConfig from
|
// The global counter is NOT thread safe, therefore it is recommended to use ModelConfig from
|
||||||
// the main thread only.
|
// the main thread only.
|
||||||
//
|
//
|
||||||
// As there is a global counter and it is being increased with each change to any ModelConfig,
|
// As there is a global counter and it is being increased with each change to any ModelConfig,
|
||||||
// if two ModelConfig dictionaries differ, they should differ with their timestamp as well.
|
// if two ModelConfig dictionaries differ, they should differ with their timestamp as well.
|
||||||
// Therefore copying the ModelConfig including its timestamp is safe as there is no harm
|
// Therefore copying the ModelConfig including its timestamp is safe as there is no harm
|
||||||
|
|
|
@ -542,6 +542,7 @@ bool PrintObject::invalidate_state_by_config_options(
|
||||||
opt_key == "layer_height"
|
opt_key == "layer_height"
|
||||||
|| opt_key == "first_layer_height"
|
|| opt_key == "first_layer_height"
|
||||||
|| opt_key == "raft_layers"
|
|| opt_key == "raft_layers"
|
||||||
|
|| opt_key == "raft_contact_distance"
|
||||||
|| opt_key == "slice_closing_radius") {
|
|| opt_key == "slice_closing_radius") {
|
||||||
steps.emplace_back(posSlice);
|
steps.emplace_back(posSlice);
|
||||||
} else if (
|
} else if (
|
||||||
|
@ -576,6 +577,7 @@ bool PrintObject::invalidate_state_by_config_options(
|
||||||
|| opt_key == "support_material_synchronize_layers"
|
|| opt_key == "support_material_synchronize_layers"
|
||||||
|| opt_key == "support_material_threshold"
|
|| opt_key == "support_material_threshold"
|
||||||
|| opt_key == "support_material_with_sheath"
|
|| opt_key == "support_material_with_sheath"
|
||||||
|
|| opt_key == "raft_expansion"
|
||||||
|| opt_key == "raft_first_layer_density"
|
|| opt_key == "raft_first_layer_density"
|
||||||
|| opt_key == "raft_first_layer_expansion"
|
|| opt_key == "raft_first_layer_expansion"
|
||||||
|| opt_key == "dont_support_bridges"
|
|| opt_key == "dont_support_bridges"
|
||||||
|
@ -766,10 +768,6 @@ void PrintObject::detect_surfaces_type()
|
||||||
// In non-spiral vase mode, go over all layers.
|
// In non-spiral vase mode, go over all layers.
|
||||||
m_layers.size()),
|
m_layers.size()),
|
||||||
[this, idx_region, interface_shells, &surfaces_new](const tbb::blocked_range<size_t>& range) {
|
[this, idx_region, interface_shells, &surfaces_new](const tbb::blocked_range<size_t>& range) {
|
||||||
// If we have raft layers, consider bottom layer as a bridge just like any other bottom surface lying on the void.
|
|
||||||
SurfaceType surface_type_bottom_1st =
|
|
||||||
(this->has_raft() && m_config.support_material_contact_distance.value > 0) ?
|
|
||||||
stBottomBridge : stBottom;
|
|
||||||
// If we have soluble support material, don't bridge. The overhang will be squished against a soluble layer separating
|
// If we have soluble support material, don't bridge. The overhang will be squished against a soluble layer separating
|
||||||
// the support from the print.
|
// the support from the print.
|
||||||
SurfaceType surface_type_bottom_other =
|
SurfaceType surface_type_bottom_other =
|
||||||
|
@ -848,7 +846,7 @@ void PrintObject::detect_surfaces_type()
|
||||||
// we clone surfaces because we're going to clear the slices collection
|
// we clone surfaces because we're going to clear the slices collection
|
||||||
bottom = layerm->slices.surfaces;
|
bottom = layerm->slices.surfaces;
|
||||||
for (Surface &surface : bottom)
|
for (Surface &surface : bottom)
|
||||||
surface.surface_type = surface_type_bottom_1st;
|
surface.surface_type = stBottom;
|
||||||
}
|
}
|
||||||
|
|
||||||
// now, if the object contained a thin membrane, we could have overlapping bottom
|
// now, if the object contained a thin membrane, we could have overlapping bottom
|
||||||
|
@ -1945,7 +1943,7 @@ end:
|
||||||
BOOST_LOG_TRIVIAL(debug) << "Slicing objects - make_slices in parallel - begin";
|
BOOST_LOG_TRIVIAL(debug) << "Slicing objects - make_slices in parallel - begin";
|
||||||
{
|
{
|
||||||
// Compensation value, scaled.
|
// Compensation value, scaled.
|
||||||
const float xy_compensation_scaled = float(scale_(m_config.xy_size_compensation.value));
|
const float xy_compensation_scaled = float(scale_(m_config.xy_size_compensation.value));
|
||||||
const float elephant_foot_compensation_scaled = (m_config.raft_layers == 0) ?
|
const float elephant_foot_compensation_scaled = (m_config.raft_layers == 0) ?
|
||||||
// Only enable Elephant foot compensation if printing directly on the print bed.
|
// Only enable Elephant foot compensation if printing directly on the print bed.
|
||||||
float(scale_(m_config.elefant_foot_compensation.value)) :
|
float(scale_(m_config.elefant_foot_compensation.value)) :
|
||||||
|
|
|
@ -111,7 +111,7 @@ SlicingParameters SlicingParameters::create_from_config(
|
||||||
params.max_layer_height = std::max(params.max_layer_height, params.layer_height);
|
params.max_layer_height = std::max(params.max_layer_height, params.layer_height);
|
||||||
|
|
||||||
if (! soluble_interface) {
|
if (! soluble_interface) {
|
||||||
params.gap_raft_object = object_config.support_material_contact_distance.value;
|
params.gap_raft_object = object_config.raft_contact_distance.value;
|
||||||
params.gap_object_support = object_config.support_material_contact_distance.value;
|
params.gap_object_support = object_config.support_material_contact_distance.value;
|
||||||
params.gap_support_object = object_config.support_material_contact_distance.value;
|
params.gap_support_object = object_config.support_material_contact_distance.value;
|
||||||
}
|
}
|
||||||
|
@ -122,27 +122,9 @@ SlicingParameters SlicingParameters::create_from_config(
|
||||||
// Use as large as possible layer height for the intermediate raft layers.
|
// Use as large as possible layer height for the intermediate raft layers.
|
||||||
params.base_raft_layer_height = std::max(params.layer_height, 0.75 * support_material_extruder_dmr);
|
params.base_raft_layer_height = std::max(params.layer_height, 0.75 * support_material_extruder_dmr);
|
||||||
params.interface_raft_layer_height = std::max(params.layer_height, 0.75 * support_material_interface_extruder_dmr);
|
params.interface_raft_layer_height = std::max(params.layer_height, 0.75 * support_material_interface_extruder_dmr);
|
||||||
params.contact_raft_layer_height_bridging = false;
|
|
||||||
params.first_object_layer_bridging = false;
|
params.first_object_layer_bridging = false;
|
||||||
#if 1
|
|
||||||
params.contact_raft_layer_height = std::max(params.layer_height, 0.75 * support_material_interface_extruder_dmr);
|
params.contact_raft_layer_height = std::max(params.layer_height, 0.75 * support_material_interface_extruder_dmr);
|
||||||
if (! soluble_interface) {
|
params.first_object_layer_height = params.layer_height;
|
||||||
// Compute the average of all nozzles used for printing the object over a raft.
|
|
||||||
//FIXME It is expected, that the 1st layer of the object is printed with a bridging flow over a full raft. Shall it not be vice versa?
|
|
||||||
coordf_t average_object_extruder_dmr = 0.;
|
|
||||||
if (! object_extruders.empty()) {
|
|
||||||
for (unsigned int extruder_id : object_extruders)
|
|
||||||
average_object_extruder_dmr += print_config.nozzle_diameter.get_at(extruder_id);
|
|
||||||
average_object_extruder_dmr /= coordf_t(object_extruders.size());
|
|
||||||
}
|
|
||||||
params.first_object_layer_height = average_object_extruder_dmr;
|
|
||||||
params.first_object_layer_bridging = true;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
params.contact_raft_layer_height = soluble_interface ? support_material_interface_extruder_dmr : 0.75 * support_material_interface_extruder_dmr;
|
|
||||||
params.contact_raft_layer_height_bridging = ! soluble_interface;
|
|
||||||
...
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (params.has_raft()) {
|
if (params.has_raft()) {
|
||||||
|
@ -150,8 +132,8 @@ SlicingParameters SlicingParameters::create_from_config(
|
||||||
//FIXME The last raft layer is the contact layer, which shall be printed with a bridging flow for ease of separation. Currently it is not the case.
|
//FIXME The last raft layer is the contact layer, which shall be printed with a bridging flow for ease of separation. Currently it is not the case.
|
||||||
if (params.raft_layers() == 1) {
|
if (params.raft_layers() == 1) {
|
||||||
// There is only the contact layer.
|
// There is only the contact layer.
|
||||||
params.contact_raft_layer_height = first_layer_height;
|
params.contact_raft_layer_height = first_layer_height;
|
||||||
params.raft_contact_top_z = first_layer_height;
|
params.raft_contact_top_z = first_layer_height;
|
||||||
} else {
|
} else {
|
||||||
assert(params.base_raft_layers > 0);
|
assert(params.base_raft_layers > 0);
|
||||||
assert(params.interface_raft_layers > 0);
|
assert(params.interface_raft_layers > 0);
|
||||||
|
|
|
@ -55,7 +55,6 @@ struct SlicingParameters
|
||||||
coordf_t base_raft_layer_height;
|
coordf_t base_raft_layer_height;
|
||||||
coordf_t interface_raft_layer_height;
|
coordf_t interface_raft_layer_height;
|
||||||
coordf_t contact_raft_layer_height;
|
coordf_t contact_raft_layer_height;
|
||||||
bool contact_raft_layer_height_bridging;
|
|
||||||
|
|
||||||
// The regular layer height, applied for all but the first layer, if not overridden by layer ranges
|
// The regular layer height, applied for all but the first layer, if not overridden by layer ranges
|
||||||
// or by the variable layer thickness table.
|
// or by the variable layer thickness table.
|
||||||
|
@ -110,7 +109,6 @@ inline bool equal_layering(const SlicingParameters &sp1, const SlicingParameters
|
||||||
sp1.base_raft_layer_height == sp2.base_raft_layer_height &&
|
sp1.base_raft_layer_height == sp2.base_raft_layer_height &&
|
||||||
sp1.interface_raft_layer_height == sp2.interface_raft_layer_height &&
|
sp1.interface_raft_layer_height == sp2.interface_raft_layer_height &&
|
||||||
sp1.contact_raft_layer_height == sp2.contact_raft_layer_height &&
|
sp1.contact_raft_layer_height == sp2.contact_raft_layer_height &&
|
||||||
sp1.contact_raft_layer_height_bridging == sp2.contact_raft_layer_height_bridging &&
|
|
||||||
sp1.layer_height == sp2.layer_height &&
|
sp1.layer_height == sp2.layer_height &&
|
||||||
sp1.min_layer_height == sp2.min_layer_height &&
|
sp1.min_layer_height == sp2.min_layer_height &&
|
||||||
sp1.max_layer_height == sp2.max_layer_height &&
|
sp1.max_layer_height == sp2.max_layer_height &&
|
||||||
|
|
|
@ -44,6 +44,10 @@
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
|
|
||||||
|
// how much we extend support around the actual contact area
|
||||||
|
//FIXME this should be dependent on the nozzle diameter!
|
||||||
|
#define SUPPORT_MATERIAL_MARGIN 1.5
|
||||||
|
|
||||||
// Increment used to reach MARGIN in steps to avoid trespassing thin objects
|
// Increment used to reach MARGIN in steps to avoid trespassing thin objects
|
||||||
#define NUM_MARGIN_STEPS 3
|
#define NUM_MARGIN_STEPS 3
|
||||||
|
|
||||||
|
@ -1342,8 +1346,8 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_
|
||||||
// we're here just to get the object footprint for the raft.
|
// we're here just to get the object footprint for the raft.
|
||||||
// We only consider contours and discard holes to get a more continuous raft.
|
// We only consider contours and discard holes to get a more continuous raft.
|
||||||
overhang_polygons = collect_slices_outer(layer);
|
overhang_polygons = collect_slices_outer(layer);
|
||||||
// Extend by SUPPORT_MATERIAL_MARGIN, which is 1.5mm
|
// Expand for better stability.
|
||||||
contact_polygons = offset(overhang_polygons, scale_(SUPPORT_MATERIAL_MARGIN));
|
contact_polygons = offset(overhang_polygons, scaled<float>(m_object_config->raft_expansion.value));
|
||||||
} else {
|
} else {
|
||||||
// Generate overhang / contact_polygons for non-raft layers.
|
// Generate overhang / contact_polygons for non-raft layers.
|
||||||
const Layer &lower_layer = *object.layers()[layer_id-1];
|
const Layer &lower_layer = *object.layers()[layer_id-1];
|
||||||
|
@ -2178,7 +2182,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int
|
||||||
assert(extr2z > extr1z || (extr1 != nullptr && extr2->layer_type == sltBottomContact));
|
assert(extr2z > extr1z || (extr1 != nullptr && extr2->layer_type == sltBottomContact));
|
||||||
if (std::abs(extr1z) < EPSILON) {
|
if (std::abs(extr1z) < EPSILON) {
|
||||||
// This layer interval starts with the 1st layer. Print the 1st layer using the prescribed 1st layer thickness.
|
// This layer interval starts with the 1st layer. Print the 1st layer using the prescribed 1st layer thickness.
|
||||||
assert(! m_slicing_params.has_raft());
|
// assert(! m_slicing_params.has_raft()); RaftingEdition: unclear where the issue is: assert fails with 1-layer raft & base supports
|
||||||
assert(intermediate_layers.empty() || intermediate_layers.back()->print_z <= m_slicing_params.first_print_layer_height);
|
assert(intermediate_layers.empty() || intermediate_layers.back()->print_z <= m_slicing_params.first_print_layer_height);
|
||||||
// At this point only layers above first_print_layer_heigth + EPSILON are expected as the other cases were captured earlier.
|
// At this point only layers above first_print_layer_heigth + EPSILON are expected as the other cases were captured earlier.
|
||||||
assert(extr2z >= m_slicing_params.first_print_layer_height + EPSILON);
|
assert(extr2z >= m_slicing_params.first_print_layer_height + EPSILON);
|
||||||
|
@ -3540,15 +3544,17 @@ void PrintObjectSupportMaterial::generate_toolpaths(
|
||||||
} else
|
} else
|
||||||
continue;
|
continue;
|
||||||
filler->link_max_length = coord_t(scale_(filler->spacing * link_max_length_factor / density));
|
filler->link_max_length = coord_t(scale_(filler->spacing * link_max_length_factor / density));
|
||||||
fill_expolygons_generate_paths(
|
fill_expolygons_with_sheath_generate_paths(
|
||||||
// Destination
|
// Destination
|
||||||
support_layer.support_fills.entities,
|
support_layer.support_fills.entities,
|
||||||
// Regions to fill
|
// Regions to fill
|
||||||
offset2_ex(raft_layer.polygons, float(SCALED_EPSILON), float(- SCALED_EPSILON)),
|
raft_layer.polygons,
|
||||||
// Filler and its parameters
|
// Filler and its parameters
|
||||||
filler, density,
|
filler, density,
|
||||||
// Extrusion parameters
|
// Extrusion parameters
|
||||||
(support_layer_id < m_slicing_params.base_raft_layers) ? erSupportMaterial : erSupportMaterialInterface, flow);
|
(support_layer_id < m_slicing_params.base_raft_layers) ? erSupportMaterial : erSupportMaterialInterface, flow,
|
||||||
|
// sheath at first layer
|
||||||
|
support_layer_id == 0);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -11,10 +11,6 @@ class PrintObject;
|
||||||
class PrintConfig;
|
class PrintConfig;
|
||||||
class PrintObjectConfig;
|
class PrintObjectConfig;
|
||||||
|
|
||||||
// how much we extend support around the actual contact area
|
|
||||||
//FIXME this should be dependent on the nozzle diameter!
|
|
||||||
#define SUPPORT_MATERIAL_MARGIN 1.5
|
|
||||||
|
|
||||||
// This class manages raft and supports for a single PrintObject.
|
// This class manages raft and supports for a single PrintObject.
|
||||||
// Instantiated by Slic3r::Print::Object->_support_material()
|
// Instantiated by Slic3r::Print::Object->_support_material()
|
||||||
// This class is instantiated before the slicing starts as Object.pm will query
|
// This class is instantiated before the slicing starts as Object.pm will query
|
||||||
|
|
|
@ -294,6 +294,9 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config)
|
||||||
toggle_field("support_material_extruder", have_support_material || have_skirt);
|
toggle_field("support_material_extruder", have_support_material || have_skirt);
|
||||||
toggle_field("support_material_speed", have_support_material || have_brim || have_skirt);
|
toggle_field("support_material_speed", have_support_material || have_brim || have_skirt);
|
||||||
|
|
||||||
|
toggle_field("raft_contact_distance", have_raft && !have_support_soluble);
|
||||||
|
toggle_field("raft_expansion", have_raft);
|
||||||
|
|
||||||
bool has_ironing = config->opt_bool("ironing");
|
bool has_ironing = config->opt_bool("ironing");
|
||||||
for (auto el : { "ironing_type", "ironing_flowrate", "ironing_spacing", "ironing_speed" })
|
for (auto el : { "ironing_type", "ironing_flowrate", "ironing_spacing", "ironing_speed" })
|
||||||
toggle_field(el, has_ironing);
|
toggle_field(el, has_ironing);
|
||||||
|
|
|
@ -93,8 +93,8 @@ void Field::PostInitialize()
|
||||||
{
|
{
|
||||||
case coPercents:
|
case coPercents:
|
||||||
case coFloats:
|
case coFloats:
|
||||||
case coStrings:
|
case coStrings:
|
||||||
case coBools:
|
case coBools:
|
||||||
case coInts: {
|
case coInts: {
|
||||||
auto tag_pos = m_opt_id.find("#");
|
auto tag_pos = m_opt_id.find("#");
|
||||||
if (tag_pos != std::string::npos)
|
if (tag_pos != std::string::npos)
|
||||||
|
@ -112,7 +112,7 @@ void Field::PostInitialize()
|
||||||
BUILD();
|
BUILD();
|
||||||
|
|
||||||
// For the mode, when settings are in non-modal dialog, neither dialog nor tabpanel doesn't receive wxEVT_KEY_UP event, when some field is selected.
|
// For the mode, when settings are in non-modal dialog, neither dialog nor tabpanel doesn't receive wxEVT_KEY_UP event, when some field is selected.
|
||||||
// So, like a workaround check wxEVT_KEY_UP event for the Filed and switch between tabs if Ctrl+(1-4) was pressed
|
// So, like a workaround check wxEVT_KEY_UP event for the Filed and switch between tabs if Ctrl+(1-4) was pressed
|
||||||
if (getWindow())
|
if (getWindow())
|
||||||
getWindow()->Bind(wxEVT_KEY_UP, [](wxKeyEvent& evt) {
|
getWindow()->Bind(wxEVT_KEY_UP, [](wxKeyEvent& evt) {
|
||||||
if ((evt.GetModifiers() & wxMOD_CONTROL) != 0) {
|
if ((evt.GetModifiers() & wxMOD_CONTROL) != 0) {
|
||||||
|
@ -136,7 +136,7 @@ void Field::PostInitialize()
|
||||||
// tab panel should be focused for correct navigation between tabs
|
// tab panel should be focused for correct navigation between tabs
|
||||||
wxGetApp().tab_panel()->SetFocus();
|
wxGetApp().tab_panel()->SetFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
evt.Skip();
|
evt.Skip();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -149,7 +149,7 @@ int Field::def_width_thinner() { return 4; }
|
||||||
void Field::on_kill_focus()
|
void Field::on_kill_focus()
|
||||||
{
|
{
|
||||||
// call the registered function if it is available
|
// call the registered function if it is available
|
||||||
if (m_on_kill_focus!=nullptr)
|
if (m_on_kill_focus!=nullptr)
|
||||||
m_on_kill_focus(m_opt_id);
|
m_on_kill_focus(m_opt_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,7 +158,7 @@ void Field::on_set_focus(wxEvent& event)
|
||||||
// to allow the default behavior
|
// to allow the default behavior
|
||||||
event.Skip();
|
event.Skip();
|
||||||
// call the registered function if it is available
|
// call the registered function if it is available
|
||||||
if (m_on_set_focus!=nullptr)
|
if (m_on_set_focus!=nullptr)
|
||||||
m_on_set_focus(m_opt_id);
|
m_on_set_focus(m_opt_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,7 +197,7 @@ wxString Field::get_tooltip_text(const wxString& default_string)
|
||||||
if (tooltip.length() > 0)
|
if (tooltip.length() > 0)
|
||||||
tooltip_text = tooltip + "\n" + _(L("default value")) + "\t: " +
|
tooltip_text = tooltip + "\n" + _(L("default value")) + "\t: " +
|
||||||
(boost::iends_with(opt_id, "_gcode") ? "\n" : "") + default_string +
|
(boost::iends_with(opt_id, "_gcode") ? "\n" : "") + default_string +
|
||||||
(boost::iends_with(opt_id, "_gcode") ? "" : "\n") +
|
(boost::iends_with(opt_id, "_gcode") ? "" : "\n") +
|
||||||
_(L("parameter name")) + "\t: " + opt_id;
|
_(L("parameter name")) + "\t: " + opt_id;
|
||||||
|
|
||||||
return tooltip_text;
|
return tooltip_text;
|
||||||
|
@ -221,7 +221,7 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true
|
||||||
case coPercents:
|
case coPercents:
|
||||||
case coFloats:
|
case coFloats:
|
||||||
case coFloat:{
|
case coFloat:{
|
||||||
if (m_opt.type == coPercent && !str.IsEmpty() && str.Last() == '%')
|
if (m_opt.type == coPercent && !str.IsEmpty() && str.Last() == '%')
|
||||||
str.RemoveLast();
|
str.RemoveLast();
|
||||||
else if (!str.IsEmpty() && str.Last() == '%')
|
else if (!str.IsEmpty() && str.Last() == '%')
|
||||||
{
|
{
|
||||||
|
@ -335,7 +335,7 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true
|
||||||
set_value(stVal, false); // it's no needed but can be helpful, when inputted value contained "," instead of "."
|
set_value(stVal, false); // it's no needed but can be helpful, when inputted value contained "," instead of "."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_value = std::string(str.ToUTF8().data());
|
m_value = std::string(str.ToUTF8().data());
|
||||||
break; }
|
break; }
|
||||||
|
|
||||||
|
@ -362,8 +362,8 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true
|
||||||
out_of_range_val = true;
|
out_of_range_val = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
invalid_val = true;
|
invalid_val = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -415,7 +415,7 @@ void TextCtrl::BUILD() {
|
||||||
if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit);
|
if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit);
|
||||||
if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit);
|
if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit);
|
||||||
|
|
||||||
wxString text_value = wxString("");
|
wxString text_value = wxString("");
|
||||||
|
|
||||||
switch (m_opt.type) {
|
switch (m_opt.type) {
|
||||||
case coFloatOrPercent:
|
case coFloatOrPercent:
|
||||||
|
@ -430,21 +430,21 @@ void TextCtrl::BUILD() {
|
||||||
text_value = wxString::Format(_T("%i"), int(m_opt.default_value->getFloat()));
|
text_value = wxString::Format(_T("%i"), int(m_opt.default_value->getFloat()));
|
||||||
text_value += "%";
|
text_value += "%";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case coPercents:
|
case coPercents:
|
||||||
case coFloats:
|
case coFloats:
|
||||||
case coFloat:
|
case coFloat:
|
||||||
{
|
{
|
||||||
double val = m_opt.type == coFloats ?
|
double val = m_opt.type == coFloats ?
|
||||||
m_opt.get_default_value<ConfigOptionFloats>()->get_at(m_opt_idx) :
|
m_opt.get_default_value<ConfigOptionFloats>()->get_at(m_opt_idx) :
|
||||||
m_opt.type == coFloat ?
|
m_opt.type == coFloat ?
|
||||||
m_opt.default_value->getFloat() :
|
m_opt.default_value->getFloat() :
|
||||||
m_opt.get_default_value<ConfigOptionPercents>()->get_at(m_opt_idx);
|
m_opt.get_default_value<ConfigOptionPercents>()->get_at(m_opt_idx);
|
||||||
text_value = double_to_string(val);
|
text_value = double_to_string(val);
|
||||||
m_last_meaningful_value = text_value;
|
m_last_meaningful_value = text_value;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case coString:
|
case coString:
|
||||||
text_value = m_opt.get_default_value<ConfigOptionString>()->value;
|
text_value = m_opt.get_default_value<ConfigOptionString>()->value;
|
||||||
break;
|
break;
|
||||||
case coStrings:
|
case coStrings:
|
||||||
|
@ -458,7 +458,7 @@ void TextCtrl::BUILD() {
|
||||||
text_value = get_thumbnails_string(m_opt.get_default_value<ConfigOptionPoints>()->values);
|
text_value = get_thumbnails_string(m_opt.get_default_value<ConfigOptionPoints>()->values);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
const long style = m_opt.multiline ? wxTE_MULTILINE : wxTE_PROCESS_ENTER/*0*/;
|
const long style = m_opt.multiline ? wxTE_MULTILINE : wxTE_PROCESS_ENTER/*0*/;
|
||||||
|
@ -492,7 +492,7 @@ void TextCtrl::BUILD() {
|
||||||
}
|
}
|
||||||
|
|
||||||
temp->Bind(wxEVT_SET_FOCUS, ([this](wxEvent& e) { on_set_focus(e); }), temp->GetId());
|
temp->Bind(wxEVT_SET_FOCUS, ([this](wxEvent& e) { on_set_focus(e); }), temp->GetId());
|
||||||
|
|
||||||
temp->Bind(wxEVT_LEFT_DOWN, ([temp](wxEvent& event)
|
temp->Bind(wxEVT_LEFT_DOWN, ([temp](wxEvent& event)
|
||||||
{
|
{
|
||||||
//! to allow the default handling
|
//! to allow the default handling
|
||||||
|
@ -510,7 +510,7 @@ void TextCtrl::BUILD() {
|
||||||
{
|
{
|
||||||
e.Skip();
|
e.Skip();
|
||||||
#ifdef __WXOSX__
|
#ifdef __WXOSX__
|
||||||
// OSX issue: For some unknown reason wxEVT_KILL_FOCUS is emitted twice in a row in some cases
|
// OSX issue: For some unknown reason wxEVT_KILL_FOCUS is emitted twice in a row in some cases
|
||||||
// (like when information dialog is shown during an update of the option value)
|
// (like when information dialog is shown during an update of the option value)
|
||||||
// Thus, suppress its second call
|
// Thus, suppress its second call
|
||||||
if (bKilledFocus)
|
if (bKilledFocus)
|
||||||
|
@ -541,7 +541,7 @@ void TextCtrl::BUILD() {
|
||||||
*/
|
*/
|
||||||
// recast as a wxWindow to fit the calling convention
|
// recast as a wxWindow to fit the calling convention
|
||||||
window = dynamic_cast<wxWindow*>(temp);
|
window = dynamic_cast<wxWindow*>(temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TextCtrl::value_was_changed()
|
bool TextCtrl::value_was_changed()
|
||||||
{
|
{
|
||||||
|
@ -561,7 +561,7 @@ bool TextCtrl::value_was_changed()
|
||||||
case coPercents:
|
case coPercents:
|
||||||
case coFloats:
|
case coFloats:
|
||||||
case coFloat: {
|
case coFloat: {
|
||||||
if (m_opt.nullable && std::isnan(boost::any_cast<double>(m_value)) &&
|
if (m_opt.nullable && std::isnan(boost::any_cast<double>(m_value)) &&
|
||||||
std::isnan(boost::any_cast<double>(val)))
|
std::isnan(boost::any_cast<double>(val)))
|
||||||
return false;
|
return false;
|
||||||
return boost::any_cast<double>(m_value) != boost::any_cast<double>(val);
|
return boost::any_cast<double>(m_value) != boost::any_cast<double>(val);
|
||||||
|
@ -599,9 +599,9 @@ void TextCtrl::set_value(const boost::any& value, bool change_event/* = false*/)
|
||||||
|
|
||||||
if (!change_event) {
|
if (!change_event) {
|
||||||
wxString ret_str = static_cast<wxTextCtrl*>(window)->GetValue();
|
wxString ret_str = static_cast<wxTextCtrl*>(window)->GetValue();
|
||||||
/* Update m_value to correct work of next value_was_changed().
|
/* Update m_value to correct work of next value_was_changed().
|
||||||
* But after checking of entered value, don't fix the "incorrect" value and don't show a warning message,
|
* But after checking of entered value, don't fix the "incorrect" value and don't show a warning message,
|
||||||
* just clear m_value in this case.
|
* just clear m_value in this case.
|
||||||
*/
|
*/
|
||||||
get_value_by_opt_type(ret_str, false);
|
get_value_by_opt_type(ret_str, false);
|
||||||
}
|
}
|
||||||
|
@ -633,7 +633,7 @@ void TextCtrl::msw_rescale()
|
||||||
Field::msw_rescale();
|
Field::msw_rescale();
|
||||||
auto size = wxSize(def_width() * m_em_unit, wxDefaultCoord);
|
auto size = wxSize(def_width() * m_em_unit, wxDefaultCoord);
|
||||||
|
|
||||||
if (m_opt.height >= 0)
|
if (m_opt.height >= 0)
|
||||||
size.SetHeight(m_opt.height*m_em_unit);
|
size.SetHeight(m_opt.height*m_em_unit);
|
||||||
else if (parent_is_custom_ctrl && opt_height > 0)
|
else if (parent_is_custom_ctrl && opt_height > 0)
|
||||||
size.SetHeight(lround(opt_height*m_em_unit));
|
size.SetHeight(lround(opt_height*m_em_unit));
|
||||||
|
@ -667,15 +667,15 @@ void CheckBox::BUILD() {
|
||||||
if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit);
|
if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit);
|
||||||
if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit);
|
if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit);
|
||||||
|
|
||||||
bool check_value = m_opt.type == coBool ?
|
bool check_value = m_opt.type == coBool ?
|
||||||
m_opt.default_value->getBool() : m_opt.type == coBools ?
|
m_opt.default_value->getBool() : m_opt.type == coBools ?
|
||||||
m_opt.get_default_value<ConfigOptionBools>()->get_at(m_opt_idx) :
|
m_opt.get_default_value<ConfigOptionBools>()->get_at(m_opt_idx) :
|
||||||
false;
|
false;
|
||||||
|
|
||||||
m_last_meaningful_value = static_cast<unsigned char>(check_value);
|
m_last_meaningful_value = static_cast<unsigned char>(check_value);
|
||||||
|
|
||||||
// Set Label as a string of at least one space simbol to correct system scaling of a CheckBox
|
// Set Label as a string of at least one space simbol to correct system scaling of a CheckBox
|
||||||
auto temp = new wxCheckBox(m_parent, wxID_ANY, wxString(" "), wxDefaultPosition, size);
|
auto temp = new wxCheckBox(m_parent, wxID_ANY, wxString(" "), wxDefaultPosition, size);
|
||||||
temp->SetFont(Slic3r::GUI::wxGetApp().normal_font());
|
temp->SetFont(Slic3r::GUI::wxGetApp().normal_font());
|
||||||
if (!wxOSX) temp->SetBackgroundStyle(wxBG_STYLE_PAINT);
|
if (!wxOSX) temp->SetBackgroundStyle(wxBG_STYLE_PAINT);
|
||||||
temp->SetValue(check_value);
|
temp->SetValue(check_value);
|
||||||
|
@ -686,7 +686,7 @@ void CheckBox::BUILD() {
|
||||||
on_change_field();
|
on_change_field();
|
||||||
}), temp->GetId());
|
}), temp->GetId());
|
||||||
|
|
||||||
temp->SetToolTip(get_tooltip_text(check_value ? "true" : "false"));
|
temp->SetToolTip(get_tooltip_text(check_value ? "true" : "false"));
|
||||||
|
|
||||||
// recast as a wxWindow to fit the calling convention
|
// recast as a wxWindow to fit the calling convention
|
||||||
window = dynamic_cast<wxWindow*>(temp);
|
window = dynamic_cast<wxWindow*>(temp);
|
||||||
|
@ -772,14 +772,14 @@ void SpinCtrl::BUILD() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
const int min_val = m_opt.min == INT_MIN
|
const int min_val = m_opt.min == INT_MIN
|
||||||
#ifdef __WXOSX__
|
#ifdef __WXOSX__
|
||||||
// We will forcibly set the input value for SpinControl, since the value
|
// We will forcibly set the input value for SpinControl, since the value
|
||||||
// inserted from the keyboard is not updated under OSX.
|
// inserted from the keyboard is not updated under OSX.
|
||||||
// So, we can't set min control value bigger then 0.
|
// So, we can't set min control value bigger then 0.
|
||||||
// Otherwise, it couldn't be possible to input from keyboard value
|
// Otherwise, it couldn't be possible to input from keyboard value
|
||||||
// less then min_val.
|
// less then min_val.
|
||||||
|| m_opt.min > 0
|
|| m_opt.min > 0
|
||||||
#endif
|
#endif
|
||||||
? 0 : m_opt.min;
|
? 0 : m_opt.min;
|
||||||
const int max_val = m_opt.max < 2147483647 ? m_opt.max : 2147483647;
|
const int max_val = m_opt.max < 2147483647 ? m_opt.max : 2147483647;
|
||||||
|
@ -815,8 +815,8 @@ void SpinCtrl::BUILD() {
|
||||||
propagate_value();
|
propagate_value();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
temp->Bind(wxEVT_SPINCTRL, ([this](wxCommandEvent e) { propagate_value(); }), temp->GetId());
|
temp->Bind(wxEVT_SPINCTRL, ([this](wxCommandEvent e) { propagate_value(); }), temp->GetId());
|
||||||
|
|
||||||
temp->Bind(wxEVT_TEXT_ENTER, ([this](wxCommandEvent e)
|
temp->Bind(wxEVT_TEXT_ENTER, ([this](wxCommandEvent e)
|
||||||
{
|
{
|
||||||
e.Skip();
|
e.Skip();
|
||||||
|
@ -837,7 +837,7 @@ void SpinCtrl::BUILD() {
|
||||||
tmp_value = parsed && value >= INT_MIN && value <= INT_MAX ? (int)value : UNDEF_VALUE;
|
tmp_value = parsed && value >= INT_MIN && value <= INT_MAX ? (int)value : UNDEF_VALUE;
|
||||||
|
|
||||||
#ifdef __WXOSX__
|
#ifdef __WXOSX__
|
||||||
// Forcibly set the input value for SpinControl, since the value
|
// Forcibly set the input value for SpinControl, since the value
|
||||||
// inserted from the keyboard or clipboard is not updated under OSX
|
// inserted from the keyboard or clipboard is not updated under OSX
|
||||||
if (tmp_value != UNDEF_VALUE) {
|
if (tmp_value != UNDEF_VALUE) {
|
||||||
wxSpinCtrl* spin = static_cast<wxSpinCtrl*>(window);
|
wxSpinCtrl* spin = static_cast<wxSpinCtrl*>(window);
|
||||||
|
@ -849,7 +849,7 @@ void SpinCtrl::BUILD() {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}), temp->GetId());
|
}), temp->GetId());
|
||||||
|
|
||||||
temp->SetToolTip(get_tooltip_text(text_value));
|
temp->SetToolTip(get_tooltip_text(text_value));
|
||||||
|
|
||||||
// recast as a wxWindow to fit the calling convention
|
// recast as a wxWindow to fit the calling convention
|
||||||
|
@ -901,7 +901,7 @@ void Choice::BUILD() {
|
||||||
if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit);
|
if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit);
|
||||||
if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit);
|
if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit);
|
||||||
|
|
||||||
choice_ctrl* temp;
|
choice_ctrl* temp;
|
||||||
if (!m_opt.gui_type.empty() && m_opt.gui_type.compare("select_open") != 0) {
|
if (!m_opt.gui_type.empty() && m_opt.gui_type.compare("select_open") != 0) {
|
||||||
m_is_editable = true;
|
m_is_editable = true;
|
||||||
temp = new choice_ctrl(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size);
|
temp = new choice_ctrl(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size);
|
||||||
|
@ -1053,10 +1053,10 @@ void Choice::set_value(const std::string& value, bool change_event) //! Redunda
|
||||||
}
|
}
|
||||||
|
|
||||||
choice_ctrl* field = dynamic_cast<choice_ctrl*>(window);
|
choice_ctrl* field = dynamic_cast<choice_ctrl*>(window);
|
||||||
idx == m_opt.enum_values.size() ?
|
idx == m_opt.enum_values.size() ?
|
||||||
field->SetValue(value) :
|
field->SetValue(value) :
|
||||||
field->SetSelection(idx);
|
field->SetSelection(idx);
|
||||||
|
|
||||||
m_disable_change_event = false;
|
m_disable_change_event = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1074,7 +1074,7 @@ void Choice::set_value(const boost::any& value, bool change_event)
|
||||||
case coString:
|
case coString:
|
||||||
case coStrings: {
|
case coStrings: {
|
||||||
wxString text_value;
|
wxString text_value;
|
||||||
if (m_opt.type == coInt)
|
if (m_opt.type == coInt)
|
||||||
text_value = wxString::Format(_T("%i"), int(boost::any_cast<int>(value)));
|
text_value = wxString::Format(_T("%i"), int(boost::any_cast<int>(value)));
|
||||||
else
|
else
|
||||||
text_value = boost::any_cast<wxString>(value);
|
text_value = boost::any_cast<wxString>(value);
|
||||||
|
@ -1102,7 +1102,7 @@ void Choice::set_value(const boost::any& value, bool change_event)
|
||||||
{
|
{
|
||||||
if (!m_opt.enum_values.empty()) {
|
if (!m_opt.enum_values.empty()) {
|
||||||
std::string key;
|
std::string key;
|
||||||
t_config_enum_values map_names = ConfigOptionEnum<InfillPattern>::get_enum_values();
|
t_config_enum_values map_names = ConfigOptionEnum<InfillPattern>::get_enum_values();
|
||||||
for (auto it : map_names) {
|
for (auto it : map_names) {
|
||||||
if (val == it.second) {
|
if (val == it.second) {
|
||||||
key = it.first;
|
key = it.first;
|
||||||
|
@ -1177,7 +1177,7 @@ boost::any& Choice::get_value()
|
||||||
{
|
{
|
||||||
choice_ctrl* field = dynamic_cast<choice_ctrl*>(window);
|
choice_ctrl* field = dynamic_cast<choice_ctrl*>(window);
|
||||||
|
|
||||||
wxString ret_str = field->GetValue();
|
wxString ret_str = field->GetValue();
|
||||||
|
|
||||||
// options from right panel
|
// options from right panel
|
||||||
std::vector <std::string> right_panel_options{ "support", "pad", "scale_unit" };
|
std::vector <std::string> right_panel_options{ "support", "pad", "scale_unit" };
|
||||||
|
@ -1187,7 +1187,7 @@ boost::any& Choice::get_value()
|
||||||
|
|
||||||
if (m_opt.type == coEnum)
|
if (m_opt.type == coEnum)
|
||||||
{
|
{
|
||||||
int ret_enum = field->GetSelection();
|
int ret_enum = field->GetSelection();
|
||||||
if (m_opt_id == "top_fill_pattern" || m_opt_id == "bottom_fill_pattern" || m_opt_id == "fill_pattern")
|
if (m_opt_id == "top_fill_pattern" || m_opt_id == "bottom_fill_pattern" || m_opt_id == "fill_pattern")
|
||||||
{
|
{
|
||||||
if (!m_opt.enum_values.empty()) {
|
if (!m_opt.enum_values.empty()) {
|
||||||
|
@ -1234,7 +1234,7 @@ boost::any& Choice::get_value()
|
||||||
else
|
else
|
||||||
m_value = atof(m_opt.enum_values[ret_enum].c_str());
|
m_value = atof(m_opt.enum_values[ret_enum].c_str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
// modifies ret_string!
|
// modifies ret_string!
|
||||||
get_value_by_opt_type(ret_str);
|
get_value_by_opt_type(ret_str);
|
||||||
|
|
||||||
|
@ -1252,8 +1252,8 @@ void Choice::msw_rescale()
|
||||||
#ifdef __WXOSX__
|
#ifdef __WXOSX__
|
||||||
const wxString selection = field->GetValue();// field->GetString(index);
|
const wxString selection = field->GetValue();// field->GetString(index);
|
||||||
|
|
||||||
/* To correct scaling (set new controll size) of a wxBitmapCombobox
|
/* To correct scaling (set new controll size) of a wxBitmapCombobox
|
||||||
* we need to refill control with new bitmaps. So, in our case :
|
* we need to refill control with new bitmaps. So, in our case :
|
||||||
* 1. clear control
|
* 1. clear control
|
||||||
* 2. add content
|
* 2. add content
|
||||||
* 3. add scaled "empty" bitmap to the at least one item
|
* 3. add scaled "empty" bitmap to the at least one item
|
||||||
|
@ -1261,7 +1261,7 @@ void Choice::msw_rescale()
|
||||||
field->Clear();
|
field->Clear();
|
||||||
wxSize size(wxDefaultSize);
|
wxSize size(wxDefaultSize);
|
||||||
size.SetWidth((m_opt.width > 0 ? m_opt.width : def_width_wider()) * m_em_unit);
|
size.SetWidth((m_opt.width > 0 ? m_opt.width : def_width_wider()) * m_em_unit);
|
||||||
|
|
||||||
// Set rescaled min height to correct layout
|
// Set rescaled min height to correct layout
|
||||||
field->SetMinSize(wxSize(-1, int(1.5f*field->GetFont().GetPixelSize().y + 0.5f)));
|
field->SetMinSize(wxSize(-1, int(1.5f*field->GetFont().GetPixelSize().y + 0.5f)));
|
||||||
// Set rescaled size
|
// Set rescaled size
|
||||||
|
@ -1373,7 +1373,7 @@ void ColourPicker::msw_rescale()
|
||||||
|
|
||||||
wxColourPickerCtrl* field = dynamic_cast<wxColourPickerCtrl*>(window);
|
wxColourPickerCtrl* field = dynamic_cast<wxColourPickerCtrl*>(window);
|
||||||
auto size = wxSize(def_width() * m_em_unit, wxDefaultCoord);
|
auto size = wxSize(def_width() * m_em_unit, wxDefaultCoord);
|
||||||
if (m_opt.height >= 0)
|
if (m_opt.height >= 0)
|
||||||
size.SetHeight(m_opt.height * m_em_unit);
|
size.SetHeight(m_opt.height * m_em_unit);
|
||||||
else if (parent_is_custom_ctrl && opt_height > 0)
|
else if (parent_is_custom_ctrl && opt_height > 0)
|
||||||
size.SetHeight(lround(opt_height * m_em_unit));
|
size.SetHeight(lround(opt_height * m_em_unit));
|
||||||
|
@ -1509,7 +1509,7 @@ boost::any& PointCtrl::get_value()
|
||||||
else
|
else
|
||||||
if (m_opt.min > x || x > m_opt.max ||
|
if (m_opt.min > x || x > m_opt.max ||
|
||||||
m_opt.min > y || y > m_opt.max)
|
m_opt.min > y || y > m_opt.max)
|
||||||
{
|
{
|
||||||
if (m_opt.min > x) x = m_opt.min;
|
if (m_opt.min > x) x = m_opt.min;
|
||||||
if (x > m_opt.max) x = m_opt.max;
|
if (x > m_opt.max) x = m_opt.max;
|
||||||
if (m_opt.min > y) y = m_opt.min;
|
if (m_opt.min > y) y = m_opt.min;
|
||||||
|
@ -1575,7 +1575,7 @@ void SliderCtrl::BUILD()
|
||||||
m_slider->SetBackgroundStyle(wxBG_STYLE_PAINT);
|
m_slider->SetBackgroundStyle(wxBG_STYLE_PAINT);
|
||||||
wxSize field_size(40, -1);
|
wxSize field_size(40, -1);
|
||||||
|
|
||||||
m_textctrl = new wxTextCtrl(m_parent, wxID_ANY, wxString::Format("%d", m_slider->GetValue()/m_scale),
|
m_textctrl = new wxTextCtrl(m_parent, wxID_ANY, wxString::Format("%d", m_slider->GetValue()/m_scale),
|
||||||
wxDefaultPosition, field_size);
|
wxDefaultPosition, field_size);
|
||||||
m_textctrl->SetFont(Slic3r::GUI::wxGetApp().normal_font());
|
m_textctrl->SetFont(Slic3r::GUI::wxGetApp().normal_font());
|
||||||
m_textctrl->SetBackgroundStyle(wxBG_STYLE_PAINT);
|
m_textctrl->SetBackgroundStyle(wxBG_STYLE_PAINT);
|
||||||
|
@ -1625,5 +1625,3 @@ boost::any& SliderCtrl::get_value()
|
||||||
|
|
||||||
} // GUI
|
} // GUI
|
||||||
} // Slic3r
|
} // Slic3r
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ void disable_screensaver()
|
||||||
#if __APPLE__
|
#if __APPLE__
|
||||||
CFStringRef reasonForActivity = CFSTR("Slic3r");
|
CFStringRef reasonForActivity = CFSTR("Slic3r");
|
||||||
[[maybe_unused]]IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep,
|
[[maybe_unused]]IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep,
|
||||||
kIOPMAssertionLevelOn, reasonForActivity, &assertionID);
|
kIOPMAssertionLevelOn, reasonForActivity, &assertionID);
|
||||||
// ignore result: success == kIOReturnSuccess
|
// ignore result: success == kIOReturnSuccess
|
||||||
#elif _WIN32
|
#elif _WIN32
|
||||||
SetThreadExecutionState(ES_DISPLAY_REQUIRED | ES_CONTINUOUS);
|
SetThreadExecutionState(ES_DISPLAY_REQUIRED | ES_CONTINUOUS);
|
||||||
|
@ -71,7 +71,7 @@ void break_to_debugger()
|
||||||
|
|
||||||
const std::string& shortkey_ctrl_prefix()
|
const std::string& shortkey_ctrl_prefix()
|
||||||
{
|
{
|
||||||
static const std::string str =
|
static const std::string str =
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
"⌘"
|
"⌘"
|
||||||
#else
|
#else
|
||||||
|
@ -83,7 +83,7 @@ const std::string& shortkey_ctrl_prefix()
|
||||||
|
|
||||||
const std::string& shortkey_alt_prefix()
|
const std::string& shortkey_alt_prefix()
|
||||||
{
|
{
|
||||||
static const std::string str =
|
static const std::string str =
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
"⌥"
|
"⌥"
|
||||||
#else
|
#else
|
||||||
|
@ -132,13 +132,13 @@ void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt
|
||||||
ConfigOptionFloats* vec_new = new ConfigOptionFloats{ boost::any_cast<double>(value) };
|
ConfigOptionFloats* vec_new = new ConfigOptionFloats{ boost::any_cast<double>(value) };
|
||||||
config.option<ConfigOptionFloats>(opt_key)->set_at(vec_new, opt_index, opt_index);
|
config.option<ConfigOptionFloats>(opt_key)->set_at(vec_new, opt_index, opt_index);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case coString:
|
case coString:
|
||||||
config.set_key_value(opt_key, new ConfigOptionString(boost::any_cast<std::string>(value)));
|
config.set_key_value(opt_key, new ConfigOptionString(boost::any_cast<std::string>(value)));
|
||||||
break;
|
break;
|
||||||
case coStrings:{
|
case coStrings:{
|
||||||
if (opt_key == "compatible_prints" || opt_key == "compatible_printers") {
|
if (opt_key == "compatible_prints" || opt_key == "compatible_printers") {
|
||||||
config.option<ConfigOptionStrings>(opt_key)->values =
|
config.option<ConfigOptionStrings>(opt_key)->values =
|
||||||
boost::any_cast<std::vector<std::string>>(value);
|
boost::any_cast<std::vector<std::string>>(value);
|
||||||
}
|
}
|
||||||
else if (config.def()->get(opt_key)->gui_flags.compare("serialized") == 0) {
|
else if (config.def()->get(opt_key)->gui_flags.compare("serialized") == 0) {
|
||||||
|
@ -179,15 +179,15 @@ void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt
|
||||||
if (opt_key == "top_fill_pattern" ||
|
if (opt_key == "top_fill_pattern" ||
|
||||||
opt_key == "bottom_fill_pattern" ||
|
opt_key == "bottom_fill_pattern" ||
|
||||||
opt_key == "fill_pattern")
|
opt_key == "fill_pattern")
|
||||||
config.set_key_value(opt_key, new ConfigOptionEnum<InfillPattern>(boost::any_cast<InfillPattern>(value)));
|
config.set_key_value(opt_key, new ConfigOptionEnum<InfillPattern>(boost::any_cast<InfillPattern>(value)));
|
||||||
else if (opt_key.compare("ironing_type") == 0)
|
else if (opt_key.compare("ironing_type") == 0)
|
||||||
config.set_key_value(opt_key, new ConfigOptionEnum<IroningType>(boost::any_cast<IroningType>(value)));
|
config.set_key_value(opt_key, new ConfigOptionEnum<IroningType>(boost::any_cast<IroningType>(value)));
|
||||||
else if (opt_key.compare("fuzzy_skin") == 0)
|
else if (opt_key.compare("fuzzy_skin") == 0)
|
||||||
config.set_key_value(opt_key, new ConfigOptionEnum<FuzzySkinType>(boost::any_cast<FuzzySkinType>(value)));
|
config.set_key_value(opt_key, new ConfigOptionEnum<FuzzySkinType>(boost::any_cast<FuzzySkinType>(value)));
|
||||||
else if (opt_key.compare("gcode_flavor") == 0)
|
else if (opt_key.compare("gcode_flavor") == 0)
|
||||||
config.set_key_value(opt_key, new ConfigOptionEnum<GCodeFlavor>(boost::any_cast<GCodeFlavor>(value)));
|
config.set_key_value(opt_key, new ConfigOptionEnum<GCodeFlavor>(boost::any_cast<GCodeFlavor>(value)));
|
||||||
else if (opt_key.compare("machine_limits_usage") == 0)
|
else if (opt_key.compare("machine_limits_usage") == 0)
|
||||||
config.set_key_value(opt_key, new ConfigOptionEnum<MachineLimitsUsage>(boost::any_cast<MachineLimitsUsage>(value)));
|
config.set_key_value(opt_key, new ConfigOptionEnum<MachineLimitsUsage>(boost::any_cast<MachineLimitsUsage>(value)));
|
||||||
else if (opt_key.compare("support_material_pattern") == 0)
|
else if (opt_key.compare("support_material_pattern") == 0)
|
||||||
config.set_key_value(opt_key, new ConfigOptionEnum<SupportMaterialPattern>(boost::any_cast<SupportMaterialPattern>(value)));
|
config.set_key_value(opt_key, new ConfigOptionEnum<SupportMaterialPattern>(boost::any_cast<SupportMaterialPattern>(value)));
|
||||||
else if (opt_key.compare("seam_position") == 0)
|
else if (opt_key.compare("seam_position") == 0)
|
||||||
|
|
|
@ -30,7 +30,7 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co
|
||||||
m_fields.emplace(id, Choice::Create<Choice>(this->ctrl_parent(), opt, id));
|
m_fields.emplace(id, Choice::Create<Choice>(this->ctrl_parent(), opt, id));
|
||||||
} else if (opt.gui_type == "color") {
|
} else if (opt.gui_type == "color") {
|
||||||
m_fields.emplace(id, ColourPicker::Create<ColourPicker>(this->ctrl_parent(), opt, id));
|
m_fields.emplace(id, ColourPicker::Create<ColourPicker>(this->ctrl_parent(), opt, id));
|
||||||
} else if (opt.gui_type == "f_enum_open" ||
|
} else if (opt.gui_type == "f_enum_open" ||
|
||||||
opt.gui_type == "i_enum_open" ||
|
opt.gui_type == "i_enum_open" ||
|
||||||
opt.gui_type == "i_enum_closed") {
|
opt.gui_type == "i_enum_closed") {
|
||||||
m_fields.emplace(id, Choice::Create<Choice>(this->ctrl_parent(), opt, id));
|
m_fields.emplace(id, Choice::Create<Choice>(this->ctrl_parent(), opt, id));
|
||||||
|
@ -41,7 +41,7 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co
|
||||||
m_fields.emplace(id, StaticText::Create<StaticText>(this->ctrl_parent(), opt, id));
|
m_fields.emplace(id, StaticText::Create<StaticText>(this->ctrl_parent(), opt, id));
|
||||||
} else if (opt.gui_type == "one_string") {
|
} else if (opt.gui_type == "one_string") {
|
||||||
m_fields.emplace(id, TextCtrl::Create<TextCtrl>(this->ctrl_parent(), opt, id));
|
m_fields.emplace(id, TextCtrl::Create<TextCtrl>(this->ctrl_parent(), opt, id));
|
||||||
} else {
|
} else {
|
||||||
switch (opt.type) {
|
switch (opt.type) {
|
||||||
case coFloatOrPercent:
|
case coFloatOrPercent:
|
||||||
case coFloat:
|
case coFloat:
|
||||||
|
@ -74,19 +74,19 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co
|
||||||
// Grab a reference to fields for convenience
|
// Grab a reference to fields for convenience
|
||||||
const t_field& field = m_fields[id];
|
const t_field& field = m_fields[id];
|
||||||
field->m_on_change = [this](const std::string& opt_id, const boost::any& value) {
|
field->m_on_change = [this](const std::string& opt_id, const boost::any& value) {
|
||||||
//! This function will be called from Field.
|
//! This function will be called from Field.
|
||||||
//! Call OptionGroup._on_change(...)
|
//! Call OptionGroup._on_change(...)
|
||||||
if (!m_disabled)
|
if (!m_disabled)
|
||||||
this->on_change_OG(opt_id, value);
|
this->on_change_OG(opt_id, value);
|
||||||
};
|
};
|
||||||
field->m_on_kill_focus = [this](const std::string& opt_id) {
|
field->m_on_kill_focus = [this](const std::string& opt_id) {
|
||||||
//! This function will be called from Field.
|
//! This function will be called from Field.
|
||||||
if (!m_disabled)
|
if (!m_disabled)
|
||||||
this->on_kill_focus(opt_id);
|
this->on_kill_focus(opt_id);
|
||||||
};
|
};
|
||||||
field->m_on_set_focus = [this](const std::string& opt_id) {
|
field->m_on_set_focus = [this](const std::string& opt_id) {
|
||||||
//! This function will be called from Field.
|
//! This function will be called from Field.
|
||||||
if (!m_disabled)
|
if (!m_disabled)
|
||||||
this->on_set_focus(opt_id);
|
this->on_set_focus(opt_id);
|
||||||
};
|
};
|
||||||
field->m_parent = parent();
|
field->m_parent = parent();
|
||||||
|
@ -99,7 +99,7 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co
|
||||||
if (!this->m_disabled)
|
if (!this->m_disabled)
|
||||||
this->back_to_sys_value(opt_id);
|
this->back_to_sys_value(opt_id);
|
||||||
};
|
};
|
||||||
|
|
||||||
// assign function objects for callbacks, etc.
|
// assign function objects for callbacks, etc.
|
||||||
return field;
|
return field;
|
||||||
}
|
}
|
||||||
|
@ -178,7 +178,7 @@ void OptionsGroup::append_line(const Line& line)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto option_set = line.get_options();
|
auto option_set = line.get_options();
|
||||||
for (auto opt : option_set)
|
for (auto opt : option_set)
|
||||||
m_options.emplace(opt.opt_id, opt);
|
m_options.emplace(opt.opt_id, opt);
|
||||||
|
|
||||||
// add mode value for current line to m_options_mode
|
// add mode value for current line to m_options_mode
|
||||||
|
@ -232,7 +232,7 @@ void OptionsGroup::activate_line(Line& line)
|
||||||
// if we have a single option with no label, no sidetext just add it directly to sizer
|
// if we have a single option with no label, no sidetext just add it directly to sizer
|
||||||
if (option_set.size() == 1 && label_width == 0 && option_set.front().opt.full_width &&
|
if (option_set.size() == 1 && label_width == 0 && option_set.front().opt.full_width &&
|
||||||
option_set.front().opt.label.empty() &&
|
option_set.front().opt.label.empty() &&
|
||||||
option_set.front().opt.sidetext.size() == 0 && option_set.front().side_widget == nullptr &&
|
option_set.front().opt.sidetext.size() == 0 && option_set.front().side_widget == nullptr &&
|
||||||
line.get_extra_widgets().size() == 0) {
|
line.get_extra_widgets().size() == 0) {
|
||||||
|
|
||||||
const auto& option = option_set.front();
|
const auto& option = option_set.front();
|
||||||
|
@ -334,7 +334,7 @@ void OptionsGroup::activate_line(Line& line)
|
||||||
wxString str_label = (option.label == L_CONTEXT("Top", "Layers") || option.label == L_CONTEXT("Bottom", "Layers")) ?
|
wxString str_label = (option.label == L_CONTEXT("Top", "Layers") || option.label == L_CONTEXT("Bottom", "Layers")) ?
|
||||||
_CTX(option.label, "Layers") :
|
_CTX(option.label, "Layers") :
|
||||||
_(option.label);
|
_(option.label);
|
||||||
label = new wxStaticText(this->ctrl_parent(), wxID_ANY, str_label + ": ", wxDefaultPosition, //wxDefaultSize);
|
label = new wxStaticText(this->ctrl_parent(), wxID_ANY, str_label + ": ", wxDefaultPosition, //wxDefaultSize);
|
||||||
wxSize(sublabel_width != -1 ? sublabel_width * wxGetApp().em_unit() : -1, -1), wxALIGN_RIGHT);
|
wxSize(sublabel_width != -1 ? sublabel_width * wxGetApp().em_unit() : -1, -1), wxALIGN_RIGHT);
|
||||||
label->SetBackgroundStyle(wxBG_STYLE_PAINT);
|
label->SetBackgroundStyle(wxBG_STYLE_PAINT);
|
||||||
label->SetFont(wxGetApp().normal_font());
|
label->SetFont(wxGetApp().normal_font());
|
||||||
|
@ -379,7 +379,7 @@ void OptionsGroup::activate_line(Line& line)
|
||||||
}
|
}
|
||||||
|
|
||||||
// add extra sizers if any
|
// add extra sizers if any
|
||||||
for (auto extra_widget : line.get_extra_widgets())
|
for (auto extra_widget : line.get_extra_widgets())
|
||||||
{
|
{
|
||||||
if (line.get_extra_widgets().size() == 1 && !staticbox)
|
if (line.get_extra_widgets().size() == 1 && !staticbox)
|
||||||
{
|
{
|
||||||
|
@ -504,7 +504,7 @@ void OptionsGroup::clear_fields_except_of(const std::vector<std::string> left_fi
|
||||||
while (it != m_fields.end()) {
|
while (it != m_fields.end()) {
|
||||||
if (std::find(left_fields.begin(), left_fields.end(), it->first) == left_fields.end())
|
if (std::find(left_fields.begin(), left_fields.end(), it->first) == left_fields.end())
|
||||||
it = m_fields.erase(it);
|
it = m_fields.erase(it);
|
||||||
else
|
else
|
||||||
it++;
|
it++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -530,7 +530,7 @@ Option ConfigOptionsGroup::get_option(const std::string& opt_key, int opt_index
|
||||||
std::pair<std::string, int> pair(opt_key, opt_index);
|
std::pair<std::string, int> pair(opt_key, opt_index);
|
||||||
m_opt_map.emplace(opt_id, pair);
|
m_opt_map.emplace(opt_id, pair);
|
||||||
|
|
||||||
if (m_use_custom_ctrl) // fill group and category values just for options from Settings Tab
|
if (m_use_custom_ctrl) // fill group and category values just for options from Settings Tab
|
||||||
wxGetApp().sidebar().get_searcher().add_key(opt_id, title, this->config_category());
|
wxGetApp().sidebar().get_searcher().add_key(opt_id, title, this->config_category());
|
||||||
|
|
||||||
return Option(*m_config->def()->get(opt_key), opt_id);
|
return Option(*m_config->def()->get(opt_key), opt_id);
|
||||||
|
@ -545,7 +545,7 @@ void ConfigOptionsGroup::on_change_OG(const t_config_option_key& opt_id, const b
|
||||||
{
|
{
|
||||||
OptionsGroup::on_change_OG(opt_id, value);
|
OptionsGroup::on_change_OG(opt_id, value);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto itOption = it->second;
|
auto itOption = it->second;
|
||||||
const std::string &opt_key = itOption.first;
|
const std::string &opt_key = itOption.first;
|
||||||
|
@ -554,7 +554,7 @@ void ConfigOptionsGroup::on_change_OG(const t_config_option_key& opt_id, const b
|
||||||
this->change_opt_value(opt_key, value, opt_index == -1 ? 0 : opt_index);
|
this->change_opt_value(opt_key, value, opt_index == -1 ? 0 : opt_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
OptionsGroup::on_change_OG(opt_id, value);
|
OptionsGroup::on_change_OG(opt_id, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigOptionsGroup::back_to_initial_value(const std::string& opt_key)
|
void ConfigOptionsGroup::back_to_initial_value(const std::string& opt_key)
|
||||||
|
@ -582,7 +582,7 @@ void ConfigOptionsGroup::back_to_config_value(const DynamicPrintConfig& config,
|
||||||
}
|
}
|
||||||
else if (m_opt_map.find(opt_key) == m_opt_map.end() ||
|
else if (m_opt_map.find(opt_key) == m_opt_map.end() ||
|
||||||
// This option don't have corresponded field
|
// This option don't have corresponded field
|
||||||
opt_key == "bed_shape" || opt_key == "filament_ramming_parameters" ||
|
opt_key == "bed_shape" || opt_key == "filament_ramming_parameters" ||
|
||||||
opt_key == "compatible_printers" || opt_key == "compatible_prints" ) {
|
opt_key == "compatible_printers" || opt_key == "compatible_prints" ) {
|
||||||
value = get_config_value(config, opt_key);
|
value = get_config_value(config, opt_key);
|
||||||
this->change_opt_value(opt_key, value);
|
this->change_opt_value(opt_key, value);
|
||||||
|
@ -765,7 +765,7 @@ boost::any ConfigOptionsGroup::config_value(const std::string& opt_key, int opt_
|
||||||
boost::any ConfigOptionsGroup::get_config_value(const DynamicPrintConfig& config, const std::string& opt_key, int opt_index /*= -1*/)
|
boost::any ConfigOptionsGroup::get_config_value(const DynamicPrintConfig& config, const std::string& opt_key, int opt_index /*= -1*/)
|
||||||
{
|
{
|
||||||
size_t idx = opt_index == -1 ? 0 : opt_index;
|
size_t idx = opt_index == -1 ? 0 : opt_index;
|
||||||
|
|
||||||
boost::any ret;
|
boost::any ret;
|
||||||
wxString text_value = wxString("");
|
wxString text_value = wxString("");
|
||||||
const ConfigOptionDef* opt = config.def()->get(opt_key);
|
const ConfigOptionDef* opt = config.def()->get(opt_key);
|
||||||
|
@ -898,7 +898,7 @@ boost::any ConfigOptionsGroup::get_config_value(const DynamicPrintConfig& config
|
||||||
}
|
}
|
||||||
else if (opt_key == "brim_type") {
|
else if (opt_key == "brim_type") {
|
||||||
ret = static_cast<int>(config.option<ConfigOptionEnum<BrimType>>(opt_key)->value);
|
ret = static_cast<int>(config.option<ConfigOptionEnum<BrimType>>(opt_key)->value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case coPoints:
|
case coPoints:
|
||||||
|
@ -955,7 +955,7 @@ void ConfigOptionsGroup::change_opt_value(const t_config_option_key& opt_key, co
|
||||||
m_modelconfig->touch();
|
m_modelconfig->touch();
|
||||||
}
|
}
|
||||||
|
|
||||||
ogStaticText::ogStaticText(wxWindow* parent, const wxString& text) :
|
ogStaticText::ogStaticText(wxWindow* parent, const wxString& text) :
|
||||||
wxStaticText(parent, wxID_ANY, text, wxDefaultPosition, wxDefaultSize)
|
wxStaticText(parent, wxID_ANY, text, wxDefaultPosition, wxDefaultSize)
|
||||||
{
|
{
|
||||||
if (!text.IsEmpty()) {
|
if (!text.IsEmpty()) {
|
||||||
|
|
|
@ -1501,7 +1501,8 @@ void TabPrint::build()
|
||||||
optgroup->append_single_option_line("raft_layers", category_path + "raft-layers");
|
optgroup->append_single_option_line("raft_layers", category_path + "raft-layers");
|
||||||
optgroup->append_single_option_line("raft_first_layer_density", category_path + "raft-first-layer-density");
|
optgroup->append_single_option_line("raft_first_layer_density", category_path + "raft-first-layer-density");
|
||||||
optgroup->append_single_option_line("raft_first_layer_expansion", category_path + "raft-first-layer-expansion");
|
optgroup->append_single_option_line("raft_first_layer_expansion", category_path + "raft-first-layer-expansion");
|
||||||
// # optgroup->append_single_option_line(get_option_("raft_contact_distance");
|
optgroup->append_single_option_line("raft_contact_distance");
|
||||||
|
optgroup->append_single_option_line("raft_expansion");
|
||||||
|
|
||||||
optgroup = page->new_optgroup(L("Options for support material and raft"));
|
optgroup = page->new_optgroup(L("Options for support material and raft"));
|
||||||
optgroup->append_single_option_line("support_material_contact_distance", category_path + "contact-z-distance");
|
optgroup->append_single_option_line("support_material_contact_distance", category_path + "contact-z-distance");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue