mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-24 23:23:59 -06:00
Merge branch 'feature/wall_order' into SF
This commit is contained in:
commit
417c56ee3b
11 changed files with 80 additions and 18 deletions
26
README.md
26
README.md
|
@ -7,6 +7,25 @@ You can download it here: https://github.com/SoftFever/BambuStudio-SoftFever/rel
|
|||
|
||||
## BambuStudio SoftFever change notes:
|
||||
|
||||
### [V1.3.3 changes](https://github.com/SoftFever/BambuStudio-SoftFever/releases/tag/v1.3.3):
|
||||
1. Improve top surface quality.
|
||||
Fix a bug that internal solid infills didn't use monotonic when top surface is using monotonic lines
|
||||
2. New feature: filter out tiny gaps.
|
||||
Note: for aesthetic considerations, this setting won't affect top/bottom layers. In other words, gap fills that can be seen from outside won't be filtered out
|
||||
3. PA(pressure advance) now support multi-color printing. A new PA value from the selected filament profile will be applied whenever there is
|
||||
a filament/extruder change action. This change only affects multi-color printing.
|
||||
5. Users can now set float values of layer time in Filament->Cooling tab.
|
||||
6. Allow to set target bed temp to 0
|
||||
7. Fix a bug that layer number is not displayed correctly in klipper UIs
|
||||
8. Force using linear PA model when manual PA override is enabled for Bambu machines
|
||||
9. Remember the last used filament
|
||||
10. Skip checking BL network plugin for third-party printers.
|
||||
### [V1.3.2 changes](https://github.com/SoftFever/BambuStudio-SoftFever/releases/tag/v1.3.2-sf):
|
||||
1. Support device control view for 3rd party printers
|
||||
2. Port `Small perimeters` feature from PrusaSlicer. I also add an extra option to adjust the small perimeter threshold
|
||||
You might want to reduce speed for small perimeter parts to prevent failures like bellow:
|
||||
3. Add fan speed preview mode
|
||||
4. Fix an issue that print time estimation is inaccurate when `Klipper` g-code style is used.
|
||||
### [V1.3.1 changes](https://github.com/SoftFever/BambuStudio-SoftFever/releases/tag/v1.3.1-sf):
|
||||
1. Support change bed size and nozzle diameter
|
||||
2. Allow users to specify the bridge infill direction
|
||||
|
@ -56,11 +75,14 @@ You can download it here: https://github.com/SoftFever/BambuStudio-SoftFever/rel
|
|||
Demo video: https://youtu.be/vSNE9iGj2II
|
||||
|
||||
## NOTE:
|
||||
## - If you have troubles to run the build, you might need to install following runtimes:
|
||||
## 1. For Apple M1 users, please take a look at this [article](https://www.howtogeek.com/803598/app-is-damaged-and-cant-be-opened/ ) about how to run unsigned applications on your machine. Or better, you can build it from the source codes if you want:)
|
||||
Apple requires a subscription(costs 99$ yearly) for developers to sign their app. I don't do a lot of dev work on Mac, and this is a nonprofit open-source project, so I decided not to pay the money ;)
|
||||
|
||||
## 2. If you have troubles to run the build, you might need to install following runtimes:
|
||||
- [MicrosoftEdgeWebView2RuntimeInstallerX64](https://github.com/SoftFever/BambuStudio-SoftFever/releases/download/v1.0.10-sf2/MicrosoftEdgeWebView2RuntimeInstallerX64.exe)
|
||||
- [vcredist2019_x64](https://github.com/SoftFever/BambuStudio-SoftFever/releases/download/v1.0.10-sf2/vcredist2019_x64.exe)
|
||||
|
||||
## - BambuStudio use G2/G3 commands by default. You need to turn on ARC support in your printer's firmware use with this slicer.
|
||||
## 3. BambuStudio use G2/G3 commands by default. You need to turn on ARC support in your printer's firmware use with this slicer.
|
||||
- For Voron and any Klipper based printers:
|
||||
You can enable gcode_arcs(G2/G3) support by adding following section into you printer.cfg file:
|
||||
```
|
||||
|
|
|
@ -5519,6 +5519,9 @@ msgstr "内圈墙/外圈墙/填充的打印顺序"
|
|||
msgid "inner/outer/infill"
|
||||
msgstr "内墙/外墙/填充"
|
||||
|
||||
msgid "inner-outer-inner/infill"
|
||||
msgstr "内墙/外墙/内墙/填充"
|
||||
|
||||
msgid "outer/inner/infill"
|
||||
msgstr "外墙/内墙/填充"
|
||||
|
||||
|
|
Binary file not shown.
|
@ -1150,7 +1150,7 @@ ConfigSubstitutions ConfigBase::load_from_gcode_file(const std::string &file, Fo
|
|||
bool end_found = false;
|
||||
std::string line;
|
||||
while (std::getline(ifs, line))
|
||||
if (line == "; CONFIG_BLOCK_START") {
|
||||
if (line.rfind("; CONFIG_BLOCK_START",0)==0) {
|
||||
begin_found = true;
|
||||
break;
|
||||
}
|
||||
|
@ -1160,7 +1160,7 @@ ConfigSubstitutions ConfigBase::load_from_gcode_file(const std::string &file, Fo
|
|||
}
|
||||
std::string key, value;
|
||||
while (std::getline(ifs, line)) {
|
||||
if (line == "; CONFIG_BLOCK_END") {
|
||||
if (line.rfind("; CONFIG_BLOCK_END",0)==0) {
|
||||
end_found = true;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -1306,6 +1306,8 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato
|
|||
#if ENABLE_GCODE_VIEWER_DATA_CHECKING
|
||||
m_last_mm3_per_mm = 0.;
|
||||
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
|
||||
|
||||
m_writer.set_is_bbl_machine(is_bbl_printers);
|
||||
|
||||
// How many times will be change_layer() called?
|
||||
// change_layer() in turn increments the progress bar status.
|
||||
|
@ -3302,7 +3304,8 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, dou
|
|||
if (!m_config.spiral_mode && description == "perimeter") {
|
||||
assert(m_layer != nullptr);
|
||||
bool is_outer_wall_first = m_config.wall_infill_order == WallInfillOrder::OuterInnerInfill
|
||||
|| m_config.wall_infill_order == WallInfillOrder::InfillOuterInner;
|
||||
|| m_config.wall_infill_order == WallInfillOrder::InfillOuterInner
|
||||
|| m_config.wall_infill_order == WallInfillOrder::InnerOuterInnerInfill;
|
||||
m_seam_placer.place_seam(m_layer, loop, is_outer_wall_first, this->last_pos());
|
||||
} else
|
||||
loop.split_at(last_pos, false);
|
||||
|
|
|
@ -214,12 +214,16 @@ std::string GCodeWriter::set_pressure_advance(double pa) const
|
|||
std::ostringstream gcode;
|
||||
if (pa < 0)
|
||||
return gcode.str();
|
||||
|
||||
if (FLAVOR_IS(gcfKlipper))
|
||||
gcode << "SET_PRESSURE_ADVANCE ADVANCE=" << std::setprecision(4) << pa << "; Override pressure advance value\n";
|
||||
else
|
||||
gcode << "M900 K" <<std::setprecision(4)<< pa << "; Override pressure advance value\n";
|
||||
|
||||
if(m_is_bbl_printers){
|
||||
//SoftFever: set L1000 to use linear model
|
||||
gcode << "M900 K" <<std::setprecision(4)<< pa << " L1000 M10 ; Override pressure advance value\n";
|
||||
}
|
||||
else{
|
||||
if (FLAVOR_IS(gcfKlipper))
|
||||
gcode << "SET_PRESSURE_ADVANCE ADVANCE=" << std::setprecision(4) << pa << "; Override pressure advance value\n";
|
||||
else
|
||||
gcode << "M900 K" <<std::setprecision(4)<< pa << "; Override pressure advance value\n";
|
||||
}
|
||||
return gcode.str();
|
||||
}
|
||||
|
||||
|
|
|
@ -91,6 +91,10 @@ public:
|
|||
bool is_current_position_clear() const { return m_is_current_pos_clear; };
|
||||
//BBS:
|
||||
static const bool full_gcode_comment;
|
||||
|
||||
//SoftFever
|
||||
void set_is_bbl_machine(bool bval) {m_is_bbl_printers = bval;}
|
||||
const bool is_bbl_printers() const {return m_is_bbl_printers;}
|
||||
|
||||
private:
|
||||
// Extruders are sorted by their ID, so that binary search is possible.
|
||||
|
@ -129,7 +133,10 @@ private:
|
|||
|
||||
//Radian threshold of slope for lazy lift and spiral lift;
|
||||
static const double slope_threshold;
|
||||
|
||||
|
||||
//SoftFever
|
||||
bool m_is_bbl_printers = false;
|
||||
|
||||
std::string _travel_to_z(double z, const std::string &comment);
|
||||
std::string _spiral_travel_to_z(double z, const Vec2d &ij_offset, const std::string &comment);
|
||||
std::string _retract(double length, double restart_extra, const std::string &comment);
|
||||
|
|
|
@ -667,18 +667,37 @@ void PerimeterGenerator::process()
|
|||
}
|
||||
// at this point, all loops should be in contours[0]
|
||||
ExtrusionEntityCollection entities = traverse_loops(*this, contours.front(), thin_walls);
|
||||
|
||||
// if brim will be printed, reverse the order of perimeters so that
|
||||
// we continue inwards after having finished the brim
|
||||
// TODO: add test for perimeter order
|
||||
bool is_outer_wall_first =
|
||||
bool is_outer_wall_first =
|
||||
this->print_config->wall_infill_order == WallInfillOrder::OuterInnerInfill ||
|
||||
this->print_config->wall_infill_order == WallInfillOrder::InfillOuterInner;
|
||||
this->print_config->wall_infill_order == WallInfillOrder::InfillOuterInner ||
|
||||
this->print_config->wall_infill_order == WallInfillOrder::InnerOuterInnerInfill;
|
||||
if (is_outer_wall_first ||
|
||||
//BBS: always print outer wall first when there indeed has brim.
|
||||
(this->layer_id == 0 &&
|
||||
this->object_config->brim_type == BrimType::btOuterOnly &&
|
||||
this->object_config->brim_width.value > 0))
|
||||
entities.reverse();
|
||||
this->object_config->brim_type == BrimType::btOuterOnly &&
|
||||
this->object_config->brim_width.value > 0))
|
||||
{
|
||||
if (this->print_config->wall_infill_order == WallInfillOrder::InnerOuterInnerInfill) {
|
||||
if (entities.entities.size() > 1) {
|
||||
std::vector<int> extPs;
|
||||
for (int i = 0; i < entities.entities.size(); ++i) {
|
||||
if (entities.entities[i]->role() == erExternalPerimeter)
|
||||
extPs.push_back(i);
|
||||
}
|
||||
for (int i = 0; i < extPs.size(); ++i) {
|
||||
if (extPs[i] == 0 || (i > 0 && extPs[i] - 1 == extPs[i - 1]))
|
||||
continue;
|
||||
std::swap(entities.entities[extPs[i]], entities.entities[extPs[i] - 1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
entities.reverse();
|
||||
}
|
||||
// append perimeters for this slice as a collection
|
||||
if (! entities.empty())
|
||||
this->loops->append(entities);
|
||||
|
|
|
@ -159,6 +159,7 @@ CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(IroningType)
|
|||
static t_config_enum_values s_keys_map_WallInfillOrder {
|
||||
{ "inner wall/outer wall/infill", int(WallInfillOrder::InnerOuterInfill) },
|
||||
{ "outer wall/inner wall/infill", int(WallInfillOrder::OuterInnerInfill) },
|
||||
{ "inner-outer-inner wall/infill", int(WallInfillOrder::InnerOuterInnerInfill) },
|
||||
{ "infill/inner wall/outer wall", int(WallInfillOrder::InfillInnerOuter) },
|
||||
{ "infill/outer wall/inner wall", int(WallInfillOrder::InfillOuterInner) }
|
||||
};
|
||||
|
@ -1000,10 +1001,12 @@ void PrintConfigDef::init_fff_params()
|
|||
def->enum_values.push_back("outer wall/inner wall/infill");
|
||||
def->enum_values.push_back("infill/inner wall/outer wall");
|
||||
def->enum_values.push_back("infill/outer wall/inner wall");
|
||||
def->enum_values.push_back("inner-outer-inner wall/infill");
|
||||
def->enum_labels.push_back(L("inner/outer/infill"));
|
||||
def->enum_labels.push_back(L("outer/inner/infill"));
|
||||
def->enum_labels.push_back(L("infill/inner/outer"));
|
||||
def->enum_labels.push_back(L("infill/outer/inner"));
|
||||
def->enum_labels.push_back(L("inner-outer-inner/infill"));
|
||||
def->mode = comAdvanced;
|
||||
def->set_default_value(new ConfigOptionEnum<WallInfillOrder>(WallInfillOrder::InnerOuterInfill));
|
||||
|
||||
|
|
|
@ -75,6 +75,7 @@ enum class WallInfillOrder {
|
|||
OuterInnerInfill,
|
||||
InfillInnerOuter,
|
||||
InfillOuterInner,
|
||||
InnerOuterInnerInfill,
|
||||
Count,
|
||||
};
|
||||
//BBS
|
||||
|
|
|
@ -11,4 +11,4 @@ if(NOT DEFINED BBL_INTERNAL_TESTING)
|
|||
set(BBL_INTERNAL_TESTING "1")
|
||||
endif()
|
||||
set(SLIC3R_VERSION "01.03.00.25")
|
||||
set(SoftFever_VERSION "1.3.3 beta3")
|
||||
set(SoftFever_VERSION "1.3.3")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue