Compare commits

...
Author SHA1 Message Date
Hanif Koh 8b7779708b Remove the Unreachable MakerWorld Publish Dialog 2026-10-04 20:46:02 +08:00
Kiss Lorand 5efb3bef45 Fix missing slicing progress on the first slice (#16000)
Restore slicing progress after notification reset

Ensure the cleared slicing-progress controller is recreated before its initial state transition, and calculate the Daily Tips size before positioning the popup.
2026-10-04 14:06:23 +03:00
Kris Austin 90ac58d3cd perf: skip the unused curled wall estimate to speed up slicing by up to 9% (#16113)
perf: skip estimating curled walls when nothing reads them

The curled extrusion estimate ran whenever a region had overhang speed on,
which is the default, but only the slowdown for curled perimeters reads the
curled lines it produces, and that slowdown is off by default. The step now
also requires a region with the slowdown on, and clears the curled lines
when it skips the estimate, so none are left from an earlier slice. 
Also fixes stale fan commands due to the stale curled lines on the reused layers.
2026-10-04 09:45:19 +01:00
17 changed files with 94 additions and 548 deletions
-1
View File
@@ -177,7 +177,6 @@ src/slic3r/GUI/PresetHints.cpp
src/slic3r/GUI/ProgressStatusBar.cpp
src/slic3r/GUI/PlateSettingsDialog.cpp
src/slic3r/GUI/PrivacyUpdateDialog.cpp
src/slic3r/GUI/PublishDialog.cpp
src/slic3r/GUI/PublishSettingsDialog.cpp
src/slic3r/GUI/SavePresetDialog.cpp
src/slic3r/GUI/SceneBenchmark.cpp
-4
View File
@@ -1,4 +0,0 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.97222 3H4C2.89543 3 2 3.89543 2 5V14C2 15.1046 2.89543 16 4 16H14.4444C15.549 16 16.4444 15.1046 16.4444 14V5C16.4444 3.89543 15.549 3 14.4444 3H12.8333" stroke="white" stroke-linecap="round"/>
<path d="M9.93711 2.64645C9.74185 2.45118 9.42527 2.45118 9.23 2.64645L6.04802 5.82843C5.85276 6.02369 5.85276 6.34027 6.04802 6.53553C6.24329 6.7308 6.55987 6.7308 6.75513 6.53553L9.58356 3.70711L12.412 6.53553C12.6072 6.7308 12.9238 6.7308 13.1191 6.53553C13.3144 6.34027 13.3144 6.02369 13.1191 5.82843L9.93711 2.64645ZM9.08356 11.3056C9.08356 11.5817 9.30741 11.8056 9.58356 11.8056C9.8597 11.8056 10.0836 11.5817 10.0836 11.3056H9.08356ZM9.08356 3V11.3056H10.0836V3H9.08356Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 805 B

@@ -1,10 +0,0 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1_12)">
<path d="M18 0H0V18H18V0Z" fill="#262E2F"/>
</g>
<defs>
<clipPath id="clip0_1_12">
<rect width="18" height="18" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 283 B

-5
View File
@@ -4414,11 +4414,6 @@ struct PrecomputedLayer
};
} // namespace
template<typename BoolsOption> static bool any_enabled(const BoolsOption &option)
{
return std::any_of(option.values.begin(), option.values.end(), [](unsigned char enabled) { return enabled != 0; });
}
// Whether process_layer() prepares the overhang estimator for `layer`.
template<typename OverhangSpeed>
static bool prepares_overhang_estimator(const Layer &layer, bool overhang_fan, OverhangSpeed overhang_speed)
+6
View File
@@ -789,6 +789,12 @@ class StaticPrintConfig;
// Minimum object distance for arrangement, based on printer technology.
double min_object_distance(const ConfigBase &cfg);
// Whether any value is set, a nil value included.
template<bool NULLABLE> bool any_enabled(const ConfigOptionBoolsTempl<NULLABLE> &option)
{
return std::any_of(option.values.begin(), option.values.end(), [](unsigned char enabled) { return enabled != 0; });
}
// One (extruder type x nozzle volume type) parameter variant a filament prints through, plus a
// representative physical extruder observed using it. Ordering (and set-dedup identity) covers
// the variant pair only, so the same variant reached through two extruders keeps one config slot.
+10 -4
View File
@@ -1025,10 +1025,13 @@ void PrintObject::generate_support_material()
void PrintObject::estimate_curled_extrusions()
{
if (this->set_started(posEstimateCurledExtrusions)) {
if ( std::any_of(this->print()->m_print_regions.begin(), this->print()->m_print_regions.end(), [](const PrintRegion* region) {
const auto& cfg = region->config().enable_overhang_speed.values;
return std::any_of(cfg.begin(), cfg.end(), [](const unsigned char v) { return (bool) v; });
})) {
const auto any_region_enables = [this](ConfigOptionBoolsNullable PrintRegionConfig::*option) {
return std::any_of(this->print()->m_print_regions.begin(), this->print()->m_print_regions.end(),
[option](const PrintRegion* region) { return any_enabled(region->config().*option); });
};
// Only the slowdown for curled perimeters reads the curled lines, and they stay empty unless some region has overhang speed on.
if (any_region_enables(&PrintRegionConfig::enable_overhang_speed) &&
any_region_enables(&PrintRegionConfig::slowdown_for_curled_perimeters)) {
// Estimate curling of support material and add it to the malformaition lines of each layer
float support_flow_width = support_material_flow(this, this->config().layer_height).width();
@@ -1038,6 +1041,9 @@ void PrintObject::estimate_curled_extrusions()
float(this->config().brim_width.getFloat())};
SupportSpotsGenerator::estimate_malformations(this->layers(), params);
m_print->throw_if_canceled();
} else {
for (Layer *layer : m_layers)
layer->curled_lines.clear();
}
//this->set_done(posEstimateCurledExtrusions);
}
-2
View File
@@ -483,8 +483,6 @@ set(SLIC3R_GUI_SOURCES
GUI/ProjectDirtyStateManager.cpp
GUI/ProjectDirtyStateManager.hpp
GUI/Project.hpp
GUI/PublishDialog.cpp
GUI/PublishDialog.hpp
GUI/PublishSettingsDialog.cpp
GUI/PublishSettingsDialog.hpp
GUI/PurgeModeDialog.cpp
-32
View File
@@ -46,7 +46,6 @@ enum CUSTOM_ID
ID_TOP_DROPDOWN_MENU,
ID_TITLE,
ID_MODEL_STORE,
ID_PUBLISH,
ID_CALIB,
ID_TOOL_BAR = 3200,
ID_AMS_NOTEBOOK,
@@ -339,10 +338,6 @@ void BBLTopbar::Init(wxFrame* parent)
this->AddSpacer(FromDIP(25));
//this->AddStretchSpacer(1);
//m_publish_bitmap = create_scaled_bitmap("topbar_publish", nullptr, TOPBAR_ICON_SIZE);
//m_publish_item = this->AddTool(ID_PUBLISH, "", m_publish_bitmap);
//m_publish_disable_bitmap = create_scaled_bitmap("topbar_publish_disable", nullptr, TOPBAR_ICON_SIZE);
//m_publish_item->SetDisabledBitmap(m_publish_disable_bitmap);
//this->EnableTool(m_publish_item->GetId(), false);
//this->AddSpacer(FromDIP(4));
@@ -403,7 +398,6 @@ void BBLTopbar::Init(wxFrame* parent)
this->Bind(wxEVT_AUITOOLBAR_TOOL_DROPDOWN, &BBLTopbar::OnRedo, this, wxID_REDO);
this->Bind(wxEVT_AUITOOLBAR_TOOL_DROPDOWN, &BBLTopbar::OnUndo, this, wxID_UNDO);
//this->Bind(wxEVT_AUITOOLBAR_TOOL_DROPDOWN, &BBLTopbar::OnModelStoreClicked, this, ID_MODEL_STORE);
//this->Bind(wxEVT_AUITOOLBAR_TOOL_DROPDOWN, &BBLTopbar::OnPublishClicked, this, ID_PUBLISH);
}
BBLTopbar::~BBLTopbar()
@@ -420,12 +414,6 @@ void BBLTopbar::OnOpenProject(wxAuiToolBarEvent& event)
plater->load_project();
}
//void BBLTopbar::show_publish_button(bool show)
//{
// this->EnableTool(m_publish_item->GetId(), show);
// Refresh();
//}
void BBLTopbar::OnSaveProject(wxAuiToolBarEvent& event)
{
MainFrame* main_frame = dynamic_cast<MainFrame*>(m_frame);
@@ -482,22 +470,6 @@ void BBLTopbar::OnModelStoreClicked(wxAuiToolBarEvent& event)
//GUI::wxGetApp().load_url(wxString(wxGetApp().app_config->get_web_host_url() + MODEL_STORE_URL));
}
void BBLTopbar::OnPublishClicked(wxAuiToolBarEvent& event)
{
if (!wxGetApp().getAgent()) {
BOOST_LOG_TRIVIAL(info) << "publish: no agent";
return;
}
//no more check
//if (GUI::wxGetApp().plater()->model().objects.empty()) return;
#ifdef ENABLE_PUBLISHING
wxGetApp().plater()->show_publish_dialog();
#endif
wxGetApp().open_publish_page_dialog();
}
void BBLTopbar::SetFileMenu(wxMenu* file_menu)
{
m_file_menu = file_menu;
@@ -579,10 +551,6 @@ void BBLTopbar::Rescale() {
if (m_title_ctrl)
m_title_ctrl->SetTitle(m_titleText);
/*item = this->FindTool(ID_PUBLISH);
item->SetBitmap(create_scaled_bitmap("topbar_publish", this, TOPBAR_ICON_SIZE));
item->SetDisabledBitmap(create_scaled_bitmap("topbar_publish_disable", nullptr, TOPBAR_ICON_SIZE));*/
/*item = this->FindTool(ID_MODEL_STORE);
item->SetBitmap(create_scaled_bitmap("topbar_store", this, TOPBAR_ICON_SIZE));
*/
-5
View File
@@ -52,12 +52,10 @@ public:
void OnMouseCaptureLost(wxMouseCaptureLostEvent& event);
void OnMenuClose(wxMenuEvent& event);
void OnOpenProject(wxAuiToolBarEvent& event);
//void show_publish_button(bool show);
void OnSaveProject(wxAuiToolBarEvent& event);
void OnUndo(wxAuiToolBarEvent& event);
void OnRedo(wxAuiToolBarEvent& event);
void OnModelStoreClicked(wxAuiToolBarEvent& event);
void OnPublishClicked(wxAuiToolBarEvent &event);
wxAuiToolBarItem* FindToolByCurrentPosition();
@@ -97,14 +95,11 @@ private:
wxString m_titleText;
//wxAuiToolBarItem *m_publish_item;
wxAuiToolBarItem* m_undo_item;
wxAuiToolBarItem* m_redo_item;
wxAuiToolBarItem* m_calib_item;
wxAuiToolBarItem* maximize_btn;
wxBitmap m_publish_bitmap;
wxBitmap m_publish_disable_bitmap;
wxBitmap maximize_bitmap;
wxBitmap window_bitmap;
+4 -3
View File
@@ -276,8 +276,9 @@ void DailyTipsPanel::set_position(const ImVec2& pos)
void DailyTipsPanel::set_size(const ImVec2& size)
{
m_width = size.x;
m_height = size.y;
m_content_height = m_height - m_footer_height;
//Orca: Keep the requested content height so expanding a collapsed panel restores its full size.
m_content_height = size.y - m_footer_height;
m_height = m_can_expand && !m_is_expanded ? m_footer_height : size.y;
}
void DailyTipsPanel::set_can_expand(bool can_expand)
@@ -647,4 +648,4 @@ void DailyTipsWindow::on_change_color_mode(bool is_dark)
m_panel->on_change_color_mode(is_dark);
}
}}
}}
+14 -7
View File
@@ -2880,17 +2880,24 @@ void NotificationManager::update_slicing_notif_dailytips(bool need_change)
// Slicing progress notification was not found - init it thru plater so correct cancel callback function is appended
wxGetApp().plater()->init_notification_manager();
}
// Orca: Ensures the slicing-progress controller exists before applying the first slicing transition.
void NotificationManager::set_slicing_progress_began()
{
for (std::unique_ptr<PopNotification> & notification : m_pop_notifications) {
if (notification->get_type() == NotificationType::SlicingProgress) {
SlicingProgressNotification* spn = dynamic_cast<SlicingProgressNotification*>(notification.get());
spn->set_progress_state(SlicingProgressNotification::SlicingProgressState::SP_BEGAN);
return;
auto find_slicing_progress = [this]() -> SlicingProgressNotification* {
for (std::unique_ptr<PopNotification>& notification : m_pop_notifications) {
if (notification->get_type() == NotificationType::SlicingProgress)
return dynamic_cast<SlicingProgressNotification*>(notification.get());
}
return nullptr;
};
SlicingProgressNotification* notification = find_slicing_progress();
if (notification == nullptr) {
wxGetApp().plater()->init_notification_manager();
notification = find_slicing_progress();
}
// Slicing progress notification was not found - init it thru plater so correct cancel callback function is appended
wxGetApp().plater()->init_notification_manager();
if (notification != nullptr)
notification->set_progress_state(SlicingProgressNotification::SlicingProgressState::SP_BEGAN);
}
void NotificationManager::set_slicing_progress_percentage(const std::string& text, float percentage)
{
+1 -117
View File
@@ -226,7 +226,6 @@
#include "SelectMachine.hpp"
#include "SendMultiMachinePage.hpp"
#include "SendToPrinter.hpp"
#include "PublishDialog.hpp"
#include "ConfigWizard.hpp"
#include "SyncAmsInfoDialog.hpp"
#include "../Utils/ASCIIFolding.hpp"
@@ -331,7 +330,6 @@ wxDEFINE_EVENT(EVT_EXPORT_BEGAN, wxCommandEvent);
wxDEFINE_EVENT(EVT_EXPORT_FINISHED, wxCommandEvent);
wxDEFINE_EVENT(EVT_IMPORT_MODEL_ID, wxCommandEvent);
wxDEFINE_EVENT(EVT_DOWNLOAD_PROJECT, wxCommandEvent);
wxDEFINE_EVENT(EVT_PUBLISH, wxCommandEvent);
wxDEFINE_EVENT(EVT_OPEN_PLATESETTINGSDIALOG, wxCommandEvent);
wxDEFINE_EVENT(EVT_OPEN_FILAMENT_MAP_SETTINGS_DIALOG, wxCommandEvent);
// BBS: backup & restore
@@ -339,7 +337,6 @@ wxDEFINE_EVENT(EVT_RESTORE_PROJECT, wxCommandEvent);
wxDEFINE_EVENT(EVT_PRINT_FINISHED, wxCommandEvent);
wxDEFINE_EVENT(EVT_SEND_CALIBRATION_FINISHED, wxCommandEvent);
wxDEFINE_EVENT(EVT_SEND_FINISHED, wxCommandEvent);
wxDEFINE_EVENT(EVT_PUBLISH_FINISHED, wxCommandEvent);
//BBS: repair model
wxDEFINE_EVENT(EVT_REPAIR_MODEL, wxCommandEvent);
wxDEFINE_EVENT(EVT_FILAMENT_COLOR_CHANGED, wxCommandEvent);
@@ -7146,7 +7143,6 @@ struct Plater::priv
SelectMachineDialog* m_select_machine_dlg = nullptr;
SendMultiMachinePage* m_send_multi_dlg = nullptr;
SendToPrinterDialog* m_send_to_sdcard_dlg = nullptr;
PublishDialog *m_publish_dlg = nullptr;
// Session-level stash of the last published selection. Written on publish and on
// loading a published 3MF; read when the Publish dialog is opened.
@@ -7200,7 +7196,6 @@ struct Plater::priv
std::string m_broken_shown_sig;
bool auto_reslice_pending {false};
bool auto_reslice_after_cancel {false};
bool m_is_publishing {false};
int m_is_RightClickInLeftUI{-1};
int m_cur_slice_plate;
//BBS: m_slice_all in .gcode.3mf file case, set true when slice all
@@ -7604,7 +7599,6 @@ struct Plater::priv
void on_action_open_project(SimpleEvent&);
void on_action_slice_plate(SimpleEvent&);
void on_action_slice_all(SimpleEvent&);
void on_action_publish(wxCommandEvent &evt);
void on_action_print_plate(SimpleEvent&);
void open_machine_select_dialog(int plate_idx, PrintFromType print_type = PrintFromType::FROM_NORMAL);
void on_action_print_all(SimpleEvent&);
@@ -7622,8 +7616,6 @@ struct Plater::priv
void on_3dcanvas_mouse_dragging_finished(SimpleEvent&);
//void show_action_buttons(const bool is_ready_to_slice) const;
bool show_publish_dlg(bool show = true);
void update_publish_dialog_status(wxString &msg, int percent = -1);
void on_action_print_plate_from_sdcard(SimpleEvent&);
void on_tab_selection_changing(wxBookCtrlEvent&);
@@ -7873,7 +7865,6 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
background_process.set_export_began_event(EVT_EXPORT_BEGAN);
background_process.set_export_finished_event(EVT_EXPORT_FINISHED);
this->q->Bind(EVT_SLICING_UPDATE, &priv::on_slicing_update, this);
this->q->Bind(EVT_PUBLISH, &priv::on_action_publish, this);
this->q->Bind(EVT_REPAIR_MODEL, &priv::on_repair_model, this);
this->q->Bind(EVT_FILAMENT_COLOR_CHANGED, &priv::on_filament_color_changed, this);
this->q->Bind(EVT_INSTALL_PLUGIN_NETWORKING, &priv::install_network_plugin, this);
@@ -8226,7 +8217,6 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
q->Bind(EVT_PRINT_FINISHED, [q](wxCommandEvent& evt) { q->print_job_finished(evt); });
q->Bind(EVT_SEND_CALIBRATION_FINISHED, [q](wxCommandEvent& evt) { q->send_calibration_job_finished(evt); });
q->Bind(EVT_SEND_FINISHED, [q](wxCommandEvent& evt) { q->send_job_finished(evt); });
q->Bind(EVT_PUBLISH_FINISHED, [q](wxCommandEvent& evt) { q->publish_job_finished(evt);});
q->Bind(EVT_OPEN_PLATESETTINGSDIALOG, [q](wxCommandEvent& evt) { q->open_platesettings_dialog(evt);});
q->Bind(EVT_OPEN_FILAMENT_MAP_SETTINGS_DIALOG, [q](wxCommandEvent &evt) { q->open_filament_map_setting_dialog(evt); });
//q->Bind(EVT_GLVIEWTOOLBAR_ASSEMBLE, [q](SimpleEvent&) { q->select_view_3D("Assemble"); });
@@ -13361,11 +13351,6 @@ void Plater::priv::on_process_completed(SlicingProcessCompletedEvent &evt)
show_action_buttons(true);*/
ready_to_slice = true;
//this->main_frame->update_slice_print_status(MainFrame::eEventSliceUpdate, true, true);
//BBS
if (m_is_publishing) {
m_publish_dlg->cancel();
}
} else {
if((ready_to_slice) || (wxGetApp().get_mode() == comSimple)) {
//this means the current plate is not the slicing plate
@@ -13407,15 +13392,6 @@ void Plater::priv::on_process_completed(SlicingProcessCompletedEvent &evt)
exporting_status = ExportingStatus::NOT_EXPORTING;
// BBS stop publishing if error occur
//if (m_is_publishing) {
// GCodeProcessorResult *gcode_result = background_process.get_current_gcode_result();
// m_publish_dlg->UpdateStatus(_L("Error occurred during slicing"), -1, false);
// // if toolpath is outside
// if (!gcode_result || gcode_result->toolpath_outside) {
// m_is_publishing = false;
// }
//}
if (is_finished)
@@ -13424,16 +13400,6 @@ void Plater::priv::on_process_completed(SlicingProcessCompletedEvent &evt)
m_is_slicing = false;
this->preview->reload_print(false);
q->mark_plate_toolbar_image_dirty();
/* BBS if in publishing progress */
if (m_is_publishing) {
if (m_publish_dlg && !m_publish_dlg->was_cancelled()) {
if (m_publish_dlg->IsShown()) {
q->publish_project();
} else {
m_is_publishing = false;
}
}
}
q->SetDropTarget(new PlaterDropTarget(*main_frame, *q));
}
else
@@ -13452,13 +13418,6 @@ void Plater::priv::on_process_completed(SlicingProcessCompletedEvent &evt)
//not the last plate
update_fff_scene_only_shells();
q->Thaw();
if (m_is_publishing) {
if (m_publish_dlg && !m_publish_dlg->was_cancelled()) {
wxString msg = wxString::Format(_L("Slicing Plate %d"), m_cur_slice_plate + 1);
int percent = 70 * m_cur_slice_plate / partplate_list.get_plate_count();
m_publish_dlg->UpdateStatus(msg, percent, false);
}
}
}
if (auto_reslice_after_cancel) {
auto_reslice_after_cancel = false;
@@ -13540,40 +13499,12 @@ void Plater::priv::on_action_slice_all(SimpleEvent&)
//select plate
q->select_plate(m_cur_slice_plate);
q->reslice();
if (!m_is_publishing)
q->select_view_3D("Preview");
q->select_view_3D("Preview");
//BBS: wish to select all plates stats item
preview->get_canvas3d()->_update_select_plate_toolbar_stats_item(true);
}
}
void Plater::priv::on_action_publish(wxCommandEvent &event)
{
if (q != nullptr) {
if (event.GetInt() == EVT_PUBLISHING_START) {
// update by background slicing process
if (process_completed_with_error >= 0) {
wxString msg = _L("Please resolve the slicing errors and publish again.");
this->m_publish_dlg->UpdateStatus(msg, false);
return;
}
m_is_publishing = true;
// if slicing is ready publish project, else slicing first
if (partplate_list.is_all_slice_results_valid()) {
q->publish_project();
} else {
BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << ":received slice project in background event\n";
SimpleEvent evt = SimpleEvent(EVT_GLTOOLBAR_SLICE_ALL);
this->on_action_slice_all(evt);
}
} else {
m_is_publishing = false;
show_publish_dlg(false);
}
}
}
void Plater::priv::on_action_print_plate(SimpleEvent&)
{
if (q != nullptr) {
@@ -14349,11 +14280,6 @@ int Plater::get_send_finished_event()
return EVT_SEND_FINISHED;
}
int Plater::get_publish_finished_event()
{
return EVT_PUBLISH_FINISHED;
}
void Plater::priv::set_current_canvas_as_dirty()
{
if (current_panel == view3D)
@@ -14762,31 +14688,6 @@ bool Plater::priv::can_reload_from_disk() const
return !paths.empty();
}
void Plater::priv::update_publish_dialog_status(wxString &msg, int percent)
{
if (m_publish_dlg)
m_publish_dlg->UpdateStatus(msg, percent);
}
bool Plater::priv::show_publish_dlg(bool show)
{
if (q != nullptr) { BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << ":recevied publish event\n"; }
if (!m_publish_dlg) m_publish_dlg = new PublishDialog(q);
if (show) {
m_publish_dlg->reset();
m_publish_dlg->start_slicing();
//m_publish_dlg->Show();
m_publish_dlg->ShowModal();
} else {
m_publish_dlg->EndModal(wxID_OK);
//cancel the slicing
if (this->background_process.running())
this->background_process.stop();
}
return true;
}
//BBS: add bed exclude area
void Plater::priv::set_bed_shape(const Pointfs &shape,
const Pointfs &exclude_areas,
@@ -19915,11 +19816,6 @@ int Plater::export_3mf(const boost::filesystem::path& output_path, SaveStrategy
return ret;
}
void Plater::publish_project()
{
return;
}
void Plater::reload_from_disk()
{
@@ -20562,13 +20458,6 @@ void Plater::send_job_finished(wxCommandEvent& evt)
// curr_monitor->get_tabpanel()->ChangeSelection(MonitorPanel::PrinterTab::PT_STATUS);
}
void Plater::publish_job_finished(wxCommandEvent &evt)
{
p->m_publish_dlg->EndModal(wxID_OK);
// GUI::wxGetApp().load_url(evt.GetString());
//GUI::wxGetApp().open_publish_page_dialog(evt.GetString());
}
// Called when the Eject button is pressed.
void Plater::eject_drive()
{
@@ -22866,11 +22755,6 @@ void Plater::show_object_info()
notify_manager->bbl_show_objectsinfo_notification(info_text, non_manifold_edges > 0, !(p->current_panel == p->view3D));
}
bool Plater::show_publish_dialog(bool show)
{
return p->show_publish_dlg(show);
}
void Plater::post_process_string_object_exception(StringObjectException &err)
{
PresetBundle* preset_bundle = wxGetApp().preset_bundle;
-8
View File
@@ -116,12 +116,8 @@ enum class ActionButtonType : int;
// (Sidebar::priv::m_menu_filament_id) rather than an explicit index.
inline constexpr int kSidebarContextMenuFilamentId = -2;
#define EVT_PUBLISHING_START 1
#define EVT_PUBLISHING_STOP 2
//BBS: add EVT_SLICING_UPDATE declare here
wxDECLARE_EVENT(EVT_SLICING_UPDATE, Slic3r::SlicingStatusEvent);
wxDECLARE_EVENT(EVT_PUBLISH, wxCommandEvent);
wxDECLARE_EVENT(EVT_OPEN_PLATESETTINGSDIALOG, wxCommandEvent);
// Explanation of int param
@@ -571,7 +567,6 @@ public:
int export_3mf(const boost::filesystem::path& output_path = boost::filesystem::path(), SaveStrategy strategy = SaveStrategy::Default, int export_plate_idx = -1, Export3mfProgressFn proFn = nullptr);
//BBS
void publish_project();
void reload_from_disk();
void replace_with_stl();
@@ -606,7 +601,6 @@ public:
void send_calibration_job_finished(wxCommandEvent &evt);
void print_job_finished(wxCommandEvent &evt);
void send_job_finished(wxCommandEvent& evt);
void publish_job_finished(wxCommandEvent& evt);
void open_platesettings_dialog(wxCommandEvent& evt);
void open_filament_map_setting_dialog(wxCommandEvent &evt);
void on_change_color_mode(SimpleEvent& evt);
@@ -717,7 +711,6 @@ public:
int get_send_calibration_finished_event();
int get_print_finished_event();
int get_send_finished_event();
int get_publish_finished_event();
void set_current_canvas_as_dirty();
void unbind_canvas_event_handlers();
@@ -842,7 +835,6 @@ public:
//BBS: show object info
void show_object_info();
//BBS
bool show_publish_dialog(bool show = true);
//BBS: post process string object exception strings by warning types
void post_process_string_object_exception(StringObjectException &err);
void update_objects_position_when_select_preset(const std::function<void()> &select_prest);
-270
View File
@@ -1,270 +0,0 @@
#include "PublishDialog.hpp"
#include "GUI_App.hpp"
#include <wx/colour.h>
#include <wx/string.h>
#include "slic3r/GUI/Widgets/AMSItem.hpp"
#include "slic3r/GUI/GUI_Utils.hpp"
#include <wx/intl.h>
#include <wx/gdicmn.h>
#include <wx/toplevel.h>
#include <wx/panel.h>
#include "slic3r/GUI/Widgets/Label.hpp"
#include "slic3r/GUI/Widgets/ProgressBar.hpp"
#include "slic3r/GUI/Widgets/Button.hpp"
#include "slic3r/GUI/Widgets/StateColor.hpp"
#include <utility>
#include <wx/event.h>
#include "slic3r/GUI/Plater.hpp"
#include <wx/wx.h>
#include <wx/sizer.h>
#include <wx/statbox.h>
#include "wx/evtloop.h"
#include "libslic3r/Model.hpp"
#include "libslic3r/Polygon.hpp"
#include "MainFrame.hpp"
#include "GUI_App.hpp"
static const wxColour TEXT_LIGHT_GRAY = wxColour(107, 107, 107);
namespace Slic3r {
namespace GUI {
static wxString PUBLISH_STEP_STRING[STEP_COUNT] = {
_L("Slice all plates to obtain time and filament estimation"),
_L("Packing project data into 3MF file"),
_L("Uploading 3MF"),
_L("Jump to model publish web page")
};
static wxString NOTE_STRING = _L("Note: The preparation may take several minutes. Please be patient.");
PublishDialog::PublishDialog(Plater *plater)
: DPIDialog(static_cast<wxWindow *>(wxGetApp().mainframe), wxID_ANY, _L("Publish"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX)
, m_plater(plater)
{
this->SetSize(wxSize(FromDIP(540),FromDIP(400)));
this->SetSizeHints(wxDefaultSize, wxDefaultSize);
wxBoxSizer *top_sizer = new wxBoxSizer(wxHORIZONTAL);
wxBoxSizer *m_main_sizer = new wxBoxSizer(wxVERTICAL);
m_main_sizer->Add(0, FromDIP(30), 0, wxEXPAND, 0);
m_step_panel = new wxPanel(this, wxID_ANY);
wxBoxSizer *step_sizer = create_publish_step_sizer();
m_step_panel->SetSizer(step_sizer);
m_step_panel->SetBackgroundColour(wxColour(248, 248, 248));
m_main_sizer->Add(m_step_panel, 1, wxEXPAND, 0);
m_main_sizer->Add(0, FromDIP(20), 0, wxEXPAND, 0);
m_text_note = new wxStaticText(this, wxID_ANY, NOTE_STRING, wxDefaultPosition, wxDefaultSize, 0);
m_text_note->SetFont(Label::Body_14);
m_text_note->SetForegroundColour(TEXT_LIGHT_GRAY);
m_text_note->Wrap(-1);
m_main_sizer->Add(m_text_note, 0, wxALL | wxEXPAND, 0);
m_main_sizer->Add(0, FromDIP(10), 0, wxEXPAND, 0);
wxStaticLine *m_staticline = new wxStaticLine(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL);
m_main_sizer->Add(m_staticline, 0, wxALL | wxEXPAND, FromDIP(0));
m_main_sizer->Add(0, FromDIP(10), 0, wxEXPAND, 0);
wxBoxSizer *m_progress_text_sizer = new wxBoxSizer(wxHORIZONTAL);
m_text_progress = new wxStaticText(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, 0);
m_text_progress->Wrap(-1);
m_text_progress->SetFont(Label::Body_12);
m_text_progress->SetForegroundColour(TEXT_LIGHT_GRAY);
m_progress_text_sizer->Add(FromDIP(20), 0, 0, wxEXPAND | wxALL, 0);
m_progress_text_sizer->Add(m_text_progress, 1, wxALL | wxEXPAND, 0);
m_main_sizer->Add(m_progress_text_sizer, 0, wxALL | wxEXPAND, 0);
wxBoxSizer *m_progress_sizer = new wxBoxSizer(wxHORIZONTAL);
m_progress_sizer->Add(FromDIP(20), 0, 0, wxEXPAND | wxALL, 0);
m_progress = new ProgressBar(this, wxID_ANY, 100, wxDefaultPosition, wxDefaultSize);
m_progress->SetHeight(FromDIP(8));
m_progress->SetFont(Label::Head_10);
m_progress_sizer->Add(m_progress, 1, wxALIGN_CENTER_VERTICAL | wxALL, 0);
m_progress_sizer->Add(FromDIP(20), 0, 0, wxEXPAND, 0);
m_btn_cancel = new Button(this, _L("Cancel"));
m_progress_sizer->Add(m_btn_cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, FromDIP(5));
StateColor btn_bg_green(std::pair<wxColour, int>(wxColour(0, 137, 123), StateColor::Pressed),
std::pair<wxColour, int>(wxColour(38, 166, 154), StateColor::Hovered),
std::pair<wxColour, int>(wxColour(255, 255, 255), StateColor::Normal));
StateColor text_color(std::pair<wxColour, int>(wxColour(255, 255, 255), StateColor::Pressed),
std::pair<wxColour, int>(wxColour(255, 255, 255), StateColor::Hovered),
std::pair<wxColour, int>(TEXT_LIGHT_GRAY, StateColor::Normal));
m_btn_cancel->SetFont(Label::Body_12);
m_btn_cancel->SetBackgroundColor(btn_bg_green);
m_btn_cancel->SetBorderColor(wxColour(0, 150, 136));
m_btn_cancel->SetTextColor(text_color);
m_btn_cancel->SetSize(wxSize(FromDIP(60), FromDIP(20)));
m_btn_cancel->SetMinSize(wxSize(FromDIP(60), FromDIP(20)));
m_btn_cancel->SetCornerRadius(FromDIP(10));
m_progress_sizer->Add(FromDIP(20), 0, 0, wxEXPAND | wxALL, 0);
m_main_sizer->Add(m_progress_sizer, 0, wxEXPAND, FromDIP(0));
wxBoxSizer *m_bottom_sizer;
m_bottom_sizer = new wxBoxSizer(wxHORIZONTAL);
m_bottom_sizer->Add(FromDIP(20), 0, 0, wxEXPAND, 0);
m_text_errors = new wxStaticText(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, 0);
m_text_errors->Wrap(-1);
m_text_errors->SetFont(Label::Body_12);
m_text_errors->SetForegroundColour(wxColour(255, 111, 0));
m_bottom_sizer->Add(m_text_errors, 1, wxALL, 0);
m_main_sizer->Add(m_bottom_sizer, 0, wxEXPAND, 0);
m_main_sizer->Add(0, FromDIP(10), 0, wxEXPAND, 0);
top_sizer->Add(FromDIP(30), 0, 0, wxEXPAND, 0);
top_sizer->Add(m_main_sizer, 1, wxALL | wxEXPAND, 0);
top_sizer->Add(FromDIP(30), 0, 0, wxEXPAND, 0);
this->SetSizerAndFit(top_sizer);
this->Layout();
this->Centre(wxBOTH);
m_btn_cancel->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) {
this->cancel();
});
Bind(wxEVT_CLOSE_WINDOW, &PublishDialog::on_close, this);
wxGetApp().UpdateDlgDarkUI(this);
}
void PublishDialog::cancel()
{
m_was_cancelled = true;
m_btn_cancel->Enable(false);
m_text_progress->SetLabelText(_L("Publish was canceled"));
wxCloseEvent evt;
this->on_close(evt);
}
void PublishDialog::start_slicing()
{
SetPublishStep(PublishStep::STEP_SLICING);
wxCommandEvent *evt = new wxCommandEvent(EVT_PUBLISH);
evt->SetInt(EVT_PUBLISHING_START);
wxQueueEvent(m_plater, evt);
}
bool PublishDialog::UpdateStatus(wxString &msg, int percent, bool yield)
{
if (m_was_cancelled) return false;
if (percent >= 0)
m_progress->SetValue(percent);
m_text_progress->SetLabelText(msg);
if (yield)
wxEventLoopBase::GetActive()->YieldFor(wxEVT_CATEGORY_UI | wxEVT_CATEGORY_USER_INPUT);
return true;
}
void PublishDialog::Pulse(wxString &msg, bool &skip)
{
if (!msg.IsEmpty())
m_text_progress->SetLabelText(msg);
wxEventLoopBase::GetActive()->YieldFor(wxEVT_CATEGORY_UI | wxEVT_CATEGORY_USER_INPUT);
skip = m_was_cancelled;
}
void PublishDialog::SetPublishStep(PublishStep step, bool yield, int percent)
{
m_publish_steps->SelectItem((int)step);
if (step == PublishStep::STEP_SLICING) {
m_text_progress->SetLabelText(_L("Slicing Plate 1"));
if (percent > 0)
m_progress->SetValue(percent);
else
m_progress->SetValue(0);
} else if (step == PublishStep::STEP_PACKING) {
m_text_progress->SetLabelText(_L("Packing data to 3MF"));
if (percent > 0)
m_progress->SetValue(percent);
else
m_progress->SetValue(70);
} else if (step == PublishStep::STEP_UPLOADING) {
m_text_progress->SetLabelText(_L("Uploading data"));
if (percent > 0)
m_progress->SetValue(percent);
else
m_progress->SetValue(85);
} else if (step == PublishStep::STEP_FILL_INFO) {
m_text_progress->SetLabelText(_L("Jump to webpage"));
m_progress->SetValue(100);
}
if (yield)
wxEventLoopBase::GetActive()->YieldFor(wxEVT_CATEGORY_UI | wxEVT_CATEGORY_USER_INPUT);
}
wxBoxSizer *PublishDialog::create_publish_step_sizer()
{
auto sizer = new wxBoxSizer(wxHORIZONTAL);
sizer->Add(FromDIP(30), 0, 0, wxEXPAND, 0);
auto middle_sizer = new wxBoxSizer(wxVERTICAL);
m_publish_steps = new StepIndicator(m_step_panel, wxID_ANY);
StateColor bg_color(std::pair<wxColour, int>(wxColour(248, 248, 248), StateColor::Normal));
m_publish_steps->SetBackgroundColor(bg_color);
m_publish_steps->SetFont(Label::Body_14);
for (int i = 0; i < (int) PublishStep::STEP_PUBLISH_COUNT; i++) {
m_publish_steps->AppendItem(PUBLISH_STEP_STRING[i]);
}
middle_sizer->Add(0, FromDIP(30), 0, wxEXPAND, 0);
middle_sizer->Add(m_publish_steps, 1, wxALL | wxEXPAND, 0);
middle_sizer->Add(0, FromDIP(30), 0, wxEXPAND, 0);
sizer->Add(middle_sizer, 1, wxALL | wxEXPAND, 0);
sizer->Add(FromDIP(30), 0, 0, wxEXPAND, 0);
return sizer;
}
void PublishDialog::on_dpi_changed(const wxRect &suggested_rect)
{
Fit();
Refresh();
}
void PublishDialog::on_close(wxCloseEvent &event)
{
wxCommandEvent *evt = new wxCommandEvent(EVT_PUBLISH);
evt->SetInt(EVT_PUBLISHING_STOP);
wxQueueEvent(m_plater, evt);
}
void PublishDialog::reset()
{
m_btn_cancel->Enable();
m_was_cancelled = false;
SetPublishStep(PublishStep::STEP_SLICING);
m_text_errors->Hide();
}
} // GUI
} // Slic3r
-75
View File
@@ -1,75 +0,0 @@
#ifndef slic3r_PublishDialog_hpp_
#define slic3r_PublishDialog_hpp_
#include "I18N.hpp"
#include "slic3r/GUI/GUI_Utils.hpp"
#include <wx/event.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/panel.h>
#include <wx/gdicmn.h>
#include <wx/settings.h>
#include <wx/string.h>
#include <wx/sizer.h>
#include <wx/stattext.h>
#include <wx/gauge.h>
#include <wx/button.h>
#include <wx/bitmap.h>
#include <wx/image.h>
#include <wx/icon.h>
#include <wx/dialog.h>
#include "wxExtensions.hpp"
#include "Plater.hpp"
#include "Widgets/StepCtrl.hpp"
#include "Widgets/ProgressDialog.hpp"
#include "Widgets/Button.hpp"
#include "Widgets/ProgressBar.hpp"
namespace Slic3r {
namespace GUI {
enum PublishStep {
STEP_SLICING = 0,
STEP_PACKING,
STEP_UPLOADING,
STEP_FILL_INFO,
STEP_PUBLISH_COUNT,
};
class PublishDialog : public DPIDialog
{
public:
PublishDialog(Plater* plater = nullptr);
bool UpdateStatus(wxString &msg, int percent = -1, bool yeild = true);
void Pulse(wxString &msg, bool &skip);
void SetPublishStep(PublishStep step, bool yeild = false, int percent = -1);
void start_slicing();
void reset();
bool was_cancelled() { return m_was_cancelled; }
void cancel();
protected:
wxPanel* m_step_panel;
::StepIndicator *m_publish_steps;
wxStaticText *m_text_note;
wxStaticText *m_text_progress;
ProgressBar *m_progress;
Button* m_btn_cancel;
wxStaticText *m_text_errors;
Plater * m_plater{nullptr};
bool m_was_cancelled { false };
wxBoxSizer* create_publish_step_sizer();
void on_close(wxCloseEvent &event);
void on_dpi_changed(const wxRect &suggested_rect) override;
};
} // GUI
} // Slic3r
#endif /* slic3r_BedShapeDialog_hpp_ */
@@ -239,12 +239,15 @@ void NotificationManager::SlicingProgressNotification::render(GLCanvas3D& canvas
const float gcodeviewer_height = wxGetApp().plater()->get_preview_canvas3D()->get_gcode_viewer().get_legend_height();
//const float dailytips_panel_height = std::min(380.0f * scale, std::max(90.0f, (cnv_size.get_height() - gcodeviewer_height - progress_panel_height - dailytips_child_window_padding.y - initial_y - m_line_height * 4)));
const float dailytips_panel_height = 125.0f * scale;
const ImVec2 dailytips_size = ImVec2(dailytips_panel_width, dailytips_panel_height);
//Orca: Update the child's effective height before positioning this parent window.
m_dailytips_panel->set_size(dailytips_size);
float right_gap = right_margin + (move_from_overlay ? overlay_width + m_line_height * 5 : 0);
m_window_pos = ImVec2((float)cnv_size.get_width() - right_gap - m_window_width, (float)cnv_size.get_height() - m_top_y);
imgui.set_next_window_pos(m_window_pos.x, m_window_pos.y, ImGuiCond_Always, 0.0f, 0.0f);
m_window_height = progress_panel_height + m_dailytips_panel->get_size().y + progress_child_window_padding.y + dailytips_child_window_padding.y + bottom_padding.y;
m_top_y = initial_y + m_window_height;
m_window_pos = ImVec2((float)cnv_size.get_width() - right_gap - m_window_width, (float)cnv_size.get_height() - m_top_y);
imgui.set_next_window_pos(m_window_pos.x, m_window_pos.y, ImGuiCond_Always, 0.0f, 0.0f);
ImGui::SetNextWindowSizeConstraints(ImVec2(m_window_width, m_window_height), ImVec2(m_window_width, m_window_height));
// name of window indentifies window - has to be unique string
@@ -307,9 +310,7 @@ void NotificationManager::SlicingProgressNotification::render(GLCanvas3D& canvas
child_name = "##DailyTipsPanel" + std::to_string(parent_window->ID);
ImVec2 dailytips_pos = ImGui::GetCursorScreenPos() + dailytips_child_window_padding;
ImVec2 dailytips_size = ImVec2(dailytips_panel_width, dailytips_panel_height);
m_dailytips_panel->set_position(dailytips_pos);
m_dailytips_panel->set_size(dailytips_size);
m_dailytips_panel->set_fade_opacity(m_current_fade_opacity);
ImGui::SetNextWindowPos(dailytips_pos);
if (ImGui::BeginChild(child_name.c_str(), ImVec2(dailytips_panel_width, dailytips_panel_height), false, child_window_flags)) {
@@ -504,4 +505,4 @@ void NotificationManager::SlicingProgressNotification::render_progress_close_but
}
}
}}
}}
@@ -566,6 +566,12 @@ struct SlicedCage
using Walls = std::vector<std::vector<ProcessedPoint>>;
bool has_curled_lines(const PrintObject &object)
{
const auto layers = object.layers();
return std::any_of(layers.begin(), layers.end(), [](const Layer *layer) { return !layer->curled_lines.empty(); });
}
// Estimates every wall of `layer` against whatever layer `estimator` was last prepared with before it.
Walls estimate_walls(ExtrusionQualityEstimator &estimator, const PrintObject *object, const Layer &layer)
{
@@ -707,6 +713,53 @@ TEST_CASE("Precomputed overhang data has the curled-line tree exactly when a reg
CHECK((precomputed.front().lower_curled_lines != nullptr) == slowdown);
}
TEST_CASE("Curled walls are estimated only when overhang speed and the slowdown for curled perimeters are both on", "[ExtrusionProcessor]")
{
const auto [overhang_speed, slowdown, estimated] = GENERATE(table<bool, bool, bool>({
{true, true, true},
{true, false, false},
{false, true, false},
}));
DynamicPrintConfig config = caged_overhang_config("classic");
config.set_deserialize_strict({{"enable_overhang_speed", overhang_speed ? "1" : "0"},
{"slowdown_for_curled_perimeters", slowdown ? "1" : "0"}});
const SlicedCage cage(config);
CHECK(has_curled_lines(*cage.object) == estimated);
}
TEST_CASE("Curled walls are estimated when overhang speed and the slowdown for curled perimeters are on in different objects", "[ExtrusionProcessor]")
{
const std::vector<std::vector<ConfigBase::SetDeserializeItem>> overrides{
{{"enable_overhang_speed", "1"}, {"slowdown_for_curled_perimeters", "0"}},
{{"enable_overhang_speed", "0"}, {"slowdown_for_curled_perimeters", "1"}},
};
Print print;
Model model;
init_print(std::vector<TriangleMesh>{caged_overhang_mesh(), caged_overhang_mesh()}, print, model, caged_overhang_config("classic"),
&overrides);
print.process();
REQUIRE(print.objects().size() == 2);
for (const PrintObject *object : print.objects())
CHECK(has_curled_lines(*object));
}
TEST_CASE("Curled walls from an earlier slice are dropped once overhang speed is off", "[ExtrusionProcessor]")
{
DynamicPrintConfig config = caged_overhang_config("classic");
config.set_deserialize_strict("slowdown_for_curled_perimeters", "1");
SlicedCage cage(config);
const Layer *first_layer = cage.print.objects().front()->layers().front();
REQUIRE(has_curled_lines(*cage.print.objects().front()));
config.set_deserialize_strict("enable_overhang_speed", "0");
cage.print.apply(cage.model, config);
cage.print.process();
REQUIRE(cage.print.objects().front()->layers().front() == first_layer);
CHECK_FALSE(has_curled_lines(*cage.print.objects().front()));
}
TEST_CASE("Caged external overhangs are slowed when printed by object or through the pressure equalizer", "[ExtrusionProcessor]")
{
const auto [key, value] = GENERATE(table<const char *, const char *>({