Merge branch 'stable'

This commit is contained in:
supermerill 2020-03-22 15:20:33 +01:00
commit 1bf9afbd80
11 changed files with 119 additions and 61 deletions

View File

@ -13,7 +13,9 @@ jobs:
steps:
- uses: actions/checkout@v1
- name: change date in version
run: sed "s/+UNKNOWN/_$(date '+%F')/" version.inc
run: |
sed "s/+UNKNOWN/_$(date '+%F')/" version.inc > version.date.inc
mv version.date.inc version.inc
- name: mkdir in deps
run: mkdir deps/build
- name: cmake deps
@ -33,6 +35,9 @@ jobs:
- name: make slic3r
working-directory: ./build
run: make slic3r
- name: update Info.plist
working-directory: ./build/src
run: sed "s/+UNKNOWN/_$(date '+%F')/" Info.plist >Info.date.plist
- name: create directory and copy into it
working-directory: ./build
run: |
@ -46,14 +51,22 @@ jobs:
working-directory: ./build
run: |
cp -Rf ../resources Slic3r++/Slic3r++.app/Contents/resources
cp Slic3r++/Slic3r++.app/Contents/resources/icons/slic3r.icns Slic3r++/Slic3r++.app/Contents/resources/slic3r.icns
cp src/Info.plist Slic3r++/Slic3r++.app/Contents/Info.plist
echo -n -e '\xff\xfeAPPL\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x0a\x00' > PkgInfo
cp Slic3r++/Slic3r++.app/Contents/resources/icons/slic3r.icns Slic3r++/Slic3r++.app/Contents/resources/Slic3r.icns
cp src/Info.date.plist Slic3r++/Slic3r++.app/Contents/Info.plist
echo -n -e 'APPL????\x0a' > PkgInfo
cp PkgInfo Slic3r++/Slic3r++.app/Contents/PkgInfo
# echo -n -e '\xff\xfeAPPL\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x0a\x00' > PkgInfo
- name: copy bin
working-directory: ./build
run: |
cp -f src/slic3r++ Slic3r++/Slic3r++.app/Contents/MacOS/slic3r++
chmod 777 Slic3r++/Slic3r++.app/Contents/MacOS/slic3r++
chmod u+x Slic3r++/Slic3r++.app/Contents/MacOS/slic3r++
tar -cvf slic3r++.tar Slic3r++
- name: create dmg
working-directory: ./build
run: |
hdiutil create -ov -fs HFS+ -volname "Slic3r++" -srcfolder "Slic3r++" temp.dmg
hdiutil convert temp.dmg -format UDZO -o Slic3r++.dmg
# - name: signing resources (creating CodeResources inside _CodeSignature)
# working-directory: .
# run: codesign -s <identity> resources
@ -61,5 +74,10 @@ jobs:
- name: Upload artifact
uses: actions/upload-artifact@v1.0.0
with:
name: nightly_macos
path: build/Slic3r++/
name: nightly_macos.tar
path: build/slic3r++.tar
- name: Upload artifact
uses: actions/upload-artifact@v1.0.0
with:
name: nightly_macos.dmg
path: build/Slic3r++.dmg

View File

@ -14,8 +14,12 @@ jobs:
- uses: actions/checkout@v1
- name: change date in version
run: sed -i "s/+UNKNOWN/_$(date '+%F')/" version.inc
- name: update clock
run: sudo hwclock -s
- name: update apt
run: sudo apt update
- name: install gtk2 glew
run: sudo apt-get install libgtk2.0-dev libglew-dev libudev-dev
run: sudo apt install libgtk2.0-dev libglew-dev libudev-dev
- name: mkdir in deps
run: mkdir deps/build
- name: cmake deps
@ -48,9 +52,12 @@ jobs:
run: cp -f src/slic3r++ package/bin/slic3r++
- name: create sh from echo
working-directory: ./build/package
run: echo -e '#!/bin/bash\nDIR=$(readlink -f "$0" | xargs dirname)\nexport LD_LIBRARY_PATH="$DIR/bin"\nexec "$DIR/bin/slic3r++" "$@"' >slic3r++
run: |
echo -e '#!/bin/bash\nDIR=$(readlink -f "$0" | xargs dirname)\nexport LD_LIBRARY_PATH="$DIR/bin"\nexec "$DIR/bin/slic3r++" "$@"' >slic3r++
chmod u+x slic3r++
tar -cvf ../slic3r++.tar .
- name: Upload artifact
uses: actions/upload-artifact@v1.0.0
with:
name: nightly_linux
path: build/package/
name: nightly_linux.tar
path: build/slic3r++.tar

View File

@ -38,7 +38,7 @@ namespace Slic3r {
else params_modifided.flow_mult *= (float)percentFlow[idx];
//choose if we are going to extrude with or without overlap
if ((params.flow->bridge && idx == 0) || has_overlap[idx]){
if ((params.flow->bridge && idx == 0) || has_overlap[idx] || this->no_overlap_expolygons.empty()){
this->fill_expolygon(idx, *eec, srf_source, params_modifided, volume);
}
else{
@ -90,12 +90,12 @@ namespace Slic3r {
good_role = params.flow->bridge && idx == 0 ? erBridgeInfill : rolePass[idx];
}
// print
float mult_flow = (params.fill_exactly /*&& idx == 0*/ ? std::min(2., volume / extrudedVolume) : 1);
float mult_flow = float(params.fill_exactly /*&& idx == 0*/ ? std::min(2., volume / extrudedVolume) : 1);
extrusion_entities_append_paths(
eec.entities, std::move(polylines_layer),
good_role,
params.flow->mm3_per_mm() * params.flow_mult * mult_flow,
//min-reduced flow width for a better view (it's only a gui thing)
//min-reduced flow width for a better view (it's mostly a gui thing, but some support code can want to mess with it)
(float)(params.flow->width * (params.flow_mult* mult_flow < 0.1 ? 0.1 : params.flow_mult * mult_flow)), (float)params.flow->height);
}
}
@ -121,6 +121,9 @@ namespace Slic3r {
//extruded volume: see http://manual.slic3r.org/advanced/flow-math, and we need to remove a circle at an end (as the flow continue)
volumeToOccupy += poylineVolume;
}
if (this->no_overlap_expolygons.empty()) {
volumeToOccupy = unscaled(unscaled(surface->area())) * params.flow->height;
}
//create root node
ExtrusionEntityCollection *eecroot = new ExtrusionEntityCollection();

View File

@ -333,7 +333,13 @@ std::string WipeTowerIntegration::append_tcr(GCode &gcodegen, const WipeTower::T
unsigned int old_extruder_id = gcodegen.writer().extruder()->id();
const std::string &end_filament_gcode = gcodegen.config().end_filament_gcode.get_at(old_extruder_id);
if (gcodegen.writer().extruder() != nullptr && ! end_filament_gcode.empty()) {
end_filament_gcode_str = gcodegen.placeholder_parser_process("end_filament_gcode", end_filament_gcode, old_extruder_id);
DynamicConfig config;
int previous_extruder_id = gcodegen.writer().extruder() ? (int)gcodegen.writer().extruder()->id() : -1;
config.set_key_value("previous_extruder", new ConfigOptionInt(previous_extruder_id));
config.set_key_value("next_extruder", new ConfigOptionInt((int)new_extruder_id));
config.set_key_value("layer_num", new ConfigOptionInt(gcodegen.m_layer_index));
config.set_key_value("layer_z", new ConfigOptionFloat(tcr.print_z));
end_filament_gcode_str = gcodegen.placeholder_parser_process("end_filament_gcode", end_filament_gcode, old_extruder_id, &config);
check_add_eol(end_filament_gcode_str);
}
}
@ -373,6 +379,10 @@ std::string WipeTowerIntegration::append_tcr(GCode &gcodegen, const WipeTower::T
// Process the start_filament_gcode for the active filament only.
DynamicConfig config;
config.set_key_value("filament_extruder_id", new ConfigOptionInt(new_extruder_id));
config.set_key_value("previous_extruder", new ConfigOptionInt(gcodegen.writer().extruder() ? (int)gcodegen.writer().extruder()->id() : -1));
config.set_key_value("next_extruder", new ConfigOptionInt(new_extruder_id));
config.set_key_value("layer_num", new ConfigOptionInt(0));
config.set_key_value("layer_z", new ConfigOptionFloat(z));
start_filament_gcode_str = gcodegen.placeholder_parser_process("start_filament_gcode", start_filament_gcode, new_extruder_id, &config);
check_add_eol(start_filament_gcode_str);
}
@ -1431,6 +1441,8 @@ void GCode::_do_export(Print &print, FILE *file)
for (const std::string &end_gcode : print.config().end_filament_gcode.values) {
int extruder_id = (unsigned int)(&end_gcode - &print.config().end_filament_gcode.values.front());
config.set_key_value("filament_extruder_id", new ConfigOptionInt(extruder_id));
config.set_key_value("previous_extruder", new ConfigOptionInt(extruder_id));
config.set_key_value("next_extruder", new ConfigOptionInt(0));
_writeln(file, this->placeholder_parser_process("end_filament_gcode", end_gcode, extruder_id, &config));
}
}
@ -2920,7 +2932,7 @@ std::string GCode::extrude_loop(const ExtrusionLoop &original_loop, const std::s
//but not for the first layer
&& this->m_layer->id() > 0
//exclude if min_layer_height * 2 > layer_height (increase from 2 to 3 because it's working but uses in-between)
&& this->m_layer->height < EXTRUDER_CONFIG(min_layer_height) * 3
&& this->m_layer->height >= EXTRUDER_CONFIG(min_layer_height) * 2
) {
return extrude_loop_vase(original_loop, description, speed, lower_layer_edge_grid);
@ -3585,8 +3597,13 @@ std::string GCode::set_extruder(unsigned int extruder_id, double print_z)
// Append the filament start G-code.
const std::string &start_filament_gcode = m_config.start_filament_gcode.get_at(extruder_id);
if (! start_filament_gcode.empty()) {
// Process the start_filament_gcode for the filament.
gcode += this->placeholder_parser_process("start_filament_gcode", start_filament_gcode, extruder_id);
DynamicConfig config;
config.set_key_value("previous_extruder", new ConfigOptionInt((int)extruder_id));
config.set_key_value("next_extruder", new ConfigOptionInt((int)extruder_id));
config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index));
config.set_key_value("layer_z", new ConfigOptionFloat(print_z));
// Process the start_filament_gcode for the new filament.
gcode += this->placeholder_parser_process("start_filament_gcode", start_filament_gcode, extruder_id, &config);
check_add_eol(gcode);
}
gcode += m_writer.toolchange(extruder_id);
@ -3605,7 +3622,12 @@ std::string GCode::set_extruder(unsigned int extruder_id, double print_z)
unsigned int old_extruder_id = m_writer.extruder()->id();
const std::string &end_filament_gcode = m_config.end_filament_gcode.get_at(old_extruder_id);
if (! end_filament_gcode.empty()) {
gcode += placeholder_parser_process("end_filament_gcode", end_filament_gcode, old_extruder_id);
DynamicConfig config;
config.set_key_value("previous_extruder", new ConfigOptionInt((int)(m_writer.extruder() != nullptr ? m_writer.extruder()->id() : -1)));
config.set_key_value("next_extruder", new ConfigOptionInt((int)extruder_id));
config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index));
config.set_key_value("layer_z", new ConfigOptionFloat(print_z));
gcode += placeholder_parser_process("end_filament_gcode", end_filament_gcode, old_extruder_id, &config);
check_add_eol(gcode);
}
}
@ -3652,8 +3674,13 @@ std::string GCode::set_extruder(unsigned int extruder_id, double print_z)
// Append the filament start G-code.
const std::string &start_filament_gcode = m_config.start_filament_gcode.get_at(extruder_id);
if (! start_filament_gcode.empty()) {
DynamicConfig config;
config.set_key_value("previous_extruder", new ConfigOptionInt((int)(m_writer.extruder() != nullptr ? m_writer.extruder()->id() : -1)));
config.set_key_value("next_extruder", new ConfigOptionInt((int)extruder_id));
config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index));
config.set_key_value("layer_z", new ConfigOptionFloat(print_z));
// Process the start_filament_gcode for the new filament.
gcode += this->placeholder_parser_process("start_filament_gcode", start_filament_gcode, extruder_id);
gcode += this->placeholder_parser_process("start_filament_gcode", start_filament_gcode, extruder_id, &config);
check_add_eol(gcode);
}
// Set the new extruder to the operating temperature.

View File

@ -419,7 +419,7 @@ void PerimeterGenerator::process()
thin[0].remove_point_too_near((coord_t)SCALED_RESOLUTION);
if (thin[0].area() > min_width*(ext_perimeter_width + ext_perimeter_spacing2)) {
bound.remove_point_too_near((coord_t)SCALED_RESOLUTION);
// the maximum thickness of our thin wall area is equal to the minimum thickness of a single loop
// the maximum thickness of our thin wall area is equal to the minimum thickness of a single loop (*1.1 because of circles approx.)
Slic3r::MedialAxis ma{ thin[0], (coord_t)((ext_perimeter_width + ext_perimeter_spacing2)*1.1),
min_width, coord_t(this->layer_height) };
ma.use_bounds(bound)
@ -436,7 +436,7 @@ void PerimeterGenerator::process()
//FIXME Is this offset correct if the line width of the inner perimeters differs
// from the line width of the infill?
coord_t good_spacing = (i == 1) ? ext_perimeter_spacing2 : perimeter_spacing;
if (this->config->thin_walls){
if (!this->config->thin_perimeters){
// This path will ensure, that the perimeters do not overfill, as in
// prusa3d/Slic3r GH #32, but with the cost of rounding the perimeters
// excessively, creating gaps, which then need to be filled in by the not very
@ -628,7 +628,7 @@ void PerimeterGenerator::process()
double min = 0.2 * perimeter_width * (1 - INSET_OVERLAP_TOLERANCE);
//be sure we don't gapfill where the perimeters are already touching each other (negative spacing).
min = std::max(min, double(Flow::new_from_spacing(EPSILON, nozzle_diameter, this->layer_height, false).scaled_width()));
double max = 2. * perimeter_spacing;
double max = 2.2 * perimeter_spacing;
ExPolygons gaps_ex = diff_ex(
offset2_ex(gaps, double(-min / 2), double(+min / 2)),
offset2_ex(gaps, double(-max / 2), double(+max / 2)),

View File

@ -2349,41 +2349,39 @@ end:
}
ExPolygons PrintObject::_offset_holes(double hole_delta, const ExPolygons &polys) const{
if (hole_delta != 0.f) {
ExPolygons new_polys;
for (const ExPolygon &ex_poly : polys) {
ExPolygon new_ex_poly(ex_poly);
new_ex_poly.holes.clear();
for (const Polygon &hole : ex_poly.holes) {
//check if convex to reduce it
// check whether first point forms a convex angle
//note: we allow a deviation of 5.7° (0.01rad = 0.57°)
bool ok = true;
ok = (hole.points.front().ccw_angle(hole.points.back(), *(hole.points.begin() + 1)) <= PI + 0.1);
// check whether points 1..(n-1) form convex angles
if (ok)
for (Points::const_iterator p = hole.points.begin() + 1; p != hole.points.end() - 1; ++p) {
ok = (p->ccw_angle(*(p - 1), *(p + 1)) <= PI + 0.1);
if (!ok) break;
}
// check whether last point forms a convex angle
ok &= (hole.points.back().ccw_angle(*(hole.points.end() - 2), hole.points.front()) <= PI + 0.1);
if (ok) {
for (Polygon newHole : offset(hole, hole_delta)) {
//reverse because it's a hole, not an object
newHole.make_clockwise();
new_ex_poly.holes.push_back(newHole);
}
} else {
new_ex_poly.holes.push_back(hole);
ExPolygons new_polys;
for (const ExPolygon &ex_poly : polys) {
ExPolygon new_ex_poly(ex_poly);
new_ex_poly.holes.clear();
for (const Polygon &hole : ex_poly.holes) {
//check if convex to reduce it
// check whether first point forms a convex angle
//note: we allow a deviation of 5.7° (0.01rad = 0.57°)
bool ok = true;
ok = (hole.points.front().ccw_angle(hole.points.back(), *(hole.points.begin() + 1)) <= PI + 0.1);
// check whether points 1..(n-1) form convex angles
if (ok)
for (Points::const_iterator p = hole.points.begin() + 1; p != hole.points.end() - 1; ++p) {
ok = (p->ccw_angle(*(p - 1), *(p + 1)) <= PI + 0.1);
if (!ok) break;
}
// check whether last point forms a convex angle
ok &= (hole.points.back().ccw_angle(*(hole.points.end() - 2), hole.points.front()) <= PI + 0.1);
if (ok) {
for (Polygon newHole : offset(hole, hole_delta)) {
//reverse because it's a hole, not an object
newHole.make_clockwise();
new_ex_poly.holes.push_back(newHole);
}
} else {
new_ex_poly.holes.push_back(hole);
}
new_polys.push_back(new_ex_poly);
}
return new_polys;
new_polys.push_back(new_ex_poly);
}
return new_polys;
}
/// max angle: you ahve to be lwer than that to divide it. PI => all accepted
@ -2475,6 +2473,7 @@ ExPolygons PrintObject::_smooth_curves(const ExPolygons & input, const PrintRegi
ExPolygons new_polys;
for (const ExPolygon &ex_poly : input) {
ExPolygon new_ex_poly(ex_poly);
new_ex_poly.contour.remove_collinear(SCALED_RESOLUTION);
new_ex_poly.contour = _smooth_curve(new_ex_poly.contour, PI,
conf.curve_smoothing_angle_convex.value*PI / 180.0,
conf.curve_smoothing_angle_concave.value*PI / 180.0,
@ -2482,13 +2481,14 @@ ExPolygons PrintObject::_smooth_curves(const ExPolygons & input, const PrintRegi
scale_(conf.curve_smoothing_precision.value));
for (Polygon &phole : new_ex_poly.holes){
phole.reverse(); // make_counter_clockwise();
phole.remove_collinear(SCALED_RESOLUTION);
phole = _smooth_curve(phole, PI,
conf.curve_smoothing_angle_convex.value*PI / 180.0,
conf.curve_smoothing_angle_concave.value*PI / 180.0,
scale_(conf.curve_smoothing_cutoff_dist.value),
scale_(conf.curve_smoothing_precision.value));
phole.reverse(); // make_clockwise();
}
}
new_polys.push_back(new_ex_poly);
}
return new_polys;

View File

@ -2811,8 +2811,10 @@ void modulate_extrusion_by_overlapping_layers(
path_fragments.back().polylines = diff_pl(path_fragments.back().polylines, polygons_trimming, false);
// Adjust the extrusion parameters for a reduced layer height and a non-bridging flow (nozzle_dmr = -1, does not matter).
assert(this_layer.print_z > overlapping_layer.print_z);
float old_height = frag.height;
frag.height = float(this_layer.print_z - overlapping_layer.print_z);
frag.mm3_per_mm = Flow(frag.width, frag.height, -1.f, false).mm3_per_mm();
// don't recompute the flow, just use a simple % reduction/increase
frag.mm3_per_mm = frag.mm3_per_mm * frag.height / old_height;
#ifdef SLIC3R_DEBUG
svg.draw(frag.polylines, dbg_index_to_color(i_overlapping_layer), scale_(0.1));
#endif /* SLIC3R_DEBUG */

View File

@ -13,7 +13,7 @@
<key>CFBundleShortVersionString</key>
<string>@SLIC3R_APP_NAME@ @SLIC3R_BUILD_ID@</string>
<key>CFBundleIdentifier</key>
<string>com.prusa3d.slic3r/</string>
<string>com.merill.slic3r/</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
@ -111,7 +111,7 @@
</dict>
</array>
<key>LSMinimumSystemVersion</key>
<string>10.14</string>
<string>10.13</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSHighResolutionCapable</key>

View File

@ -1733,6 +1733,7 @@ void ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese
if (bundle.second.is_prusa_bundle) { continue; }
const auto config = enabled_vendors.find(bundle.first);
if (config == enabled_vendors.end()) { continue; }
for (const auto &model : bundle.second.vendor_profile->models) {
const auto model_it = config->second.find(model.id);
if (model_it != config->second.end() && model_it->second.size() > 0) {

View File

@ -935,7 +935,7 @@ void Choice::set_value(const boost::any& value, bool change_event)
case coEnum: {
int val = boost::any_cast<int>(value);
if (m_opt_id == "top_fill_pattern" || m_opt_id == "bottom_fill_pattern" || m_opt_id == "solid_fill_pattern"
|| m_opt_id == "fill_pattern" || m_opt_id == "support_fill_pattern")
|| m_opt_id == "fill_pattern" || m_opt_id == "support_material_interface_pattern")
{
val = idx_from_enum_value<InfillPattern>(val);
} else if (m_opt_id.compare("perimeter_loop_seam") == 0) {

View File

@ -5,5 +5,5 @@ set(SLIC3R_APP_NAME "Slic3r++")
set(SLIC3R_APP_KEY "Slic3r++")
set(SLIC3R_VERSION "2.2.47")
set(SLIC3R_BUILD_ID "slic3r++_${SLIC3R_VERSION}+UNKNOWN")
set(SLIC3R_RC_VERSION "2,2,47,0")
set(SLIC3R_RC_VERSION_DOTS "2.2.47.0")
set(SLIC3R_RC_VERSION "2,2,47,1")
set(SLIC3R_RC_VERSION_DOTS "2.2.47.1")