mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-28 03:11:47 +00:00
Merge branch 'main' into feature/multitool
This commit is contained in:
@@ -189,7 +189,7 @@ void stl_fix_normal_directions(stl_file *stl)
|
||||
if (head->next != tail) {
|
||||
facet_num = head->next->facet_num;
|
||||
assert(facet_num < stl->stats.number_of_facets);
|
||||
if (norm_sw[facet_num] != 1) { // If facet is in list mutiple times
|
||||
if (norm_sw[facet_num] != 1) { // If facet is in list multiple times
|
||||
norm_sw[facet_num] = 1; // Record this one as being fixed.
|
||||
++ checked;
|
||||
}
|
||||
|
||||
@@ -253,6 +253,10 @@ void AppConfig::set_defaults()
|
||||
set_bool("show_splash_screen", true);
|
||||
}
|
||||
|
||||
if(get("auto_arrange").empty()) {
|
||||
set_bool("auto_arrange", true);
|
||||
}
|
||||
|
||||
if (get("show_model_mesh").empty()) {
|
||||
set_bool("show_model_mesh", false);
|
||||
}
|
||||
|
||||
@@ -715,7 +715,7 @@ bool compSecondMoment(const ExPolygons& expolys, double& smExpolysX, double& smE
|
||||
|
||||
|
||||
//BBS: config brimwidth by volumes
|
||||
double configBrimWidthByVolumes(double deltaT, double adhension, double maxSpeed, const ModelVolume* modelVolumePtr, const ExPolygons& expolys)
|
||||
double configBrimWidthByVolumes(double deltaT, double adhesion, double maxSpeed, const ModelVolume* modelVolumePtr, const ExPolygons& expolys)
|
||||
{
|
||||
// height of a volume
|
||||
double height = 0;
|
||||
@@ -745,7 +745,7 @@ double configBrimWidthByVolumes(double deltaT, double adhension, double maxSpeed
|
||||
double thermalLengthRef = Model::getThermalLength(modelVolumePtr);
|
||||
|
||||
double height_to_area = std::max(height / Ixx * (bbox2.size()(1) * SCALING_FACTOR), height / Iyy * (bbox2.size()(0) * SCALING_FACTOR));
|
||||
double brim_width = adhension * std::min(std::min(std::max(height_to_area * maxSpeed / 24, thermalLength * 8. / thermalLengthRef * std::min(height, 30.) / 30.), 18.), 1.5 * thermalLength);
|
||||
double brim_width = adhesion * std::min(std::min(std::max(height_to_area * maxSpeed / 24, thermalLength * 8. / thermalLengthRef * std::min(height, 30.) / 30.), 18.), 1.5 * thermalLength);
|
||||
// small brims are omitted
|
||||
if (brim_width < 5 && brim_width < 1.5 * thermalLength)
|
||||
brim_width = 0;
|
||||
@@ -756,7 +756,7 @@ double configBrimWidthByVolumes(double deltaT, double adhension, double maxSpeed
|
||||
}
|
||||
|
||||
//BBS: config brimwidth by group of volumes
|
||||
double configBrimWidthByVolumeGroups(double adhension, double maxSpeed, const std::vector<ModelVolume*> modelVolumePtrs, const ExPolygons& expolys, double &groupHeight)
|
||||
double configBrimWidthByVolumeGroups(double adhesion, double maxSpeed, const std::vector<ModelVolume*> modelVolumePtrs, const ExPolygons& expolys, double &groupHeight)
|
||||
{
|
||||
// height of a group of volumes
|
||||
double height = 0;
|
||||
@@ -794,7 +794,7 @@ double configBrimWidthByVolumeGroups(double adhension, double maxSpeed, const st
|
||||
double thermalLengthRef = Model::getThermalLength(modelVolumePtrs);
|
||||
|
||||
double height_to_area = std::max(height / Ixx * (bbox2.size()(1) * SCALING_FACTOR), height / Iyy * (bbox2.size()(0) * SCALING_FACTOR)) * height / 1920;
|
||||
double brim_width = adhension * std::min(std::min(std::max(height_to_area * maxSpeed, thermalLength * 8. / thermalLengthRef * std::min(height, 30.) / 30.), 18.), 1.5 * thermalLength);
|
||||
double brim_width = adhesion * std::min(std::min(std::max(height_to_area * maxSpeed, thermalLength * 8. / thermalLengthRef * std::min(height, 30.) / 30.), 18.), 1.5 * thermalLength);
|
||||
// small brims are omitted
|
||||
if (brim_width < 5 && brim_width < 1.5 * thermalLength)
|
||||
brim_width = 0;
|
||||
@@ -902,7 +902,7 @@ static ExPolygons outer_inner_brim_area(const Print& print,
|
||||
Polygons holes_support;
|
||||
if (objectWithExtruder.second == extruderNo && brimToWrite.at(object->id()).obj) {
|
||||
double deltaT = getTemperatureFromExtruder(object);
|
||||
double adhension = getadhesionCoeff(object);
|
||||
double adhesion = getadhesionCoeff(object);
|
||||
double maxSpeed = Model::findMaxSpeed(object->model_object());
|
||||
// BBS: brims are generated by volume groups
|
||||
for (const auto& volumeGroup : object->firstLayerObjGroups()) {
|
||||
@@ -926,11 +926,11 @@ static ExPolygons outer_inner_brim_area(const Print& print,
|
||||
double groupHeight = 0.;
|
||||
// config brim width in auto-brim mode
|
||||
if (has_brim_auto) {
|
||||
double brimWidthRaw = configBrimWidthByVolumeGroups(adhension, maxSpeed, groupVolumePtrs, volumeGroup.slices, groupHeight);
|
||||
double brimWidthRaw = configBrimWidthByVolumeGroups(adhesion, maxSpeed, groupVolumePtrs, volumeGroup.slices, groupHeight);
|
||||
brim_width = scale_(floor(brimWidthRaw / flowWidth / 2) * flowWidth * 2);
|
||||
}
|
||||
for (const ExPolygon& ex_poly : volumeGroup.slices) {
|
||||
// BBS: additional brim width will be added if part's adhension area is too small and brim is not generated
|
||||
// BBS: additional brim width will be added if part's adhesion area is too small and brim is not generated
|
||||
float brim_width_mod;
|
||||
if (brim_width < scale_(5.) && has_brim_auto && groupHeight > 10.) {
|
||||
brim_width_mod = ex_poly.area() / ex_poly.contour.length() < scaled_half_min_adh_length
|
||||
@@ -1024,7 +1024,7 @@ static ExPolygons outer_inner_brim_area(const Print& print,
|
||||
// BBS
|
||||
if (!object->support_layers().empty() && object->support_layers().front()->support_type == stInnerTree) {
|
||||
for (const ExPolygon &ex_poly : object->support_layers().front()->lslices) {
|
||||
// BBS: additional brim width will be added if adhension area is too small without brim
|
||||
// BBS: additional brim width will be added if adhesion area is too small without brim
|
||||
float brim_width_mod = ex_poly.area() / ex_poly.contour.length() < scaled_half_min_adh_length
|
||||
&& brim_width < scaled_flow_width ? brim_width + scaled_additional_brim_width : brim_width;
|
||||
brim_width_mod = floor(brim_width_mod / scaled_flow_width / 2) * scaled_flow_width * 2;
|
||||
|
||||
@@ -580,6 +580,10 @@ target_link_libraries(libslic3r
|
||||
opencv_world
|
||||
)
|
||||
|
||||
if(NOT SLIC3R_STATIC)
|
||||
target_compile_definitions(libslic3r PUBLIC BOOST_ALL_DYN_LINK)
|
||||
endif()
|
||||
|
||||
if(NOT WIN32)
|
||||
target_link_libraries(libslic3r freetype)
|
||||
if (NOT APPLE)
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "../miniz_extension.hpp"
|
||||
#include "format.hpp"
|
||||
|
||||
#include <boost/algorithm/string/case_conv.hpp>
|
||||
#include <qoi/qoi.h>
|
||||
#include <jpeglib.h>
|
||||
#include <jerror.h>
|
||||
@@ -594,7 +595,7 @@ std::string get_error_string(const ThumbnailErrors& errors)
|
||||
std::string error_str;
|
||||
|
||||
if (errors.has(ThumbnailError::InvalidVal))
|
||||
error_str += "\n - " + format("Invalid input format. Expected vector of dimensions in the following format: \"%1%\"", "XxY/EXT, XxY/EXT, ...");
|
||||
error_str += "\n - " + Slic3r::format("Invalid input format. Expected vector of dimensions in the following format: \"%1%\"", "XxY/EXT, XxY/EXT, ...");
|
||||
if (errors.has(ThumbnailError::OutOfRange))
|
||||
error_str += "\n - Input value is out of range";
|
||||
if (errors.has(ThumbnailError::InvalidExt))
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include "../Point.hpp"
|
||||
#include "../PrintConfig.hpp"
|
||||
#include "../enum_bitmask.hpp"
|
||||
#include "ThumbnailData.hpp"
|
||||
#include "../enum_bitmask.hpp"
|
||||
|
||||
|
||||
@@ -1466,7 +1466,7 @@ WipeTower::ToolChangeResult WipeTower2::finish_layer()
|
||||
return poly;
|
||||
};
|
||||
|
||||
feedrate = first_layer ? m_first_layer_speed * 60.f : m_perimeter_speed * 60.f;
|
||||
feedrate = first_layer ? m_first_layer_speed * 60.f : std::min(m_wipe_tower_max_purge_speed * 60.f, m_perimeter_speed * 60.f);
|
||||
|
||||
// outer contour (always)
|
||||
bool infill_cone = first_layer && m_wipe_tower_width > 2*spacing && m_wipe_tower_depth > 2*spacing;
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#undef PI
|
||||
|
||||
#include <boost/next_prior.hpp>
|
||||
#include "boost/log/trivial.hpp"
|
||||
// Include igl first. It defines "L" macro which then clashes with our localization
|
||||
#include <igl/copyleft/cgal/mesh_boolean.h>
|
||||
#undef L
|
||||
@@ -27,7 +28,6 @@
|
||||
#include <CGAL/boost/graph/Face_filtered_graph.h>
|
||||
// BBS: for boolean using mcut
|
||||
#include "mcut/include/mcut/mcut.h"
|
||||
#include "boost/log/trivial.hpp"
|
||||
|
||||
namespace Slic3r {
|
||||
namespace MeshBoolean {
|
||||
|
||||
@@ -3115,8 +3115,8 @@ double Model::getThermalLength(const std::vector<ModelVolume*> modelVolumePtrs)
|
||||
}
|
||||
return thermalLength;
|
||||
}
|
||||
// max printing speed, difference in bed temperature and envirument temperature and bed adhension coefficients are considered
|
||||
double ModelInstance::get_auto_brim_width(double deltaT, double adhension) const
|
||||
// max printing speed, difference in bed temperature and envirument temperature and bed adhesion coefficients are considered
|
||||
double ModelInstance::get_auto_brim_width(double deltaT, double adhesion) const
|
||||
{
|
||||
BoundingBoxf3 raw_bbox = object->raw_mesh_bounding_box();
|
||||
double maxSpeed = Model::findMaxSpeed(object);
|
||||
@@ -3127,7 +3127,7 @@ double ModelInstance::get_auto_brim_width(double deltaT, double adhension) const
|
||||
double thermalLength = sqrt(bbox_size(0)* bbox_size(0) + bbox_size(1)* bbox_size(1));
|
||||
double thermalLengthRef = Model::getThermalLength(object->volumes);
|
||||
|
||||
double brim_width = adhension * std::min(std::min(std::max(height_to_area * 200 * maxSpeed/200, thermalLength * 8. / thermalLengthRef * std::min(bbox_size(2), 30.) / 30.), 20.), 1.5 * thermalLength);
|
||||
double brim_width = adhesion * std::min(std::min(std::max(height_to_area * 200 * maxSpeed/200, thermalLength * 8. / thermalLengthRef * std::min(bbox_size(2), 30.) / 30.), 20.), 1.5 * thermalLength);
|
||||
// small brims are omitted
|
||||
if (brim_width < 5 && brim_width < 1.5 * thermalLength)
|
||||
brim_width = 0;
|
||||
|
||||
@@ -1322,7 +1322,7 @@ public:
|
||||
bool is_assemble_initialized() { return m_assemble_initialized; }
|
||||
|
||||
//BBS
|
||||
double get_auto_brim_width(double deltaT, double adhension) const;
|
||||
double get_auto_brim_width(double deltaT, double adhesion) const;
|
||||
double get_auto_brim_width() const;
|
||||
// BBS
|
||||
Polygon convex_hull_2d();
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <boost/log/trivial.hpp>
|
||||
#include <boost/thread.hpp>
|
||||
|
||||
#include <float.h>
|
||||
|
||||
namespace {
|
||||
@@ -2359,7 +2358,7 @@ void PrintConfigDef::init_fff_params()
|
||||
def = this->add("initial_layer_print_height", coFloat);
|
||||
def->label = L("Initial layer height");
|
||||
def->category = L("Quality");
|
||||
def->tooltip = L("Height of initial layer. Making initial layer height to be thick slightly can improve build plate adhension");
|
||||
def->tooltip = L("Height of initial layer. Making initial layer height to be thick slightly can improve build plate adhesion");
|
||||
def->sidetext = L("mm");
|
||||
def->min = 0;
|
||||
def->set_default_value(new ConfigOptionFloat(0.2));
|
||||
@@ -6100,7 +6099,7 @@ void PrintConfigDef::handle_legacy_composite(DynamicPrintConfig &config)
|
||||
auto [thumbnails_list, errors] = GCodeThumbnails::make_and_check_thumbnail_list(thumbnails_str, extention);
|
||||
|
||||
if (errors != enum_bitmask<ThumbnailError>()) {
|
||||
std::string error_str = "\n" + format("Invalid value provided for parameter %1%: %2%", "thumbnails", thumbnails_str);
|
||||
std::string error_str = "\n" + Slic3r::format("Invalid value provided for parameter %1%: %2%", "thumbnails", thumbnails_str);
|
||||
error_str += GCodeThumbnails::get_error_string(errors);
|
||||
throw BadOptionValueException(error_str);
|
||||
}
|
||||
@@ -6109,7 +6108,7 @@ void PrintConfigDef::handle_legacy_composite(DynamicPrintConfig &config)
|
||||
const auto& extentions = ConfigOptionEnum<GCodeThumbnailsFormat>::get_enum_names();
|
||||
thumbnails_str.clear();
|
||||
for (const auto& [ext, size] : thumbnails_list)
|
||||
thumbnails_str += format("%1%x%2%/%3%, ", size.x(), size.y(), extentions[int(ext)]);
|
||||
thumbnails_str += Slic3r::format("%1%x%2%/%3%, ", size.x(), size.y(), extentions[int(ext)]);
|
||||
thumbnails_str.resize(thumbnails_str.length() - 2);
|
||||
|
||||
config.set_key_value("thumbnails", new ConfigOptionString(thumbnails_str));
|
||||
|
||||
@@ -37,7 +37,7 @@ echo -n "[9/9] Generating Linux app..."
|
||||
cat << EOF >@SLIC3R_APP_CMD@
|
||||
#!/bin/bash
|
||||
DIR=\$(readlink -f "\$0" | xargs dirname)
|
||||
export LD_LIBRARY_PATH="\$DIR/bin"
|
||||
export LD_LIBRARY_PATH="\$DIR/bin:\$LD_LIBRARY_PATH"
|
||||
|
||||
# FIXME: OrcaSlicer segfault workarounds
|
||||
# 1) OrcaSlicer will segfault on systems where locale info is not as expected (i.e. Holo-ISO arch-based distro)
|
||||
|
||||
@@ -268,7 +268,7 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con
|
||||
|
||||
if (config->option<ConfigOptionFloat>("elefant_foot_compensation")->value > 1)
|
||||
{
|
||||
const wxString msg_text = _(L("Too large elefant foot compensation is unreasonable.\n"
|
||||
const wxString msg_text = _(L("Too large elephant foot compensation is unreasonable.\n"
|
||||
"If really have serious elephant foot effect, please check other settings.\n"
|
||||
"For example, whether bed temperature is too high.\n\n"
|
||||
"The value will be reset to 0."));
|
||||
|
||||
@@ -1641,7 +1641,7 @@ wxBoxSizer *CreatePrinterPresetDialog::create_printer_item(wxWindow *parent)
|
||||
m_select_model->SetLabelColor(*wxBLACK);
|
||||
}
|
||||
} else {
|
||||
MessageDialog dlg(this, _L("The model is not fond, place reselect vendor."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE);
|
||||
MessageDialog dlg(this, _L("The model is not found, place reselect vendor."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE);
|
||||
dlg.ShowModal();
|
||||
}
|
||||
e.Skip();
|
||||
@@ -2121,7 +2121,7 @@ bool CreatePrinterPresetDialog::load_system_and_user_presets_with_curr_model(Pre
|
||||
varient = model_varient.substr(index_at + 3, index_nozzle - index_at - 4);
|
||||
} else {
|
||||
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "get nozzle failed";
|
||||
MessageDialog dlg(this, _L("The nozzle diameter is not fond, place reselect."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE);
|
||||
MessageDialog dlg(this, _L("The nozzle diameter is not found, place reselect."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE);
|
||||
dlg.ShowModal();
|
||||
return false;
|
||||
}
|
||||
@@ -2132,7 +2132,7 @@ bool CreatePrinterPresetDialog::load_system_and_user_presets_with_curr_model(Pre
|
||||
if (temp_printer_preset) {
|
||||
m_printer_preset = new Preset(*temp_printer_preset);
|
||||
} else {
|
||||
MessageDialog dlg(this, _L("The printer preset is not fond, place reselect."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE);
|
||||
MessageDialog dlg(this, _L("The printer preset is not found, place reselect."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES_NO | wxYES_DEFAULT | wxCENTRE);
|
||||
dlg.ShowModal();
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -263,7 +263,7 @@ std::map<std::string, std::string> SettingsFactory::CATEGORY_ICON =
|
||||
{ L("Extruders") , "blank_14" },
|
||||
{ L("Extrusion Width") , "blank_14" },
|
||||
{ L("Wipe options") , "blank_14" },
|
||||
{ L("Bed adhension") , "blank_14" },
|
||||
{ L("Bed adhesion") , "blank_14" },
|
||||
// { L("Speed > Acceleration") , "time" },
|
||||
{ L("Advanced") , "blank_14" },
|
||||
// BBS: remove SLA categories
|
||||
@@ -1441,10 +1441,10 @@ void MenuFactory::create_bbl_part_menu()
|
||||
if (!split_menu)
|
||||
return;
|
||||
|
||||
append_menu_item(split_menu, wxID_ANY, _L("To objects"), _L("Split the selected object into mutiple objects"),
|
||||
append_menu_item(split_menu, wxID_ANY, _L("To objects"), _L("Split the selected object into multiple objects"),
|
||||
[](wxCommandEvent&) { plater()->split_object(); }, "menu_split_objects", menu,
|
||||
[]() { return plater()->can_split(true); }, m_parent);
|
||||
append_menu_item(split_menu, wxID_ANY, _L("To parts"), _L("Split the selected object into mutiple parts"),
|
||||
append_menu_item(split_menu, wxID_ANY, _L("To parts"), _L("Split the selected object into multiple parts"),
|
||||
[](wxCommandEvent&) { plater()->split_volume(); }, "menu_split_parts", menu,
|
||||
[]() { return plater()->can_split(false); }, m_parent);
|
||||
|
||||
|
||||
@@ -5412,7 +5412,7 @@ void ObjectList::fix_through_netfabb()
|
||||
msg += "\n\n";
|
||||
}
|
||||
if (!failed_models.empty()) {
|
||||
msg += _L_PLURAL("Failed to repair folowing model object", "Failed to repair folowing model objects", failed_models.size()) + ":\n";
|
||||
msg += _L_PLURAL("Failed to repair following model object", "Failed to repair following model objects", failed_models.size()) + ":\n";
|
||||
for (auto& model : failed_models)
|
||||
msg += bullet_suf + from_u8(model.first) + ": " + _(model.second);
|
||||
}
|
||||
|
||||
@@ -631,7 +631,7 @@ bool GLGizmoCut3D::render_slider_double_input(const std::string& label, float& v
|
||||
float min_tolerance = tolerance_in < 0.f ? UndefMinVal : 0.f;
|
||||
const float max_tolerance_v = max_tolerance > 0.f ? std::min(max_tolerance, 0.5f * mean_size) : 0.5f * mean_size;
|
||||
|
||||
m_imgui->bbl_slider_float_style(("##tolerance_" + label).c_str(), &tolerance, min_tolerance, max_tolerance_v, format.c_str(), 1.f, true,
|
||||
m_imgui->bbl_slider_float_style("##tolerance_" + label, &tolerance, min_tolerance, max_tolerance_v, format.c_str(), 1.f, true,
|
||||
_L("Tolerance"));
|
||||
|
||||
left_width += (slider_with + item_in_gap);
|
||||
@@ -699,7 +699,7 @@ bool GLGizmoCut3D::render_reset_button(const std::string& label_id, const std::s
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, {0.4f, 0.4f, 0.4f, 1.0f});
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonActive, {0.4f, 0.4f, 0.4f, 1.0f});
|
||||
|
||||
const bool revert = m_imgui->button(wxString(ImGui::RevertBtn) + "##" + label_id);
|
||||
const bool revert = m_imgui->button(wxString(ImGui::RevertBtn) + "##" + wxString::FromUTF8(label_id));
|
||||
|
||||
ImGui::PopStyleColor(3);
|
||||
|
||||
@@ -2534,7 +2534,7 @@ void GLGizmoCut3D::render_groove_float_input(const std::string& label, float& in
|
||||
|
||||
m_imgui->disabled_begin(is_approx(in_val, init_val) && is_approx(in_tolerance, 0.1f));
|
||||
const std::string act_name = _u8L("Reset");
|
||||
if (render_reset_button(("##groove_" + label + act_name).c_str(), act_name)) {
|
||||
if (render_reset_button("##groove_" + label + act_name, act_name)) {
|
||||
Plater::TakeSnapshot snapshot(wxGetApp().plater(), GUI::format("%1%: %2%", act_name, label), UndoRedo::SnapshotType::GizmoAction);
|
||||
in_val = init_val;
|
||||
in_tolerance = 0.1f;
|
||||
@@ -2574,7 +2574,7 @@ bool GLGizmoCut3D::render_angle_input(const std::string& label, float& in_val, c
|
||||
const float old_val = val;
|
||||
|
||||
const std::string format = "%.0f " + _u8L("°");
|
||||
m_imgui->bbl_slider_float_style(("##angle_" + label).c_str(), &val, min_val, max_val, format.c_str(), 1.f, true, from_u8(label));
|
||||
m_imgui->bbl_slider_float_style("##angle_" + label, &val, min_val, max_val, format.c_str(), 1.f, true, from_u8(label));
|
||||
|
||||
ImGui::SameLine(left_width);
|
||||
ImGui::PushItemWidth(input_width);
|
||||
@@ -2597,7 +2597,7 @@ bool GLGizmoCut3D::render_angle_input(const std::string& label, float& in_val, c
|
||||
|
||||
m_imgui->disabled_begin(is_approx(in_val, init_val));
|
||||
const std::string act_name = _u8L("Reset");
|
||||
if (render_reset_button(("##angle_" + label + act_name).c_str(), act_name)) {
|
||||
if (render_reset_button("##angle_" + label + act_name, act_name)) {
|
||||
Plater::TakeSnapshot snapshot(wxGetApp().plater(), GUI::format("%1%: %2%", act_name, label), UndoRedo::SnapshotType::GizmoAction);
|
||||
in_val = init_val;
|
||||
is_changed = true;
|
||||
@@ -2640,7 +2640,7 @@ void GLGizmoCut3D::render_snap_specific_input(const std::string& label, const wx
|
||||
|
||||
float val = in_val * 100.f;
|
||||
const float old_val = val;
|
||||
m_imgui->bbl_slider_float_style(("##snap_" + label).c_str(), &val, min_val, max_val, format.c_str(), 1.f, true, tooltip);
|
||||
m_imgui->bbl_slider_float_style("##snap_" + label, &val, min_val, max_val, format.c_str(), 1.f, true, tooltip);
|
||||
|
||||
ImGui::SameLine(left_width);
|
||||
ImGui::PushItemWidth(input_width);
|
||||
@@ -2655,7 +2655,7 @@ void GLGizmoCut3D::render_snap_specific_input(const std::string& label, const wx
|
||||
|
||||
m_imgui->disabled_begin(is_approx(in_val, init_val));
|
||||
const std::string act_name = _u8L("Reset");
|
||||
if (render_reset_button(("##snap_" + label + act_name).c_str(), act_name)) {
|
||||
if (render_reset_button("##snap_" + label + act_name, act_name)) {
|
||||
in_val = init_val;
|
||||
is_changed = true;
|
||||
}
|
||||
@@ -2690,7 +2690,7 @@ void GLGizmoCut3D::render_cut_plane_input_window(CutConnectors &connectors, floa
|
||||
const bool is_cut_plane_init = m_rotation_m.isApprox(Transform3d::Identity()) && m_bb_center.isApprox(m_plane_center);
|
||||
m_imgui->disabled_begin(is_cut_plane_init);
|
||||
std::string act_name = _u8L("Reset cutting plane");
|
||||
if (render_reset_button("cut_plane", into_u8(act_name))) {
|
||||
if (render_reset_button("cut_plane", act_name)) {
|
||||
Plater::TakeSnapshot snapshot(wxGetApp().plater(), act_name, UndoRedo::SnapshotType::GizmoAction);
|
||||
reset_cut_plane();
|
||||
}
|
||||
@@ -2710,7 +2710,7 @@ void GLGizmoCut3D::render_cut_plane_input_window(CutConnectors &connectors, floa
|
||||
|
||||
m_imgui->disabled_begin(is_cut_plane_init && !has_connectors);
|
||||
act_name = _u8L("Reset cut");
|
||||
if (m_imgui->button(act_name, _u8L("Reset cutting plane and remove connectors"))) {
|
||||
if (m_imgui->button(wxString::FromUTF8(act_name), _L("Reset cutting plane and remove connectors"))) {
|
||||
Plater::TakeSnapshot snapshot(wxGetApp().plater(), act_name, UndoRedo::SnapshotType::GizmoAction);
|
||||
reset_cut_plane();
|
||||
reset_connectors();
|
||||
|
||||
@@ -3117,7 +3117,7 @@ void GLGizmoEmboss::create_notification_not_valid_font(
|
||||
const std::string &face_name = face_name_opt.value_or(face_name_by_wx.value_or(es.path));
|
||||
std::string text =
|
||||
GUI::format(_L("Can't load exactly same font(\"%1%\"). "
|
||||
"Aplication selected a similar one(\"%2%\"). "
|
||||
"Application selected a similar one(\"%2%\"). "
|
||||
"You have to specify font for enable edit text."),
|
||||
face_name_3mf, face_name);
|
||||
create_notification_not_valid_font(text);
|
||||
|
||||
@@ -367,7 +367,7 @@ void GLGizmoSimplify::on_render_input_window(float x, float y, float bottom_limi
|
||||
apply_simplify();
|
||||
}
|
||||
else if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && is_worker_running) {
|
||||
ImGui::SetTooltip("%s", _u8L("Can't apply when proccess preview.").c_str());
|
||||
ImGui::SetTooltip("%s", _u8L("Can't apply when process preview.").c_str());
|
||||
}
|
||||
m_imgui->pop_confirm_button_style();
|
||||
m_imgui->disabled_end(); // state !settings
|
||||
|
||||
@@ -278,7 +278,7 @@ bool GLGizmoText::on_init()
|
||||
m_desc["surface"] = _L("Surface");
|
||||
m_desc["horizontal_text"] = _L("Horizontal text");
|
||||
|
||||
m_desc["rotate_text_caption"] = _L("Shift + Mouse move up or dowm");
|
||||
m_desc["rotate_text_caption"] = _L("Shift + Mouse move up or down");
|
||||
m_desc["rotate_text"] = _L("Rotate text");
|
||||
|
||||
return true;
|
||||
|
||||
@@ -114,7 +114,7 @@ wxString PrintJob::get_http_error_msg(unsigned int status, std::string body)
|
||||
return _L("Service Unavailable");
|
||||
}
|
||||
else {
|
||||
wxString unkown_text = _L("Unkown Error.");
|
||||
wxString unkown_text = _L("Unknown Error.");
|
||||
unkown_text += wxString::Format("status=%u, body=%s", status, body);
|
||||
BOOST_LOG_TRIVIAL(error) << "http_error: status=" << status << ", code=" << code << ", error=" << error;
|
||||
return unkown_text;
|
||||
|
||||
@@ -78,7 +78,7 @@ wxString SendJob::get_http_error_msg(unsigned int status, std::string body)
|
||||
return _L("Service Unavailable");
|
||||
}
|
||||
else {
|
||||
wxString unkown_text = _L("Unkown Error.");
|
||||
wxString unkown_text = _L("Unknown Error.");
|
||||
unkown_text += wxString::Format("status=%u, body=%s", status, body);
|
||||
return unkown_text;
|
||||
}
|
||||
|
||||
@@ -4764,7 +4764,7 @@ wxString Plater::priv::get_export_file(GUI::FileType file_type)
|
||||
if (boost::filesystem::exists(into_u8(out_path), ec)) {
|
||||
auto result = MessageBox(q->GetHandle(),
|
||||
wxString::Format(_L("The file %s already exists\nDo you want to replace it?"), out_path),
|
||||
_L("Comfirm Save As"),
|
||||
_L("Confirm Save As"),
|
||||
MB_YESNO | MB_ICONWARNING);
|
||||
if (result != IDYES)
|
||||
return wxEmptyString;
|
||||
@@ -11527,7 +11527,7 @@ TriangleMesh Plater::combine_mesh_fff(const ModelObject& mo, int instance_id, st
|
||||
csg::mpartsPositive | csg::mpartsNegative);
|
||||
|
||||
std::string fail_msg = _u8L("Unable to perform boolean operation on model meshes. "
|
||||
"Only positive parts will be kept. You may fix the meshes and try agian.");
|
||||
"Only positive parts will be kept. You may fix the meshes and try again.");
|
||||
if (auto fail_reason_name = csg::check_csgmesh_booleans(Range{ std::begin(csgmesh), std::end(csgmesh) }); std::get<0>(fail_reason_name) != csg::BooleanFailReason::OK) {
|
||||
std::string name = std::get<1>(fail_reason_name);
|
||||
std::map<csg::BooleanFailReason, std::string> fail_reasons = {
|
||||
@@ -13329,6 +13329,8 @@ void Plater::clone_selection()
|
||||
}
|
||||
Selection& selection = p->get_selection();
|
||||
selection.clone(res);
|
||||
if (wxGetApp().app_config->get("auto_arrange") == "true")
|
||||
this->arrange();
|
||||
}
|
||||
|
||||
std::vector<Vec2f> Plater::get_empty_cells(const Vec2f step)
|
||||
|
||||
@@ -1133,6 +1133,7 @@ wxWindow* PreferencesDialog::create_general_page()
|
||||
auto item_calc_in_long_retract = create_item_checkbox(_L("Flushing volumes: Auto-calculate every time when the filament is changed."), page, _L("If enabled, auto-calculate every time when filament is changed"), 50, "auto_calculate_when_filament_change");
|
||||
auto item_remember_printer_config = create_item_checkbox(_L("Remember printer configuration"), page, _L("If enabled, Orca will remember and switch filament/process configuration for each printer automatically."), 50, "remember_printer_config");
|
||||
auto item_multi_machine = create_item_checkbox(_L("Multi-device Management(Take effect after restarting Orca)."), page, _L("With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices."), 50, "enable_multi_machine");
|
||||
auto item_auto_arrange = create_item_checkbox(_L("Auto arrange plate after cloning"), page, _L("Auto arrange plate after object cloning"), 50, "auto_arrange");
|
||||
auto title_presets = create_item_title(_L("Presets"), page, _L("Presets"));
|
||||
auto title_network = create_item_title(_L("Network"), page, _L("Network"));
|
||||
auto item_user_sync = create_item_checkbox(_L("Auto sync user presets(Printer/Filament/Process)"), page, _L("User Sync"), 50, "sync_user_preset");
|
||||
@@ -1205,6 +1206,7 @@ wxWindow* PreferencesDialog::create_general_page()
|
||||
sizer_page->Add(item_hints, 0, wxTOP, FromDIP(3));
|
||||
sizer_page->Add(item_calc_in_long_retract, 0, wxTOP, FromDIP(3));
|
||||
sizer_page->Add(item_multi_machine, 0, wxTOP, FromDIP(3));
|
||||
sizer_page->Add(item_auto_arrange, 0, wxTOP, FromDIP(3));
|
||||
sizer_page->Add(title_presets, 0, wxTOP | wxEXPAND, FromDIP(20));
|
||||
sizer_page->Add(item_calc_mode, 0, wxTOP, FromDIP(3));
|
||||
sizer_page->Add(item_user_sync, 0, wxTOP, FromDIP(3));
|
||||
|
||||
Reference in New Issue
Block a user