Merge branch 'main' into dev/bbl-network-upd
This commit is contained in:
@@ -23,7 +23,7 @@ void FillLine::_fill_surface_single(
|
||||
this->_diagonal_distance = this->_line_spacing * 2;
|
||||
this->_line_oscillation = this->_line_spacing - this->_min_spacing; // only for Line infill
|
||||
BoundingBox bounding_box = expolygon.contour.bounding_box();
|
||||
|
||||
|
||||
// define flow spacing according to requested density
|
||||
if (params.density > 0.9999f && !params.dont_adjust) {
|
||||
this->_line_spacing = this->_adjust_solid_spacing(bounding_box.size()(0), this->_line_spacing);
|
||||
@@ -32,8 +32,8 @@ void FillLine::_fill_surface_single(
|
||||
// extend bounding box so that our pattern will be aligned with other layers
|
||||
// Transform the reference point to the rotated coordinate system.
|
||||
bounding_box.merge(align_to_grid(
|
||||
bounding_box.min,
|
||||
Point(this->_line_spacing, this->_line_spacing),
|
||||
bounding_box.min,
|
||||
Point(this->_line_spacing, this->_line_spacing),
|
||||
direction.second.rotated(- direction.first)));
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ void FillLine::_fill_surface_single(
|
||||
// clip paths against a slightly larger expolygon, so that the first and last paths
|
||||
// are kept even if the expolygon has vertical sides
|
||||
// the minimum offset for preventing edge lines from being clipped is SCALED_EPSILON;
|
||||
// however we use a larger offset to support expolygons with slightly skewed sides and
|
||||
// however we use a larger offset to support expolygons with slightly skewed sides and
|
||||
// not perfectly straight
|
||||
//FIXME Vojtech: Update the intersecton function to work directly with lines.
|
||||
Polylines polylines_src;
|
||||
@@ -76,7 +76,7 @@ void FillLine::_fill_surface_single(
|
||||
size_t n_polylines_out_old = polylines_out.size();
|
||||
|
||||
// connect lines
|
||||
if (! params.dont_connect() && ! polylines.empty()) { // prevent calling leftmost_point() on empty collections
|
||||
if (! polylines.empty()) { // prevent calling leftmost_point() on empty collections
|
||||
// offset the expolygon by max(min_spacing/2, extra)
|
||||
ExPolygon expolygon_off;
|
||||
{
|
||||
@@ -96,9 +96,9 @@ void FillLine::_fill_surface_single(
|
||||
const Point &last_point = pts_end.back();
|
||||
// Distance in X, Y.
|
||||
const Vector distance = last_point - first_point;
|
||||
// TODO: we should also check that both points are on a fill_boundary to avoid
|
||||
// TODO: we should also check that both points are on a fill_boundary to avoid
|
||||
// connecting paths on the boundaries of internal regions
|
||||
if (this->_can_connect(std::abs(distance(0)), std::abs(distance(1))) &&
|
||||
if (this->_can_connect(std::abs(distance(0)), std::abs(distance(1))) &&
|
||||
expolygon_off.contains(Line(last_point, first_point))) {
|
||||
// Append the polyline.
|
||||
pts_end.insert(pts_end.end(), polyline.points.begin(), polyline.points.end());
|
||||
|
||||
@@ -548,19 +548,11 @@ std::vector<size_t> Print::layers_sorted_for_object(float start, float end, std:
|
||||
StringObjectException Print::sequential_print_clearance_valid(const Print &print, Polygons *polygons, std::vector<std::pair<Polygon, float>>* height_polygons)
|
||||
{
|
||||
StringObjectException single_object_exception;
|
||||
auto print_config = print.config();
|
||||
Pointfs excluse_area_points = print_config.bed_exclude_area.values;
|
||||
Polygons exclude_polys;
|
||||
Polygon exclude_poly;
|
||||
const auto& print_config = print.config();
|
||||
Polygons exclude_polys = get_bed_excluded_area(print_config);
|
||||
const Vec3d print_origin = print.get_plate_origin();
|
||||
for (int i = 0; i < excluse_area_points.size(); i++) {
|
||||
auto pt = excluse_area_points[i];
|
||||
exclude_poly.points.emplace_back(scale_(pt.x() + print_origin.x()), scale_(pt.y() + print_origin.y()));
|
||||
if (i % 4 == 3) { // exclude areas are always rectangle
|
||||
exclude_polys.push_back(exclude_poly);
|
||||
exclude_poly.points.clear();
|
||||
}
|
||||
}
|
||||
std::for_each(exclude_polys.begin(), exclude_polys.end(),
|
||||
[&print_origin](Polygon& p) { p.translate(scale_(print_origin.x()), scale_(print_origin.y())); });
|
||||
|
||||
std::map<ObjectID, Polygon> map_model_object_to_convex_hull;
|
||||
struct print_instance_info
|
||||
@@ -887,19 +879,11 @@ static StringObjectException layered_print_cleareance_valid(const Print &print,
|
||||
if (print_instances_ordered.size() < 1)
|
||||
return {};
|
||||
|
||||
auto print_config = print.config();
|
||||
Pointfs excluse_area_points = print_config.bed_exclude_area.values;
|
||||
Polygons exclude_polys;
|
||||
Polygon exclude_poly;
|
||||
const auto& print_config = print.config();
|
||||
Polygons exclude_polys = get_bed_excluded_area(print_config);
|
||||
const Vec3d print_origin = print.get_plate_origin();
|
||||
for (int i = 0; i < excluse_area_points.size(); i++) {
|
||||
auto pt = excluse_area_points[i];
|
||||
exclude_poly.points.emplace_back(scale_(pt.x() + print_origin.x()), scale_(pt.y() + print_origin.y()));
|
||||
if (i % 4 == 3) { // exclude areas are always rectangle
|
||||
exclude_polys.push_back(exclude_poly);
|
||||
exclude_poly.points.clear();
|
||||
}
|
||||
}
|
||||
std::for_each(exclude_polys.begin(), exclude_polys.end(),
|
||||
[&print_origin](Polygon& p) { p.translate(scale_(print_origin.x()), scale_(print_origin.y())); });
|
||||
|
||||
std::map<const PrintInstance*, Polygon> map_model_object_to_convex_hull;
|
||||
// sequential_print_horizontal_clearance_valid
|
||||
|
||||
@@ -8154,22 +8154,27 @@ Points get_bed_shape(const PrintConfig &cfg)
|
||||
|
||||
Points get_bed_shape(const SLAPrinterConfig &cfg) { return to_points(make_counter_clockwise(cfg.printable_area.values)); }
|
||||
|
||||
Polygons get_bed_excluded_area(const PrintConfig& cfg)
|
||||
{
|
||||
const Pointfs exclude_area_points = cfg.bed_exclude_area.values;
|
||||
|
||||
Polygon exclude_poly;
|
||||
for (int i = 0; i < exclude_area_points.size(); i++) {
|
||||
auto pt = exclude_area_points[i];
|
||||
exclude_poly.points.emplace_back(scale_(pt.x()), scale_(pt.y()));
|
||||
}
|
||||
|
||||
exclude_poly.make_counter_clockwise();
|
||||
|
||||
return {exclude_poly};
|
||||
}
|
||||
|
||||
Polygon get_bed_shape_with_excluded_area(const PrintConfig& cfg)
|
||||
{
|
||||
Polygon bed_poly;
|
||||
bed_poly.points = get_bed_shape(cfg);
|
||||
|
||||
Points excluse_area_points = to_points(cfg.bed_exclude_area.values);
|
||||
Polygons exclude_polys;
|
||||
Polygon exclude_poly;
|
||||
for (int i = 0; i < excluse_area_points.size(); i++) {
|
||||
auto pt = excluse_area_points[i];
|
||||
exclude_poly.points.emplace_back(pt);
|
||||
if (i % 4 == 3) { // exclude areas are always rectangle
|
||||
exclude_polys.push_back(exclude_poly);
|
||||
exclude_poly.points.clear();
|
||||
}
|
||||
}
|
||||
Polygons exclude_polys = get_bed_excluded_area(cfg);
|
||||
auto tmp = diff({ bed_poly }, exclude_polys);
|
||||
if (!tmp.empty()) bed_poly = tmp[0];
|
||||
return bed_poly;
|
||||
|
||||
@@ -1751,6 +1751,7 @@ bool is_XL_printer(const PrintConfig &cfg);
|
||||
Points get_bed_shape(const DynamicPrintConfig &cfg);
|
||||
Points get_bed_shape(const PrintConfig &cfg);
|
||||
Points get_bed_shape(const SLAPrinterConfig &cfg);
|
||||
Slic3r::Polygons get_bed_excluded_area(const PrintConfig& cfg);
|
||||
Slic3r::Polygon get_bed_shape_with_excluded_area(const PrintConfig& cfg);
|
||||
bool has_skirt(const DynamicPrintConfig& cfg);
|
||||
float get_real_skirt_dist(const DynamicPrintConfig& cfg);
|
||||
|
||||
@@ -235,7 +235,7 @@ AboutDialog::AboutDialog()
|
||||
bool is_dark = wxGetApp().app_config->get("dark_color_mode") == "1";
|
||||
|
||||
// logo
|
||||
m_logo_bitmap = ScalableBitmap(this, is_dark ? "OrcaSlicer_about_dark" : "OrcaSlicer_about", FromDIP(125));
|
||||
m_logo_bitmap = ScalableBitmap(this, is_dark ? "OrcaSlicer_about_dark" : "OrcaSlicer_about", 125);
|
||||
m_logo = new wxStaticBitmap(this, wxID_ANY, m_logo_bitmap.bmp(), wxDefaultPosition,wxDefaultSize, 0);
|
||||
m_logo->SetSizer(vesizer);
|
||||
|
||||
@@ -258,7 +258,7 @@ AboutDialog::AboutDialog()
|
||||
#else
|
||||
version_font.SetPointSize(11);
|
||||
#endif
|
||||
version_font.SetPointSize(FromDIP(20));
|
||||
version_font.SetPointSize(20);
|
||||
version->SetFont(version_font);
|
||||
version->SetForegroundColour(wxColour("#949494"));
|
||||
credits_string->SetForegroundColour(wxColour("#949494"));
|
||||
|
||||
@@ -855,9 +855,9 @@ void AuxiliaryPanel::init_tabpanel()
|
||||
sizer_side_tools->Add(back_btn, 1, wxEXPAND, 0);
|
||||
m_tabpanel = new Tabbook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, sizer_side_tools, wxNB_LEFT | wxTAB_TRAVERSAL | wxNB_NOPAGETHEME);
|
||||
m_tabpanel->SetBackgroundColour(wxColour("#FEFFFF"));
|
||||
m_tabpanel->Bind(wxEVT_BOOKCTRL_PAGE_CHANGED, [this](wxBookCtrlEvent &e) { ; });
|
||||
m_tabpanel->Bind(wxEVT_BOOKCTRL_PAGE_CHANGED, [](wxBookCtrlEvent &e) { /* Event handling */ });
|
||||
|
||||
m_designer_panel = new DesignerPanel(m_tabpanel, AuxiliaryFolderType::DESIGNER);
|
||||
m_designer_panel = new DesignerPanel(m_tabpanel, AuxiliaryFolderType::DESIGNER);
|
||||
m_pictures_panel = new AuFolderPanel(m_tabpanel, AuxiliaryFolderType::MODEL_PICTURE);
|
||||
m_bill_of_materials_panel = new AuFolderPanel(m_tabpanel, AuxiliaryFolderType::BILL_OF_MATERIALS);
|
||||
m_assembly_panel = new AuFolderPanel(m_tabpanel, AuxiliaryFolderType::ASSEMBLY_GUIDE);
|
||||
@@ -1060,52 +1060,61 @@ void AuxiliaryPanel::update_all_cover()
|
||||
{
|
||||
SetBackgroundColour(AUFILE_GREY300);
|
||||
wxBoxSizer *m_sizer_body = new wxBoxSizer(wxVERTICAL);
|
||||
wxBoxSizer *m_sizer_designer = new wxBoxSizer(wxHORIZONTAL);
|
||||
|
||||
wxBoxSizer *m_sizer_designer = new wxBoxSizer(wxHORIZONTAL);
|
||||
auto m_text_designer = new wxStaticText(this, wxID_ANY, _L("Author"), wxDefaultPosition, wxSize(180, -1), 0);
|
||||
m_text_designer->Wrap(-1);
|
||||
m_text_designer->SetForegroundColour(*wxBLACK);
|
||||
m_sizer_designer->Add(m_text_designer, 0, wxALIGN_CENTER, 0);
|
||||
|
||||
m_input_designer = new ::TextInput(this, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(450), FromDIP(30)), wxTE_PROCESS_ENTER);
|
||||
m_input_designer->GetTextCtrl()->SetFont(::Label::Body_14);
|
||||
m_input_designer->GetTextCtrl()->SetSize(wxSize(FromDIP(450), -1));
|
||||
m_sizer_designer->Add(m_input_designer, 0, wxALIGN_CENTER, 0);
|
||||
|
||||
wxBoxSizer *m_sizer_model_name = new wxBoxSizer(wxHORIZONTAL);
|
||||
|
||||
auto m_text_model_name = new wxStaticText(this, wxID_ANY, _L("Model Name"), wxDefaultPosition, wxSize(180, -1), 0);
|
||||
m_text_model_name->SetForegroundColour(*wxBLACK);
|
||||
m_text_model_name->Wrap(-1);
|
||||
m_sizer_model_name->Add(m_text_model_name, 0, wxALIGN_CENTER, 0);
|
||||
|
||||
m_imput_model_name = new ::TextInput(this, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition,wxSize(FromDIP(450),FromDIP(30)), wxTE_PROCESS_ENTER);
|
||||
m_imput_model_name->GetTextCtrl()->SetFont(::Label::Body_14);
|
||||
m_imput_model_name->GetTextCtrl()->SetSize(wxSize(FromDIP(450), -1));
|
||||
m_sizer_model_name->Add(m_imput_model_name, 0, wxALIGN_CENTER, 0);
|
||||
m_input_model_name = new ::TextInput(this, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition,wxSize(FromDIP(450),FromDIP(30)), wxTE_PROCESS_ENTER);
|
||||
m_input_model_name->GetTextCtrl()->SetFont(::Label::Body_14);
|
||||
m_input_model_name->GetTextCtrl()->SetSize(wxSize(FromDIP(450), -1));
|
||||
m_sizer_model_name->Add(m_input_model_name, 0, wxALIGN_CENTER, 0);
|
||||
|
||||
wxBoxSizer *m_sizer_license = new wxBoxSizer(wxHORIZONTAL);
|
||||
auto m_text_license = new wxStaticText(this, wxID_ANY, _L("License"), wxDefaultPosition, wxSize(180, -1), 0);
|
||||
m_text_license->Wrap(-1);
|
||||
m_sizer_license->Add(m_text_license, 0, wxALIGN_CENTER, 0);
|
||||
|
||||
m_combo_license = new ComboBox(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(450), -1), 0, NULL, wxCB_READONLY);
|
||||
m_sizer_license->Add(m_combo_license, 0, wxALIGN_CENTER, 0);
|
||||
|
||||
m_sizer_body->Add( 0, 0, 0, wxTOP, FromDIP(50) );
|
||||
m_sizer_body->Add(m_sizer_designer, 0, wxLEFT, FromDIP(50));
|
||||
m_sizer_body->Add( 0, 0, 0, wxTOP, FromDIP(20));
|
||||
m_sizer_body->Add(m_sizer_model_name, 0, wxLEFT, FromDIP(50));
|
||||
wxBoxSizer *m_sizer_description = new wxBoxSizer(wxHORIZONTAL);
|
||||
auto m_text_description = new wxStaticText(this, wxID_ANY, _L("Description:"), wxDefaultPosition, wxSize(170, -1), 0); // Using "Description:" with the : because that already exists in the Localizations files
|
||||
m_text_description->SetForegroundColour(*wxBLACK);
|
||||
m_text_description->Wrap(-1);
|
||||
m_sizer_description->Add(m_text_description, 0, wxALIGN_TOP | wxRIGHT, FromDIP(10));
|
||||
m_input_description = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition,
|
||||
wxSize(FromDIP(450), FromDIP(300)), wxTE_MULTILINE | wxTE_PROCESS_ENTER);
|
||||
m_input_description->SetFont(::Label::Body_14);
|
||||
m_sizer_description->Add(m_input_description, 0, wxALIGN_CENTER, 0);
|
||||
|
||||
m_sizer_body->Add(0, 0, 0, wxTOP, FromDIP(50));
|
||||
m_sizer_body->Add(m_sizer_designer, 0, wxLEFT | wxALIGN_LEFT, FromDIP(50));
|
||||
m_sizer_body->Add(0, 0, 0, wxTOP, FromDIP(20));
|
||||
m_sizer_body->Add(m_sizer_license, 0, wxLEFT, FromDIP(50));
|
||||
m_sizer_body->Add(m_sizer_model_name, 0, wxLEFT | wxALIGN_LEFT, FromDIP(50));
|
||||
m_sizer_body->Add(0, 0, 0, wxTOP, FromDIP(20));
|
||||
m_sizer_body->Add(m_sizer_license, 0, wxLEFT | wxALIGN_LEFT, FromDIP(50));
|
||||
init_license_list();
|
||||
m_sizer_body->Add(0, 0, 0, wxTOP, FromDIP(20));
|
||||
m_sizer_body->Add(m_sizer_description, 0, wxLEFT | wxALIGN_LEFT, FromDIP(50));
|
||||
|
||||
SetSizer(m_sizer_body);
|
||||
Layout();
|
||||
Fit();
|
||||
|
||||
m_input_designer->Bind(wxEVT_TEXT, &DesignerPanel::on_input_enter_designer, this);
|
||||
m_imput_model_name->Bind(wxEVT_TEXT, &DesignerPanel::on_input_enter_model, this);
|
||||
m_input_model_name->Bind(wxEVT_TEXT, &DesignerPanel::on_input_enter_model, this);
|
||||
m_input_description->Bind(wxEVT_TEXT, &DesignerPanel::on_input_enter_description, this);
|
||||
m_combo_license->Bind(wxEVT_COMMAND_COMBOBOX_SELECTED, &DesignerPanel::on_select_license, this);
|
||||
}
|
||||
|
||||
@@ -1148,6 +1157,12 @@ void DesignerPanel::on_input_enter_model(wxCommandEvent &evt)
|
||||
ensure_model_info()->model_name = std::string(text.ToUTF8().data());
|
||||
}
|
||||
|
||||
void DesignerPanel::on_input_enter_description(wxCommandEvent &evt)
|
||||
{
|
||||
auto text = evt.GetString();
|
||||
ensure_model_info()->description = std::string(text.ToUTF8().data());
|
||||
}
|
||||
|
||||
void DesignerPanel::update_info()
|
||||
{
|
||||
if (wxGetApp().plater()->model().design_info != nullptr) {
|
||||
@@ -1158,12 +1173,14 @@ void DesignerPanel::update_info()
|
||||
}
|
||||
|
||||
if (wxGetApp().plater()->model().model_info != nullptr) {
|
||||
m_imput_model_name->GetTextCtrl()->SetValue(wxString::FromUTF8(wxGetApp().plater()->model().model_info->model_name));
|
||||
m_input_model_name->GetTextCtrl()->SetValue(wxString::FromUTF8(wxGetApp().plater()->model().model_info->model_name));
|
||||
m_input_description->ChangeValue(wxString::FromUTF8(wxGetApp().plater()->model().model_info->description));
|
||||
if (!m_combo_license->SetStringSelection(wxString::FromUTF8(wxGetApp().plater()->model().model_info->license))) {
|
||||
m_combo_license->SetSelection(0);
|
||||
}
|
||||
} else {
|
||||
m_imput_model_name->GetTextCtrl()->SetValue(wxEmptyString);
|
||||
m_input_model_name->GetTextCtrl()->SetValue(wxEmptyString);
|
||||
m_input_description->ChangeValue(wxEmptyString);
|
||||
m_combo_license->SetSelection(0);
|
||||
}
|
||||
}
|
||||
@@ -1171,8 +1188,8 @@ void DesignerPanel::update_info()
|
||||
void DesignerPanel::msw_rescale()
|
||||
{
|
||||
m_input_designer->GetTextCtrl()->SetSize(wxSize(FromDIP(450), -1));
|
||||
m_imput_model_name->GetTextCtrl()->SetSize(wxSize(FromDIP(450), -1));
|
||||
m_input_model_name->GetTextCtrl()->SetSize(wxSize(FromDIP(450), -1));
|
||||
m_combo_license->SetSize(wxSize(FromDIP(450), -1));
|
||||
}
|
||||
m_input_description->SetSize(wxSize(FromDIP(450), -1));}
|
||||
|
||||
}} // namespace Slic3r::GUI
|
||||
|
||||
@@ -180,12 +180,14 @@ public:
|
||||
~DesignerPanel();
|
||||
|
||||
::TextInput* m_input_designer {nullptr};
|
||||
::TextInput* m_imput_model_name {nullptr};
|
||||
::TextInput* m_input_model_name {nullptr};
|
||||
wxTextCtrl* m_input_description {nullptr};
|
||||
ComboBox* m_combo_license {nullptr};
|
||||
bool Show(bool show) override;
|
||||
void init_license_list();
|
||||
void on_input_enter_designer(wxCommandEvent &evt);
|
||||
void on_input_enter_model(wxCommandEvent &evt);
|
||||
void on_input_enter_description(wxCommandEvent &evt);
|
||||
void on_select_license(wxCommandEvent& evt);
|
||||
void update_info();
|
||||
void msw_rescale();
|
||||
|
||||
@@ -521,8 +521,11 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co
|
||||
bool have_combined_infill = config->opt_bool("infill_combination") && have_infill;
|
||||
toggle_line("infill_combination_max_layer_height", have_combined_infill);
|
||||
|
||||
bool infill_anchor = config->opt_enum<InfillPattern>("sparse_infill_pattern") != ipLine;
|
||||
toggle_field("infill_anchor_max",infill_anchor);
|
||||
|
||||
// Only allow configuration of open anchors if the anchoring is enabled.
|
||||
bool has_infill_anchors = have_infill && config->option<ConfigOptionFloatOrPercent>("infill_anchor_max")->value > 0;
|
||||
bool has_infill_anchors = have_infill && config->option<ConfigOptionFloatOrPercent>("infill_anchor_max")->value > 0 && infill_anchor;
|
||||
toggle_field("infill_anchor", has_infill_anchors);
|
||||
|
||||
bool has_spiral_vase = config->opt_bool("spiral_mode");
|
||||
|
||||
@@ -7911,11 +7911,11 @@ void GLCanvas3D::_render_imgui_select_plate_toolbar()
|
||||
m_render_preview = true;
|
||||
|
||||
// places the toolbar on the top_left corner of the 3d scene
|
||||
#if ENABLE_RETINA_GL
|
||||
float f_scale = m_retina_helper->get_scale_factor();
|
||||
#else
|
||||
float f_scale = wxGetApp().em_unit() / 10; // ORCA add scaling support
|
||||
#endif
|
||||
float f_scale = get_scale();
|
||||
#ifdef WIN32
|
||||
const int dpi = get_dpi_for_window(wxGetApp().GetTopWindow());
|
||||
f_scale *= (float) dpi / (float) DPI_DEFAULT;
|
||||
#endif // WIN32
|
||||
Size cnv_size = get_canvas_size();
|
||||
auto canvas_w = float(cnv_size.get_width());
|
||||
auto canvas_h = float(cnv_size.get_height());
|
||||
@@ -7935,16 +7935,15 @@ void GLCanvas3D::_render_imgui_select_plate_toolbar()
|
||||
// Make sure the window does not overlap the 3d navigator
|
||||
auto window_height_max = canvas_h - y_offset;
|
||||
if (wxGetApp().show_3d_navigator()) {
|
||||
float sc = get_scale();
|
||||
#ifdef WIN32
|
||||
const int dpi = get_dpi_for_window(wxGetApp().GetTopWindow());
|
||||
sc *= (float) dpi / (float) DPI_DEFAULT;
|
||||
#endif // WIN32
|
||||
window_height_max -= (128 * sc + 5);
|
||||
window_height_max -= (128 * f_scale + 5);
|
||||
}
|
||||
|
||||
// ORCA simplify and correct window size and margin calculations and get values from style
|
||||
ImGuiWrapper& imgui = *wxGetApp().imgui();
|
||||
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(8.0f, 8.0f) * f_scale);
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(4.0f, 4.0f) * f_scale);
|
||||
|
||||
int item_count = m_sel_plate_toolbar.m_items.size() + (m_sel_plate_toolbar.show_stats_item ? 1 : 0);
|
||||
float window_height_calc = (item_count * (button_height + (margin_size + button_margin) * 2.0f) + (item_count - 1) * ImGui::GetStyle().ItemSpacing.y + ImGui::GetStyle().WindowPadding.y * 2.0f);
|
||||
bool show_scroll = m_sel_plate_toolbar.is_display_scrollbar && (window_height_calc > window_height_max);
|
||||
@@ -8180,7 +8179,7 @@ void GLCanvas3D::_render_imgui_select_plate_toolbar()
|
||||
}
|
||||
ImGui::SetWindowFontScale(1.0f);
|
||||
ImGui::PopStyleColor(8);
|
||||
ImGui::PopStyleVar(5);
|
||||
ImGui::PopStyleVar(7);
|
||||
|
||||
if (ImGui::IsWindowHovered() || is_hovered) {
|
||||
m_sel_plate_toolbar.is_display_scrollbar = true;
|
||||
|
||||
@@ -458,17 +458,7 @@ void ArrangeJob::prepare()
|
||||
auto& print = wxGetApp().plater()->get_partplate_list().get_current_fff_print();
|
||||
auto print_config = print.config();
|
||||
bed_poly.points = get_bed_shape(*m_plater->config());
|
||||
Pointfs excluse_area_points = print_config.bed_exclude_area.values;
|
||||
Polygons exclude_polys;
|
||||
Polygon exclude_poly;
|
||||
for (int i = 0; i < excluse_area_points.size(); i++) {
|
||||
auto pt = excluse_area_points[i];
|
||||
exclude_poly.points.emplace_back(scale_(pt.x()), scale_(pt.y()));
|
||||
if (i % 4 == 3) { // exclude areas are always rectangle
|
||||
exclude_polys.push_back(exclude_poly);
|
||||
exclude_poly.points.clear();
|
||||
}
|
||||
}
|
||||
Polygons exclude_polys = get_bed_excluded_area(print_config);
|
||||
bed_poly = diff({ bed_poly }, exclude_polys)[0];
|
||||
}
|
||||
|
||||
|
||||
@@ -1562,9 +1562,9 @@ wxBoxSizer* MainFrame::create_side_tools()
|
||||
|
||||
// m_publish_btn = new Button(this, _L("Upload"), "bar_publish", 0, FromDIP(16));
|
||||
m_slice_btn = new SideButton(this, _L("Slice plate"), "");
|
||||
m_slice_option_btn = new SideButton(this, "", "sidebutton_dropdown", 0, FromDIP(14));
|
||||
m_slice_option_btn = new SideButton(this, "", "sidebutton_dropdown", 0, 14);
|
||||
m_print_btn = new SideButton(this, _L("Print plate"), "");
|
||||
m_print_option_btn = new SideButton(this, "", "sidebutton_dropdown", 0, FromDIP(14));
|
||||
m_print_option_btn = new SideButton(this, "", "sidebutton_dropdown", 0, 14);
|
||||
|
||||
update_side_button_style();
|
||||
// m_publish_btn->Hide();
|
||||
@@ -1572,12 +1572,10 @@ wxBoxSizer* MainFrame::create_side_tools()
|
||||
m_print_option_btn->Enable();
|
||||
// sizer->Add(m_publish_btn, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(1));
|
||||
// sizer->Add(FromDIP(15), 0, 0, 0, 0);
|
||||
sizer->Add(m_slice_option_btn, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, FromDIP(1));
|
||||
sizer->Add(m_slice_btn, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(1));
|
||||
sizer->Add(FromDIP(15), 0, 0, 0, 0);
|
||||
sizer->Add(m_print_option_btn, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, FromDIP(1));
|
||||
sizer->Add(m_print_btn, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(1));
|
||||
sizer->Add(FromDIP(19), 0, 0, 0, 0);
|
||||
sizer->Add(m_slice_option_btn, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, FromDIP(2));
|
||||
sizer->Add(m_slice_btn , 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, FromDIP(15));
|
||||
sizer->Add(m_print_option_btn, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, FromDIP(2));
|
||||
sizer->Add(m_print_btn , 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, FromDIP(19));
|
||||
|
||||
sizer->Layout();
|
||||
|
||||
|
||||
@@ -10185,7 +10185,6 @@ void Plater::calib_VFA(const Calib_Params& params)
|
||||
auto print_config = &wxGetApp().preset_bundle->prints.get_edited_preset().config;
|
||||
auto filament_config = &wxGetApp().preset_bundle->filaments.get_edited_preset().config;
|
||||
filament_config->set_key_value("slow_down_layer_time", new ConfigOptionFloats { 0.0 });
|
||||
filament_config->set_key_value("filament_max_volumetric_speed", new ConfigOptionFloats { 200 });
|
||||
print_config->set_key_value("enable_overhang_speed", new ConfigOptionBool { false });
|
||||
print_config->set_key_value("timelapse_type", new ConfigOptionEnum<TimelapseType>(tlTraditional));
|
||||
print_config->set_key_value("wall_loops", new ConfigOptionInt(1));
|
||||
@@ -10232,7 +10231,6 @@ void Plater::calib_input_shaping_freq(const Calib_Params& params)
|
||||
filament_config->set_key_value("slow_down_layer_time", new ConfigOptionFloats { 0.0 });
|
||||
filament_config->set_key_value("slow_down_min_speed", new ConfigOptionFloats { 0.0 });
|
||||
filament_config->set_key_value("slow_down_for_layer_cooling", new ConfigOptionBools{false});
|
||||
filament_config->set_key_value("filament_max_volumetric_speed", new ConfigOptionFloats { 200 });
|
||||
filament_config->set_key_value("enable_pressure_advance", new ConfigOptionBools {false });
|
||||
filament_config->set_key_value("pressure_advance", new ConfigOptionFloats { 0.0 });
|
||||
print_config->set_key_value("layer_height", new ConfigOptionFloat(0.2));
|
||||
@@ -10259,7 +10257,7 @@ void Plater::calib_input_shaping_freq(const Calib_Params& params)
|
||||
wxGetApp().get_tab(Preset::TYPE_FILAMENT)->update_dirty();
|
||||
wxGetApp().get_tab(Preset::TYPE_PRINT)->update_ui_from_settings();
|
||||
wxGetApp().get_tab(Preset::TYPE_FILAMENT)->update_ui_from_settings();
|
||||
|
||||
|
||||
p->background_process.fff_print()->set_calib_params(params);
|
||||
}
|
||||
|
||||
@@ -10279,7 +10277,6 @@ void Plater::calib_input_shaping_damp(const Calib_Params& params)
|
||||
filament_config->set_key_value("slow_down_layer_time", new ConfigOptionFloats { 0.0 });
|
||||
filament_config->set_key_value("slow_down_min_speed", new ConfigOptionFloats { 0.0 });
|
||||
filament_config->set_key_value("slow_down_for_layer_cooling", new ConfigOptionBools{false});
|
||||
filament_config->set_key_value("filament_max_volumetric_speed", new ConfigOptionFloats { 200 });
|
||||
filament_config->set_key_value("enable_pressure_advance", new ConfigOptionBools{false});
|
||||
filament_config->set_key_value("pressure_advance", new ConfigOptionFloats{0.0});
|
||||
print_config->set_key_value("layer_height", new ConfigOptionFloat(0.2));
|
||||
@@ -10306,7 +10303,7 @@ void Plater::calib_input_shaping_damp(const Calib_Params& params)
|
||||
wxGetApp().get_tab(Preset::TYPE_FILAMENT)->update_dirty();
|
||||
wxGetApp().get_tab(Preset::TYPE_PRINT)->update_ui_from_settings();
|
||||
wxGetApp().get_tab(Preset::TYPE_FILAMENT)->update_ui_from_settings();
|
||||
|
||||
|
||||
p->background_process.fff_print()->set_calib_params(params);
|
||||
}
|
||||
|
||||
|
||||
@@ -76,6 +76,16 @@ ProjectPanel::ProjectPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos,
|
||||
|
||||
ProjectPanel::~ProjectPanel() {}
|
||||
|
||||
// Helper to convert newlines to <br>
|
||||
static std::string convert_newlines_to_br(const std::string& text) {
|
||||
std::string result = text;
|
||||
size_t pos = 0;
|
||||
while ((pos = result.find('\n', pos)) != std::string::npos) {
|
||||
result.replace(pos, 1, "<br>");
|
||||
pos += 4;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void ProjectPanel::onWebNavigating(wxWebViewEvent& evt)
|
||||
{
|
||||
@@ -189,7 +199,7 @@ void ProjectPanel::on_reload(wxCommandEvent& evt)
|
||||
j["model"]["name"] = wxGetApp().url_encode(model_name);
|
||||
j["model"]["author"] = wxGetApp().url_encode(model_author);;
|
||||
j["model"]["cover_img"] = wxGetApp().url_encode(cover_file);
|
||||
j["model"]["description"] = wxGetApp().url_encode(description);
|
||||
j["model"]["description"] = wxGetApp().url_encode(convert_newlines_to_br(description));
|
||||
j["model"]["preview_img"] = files["Model Pictures"];
|
||||
j["model"]["upload_type"] = update_type;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user