mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-14 02:07:54 -06:00
Merge branch 'master' into gcode_preview
This commit is contained in:
commit
030fc9c320
13 changed files with 110 additions and 99 deletions
|
@ -171,12 +171,11 @@ stl_scale(stl_file *stl, float factor) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void calculate_normals(stl_file *stl) {
|
static void calculate_normals(stl_file *stl) {
|
||||||
long i;
|
|
||||||
float normal[3];
|
float normal[3];
|
||||||
|
|
||||||
if (stl->error) return;
|
if (stl->error) return;
|
||||||
|
|
||||||
for(i = 0; i < stl->stats.number_of_facets; i++) {
|
for(uint32_t i = 0; i < stl->stats.number_of_facets; i++) {
|
||||||
stl_calculate_normal(normal, &stl->facet_start[i]);
|
stl_calculate_normal(normal, &stl->facet_start[i]);
|
||||||
stl_normalize_vector(normal);
|
stl_normalize_vector(normal);
|
||||||
stl->facet_start[i].normal.x = normal[0];
|
stl->facet_start[i].normal.x = normal[0];
|
||||||
|
@ -381,7 +380,6 @@ stl_mirror_xz(stl_file *stl) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static float get_volume(stl_file *stl) {
|
static float get_volume(stl_file *stl) {
|
||||||
long i;
|
|
||||||
stl_vertex p0;
|
stl_vertex p0;
|
||||||
stl_vertex p;
|
stl_vertex p;
|
||||||
stl_normal n;
|
stl_normal n;
|
||||||
|
@ -396,7 +394,7 @@ static float get_volume(stl_file *stl) {
|
||||||
p0.y = stl->facet_start[0].vertex[0].y;
|
p0.y = stl->facet_start[0].vertex[0].y;
|
||||||
p0.z = stl->facet_start[0].vertex[0].z;
|
p0.z = stl->facet_start[0].vertex[0].z;
|
||||||
|
|
||||||
for(i = 0; i < stl->stats.number_of_facets; i++) {
|
for(uint32_t i = 0; i < stl->stats.number_of_facets; i++) {
|
||||||
p.x = stl->facet_start[i].vertex[0].x - p0.x;
|
p.x = stl->facet_start[i].vertex[0].x - p0.x;
|
||||||
p.y = stl->facet_start[i].vertex[0].y - p0.y;
|
p.y = stl->facet_start[i].vertex[0].y - p0.y;
|
||||||
p.z = stl->facet_start[i].vertex[0].z - p0.z;
|
p.z = stl->facet_start[i].vertex[0].z - p0.z;
|
||||||
|
|
|
@ -561,7 +561,7 @@ inline void RangeTest(const IntPoint& Pt, bool& useFullRange)
|
||||||
if (useFullRange)
|
if (useFullRange)
|
||||||
{
|
{
|
||||||
if (Pt.X > hiRange || Pt.Y > hiRange || -Pt.X > hiRange || -Pt.Y > hiRange)
|
if (Pt.X > hiRange || Pt.Y > hiRange || -Pt.X > hiRange || -Pt.Y > hiRange)
|
||||||
throw "Coordinate outside allowed range";
|
throw clipperException("Coordinate outside allowed range");
|
||||||
}
|
}
|
||||||
else if (Pt.X > loRange|| Pt.Y > loRange || -Pt.X > loRange || -Pt.Y > loRange)
|
else if (Pt.X > loRange|| Pt.Y > loRange || -Pt.X > loRange || -Pt.Y > loRange)
|
||||||
{
|
{
|
||||||
|
@ -2386,8 +2386,8 @@ void Clipper::ProcessHorizontal(TEdge *horzEdge)
|
||||||
|
|
||||||
void Clipper::UpdateEdgeIntoAEL(TEdge *&e)
|
void Clipper::UpdateEdgeIntoAEL(TEdge *&e)
|
||||||
{
|
{
|
||||||
if( !e->NextInLML ) throw
|
if( !e->NextInLML )
|
||||||
clipperException("UpdateEdgeIntoAEL: invalid call");
|
throw clipperException("UpdateEdgeIntoAEL: invalid call");
|
||||||
|
|
||||||
e->NextInLML->OutIdx = e->OutIdx;
|
e->NextInLML->OutIdx = e->OutIdx;
|
||||||
TEdge* AelPrev = e->PrevInAEL;
|
TEdge* AelPrev = e->PrevInAEL;
|
||||||
|
|
|
@ -582,6 +582,13 @@ public:
|
||||||
ConfigOptionType type() const override { return static_type(); }
|
ConfigOptionType type() const override { return static_type(); }
|
||||||
ConfigOption* clone() const override { return new ConfigOptionFloatOrPercent(*this); }
|
ConfigOption* clone() const override { return new ConfigOptionFloatOrPercent(*this); }
|
||||||
ConfigOptionFloatOrPercent& operator=(const ConfigOption *opt) { this->set(opt); return *this; }
|
ConfigOptionFloatOrPercent& operator=(const ConfigOption *opt) { this->set(opt); return *this; }
|
||||||
|
bool operator==(const ConfigOption &rhs) const override
|
||||||
|
{
|
||||||
|
if (rhs.type() != this->type())
|
||||||
|
throw std::runtime_error("ConfigOptionFloatOrPercent: Comparing incompatible types");
|
||||||
|
assert(dynamic_cast<const ConfigOptionFloatOrPercent*>(&rhs));
|
||||||
|
return *this == *static_cast<const ConfigOptionFloatOrPercent*>(&rhs);
|
||||||
|
}
|
||||||
bool operator==(const ConfigOptionFloatOrPercent &rhs) const
|
bool operator==(const ConfigOptionFloatOrPercent &rhs) const
|
||||||
{ return this->value == rhs.value && this->percent == rhs.percent; }
|
{ return this->value == rhs.value && this->percent == rhs.percent; }
|
||||||
double get_abs_value(double ratio_over) const
|
double get_abs_value(double ratio_over) const
|
||||||
|
|
|
@ -148,7 +148,7 @@ bool load_prus(const char *path, Model *model)
|
||||||
if (scene_xml_data.size() < size_last + size_incr)
|
if (scene_xml_data.size() < size_last + size_incr)
|
||||||
scene_xml_data.resize(size_last + size_incr);
|
scene_xml_data.resize(size_last + size_incr);
|
||||||
}
|
}
|
||||||
size_last += size_last + zip.LastRead();
|
size_last += zip.LastRead();
|
||||||
if (scene_xml_data.size() == size_last)
|
if (scene_xml_data.size() == size_last)
|
||||||
scene_xml_data.resize(size_last + 1);
|
scene_xml_data.resize(size_last + 1);
|
||||||
else if (scene_xml_data.size() > size_last + 1)
|
else if (scene_xml_data.size() > size_last + 1)
|
||||||
|
|
|
@ -7,16 +7,36 @@
|
||||||
#include <boost/date_time/posix_time/posix_time.hpp>
|
#include <boost/date_time/posix_time/posix_time.hpp>
|
||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
|
|
||||||
#if defined(__APPLE__) || defined(__linux) || defined(__OpenBSD__)
|
#if defined(__APPLE__) || defined(__OpenBSD__)
|
||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
#endif
|
#endif
|
||||||
#if __APPLE__
|
#ifdef __APPLE__
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <IOKit/serial/ioss.h>
|
#include <IOKit/serial/ioss.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef __linux
|
#ifdef __linux__
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <linux/serial.h>
|
#include <fcntl.h>
|
||||||
|
#include "/usr/include/asm-generic/ioctls.h"
|
||||||
|
|
||||||
|
/* The following definitions are kindly borrowed from:
|
||||||
|
/usr/include/asm-generic/termbits.h
|
||||||
|
Unfortunately we cannot just include that one because
|
||||||
|
it would redefine the "struct termios" already defined
|
||||||
|
the <termios.h> already included by Boost.ASIO. */
|
||||||
|
#define K_NCCS 19
|
||||||
|
struct termios2 {
|
||||||
|
tcflag_t c_iflag;
|
||||||
|
tcflag_t c_oflag;
|
||||||
|
tcflag_t c_cflag;
|
||||||
|
tcflag_t c_lflag;
|
||||||
|
cc_t c_line;
|
||||||
|
cc_t c_cc[K_NCCS];
|
||||||
|
speed_t c_ispeed;
|
||||||
|
speed_t c_ospeed;
|
||||||
|
};
|
||||||
|
#define BOTHER CBAUDEX
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//#define DEBUG_SERIAL
|
//#define DEBUG_SERIAL
|
||||||
|
@ -47,26 +67,26 @@ GCodeSender::connect(std::string devname, unsigned int baud_rate)
|
||||||
this->set_error_status(false);
|
this->set_error_status(false);
|
||||||
try {
|
try {
|
||||||
this->serial.open(devname);
|
this->serial.open(devname);
|
||||||
|
|
||||||
|
this->serial.set_option(boost::asio::serial_port_base::parity(boost::asio::serial_port_base::parity::odd));
|
||||||
|
this->serial.set_option(boost::asio::serial_port_base::character_size(boost::asio::serial_port_base::character_size(8)));
|
||||||
|
this->serial.set_option(boost::asio::serial_port_base::flow_control(boost::asio::serial_port_base::flow_control::none));
|
||||||
|
this->serial.set_option(boost::asio::serial_port_base::stop_bits(boost::asio::serial_port_base::stop_bits::one));
|
||||||
|
this->set_baud_rate(baud_rate);
|
||||||
|
|
||||||
|
this->serial.close();
|
||||||
|
this->serial.open(devname);
|
||||||
|
this->serial.set_option(boost::asio::serial_port_base::parity(boost::asio::serial_port_base::parity::none));
|
||||||
|
|
||||||
|
// set baud rate again because set_option overwrote it
|
||||||
|
this->set_baud_rate(baud_rate);
|
||||||
|
this->open = true;
|
||||||
|
this->reset();
|
||||||
} catch (boost::system::system_error &) {
|
} catch (boost::system::system_error &) {
|
||||||
this->set_error_status(true);
|
this->set_error_status(true);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->serial.set_option(boost::asio::serial_port_base::parity(boost::asio::serial_port_base::parity::odd));
|
|
||||||
this->serial.set_option(boost::asio::serial_port_base::character_size(boost::asio::serial_port_base::character_size(8)));
|
|
||||||
this->serial.set_option(boost::asio::serial_port_base::flow_control(boost::asio::serial_port_base::flow_control::none));
|
|
||||||
this->serial.set_option(boost::asio::serial_port_base::stop_bits(boost::asio::serial_port_base::stop_bits::one));
|
|
||||||
this->set_baud_rate(baud_rate);
|
|
||||||
|
|
||||||
this->serial.close();
|
|
||||||
this->serial.open(devname);
|
|
||||||
this->serial.set_option(boost::asio::serial_port_base::parity(boost::asio::serial_port_base::parity::none));
|
|
||||||
|
|
||||||
// set baud rate again because set_option overwrote it
|
|
||||||
this->set_baud_rate(baud_rate);
|
|
||||||
this->open = true;
|
|
||||||
this->reset();
|
|
||||||
|
|
||||||
// a reset firmware expect line numbers to start again from 1
|
// a reset firmware expect line numbers to start again from 1
|
||||||
this->sent = 0;
|
this->sent = 0;
|
||||||
this->last_sent.clear();
|
this->last_sent.clear();
|
||||||
|
@ -84,6 +104,11 @@ GCodeSender::connect(std::string devname, unsigned int baud_rate)
|
||||||
boost::thread t(boost::bind(&boost::asio::io_service::run, &this->io));
|
boost::thread t(boost::bind(&boost::asio::io_service::run, &this->io));
|
||||||
this->background_thread.swap(t);
|
this->background_thread.swap(t);
|
||||||
|
|
||||||
|
// always send a M105 to check for connection because firmware might be silent on connect
|
||||||
|
//FIXME Vojtech: This is being sent too early, leading to line number synchronization issues,
|
||||||
|
// from which the GCodeSender never recovers.
|
||||||
|
// this->send("M105", true);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,27 +129,17 @@ GCodeSender::set_baud_rate(unsigned int baud_rate)
|
||||||
ioctl(handle, IOSSIOSPEED, &newSpeed);
|
ioctl(handle, IOSSIOSPEED, &newSpeed);
|
||||||
::tcsetattr(handle, TCSANOW, &ios);
|
::tcsetattr(handle, TCSANOW, &ios);
|
||||||
#elif __linux
|
#elif __linux
|
||||||
termios ios;
|
termios2 ios;
|
||||||
::tcgetattr(handle, &ios);
|
if (ioctl(handle, TCGETS2, &ios))
|
||||||
::cfsetispeed(&ios, B38400);
|
printf("Error in TCGETS2: %s\n", strerror(errno));
|
||||||
::cfsetospeed(&ios, B38400);
|
ios.c_ispeed = ios.c_ospeed = baud_rate;
|
||||||
::tcflush(handle, TCIFLUSH);
|
ios.c_cflag &= ~CBAUD;
|
||||||
::tcsetattr(handle, TCSANOW, &ios);
|
ios.c_cflag |= BOTHER | CLOCAL | CREAD;
|
||||||
|
ios.c_cc[VMIN] = 1; // Minimum of characters to read, prevents eof errors when 0 bytes are read
|
||||||
|
ios.c_cc[VTIME] = 1;
|
||||||
|
if (ioctl(handle, TCSETS2, &ios))
|
||||||
|
printf("Error in TCSETS2: %s\n", strerror(errno));
|
||||||
|
|
||||||
struct serial_struct ss;
|
|
||||||
ioctl(handle, TIOCGSERIAL, &ss);
|
|
||||||
ss.flags = (ss.flags & ~ASYNC_SPD_MASK) | ASYNC_SPD_CUST;
|
|
||||||
ss.custom_divisor = (ss.baud_base + (baud_rate / 2)) / baud_rate;
|
|
||||||
//cout << "bbase " << ss.baud_base << " div " << ss.custom_divisor;
|
|
||||||
long closestSpeed = ss.baud_base / ss.custom_divisor;
|
|
||||||
//cout << " Closest speed " << closestSpeed << endl;
|
|
||||||
ss.reserved_char[0] = 0;
|
|
||||||
if (closestSpeed < baud_rate * 98 / 100 || closestSpeed > baud_rate * 102 / 100) {
|
|
||||||
printf("Failed to set baud rate\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
ioctl(handle, TIOCSSERIAL, &ss);
|
|
||||||
printf("< set_baud_rate: %u\n", baud_rate);
|
|
||||||
#elif __OpenBSD__
|
#elif __OpenBSD__
|
||||||
struct termios ios;
|
struct termios ios;
|
||||||
::tcgetattr(handle, &ios);
|
::tcgetattr(handle, &ios);
|
||||||
|
@ -154,6 +169,7 @@ GCodeSender::disconnect()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef DEBUG_SERIAL
|
#ifdef DEBUG_SERIAL
|
||||||
|
fs << "DISCONNECTED" << std::endl << std::flush;
|
||||||
fs.close();
|
fs.close();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -292,17 +308,20 @@ GCodeSender::on_read(const boost::system::error_code& error,
|
||||||
{
|
{
|
||||||
this->set_error_status(false);
|
this->set_error_status(false);
|
||||||
if (error) {
|
if (error) {
|
||||||
|
#ifdef __APPLE__
|
||||||
if (error.value() == 45) {
|
if (error.value() == 45) {
|
||||||
// OS X bug: http://osdir.com/ml/lib.boost.asio.user/2008-08/msg00004.html
|
// OS X bug: http://osdir.com/ml/lib.boost.asio.user/2008-08/msg00004.html
|
||||||
this->do_read();
|
this->do_read();
|
||||||
} else {
|
return;
|
||||||
// printf("ERROR: [%d] %s\n", error.value(), error.message().c_str());
|
}
|
||||||
// error can be true even because the serial port was closed.
|
#endif
|
||||||
// In this case it is not a real error, so ignore.
|
|
||||||
if (this->open) {
|
// printf("ERROR: [%d] %s\n", error.value(), error.message().c_str());
|
||||||
this->do_close();
|
// error can be true even because the serial port was closed.
|
||||||
this->set_error_status(true);
|
// In this case it is not a real error, so ignore.
|
||||||
}
|
if (this->open) {
|
||||||
|
this->do_close();
|
||||||
|
this->set_error_status(true);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -339,7 +358,8 @@ GCodeSender::on_read(const boost::system::error_code& error,
|
||||||
// extract the first number from line
|
// extract the first number from line
|
||||||
boost::algorithm::trim_left_if(line, !boost::algorithm::is_digit());
|
boost::algorithm::trim_left_if(line, !boost::algorithm::is_digit());
|
||||||
size_t toresend = boost::lexical_cast<size_t>(line.substr(0, line.find_first_not_of("0123456789")));
|
size_t toresend = boost::lexical_cast<size_t>(line.substr(0, line.find_first_not_of("0123456789")));
|
||||||
if (toresend >= this->sent - this->last_sent.size()) {
|
++ toresend; // N is 0-based
|
||||||
|
if (toresend >= this->sent - this->last_sent.size() && toresend < this->last_sent.size()) {
|
||||||
{
|
{
|
||||||
boost::lock_guard<boost::mutex> l(this->queue_mutex);
|
boost::lock_guard<boost::mutex> l(this->queue_mutex);
|
||||||
|
|
||||||
|
@ -457,8 +477,8 @@ GCodeSender::do_send()
|
||||||
if (line.empty()) return;
|
if (line.empty()) return;
|
||||||
|
|
||||||
// compute full line
|
// compute full line
|
||||||
this->sent++;
|
|
||||||
std::string full_line = "N" + boost::lexical_cast<std::string>(this->sent) + " " + line;
|
std::string full_line = "N" + boost::lexical_cast<std::string>(this->sent) + " " + line;
|
||||||
|
++ this->sent;
|
||||||
|
|
||||||
// calculate checksum
|
// calculate checksum
|
||||||
int cs = 0;
|
int cs = 0;
|
||||||
|
|
|
@ -35,8 +35,7 @@ public:
|
||||||
coord_t x;
|
coord_t x;
|
||||||
coord_t y;
|
coord_t y;
|
||||||
Point(coord_t _x = 0, coord_t _y = 0): x(_x), y(_y) {};
|
Point(coord_t _x = 0, coord_t _y = 0): x(_x), y(_y) {};
|
||||||
Point(int _x, int _y): x(_x), y(_y) {};
|
Point(int64_t _x, int64_t _y): x(coord_t(_x)), y(coord_t(_y)) {}; // for Clipper
|
||||||
Point(long long _x, long long _y): x(coord_t(_x)), y(coord_t(_y)) {}; // for Clipper
|
|
||||||
Point(double x, double y);
|
Point(double x, double y);
|
||||||
static Point new_scale(coordf_t x, coordf_t y) { return Point(coord_t(scale_(x)), coord_t(scale_(y))); }
|
static Point new_scale(coordf_t x, coordf_t y) { return Point(coord_t(scale_(x)), coord_t(scale_(y))); }
|
||||||
|
|
||||||
|
@ -289,23 +288,6 @@ template<typename TO> inline TO convert_to(const Pointf3 &src) { return TO(typen
|
||||||
#include <boost/version.hpp>
|
#include <boost/version.hpp>
|
||||||
#include <boost/polygon/polygon.hpp>
|
#include <boost/polygon/polygon.hpp>
|
||||||
namespace boost { namespace polygon {
|
namespace boost { namespace polygon {
|
||||||
template <>
|
|
||||||
struct geometry_concept<coord_t> { typedef coordinate_concept type; };
|
|
||||||
|
|
||||||
/* Boost.Polygon already defines a specialization for coordinate_traits<long> as of 1.60:
|
|
||||||
https://github.com/boostorg/polygon/commit/0ac7230dd1f8f34cb12b86c8bb121ae86d3d9b97 */
|
|
||||||
#if BOOST_VERSION < 106000
|
|
||||||
template <>
|
|
||||||
struct coordinate_traits<coord_t> {
|
|
||||||
typedef coord_t coordinate_type;
|
|
||||||
typedef long double area_type;
|
|
||||||
typedef long long manhattan_area_type;
|
|
||||||
typedef unsigned long long unsigned_area_type;
|
|
||||||
typedef long long coordinate_difference;
|
|
||||||
typedef long double coordinate_distance;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct geometry_concept<Slic3r::Point> { typedef point_concept type; };
|
struct geometry_concept<Slic3r::Point> { typedef point_concept type; };
|
||||||
|
|
||||||
|
|
|
@ -1080,7 +1080,8 @@ void Print::_make_wipe_tower()
|
||||||
// Find the position in this->objects.first()->support_layers to insert these new support layers.
|
// Find the position in this->objects.first()->support_layers to insert these new support layers.
|
||||||
double wipe_tower_new_layer_print_z_first = m_tool_ordering.layer_tools()[idx_begin].print_z;
|
double wipe_tower_new_layer_print_z_first = m_tool_ordering.layer_tools()[idx_begin].print_z;
|
||||||
SupportLayerPtrs::iterator it_layer = this->objects.front()->support_layers.begin();
|
SupportLayerPtrs::iterator it_layer = this->objects.front()->support_layers.begin();
|
||||||
for (; (*it_layer)->print_z - EPSILON < wipe_tower_new_layer_print_z_first; ++ it_layer) ;
|
SupportLayerPtrs::iterator it_end = this->objects.front()->support_layers.end();
|
||||||
|
for (; it_layer != it_end && (*it_layer)->print_z - EPSILON < wipe_tower_new_layer_print_z_first; ++ it_layer);
|
||||||
// Find the stopper of the sequence of wipe tower layers, which do not have a counterpart in an object or a support layer.
|
// Find the stopper of the sequence of wipe tower layers, which do not have a counterpart in an object or a support layer.
|
||||||
for (size_t i = idx_begin; i < idx_end; ++ i) {
|
for (size_t i = idx_begin; i < idx_end; ++ i) {
|
||||||
ToolOrdering::LayerTools < = const_cast<ToolOrdering::LayerTools&>(m_tool_ordering.layer_tools()[i]);
|
ToolOrdering::LayerTools < = const_cast<ToolOrdering::LayerTools&>(m_tool_ordering.layer_tools()[i]);
|
||||||
|
@ -1088,9 +1089,9 @@ void Print::_make_wipe_tower()
|
||||||
break;
|
break;
|
||||||
lt.has_support = true;
|
lt.has_support = true;
|
||||||
// Insert the new support layer.
|
// Insert the new support layer.
|
||||||
//FIXME the support layer ID is duplicated, but Vojtech hopes it is not being used anywhere anyway.
|
|
||||||
double height = lt.print_z - m_tool_ordering.layer_tools()[i-1].print_z;
|
double height = lt.print_z - m_tool_ordering.layer_tools()[i-1].print_z;
|
||||||
auto *new_layer = new SupportLayer((*it_layer)->id(), this->objects.front(),
|
//FIXME the support layer ID is set to -1, as Vojtech hopes it is not being used anyway.
|
||||||
|
auto *new_layer = new SupportLayer(size_t(-1), this->objects.front(),
|
||||||
height, lt.print_z, lt.print_z - 0.5 * height);
|
height, lt.print_z, lt.print_z - 0.5 * height);
|
||||||
it_layer = this->objects.front()->support_layers.insert(it_layer, new_layer);
|
it_layer = this->objects.front()->support_layers.insert(it_layer, new_layer);
|
||||||
++ it_layer;
|
++ it_layer;
|
||||||
|
|
|
@ -17,8 +17,8 @@
|
||||||
#define SLIC3R_VERSION "1.39.0"
|
#define SLIC3R_VERSION "1.39.0"
|
||||||
#define SLIC3R_BUILD "UNKNOWN"
|
#define SLIC3R_BUILD "UNKNOWN"
|
||||||
|
|
||||||
typedef long coord_t;
|
typedef int32_t coord_t;
|
||||||
typedef double coordf_t;
|
typedef double coordf_t;
|
||||||
|
|
||||||
//FIXME This epsilon value is used for many non-related purposes:
|
//FIXME This epsilon value is used for many non-related purposes:
|
||||||
// For a threshold of a squared Euclidean distance,
|
// For a threshold of a squared Euclidean distance,
|
||||||
|
|
|
@ -238,6 +238,9 @@ std::string PresetHints::recommended_thin_wall_thickness(const PresetBundle &pre
|
||||||
bool thin_walls = print_config.opt_bool("thin_walls");
|
bool thin_walls = print_config.opt_bool("thin_walls");
|
||||||
float nozzle_diameter = float(printer_config.opt_float("nozzle_diameter", 0));
|
float nozzle_diameter = float(printer_config.opt_float("nozzle_diameter", 0));
|
||||||
|
|
||||||
|
if (layer_height <= 0.f)
|
||||||
|
return "Recommended object thin wall thickness: Not available due to invalid layer height.";
|
||||||
|
|
||||||
Flow external_perimeter_flow = Flow::new_from_config_width(
|
Flow external_perimeter_flow = Flow::new_from_config_width(
|
||||||
frExternalPerimeter,
|
frExternalPerimeter,
|
||||||
*print_config.opt<ConfigOptionFloatOrPercent>("external_perimeter_extrusion_width"),
|
*print_config.opt<ConfigOptionFloatOrPercent>("external_perimeter_extrusion_width"),
|
||||||
|
|
|
@ -25,10 +25,10 @@
|
||||||
double radius();
|
double radius();
|
||||||
Clone<Point> min_point() %code{% RETVAL = THIS->min; %};
|
Clone<Point> min_point() %code{% RETVAL = THIS->min; %};
|
||||||
Clone<Point> max_point() %code{% RETVAL = THIS->max; %};
|
Clone<Point> max_point() %code{% RETVAL = THIS->max; %};
|
||||||
long x_min() %code{% RETVAL = THIS->min.x; %};
|
int x_min() %code{% RETVAL = THIS->min.x; %};
|
||||||
long x_max() %code{% RETVAL = THIS->max.x; %};
|
int x_max() %code{% RETVAL = THIS->max.x; %};
|
||||||
long y_min() %code{% RETVAL = THIS->min.y; %};
|
int y_min() %code{% RETVAL = THIS->min.y; %};
|
||||||
long y_max() %code{% RETVAL = THIS->max.y; %};
|
int y_max() %code{% RETVAL = THIS->max.y; %};
|
||||||
std::string serialize() %code{% char buf[2048]; sprintf(buf, "%ld,%ld;%ld,%ld", THIS->min.x, THIS->min.y, THIS->max.x, THIS->max.y); RETVAL = buf; %};
|
std::string serialize() %code{% char buf[2048]; sprintf(buf, "%ld,%ld;%ld,%ld", THIS->min.x, THIS->min.y, THIS->max.x, THIS->max.y); RETVAL = buf; %};
|
||||||
bool defined() %code{% RETVAL = THIS->defined; %};
|
bool defined() %code{% RETVAL = THIS->defined; %};
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ BridgeDetector*
|
||||||
BridgeDetector::new(expolygon, lower_slices, extrusion_width)
|
BridgeDetector::new(expolygon, lower_slices, extrusion_width)
|
||||||
ExPolygon* expolygon;
|
ExPolygon* expolygon;
|
||||||
ExPolygonCollection* lower_slices;
|
ExPolygonCollection* lower_slices;
|
||||||
long extrusion_width;
|
int extrusion_width;
|
||||||
CODE:
|
CODE:
|
||||||
RETVAL = new BridgeDetector(*expolygon, *lower_slices, extrusion_width);
|
RETVAL = new BridgeDetector(*expolygon, *lower_slices, extrusion_width);
|
||||||
OUTPUT:
|
OUTPUT:
|
||||||
|
@ -33,7 +33,7 @@ BridgeDetector*
|
||||||
BridgeDetector::new_expolygons(expolygons, lower_slices, extrusion_width)
|
BridgeDetector::new_expolygons(expolygons, lower_slices, extrusion_width)
|
||||||
ExPolygonCollection* expolygons;
|
ExPolygonCollection* expolygons;
|
||||||
ExPolygonCollection* lower_slices;
|
ExPolygonCollection* lower_slices;
|
||||||
long extrusion_width;
|
int extrusion_width;
|
||||||
CODE:
|
CODE:
|
||||||
RETVAL = new BridgeDetector(expolygons->expolygons, *lower_slices, extrusion_width);
|
RETVAL = new BridgeDetector(expolygons->expolygons, *lower_slices, extrusion_width);
|
||||||
OUTPUT:
|
OUTPUT:
|
||||||
|
|
|
@ -26,8 +26,8 @@
|
||||||
float spacing();
|
float spacing();
|
||||||
float spacing_to(Flow* other)
|
float spacing_to(Flow* other)
|
||||||
%code{% RETVAL = THIS->spacing(*other); %};
|
%code{% RETVAL = THIS->spacing(*other); %};
|
||||||
long scaled_width();
|
int scaled_width();
|
||||||
long scaled_spacing();
|
int scaled_spacing();
|
||||||
double mm3_per_mm();
|
double mm3_per_mm();
|
||||||
%{
|
%{
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
%}
|
%}
|
||||||
|
|
||||||
%name{Slic3r::Point} class Point {
|
%name{Slic3r::Point} class Point {
|
||||||
Point(long _x = 0, long _y = 0);
|
Point(int _x = 0, int _y = 0);
|
||||||
~Point();
|
~Point();
|
||||||
Clone<Point> clone()
|
Clone<Point> clone()
|
||||||
%code{% RETVAL=THIS; %};
|
%code{% RETVAL=THIS; %};
|
||||||
|
@ -18,13 +18,13 @@
|
||||||
%code{% RETVAL = to_SV_pureperl(THIS); %};
|
%code{% RETVAL = to_SV_pureperl(THIS); %};
|
||||||
SV* pp()
|
SV* pp()
|
||||||
%code{% RETVAL = to_SV_pureperl(THIS); %};
|
%code{% RETVAL = to_SV_pureperl(THIS); %};
|
||||||
long x()
|
int x()
|
||||||
%code{% RETVAL = THIS->x; %};
|
%code{% RETVAL = THIS->x; %};
|
||||||
long y()
|
int y()
|
||||||
%code{% RETVAL = THIS->y; %};
|
%code{% RETVAL = THIS->y; %};
|
||||||
void set_x(long val)
|
void set_x(int val)
|
||||||
%code{% THIS->x = val; %};
|
%code{% THIS->x = val; %};
|
||||||
void set_y(long val)
|
void set_y(int val)
|
||||||
%code{% THIS->y = val; %};
|
%code{% THIS->y = val; %};
|
||||||
int nearest_point_index(Points points);
|
int nearest_point_index(Points points);
|
||||||
Clone<Point> nearest_point(Points points)
|
Clone<Point> nearest_point(Points points)
|
||||||
|
@ -77,15 +77,15 @@ Point::coincides_with(point_sv)
|
||||||
};
|
};
|
||||||
|
|
||||||
%name{Slic3r::Point3} class Point3 {
|
%name{Slic3r::Point3} class Point3 {
|
||||||
Point3(long _x = 0, long _y = 0, long _z = 0);
|
Point3(int _x = 0, int _y = 0, int _z = 0);
|
||||||
~Point3();
|
~Point3();
|
||||||
Clone<Point3> clone()
|
Clone<Point3> clone()
|
||||||
%code{% RETVAL = THIS; %};
|
%code{% RETVAL = THIS; %};
|
||||||
long x()
|
int x()
|
||||||
%code{% RETVAL = THIS->x; %};
|
%code{% RETVAL = THIS->x; %};
|
||||||
long y()
|
int y()
|
||||||
%code{% RETVAL = THIS->y; %};
|
%code{% RETVAL = THIS->y; %};
|
||||||
long z()
|
int z()
|
||||||
%code{% RETVAL = THIS->z; %};
|
%code{% RETVAL = THIS->z; %};
|
||||||
std::string serialize() %code{% char buf[2048]; sprintf(buf, "%ld,%ld,%ld", THIS->x, THIS->y, THIS->z); RETVAL = buf; %};
|
std::string serialize() %code{% char buf[2048]; sprintf(buf, "%ld,%ld,%ld", THIS->x, THIS->y, THIS->z); RETVAL = buf; %};
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue