mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-06-03 02:22:46 +00:00
Merge remote-tracking branch 'origin/master' into feature_slice_to_png
This commit is contained in:
@@ -433,6 +433,7 @@ std::vector<int> GLVolumeCollection::load_object(
|
||||
v.extruder_id = extruder_id;
|
||||
}
|
||||
v.is_modifier = model_volume->modifier;
|
||||
v.outside_printer_detection_enabled = !model_volume->modifier;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -663,7 +664,7 @@ bool GLVolumeCollection::check_outside_state(const DynamicPrintConfig* config)
|
||||
bool contained = true;
|
||||
for (GLVolume* volume : this->volumes)
|
||||
{
|
||||
if (volume != nullptr)
|
||||
if ((volume != nullptr) && !volume->is_modifier)
|
||||
{
|
||||
bool state = print_volume.contains(volume->transformed_bounding_box());
|
||||
contained &= state;
|
||||
@@ -1753,11 +1754,26 @@ bool _3DScene::init(wxGLCanvas* canvas)
|
||||
return s_canvas_mgr.init(canvas);
|
||||
}
|
||||
|
||||
bool _3DScene::set_current(wxGLCanvas* canvas, bool force)
|
||||
{
|
||||
return s_canvas_mgr.set_current(canvas, force);
|
||||
}
|
||||
|
||||
void _3DScene::reset_current_canvas()
|
||||
{
|
||||
s_canvas_mgr.set_current(nullptr, false);
|
||||
}
|
||||
|
||||
void _3DScene::set_active(wxGLCanvas* canvas, bool active)
|
||||
{
|
||||
s_canvas_mgr.set_active(canvas, active);
|
||||
}
|
||||
|
||||
void _3DScene::set_as_dirty(wxGLCanvas* canvas)
|
||||
{
|
||||
s_canvas_mgr.set_as_dirty(canvas);
|
||||
}
|
||||
|
||||
unsigned int _3DScene::get_volumes_count(wxGLCanvas* canvas)
|
||||
{
|
||||
return s_canvas_mgr.get_volumes_count(canvas);
|
||||
|
||||
@@ -516,7 +516,11 @@ public:
|
||||
|
||||
static bool init(wxGLCanvas* canvas);
|
||||
|
||||
static bool set_current(wxGLCanvas* canvas, bool force);
|
||||
static void reset_current_canvas();
|
||||
|
||||
static void set_active(wxGLCanvas* canvas, bool active);
|
||||
static void set_as_dirty(wxGLCanvas* canvas);
|
||||
|
||||
static unsigned int get_volumes_count(wxGLCanvas* canvas);
|
||||
static void reset_volumes(wxGLCanvas* canvas);
|
||||
|
||||
@@ -12,10 +12,20 @@ namespace Slic3r { namespace GUI {
|
||||
|
||||
wxString double_to_string(double const value)
|
||||
{
|
||||
int precision = 10 * value - int(10 * value) == 0 ? 1 : 2;
|
||||
return value - int(value) == 0 ?
|
||||
wxString::Format(_T("%i"), int(value)) :
|
||||
wxNumberFormatter::ToString(value, precision, wxNumberFormatter::Style_None);
|
||||
if (value - int(value) == 0)
|
||||
return wxString::Format(_T("%i"), int(value));
|
||||
else {
|
||||
int precision = 4;
|
||||
for (size_t p = 1; p < 4; p++)
|
||||
{
|
||||
double cur_val = pow(10, p)*value;
|
||||
if (cur_val - int(cur_val) == 0) {
|
||||
precision = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return wxNumberFormatter::ToString(value, precision, wxNumberFormatter::Style_None);
|
||||
}
|
||||
}
|
||||
|
||||
void Field::PostInitialize(){
|
||||
|
||||
@@ -405,16 +405,27 @@ GLCanvas3D::Bed::EType GLCanvas3D::Bed::_detect_type() const
|
||||
const PresetBundle* bundle = get_preset_bundle();
|
||||
if (bundle != nullptr)
|
||||
{
|
||||
const Preset& curr = bundle->printers.get_selected_preset();
|
||||
if (curr.config.has("bed_shape") && _are_equal(m_shape, dynamic_cast<const ConfigOptionPoints*>(curr.config.option("bed_shape"))->values))
|
||||
const Preset* curr = &bundle->printers.get_selected_preset();
|
||||
while (curr != nullptr)
|
||||
{
|
||||
if ((curr.vendor != nullptr) && (curr.vendor->name == "Prusa Research"))
|
||||
if (curr->config.has("bed_shape") && _are_equal(m_shape, dynamic_cast<const ConfigOptionPoints*>(curr->config.option("bed_shape"))->values))
|
||||
{
|
||||
if (boost::contains(curr.name, "MK2"))
|
||||
type = MK2;
|
||||
else if (boost::contains(curr.name, "MK3"))
|
||||
type = MK3;
|
||||
if ((curr->vendor != nullptr) && (curr->vendor->name == "Prusa Research"))
|
||||
{
|
||||
if (boost::contains(curr->name, "MK2"))
|
||||
{
|
||||
type = MK2;
|
||||
break;
|
||||
}
|
||||
else if (boost::contains(curr->name, "MK3"))
|
||||
{
|
||||
type = MK3;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
curr = bundle->printers.get_preset_parent(*curr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1509,13 +1520,10 @@ bool GLCanvas3D::init(bool useVBOs, bool use_legacy_opengl)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GLCanvas3D::set_current()
|
||||
bool GLCanvas3D::set_current(bool force)
|
||||
{
|
||||
if ((m_canvas != nullptr) && (m_context != nullptr))
|
||||
{
|
||||
m_canvas->SetCurrent(*m_context);
|
||||
return true;
|
||||
}
|
||||
if ((force || m_active) && (m_canvas != nullptr) && (m_context != nullptr))
|
||||
return m_canvas->SetCurrent(*m_context);
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -1525,6 +1533,11 @@ void GLCanvas3D::set_active(bool active)
|
||||
m_active = active;
|
||||
}
|
||||
|
||||
void GLCanvas3D::set_as_dirty()
|
||||
{
|
||||
m_dirty = true;
|
||||
}
|
||||
|
||||
unsigned int GLCanvas3D::get_volumes_count() const
|
||||
{
|
||||
return (unsigned int)m_volumes.volumes.size();
|
||||
@@ -1532,8 +1545,13 @@ unsigned int GLCanvas3D::get_volumes_count() const
|
||||
|
||||
void GLCanvas3D::reset_volumes()
|
||||
{
|
||||
if (set_current())
|
||||
|
||||
if (!m_volumes.empty())
|
||||
{
|
||||
// ensures this canvas is current
|
||||
if ((m_canvas == nullptr) || !_3DScene::set_current(m_canvas, true))
|
||||
return;
|
||||
|
||||
m_volumes.release_geometry();
|
||||
m_volumes.clear();
|
||||
m_dirty = true;
|
||||
@@ -1831,8 +1849,8 @@ void GLCanvas3D::render()
|
||||
if (!_is_shown_on_screen())
|
||||
return;
|
||||
|
||||
// ensures that the proper context is selected and that this canvas is initialized
|
||||
if (!set_current() || !_3DScene::init(m_canvas))
|
||||
// ensures this canvas is current and initialized
|
||||
if (!_3DScene::set_current(m_canvas, false) || !_3DScene::init(m_canvas))
|
||||
return;
|
||||
|
||||
if (m_force_zoom_to_bed_enabled)
|
||||
@@ -1913,6 +1931,11 @@ void GLCanvas3D::reload_scene(bool force)
|
||||
return;
|
||||
|
||||
reset_volumes();
|
||||
|
||||
// ensures this canvas is current
|
||||
if (!_3DScene::set_current(m_canvas, true))
|
||||
return;
|
||||
|
||||
set_bed_shape(dynamic_cast<const ConfigOptionPoints*>(m_config->option("bed_shape"))->values);
|
||||
|
||||
if (!m_canvas->IsShown() && !force)
|
||||
@@ -1984,6 +2007,10 @@ void GLCanvas3D::reload_scene(bool force)
|
||||
|
||||
void GLCanvas3D::load_print_toolpaths()
|
||||
{
|
||||
// ensures this canvas is current
|
||||
if (!_3DScene::set_current(m_canvas, true))
|
||||
return;
|
||||
|
||||
if (m_print == nullptr)
|
||||
return;
|
||||
|
||||
@@ -2348,8 +2375,8 @@ void GLCanvas3D::load_gcode_preview(const GCodePreviewData& preview_data, const
|
||||
{
|
||||
if ((m_canvas != nullptr) && (m_print != nullptr))
|
||||
{
|
||||
// ensures that the proper context is selected
|
||||
if (!set_current())
|
||||
// ensures that this canvas is current
|
||||
if (!_3DScene::set_current(m_canvas, false))
|
||||
return;
|
||||
|
||||
if (m_volumes.empty())
|
||||
@@ -2666,7 +2693,11 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
||||
#endif
|
||||
}
|
||||
else if (evt.LeftDClick() && (m_hover_volume_id != -1))
|
||||
{
|
||||
m_active = false;
|
||||
m_on_double_click_callback.call();
|
||||
m_active = true;
|
||||
}
|
||||
else if (evt.LeftDown() || evt.RightDown())
|
||||
{
|
||||
// If user pressed left or right button we first check whether this happened
|
||||
@@ -2762,7 +2793,11 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
|
||||
{
|
||||
// if right clicking on volume, propagate event through callback
|
||||
if (m_volumes.volumes[volume_idx]->hover)
|
||||
{
|
||||
m_active = false;
|
||||
m_on_right_click_callback.call(pos.x, pos.y);
|
||||
m_active = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2980,10 +3015,11 @@ void GLCanvas3D::_force_zoom_to_bed()
|
||||
|
||||
void GLCanvas3D::_resize(unsigned int w, unsigned int h)
|
||||
{
|
||||
if (m_context == nullptr)
|
||||
if ((m_canvas == nullptr) && (m_context == nullptr))
|
||||
return;
|
||||
|
||||
set_current();
|
||||
// ensures that this canvas is current
|
||||
_3DScene::set_current(m_canvas, false);
|
||||
::glViewport(0, 0, w, h);
|
||||
|
||||
::glMatrixMode(GL_PROJECTION);
|
||||
@@ -3569,9 +3605,11 @@ void GLCanvas3D::_perform_layer_editing_action(wxMouseEvent* evt)
|
||||
|
||||
Pointf3 GLCanvas3D::_mouse_to_3d(const Point& mouse_pos, float* z)
|
||||
{
|
||||
if (!set_current())
|
||||
if (m_canvas == nullptr)
|
||||
return Pointf3(DBL_MAX, DBL_MAX, DBL_MAX);
|
||||
|
||||
_camera_tranform();
|
||||
|
||||
GLint viewport[4];
|
||||
::glGetIntegerv(GL_VIEWPORT, viewport);
|
||||
GLdouble modelview_matrix[16];
|
||||
|
||||
@@ -449,9 +449,10 @@ public:
|
||||
|
||||
bool init(bool useVBOs, bool use_legacy_opengl);
|
||||
|
||||
bool set_current();
|
||||
bool set_current(bool force);
|
||||
|
||||
void set_active(bool active);
|
||||
void set_as_dirty();
|
||||
|
||||
unsigned int get_volumes_count() const;
|
||||
void reset_volumes();
|
||||
|
||||
@@ -115,6 +115,7 @@ std::string GLCanvas3DManager::GLInfo::to_string(bool format_as_html, bool exten
|
||||
|
||||
GLCanvas3DManager::GLCanvas3DManager()
|
||||
: m_context(nullptr)
|
||||
, m_current(nullptr)
|
||||
, m_gl_initialized(false)
|
||||
, m_use_legacy_opengl(false)
|
||||
, m_use_VBOs(false)
|
||||
@@ -212,6 +213,34 @@ bool GLCanvas3DManager::init(wxGLCanvas* canvas)
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GLCanvas3DManager::set_current(wxGLCanvas* canvas, bool force)
|
||||
{
|
||||
// given canvas is already current, return
|
||||
if (m_current == canvas)
|
||||
return true;
|
||||
|
||||
if (canvas == nullptr)
|
||||
{
|
||||
m_current = nullptr;
|
||||
return true;
|
||||
}
|
||||
|
||||
// set given canvas as current
|
||||
CanvasesMap::iterator it = _get_canvas(canvas);
|
||||
if (it != m_canvases.end())
|
||||
{
|
||||
bool res = it->second->set_current(force);
|
||||
if (res)
|
||||
{
|
||||
m_current = canvas;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
m_current = nullptr;
|
||||
return false;
|
||||
}
|
||||
|
||||
void GLCanvas3DManager::set_active(wxGLCanvas* canvas, bool active)
|
||||
{
|
||||
CanvasesMap::iterator it = _get_canvas(canvas);
|
||||
@@ -219,6 +248,13 @@ void GLCanvas3DManager::set_active(wxGLCanvas* canvas, bool active)
|
||||
it->second->set_active(active);
|
||||
}
|
||||
|
||||
void GLCanvas3DManager::set_as_dirty(wxGLCanvas* canvas)
|
||||
{
|
||||
CanvasesMap::iterator it = _get_canvas(canvas);
|
||||
if (it != m_canvases.end())
|
||||
it->second->set_as_dirty();
|
||||
}
|
||||
|
||||
unsigned int GLCanvas3DManager::get_volumes_count(wxGLCanvas* canvas) const
|
||||
{
|
||||
CanvasesMap::const_iterator it = _get_canvas(canvas);
|
||||
|
||||
@@ -45,6 +45,7 @@ class GLCanvas3DManager
|
||||
|
||||
wxGLContext* m_context;
|
||||
CanvasesMap m_canvases;
|
||||
wxGLCanvas* m_current;
|
||||
GLInfo m_gl_info;
|
||||
bool m_gl_initialized;
|
||||
bool m_use_legacy_opengl;
|
||||
@@ -69,7 +70,9 @@ public:
|
||||
|
||||
bool init(wxGLCanvas* canvas);
|
||||
|
||||
bool set_current(wxGLCanvas* canvas, bool force);
|
||||
void set_active(wxGLCanvas* canvas, bool active);
|
||||
void set_as_dirty(wxGLCanvas* canvas);
|
||||
|
||||
unsigned int get_volumes_count(wxGLCanvas* canvas) const;
|
||||
void reset_volumes(wxGLCanvas* canvas);
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
|
||||
#include <wx/image.h>
|
||||
|
||||
#include <boost/filesystem.hpp>
|
||||
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
||||
@@ -27,6 +29,9 @@ bool GLTexture::load_from_file(const std::string& filename, bool generate_mipmap
|
||||
{
|
||||
reset();
|
||||
|
||||
if (!boost::filesystem::exists(filename))
|
||||
return false;
|
||||
|
||||
// Load a PNG with an alpha channel.
|
||||
wxImage image;
|
||||
if (!image.LoadFile(filename, wxBITMAP_TYPE_PNG))
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
|
||||
#include "../Utils/PresetUpdater.hpp"
|
||||
#include "../Config/Snapshot.hpp"
|
||||
#include "3DScene.hpp"
|
||||
|
||||
|
||||
namespace Slic3r { namespace GUI {
|
||||
@@ -378,6 +379,7 @@ void add_config_menu(wxMenuBar *menu, int event_preferences_changed, int event_l
|
||||
save_language();
|
||||
show_info(g_wxTabPanel, _(L("Application will be restarted")), _(L("Attention!")));
|
||||
if (event_language_change > 0) {
|
||||
_3DScene::remove_all_canvases();// remove all canvas before recreate GUI
|
||||
wxCommandEvent event(event_language_change);
|
||||
g_wxApp->ProcessEvent(event);
|
||||
}
|
||||
|
||||
@@ -28,6 +28,8 @@ struct MsgDialog : wxDialog
|
||||
MsgDialog &operator=(const MsgDialog &) = delete;
|
||||
virtual ~MsgDialog();
|
||||
|
||||
// TODO: refactor with CreateStdDialogButtonSizer usage
|
||||
|
||||
protected:
|
||||
enum {
|
||||
CONTENT_WIDTH = 500,
|
||||
|
||||
@@ -2619,14 +2619,24 @@ void SavePresetWindow::accept()
|
||||
if (!m_chosen_name.empty()) {
|
||||
const char* unusable_symbols = "<>:/\\|?*\"";
|
||||
bool is_unusable_symbol = false;
|
||||
bool is_unusable_postfix = false;
|
||||
const std::string unusable_postfix = "(modified)";
|
||||
for (size_t i = 0; i < std::strlen(unusable_symbols); i++){
|
||||
if (m_chosen_name.find_first_of(unusable_symbols[i]) != std::string::npos){
|
||||
is_unusable_symbol = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (m_chosen_name.find(unusable_postfix) != std::string::npos)
|
||||
is_unusable_postfix = true;
|
||||
|
||||
if (is_unusable_symbol) {
|
||||
show_error(this, _(L("The supplied name is not valid; the following characters are not allowed:"))+" <>:/\\|?*\"");
|
||||
show_error(this,_(L("The supplied name is not valid;")) + "\n" +
|
||||
_(L("the following characters are not allowed:")) + " <>:/\\|?*\"");
|
||||
}
|
||||
else if (is_unusable_postfix){
|
||||
show_error(this, _(L("The supplied name is not valid;")) + "\n" +
|
||||
_(L("the following postfix are not allowed:")) + "\n\t" + unusable_postfix);
|
||||
}
|
||||
else if (m_chosen_name.compare("- default -") == 0) {
|
||||
show_error(this, _(L("The supplied name is not available.")));
|
||||
|
||||
Reference in New Issue
Block a user