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.
|
||||
|
||||
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 />
|
||||
|
||||
@ -18,14 +18,20 @@ See the [project homepage](http://slic3r.org/) at slic3r.org and the
|
||||
|
||||
### What language is it written in?
|
||||
|
||||
The core geometric algorithms and data structures are written in C++,
|
||||
and Perl is used for high-level flow abstraction, GUI and testing.
|
||||
If you're wondering why Perl, see https://xkcd.com/224/
|
||||
Almost everything are written in C++,
|
||||
Perl is used a bit but the prusa fork is getting rid of it (unless for scripting, maybe).
|
||||
|
||||
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
|
||||
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?
|
||||
|
||||
Key features are:
|
||||
@ -41,12 +47,12 @@ Key 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)
|
||||
* **multiple layer heights** in a single print
|
||||
* **spiral vase** mode for bumpless vases
|
||||
* 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
|
||||
* **standby temperature** and automatic wiping for multi-extruder printing
|
||||
* customizable **G-code macros** and output filename with variable placeholders
|
||||
@ -55,39 +61,34 @@ Other major features are:
|
||||
|
||||
### 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.
|
||||
|
||||
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)
|
||||
* [Windows](https://github.com/prusa3d/Slic3r/wiki/How-to-compile-Slic3r-Prusa-Edition-on-MS-Windows)
|
||||
* [Mac OSX](https://github.com/alexrj/Slic3r/wiki/Running-Slic3r-from-git-on-OS-X)
|
||||
* [Linux](https://github.com/supermerill/Slic3r/tree/master/doc/How%20to%20build%20-%20UNIX.md)
|
||||
* [Windows](https://github.com/supermerill/Slic3r/tree/master/doc/How%20to%20build%20-%20Windows.md)
|
||||
* [Mac OSX](https://github.com/supermerill/Slic3r/tree/master/doc/How_to_build_Slic3r.txt)
|
||||
|
||||
### Can I help?
|
||||
|
||||
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)
|
||||
* 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.
|
||||
* Add an issue 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
|
||||
changes: this way we'll ensure nobody wastes their time and no conflicts arise
|
||||
in development.
|
||||
changes: this way we'll ensure nobody wastes their time and no conflicts arise in development.
|
||||
|
||||
### What's Slic3r license?
|
||||
|
||||
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_.
|
||||
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 ] ...
|
||||
|
||||
@ -296,6 +297,7 @@ The author of the Silk icon set is Mark James.
|
||||
--min-fan-speed Minimum fan speed (default: 35%)
|
||||
--max-fan-speed Maximum fan speed (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
|
||||
of seconds (default: 60)
|
||||
--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
|
||||
--infill-overlap Overlap between infill and perimeters (default: 15%)
|
||||
--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:
|
||||
--extruder-offset Offset of each extruder, if firmware doesn't handle the displacement
|
||||
|
@ -28,7 +28,7 @@ BEGIN {
|
||||
use Config;
|
||||
use Moo;
|
||||
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 "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);
|
||||
|
@ -74,7 +74,7 @@ sub OnInit {
|
||||
my ($self) = @_;
|
||||
|
||||
$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;
|
||||
|
||||
# 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 {
|
||||
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 {
|
||||
Wx::LaunchDefaultBrowser('http://github.com/prusa3d/slic3r/issues/new');
|
||||
$self->_append_menu_item($helpMenu, L("Report an Issue"), L('Report an issue on the Slic3r++ github'), sub {
|
||||
Wx::LaunchDefaultBrowser('http://github.com/supermerill/slic3r/issues/new');
|
||||
});
|
||||
$self->_append_menu_item($helpMenu, L("&About Slic3r"), L('Show about dialog'), sub {
|
||||
Slic3r::GUI::about;
|
||||
|
@ -10,7 +10,7 @@ use base 'Wx::Dialog';
|
||||
|
||||
sub new {
|
||||
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);
|
||||
$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;
|
||||
uint32_t nbLines = 0;
|
||||
double max_length = 0;
|
||||
{
|
||||
Lines clipped_lines = intersection_ln(lines, clip_area);
|
||||
@ -125,10 +126,11 @@ bool BridgeDetector::detect_angle(double bridge_direction_override)
|
||||
double len = line.length();
|
||||
total_length += len;
|
||||
max_length = std::max(max_length, len);
|
||||
nbLines++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (total_length == 0.)
|
||||
if (total_length == 0. || nbLines == 0)
|
||||
continue;
|
||||
|
||||
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;
|
||||
// max length of bridged lines
|
||||
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
|
||||
@ -149,10 +152,12 @@ bool BridgeDetector::detect_angle(double bridge_direction_override)
|
||||
std::sort(candidates.begin(), candidates.end());
|
||||
|
||||
// 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?
|
||||
size_t i_best = 0;
|
||||
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;
|
||||
|
||||
this->angle = candidates[i_best].angle;
|
||||
|
@ -53,6 +53,7 @@ private:
|
||||
double angle;
|
||||
double coverage;
|
||||
double max_length;
|
||||
double mean_length;
|
||||
};
|
||||
public:
|
||||
// Get possible briging direction candidates.
|
||||
|
@ -14,7 +14,7 @@ public:
|
||||
virtual Fill* clone() const { return new FillGyroid(*this); }
|
||||
|
||||
// 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:
|
||||
virtual void _fill_surface_single(
|
||||
|
@ -651,7 +651,9 @@ WipeTower::ToolChangeResult WipeTowerPrusaMM::toolchange_Brim(bool sideOnly, flo
|
||||
m_wipe_tower_width,
|
||||
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)
|
||||
.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)
|
||||
@ -659,21 +661,21 @@ WipeTower::ToolChangeResult WipeTowerPrusaMM::toolchange_Brim(bool sideOnly, flo
|
||||
.append(";-------------------------------------\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.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);
|
||||
|
||||
// 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.
|
||||
box_coordinates box(wipeTower_box);
|
||||
box.expand(m_perimeter_width);
|
||||
box.expand(m_brim_width);
|
||||
for (size_t i = 0; i < 4; ++ i) {
|
||||
writer.travel (box.ld, 7000)
|
||||
.extrude(box.lu, 2100).extrude(box.ru)
|
||||
.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.
|
||||
|
@ -45,7 +45,7 @@ public:
|
||||
// wipe_area -- space available for one toolchange in mm
|
||||
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,
|
||||
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_width(width),
|
||||
m_wipe_tower_rotation_angle(rotation_angle),
|
||||
@ -58,7 +58,8 @@ public:
|
||||
m_extra_loading_move(extra_loading_move),
|
||||
m_bridging(bridging),
|
||||
m_current_tool(initial_tool),
|
||||
wipe_volumes(wiping_matrix)
|
||||
wipe_volumes(wiping_matrix),
|
||||
m_brim_width(first_layer_width)
|
||||
{}
|
||||
|
||||
virtual ~WipeTowerPrusaMM() {}
|
||||
@ -205,6 +206,7 @@ private:
|
||||
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_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.
|
||||
|
||||
|
||||
|
@ -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.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,
|
||||
m_tool_ordering.first_extruder());
|
||||
m_tool_ordering.first_extruder(), float(this->config.first_layer_extrusion_width));
|
||||
|
||||
//wipe_tower.set_retract();
|
||||
//wipe_tower.set_zhop();
|
||||
|
@ -86,7 +86,7 @@ PrintConfigDef::PrintConfigDef()
|
||||
def->default_value = new ConfigOptionFloat(0);
|
||||
|
||||
def = this->add("bridge_angle", coFloat);
|
||||
def->label = L("Bridging angle");
|
||||
def->label = L("Bridging");
|
||||
def->category = L("Infill");
|
||||
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. "
|
||||
@ -115,7 +115,7 @@ PrintConfigDef::PrintConfigDef()
|
||||
def->default_value = new ConfigOptionInts{ 100 };
|
||||
|
||||
def = this->add("bridge_flow_ratio", coFloat);
|
||||
def->label = L("Bridge flow ratio");
|
||||
def->label = L("Bridge");
|
||||
def->category = L("Advanced");
|
||||
def->tooltip = L("This factor affects the amount of plastic for bridging. "
|
||||
"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 = 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->tooltip = L("This factor affects the amount of plastic to overextrude "
|
||||
"when we are filling on top of a bridge surface."
|
||||
"With a number >1, we can retreive the correct z-height "
|
||||
"even if the bridged layer has fallen a bit.");
|
||||
"With a number >1, we can retrieve a correct z-height "
|
||||
"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->min = 0;
|
||||
def->default_value = new ConfigOptionFloat(1);
|
||||
def->default_value = new ConfigOptionFloat(1.15);
|
||||
|
||||
def = this->add("bridge_speed", coFloat);
|
||||
def->label = L("Bridges");
|
||||
@ -261,13 +262,13 @@ PrintConfigDef::PrintConfigDef()
|
||||
def->default_value = new ConfigOptionFloat(6);
|
||||
|
||||
def = this->add("elefant_foot_compensation", coFloat);
|
||||
def->label = L("Elephant foot compensation");
|
||||
def->label = L("First layer");
|
||||
def->category = L("Advanced");
|
||||
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->cli = "elefant-foot-compensation=f";
|
||||
def->min = 0;
|
||||
def->max = 0;
|
||||
def->default_value = new ConfigOptionFloat(0);
|
||||
|
||||
def = this->add("end_gcode", coString);
|
||||
@ -300,7 +301,7 @@ PrintConfigDef::PrintConfigDef()
|
||||
def->default_value = new ConfigOptionBool(false);
|
||||
|
||||
def = this->add("top_fill_pattern", coEnum);
|
||||
def->label = L("Top fill pattern");
|
||||
def->label = L(" Top");
|
||||
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->cli = "top-fill-pattern|solid-fill-pattern=s";
|
||||
@ -326,7 +327,7 @@ PrintConfigDef::PrintConfigDef()
|
||||
def->default_value = new ConfigOptionEnum<InfillPattern>(ipRectilinear);
|
||||
|
||||
def = this->add("bottom_fill_pattern", coEnum);
|
||||
def->label = L("bottom fill pattern");
|
||||
def->label = L("Bottom");
|
||||
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->cli = "bottom-fill-pattern|solid-fill-pattern=s";
|
||||
@ -344,9 +345,10 @@ PrintConfigDef::PrintConfigDef()
|
||||
def->default_value = new ConfigOptionEnum<InfillPattern>(ipRectilinear);
|
||||
|
||||
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->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->default_value = new ConfigOptionBool(true);
|
||||
|
||||
@ -379,7 +381,7 @@ PrintConfigDef::PrintConfigDef()
|
||||
def->default_value = new ConfigOptionFloatOrPercent(0, false);
|
||||
|
||||
def = this->add("external_perimeter_speed", coFloatOrPercent);
|
||||
def->label = L("External perimeters");
|
||||
def->label = L("External");
|
||||
def->category = L("Speed");
|
||||
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 "
|
||||
@ -657,7 +659,7 @@ PrintConfigDef::PrintConfigDef()
|
||||
def->default_value = new ConfigOptionStrings { "" };
|
||||
|
||||
def = this->add("fill_angle", coFloat);
|
||||
def->label = L("Fill angle");
|
||||
def->label = L("Fill");
|
||||
def->category = L("Infill");
|
||||
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 "
|
||||
@ -678,6 +680,7 @@ PrintConfigDef::PrintConfigDef()
|
||||
def->cli = "fill-density=s";
|
||||
def->min = 0;
|
||||
def->max = 100;
|
||||
/*
|
||||
def->enum_values.push_back("0");
|
||||
def->enum_values.push_back("5");
|
||||
def->enum_values.push_back("10");
|
||||
@ -706,11 +709,38 @@ PrintConfigDef::PrintConfigDef()
|
||||
def->enum_labels.push_back("80%");
|
||||
def->enum_labels.push_back("90%");
|
||||
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 = this->add("fill_pattern", coEnum);
|
||||
def->label = L("Fill pattern");
|
||||
def->category = L("Infill");
|
||||
def->label = L("Inside");
|
||||
def->category = L("Sparse fill pattern");
|
||||
def->tooltip = L("Fill pattern for general low-density infill.");
|
||||
def->cli = "fill-pattern=s";
|
||||
def->enum_keys_map = &ConfigOptionEnum<InfillPattern>::get_enum_values();
|
||||
@ -880,10 +910,10 @@ PrintConfigDef::PrintConfigDef()
|
||||
def->default_value = new ConfigOptionInt(0);
|
||||
|
||||
def = this->add("infill_dense_angle", coFloat);
|
||||
def->label = L("angle");
|
||||
def->label = L("Angle");
|
||||
def->category = L("Infill");
|
||||
def->tooltip = L("Set the Angle of dense infill.");
|
||||
def->sidetext = L("layers");
|
||||
def->sidetext = L("°");
|
||||
def->cli = "infill-dense-angle=i";
|
||||
def->min = 0;
|
||||
def->default_value = new ConfigOptionFloat(0);
|
||||
@ -891,7 +921,7 @@ PrintConfigDef::PrintConfigDef()
|
||||
def = this->add("infill_dense_density", coPercent);
|
||||
def->gui_type = "f_enum_open";
|
||||
def->gui_flags = "show_value";
|
||||
def->label = L("Dense fill density");
|
||||
def->label = L("Density");
|
||||
def->category = L("Infill");
|
||||
def->tooltip = L("Density of the dense internal infill, expressed in the range 0% - 100%.");
|
||||
def->sidetext = L("%");
|
||||
@ -927,7 +957,7 @@ PrintConfigDef::PrintConfigDef()
|
||||
def->default_value = new ConfigOptionPercent(42);
|
||||
|
||||
def = this->add("infill_dense_pattern", coEnum);
|
||||
def->label = L("pattern");
|
||||
def->label = L("Pattern");
|
||||
def->category = L("Sparse fill pattern");
|
||||
def->tooltip = L("Fill pattern for denser-density sparse infill.");
|
||||
def->cli = "dense-fill-pattern=s";
|
||||
@ -1007,7 +1037,7 @@ PrintConfigDef::PrintConfigDef()
|
||||
def->default_value = new ConfigOptionFloatOrPercent(25, true);
|
||||
|
||||
def = this->add("infill_speed", coFloat);
|
||||
def->label = L("Infill");
|
||||
def->label = L("Sparse");
|
||||
def->category = L("Speed");
|
||||
def->tooltip = L("Speed for printing the internal fill. Set to zero for auto.");
|
||||
def->sidetext = L("mm/s");
|
||||
@ -1397,7 +1427,7 @@ PrintConfigDef::PrintConfigDef()
|
||||
def->default_value = new ConfigOptionFloatOrPercent(0, false);
|
||||
|
||||
def = this->add("perimeter_speed", coFloat);
|
||||
def->label = L("Perimeters");
|
||||
def->label = L("Default");
|
||||
def->category = L("Speed");
|
||||
def->tooltip = L("Speed for perimeters (contours, aka vertical shells). Set to zero for auto.");
|
||||
def->sidetext = L("mm/s");
|
||||
@ -1684,7 +1714,7 @@ PrintConfigDef::PrintConfigDef()
|
||||
def->default_value = new ConfigOptionInts { 5 };
|
||||
|
||||
def = this->add("small_perimeter_speed", coFloatOrPercent);
|
||||
def->label = L("Small perimeters");
|
||||
def->label = L("Small");
|
||||
def->category = L("Speed");
|
||||
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 "
|
||||
@ -1735,7 +1765,7 @@ PrintConfigDef::PrintConfigDef()
|
||||
def->default_value = new ConfigOptionFloatOrPercent(0, false);
|
||||
|
||||
def = this->add("solid_infill_speed", coFloatOrPercent);
|
||||
def->label = L("Solid infill");
|
||||
def->label = L("Solid");
|
||||
def->category = L("Speed");
|
||||
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 "
|
||||
@ -1931,7 +1961,7 @@ PrintConfigDef::PrintConfigDef()
|
||||
def->default_value = new ConfigOptionFloat(0);
|
||||
|
||||
def = this->add("support_material_interface_speed", coFloatOrPercent);
|
||||
def->label = L("Support material interface");
|
||||
def->label = L("Interface");
|
||||
def->category = L("Support material");
|
||||
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.");
|
||||
@ -1965,7 +1995,7 @@ PrintConfigDef::PrintConfigDef()
|
||||
def->default_value = new ConfigOptionFloat(2.5);
|
||||
|
||||
def = this->add("support_material_speed", coFloat);
|
||||
def->label = L("Support material");
|
||||
def->label = L("Default");
|
||||
def->category = L("Support material");
|
||||
def->tooltip = L("Speed for printing support material.");
|
||||
def->sidetext = L("mm/s");
|
||||
@ -2056,7 +2086,7 @@ PrintConfigDef::PrintConfigDef()
|
||||
def->default_value = new ConfigOptionFloatOrPercent(0, false);
|
||||
|
||||
def = this->add("top_solid_infill_speed", coFloatOrPercent);
|
||||
def->label = L("Top solid infill");
|
||||
def->label = L("Top solid");
|
||||
def->category = L("Speed");
|
||||
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 "
|
||||
@ -2153,14 +2183,14 @@ PrintConfigDef::PrintConfigDef()
|
||||
140.f, 140.f, 140.f, 140.f, 0.f };
|
||||
|
||||
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->sidetext = L("mm");
|
||||
def->cli = "wipe-tower-x=f";
|
||||
def->default_value = new ConfigOptionFloat(180.);
|
||||
|
||||
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->sidetext = L("mm");
|
||||
def->cli = "wipe-tower-y=f";
|
||||
@ -2206,7 +2236,7 @@ PrintConfigDef::PrintConfigDef()
|
||||
def->default_value = new ConfigOptionFloat(10.);
|
||||
|
||||
def = this->add("xy_size_compensation", coFloat);
|
||||
def->label = L("XY Size Compensation");
|
||||
def->label = L("All layers");
|
||||
def->category = L("Advanced");
|
||||
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 "
|
||||
|
@ -1576,7 +1576,7 @@ end:
|
||||
// Apply size compensation and perform clipping of multi-part objects.
|
||||
float delta = float(scale_(this->config.xy_size_compensation.value));
|
||||
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 clip = this->config.clip_multipart_objects.value || delta > 0.f;
|
||||
if (layer->regions.size() == 1) {
|
||||
|
@ -13,7 +13,7 @@
|
||||
#include <vector>
|
||||
#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_BUILD "UNKNOWN"
|
||||
|
||||
|
@ -53,7 +53,7 @@ AboutDialog::AboutDialog()
|
||||
|
||||
// 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);
|
||||
title_font.SetWeight(wxFONTWEIGHT_BOLD);
|
||||
title_font.SetFamily(wxFONTFAMILY_ROMAN);
|
||||
|
@ -23,6 +23,7 @@
|
||||
namespace Slic3r {
|
||||
namespace GUI {
|
||||
|
||||
#define MAIN_VENDOR "None"
|
||||
|
||||
// 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);
|
||||
const size_t idx = cboxes.size();
|
||||
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;
|
||||
cbox->SetValue(enabled);
|
||||
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) {
|
||||
wxString::Format(_(L("Run %s")), ConfigWizard::name());
|
||||
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())
|
||||
);
|
||||
} else {
|
||||
@ -241,7 +242,8 @@ PageWelcome::PageWelcome(ConfigWizard *parent, bool check_first_variant) :
|
||||
}
|
||||
|
||||
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()) {
|
||||
AppConfig &appconfig_vendors = this->wizard_p()->appconfig_vendors;
|
||||
@ -330,7 +332,7 @@ PageVendors::PageVendors(ConfigWizard *parent) :
|
||||
|
||||
for (const auto vendor_pair : wizard_p()->vendors) {
|
||||
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);
|
||||
picker->Hide();
|
||||
@ -633,8 +635,8 @@ static const std::unordered_map<std::string, std::pair<std::string, std::string>
|
||||
|
||||
void ConfigWizard::priv::load_vendors()
|
||||
{
|
||||
const auto vendor_dir = fs::path(Slic3r::data_dir()) / "vendor";
|
||||
const auto rsrc_vendor_dir = fs::path(resources_dir()) / "profiles";
|
||||
const fs::path vendor_dir = fs::path(Slic3r::data_dir()) / "vendor";
|
||||
const fs::path rsrc_vendor_dir = fs::path(resources_dir()) / "profiles";
|
||||
|
||||
// Load vendors from the "vendors" directory in datadir
|
||||
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 &variant = needle->second.second;
|
||||
appconfig_vendors.set_variant("PrusaResearch", model, variant, true);
|
||||
appconfig_vendors.set_variant(MAIN_VENDOR, model, variant, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -804,6 +804,7 @@ void TabPrint::build()
|
||||
line.append_option(optgroup->get_option("top_solid_layers"));
|
||||
line.append_option(optgroup->get_option("bottom_solid_layers"));
|
||||
optgroup->append_line(line);
|
||||
optgroup->append_single_option_line("enforce_full_fill_volume");
|
||||
|
||||
optgroup = page->new_optgroup(_(L("Quality (slower slicing)")));
|
||||
optgroup->append_single_option_line("extra_perimeters");
|
||||
@ -826,9 +827,10 @@ void TabPrint::build()
|
||||
optgroup = page->new_optgroup(_(L("Infill")));
|
||||
optgroup->append_single_option_line("fill_density");
|
||||
optgroup->append_single_option_line("fill_pattern");
|
||||
optgroup->append_single_option_line("top_fill_pattern");
|
||||
optgroup->append_single_option_line("bottom_fill_pattern");
|
||||
optgroup->append_single_option_line("enforce_full_fill_volume");
|
||||
line = { _(L("Fill external pattern")), "" };
|
||||
line.append_option(optgroup->get_option("top_fill_pattern"));
|
||||
line.append_option(optgroup->get_option("bottom_fill_pattern"));
|
||||
optgroup->append_line(line);
|
||||
|
||||
optgroup = page->new_optgroup(_(L("Reducing printing time")));
|
||||
optgroup->append_single_option_line("infill_every_layers");
|
||||
@ -843,8 +845,10 @@ void TabPrint::build()
|
||||
optgroup = page->new_optgroup(_(L("Advanced")));
|
||||
optgroup->append_single_option_line("solid_infill_every_layers");
|
||||
optgroup->append_single_option_line("solid_infill_below_area");
|
||||
optgroup->append_single_option_line("fill_angle");
|
||||
optgroup->append_single_option_line("bridge_angle");
|
||||
line = { _(L("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.append_option(optgroup->get_option("external_infill_margin"));
|
||||
line.append_option(optgroup->get_option("bridged_infill_margin"));
|
||||
@ -888,14 +892,20 @@ void TabPrint::build()
|
||||
|
||||
page = add_options_page(_(L("Speed")), "time.png");
|
||||
optgroup = page->new_optgroup(_(L("Speed for print moves")));
|
||||
optgroup->append_single_option_line("perimeter_speed");
|
||||
optgroup->append_single_option_line("small_perimeter_speed");
|
||||
optgroup->append_single_option_line("external_perimeter_speed");
|
||||
optgroup->append_single_option_line("infill_speed");
|
||||
optgroup->append_single_option_line("solid_infill_speed");
|
||||
optgroup->append_single_option_line("top_solid_infill_speed");
|
||||
optgroup->append_single_option_line("support_material_speed");
|
||||
optgroup->append_single_option_line("support_material_interface_speed");
|
||||
line = { _(L("Perimeter speed")), "" };
|
||||
line.append_option(optgroup->get_option("perimeter_speed"));
|
||||
line.append_option(optgroup->get_option("external_perimeter_speed"));
|
||||
line.append_option(optgroup->get_option("small_perimeter_speed"));
|
||||
optgroup->append_line(line);
|
||||
line = { _(L("Infill speed")), "" };
|
||||
line.append_option(optgroup->get_option("infill_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("gap_fill_speed");
|
||||
|
||||
@ -932,8 +942,10 @@ void TabPrint::build()
|
||||
|
||||
optgroup = page->new_optgroup(_(L("Wipe tower")));
|
||||
optgroup->append_single_option_line("wipe_tower");
|
||||
optgroup->append_single_option_line("wipe_tower_x");
|
||||
optgroup->append_single_option_line("wipe_tower_y");
|
||||
line = { _(L("Wipe tower position")), "" };
|
||||
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_rotation_angle");
|
||||
optgroup->append_single_option_line("wipe_tower_bridging");
|
||||
@ -956,13 +968,17 @@ void TabPrint::build()
|
||||
optgroup->append_single_option_line("infill_overlap");
|
||||
|
||||
optgroup = page->new_optgroup(_(L("Flow")));
|
||||
optgroup->append_single_option_line("bridge_flow_ratio");
|
||||
optgroup->append_single_option_line("over_bridge_flow_ratio");
|
||||
line = { _(L("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->append_single_option_line("clip_multipart_objects");
|
||||
optgroup->append_single_option_line("elefant_foot_compensation");
|
||||
optgroup->append_single_option_line("xy_size_compensation");
|
||||
line = { _(L("XY 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("resolution");
|
||||
|
||||
|