Merge branch 'master' of https://github.com/prusa3d/Slic3r
This commit is contained in:
commit
213ee6baae
9 changed files with 53 additions and 40 deletions
|
@ -3,7 +3,8 @@
|
||||||
|
|
||||||
# PrusaSlicer
|
# PrusaSlicer
|
||||||
|
|
||||||
Prebuilt Windows, OSX and Linux binaries are available through the [git releases page](https://github.com/prusa3d/PrusaSlicer/releases).
|
You may want to check the [PrusaSlicer project page](https://www.prusa3d.com/prusaslicer/).
|
||||||
|
Prebuilt Windows, OSX and Linux binaries are available through the [git releases page](https://github.com/prusa3d/PrusaSlicer/releases) or from the [Prusa3D downloads page](https://www.prusa3d.com/drivers/).
|
||||||
|
|
||||||
PrusaSlicer takes 3D models (STL, OBJ, AMF) and converts them into G-code
|
PrusaSlicer takes 3D models (STL, OBJ, AMF) and converts them into G-code
|
||||||
instructions for FFF printers or PNG layers for mSLA 3D printers. It's
|
instructions for FFF printers or PNG layers for mSLA 3D printers. It's
|
||||||
|
|
|
@ -434,7 +434,6 @@ void CheckBox::msw_rescale()
|
||||||
field->SetMinSize(wxSize(-1, int(1.5f*field->GetFont().GetPixelSize().y +0.5f)));
|
field->SetMinSize(wxSize(-1, int(1.5f*field->GetFont().GetPixelSize().y +0.5f)));
|
||||||
}
|
}
|
||||||
|
|
||||||
int undef_spin_val = -9999; //! Probably, It's not necessary
|
|
||||||
|
|
||||||
void SpinCtrl::BUILD() {
|
void SpinCtrl::BUILD() {
|
||||||
auto size = wxSize(wxDefaultSize);
|
auto size = wxSize(wxDefaultSize);
|
||||||
|
@ -472,12 +471,14 @@ void SpinCtrl::BUILD() {
|
||||||
temp->SetFont(Slic3r::GUI::wxGetApp().normal_font());
|
temp->SetFont(Slic3r::GUI::wxGetApp().normal_font());
|
||||||
temp->SetBackgroundStyle(wxBG_STYLE_PAINT);
|
temp->SetBackgroundStyle(wxBG_STYLE_PAINT);
|
||||||
|
|
||||||
#ifndef __WXOSX__
|
// XXX: On OS X the wxSpinCtrl widget is made up of two subwidgets, unfortunatelly
|
||||||
// #ys_FIXME_KILL_FOCUS
|
// the kill focus event is not propagated to the encompassing widget,
|
||||||
// wxEVT_KILL_FOCUS doesn't handled on OSX now (wxWidgets 3.1.1)
|
// so we need to bind it on the inner text widget instead. (Ugh.)
|
||||||
// So, we will update values on KILL_FOCUS & SPINCTRL events under MSW and GTK
|
#ifdef __WXOSX__
|
||||||
// and on TEXT event under OSX
|
temp->GetText()->Bind(wxEVT_KILL_FOCUS, ([this](wxEvent& e)
|
||||||
|
#else
|
||||||
temp->Bind(wxEVT_KILL_FOCUS, ([this](wxEvent& e)
|
temp->Bind(wxEVT_KILL_FOCUS, ([this](wxEvent& e)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
e.Skip();
|
e.Skip();
|
||||||
if (bEnterPressed) {
|
if (bEnterPressed) {
|
||||||
|
@ -486,7 +487,7 @@ void SpinCtrl::BUILD() {
|
||||||
}
|
}
|
||||||
|
|
||||||
propagate_value();
|
propagate_value();
|
||||||
}), temp->GetId());
|
}));
|
||||||
|
|
||||||
temp->Bind(wxEVT_SPINCTRL, ([this](wxCommandEvent e) { propagate_value(); }), temp->GetId());
|
temp->Bind(wxEVT_SPINCTRL, ([this](wxCommandEvent e) { propagate_value(); }), temp->GetId());
|
||||||
|
|
||||||
|
@ -496,7 +497,6 @@ void SpinCtrl::BUILD() {
|
||||||
propagate_value();
|
propagate_value();
|
||||||
bEnterPressed = true;
|
bEnterPressed = true;
|
||||||
}), temp->GetId());
|
}), temp->GetId());
|
||||||
#endif
|
|
||||||
|
|
||||||
temp->Bind(wxEVT_TEXT, ([this](wxCommandEvent e)
|
temp->Bind(wxEVT_TEXT, ([this](wxCommandEvent e)
|
||||||
{
|
{
|
||||||
|
@ -504,24 +504,17 @@ void SpinCtrl::BUILD() {
|
||||||
// # when it was changed from the text control, so the on_change callback
|
// # when it was changed from the text control, so the on_change callback
|
||||||
// # gets the old one, and on_kill_focus resets the control to the old value.
|
// # gets the old one, and on_kill_focus resets the control to the old value.
|
||||||
// # As a workaround, we get the new value from $event->GetString and store
|
// # As a workaround, we get the new value from $event->GetString and store
|
||||||
// # here temporarily so that we can return it from $self->get_value
|
// # here temporarily so that we can return it from get_value()
|
||||||
std::string value = e.GetString().utf8_str().data();
|
|
||||||
if (is_matched(value, "^\\-?\\d+$")) {
|
|
||||||
try {
|
|
||||||
tmp_value = std::stoi(value);
|
|
||||||
}
|
|
||||||
catch (const std::exception & /* e */) {
|
|
||||||
tmp_value = -9999;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else tmp_value = -9999;
|
|
||||||
#ifdef __WXOSX__
|
|
||||||
propagate_value();
|
|
||||||
|
|
||||||
|
long value;
|
||||||
|
const bool parsed = e.GetString().ToLong(&value);
|
||||||
|
tmp_value = parsed && value >= INT_MIN && value <= INT_MAX ? (int)value : UNDEF_VALUE;
|
||||||
|
|
||||||
|
#ifdef __WXOSX__
|
||||||
// Forcibly set the input value for SpinControl, since the value
|
// Forcibly set the input value for SpinControl, since the value
|
||||||
// inserted from the clipboard is not updated under OSX
|
// inserted from the keyboard or clipboard is not updated under OSX
|
||||||
if (tmp_value > -9999) {
|
if (tmp_value != UNDEF_VALUE) {
|
||||||
wxSpinCtrl* spin = dynamic_cast<wxSpinCtrl*>(window);
|
wxSpinCtrl* spin = static_cast<wxSpinCtrl*>(window);
|
||||||
spin->SetValue(tmp_value);
|
spin->SetValue(tmp_value);
|
||||||
|
|
||||||
// But in SetValue() is executed m_text_ctrl->SelectAll(), so
|
// But in SetValue() is executed m_text_ctrl->SelectAll(), so
|
||||||
|
@ -539,10 +532,11 @@ void SpinCtrl::BUILD() {
|
||||||
|
|
||||||
void SpinCtrl::propagate_value()
|
void SpinCtrl::propagate_value()
|
||||||
{
|
{
|
||||||
if (tmp_value == -9999)
|
if (tmp_value == UNDEF_VALUE) {
|
||||||
on_kill_focus();
|
on_kill_focus();
|
||||||
else if (boost::any_cast<int>(m_value) != tmp_value)
|
} else {
|
||||||
on_change_field();
|
on_change_field();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpinCtrl::msw_rescale()
|
void SpinCtrl::msw_rescale()
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <cstdint>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <boost/any.hpp>
|
#include <boost/any.hpp>
|
||||||
|
|
||||||
|
@ -331,9 +332,11 @@ public:
|
||||||
|
|
||||||
class SpinCtrl : public Field {
|
class SpinCtrl : public Field {
|
||||||
using Field::Field;
|
using Field::Field;
|
||||||
|
private:
|
||||||
|
static const int UNDEF_VALUE = INT_MIN;
|
||||||
public:
|
public:
|
||||||
SpinCtrl(const ConfigOptionDef& opt, const t_config_option_key& id) : Field(opt, id), tmp_value(-9999) {}
|
SpinCtrl(const ConfigOptionDef& opt, const t_config_option_key& id) : Field(opt, id), tmp_value(UNDEF_VALUE) {}
|
||||||
SpinCtrl(wxWindow* parent, const ConfigOptionDef& opt, const t_config_option_key& id) : Field(parent, opt, id), tmp_value(-9999) {}
|
SpinCtrl(wxWindow* parent, const ConfigOptionDef& opt, const t_config_option_key& id) : Field(parent, opt, id), tmp_value(UNDEF_VALUE) {}
|
||||||
~SpinCtrl() {}
|
~SpinCtrl() {}
|
||||||
|
|
||||||
int tmp_value;
|
int tmp_value;
|
||||||
|
@ -355,9 +358,10 @@ public:
|
||||||
dynamic_cast<wxSpinCtrl*>(window)->SetValue(tmp_value);
|
dynamic_cast<wxSpinCtrl*>(window)->SetValue(tmp_value);
|
||||||
m_disable_change_event = false;
|
m_disable_change_event = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::any& get_value() override {
|
boost::any& get_value() override {
|
||||||
// return boost::any(tmp_value);
|
int value = static_cast<wxSpinCtrl*>(window)->GetValue();
|
||||||
return m_value = tmp_value;
|
return m_value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void msw_rescale() override;
|
void msw_rescale() override;
|
||||||
|
|
|
@ -2292,6 +2292,9 @@ void GLCanvas3D::on_size(wxSizeEvent& evt)
|
||||||
|
|
||||||
void GLCanvas3D::on_idle(wxIdleEvent& evt)
|
void GLCanvas3D::on_idle(wxIdleEvent& evt)
|
||||||
{
|
{
|
||||||
|
if (!m_initialized)
|
||||||
|
return;
|
||||||
|
|
||||||
m_dirty |= m_toolbar.update_items_state();
|
m_dirty |= m_toolbar.update_items_state();
|
||||||
m_dirty |= m_view_toolbar.update_items_state();
|
m_dirty |= m_view_toolbar.update_items_state();
|
||||||
|
|
||||||
|
@ -4022,8 +4025,7 @@ void GLCanvas3D::_render_selection() const
|
||||||
#if ENABLE_RENDER_SELECTION_CENTER
|
#if ENABLE_RENDER_SELECTION_CENTER
|
||||||
void GLCanvas3D::_render_selection_center() const
|
void GLCanvas3D::_render_selection_center() const
|
||||||
{
|
{
|
||||||
if (!m_gizmos.is_running())
|
m_selection.render_center(m_gizmos.is_dragging());
|
||||||
m_selection.render_center();
|
|
||||||
}
|
}
|
||||||
#endif // ENABLE_RENDER_SELECTION_CENTER
|
#endif // ENABLE_RENDER_SELECTION_CENTER
|
||||||
|
|
||||||
|
|
|
@ -297,13 +297,18 @@ void ObjectList::set_tooltip_for_item(const wxPoint& pt)
|
||||||
wxDataViewItem item;
|
wxDataViewItem item;
|
||||||
wxDataViewColumn* col;
|
wxDataViewColumn* col;
|
||||||
HitTest(pt, item, col);
|
HitTest(pt, item, col);
|
||||||
if (!item) return;
|
|
||||||
|
|
||||||
/* GetMainWindow() return window, associated with wxDataViewCtrl.
|
/* GetMainWindow() return window, associated with wxDataViewCtrl.
|
||||||
* And for this window we should to set tooltips.
|
* And for this window we should to set tooltips.
|
||||||
* Just this->SetToolTip(tooltip) => has no effect.
|
* Just this->SetToolTip(tooltip) => has no effect.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
if (!item)
|
||||||
|
{
|
||||||
|
GetMainWindow()->SetToolTip(""); // hide tooltip
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (col->GetTitle() == " " && GetSelectedItemsCount()<2)
|
if (col->GetTitle() == " " && GetSelectedItemsCount()<2)
|
||||||
GetMainWindow()->SetToolTip(_(L("Right button click the icon to change the object settings")));
|
GetMainWindow()->SetToolTip(_(L("Right button click the icon to change the object settings")));
|
||||||
else if (col->GetTitle() == _("Name"))
|
else if (col->GetTitle() == _("Name"))
|
||||||
|
|
|
@ -143,7 +143,9 @@ void MainFrame::update_title()
|
||||||
wxString title = wxEmptyString;
|
wxString title = wxEmptyString;
|
||||||
if (m_plater != nullptr)
|
if (m_plater != nullptr)
|
||||||
{
|
{
|
||||||
wxString project = from_path(into_path(m_plater->get_project_filename()).stem());
|
// m_plater->get_project_filename() produces file name including path, but excluding extension.
|
||||||
|
// Don't try to remove the extension, it would remove part of the file name after the last dot!
|
||||||
|
wxString project = from_path(into_path(m_plater->get_project_filename()).filename());
|
||||||
if (!project.empty())
|
if (!project.empty())
|
||||||
title += (project + " - ");
|
title += (project + " - ");
|
||||||
}
|
}
|
||||||
|
|
|
@ -955,14 +955,14 @@ void Selection::render(float scale_factor) const
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ENABLE_RENDER_SELECTION_CENTER
|
#if ENABLE_RENDER_SELECTION_CENTER
|
||||||
void Selection::render_center() const
|
void Selection::render_center(bool gizmo_is_dragging) const
|
||||||
{
|
{
|
||||||
if (!m_valid || is_empty() || (m_quadric == nullptr))
|
if (!m_valid || is_empty() || (m_quadric == nullptr))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const Vec3d& center = get_bounding_box().center();
|
Vec3d center = gizmo_is_dragging ? m_cache.dragging_center : get_bounding_box().center();
|
||||||
|
|
||||||
glsafe(::glDisable(GL_DEPTH_TEST)));
|
glsafe(::glDisable(GL_DEPTH_TEST));
|
||||||
|
|
||||||
glsafe(::glEnable(GL_LIGHTING));
|
glsafe(::glEnable(GL_LIGHTING));
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,11 @@
|
||||||
#include "libslic3r/Geometry.hpp"
|
#include "libslic3r/Geometry.hpp"
|
||||||
#include "3DScene.hpp"
|
#include "3DScene.hpp"
|
||||||
|
|
||||||
|
#if ENABLE_RENDER_SELECTION_CENTER
|
||||||
|
class GLUquadric;
|
||||||
|
typedef class GLUquadric GLUquadricObj;
|
||||||
|
#endif // ENABLE_RENDER_SELECTION_CENTER
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
namespace GUI {
|
namespace GUI {
|
||||||
|
|
||||||
|
@ -291,7 +296,7 @@ public:
|
||||||
|
|
||||||
void render(float scale_factor = 1.0) const;
|
void render(float scale_factor = 1.0) const;
|
||||||
#if ENABLE_RENDER_SELECTION_CENTER
|
#if ENABLE_RENDER_SELECTION_CENTER
|
||||||
void render_center() const;
|
void render_center(bool gizmo_is_dragging) const;
|
||||||
#endif // ENABLE_RENDER_SELECTION_CENTER
|
#endif // ENABLE_RENDER_SELECTION_CENTER
|
||||||
void render_sidebar_hints(const std::string& sidebar_field) const;
|
void render_sidebar_hints(const std::string& sidebar_field) const;
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ namespace Slic3r {
|
||||||
namespace GUI {
|
namespace GUI {
|
||||||
|
|
||||||
|
|
||||||
static const char* URL_CHANGELOG = "http://files.prusa3d.com/file/?type=slicerstable&lng=%1%";
|
static const char* URL_CHANGELOG = "http://files.prusa3d.com/?latest=slicer-stable&lng=%1%";
|
||||||
static const char* URL_DOWNLOAD = "https://www.prusa3d.com/downloads&lng=%1%";
|
static const char* URL_DOWNLOAD = "https://www.prusa3d.com/downloads&lng=%1%";
|
||||||
static const char* URL_DEV = "https://github.com/prusa3d/PrusaSlicer/releases/tag/version_%1%";
|
static const char* URL_DEV = "https://github.com/prusa3d/PrusaSlicer/releases/tag/version_%1%";
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue