Merge remote-tracking branch 'remotes/remi/fork_release'
49
README.md
@ -1,10 +1,10 @@
|
|||||||
_Q: Oh cool, a new RepRap slicer?_
|
_Q: Oh cool, a new fork of slic3r?_
|
||||||
|
|
||||||
A: Yes.
|
A: Yes.
|
||||||
|
|
||||||
Slic3r
|
Slic3r
|
||||||
======
|
======
|
||||||
Prebuilt Windows, OSX and Linux binaries are available through the [git releases page](https://github.com/prusa3d/Slic3r/releases).
|
Prebuilt Windows 32b is available through the [git releases page](https://github.com/supermerill/Slic3r/releases).
|
||||||
|
|
||||||
<img width=256 src=https://cloud.githubusercontent.com/assets/31754/22719818/09998c92-ed6d-11e6-9fa0-09de638f3a36.png />
|
<img width=256 src=https://cloud.githubusercontent.com/assets/31754/22719818/09998c92-ed6d-11e6-9fa0-09de638f3a36.png />
|
||||||
|
|
||||||
@ -18,14 +18,20 @@ See the [project homepage](http://slic3r.org/) at slic3r.org and the
|
|||||||
|
|
||||||
### What language is it written in?
|
### What language is it written in?
|
||||||
|
|
||||||
The core geometric algorithms and data structures are written in C++,
|
Almost everything are written in C++,
|
||||||
and Perl is used for high-level flow abstraction, GUI and testing.
|
Perl is used a bit but the prusa fork is getting rid of it (unless for scripting, maybe).
|
||||||
If you're wondering why Perl, see https://xkcd.com/224/
|
|
||||||
|
|
||||||
The C++ API is public and its use in other projects is encouraged.
|
The C++ API is public and its use in other projects is encouraged.
|
||||||
The goal is to make Slic3r fully modular so that any part of its logic
|
The goal is to make Slic3r fully modular so that any part of its logic
|
||||||
can be used separately.
|
can be used separately.
|
||||||
|
|
||||||
|
### What are this fork main features/differences?
|
||||||
|
|
||||||
|
* **Ironing** top surface & many new settings to fine-tune the top surface quality.
|
||||||
|
* A denser infill option for 1-X layers before the top solid layers to better support them.
|
||||||
|
* Better overhangs (add perimeters if needed, slice them in opposite direction each layer).
|
||||||
|
* Better Thin walls (anchored inside the print, no more random bits at the ends).
|
||||||
|
|
||||||
### What are Slic3r's main features?
|
### What are Slic3r's main features?
|
||||||
|
|
||||||
Key features are:
|
Key features are:
|
||||||
@ -41,12 +47,12 @@ Key features are:
|
|||||||
|
|
||||||
Other major features are:
|
Other major features are:
|
||||||
|
|
||||||
* combine infill every 'n' perimeters layer to speed up printing
|
* combine infill every 'n' perimeters layer & varying density to speed up printing
|
||||||
* **3D preview** (including multi-material files)
|
* **3D preview** (including multi-material files)
|
||||||
* **multiple layer heights** in a single print
|
* **multiple layer heights** in a single print
|
||||||
* **spiral vase** mode for bumpless vases
|
* **spiral vase** mode for bumpless vases
|
||||||
* fine-grained configuration of speed, acceleration, extrusion width
|
* fine-grained configuration of speed, acceleration, extrusion width
|
||||||
* several infill patterns including honeycomb, spirals, Hilbert curves
|
* several infill patterns including honeycomb, spirals, Hilbert curves, gyroid
|
||||||
* support material, raft, brim, skirt
|
* support material, raft, brim, skirt
|
||||||
* **standby temperature** and automatic wiping for multi-extruder printing
|
* **standby temperature** and automatic wiping for multi-extruder printing
|
||||||
* customizable **G-code macros** and output filename with variable placeholders
|
* customizable **G-code macros** and output filename with variable placeholders
|
||||||
@ -55,39 +61,34 @@ Other major features are:
|
|||||||
|
|
||||||
### How to install?
|
### How to install?
|
||||||
|
|
||||||
You can download a precompiled package from [slic3r.org](http://slic3r.org/);
|
You can download a precompiled package from the release page.
|
||||||
it will run without the need for any dependency.
|
it will run without the need for any dependency.
|
||||||
|
|
||||||
If you want to compile the source yourself follow the instructions on one of these wiki pages:
|
If you want to compile the source yourself follow the instructions on one of these wiki pages:
|
||||||
* [Linux](https://github.com/alexrj/Slic3r/wiki/Running-Slic3r-from-git-on-GNU-Linux)
|
* [Linux](https://github.com/supermerill/Slic3r/tree/master/doc/How%20to%20build%20-%20UNIX.md)
|
||||||
* [Windows](https://github.com/prusa3d/Slic3r/wiki/How-to-compile-Slic3r-Prusa-Edition-on-MS-Windows)
|
* [Windows](https://github.com/supermerill/Slic3r/tree/master/doc/How%20to%20build%20-%20Windows.md)
|
||||||
* [Mac OSX](https://github.com/alexrj/Slic3r/wiki/Running-Slic3r-from-git-on-OS-X)
|
* [Mac OSX](https://github.com/supermerill/Slic3r/tree/master/doc/How_to_build_Slic3r.txt)
|
||||||
|
|
||||||
### Can I help?
|
### Can I help?
|
||||||
|
|
||||||
Sure! You can do the following to find things that are available to help with:
|
Sure! You can do the following to find things that are available to help with:
|
||||||
* [Pull Request Milestone](https://github.com/alexrj/Slic3r/milestone/31)
|
* Add an issue to the github tracker if it isn't already present.
|
||||||
* Please comment in the related github issue that you are working on it so that other people know.
|
|
||||||
* Items in the [TODO](https://github.com/alexrj/Slic3r/wiki/TODO) wiki page.
|
|
||||||
* Please comment in the related github issue that you are working on it so that other people know.
|
|
||||||
* Drop me a line at aar@cpan.org.
|
|
||||||
* You can also find me (rarely) in #reprap and in #slic3r on [FreeNode](https://webchat.freenode.net) with the nickname _Sound_. Another contributor, _LoH_, is also in both channels.
|
|
||||||
* Add an [issue](https://github.com/alexrj/Slic3r/issues) to the github tracker if it isn't already present.
|
|
||||||
|
|
||||||
Before sending patches and pull requests contact me (preferably through opening a github issue or commenting on an existing, related, issue) to discuss your proposed
|
Before sending patches and pull requests contact me (preferably through opening a github issue or commenting on an existing, related, issue) to discuss your proposed
|
||||||
changes: this way we'll ensure nobody wastes their time and no conflicts arise
|
changes: this way we'll ensure nobody wastes their time and no conflicts arise in development.
|
||||||
in development.
|
|
||||||
|
|
||||||
### What's Slic3r license?
|
### What's Slic3r license?
|
||||||
|
|
||||||
Slic3r is licensed under the _GNU Affero General Public License, version 3_.
|
Slic3r is licensed under the _GNU Affero General Public License, version 3_.
|
||||||
The author is Alessandro Ranellucci.
|
The first author is Alessandro Ranellucci, and many contributors
|
||||||
|
Then the he Prusa team
|
||||||
|
Then Durand remi for this fork
|
||||||
|
|
||||||
The [Silk icon set](http://www.famfamfam.com/lab/icons/silk/) used in Slic3r is
|
The [Silk icon set](http://www.famfamfam.com/lab/icons/silk/) used (and modified) in Slic3r is
|
||||||
licensed under the _Creative Commons Attribution 3.0 License_.
|
licensed under the _Creative Commons Attribution 3.0 License_.
|
||||||
The author of the Silk icon set is Mark James.
|
The author of the Silk icon set is Mark James.
|
||||||
|
|
||||||
### How can I invoke slic3r.pl using the command line?
|
### How can I invoke slic3r.pl using the command line? (not up-to-date yet, use the --help command instead)
|
||||||
|
|
||||||
Usage: slic3r.pl [ OPTIONS ] [ file.stl ] [ file2.stl ] ...
|
Usage: slic3r.pl [ OPTIONS ] [ file.stl ] [ file2.stl ] ...
|
||||||
|
|
||||||
@ -296,6 +297,7 @@ The author of the Silk icon set is Mark James.
|
|||||||
--min-fan-speed Minimum fan speed (default: 35%)
|
--min-fan-speed Minimum fan speed (default: 35%)
|
||||||
--max-fan-speed Maximum fan speed (default: 100%)
|
--max-fan-speed Maximum fan speed (default: 100%)
|
||||||
--bridge-fan-speed Fan speed to use when bridging (default: 100%)
|
--bridge-fan-speed Fan speed to use when bridging (default: 100%)
|
||||||
|
--top-fan-speed Fan speed to use when printing top layer (default: 100%)
|
||||||
--fan-below-layer-time Enable fan if layer print time is below this approximate number
|
--fan-below-layer-time Enable fan if layer print time is below this approximate number
|
||||||
of seconds (default: 60)
|
of seconds (default: 60)
|
||||||
--slowdown-below-layer-time Slow down if layer print time is below this approximate number
|
--slowdown-below-layer-time Slow down if layer print time is below this approximate number
|
||||||
@ -358,6 +360,7 @@ The author of the Silk icon set is Mark James.
|
|||||||
Set a different extrusion width for support material
|
Set a different extrusion width for support material
|
||||||
--infill-overlap Overlap between infill and perimeters (default: 15%)
|
--infill-overlap Overlap between infill and perimeters (default: 15%)
|
||||||
--bridge-flow-ratio Multiplier for extrusion when bridging (> 0, default: 1)
|
--bridge-flow-ratio Multiplier for extrusion when bridging (> 0, default: 1)
|
||||||
|
--over-bridge-flow-ratio Multiplier for extrusion when printing the layer above a bride (> 0, default: 1.15)
|
||||||
|
|
||||||
Multiple extruder options:
|
Multiple extruder options:
|
||||||
--extruder-offset Offset of each extruder, if firmware doesn't handle the displacement
|
--extruder-offset Offset of each extruder, if firmware doesn't handle the displacement
|
||||||
|
@ -28,7 +28,7 @@ BEGIN {
|
|||||||
use Config;
|
use Config;
|
||||||
use Moo;
|
use Moo;
|
||||||
my $have_threads = $Config{useithreads} && eval "use threads; use threads::shared; use Thread::Queue; 1";
|
my $have_threads = $Config{useithreads} && eval "use threads; use threads::shared; use Thread::Queue; 1";
|
||||||
die "Slic3r Prusa Edition requires working Perl threads.\n" if ! $have_threads;
|
die "Slic3r++ requires working Perl threads.\n" if ! $have_threads;
|
||||||
die "threads.pm >= 1.96 is required, please update\n" if $threads::VERSION < 1.96;
|
die "threads.pm >= 1.96 is required, please update\n" if $threads::VERSION < 1.96;
|
||||||
die "Perl threading is broken with this Moo version: " . $Moo::VERSION . "\n" if $Moo::VERSION == 1.003000;
|
die "Perl threading is broken with this Moo version: " . $Moo::VERSION . "\n" if $Moo::VERSION == 1.003000;
|
||||||
$debug = 1 if (defined($ENV{'SLIC3R_DEBUGOUT'}) && $ENV{'SLIC3R_DEBUGOUT'} == 1);
|
$debug = 1 if (defined($ENV{'SLIC3R_DEBUGOUT'}) && $ENV{'SLIC3R_DEBUGOUT'} == 1);
|
||||||
|
@ -74,7 +74,7 @@ sub OnInit {
|
|||||||
my ($self) = @_;
|
my ($self) = @_;
|
||||||
|
|
||||||
$self->SetAppName('Slic3rPE');
|
$self->SetAppName('Slic3rPE');
|
||||||
$self->SetAppDisplayName('Slic3r Prusa Edition');
|
$self->SetAppDisplayName('Slic3r++');
|
||||||
Slic3r::debugf "wxWidgets version %s, Wx version %s\n", &Wx::wxVERSION_STRING, $Wx::VERSION;
|
Slic3r::debugf "wxWidgets version %s, Wx version %s\n", &Wx::wxVERSION_STRING, $Wx::VERSION;
|
||||||
|
|
||||||
# Set the Slic3r data directory at the Slic3r XS module.
|
# Set the Slic3r data directory at the Slic3r XS module.
|
||||||
|
@ -358,8 +358,8 @@ sub _init_menubar {
|
|||||||
$self->_append_menu_item($helpMenu, L("Show &Configuration Folder"), L('Show user configuration folder (datadir)'), sub {
|
$self->_append_menu_item($helpMenu, L("Show &Configuration Folder"), L('Show user configuration folder (datadir)'), sub {
|
||||||
Slic3r::GUI::desktop_open_datadir_folder();
|
Slic3r::GUI::desktop_open_datadir_folder();
|
||||||
});
|
});
|
||||||
$self->_append_menu_item($helpMenu, L("Report an Issue"), L('Report an issue on the Slic3r Prusa Edition'), sub {
|
$self->_append_menu_item($helpMenu, L("Report an Issue"), L('Report an issue on the Slic3r++ github'), sub {
|
||||||
Wx::LaunchDefaultBrowser('http://github.com/prusa3d/slic3r/issues/new');
|
Wx::LaunchDefaultBrowser('http://github.com/supermerill/slic3r/issues/new');
|
||||||
});
|
});
|
||||||
$self->_append_menu_item($helpMenu, L("&About Slic3r"), L('Show about dialog'), sub {
|
$self->_append_menu_item($helpMenu, L("&About Slic3r"), L('Show about dialog'), sub {
|
||||||
Slic3r::GUI::about;
|
Slic3r::GUI::about;
|
||||||
|
@ -10,7 +10,7 @@ use base 'Wx::Dialog';
|
|||||||
|
|
||||||
sub new {
|
sub new {
|
||||||
my ($class, %params) = @_;
|
my ($class, %params) = @_;
|
||||||
my $self = $class->SUPER::new($params{parent}, -1, 'Slic3r Prusa Edition - System Information', wxDefaultPosition, [600, 340],
|
my $self = $class->SUPER::new($params{parent}, -1, 'Slic3r++ - System Information', wxDefaultPosition, [600, 340],
|
||||||
wxDEFAULT_DIALOG_STYLE | wxMAXIMIZE_BOX | wxRESIZE_BORDER);
|
wxDEFAULT_DIALOG_STYLE | wxMAXIMIZE_BOX | wxRESIZE_BORDER);
|
||||||
$self->{text_info} = $params{text_info};
|
$self->{text_info} = $params{text_info};
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 100 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 18 KiB |
@ -115,6 +115,7 @@ bool BridgeDetector::detect_angle(double bridge_direction_override)
|
|||||||
}
|
}
|
||||||
|
|
||||||
double total_length = 0;
|
double total_length = 0;
|
||||||
|
uint32_t nbLines = 0;
|
||||||
double max_length = 0;
|
double max_length = 0;
|
||||||
{
|
{
|
||||||
Lines clipped_lines = intersection_ln(lines, clip_area);
|
Lines clipped_lines = intersection_ln(lines, clip_area);
|
||||||
@ -125,10 +126,11 @@ bool BridgeDetector::detect_angle(double bridge_direction_override)
|
|||||||
double len = line.length();
|
double len = line.length();
|
||||||
total_length += len;
|
total_length += len;
|
||||||
max_length = std::max(max_length, len);
|
max_length = std::max(max_length, len);
|
||||||
|
nbLines++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (total_length == 0.)
|
if (total_length == 0. || nbLines == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
have_coverage = true;
|
have_coverage = true;
|
||||||
@ -139,6 +141,7 @@ bool BridgeDetector::detect_angle(double bridge_direction_override)
|
|||||||
// $directions_coverage{$angle} = sum(map $_->area, @{$self->coverage($angle)}) // 0;
|
// $directions_coverage{$angle} = sum(map $_->area, @{$self->coverage($angle)}) // 0;
|
||||||
// max length of bridged lines
|
// max length of bridged lines
|
||||||
candidates[i_angle].max_length = max_length;
|
candidates[i_angle].max_length = max_length;
|
||||||
|
candidates[i_angle].mean_length = total_length / nbLines;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if no direction produced coverage, then there's no bridge direction
|
// if no direction produced coverage, then there's no bridge direction
|
||||||
@ -149,10 +152,12 @@ bool BridgeDetector::detect_angle(double bridge_direction_override)
|
|||||||
std::sort(candidates.begin(), candidates.end());
|
std::sort(candidates.begin(), candidates.end());
|
||||||
|
|
||||||
// if any other direction is within extrusion width of coverage, prefer it if shorter
|
// if any other direction is within extrusion width of coverage, prefer it if shorter
|
||||||
|
// shorter = shorter max length, or if in espilon (10) range, the shorter mean length.
|
||||||
// TODO: There are two options here - within width of the angle with most coverage, or within width of the currently perferred?
|
// TODO: There are two options here - within width of the angle with most coverage, or within width of the currently perferred?
|
||||||
size_t i_best = 0;
|
size_t i_best = 0;
|
||||||
for (size_t i = 1; i < candidates.size() && candidates[i_best].coverage - candidates[i].coverage < this->spacing; ++ i)
|
for (size_t i = 1; i < candidates.size() && candidates[i_best].coverage - candidates[i].coverage < this->spacing; ++ i)
|
||||||
if (candidates[i].max_length < candidates[i_best].max_length)
|
if (candidates[i].max_length < candidates[i_best].max_length ||
|
||||||
|
(candidates[i].max_length < candidates[i_best].max_length - 10 && candidates[i].mean_length < candidates[i_best].mean_length))
|
||||||
i_best = i;
|
i_best = i;
|
||||||
|
|
||||||
this->angle = candidates[i_best].angle;
|
this->angle = candidates[i_best].angle;
|
||||||
|
@ -53,6 +53,7 @@ private:
|
|||||||
double angle;
|
double angle;
|
||||||
double coverage;
|
double coverage;
|
||||||
double max_length;
|
double max_length;
|
||||||
|
double mean_length;
|
||||||
};
|
};
|
||||||
public:
|
public:
|
||||||
// Get possible briging direction candidates.
|
// Get possible briging direction candidates.
|
||||||
|
@ -14,7 +14,7 @@ public:
|
|||||||
virtual Fill* clone() const { return new FillGyroid(*this); }
|
virtual Fill* clone() const { return new FillGyroid(*this); }
|
||||||
|
|
||||||
// require bridge flow since most of this pattern hangs in air
|
// require bridge flow since most of this pattern hangs in air
|
||||||
virtual bool use_bridge_flow() const { return true; }
|
virtual bool use_bridge_flow() const { return false; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void _fill_surface_single(
|
virtual void _fill_surface_single(
|
||||||
|
@ -651,7 +651,9 @@ WipeTower::ToolChangeResult WipeTowerPrusaMM::toolchange_Brim(bool sideOnly, flo
|
|||||||
m_wipe_tower_width,
|
m_wipe_tower_width,
|
||||||
m_wipe_tower_depth);
|
m_wipe_tower_depth);
|
||||||
|
|
||||||
PrusaMultiMaterial::Writer writer(m_layer_height, m_perimeter_width);
|
//use first layer width parameter
|
||||||
|
|
||||||
|
PrusaMultiMaterial::Writer writer(m_layer_height, m_brim_width);
|
||||||
writer.set_extrusion_flow(m_extrusion_flow * 1.1f)
|
writer.set_extrusion_flow(m_extrusion_flow * 1.1f)
|
||||||
.set_z(m_z_pos) // Let the writer know the current Z position as a base for Z-hop.
|
.set_z(m_z_pos) // Let the writer know the current Z position as a base for Z-hop.
|
||||||
.set_initial_tool(m_current_tool)
|
.set_initial_tool(m_current_tool)
|
||||||
@ -659,21 +661,21 @@ WipeTower::ToolChangeResult WipeTowerPrusaMM::toolchange_Brim(bool sideOnly, flo
|
|||||||
.append(";-------------------------------------\n"
|
.append(";-------------------------------------\n"
|
||||||
"; CP WIPE TOWER FIRST LAYER BRIM START\n");
|
"; CP WIPE TOWER FIRST LAYER BRIM START\n");
|
||||||
|
|
||||||
xy initial_position = wipeTower_box.lu - xy(m_perimeter_width * 6.f, 0);
|
xy initial_position = wipeTower_box.lu - xy(m_brim_width * 6.f, 0);
|
||||||
writer.set_initial_position(initial_position);
|
writer.set_initial_position(initial_position);
|
||||||
|
|
||||||
writer.extrude_explicit(wipeTower_box.ld - xy(m_perimeter_width * 6.f, 0), // Prime the extruder left of the wipe tower.
|
writer.extrude_explicit(wipeTower_box.ld - xy(m_brim_width * 6.f, 0), // Prime the extruder left of the wipe tower.
|
||||||
1.5f * m_extrusion_flow * (wipeTower_box.lu.y - wipeTower_box.ld.y), 2400);
|
1.5f * m_extrusion_flow * (wipeTower_box.lu.y - wipeTower_box.ld.y), 2400);
|
||||||
|
|
||||||
// The tool is supposed to be active and primed at the time when the wipe tower brim is extruded.
|
// The tool is supposed to be active and primed at the time when the wipe tower brim is extruded.
|
||||||
// Extrude 4 rounds of a brim around the future wipe tower.
|
// Extrude 4 rounds of a brim around the future wipe tower.
|
||||||
box_coordinates box(wipeTower_box);
|
box_coordinates box(wipeTower_box);
|
||||||
box.expand(m_perimeter_width);
|
box.expand(m_brim_width);
|
||||||
for (size_t i = 0; i < 4; ++ i) {
|
for (size_t i = 0; i < 4; ++ i) {
|
||||||
writer.travel (box.ld, 7000)
|
writer.travel (box.ld, 7000)
|
||||||
.extrude(box.lu, 2100).extrude(box.ru)
|
.extrude(box.lu, 2100).extrude(box.ru)
|
||||||
.extrude(box.rd ).extrude(box.ld);
|
.extrude(box.rd ).extrude(box.ld);
|
||||||
box.expand(m_perimeter_width);
|
box.expand(m_brim_width);
|
||||||
}
|
}
|
||||||
|
|
||||||
writer.travel(wipeTower_box.ld, 7000); // Move to the front left corner.
|
writer.travel(wipeTower_box.ld, 7000); // Move to the front left corner.
|
||||||
|
@ -45,7 +45,7 @@ public:
|
|||||||
// wipe_area -- space available for one toolchange in mm
|
// wipe_area -- space available for one toolchange in mm
|
||||||
WipeTowerPrusaMM(float x, float y, float width, float rotation_angle, float cooling_tube_retraction,
|
WipeTowerPrusaMM(float x, float y, float width, float rotation_angle, float cooling_tube_retraction,
|
||||||
float cooling_tube_length, float parking_pos_retraction, float extra_loading_move, float bridging,
|
float cooling_tube_length, float parking_pos_retraction, float extra_loading_move, float bridging,
|
||||||
const std::vector<std::vector<float>>& wiping_matrix, unsigned int initial_tool) :
|
const std::vector<std::vector<float>>& wiping_matrix, unsigned int initial_tool, float first_layer_width) :
|
||||||
m_wipe_tower_pos(x, y),
|
m_wipe_tower_pos(x, y),
|
||||||
m_wipe_tower_width(width),
|
m_wipe_tower_width(width),
|
||||||
m_wipe_tower_rotation_angle(rotation_angle),
|
m_wipe_tower_rotation_angle(rotation_angle),
|
||||||
@ -58,7 +58,8 @@ public:
|
|||||||
m_extra_loading_move(extra_loading_move),
|
m_extra_loading_move(extra_loading_move),
|
||||||
m_bridging(bridging),
|
m_bridging(bridging),
|
||||||
m_current_tool(initial_tool),
|
m_current_tool(initial_tool),
|
||||||
wipe_volumes(wiping_matrix)
|
wipe_volumes(wiping_matrix),
|
||||||
|
m_brim_width(first_layer_width)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
virtual ~WipeTowerPrusaMM() {}
|
virtual ~WipeTowerPrusaMM() {}
|
||||||
@ -204,7 +205,8 @@ private:
|
|||||||
float m_bridging = 0.f;
|
float m_bridging = 0.f;
|
||||||
bool m_adhesion = true;
|
bool m_adhesion = true;
|
||||||
|
|
||||||
float m_perimeter_width = 0.4 * Width_To_Nozzle_Ratio; // Width of an extrusion line, also a perimeter spacing for 100% infill.
|
float m_perimeter_width = 0.4 * Width_To_Nozzle_Ratio; // Width of an extrusion line, also a perimeter spacing for 100% infill.
|
||||||
|
float m_brim_width = 0.4 * Width_To_Nozzle_Ratio * Width_To_Nozzle_Ratio; // Width of an extrusion line, also a perimeter spacing for 100% infill.
|
||||||
float m_extrusion_flow = 0.038; //0.029f;// Extrusion flow is derived from m_perimeter_width, layer height and filament diameter.
|
float m_extrusion_flow = 0.038; //0.029f;// Extrusion flow is derived from m_perimeter_width, layer height and filament diameter.
|
||||||
|
|
||||||
|
|
||||||
|
@ -1111,7 +1111,7 @@ void Print::_make_wipe_tower()
|
|||||||
float(this->config.wipe_tower_rotation_angle.value), float(this->config.cooling_tube_retraction.value),
|
float(this->config.wipe_tower_rotation_angle.value), float(this->config.cooling_tube_retraction.value),
|
||||||
float(this->config.cooling_tube_length.value), float(this->config.parking_pos_retraction.value),
|
float(this->config.cooling_tube_length.value), float(this->config.parking_pos_retraction.value),
|
||||||
float(this->config.extra_loading_move.value), float(this->config.wipe_tower_bridging), wipe_volumes,
|
float(this->config.extra_loading_move.value), float(this->config.wipe_tower_bridging), wipe_volumes,
|
||||||
m_tool_ordering.first_extruder());
|
m_tool_ordering.first_extruder(), float(this->config.first_layer_extrusion_width));
|
||||||
|
|
||||||
//wipe_tower.set_retract();
|
//wipe_tower.set_retract();
|
||||||
//wipe_tower.set_zhop();
|
//wipe_tower.set_zhop();
|
||||||
|
@ -68,7 +68,7 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->default_value = new ConfigOptionString("");
|
def->default_value = new ConfigOptionString("");
|
||||||
|
|
||||||
def = this->add("bottom_solid_layers", coInt);
|
def = this->add("bottom_solid_layers", coInt);
|
||||||
def->label = L("Bottom");
|
def->label = L(" Bottom");
|
||||||
def->category = L("Layers and Perimeters");
|
def->category = L("Layers and Perimeters");
|
||||||
def->tooltip = L("Number of solid layers to generate on bottom surfaces.");
|
def->tooltip = L("Number of solid layers to generate on bottom surfaces.");
|
||||||
def->cli = "bottom-solid-layers=i";
|
def->cli = "bottom-solid-layers=i";
|
||||||
@ -86,7 +86,7 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->default_value = new ConfigOptionFloat(0);
|
def->default_value = new ConfigOptionFloat(0);
|
||||||
|
|
||||||
def = this->add("bridge_angle", coFloat);
|
def = this->add("bridge_angle", coFloat);
|
||||||
def->label = L("Bridging angle");
|
def->label = L("Bridging");
|
||||||
def->category = L("Infill");
|
def->category = L("Infill");
|
||||||
def->tooltip = L("Bridging angle override. If left to zero, the bridging angle will be calculated "
|
def->tooltip = L("Bridging angle override. If left to zero, the bridging angle will be calculated "
|
||||||
"automatically. Otherwise the provided angle will be used for all bridges. "
|
"automatically. Otherwise the provided angle will be used for all bridges. "
|
||||||
@ -115,7 +115,7 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->default_value = new ConfigOptionInts{ 100 };
|
def->default_value = new ConfigOptionInts{ 100 };
|
||||||
|
|
||||||
def = this->add("bridge_flow_ratio", coFloat);
|
def = this->add("bridge_flow_ratio", coFloat);
|
||||||
def->label = L("Bridge flow ratio");
|
def->label = L("Bridge");
|
||||||
def->category = L("Advanced");
|
def->category = L("Advanced");
|
||||||
def->tooltip = L("This factor affects the amount of plastic for bridging. "
|
def->tooltip = L("This factor affects the amount of plastic for bridging. "
|
||||||
"You can decrease it slightly to pull the extrudates and prevent sagging, "
|
"You can decrease it slightly to pull the extrudates and prevent sagging, "
|
||||||
@ -127,15 +127,16 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->default_value = new ConfigOptionFloat(1);
|
def->default_value = new ConfigOptionFloat(1);
|
||||||
|
|
||||||
def = this->add("over_bridge_flow_ratio", coFloat);
|
def = this->add("over_bridge_flow_ratio", coFloat);
|
||||||
def->label = L("Over-bridge flow ratio");
|
def->label = L("Above the bridges");
|
||||||
def->category = L("Advanced");
|
def->category = L("Advanced");
|
||||||
def->tooltip = L("This factor affects the amount of plastic to overextrude "
|
def->tooltip = L("This factor affects the amount of plastic to overextrude "
|
||||||
"when we are filling on top of a bridge surface."
|
"when we are filling on top of a bridge surface."
|
||||||
"With a number >1, we can retreive the correct z-height "
|
"With a number >1, we can retrieve a correct z-height "
|
||||||
"even if the bridged layer has fallen a bit.");
|
"even if the bridged layer has fallen a bit. "
|
||||||
|
"It's useful if you want to have a nice flat top layer.");
|
||||||
def->cli = "over-bridge-flow-ratio=f";
|
def->cli = "over-bridge-flow-ratio=f";
|
||||||
def->min = 0;
|
def->min = 0;
|
||||||
def->default_value = new ConfigOptionFloat(1);
|
def->default_value = new ConfigOptionFloat(1.15);
|
||||||
|
|
||||||
def = this->add("bridge_speed", coFloat);
|
def = this->add("bridge_speed", coFloat);
|
||||||
def->label = L("Bridges");
|
def->label = L("Bridges");
|
||||||
@ -261,13 +262,13 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->default_value = new ConfigOptionFloat(6);
|
def->default_value = new ConfigOptionFloat(6);
|
||||||
|
|
||||||
def = this->add("elefant_foot_compensation", coFloat);
|
def = this->add("elefant_foot_compensation", coFloat);
|
||||||
def->label = L("Elephant foot compensation");
|
def->label = L("First layer");
|
||||||
def->category = L("Advanced");
|
def->category = L("Advanced");
|
||||||
def->tooltip = L("The first layer will be shrunk in the XY plane by the configured value "
|
def->tooltip = L("The first layer will be shrunk in the XY plane by the configured value "
|
||||||
"to compensate for the 1st layer squish aka an Elephant Foot effect.");
|
"to compensate for the 1st layer squish aka an Elephant Foot effect. (must be negative = inwards)");
|
||||||
def->sidetext = L("mm");
|
def->sidetext = L("mm");
|
||||||
def->cli = "elefant-foot-compensation=f";
|
def->cli = "elefant-foot-compensation=f";
|
||||||
def->min = 0;
|
def->max = 0;
|
||||||
def->default_value = new ConfigOptionFloat(0);
|
def->default_value = new ConfigOptionFloat(0);
|
||||||
|
|
||||||
def = this->add("end_gcode", coString);
|
def = this->add("end_gcode", coString);
|
||||||
@ -300,7 +301,7 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->default_value = new ConfigOptionBool(false);
|
def->default_value = new ConfigOptionBool(false);
|
||||||
|
|
||||||
def = this->add("top_fill_pattern", coEnum);
|
def = this->add("top_fill_pattern", coEnum);
|
||||||
def->label = L("Top fill pattern");
|
def->label = L(" Top");
|
||||||
def->category = L("Infill");
|
def->category = L("Infill");
|
||||||
def->tooltip = L("Fill pattern for top infill. This only affects the top external visible layer, and not its adjacent solid shells.");
|
def->tooltip = L("Fill pattern for top infill. This only affects the top external visible layer, and not its adjacent solid shells.");
|
||||||
def->cli = "top-fill-pattern|solid-fill-pattern=s";
|
def->cli = "top-fill-pattern|solid-fill-pattern=s";
|
||||||
@ -326,7 +327,7 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->default_value = new ConfigOptionEnum<InfillPattern>(ipRectilinear);
|
def->default_value = new ConfigOptionEnum<InfillPattern>(ipRectilinear);
|
||||||
|
|
||||||
def = this->add("bottom_fill_pattern", coEnum);
|
def = this->add("bottom_fill_pattern", coEnum);
|
||||||
def->label = L("bottom fill pattern");
|
def->label = L("Bottom");
|
||||||
def->category = L("Infill");
|
def->category = L("Infill");
|
||||||
def->tooltip = L("Fill pattern for bottom infill. This only affects the bottom external visible layer, and not its adjacent solid shells.");
|
def->tooltip = L("Fill pattern for bottom infill. This only affects the bottom external visible layer, and not its adjacent solid shells.");
|
||||||
def->cli = "bottom-fill-pattern|solid-fill-pattern=s";
|
def->cli = "bottom-fill-pattern|solid-fill-pattern=s";
|
||||||
@ -344,9 +345,10 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->default_value = new ConfigOptionEnum<InfillPattern>(ipRectilinear);
|
def->default_value = new ConfigOptionEnum<InfillPattern>(ipRectilinear);
|
||||||
|
|
||||||
def = this->add("enforce_full_fill_volume", coBool);
|
def = this->add("enforce_full_fill_volume", coBool);
|
||||||
def->label = L("Enforce full fill volume");
|
def->label = L("Enforce 100% fill volume");
|
||||||
def->category = L("Infill");
|
def->category = L("Infill");
|
||||||
def->tooltip = L("Experimental option wich modify (top/bottom) fill flow to have the exact amount of plastic inside the volume to fill.");
|
def->tooltip = L("Experimental option wich modify (top/bottom) fill flow to have the exact amount of plastic inside the volume to fill "
|
||||||
|
"(it generally changes the flow from -7% to +4%, depending on the size of the surface to fill and the overlap parameters).");
|
||||||
def->cli = "enforce-full-fill-volume!";
|
def->cli = "enforce-full-fill-volume!";
|
||||||
def->default_value = new ConfigOptionBool(true);
|
def->default_value = new ConfigOptionBool(true);
|
||||||
|
|
||||||
@ -379,7 +381,7 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->default_value = new ConfigOptionFloatOrPercent(0, false);
|
def->default_value = new ConfigOptionFloatOrPercent(0, false);
|
||||||
|
|
||||||
def = this->add("external_perimeter_speed", coFloatOrPercent);
|
def = this->add("external_perimeter_speed", coFloatOrPercent);
|
||||||
def->label = L("External perimeters");
|
def->label = L("External");
|
||||||
def->category = L("Speed");
|
def->category = L("Speed");
|
||||||
def->tooltip = L("This separate setting will affect the speed of external perimeters (the visible ones). "
|
def->tooltip = L("This separate setting will affect the speed of external perimeters (the visible ones). "
|
||||||
"If expressed as percentage (for example: 80%) it will be calculated "
|
"If expressed as percentage (for example: 80%) it will be calculated "
|
||||||
@ -657,7 +659,7 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->default_value = new ConfigOptionStrings { "" };
|
def->default_value = new ConfigOptionStrings { "" };
|
||||||
|
|
||||||
def = this->add("fill_angle", coFloat);
|
def = this->add("fill_angle", coFloat);
|
||||||
def->label = L("Fill angle");
|
def->label = L("Fill");
|
||||||
def->category = L("Infill");
|
def->category = L("Infill");
|
||||||
def->tooltip = L("Default base angle for infill orientation. Cross-hatching will be applied to this. "
|
def->tooltip = L("Default base angle for infill orientation. Cross-hatching will be applied to this. "
|
||||||
"Bridges will be infilled using the best direction Slic3r can detect, so this setting "
|
"Bridges will be infilled using the best direction Slic3r can detect, so this setting "
|
||||||
@ -678,6 +680,7 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->cli = "fill-density=s";
|
def->cli = "fill-density=s";
|
||||||
def->min = 0;
|
def->min = 0;
|
||||||
def->max = 100;
|
def->max = 100;
|
||||||
|
/*
|
||||||
def->enum_values.push_back("0");
|
def->enum_values.push_back("0");
|
||||||
def->enum_values.push_back("5");
|
def->enum_values.push_back("5");
|
||||||
def->enum_values.push_back("10");
|
def->enum_values.push_back("10");
|
||||||
@ -706,11 +709,38 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->enum_labels.push_back("80%");
|
def->enum_labels.push_back("80%");
|
||||||
def->enum_labels.push_back("90%");
|
def->enum_labels.push_back("90%");
|
||||||
def->enum_labels.push_back("100%");
|
def->enum_labels.push_back("100%");
|
||||||
|
*/
|
||||||
|
def->enum_values.push_back("0");
|
||||||
|
def->enum_values.push_back("4");
|
||||||
|
def->enum_values.push_back("5.5");
|
||||||
|
def->enum_values.push_back("7.5");
|
||||||
|
def->enum_values.push_back("10");
|
||||||
|
def->enum_values.push_back("13");
|
||||||
|
def->enum_values.push_back("18");
|
||||||
|
def->enum_values.push_back("23");
|
||||||
|
def->enum_values.push_back("31");
|
||||||
|
def->enum_values.push_back("42");
|
||||||
|
def->enum_values.push_back("55");
|
||||||
|
def->enum_values.push_back("75");
|
||||||
|
def->enum_values.push_back("100");
|
||||||
|
def->enum_labels.push_back("0");
|
||||||
|
def->enum_labels.push_back("4");
|
||||||
|
def->enum_labels.push_back("5.5");
|
||||||
|
def->enum_labels.push_back("7.5");
|
||||||
|
def->enum_labels.push_back("10");
|
||||||
|
def->enum_labels.push_back("13");
|
||||||
|
def->enum_labels.push_back("18");
|
||||||
|
def->enum_labels.push_back("23");
|
||||||
|
def->enum_labels.push_back("31");
|
||||||
|
def->enum_labels.push_back("42");
|
||||||
|
def->enum_labels.push_back("55");
|
||||||
|
def->enum_labels.push_back("75");
|
||||||
|
def->enum_labels.push_back("100");
|
||||||
def->default_value = new ConfigOptionPercent(20);
|
def->default_value = new ConfigOptionPercent(20);
|
||||||
|
|
||||||
def = this->add("fill_pattern", coEnum);
|
def = this->add("fill_pattern", coEnum);
|
||||||
def->label = L("Fill pattern");
|
def->label = L("Inside");
|
||||||
def->category = L("Infill");
|
def->category = L("Sparse fill pattern");
|
||||||
def->tooltip = L("Fill pattern for general low-density infill.");
|
def->tooltip = L("Fill pattern for general low-density infill.");
|
||||||
def->cli = "fill-pattern=s";
|
def->cli = "fill-pattern=s";
|
||||||
def->enum_keys_map = &ConfigOptionEnum<InfillPattern>::get_enum_values();
|
def->enum_keys_map = &ConfigOptionEnum<InfillPattern>::get_enum_values();
|
||||||
@ -880,10 +910,10 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->default_value = new ConfigOptionInt(0);
|
def->default_value = new ConfigOptionInt(0);
|
||||||
|
|
||||||
def = this->add("infill_dense_angle", coFloat);
|
def = this->add("infill_dense_angle", coFloat);
|
||||||
def->label = L("angle");
|
def->label = L("Angle");
|
||||||
def->category = L("Infill");
|
def->category = L("Infill");
|
||||||
def->tooltip = L("Set the Angle of dense infill.");
|
def->tooltip = L("Set the Angle of dense infill.");
|
||||||
def->sidetext = L("layers");
|
def->sidetext = L("°");
|
||||||
def->cli = "infill-dense-angle=i";
|
def->cli = "infill-dense-angle=i";
|
||||||
def->min = 0;
|
def->min = 0;
|
||||||
def->default_value = new ConfigOptionFloat(0);
|
def->default_value = new ConfigOptionFloat(0);
|
||||||
@ -891,7 +921,7 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def = this->add("infill_dense_density", coPercent);
|
def = this->add("infill_dense_density", coPercent);
|
||||||
def->gui_type = "f_enum_open";
|
def->gui_type = "f_enum_open";
|
||||||
def->gui_flags = "show_value";
|
def->gui_flags = "show_value";
|
||||||
def->label = L("Dense fill density");
|
def->label = L("Density");
|
||||||
def->category = L("Infill");
|
def->category = L("Infill");
|
||||||
def->tooltip = L("Density of the dense internal infill, expressed in the range 0% - 100%.");
|
def->tooltip = L("Density of the dense internal infill, expressed in the range 0% - 100%.");
|
||||||
def->sidetext = L("%");
|
def->sidetext = L("%");
|
||||||
@ -927,7 +957,7 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->default_value = new ConfigOptionPercent(42);
|
def->default_value = new ConfigOptionPercent(42);
|
||||||
|
|
||||||
def = this->add("infill_dense_pattern", coEnum);
|
def = this->add("infill_dense_pattern", coEnum);
|
||||||
def->label = L("pattern");
|
def->label = L("Pattern");
|
||||||
def->category = L("Sparse fill pattern");
|
def->category = L("Sparse fill pattern");
|
||||||
def->tooltip = L("Fill pattern for denser-density sparse infill.");
|
def->tooltip = L("Fill pattern for denser-density sparse infill.");
|
||||||
def->cli = "dense-fill-pattern=s";
|
def->cli = "dense-fill-pattern=s";
|
||||||
@ -1007,7 +1037,7 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->default_value = new ConfigOptionFloatOrPercent(25, true);
|
def->default_value = new ConfigOptionFloatOrPercent(25, true);
|
||||||
|
|
||||||
def = this->add("infill_speed", coFloat);
|
def = this->add("infill_speed", coFloat);
|
||||||
def->label = L("Infill");
|
def->label = L("Sparse");
|
||||||
def->category = L("Speed");
|
def->category = L("Speed");
|
||||||
def->tooltip = L("Speed for printing the internal fill. Set to zero for auto.");
|
def->tooltip = L("Speed for printing the internal fill. Set to zero for auto.");
|
||||||
def->sidetext = L("mm/s");
|
def->sidetext = L("mm/s");
|
||||||
@ -1397,7 +1427,7 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->default_value = new ConfigOptionFloatOrPercent(0, false);
|
def->default_value = new ConfigOptionFloatOrPercent(0, false);
|
||||||
|
|
||||||
def = this->add("perimeter_speed", coFloat);
|
def = this->add("perimeter_speed", coFloat);
|
||||||
def->label = L("Perimeters");
|
def->label = L("Default");
|
||||||
def->category = L("Speed");
|
def->category = L("Speed");
|
||||||
def->tooltip = L("Speed for perimeters (contours, aka vertical shells). Set to zero for auto.");
|
def->tooltip = L("Speed for perimeters (contours, aka vertical shells). Set to zero for auto.");
|
||||||
def->sidetext = L("mm/s");
|
def->sidetext = L("mm/s");
|
||||||
@ -1684,7 +1714,7 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->default_value = new ConfigOptionInts { 5 };
|
def->default_value = new ConfigOptionInts { 5 };
|
||||||
|
|
||||||
def = this->add("small_perimeter_speed", coFloatOrPercent);
|
def = this->add("small_perimeter_speed", coFloatOrPercent);
|
||||||
def->label = L("Small perimeters");
|
def->label = L("Small");
|
||||||
def->category = L("Speed");
|
def->category = L("Speed");
|
||||||
def->tooltip = L("This separate setting will affect the speed of perimeters having radius <= 6.5mm "
|
def->tooltip = L("This separate setting will affect the speed of perimeters having radius <= 6.5mm "
|
||||||
"(usually holes). If expressed as percentage (for example: 80%) it will be calculated "
|
"(usually holes). If expressed as percentage (for example: 80%) it will be calculated "
|
||||||
@ -1735,7 +1765,7 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->default_value = new ConfigOptionFloatOrPercent(0, false);
|
def->default_value = new ConfigOptionFloatOrPercent(0, false);
|
||||||
|
|
||||||
def = this->add("solid_infill_speed", coFloatOrPercent);
|
def = this->add("solid_infill_speed", coFloatOrPercent);
|
||||||
def->label = L("Solid infill");
|
def->label = L("Solid");
|
||||||
def->category = L("Speed");
|
def->category = L("Speed");
|
||||||
def->tooltip = L("Speed for printing solid regions (top/bottom/internal horizontal shells). "
|
def->tooltip = L("Speed for printing solid regions (top/bottom/internal horizontal shells). "
|
||||||
"This can be expressed as a percentage (for example: 80%) over the default "
|
"This can be expressed as a percentage (for example: 80%) over the default "
|
||||||
@ -1931,7 +1961,7 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->default_value = new ConfigOptionFloat(0);
|
def->default_value = new ConfigOptionFloat(0);
|
||||||
|
|
||||||
def = this->add("support_material_interface_speed", coFloatOrPercent);
|
def = this->add("support_material_interface_speed", coFloatOrPercent);
|
||||||
def->label = L("Support material interface");
|
def->label = L("Interface");
|
||||||
def->category = L("Support material");
|
def->category = L("Support material");
|
||||||
def->tooltip = L("Speed for printing support material interface layers. If expressed as percentage "
|
def->tooltip = L("Speed for printing support material interface layers. If expressed as percentage "
|
||||||
"(for example 50%) it will be calculated over support material speed.");
|
"(for example 50%) it will be calculated over support material speed.");
|
||||||
@ -1965,7 +1995,7 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->default_value = new ConfigOptionFloat(2.5);
|
def->default_value = new ConfigOptionFloat(2.5);
|
||||||
|
|
||||||
def = this->add("support_material_speed", coFloat);
|
def = this->add("support_material_speed", coFloat);
|
||||||
def->label = L("Support material");
|
def->label = L("Default");
|
||||||
def->category = L("Support material");
|
def->category = L("Support material");
|
||||||
def->tooltip = L("Speed for printing support material.");
|
def->tooltip = L("Speed for printing support material.");
|
||||||
def->sidetext = L("mm/s");
|
def->sidetext = L("mm/s");
|
||||||
@ -2056,7 +2086,7 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->default_value = new ConfigOptionFloatOrPercent(0, false);
|
def->default_value = new ConfigOptionFloatOrPercent(0, false);
|
||||||
|
|
||||||
def = this->add("top_solid_infill_speed", coFloatOrPercent);
|
def = this->add("top_solid_infill_speed", coFloatOrPercent);
|
||||||
def->label = L("Top solid infill");
|
def->label = L("Top solid");
|
||||||
def->category = L("Speed");
|
def->category = L("Speed");
|
||||||
def->tooltip = L("Speed for printing top solid layers (it only applies to the uppermost "
|
def->tooltip = L("Speed for printing top solid layers (it only applies to the uppermost "
|
||||||
"external layers and not to their internal solid layers). You may want "
|
"external layers and not to their internal solid layers). You may want "
|
||||||
@ -2153,14 +2183,14 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
140.f, 140.f, 140.f, 140.f, 0.f };
|
140.f, 140.f, 140.f, 140.f, 0.f };
|
||||||
|
|
||||||
def = this->add("wipe_tower_x", coFloat);
|
def = this->add("wipe_tower_x", coFloat);
|
||||||
def->label = L("Position X");
|
def->label = L("X");
|
||||||
def->tooltip = L("X coordinate of the left front corner of a wipe tower");
|
def->tooltip = L("X coordinate of the left front corner of a wipe tower");
|
||||||
def->sidetext = L("mm");
|
def->sidetext = L("mm");
|
||||||
def->cli = "wipe-tower-x=f";
|
def->cli = "wipe-tower-x=f";
|
||||||
def->default_value = new ConfigOptionFloat(180.);
|
def->default_value = new ConfigOptionFloat(180.);
|
||||||
|
|
||||||
def = this->add("wipe_tower_y", coFloat);
|
def = this->add("wipe_tower_y", coFloat);
|
||||||
def->label = L("Position Y");
|
def->label = L("Y");
|
||||||
def->tooltip = L("Y coordinate of the left front corner of a wipe tower");
|
def->tooltip = L("Y coordinate of the left front corner of a wipe tower");
|
||||||
def->sidetext = L("mm");
|
def->sidetext = L("mm");
|
||||||
def->cli = "wipe-tower-y=f";
|
def->cli = "wipe-tower-y=f";
|
||||||
@ -2206,7 +2236,7 @@ PrintConfigDef::PrintConfigDef()
|
|||||||
def->default_value = new ConfigOptionFloat(10.);
|
def->default_value = new ConfigOptionFloat(10.);
|
||||||
|
|
||||||
def = this->add("xy_size_compensation", coFloat);
|
def = this->add("xy_size_compensation", coFloat);
|
||||||
def->label = L("XY Size Compensation");
|
def->label = L("All layers");
|
||||||
def->category = L("Advanced");
|
def->category = L("Advanced");
|
||||||
def->tooltip = L("The object will be grown/shrunk in the XY plane by the configured value "
|
def->tooltip = L("The object will be grown/shrunk in the XY plane by the configured value "
|
||||||
"(negative = inwards, positive = outwards). This might be useful "
|
"(negative = inwards, positive = outwards). This might be useful "
|
||||||
|
@ -1576,7 +1576,7 @@ end:
|
|||||||
// Apply size compensation and perform clipping of multi-part objects.
|
// Apply size compensation and perform clipping of multi-part objects.
|
||||||
float delta = float(scale_(this->config.xy_size_compensation.value));
|
float delta = float(scale_(this->config.xy_size_compensation.value));
|
||||||
if (layer_id == 0)
|
if (layer_id == 0)
|
||||||
delta -= float(scale_(this->config.elefant_foot_compensation.value));
|
delta += float(scale_(this->config.elefant_foot_compensation.value));
|
||||||
bool scale = delta != 0.f;
|
bool scale = delta != 0.f;
|
||||||
bool clip = this->config.clip_multipart_objects.value || delta > 0.f;
|
bool clip = this->config.clip_multipart_objects.value || delta > 0.f;
|
||||||
if (layer->regions.size() == 1) {
|
if (layer->regions.size() == 1) {
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <boost/thread.hpp>
|
#include <boost/thread.hpp>
|
||||||
|
|
||||||
#define SLIC3R_FORK_NAME "Slic3r Prusa Edition"
|
#define SLIC3R_FORK_NAME "Slic3r++"
|
||||||
#define SLIC3R_VERSION "1.41.0-alpha2"
|
#define SLIC3R_VERSION "1.41.0-alpha2"
|
||||||
#define SLIC3R_BUILD "UNKNOWN"
|
#define SLIC3R_BUILD "UNKNOWN"
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ AboutDialog::AboutDialog()
|
|||||||
|
|
||||||
// title
|
// title
|
||||||
{
|
{
|
||||||
wxStaticText* title = new wxStaticText(this, wxID_ANY, "Slic3r Prusa Edition", wxDefaultPosition, wxDefaultSize);
|
wxStaticText* title = new wxStaticText(this, wxID_ANY, "Slic3r++", wxDefaultPosition, wxDefaultSize);
|
||||||
wxFont title_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
|
wxFont title_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
|
||||||
title_font.SetWeight(wxFONTWEIGHT_BOLD);
|
title_font.SetWeight(wxFONTWEIGHT_BOLD);
|
||||||
title_font.SetFamily(wxFONTFAMILY_ROMAN);
|
title_font.SetFamily(wxFONTFAMILY_ROMAN);
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
namespace GUI {
|
namespace GUI {
|
||||||
|
|
||||||
|
#define MAIN_VENDOR "None"
|
||||||
|
|
||||||
// Printer model picker GUI control
|
// Printer model picker GUI control
|
||||||
|
|
||||||
@ -96,7 +97,7 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, cons
|
|||||||
auto *cbox = new Checkbox(variants_panel, label, model_id, variant.name);
|
auto *cbox = new Checkbox(variants_panel, label, model_id, variant.name);
|
||||||
const size_t idx = cboxes.size();
|
const size_t idx = cboxes.size();
|
||||||
cboxes.push_back(cbox);
|
cboxes.push_back(cbox);
|
||||||
bool enabled = appconfig_vendors.get_variant("PrusaResearch", model_id, variant.name);
|
bool enabled = appconfig_vendors.get_variant(MAIN_VENDOR, model_id, variant.name);
|
||||||
variants_checked += enabled;
|
variants_checked += enabled;
|
||||||
cbox->SetValue(enabled);
|
cbox->SetValue(enabled);
|
||||||
variants_sizer->Add(cbox, 0, wxBOTTOM, 3);
|
variants_sizer->Add(cbox, 0, wxBOTTOM, 3);
|
||||||
@ -232,7 +233,7 @@ PageWelcome::PageWelcome(ConfigWizard *parent, bool check_first_variant) :
|
|||||||
if (wizard_p()->run_reason == ConfigWizard::RR_DATA_EMPTY) {
|
if (wizard_p()->run_reason == ConfigWizard::RR_DATA_EMPTY) {
|
||||||
wxString::Format(_(L("Run %s")), ConfigWizard::name());
|
wxString::Format(_(L("Run %s")), ConfigWizard::name());
|
||||||
append_text(wxString::Format(
|
append_text(wxString::Format(
|
||||||
_(L("Hello, welcome to Slic3r Prusa Edition! This %s helps you with the initial configuration; just a few settings and you will be ready to print.")),
|
_(L("Hello, welcome to Slic3r++ (fork of Slic3r Prusa Edition)! This %s helps you with the initial configuration; just a few settings and you will be ready to print.")),
|
||||||
ConfigWizard::name())
|
ConfigWizard::name())
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
@ -241,7 +242,8 @@ PageWelcome::PageWelcome(ConfigWizard *parent, bool check_first_variant) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
const auto &vendors = wizard_p()->vendors;
|
const auto &vendors = wizard_p()->vendors;
|
||||||
const auto vendor_prusa = vendors.find("PrusaResearch");
|
printf("vendors count : %d", vendors.size());
|
||||||
|
const auto vendor_prusa = vendors.find(MAIN_VENDOR);
|
||||||
|
|
||||||
if (vendor_prusa != vendors.cend()) {
|
if (vendor_prusa != vendors.cend()) {
|
||||||
AppConfig &appconfig_vendors = this->wizard_p()->appconfig_vendors;
|
AppConfig &appconfig_vendors = this->wizard_p()->appconfig_vendors;
|
||||||
@ -330,7 +332,7 @@ PageVendors::PageVendors(ConfigWizard *parent) :
|
|||||||
|
|
||||||
for (const auto vendor_pair : wizard_p()->vendors) {
|
for (const auto vendor_pair : wizard_p()->vendors) {
|
||||||
const auto &vendor = vendor_pair.second;
|
const auto &vendor = vendor_pair.second;
|
||||||
if (vendor.id == "PrusaResearch") { continue; }
|
if (vendor.id == MAIN_VENDOR) { continue; }
|
||||||
|
|
||||||
auto *picker = new PrinterPicker(this, vendor, appconfig_vendors);
|
auto *picker = new PrinterPicker(this, vendor, appconfig_vendors);
|
||||||
picker->Hide();
|
picker->Hide();
|
||||||
@ -633,8 +635,8 @@ static const std::unordered_map<std::string, std::pair<std::string, std::string>
|
|||||||
|
|
||||||
void ConfigWizard::priv::load_vendors()
|
void ConfigWizard::priv::load_vendors()
|
||||||
{
|
{
|
||||||
const auto vendor_dir = fs::path(Slic3r::data_dir()) / "vendor";
|
const fs::path vendor_dir = fs::path(Slic3r::data_dir()) / "vendor";
|
||||||
const auto rsrc_vendor_dir = fs::path(resources_dir()) / "profiles";
|
const fs::path rsrc_vendor_dir = fs::path(resources_dir()) / "profiles";
|
||||||
|
|
||||||
// Load vendors from the "vendors" directory in datadir
|
// Load vendors from the "vendors" directory in datadir
|
||||||
for (fs::directory_iterator it(vendor_dir); it != fs::directory_iterator(); ++it) {
|
for (fs::directory_iterator it(vendor_dir); it != fs::directory_iterator(); ++it) {
|
||||||
@ -680,7 +682,7 @@ void ConfigWizard::priv::load_vendors()
|
|||||||
|
|
||||||
const auto &model = needle->second.first;
|
const auto &model = needle->second.first;
|
||||||
const auto &variant = needle->second.second;
|
const auto &variant = needle->second.second;
|
||||||
appconfig_vendors.set_variant("PrusaResearch", model, variant, true);
|
appconfig_vendors.set_variant(MAIN_VENDOR, model, variant, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -456,11 +456,11 @@ void Tab::update_changed_tree_ui()
|
|||||||
}
|
}
|
||||||
if (title == _("Dependencies")){
|
if (title == _("Dependencies")){
|
||||||
if (name() != "printer")
|
if (name() != "printer")
|
||||||
get_sys_and_mod_flags("compatible_printers", sys_page, modified_page);
|
get_sys_and_mod_flags("compatible_printers", sys_page, modified_page);
|
||||||
else {
|
else {
|
||||||
sys_page = m_presets->get_selected_preset_parent() ? true:false;
|
sys_page = m_presets->get_selected_preset_parent() ? true:false;
|
||||||
modified_page = false;
|
modified_page = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (auto group : page->m_optgroups)
|
for (auto group : page->m_optgroups)
|
||||||
{
|
{
|
||||||
@ -803,7 +803,8 @@ void TabPrint::build()
|
|||||||
line = { _(L("Solid layers")), "" };
|
line = { _(L("Solid layers")), "" };
|
||||||
line.append_option(optgroup->get_option("top_solid_layers"));
|
line.append_option(optgroup->get_option("top_solid_layers"));
|
||||||
line.append_option(optgroup->get_option("bottom_solid_layers"));
|
line.append_option(optgroup->get_option("bottom_solid_layers"));
|
||||||
optgroup->append_line(line);
|
optgroup->append_line(line);
|
||||||
|
optgroup->append_single_option_line("enforce_full_fill_volume");
|
||||||
|
|
||||||
optgroup = page->new_optgroup(_(L("Quality (slower slicing)")));
|
optgroup = page->new_optgroup(_(L("Quality (slower slicing)")));
|
||||||
optgroup->append_single_option_line("extra_perimeters");
|
optgroup->append_single_option_line("extra_perimeters");
|
||||||
@ -822,13 +823,14 @@ void TabPrint::build()
|
|||||||
optgroup->append_single_option_line("seam_position");
|
optgroup->append_single_option_line("seam_position");
|
||||||
optgroup->append_single_option_line("external_perimeters_first");
|
optgroup->append_single_option_line("external_perimeters_first");
|
||||||
|
|
||||||
page = add_options_page(_(L("Infill")), "infill.png");
|
page = add_options_page(_(L("Infill")), "infill.png");
|
||||||
optgroup = page->new_optgroup(_(L("Infill")));
|
optgroup = page->new_optgroup(_(L("Infill")));
|
||||||
optgroup->append_single_option_line("fill_density");
|
optgroup->append_single_option_line("fill_density");
|
||||||
optgroup->append_single_option_line("fill_pattern");
|
optgroup->append_single_option_line("fill_pattern");
|
||||||
optgroup->append_single_option_line("top_fill_pattern");
|
line = { _(L("Fill external pattern")), "" };
|
||||||
optgroup->append_single_option_line("bottom_fill_pattern");
|
line.append_option(optgroup->get_option("top_fill_pattern"));
|
||||||
optgroup->append_single_option_line("enforce_full_fill_volume");
|
line.append_option(optgroup->get_option("bottom_fill_pattern"));
|
||||||
|
optgroup->append_line(line);
|
||||||
|
|
||||||
optgroup = page->new_optgroup(_(L("Reducing printing time")));
|
optgroup = page->new_optgroup(_(L("Reducing printing time")));
|
||||||
optgroup->append_single_option_line("infill_every_layers");
|
optgroup->append_single_option_line("infill_every_layers");
|
||||||
@ -840,17 +842,19 @@ void TabPrint::build()
|
|||||||
line.append_option(optgroup->get_option("infill_dense_angle"));
|
line.append_option(optgroup->get_option("infill_dense_angle"));
|
||||||
optgroup->append_line(line);
|
optgroup->append_line(line);
|
||||||
|
|
||||||
optgroup = page->new_optgroup(_(L("Advanced")));
|
optgroup = page->new_optgroup(_(L("Advanced")));
|
||||||
optgroup->append_single_option_line("solid_infill_every_layers");
|
optgroup->append_single_option_line("solid_infill_every_layers");
|
||||||
optgroup->append_single_option_line("solid_infill_below_area");
|
optgroup->append_single_option_line("solid_infill_below_area");
|
||||||
optgroup->append_single_option_line("fill_angle");
|
line = { _(L("Angle")), "" };
|
||||||
optgroup->append_single_option_line("bridge_angle");
|
line.append_option(optgroup->get_option("fill_angle"));
|
||||||
|
line.append_option(optgroup->get_option("bridge_angle"));
|
||||||
|
optgroup->append_line(line);
|
||||||
line = { _(L("Anchor solid infill by X mm")), "" };
|
line = { _(L("Anchor solid infill by X mm")), "" };
|
||||||
line.append_option(optgroup->get_option("external_infill_margin"));
|
line.append_option(optgroup->get_option("external_infill_margin"));
|
||||||
line.append_option(optgroup->get_option("bridged_infill_margin"));
|
line.append_option(optgroup->get_option("bridged_infill_margin"));
|
||||||
optgroup->append_line(line);
|
optgroup->append_line(line);
|
||||||
optgroup->append_single_option_line("only_retract_when_crossing_perimeters");
|
optgroup->append_single_option_line("only_retract_when_crossing_perimeters");
|
||||||
optgroup->append_single_option_line("infill_first");
|
optgroup->append_single_option_line("infill_first");
|
||||||
|
|
||||||
page = add_options_page(_(L("Skirt and brim")), "box.png");
|
page = add_options_page(_(L("Skirt and brim")), "box.png");
|
||||||
optgroup = page->new_optgroup(_(L("Skirt")));
|
optgroup = page->new_optgroup(_(L("Skirt")));
|
||||||
@ -887,15 +891,21 @@ void TabPrint::build()
|
|||||||
optgroup->append_single_option_line("support_material_synchronize_layers");
|
optgroup->append_single_option_line("support_material_synchronize_layers");
|
||||||
|
|
||||||
page = add_options_page(_(L("Speed")), "time.png");
|
page = add_options_page(_(L("Speed")), "time.png");
|
||||||
optgroup = page->new_optgroup(_(L("Speed for print moves")));
|
optgroup = page->new_optgroup(_(L("Speed for print moves")));
|
||||||
optgroup->append_single_option_line("perimeter_speed");
|
line = { _(L("Perimeter speed")), "" };
|
||||||
optgroup->append_single_option_line("small_perimeter_speed");
|
line.append_option(optgroup->get_option("perimeter_speed"));
|
||||||
optgroup->append_single_option_line("external_perimeter_speed");
|
line.append_option(optgroup->get_option("external_perimeter_speed"));
|
||||||
optgroup->append_single_option_line("infill_speed");
|
line.append_option(optgroup->get_option("small_perimeter_speed"));
|
||||||
optgroup->append_single_option_line("solid_infill_speed");
|
optgroup->append_line(line);
|
||||||
optgroup->append_single_option_line("top_solid_infill_speed");
|
line = { _(L("Infill speed")), "" };
|
||||||
optgroup->append_single_option_line("support_material_speed");
|
line.append_option(optgroup->get_option("infill_speed"));
|
||||||
optgroup->append_single_option_line("support_material_interface_speed");
|
line.append_option(optgroup->get_option("solid_infill_speed"));
|
||||||
|
line.append_option(optgroup->get_option("top_solid_infill_speed"));
|
||||||
|
optgroup->append_line(line);
|
||||||
|
line = { _(L("Support speed")), "" };
|
||||||
|
line.append_option(optgroup->get_option("support_material_speed"));
|
||||||
|
line.append_option(optgroup->get_option("support_material_interface_speed"));
|
||||||
|
optgroup->append_line(line);
|
||||||
optgroup->append_single_option_line("bridge_speed");
|
optgroup->append_single_option_line("bridge_speed");
|
||||||
optgroup->append_single_option_line("gap_fill_speed");
|
optgroup->append_single_option_line("gap_fill_speed");
|
||||||
|
|
||||||
@ -931,9 +941,11 @@ void TabPrint::build()
|
|||||||
optgroup->append_single_option_line("standby_temperature_delta");
|
optgroup->append_single_option_line("standby_temperature_delta");
|
||||||
|
|
||||||
optgroup = page->new_optgroup(_(L("Wipe tower")));
|
optgroup = page->new_optgroup(_(L("Wipe tower")));
|
||||||
optgroup->append_single_option_line("wipe_tower");
|
optgroup->append_single_option_line("wipe_tower");
|
||||||
optgroup->append_single_option_line("wipe_tower_x");
|
line = { _(L("Wipe tower position")), "" };
|
||||||
optgroup->append_single_option_line("wipe_tower_y");
|
line.append_option(optgroup->get_option("wipe_tower_x"));
|
||||||
|
line.append_option(optgroup->get_option("wipe_tower_y"));
|
||||||
|
optgroup->append_line(line);
|
||||||
optgroup->append_single_option_line("wipe_tower_width");
|
optgroup->append_single_option_line("wipe_tower_width");
|
||||||
optgroup->append_single_option_line("wipe_tower_rotation_angle");
|
optgroup->append_single_option_line("wipe_tower_rotation_angle");
|
||||||
optgroup->append_single_option_line("wipe_tower_bridging");
|
optgroup->append_single_option_line("wipe_tower_bridging");
|
||||||
@ -955,14 +967,18 @@ void TabPrint::build()
|
|||||||
optgroup = page->new_optgroup(_(L("Overlap")));
|
optgroup = page->new_optgroup(_(L("Overlap")));
|
||||||
optgroup->append_single_option_line("infill_overlap");
|
optgroup->append_single_option_line("infill_overlap");
|
||||||
|
|
||||||
optgroup = page->new_optgroup(_(L("Flow")));
|
optgroup = page->new_optgroup(_(L("Flow")));
|
||||||
optgroup->append_single_option_line("bridge_flow_ratio");
|
line = { _(L("Bridge flow ratio")), "" };
|
||||||
optgroup->append_single_option_line("over_bridge_flow_ratio");
|
line.append_option(optgroup->get_option("bridge_flow_ratio"));
|
||||||
|
line.append_option(optgroup->get_option("over_bridge_flow_ratio"));
|
||||||
|
optgroup->append_line(line);
|
||||||
|
|
||||||
optgroup = page->new_optgroup(_(L("Other")));
|
optgroup = page->new_optgroup(_(L("Other")));
|
||||||
optgroup->append_single_option_line("clip_multipart_objects");
|
optgroup->append_single_option_line("clip_multipart_objects");
|
||||||
optgroup->append_single_option_line("elefant_foot_compensation");
|
line = { _(L("XY compensation")), "" };
|
||||||
optgroup->append_single_option_line("xy_size_compensation");
|
line.append_option(optgroup->get_option("xy_size_compensation"));
|
||||||
|
line.append_option(optgroup->get_option("elefant_foot_compensation"));
|
||||||
|
optgroup->append_line(line);
|
||||||
// # optgroup->append_single_option_line("threads");
|
// # optgroup->append_single_option_line("threads");
|
||||||
optgroup->append_single_option_line("resolution");
|
optgroup->append_single_option_line("resolution");
|
||||||
|
|
||||||
@ -2065,7 +2081,7 @@ void Tab::rebuild_page_tree()
|
|||||||
m_treectrl->SetItemTextColour(itemId, p->get_item_colour());
|
m_treectrl->SetItemTextColour(itemId, p->get_item_colour());
|
||||||
if (p->title() == selected) {
|
if (p->title() == selected) {
|
||||||
if (!(p->title() == _(L("Machine limits")) || p->title() == _(L("Single extruder MM setup")))) // These Pages have to be updated inside OnTreeSelChange
|
if (!(p->title() == _(L("Machine limits")) || p->title() == _(L("Single extruder MM setup")))) // These Pages have to be updated inside OnTreeSelChange
|
||||||
m_disable_tree_sel_changed_event = 1;
|
m_disable_tree_sel_changed_event = 1;
|
||||||
m_treectrl->SelectItem(itemId);
|
m_treectrl->SelectItem(itemId);
|
||||||
m_disable_tree_sel_changed_event = 0;
|
m_disable_tree_sel_changed_event = 0;
|
||||||
have_selection = 1;
|
have_selection = 1;
|
||||||
|