Cleaning up and fixing localization issues with AppController.

This commit is contained in:
tamasmeszaros 2018-09-07 10:24:05 +02:00
parent ae2b4dd01c
commit ec3e1403b6
7 changed files with 72 additions and 313 deletions

View File

@ -267,11 +267,10 @@ add_library(libslic3r_gui STATIC
${LIBDIR}/slic3r/Utils/Time.hpp ${LIBDIR}/slic3r/Utils/Time.hpp
${LIBDIR}/slic3r/Utils/HexFile.cpp ${LIBDIR}/slic3r/Utils/HexFile.cpp
${LIBDIR}/slic3r/Utils/HexFile.hpp ${LIBDIR}/slic3r/Utils/HexFile.hpp
${LIBDIR}/slic3r/IProgressIndicator.hpp ${LIBDIR}/slic3r/ProgressIndicator.hpp
${LIBDIR}/slic3r/AppController.hpp ${LIBDIR}/slic3r/AppController.hpp
${LIBDIR}/slic3r/AppController.cpp ${LIBDIR}/slic3r/AppController.cpp
${LIBDIR}/slic3r/AppControllerWx.cpp ${LIBDIR}/slic3r/AppControllerWx.cpp
${LIBDIR}/slic3r/Strings.hpp
) )
add_library(admesh STATIC add_library(admesh STATIC

View File

@ -43,15 +43,6 @@ namespace GUI {
PresetBundle* get_preset_bundle(); PresetBundle* get_preset_bundle();
} }
static const PrintObjectStep STEP_SLICE = posSlice;
static const PrintObjectStep STEP_PERIMETERS = posPerimeters;
static const PrintObjectStep STEP_PREPARE_INFILL = posPrepareInfill;
static const PrintObjectStep STEP_INFILL = posInfill;
static const PrintObjectStep STEP_SUPPORTMATERIAL = posSupportMaterial;
static const PrintStep STEP_SKIRT = psSkirt;
static const PrintStep STEP_BRIM = psBrim;
static const PrintStep STEP_WIPE_TOWER = psWipeTower;
AppControllerBoilerplate::ProgresIndicatorPtr AppControllerBoilerplate::ProgresIndicatorPtr
AppControllerBoilerplate::global_progress_indicator() { AppControllerBoilerplate::global_progress_indicator() {
ProgresIndicatorPtr ret; ProgresIndicatorPtr ret;
@ -71,193 +62,8 @@ void AppControllerBoilerplate::global_progress_indicator(
pri_data_->m.unlock(); pri_data_->m.unlock();
} }
void PrintController::make_skirt() void ProgressIndicator::message_fmt(
{ const std::string &fmtstr, ...) {
assert(print_ != nullptr);
// prerequisites
for(auto obj : print_->objects) make_perimeters(obj);
for(auto obj : print_->objects) infill(obj);
for(auto obj : print_->objects) gen_support_material(obj);
if(!print_->state.is_done(STEP_SKIRT)) {
print_->state.set_started(STEP_SKIRT);
print_->skirt.clear();
if(print_->has_skirt()) print_->_make_skirt();
print_->state.set_done(STEP_SKIRT);
}
}
void PrintController::make_brim()
{
assert(print_ != nullptr);
// prerequisites
for(auto obj : print_->objects) make_perimeters(obj);
for(auto obj : print_->objects) infill(obj);
for(auto obj : print_->objects) gen_support_material(obj);
make_skirt();
if(!print_->state.is_done(STEP_BRIM)) {
print_->state.set_started(STEP_BRIM);
// since this method must be idempotent, we clear brim paths *before*
// checking whether we need to generate them
print_->brim.clear();
if(print_->config.brim_width > 0) print_->_make_brim();
print_->state.set_done(STEP_BRIM);
}
}
void PrintController::make_wipe_tower()
{
assert(print_ != nullptr);
// prerequisites
for(auto obj : print_->objects) make_perimeters(obj);
for(auto obj : print_->objects) infill(obj);
for(auto obj : print_->objects) gen_support_material(obj);
make_skirt();
make_brim();
if(!print_->state.is_done(STEP_WIPE_TOWER)) {
print_->state.set_started(STEP_WIPE_TOWER);
// since this method must be idempotent, we clear brim paths *before*
// checking whether we need to generate them
print_->brim.clear();
if(print_->has_wipe_tower()) print_->_make_wipe_tower();
print_->state.set_done(STEP_WIPE_TOWER);
}
}
void PrintController::slice(PrintObject *pobj)
{
assert(pobj != nullptr && print_ != nullptr);
if(pobj->state.is_done(STEP_SLICE)) return;
pobj->state.set_started(STEP_SLICE);
pobj->_slice();
auto msg = pobj->_fix_slicing_errors();
if(!msg.empty()) report_issue(IssueType::WARN, msg);
// simplify slices if required
if (print_->config.resolution)
pobj->_simplify_slices(scale_(print_->config.resolution));
if(pobj->layers.empty())
report_issue(IssueType::ERR,
_(L("No layers were detected. You might want to repair your "
"STL file(s) or check their size or thickness and retry"))
);
pobj->state.set_done(STEP_SLICE);
}
void PrintController::make_perimeters(PrintObject *pobj)
{
assert(pobj != nullptr);
slice(pobj);
if (!pobj->state.is_done(STEP_PERIMETERS)) {
pobj->_make_perimeters();
}
}
void PrintController::infill(PrintObject *pobj)
{
assert(pobj != nullptr);
make_perimeters(pobj);
if (!pobj->state.is_done(STEP_PREPARE_INFILL)) {
pobj->state.set_started(STEP_PREPARE_INFILL);
pobj->_prepare_infill();
pobj->state.set_done(STEP_PREPARE_INFILL);
}
pobj->_infill();
}
void PrintController::gen_support_material(PrintObject *pobj)
{
assert(pobj != nullptr);
// prerequisites
slice(pobj);
if(!pobj->state.is_done(STEP_SUPPORTMATERIAL)) {
pobj->state.set_started(STEP_SUPPORTMATERIAL);
pobj->clear_support_layers();
if((pobj->config.support_material || pobj->config.raft_layers > 0)
&& pobj->layers.size() > 1) {
pobj->_generate_support_material();
}
pobj->state.set_done(STEP_SUPPORTMATERIAL);
}
}
void PrintController::slice(AppControllerBoilerplate::ProgresIndicatorPtr pri)
{
auto st = pri->state();
Slic3r::trace(3, "Starting the slicing process.");
pri->update(st+20, _(L("Generating perimeters")));
for(auto obj : print_->objects) make_perimeters(obj);
pri->update(st+60, _(L("Infilling layers")));
for(auto obj : print_->objects) infill(obj);
pri->update(st+70, _(L("Generating support material")));
for(auto obj : print_->objects) gen_support_material(obj);
pri->message_fmt(_(L("Weight: %.1fg, Cost: %.1f")),
print_->total_weight, print_->total_cost);
pri->state(st+85);
pri->update(st+88, _(L("Generating skirt")));
make_skirt();
pri->update(st+90, _(L("Generating brim")));
make_brim();
pri->update(st+95, _(L("Generating wipe tower")));
make_wipe_tower();
pri->update(st+100, _(L("Done")));
// time to make some statistics..
Slic3r::trace(3, _(L("Slicing process finished.")));
}
void PrintController::slice()
{
auto pri = global_progress_indicator();
if(!pri) pri = create_progress_indicator(100, L("Slicing"));
slice(pri);
}
void IProgressIndicator::message_fmt(
const string &fmtstr, ...) {
std::stringstream ss; std::stringstream ss;
va_list args; va_list args;
va_start(args, fmtstr); va_start(args, fmtstr);
@ -288,7 +94,6 @@ const PrintConfig &PrintController::config() const
return print_->config; return print_->config;
} }
void AppController::arrange_model() void AppController::arrange_model()
{ {
auto ftr = std::async( auto ftr = std::async(
@ -322,7 +127,7 @@ void AppController::arrange_model()
for(auto& v : bedpoints) for(auto& v : bedpoints)
bed.append(Point::new_scale(v.x, v.y)); bed.append(Point::new_scale(v.x, v.y));
if(pind) pind->update(0, _(L("Arranging objects..."))); if(pind) pind->update(0, L("Arranging objects..."));
try { try {
arr::BedShapeHint hint; arr::BedShapeHint hint;
@ -336,20 +141,20 @@ void AppController::arrange_model()
false, // create many piles not just one pile false, // create many piles not just one pile
[pind, count](unsigned rem) { [pind, count](unsigned rem) {
if(pind) if(pind)
pind->update(count - rem, _(L("Arranging objects..."))); pind->update(count - rem, L("Arranging objects..."));
}); });
} catch(std::exception& e) { } catch(std::exception& e) {
std::cerr << e.what() << std::endl; std::cerr << e.what() << std::endl;
report_issue(IssueType::ERR, report_issue(IssueType::ERR,
_(L("Could not arrange model objects! " L("Could not arrange model objects! "
"Some geometries may be invalid.")), "Some geometries may be invalid."),
_(L("Exception occurred"))); L("Exception occurred"));
} }
// Restore previous max value // Restore previous max value
if(pind) { if(pind) {
pind->max(pmax); pind->max(pmax);
pind->update(0, _(L("Arranging done."))); pind->update(0, L("Arranging done."));
} }
}); });

View File

@ -7,7 +7,7 @@
#include <atomic> #include <atomic>
#include <iostream> #include <iostream>
#include "IProgressIndicator.hpp" #include "ProgressIndicator.hpp"
namespace Slic3r { namespace Slic3r {
@ -15,7 +15,8 @@ class Model;
class Print; class Print;
class PrintObject; class PrintObject;
class PrintConfig; class PrintConfig;
class ProgressStatusBar;
class DynamicPrintConfig;
/** /**
* @brief A boilerplate class for creating application logic. It should provide * @brief A boilerplate class for creating application logic. It should provide
@ -33,7 +34,7 @@ class AppControllerBoilerplate {
public: public:
/// A Progress indicator object smart pointer /// A Progress indicator object smart pointer
using ProgresIndicatorPtr = std::shared_ptr<IProgressIndicator>; using ProgresIndicatorPtr = std::shared_ptr<ProgressIndicator>;
private: private:
class PriData; // Some structure to store progress indication data class PriData; // Some structure to store progress indication data
@ -46,7 +47,7 @@ public:
AppControllerBoilerplate(); AppControllerBoilerplate();
~AppControllerBoilerplate(); ~AppControllerBoilerplate();
using Path = string; using Path = std::string;
using PathList = std::vector<Path>; using PathList = std::vector<Path>;
/// Common runtime issue types /// Common runtime issue types
@ -67,20 +68,20 @@ public:
* @return Returns a list of paths choosed by the user. * @return Returns a list of paths choosed by the user.
*/ */
PathList query_destination_paths( PathList query_destination_paths(
const string& title, const std::string& title,
const std::string& extensions) const; const std::string& extensions) const;
/** /**
* @brief Same as query_destination_paths but works for directories only. * @brief Same as query_destination_paths but works for directories only.
*/ */
PathList query_destination_dirs( PathList query_destination_dirs(
const string& title) const; const std::string& title) const;
/** /**
* @brief Same as query_destination_paths but returns only one path. * @brief Same as query_destination_paths but returns only one path.
*/ */
Path query_destination_path( Path query_destination_path(
const string& title, const std::string& title,
const std::string& extensions, const std::string& extensions,
const std::string& hint = "") const; const std::string& hint = "") const;
@ -95,11 +96,11 @@ public:
* title. * title.
*/ */
bool report_issue(IssueType issuetype, bool report_issue(IssueType issuetype,
const string& description, const std::string& description,
const string& brief); const std::string& brief);
bool report_issue(IssueType issuetype, bool report_issue(IssueType issuetype,
const string& description); const std::string& description);
/** /**
* @brief Return the global progress indicator for the current controller. * @brief Return the global progress indicator for the current controller.
@ -150,12 +151,12 @@ protected:
*/ */
ProgresIndicatorPtr create_progress_indicator( ProgresIndicatorPtr create_progress_indicator(
unsigned statenum, unsigned statenum,
const string& title, const std::string& title,
const string& firstmsg) const; const std::string& firstmsg) const;
ProgresIndicatorPtr create_progress_indicator( ProgresIndicatorPtr create_progress_indicator(
unsigned statenum, unsigned statenum,
const string& title) const; const std::string& title) const;
// This is a global progress indicator placeholder. In the Slic3r UI it can // This is a global progress indicator placeholder. In the Slic3r UI it can
// contain the progress indicator on the statusbar. // contain the progress indicator on the statusbar.
@ -167,24 +168,6 @@ protected:
*/ */
class PrintController: public AppControllerBoilerplate { class PrintController: public AppControllerBoilerplate {
Print *print_ = nullptr; Print *print_ = nullptr;
protected:
void make_skirt();
void make_brim();
void make_wipe_tower();
void make_perimeters(PrintObject *pobj);
void infill(PrintObject *pobj);
void gen_support_material(PrintObject *pobj);
/**
* @brief Slice one pront object.
* @param pobj The print object.
*/
void slice(PrintObject *pobj);
void slice(ProgresIndicatorPtr pri);
public: public:
// Must be public for perl to use it // Must be public for perl to use it
@ -199,11 +182,6 @@ public:
return PrintController::Ptr( new PrintController(print) ); return PrintController::Ptr( new PrintController(print) );
} }
/**
* @brief Slice the loaded print scene.
*/
void slice();
const PrintConfig& config() const; const PrintConfig& config() const;
}; };
@ -248,7 +226,7 @@ public:
* In perl we have a progress indicating status bar on the bottom of the * In perl we have a progress indicating status bar on the bottom of the
* window which is defined and created in perl. We can pass the ID-s of the * window which is defined and created in perl. We can pass the ID-s of the
* gauge and the statusbar id and make a wrapper implementation of the * gauge and the statusbar id and make a wrapper implementation of the
* IProgressIndicator interface so we can use this GUI widget from C++. * ProgressIndicator interface so we can use this GUI widget from C++.
* *
* This function should be called from perl. * This function should be called from perl.
* *

View File

@ -32,11 +32,11 @@ void AppControllerBoilerplate::process_events()
AppControllerBoilerplate::PathList AppControllerBoilerplate::PathList
AppControllerBoilerplate::query_destination_paths( AppControllerBoilerplate::query_destination_paths(
const string &title, const std::string &title,
const std::string &extensions) const const std::string &extensions) const
{ {
wxFileDialog dlg(wxTheApp->GetTopWindow(), title ); wxFileDialog dlg(wxTheApp->GetTopWindow(), _(title) );
dlg.SetWildcard(extensions); dlg.SetWildcard(extensions);
dlg.ShowModal(); dlg.ShowModal();
@ -52,11 +52,11 @@ AppControllerBoilerplate::query_destination_paths(
AppControllerBoilerplate::Path AppControllerBoilerplate::Path
AppControllerBoilerplate::query_destination_path( AppControllerBoilerplate::query_destination_path(
const string &title, const std::string &title,
const std::string &extensions, const std::string &extensions,
const std::string& hint) const const std::string& hint) const
{ {
wxFileDialog dlg(wxTheApp->GetTopWindow(), title ); wxFileDialog dlg(wxTheApp->GetTopWindow(), _(title) );
dlg.SetWildcard(extensions); dlg.SetWildcard(extensions);
dlg.SetFilename(hint); dlg.SetFilename(hint);
@ -71,8 +71,8 @@ AppControllerBoilerplate::query_destination_path(
} }
bool AppControllerBoilerplate::report_issue(IssueType issuetype, bool AppControllerBoilerplate::report_issue(IssueType issuetype,
const string &description, const std::string &description,
const string &brief) const std::string &brief)
{ {
auto icon = wxICON_INFORMATION; auto icon = wxICON_INFORMATION;
auto style = wxOK|wxCENTRE; auto style = wxOK|wxCENTRE;
@ -84,15 +84,15 @@ bool AppControllerBoilerplate::report_issue(IssueType issuetype,
case IssueType::FATAL: icon = wxICON_ERROR; case IssueType::FATAL: icon = wxICON_ERROR;
} }
auto ret = wxMessageBox(description, brief, icon | style); auto ret = wxMessageBox(_(description), _(brief), icon | style);
return ret != wxCANCEL; return ret != wxCANCEL;
} }
bool AppControllerBoilerplate::report_issue( bool AppControllerBoilerplate::report_issue(
AppControllerBoilerplate::IssueType issuetype, AppControllerBoilerplate::IssueType issuetype,
const string &description) const std::string &description)
{ {
return report_issue(issuetype, description, string()); return report_issue(issuetype, description, std::string());
} }
wxDEFINE_EVENT(PROGRESS_STATUS_UPDATE_EVENT, wxCommandEvent); wxDEFINE_EVENT(PROGRESS_STATUS_UPDATE_EVENT, wxCommandEvent);
@ -104,10 +104,10 @@ namespace {
* the main thread as well. * the main thread as well.
*/ */
class GuiProgressIndicator: class GuiProgressIndicator:
public IProgressIndicator, public wxEvtHandler { public ProgressIndicator, public wxEvtHandler {
wxProgressDialog gauge_; wxProgressDialog gauge_;
using Base = IProgressIndicator; using Base = ProgressIndicator;
wxString message_; wxString message_;
int range_; wxString title_; int range_; wxString title_;
bool is_asynch_ = false; bool is_asynch_ = false;
@ -136,8 +136,8 @@ public:
/// Get the mode of parallel operation. /// Get the mode of parallel operation.
inline bool asynch() const { return is_asynch_; } inline bool asynch() const { return is_asynch_; }
inline GuiProgressIndicator(int range, const string& title, inline GuiProgressIndicator(int range, const wxString& title,
const string& firstmsg) : const wxString& firstmsg) :
gauge_(title, firstmsg, range, wxTheApp->GetTopWindow(), gauge_(title, firstmsg, range, wxTheApp->GetTopWindow(),
wxPD_APP_MODAL | wxPD_AUTO_HIDE), wxPD_APP_MODAL | wxPD_AUTO_HIDE),
message_(firstmsg), message_(firstmsg),
@ -151,11 +151,6 @@ public:
this, id_); this, id_);
} }
virtual void cancel() override {
update(max(), "Abort");
IProgressIndicator::cancel();
}
virtual void state(float val) override { virtual void state(float val) override {
state(static_cast<unsigned>(val)); state(static_cast<unsigned>(val));
} }
@ -170,26 +165,28 @@ public:
} else _state(st); } else _state(st);
} }
virtual void message(const string & msg) override { virtual void message(const std::string & msg) override {
message_ = msg; message_ = _(msg);
} }
virtual void messageFmt(const string& fmt, ...) { virtual void messageFmt(const std::string& fmt, ...) {
va_list arglist; va_list arglist;
va_start(arglist, fmt); va_start(arglist, fmt);
message_ = wxString::Format(wxString(fmt), arglist); message_ = wxString::Format(_(fmt), arglist);
va_end(arglist); va_end(arglist);
} }
virtual void title(const string & title) override { virtual void title(const std::string & title) override {
title_ = title; title_ = _(title);
} }
}; };
} }
AppControllerBoilerplate::ProgresIndicatorPtr AppControllerBoilerplate::ProgresIndicatorPtr
AppControllerBoilerplate::create_progress_indicator( AppControllerBoilerplate::create_progress_indicator(
unsigned statenum, const string& title, const string& firstmsg) const unsigned statenum,
const std::string& title,
const std::string& firstmsg) const
{ {
auto pri = auto pri =
std::make_shared<GuiProgressIndicator>(statenum, title, firstmsg); std::make_shared<GuiProgressIndicator>(statenum, title, firstmsg);
@ -202,20 +199,20 @@ AppControllerBoilerplate::create_progress_indicator(
} }
AppControllerBoilerplate::ProgresIndicatorPtr AppControllerBoilerplate::ProgresIndicatorPtr
AppControllerBoilerplate::create_progress_indicator(unsigned statenum, AppControllerBoilerplate::create_progress_indicator(
const string &title) const unsigned statenum, const std::string &title) const
{ {
return create_progress_indicator(statenum, title, string()); return create_progress_indicator(statenum, title, std::string());
} }
namespace { namespace {
// A wrapper progress indicator class around the statusbar created in perl. // A wrapper progress indicator class around the statusbar created in perl.
class Wrapper: public IProgressIndicator, public wxEvtHandler { class Wrapper: public ProgressIndicator, public wxEvtHandler {
wxGauge *gauge_; wxGauge *gauge_;
wxStatusBar *stbar_; wxStatusBar *stbar_;
using Base = IProgressIndicator; using Base = ProgressIndicator;
std::string message_; wxString message_;
AppControllerBoilerplate& ctl_; AppControllerBoilerplate& ctl_;
void showProgress(bool show = true) { void showProgress(bool show = true) {
@ -223,7 +220,7 @@ class Wrapper: public IProgressIndicator, public wxEvtHandler {
} }
void _state(unsigned st) { void _state(unsigned st) {
if( st <= IProgressIndicator::max() ) { if( st <= ProgressIndicator::max() ) {
Base::state(st); Base::state(st);
if(!gauge_->IsShown()) showProgress(true); if(!gauge_->IsShown()) showProgress(true);
@ -266,7 +263,7 @@ public:
virtual void max(float val) override { virtual void max(float val) override {
if(val > 1.0) { if(val > 1.0) {
gauge_->SetRange(static_cast<int>(val)); gauge_->SetRange(static_cast<int>(val));
IProgressIndicator::max(val); ProgressIndicator::max(val);
} }
} }
@ -280,18 +277,18 @@ public:
} }
} }
virtual void message(const string & msg) override { virtual void message(const std::string & msg) override {
message_ = msg; message_ = _(msg);
} }
virtual void message_fmt(const string& fmt, ...) override { virtual void message_fmt(const std::string& fmt, ...) override {
va_list arglist; va_list arglist;
va_start(arglist, fmt); va_start(arglist, fmt);
message_ = wxString::Format(fmt, arglist); message_ = wxString::Format(_(fmt), arglist);
va_end(arglist); va_end(arglist);
} }
virtual void title(const string & /*title*/) override {} virtual void title(const std::string & /*title*/) override {}
}; };
} }

View File

@ -3,16 +3,15 @@
#include <string> #include <string>
#include <functional> #include <functional>
#include "Strings.hpp"
namespace Slic3r { namespace Slic3r {
/** /**
* @brief Generic progress indication interface. * @brief Generic progress indication interface.
*/ */
class IProgressIndicator { class ProgressIndicator {
public: public:
using CancelFn = std::function<void(void)>; // Cancel functio signature. using CancelFn = std::function<void(void)>; // Cancel function signature.
private: private:
float state_ = .0f, max_ = 1.f, step_; float state_ = .0f, max_ = 1.f, step_;
@ -20,7 +19,7 @@ private:
public: public:
inline virtual ~IProgressIndicator() {} inline virtual ~ProgressIndicator() {}
/// Get the maximum of the progress range. /// Get the maximum of the progress range.
float max() const { return max_; } float max() const { return max_; }
@ -28,14 +27,14 @@ public:
/// Get the current progress state /// Get the current progress state
float state() const { return state_; } float state() const { return state_; }
/// Set the maximum of hte progress range /// Set the maximum of the progress range
virtual void max(float maxval) { max_ = maxval; } virtual void max(float maxval) { max_ = maxval; }
/// Set the current state of the progress. /// Set the current state of the progress.
virtual void state(float val) { state_ = val; } virtual void state(float val) { state_ = val; }
/** /**
* @brief Number of states int the progress. Can be used insted of giving a * @brief Number of states int the progress. Can be used instead of giving a
* maximum value. * maximum value.
*/ */
virtual void states(unsigned statenum) { virtual void states(unsigned statenum) {
@ -43,25 +42,19 @@ public:
} }
/// Message shown on the next status update. /// Message shown on the next status update.
virtual void message(const string&) = 0; virtual void message(const std::string&) = 0;
/// Title of the operaton. /// Title of the operation.
virtual void title(const string&) = 0; virtual void title(const std::string&) = 0;
/// Formatted message for the next status update. Works just like sprinf. /// Formatted message for the next status update. Works just like sprintf.
virtual void message_fmt(const string& fmt, ...); virtual void message_fmt(const std::string& fmt, ...);
/// Set up a cancel callback for the operation if feasible. /// Set up a cancel callback for the operation if feasible.
inline void on_cancel(CancelFn func) { cancelfunc_ = func; } virtual void on_cancel(CancelFn func = CancelFn()) { cancelfunc_ = func; }
/** /// Convenience function to call message and status update in one function.
* Explicitly shut down the progress indicator and call the associated void update(float st, const std::string& msg) {
* callback.
*/
virtual void cancel() { cancelfunc_(); }
/// Convinience function to call message and status update in one function.
void update(float st, const string& msg) {
message(msg); state(st); message(msg); state(st);
} }
}; };

View File

@ -1,10 +0,0 @@
#ifndef STRINGS_HPP
#define STRINGS_HPP
#include "GUI/GUI.hpp"
namespace Slic3r {
using string = wxString;
}
#endif // STRINGS_HPP

View File

@ -8,10 +8,7 @@
%} %}
%name{Slic3r::PrintController} class PrintController { %name{Slic3r::PrintController} class PrintController {
PrintController(Print *print); PrintController(Print *print);
void slice();
}; };
%name{Slic3r::AppController} class AppController { %name{Slic3r::AppController} class AppController {