diff options
23 files changed, 178 insertions, 117 deletions
@@ -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 diff --git a/lib/Slic3r.pm b/lib/Slic3r.pm index 0c6c81bb5..72164859e 100644 --- a/lib/Slic3r.pm +++ b/lib/Slic3r.pm @@ -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); diff --git a/lib/Slic3r/GUI.pm b/lib/Slic3r/GUI.pm index 483fd36f9..2340d8731 100644 --- a/lib/Slic3r/GUI.pm +++ b/lib/Slic3r/GUI.pm @@ -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. diff --git a/lib/Slic3r/GUI/MainFrame.pm b/lib/Slic3r/GUI/MainFrame.pm index 77d7956c9..23e7b6bf5 100644 --- a/lib/Slic3r/GUI/MainFrame.pm +++ b/lib/Slic3r/GUI/MainFrame.pm @@ -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; diff --git a/lib/Slic3r/GUI/SystemInfo.pm b/lib/Slic3r/GUI/SystemInfo.pm index 717ff12e5..e26248e2d 100644 --- a/lib/Slic3r/GUI/SystemInfo.pm +++ b/lib/Slic3r/GUI/SystemInfo.pm @@ -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}; diff --git a/resources/icons/Slic3r-console.ico b/resources/icons/Slic3r-console.ico Binary files differindex 64e818340..7d168c874 100644 --- a/resources/icons/Slic3r-console.ico +++ b/resources/icons/Slic3r-console.ico diff --git a/resources/icons/Slic3r.ico b/resources/icons/Slic3r.ico Binary files differindex 5765f77d2..9a92bb103 100644 --- a/resources/icons/Slic3r.ico +++ b/resources/icons/Slic3r.ico diff --git a/resources/icons/Slic3r.png b/resources/icons/Slic3r.png Binary files differindex 896cc4460..d480dc881 100644 --- a/resources/icons/Slic3r.png +++ b/resources/icons/Slic3r.png diff --git a/resources/icons/Slic3r_128px.png b/resources/icons/Slic3r_128px.png Binary files differindex e8b2e3e3e..006e95f51 100644 --- a/resources/icons/Slic3r_128px.png +++ b/resources/icons/Slic3r_128px.png diff --git a/resources/icons/Slic3r_192px.png b/resources/icons/Slic3r_192px.png Binary files differindex 9af2bfc74..2e08916fc 100644 --- a/resources/icons/Slic3r_192px.png +++ b/resources/icons/Slic3r_192px.png diff --git a/resources/icons/Slic3r_192px_transparent.png b/resources/icons/Slic3r_192px_transparent.png Binary files differindex f85c835b3..8b7165a60 100644 --- a/resources/icons/Slic3r_192px_transparent.png +++ b/resources/icons/Slic3r_192px_transparent.png diff --git a/xs/src/libslic3r/BridgeDetector.cpp b/xs/src/libslic3r/BridgeDetector.cpp index 663b7ceb0..ac20be5c5 100644 --- a/xs/src/libslic3r/BridgeDetector.cpp +++ b/xs/src/libslic3r/BridgeDetector.cpp @@ -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; diff --git a/xs/src/libslic3r/BridgeDetector.hpp b/xs/src/libslic3r/BridgeDetector.hpp index 8c55555e1..0c08546ac 100644 --- a/xs/src/libslic3r/BridgeDetector.hpp +++ b/xs/src/libslic3r/BridgeDetector.hpp @@ -53,6 +53,7 @@ private: double angle; double coverage; double max_length; + double mean_length; }; public: // Get possible briging direction candidates. diff --git a/xs/src/libslic3r/Fill/FillGyroid.hpp b/xs/src/libslic3r/Fill/FillGyroid.hpp index 17924b5ab..9c3cef940 100644 --- a/xs/src/libslic3r/Fill/FillGyroid.hpp +++ b/xs/src/libslic3r/Fill/FillGyroid.hpp @@ -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( diff --git a/xs/src/libslic3r/GCode/WipeTowerPrusaMM.cpp b/xs/src/libslic3r/GCode/WipeTowerPrusaMM.cpp index f466fc4f6..05ccc0b35 100644 --- a/xs/src/libslic3r/GCode/WipeTowerPrusaMM.cpp +++ b/xs/src/libslic3r/GCode/WipeTowerPrusaMM.cpp @@ -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. diff --git a/xs/src/libslic3r/GCode/WipeTowerPrusaMM.hpp b/xs/src/libslic3r/GCode/WipeTowerPrusaMM.hpp index 1ae4616d8..ad158397e 100644 --- a/xs/src/libslic3r/GCode/WipeTowerPrusaMM.hpp +++ b/xs/src/libslic3r/GCode/WipeTowerPrusaMM.hpp @@ -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() {} @@ -204,7 +205,8 @@ private: float m_bridging = 0.f; 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. diff --git a/xs/src/libslic3r/Print.cpp b/xs/src/libslic3r/Print.cpp index 029da33b6..b832ba465 100644 --- a/xs/src/libslic3r/Print.cpp +++ b/xs/src/libslic3r/Print.cpp @@ -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(); diff --git a/xs/src/libslic3r/PrintConfig.cpp b/xs/src/libslic3r/PrintConfig.cpp index ee3abca21..bb587a74a 100644 --- a/xs/src/libslic3r/PrintConfig.cpp +++ b/xs/src/libslic3r/PrintConfig.cpp @@ -68,7 +68,7 @@ PrintConfigDef::PrintConfigDef() def->default_value = new ConfigOptionString(""); def = this->add("bottom_solid_layers", coInt); - def->label = L("Bottom"); + def->label = L(" Bottom"); def->category = L("Layers and Perimeters"); def->tooltip = L("Number of solid layers to generate on bottom surfaces."); def->cli = "bottom-solid-layers=i"; @@ -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 " diff --git a/xs/src/libslic3r/PrintObject.cpp b/xs/src/libslic3r/PrintObject.cpp index 8200827ee..575c030fd 100644 --- a/xs/src/libslic3r/PrintObject.cpp +++ b/xs/src/libslic3r/PrintObject.cpp @@ -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) { diff --git a/xs/src/libslic3r/libslic3r.h b/xs/src/libslic3r/libslic3r.h index 1f8856837..5def84b1a 100644 --- a/xs/src/libslic3r/libslic3r.h +++ b/xs/src/libslic3r/libslic3r.h @@ -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" diff --git a/xs/src/slic3r/GUI/AboutDialog.cpp b/xs/src/slic3r/GUI/AboutDialog.cpp index 0fed8d175..e6e061990 100644 --- a/xs/src/slic3r/GUI/AboutDialog.cpp +++ b/xs/src/slic3r/GUI/AboutDialog.cpp @@ -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); diff --git a/xs/src/slic3r/GUI/ConfigWizard.cpp b/xs/src/slic3r/GUI/ConfigWizard.cpp index 9f736ded8..e5fe7c0a2 100644 --- a/xs/src/slic3r/GUI/ConfigWizard.cpp +++ b/xs/src/slic3r/GUI/ConfigWizard.cpp @@ -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); } } } diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index b21678e9f..7ab0262de 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -456,11 +456,11 @@ void Tab::update_changed_tree_ui() } if (title == _("Dependencies")){ 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 { sys_page = m_presets->get_selected_preset_parent() ? true:false; modified_page = false; - } + } } for (auto group : page->m_optgroups) { @@ -803,7 +803,8 @@ void TabPrint::build() line = { _(L("Solid layers")), "" }; line.append_option(optgroup->get_option("top_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->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("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->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"); + optgroup->append_single_option_line("fill_density"); + optgroup->append_single_option_line("fill_pattern"); + 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"); @@ -840,17 +842,19 @@ void TabPrint::build() line.append_option(optgroup->get_option("infill_dense_angle")); optgroup->append_line(line); - 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"); + optgroup = page->new_optgroup(_(L("Advanced"))); + optgroup->append_single_option_line("solid_infill_every_layers"); + optgroup->append_single_option_line("solid_infill_below_area"); + 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")); optgroup->append_line(line); - optgroup->append_single_option_line("only_retract_when_crossing_perimeters"); - optgroup->append_single_option_line("infill_first"); + optgroup->append_single_option_line("only_retract_when_crossing_perimeters"); + optgroup->append_single_option_line("infill_first"); page = add_options_page(_(L("Skirt and brim")), "box.png"); optgroup = page->new_optgroup(_(L("Skirt"))); @@ -887,15 +891,21 @@ void TabPrint::build() optgroup->append_single_option_line("support_material_synchronize_layers"); 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"); + optgroup = page->new_optgroup(_(L("Speed for print moves"))); + 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"); @@ -931,9 +941,11 @@ void TabPrint::build() optgroup->append_single_option_line("standby_temperature_delta"); 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"); + optgroup->append_single_option_line("wipe_tower"); + 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"); @@ -955,14 +967,18 @@ void TabPrint::build() optgroup = page->new_optgroup(_(L("Overlap"))); 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"); + optgroup = page->new_optgroup(_(L("Flow"))); + 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"); + optgroup->append_single_option_line("clip_multipart_objects"); + 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"); @@ -2065,7 +2081,7 @@ void Tab::rebuild_page_tree() m_treectrl->SetItemTextColour(itemId, p->get_item_colour()); 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 - m_disable_tree_sel_changed_event = 1; + m_disable_tree_sel_changed_event = 1; m_treectrl->SelectItem(itemId); m_disable_tree_sel_changed_event = 0; have_selection = 1; |