diff --git a/resources/profiles/PrusaResearch.idx b/resources/profiles/PrusaResearch.idx index 259dd5feb..ce0505857 100644 --- a/resources/profiles/PrusaResearch.idx +++ b/resources/profiles/PrusaResearch.idx @@ -1,10 +1,7 @@ min_slic3r_version = 2.5.0-alpha0 1.5.0-alpha0 Added parameters for Arachne perimeter generator. Changed default seam position. Updated output filename format. min_slic3r_version = 2.4.0-rc -<<<<<<< HEAD -======= -1.4.6 Added SLA materials. Updated filament profiles. ->>>>>>> master_250 +1.4.6 Added SLA materials. Updated filament profiles. 1.4.5 Added MMU2/S profiles for 0.25mm nozzle. Updated FW version. Enabled g-code thumbnails for MK3 family printers. Updated end g-code. 1.4.4 Added multiple Fiberlogy filament profiles. Updated Extrudr filament profiles. 1.4.3 Added new filament profiles and SLA materials. diff --git a/resources/profiles/PrusaResearch.ini b/resources/profiles/PrusaResearch.ini index 0dd16f704..1760743ea 100644 --- a/resources/profiles/PrusaResearch.ini +++ b/resources/profiles/PrusaResearch.ini @@ -5,11 +5,7 @@ name = Prusa Research # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -<<<<<<< HEAD -config_version = 1.4.5 -======= config_version = 1.5.0-alpha0 ->>>>>>> master_250 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaResearch/ changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% @@ -301,8 +297,6 @@ thick_bridges = 0 bridge_flow_ratio = 1 bridge_speed = 20 wipe_tower_bridging = 6 -<<<<<<< HEAD -======= wall_add_middle_threshold = 85% wall_split_middle_threshold = 70% wall_transition_angle = 10 @@ -311,7 +305,6 @@ wall_transition_length = 0.25 wall_distribution_count = 1 min_bead_width = 85% min_feature_size = 0.0625 ->>>>>>> master_250 [print:*0.25nozzleMK3*] inherits = *0.25nozzle* diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 25f24855e..b5bc8b7a6 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -317,10 +317,8 @@ set(SLIC3R_SOURCES SLA/Clustering.hpp SLA/Clustering.cpp SLA/ReprojectPointsOnMesh.hpp -<<<<<<< HEAD SLA/DefaultSupportTree.hpp SLA/DefaultSupportTree.cpp -======= Arachne/BeadingStrategy/BeadingStrategy.hpp Arachne/BeadingStrategy/BeadingStrategy.cpp @@ -362,7 +360,6 @@ set(SLIC3R_SOURCES Arachne/SkeletalTrapezoidationJoint.hpp Arachne/WallToolPaths.hpp Arachne/WallToolPaths.cpp ->>>>>>> master_250 ) add_library(libslic3r STATIC ${SLIC3R_SOURCES}) diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index dd58b2553..5b1b1d345 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -13,10 +13,8 @@ #include "FillBase.hpp" #include "FillRectilinear.hpp" #include "FillLightning.hpp" -<<<<<<< HEAD -======= #include "FillConcentric.hpp" ->>>>>>> master_250 + namespace Slic3r { @@ -358,8 +356,6 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: if (surface_fill.params.pattern == ipLightning) dynamic_cast(f.get())->generator = lightning_generator; -<<<<<<< HEAD -======= if (perimeter_generator.value == PerimeterGeneratorType::Arachne && surface_fill.params.pattern == ipConcentric) { FillConcentric *fill_concentric = dynamic_cast(f.get()); assert(fill_concentric != nullptr); @@ -367,7 +363,6 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: fill_concentric->print_object_config = &this->object()->config(); } ->>>>>>> master_250 // calculate flow spacing for infill pattern generation bool using_internal_flow = ! surface_fill.surface.is_solid() && ! surface_fill.params.bridge; double link_max_length = 0.; diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 4272dc9a6..d836ac43c 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -2613,7 +2613,6 @@ std::string GCode::change_layer(coordf_t print_z) return gcode; } -<<<<<<< HEAD static const auto comment_perimeter = "perimeter"sv; // Comparing string_view pointer & length for speed. static inline bool comment_is_perimeter(const std::string_view comment) { @@ -2621,9 +2620,6 @@ static inline bool comment_is_perimeter(const std::string_view comment) { } std::string GCode::extrude_loop(ExtrusionLoop loop, const std::string_view description, double speed) -======= -std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, double speed) ->>>>>>> master_250 { // get a copy; don't modify the orientation of the original loop object otherwise // next copies (if any) would not detect the correct orientation @@ -2634,21 +2630,14 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, dou // find the point of the loop that is closest to the current extruder position // or randomize if requested Point last_pos = this->last_pos(); -<<<<<<< HEAD + if (! m_config.spiral_vase && comment_is_perimeter(description)) { assert(m_layer != nullptr); m_seam_placer.place_seam(m_layer, loop, m_config.external_perimeters_first, this->last_pos()); - } else - loop.split_at(last_pos, false); -======= - if (! m_config.spiral_vase && description == "perimeter") { - assert(m_layer != nullptr); - m_seam_placer.place_seam(m_layer, loop, m_config.external_perimeters_first, this->last_pos()); } else // Because the G-code export has 1um resolution, don't generate segments shorter than 1.5 microns, // thus empty path segments will not be produced by G-code export. loop.split_at(last_pos, false, scaled(0.0015)); ->>>>>>> master_250 // clip the path to avoid the extruder to get exactly on the first point of the loop; // if polyline was shorter than the clipping distance we'd get a null polyline, so @@ -2735,11 +2724,7 @@ std::string GCode::extrude_multi_path(ExtrusionMultiPath multipath, const std::s return gcode; } -<<<<<<< HEAD std::string GCode::extrude_entity(const ExtrusionEntity &entity, const std::string_view description, double speed) -======= -std::string GCode::extrude_entity(const ExtrusionEntity &entity, std::string description, double speed) ->>>>>>> master_250 { if (const ExtrusionPath* path = dynamic_cast(&entity)) return this->extrude_path(*path, description, speed); @@ -2774,11 +2759,7 @@ std::string GCode::extrude_perimeters(const Print &print, const std::vectorextrude_entity(*ee, comment_perimeter, -1.); -======= - gcode += this->extrude_entity(*ee, "perimeter", -1.); ->>>>>>> master_250 } return gcode; } diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 59a831e26..ce4a505fc 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -278,17 +278,10 @@ private: void set_extruders(const std::vector &extruder_ids); std::string preamble(); std::string change_layer(coordf_t print_z); -<<<<<<< HEAD std::string extrude_entity(const ExtrusionEntity &entity, const std::string_view description, double speed = -1.); std::string extrude_loop(ExtrusionLoop loop, const std::string_view description, double speed = -1.); std::string extrude_multi_path(ExtrusionMultiPath multipath, const std::string_view description, double speed = -1.); std::string extrude_path(ExtrusionPath path, const std::string_view description, double speed = -1.); -======= - std::string extrude_entity(const ExtrusionEntity &entity, std::string description = "", double speed = -1.); - std::string extrude_loop(ExtrusionLoop loop, std::string description, double speed = -1.); - std::string extrude_multi_path(ExtrusionMultiPath multipath, std::string description = "", double speed = -1.); - std::string extrude_path(ExtrusionPath path, std::string description = "", double speed = -1.); ->>>>>>> master_250 // Extruding multiple objects with soluble / non-soluble / combined supports // on a multi-material printer, trying to minimize tool switches. diff --git a/src/libslic3r/Geometry/Curves.hpp b/src/libslic3r/Geometry/Curves.hpp index 3ea80f587..5a0d5481f 100644 --- a/src/libslic3r/Geometry/Curves.hpp +++ b/src/libslic3r/Geometry/Curves.hpp @@ -142,11 +142,7 @@ PiecewiseFittedCurve fit_curve( //find corresponding segment index; expects kernels to be centered int middle_right_segment_index = floor((observation_point - result.start) / result.segment_size); //find index of first segment that is affected by the point i; this can be deduced from kernel_span -<<<<<<< HEAD - int start_segment_idx = middle_right_segment_index - Kernel::kernel_span / 2 + 1; -======= int start_segment_idx = middle_right_segment_index - int(Kernel::kernel_span / 2) + 1; ->>>>>>> master_250 for (int segment_index = start_segment_idx; segment_index < int(start_segment_idx + Kernel::kernel_span); segment_index++) { NumberType segment_start = result.start + segment_index * result.segment_size; diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index dab7d6277..be6c120e0 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -13,11 +13,7 @@ namespace Slic3r { -<<<<<<< HEAD -static ExtrusionPaths thick_polyline_to_extrusion_paths(const ThickPolyline &thick_polyline, ExtrusionRole role, const Flow &flow, const float tolerance, const float merge_tolerance) -======= ExtrusionPaths thick_polyline_to_extrusion_paths(const ThickPolyline &thick_polyline, ExtrusionRole role, const Flow &flow, const float tolerance, const float merge_tolerance) ->>>>>>> master_250 { ExtrusionPaths paths; ExtrusionPath path(role); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index c4f495e4e..9e1d7989d 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -123,8 +123,6 @@ enum DraftShield { dsDisabled, dsLimited, dsEnabled }; -<<<<<<< HEAD -======= enum class PerimeterGeneratorType { // Classic perimeter generator using Clipper offsets with constant extrusion width. @@ -134,7 +132,6 @@ enum class PerimeterGeneratorType Arachne }; ->>>>>>> master_250 enum class GCodeThumbnailsFormat { PNG, JPG, QOI }; diff --git a/t/perimeters.t b/t/perimeters.t deleted file mode 100644 index 33cab0d29..000000000 --- a/t/perimeters.t +++ /dev/null @@ -1,452 +0,0 @@ -use Test::More tests => 59; -use strict; -use warnings; - -BEGIN { - use FindBin; - use lib "$FindBin::Bin/../lib"; - use local::lib "$FindBin::Bin/../local-lib"; -} - -use Slic3r::ExtrusionLoop ':roles'; -use Slic3r::ExtrusionPath ':roles'; -use List::Util qw(first); -use Slic3r; -use Slic3r::Flow ':roles'; -use Slic3r::Geometry qw(PI scale unscale); -use Slic3r::Geometry::Clipper qw(union_ex diff union offset); -use Slic3r::Surface ':types'; -use Slic3r::Test; - -{ - my $flow = Slic3r::Flow->new( - width => 1, - height => 1, - nozzle_diameter => 1, - ); - - my $config = Slic3r::Config->new; - my $test = sub { - my ($expolygons, %expected) = @_; - - my $slices = Slic3r::Surface::Collection->new; - $slices->append(Slic3r::Surface->new( - surface_type => S_TYPE_INTERNAL, - expolygon => $_, - )) for @$expolygons; - - my ($region_config, $object_config, $print_config, $loops, $gap_fill, $fill_surfaces); - my $g = Slic3r::Layer::PerimeterGenerator->new( - # input: - $slices, - 1, # layer height - $flow, - ($region_config = Slic3r::Config::PrintRegion->new), - ($object_config = Slic3r::Config::PrintObject->new), - ($print_config = Slic3r::Config::Print->new), - - # output: - ($loops = Slic3r::ExtrusionPath::Collection->new), - ($gap_fill = Slic3r::ExtrusionPath::Collection->new), - ($fill_surfaces = Slic3r::Surface::Collection->new), - ); - $g->config->apply_dynamic($config); - $g->process_classic; - - is scalar(@$loops), - scalar(@$expolygons), 'expected number of collections'; - ok !defined(first { !$_->isa('Slic3r::ExtrusionPath::Collection') } @$loops), - 'everything is returned as collections'; - - my $flattened_loops = $loops->flatten; - my @loops = @$flattened_loops; - is scalar(@loops), - $expected{total}, 'expected number of loops'; - is scalar(grep $_->role == EXTR_ROLE_EXTERNAL_PERIMETER, map @$_, @loops), - $expected{external}, 'expected number of external loops'; - is_deeply [ map { ($_->role == EXTR_ROLE_EXTERNAL_PERIMETER) || 0 } map @$_, @loops ], - $expected{ext_order}, 'expected external order'; - is scalar(grep $_->loop_role == EXTRL_ROLE_CONTOUR_INTERNAL_PERIMETER, @loops), - $expected{cinternal}, 'expected number of internal contour loops'; - is scalar(grep $_->polygon->is_counter_clockwise, @loops), - $expected{ccw}, 'expected number of ccw loops'; - is_deeply [ map $_->polygon->is_counter_clockwise, @loops ], - $expected{ccw_order}, 'expected ccw/cw order'; - - if ($expected{nesting}) { - foreach my $nesting (@{ $expected{nesting} }) { - for my $i (1..$#$nesting) { - ok $loops[$nesting->[$i-1]]->polygon->contains_point($loops[$nesting->[$i]]->first_point), - 'expected nesting order'; - } - } - } - }; - - $config->set('perimeters', 3); - $test->( - [ - Slic3r::ExPolygon->new( - Slic3r::Polygon->new_scale([0,0], [100,0], [100,100], [0,100]), - ), - ], - total => 3, - external => 1, - ext_order => [0,0,1], - cinternal => 1, - ccw => 3, - ccw_order => [1,1,1], - nesting => [ [2,1,0] ], - ); - $test->( - [ - Slic3r::ExPolygon->new( - Slic3r::Polygon->new_scale([0,0], [100,0], [100,100], [0,100]), - Slic3r::Polygon->new_scale([40,40], [40,60], [60,60], [60,40]), - ), - ], - total => 6, - external => 2, - ext_order => [0,0,1,0,0,1], - cinternal => 1, - ccw => 3, - ccw_order => [0,0,0,1,1,1], - nesting => [ [5,4,3,0,1,2] ], - ); - $test->( - [ - Slic3r::ExPolygon->new( - Slic3r::Polygon->new_scale([0,0], [200,0], [200,200], [0,200]), - Slic3r::Polygon->new_scale([20,20], [20,180], [180,180], [180,20]), - ), - # nested: - Slic3r::ExPolygon->new( - Slic3r::Polygon->new_scale([50,50], [150,50], [150,150], [50,150]), - Slic3r::Polygon->new_scale([80,80], [80,120], [120,120], [120,80]), - ), - ], - total => 4*3, - external => 4, - ext_order => [0,0,1,0,0,1,0,0,1,0,0,1], - cinternal => 2, - ccw => 2*3, - ccw_order => [0,0,0,1,1,1,0,0,0,1,1,1], - ); - - $config->set('perimeters', 2); - $test->( - [ - Slic3r::ExPolygon->new( - Slic3r::Polygon->new_scale([0,0], [50,0], [50,50], [0,50]), - Slic3r::Polygon->new_scale([7.5,7.5], [7.5,12.5], [12.5,12.5], [12.5,7.5]), - Slic3r::Polygon->new_scale([7.5,17.5], [7.5,22.5], [12.5,22.5], [12.5,17.5]), - Slic3r::Polygon->new_scale([7.5,27.5], [7.5,32.5], [12.5,32.5], [12.5,27.5]), - Slic3r::Polygon->new_scale([7.5,37.5], [7.5,42.5], [12.5,42.5], [12.5,37.5]), - Slic3r::Polygon->new_scale([17.5,7.5], [17.5,12.5], [22.5,12.5], [22.5,7.5]), - ), - ], - total => 12, - external => 6, - ext_order => [0,1,0,1,0,1,0,1,0,1,0,1], - cinternal => 1, - ccw => 2, - ccw_order => [0,0,0,0,0,0,0,0,0,0,1,1], - nesting => [ [0,1],[2,3],[4,5],[6,7],[8,9] ], - ); -} - -{ - my $config = Slic3r::Config::new_from_defaults; - $config->set('skirts', 0); - $config->set('fill_density', 0); - $config->set('perimeters', 3); - $config->set('top_solid_layers', 0); - $config->set('bottom_solid_layers', 0); - $config->set('cooling', [ 0 ]); # to prevent speeds from being altered - $config->set('first_layer_speed', '100%'); # to prevent speeds from being altered - - { - my $print = Slic3r::Test::init_print('overhang', config => $config); - my $has_cw_loops = 0; - my $cur_loop; - Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub { - my ($self, $cmd, $args, $info) = @_; - - if ($info->{extruding} && $info->{dist_XY} > 0) { - $cur_loop ||= [ [$self->X, $self->Y] ]; - push @$cur_loop, [ @$info{qw(new_X new_Y)} ]; - } elsif ($cmd ne 'M73') { # skips remaining time lines (M73) - if ($cur_loop) { - $has_cw_loops = 1 if Slic3r::Polygon->new(@$cur_loop)->is_clockwise; - $cur_loop = undef; - } - } - }); - ok !$has_cw_loops, 'all perimeters extruded ccw'; - } - - foreach my $model (qw(cube_with_hole cube_with_concave_hole)) { - $config->set('external_perimeter_speed', 68); - my $print = Slic3r::Test::init_print( - $model, - config => $config, - duplicate => 2, # we test two copies to make sure ExtrusionLoop objects are not modified in-place (the second object would not detect cw loops and thus would calculate wrong inwards moves) - ); - my $has_cw_loops = my $has_outwards_move = my $starts_on_convex_point = 0; - my $cur_loop; - my %external_loops = (); # print_z => count of external loops - Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub { - my ($self, $cmd, $args, $info) = @_; - - if ($info->{extruding} && $info->{dist_XY} > 0) { - $cur_loop ||= [ [$self->X, $self->Y] ]; - push @$cur_loop, [ @$info{qw(new_X new_Y)} ]; - } elsif ($cmd ne 'M73') { # skips remaining time lines (M73) - if ($cur_loop) { - $has_cw_loops = 1 if Slic3r::Polygon->new_scale(@$cur_loop)->is_clockwise; - if ($self->F == $config->external_perimeter_speed*60) { - my $move_dest = Slic3r::Point->new_scale(@$info{qw(new_X new_Y)}); - - # reset counter for second object - $external_loops{$self->Z} = 0 - if defined($external_loops{$self->Z}) && $external_loops{$self->Z} == 2; - - $external_loops{$self->Z}++; - my $is_contour = $external_loops{$self->Z} == 2; - my $is_hole = $external_loops{$self->Z} == 1; - - my $loop = Slic3r::Polygon->new_scale(@$cur_loop); - my $loop_contains_point = $loop->contains_point($move_dest); - $has_outwards_move = 1 - if (!$loop_contains_point && $is_contour) # contour should include destination - || ($loop_contains_point && $is_hole); # hole should not - - if ($model eq 'cube_with_concave_hole') { - # check that loop starts at a concave vertex - my $ccw_angle = $loop->first_point->ccw_angle(@$loop[-2,1]); - my $convex = ($ccw_angle > PI); # whether the angle on the *right* side is convex - $starts_on_convex_point = 1 - if ($convex && $is_contour) || (!$convex && $is_hole); - } - } - $cur_loop = undef; - } - } - }); - ok !$has_cw_loops, 'all perimeters extruded ccw'; - - # FIXME Lukas H.: Arachne is printing external loops before hole loops in this test case. - if ($config->perimeter_generator eq 'arachne') { - ok $has_outwards_move, 'move inwards after completing external loop'; - # FIXME Lukas H.: Disable this test for Arachne because it is failing and needs more investigation. - ok 'loops start on concave point if any'; - } else { - ok !$has_outwards_move, 'move inwards after completing external loop'; - ok !$starts_on_convex_point, 'loops start on concave point if any'; - } - } - - { - $config->set('perimeters', 1); - $config->set('perimeter_speed', 77); - $config->set('external_perimeter_speed', 66); - $config->set('bridge_speed', 99); - $config->set('cooling', [ 1 ]); - $config->set('fan_below_layer_time', [ 0 ]); - $config->set('slowdown_below_layer_time', [ 0 ]); - $config->set('bridge_fan_speed', [ 100 ]); - $config->set('bridge_flow_ratio', 33); # arbitrary value - $config->set('overhangs', 1); - my $print = Slic3r::Test::init_print('overhang', config => $config); - my %layer_speeds = (); # print Z => [ speeds ] - my $fan_speed = 0; - my $bridge_mm_per_mm = ($config->nozzle_diameter->[0]**2) / ($config->filament_diameter->[0]**2) * $config->bridge_flow_ratio; - Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub { - my ($self, $cmd, $args, $info) = @_; - - $fan_speed = 0 if $cmd eq 'M107'; - $fan_speed = $args->{S} if $cmd eq 'M106'; - if ($info->{extruding} && $info->{dist_XY} > 0) { - $layer_speeds{$self->Z} ||= {}; - $layer_speeds{$self->Z}{my $feedrate = $args->{F} // $self->F} = 1; - - fail 'wrong speed found' - if $feedrate != $config->perimeter_speed*60 - && $feedrate != $config->external_perimeter_speed*60 - && $feedrate != $config->bridge_speed*60; - - if ($feedrate == $config->bridge_speed*60) { - fail 'printing overhang but fan is not enabled or running at wrong speed' - if $fan_speed != 255; - my $mm_per_mm = $info->{dist_E} / $info->{dist_XY}; - fail 'wrong bridge flow' if abs($mm_per_mm - $bridge_mm_per_mm) > 0.01; - } else { - fail 'fan is running when not supposed to' - if $fan_speed > 0; - } - } - }); - is scalar(grep { keys %$_ > 1 } values %layer_speeds), 1, - 'only overhang layer has more than one speed'; - } -} - -{ - my $config = Slic3r::Config::new_from_defaults; - $config->set('skirts', 0); - $config->set('perimeters', 3); - $config->set('layer_height', 0.4); - $config->set('first_layer_height', 0.35); - $config->set('extra_perimeters', 1); - $config->set('cooling', [ 0 ]); # to prevent speeds from being altered - $config->set('first_layer_speed', '100%'); # to prevent speeds from being altered - $config->set('perimeter_speed', 99); - $config->set('external_perimeter_speed', 99); - $config->set('small_perimeter_speed', 99); - $config->set('thin_walls', 0); - - my $print = Slic3r::Test::init_print('ipadstand', config => $config); - my %perimeters = (); # z => number of loops - my $in_loop = 0; - Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub { - my ($self, $cmd, $args, $info) = @_; - - if ($info->{extruding} && $info->{dist_XY} > 0 && ($args->{F} // $self->F) == $config->perimeter_speed*60) { - $perimeters{$self->Z}++ if !$in_loop; - $in_loop = 1; - } elsif ($cmd ne 'M73') { # skips remaining time lines (M73) - $in_loop = 0; - } - }); - ok !(grep { $_ % $config->perimeters } values %perimeters), 'no superfluous extra perimeters'; -} - -{ - my $config = Slic3r::Config::new_from_defaults; - $config->set('nozzle_diameter', [0.4]); - $config->set('perimeters', 2); - $config->set('perimeter_extrusion_width', 0.4); - $config->set('external_perimeter_extrusion_width', 0.4); - $config->set('infill_extrusion_width', 0.53); - $config->set('solid_infill_extrusion_width', 0.53); - - # we just need a pre-filled Print object - my $print = Slic3r::Test::init_print('20mm_cube', config => $config); - - # override a layer's slices - my $expolygon = Slic3r::ExPolygon->new([[-71974463,-139999376],[-71731792,-139987456],[-71706544,-139985616],[-71682119,-139982639],[-71441248,-139946912],[-71417487,-139942895],[-71379384,-139933984],[-71141800,-139874480],[-71105247,-139862895],[-70873544,-139779984],[-70838592,-139765856],[-70614943,-139660064],[-70581783,-139643567],[-70368368,-139515680],[-70323751,-139487872],[-70122160,-139338352],[-70082399,-139306639],[-69894800,-139136624],[-69878679,-139121327],[-69707992,-138933008],[-69668575,-138887343],[-69518775,-138685359],[-69484336,-138631632],[-69356423,-138418207],[-69250040,-138193296],[-69220920,-138128976],[-69137992,-137897168],[-69126095,-137860255],[-69066568,-137622608],[-69057104,-137582511],[-69053079,-137558751],[-69017352,-137317872],[-69014392,-137293456],[-69012543,-137268207],[-68999369,-137000000],[-63999999,-137000000],[-63705947,-136985551],[-63654984,-136977984],[-63414731,-136942351],[-63364756,-136929840],[-63129151,-136870815],[-62851950,-136771631],[-62585807,-136645743],[-62377483,-136520895],[-62333291,-136494415],[-62291908,-136463728],[-62096819,-136319023],[-62058644,-136284432],[-61878676,-136121328],[-61680968,-135903184],[-61650275,-135861807],[-61505591,-135666719],[-61354239,-135414191],[-61332211,-135367615],[-61228359,-135148063],[-61129179,-134870847],[-61057639,-134585262],[-61014451,-134294047],[-61000000,-134000000],[-61000000,-107999999],[-61014451,-107705944],[-61057639,-107414736],[-61129179,-107129152],[-61228359,-106851953],[-61354239,-106585808],[-61505591,-106333288],[-61680967,-106096816],[-61878675,-105878680],[-62096820,-105680967],[-62138204,-105650279],[-62333292,-105505591],[-62585808,-105354239],[-62632384,-105332207],[-62851951,-105228360],[-62900463,-105211008],[-63129152,-105129183],[-63414731,-105057640],[-63705947,-105014448],[-63999999,-105000000],[-68999369,-105000000],[-69012543,-104731792],[-69014392,-104706544],[-69017352,-104682119],[-69053079,-104441248],[-69057104,-104417487],[-69066008,-104379383],[-69125528,-104141799],[-69137111,-104105248],[-69220007,-103873544],[-69234136,-103838591],[-69339920,-103614943],[-69356415,-103581784],[-69484328,-103368367],[-69512143,-103323752],[-69661647,-103122160],[-69693352,-103082399],[-69863383,-102894800],[-69878680,-102878679],[-70066999,-102707992],[-70112656,-102668576],[-70314648,-102518775],[-70368367,-102484336],[-70581783,-102356424],[-70806711,-102250040],[-70871040,-102220919],[-71102823,-102137992],[-71139752,-102126095],[-71377383,-102066568],[-71417487,-102057104],[-71441248,-102053079],[-71682119,-102017352],[-71706535,-102014392],[-71731784,-102012543],[-71974456,-102000624],[-71999999,-102000000],[-104000000,-102000000],[-104025536,-102000624],[-104268207,-102012543],[-104293455,-102014392],[-104317880,-102017352],[-104558751,-102053079],[-104582512,-102057104],[-104620616,-102066008],[-104858200,-102125528],[-104894751,-102137111],[-105126455,-102220007],[-105161408,-102234136],[-105385056,-102339920],[-105418215,-102356415],[-105631632,-102484328],[-105676247,-102512143],[-105877839,-102661647],[-105917600,-102693352],[-106105199,-102863383],[-106121320,-102878680],[-106292007,-103066999],[-106331424,-103112656],[-106481224,-103314648],[-106515663,-103368367],[-106643575,-103581783],[-106749959,-103806711],[-106779080,-103871040],[-106862007,-104102823],[-106873904,-104139752],[-106933431,-104377383],[-106942896,-104417487],[-106946920,-104441248],[-106982648,-104682119],[-106985607,-104706535],[-106987456,-104731784],[-107000630,-105000000],[-112000000,-105000000],[-112294056,-105014448],[-112585264,-105057640],[-112870848,-105129184],[-112919359,-105146535],[-113148048,-105228360],[-113194624,-105250392],[-113414191,-105354239],[-113666711,-105505591],[-113708095,-105536279],[-113903183,-105680967],[-114121320,-105878679],[-114319032,-106096816],[-114349720,-106138200],[-114494408,-106333288],[-114645760,-106585808],[-114667792,-106632384],[-114771640,-106851952],[-114788991,-106900463],[-114870815,-107129151],[-114942359,-107414735],[-114985551,-107705943],[-115000000,-107999999],[-115000000,-134000000],[-114985551,-134294048],[-114942359,-134585263],[-114870816,-134870847],[-114853464,-134919359],[-114771639,-135148064],[-114645759,-135414192],[-114494407,-135666720],[-114319031,-135903184],[-114121320,-136121327],[-114083144,-136155919],[-113903184,-136319023],[-113861799,-136349712],[-113666711,-136494416],[-113458383,-136619264],[-113414192,-136645743],[-113148049,-136771631],[-112870848,-136870815],[-112820872,-136883327],[-112585264,-136942351],[-112534303,-136949920],[-112294056,-136985551],[-112000000,-137000000],[-107000630,-137000000],[-106987456,-137268207],[-106985608,-137293440],[-106982647,-137317872],[-106946920,-137558751],[-106942896,-137582511],[-106933991,-137620624],[-106874471,-137858208],[-106862888,-137894751],[-106779992,-138126463],[-106765863,-138161424],[-106660080,-138385055],[-106643584,-138418223],[-106515671,-138631648],[-106487855,-138676256],[-106338352,-138877839],[-106306647,-138917600],[-106136616,-139105199],[-106121320,-139121328],[-105933000,-139291999],[-105887344,-139331407],[-105685351,-139481232],[-105631632,-139515663],[-105418216,-139643567],[-105193288,-139749951],[-105128959,-139779072],[-104897175,-139862016],[-104860247,-139873904],[-104622616,-139933423],[-104582511,-139942896],[-104558751,-139946912],[-104317880,-139982656],[-104293463,-139985616],[-104268216,-139987456],[-104025544,-139999376],[-104000000,-140000000],[-71999999,-140000000]],[[-105000000,-138000000],[-105000000,-104000000],[-71000000,-104000000],[-71000000,-138000000]],[[-69000000,-132000000],[-69000000,-110000000],[-64991180,-110000000],[-64991180,-132000000]],[[-111008824,-132000000],[-111008824,-110000000],[-107000000,-110000000],[-107000000,-132000000]]); - my $object = $print->print->objects->[0]; - $object->slice; - my $layer = $object->get_layer(1); - my $layerm = $layer->regions->[0]; - $layerm->slices->clear; - $layerm->slices->append(Slic3r::Surface->new(surface_type => S_TYPE_INTERNAL, expolygon => $expolygon)); - - # make perimeters - $layer->make_perimeters; - - # compute the covered area - my $pflow = $layerm->flow(FLOW_ROLE_PERIMETER); - my $iflow = $layerm->flow(FLOW_ROLE_INFILL); - my $covered_by_perimeters = union_ex([ - (map @{$_->polygon->split_at_first_point->grow($pflow->scaled_width/2)}, map @$_, @{$layerm->perimeters}), - ]); - my $covered_by_infill = union_ex([ - (map $_->p, @{$layerm->fill_surfaces}), - (map @{$_->polyline->grow($iflow->scaled_width/2)}, @{$layerm->thin_fills}), - ]); - - # compute the non covered area - my $non_covered = diff( - [ map @{$_->expolygon}, @{$layerm->slices} ], - [ map @$_, (@$covered_by_perimeters, @$covered_by_infill) ], - ); - - if (0) { - printf "max non covered = %f\n", List::Util::max(map unscale unscale $_->area, @$non_covered); - require "Slic3r/SVG.pm"; - Slic3r::SVG::output( - "gaps.svg", - expolygons => [ map $_->expolygon, @{$layerm->slices} ], - red_expolygons => union_ex([ map @$_, (@$covered_by_perimeters, @$covered_by_infill) ]), - green_expolygons => union_ex($non_covered), - no_arrows => 1, - polylines => [ - map $_->polygon->split_at_first_point, map @$_, @{$layerm->perimeters}, - ], - ); - } - ok !(defined first { $_->area > ($iflow->scaled_width**2) } @$non_covered), 'no gap between perimeters and infill'; -} - -{ - my $config = Slic3r::Config::new_from_defaults; - $config->set('skirts', 0); - $config->set('perimeters', 3); - $config->set('layer_height', 0.4); - $config->set('bridge_speed', 99); - $config->set('fill_density', 0); # to prevent bridging over sparse infill - $config->set('overhangs', 1); - $config->set('cooling', [ 0 ]); # to prevent speeds from being altered - $config->set('first_layer_speed', '100%'); # to prevent speeds from being altered - - my $test = sub { - my ($print) = @_; - my %z_with_bridges = (); # z => 1 - Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub { - my ($self, $cmd, $args, $info) = @_; - - if ($info->{extruding} && $info->{dist_XY} > 0) { - $z_with_bridges{$self->Z} = 1 if ($args->{F} // $self->F) == $config->bridge_speed*60; - } - }); - return scalar keys %z_with_bridges; - }; - ok $test->(Slic3r::Test::init_print('V', config => $config)) == 1, - 'no overhangs printed with bridge speed'; # except for the two internal solid layers above void - ok $test->(Slic3r::Test::init_print('V', config => $config, scale_xyz => [3,1,1])) > 2, - 'overhangs printed with bridge speed'; -} - -{ - my $config = Slic3r::Config::new_from_defaults; - $config->set('seam_position', 'random'); - my $print = Slic3r::Test::init_print('20mm_cube', config => $config); - ok Slic3r::Test::gcode($print), 'successful generation of G-code with seam_position = random'; -} - -{ - my $test = sub { - my ($model_name) = @_; - my $config = Slic3r::Config::new_from_defaults; - $config->set('seam_position', 'aligned'); - $config->set('skirts', 0); - $config->set('perimeters', 1); - $config->set('fill_density', 0); - $config->set('top_solid_layers', 0); - $config->set('bottom_solid_layers', 0); - $config->set('retract_layer_change', [0]); - - my $was_extruding = 0; - my @seam_points = (); - my $print = Slic3r::Test::init_print($model_name, config => $config); - Slic3r::GCode::Reader->new->parse(my $gcode = Slic3r::Test::gcode($print), sub { - my ($self, $cmd, $args, $info) = @_; - - if ($info->{extruding}) { - if (!$was_extruding) { - push @seam_points, Slic3r::Point->new_scale($self->X, $self->Y); - } - $was_extruding = 1; - } elsif ($cmd ne 'M73') { # skips remaining time lines (M73) - $was_extruding = 0; - } - }); - my @dist = map unscale($_), map $seam_points[$_]->distance_to($seam_points[$_+1]), 0..($#seam_points-1); - ok !(defined first { $_ > 3 } @dist), 'seam is aligned'; - }; - $test->('20mm_cube'); - $test->('small_dorito'); -} - -__END__ diff --git a/tests/fff_print/CMakeLists.txt b/tests/fff_print/CMakeLists.txt index a42c46695..0b3b920b9 100644 --- a/tests/fff_print/CMakeLists.txt +++ b/tests/fff_print/CMakeLists.txt @@ -1,15 +1,11 @@ get_filename_component(_TEST_NAME ${CMAKE_CURRENT_LIST_DIR} NAME) add_executable(${_TEST_NAME}_tests ${_TEST_NAME}_tests.cpp -<<<<<<< HEAD test_avoid_crossing_perimeters.cpp test_bridges.cpp test_cooling.cpp test_clipper.cpp test_custom_gcode.cpp -======= - test_clipper.cpp ->>>>>>> master_250 test_data.cpp test_data.hpp test_extrusion_entity.cpp diff --git a/tests/fff_print/test_fill.cpp b/tests/fff_print/test_fill.cpp index 0b6544836..66fba06a3 100644 --- a/tests/fff_print/test_fill.cpp +++ b/tests/fff_print/test_fill.cpp @@ -131,25 +131,16 @@ TEST_CASE("Fill: Pattern Path Length", "[Fill]") { auto flow = Slic3r::Flow(0.69f, 0.4f, 0.5f); FillParams fill_params; -<<<<<<< HEAD for (auto density : { 0.4, 1.0 }) { fill_params.density = density; filler->spacing = flow.spacing(); + REQUIRE(!fill_params.use_arachne); // Make this test fail when Arachne is used because this test is not ready for it. for (auto angle : { 0.0, 45.0}) { surface.expolygon.rotate(angle, Point(0,0)); Polylines paths = filler->fill_surface(&surface, fill_params); // one continuous path REQUIRE(paths.size() == 1); } -======= - fill_params.density = 1.0; - filler->spacing = flow.spacing(); - REQUIRE(!fill_params.use_arachne); // Make this test fail when Arachne is used because this test is not ready for it. - for (auto angle : { 0.0, 45.0}) { - surface.expolygon.rotate(angle, Point(0,0)); - Polylines paths = filler->fill_surface(&surface, fill_params); - REQUIRE(paths.size() == 1); ->>>>>>> master_250 } } diff --git a/version.inc b/version.inc index a5ae1ccef..3e1460a0e 100644 --- a/version.inc +++ b/version.inc @@ -3,14 +3,7 @@ set(SLIC3R_APP_NAME "PrusaSlicer") set(SLIC3R_APP_KEY "PrusaSlicer") -<<<<<<< HEAD set(SLIC3R_VERSION "2.6.0-alpha0") set(SLIC3R_BUILD_ID "PrusaSlicer-${SLIC3R_VERSION}+UNKNOWN") set(SLIC3R_RC_VERSION "2,6,0,0") set(SLIC3R_RC_VERSION_DOTS "2.6.0.0") -======= -set(SLIC3R_VERSION "2.5.0-alpha2") -set(SLIC3R_BUILD_ID "PrusaSlicer-${SLIC3R_VERSION}+UNKNOWN") -set(SLIC3R_RC_VERSION "2,5,0,0") -set(SLIC3R_RC_VERSION_DOTS "2.5.0.0") ->>>>>>> master_250 diff --git a/xs/xsp/PerimeterGenerator.xsp b/xs/xsp/PerimeterGenerator.xsp deleted file mode 100644 index 91c6af532..000000000 --- a/xs/xsp/PerimeterGenerator.xsp +++ /dev/null @@ -1,40 +0,0 @@ -%module{Slic3r::XS}; - -%{ -#include -#include "libslic3r/PerimeterGenerator.hpp" -#include "libslic3r/Layer.hpp" -%} - -%name{Slic3r::Layer::PerimeterGenerator} class PerimeterGenerator { - PerimeterGenerator(SurfaceCollection* slices, double layer_height, Flow* flow, - StaticPrintConfig* region_config, StaticPrintConfig* object_config, - StaticPrintConfig* print_config, ExtrusionEntityCollection* loops, - ExtrusionEntityCollection* gap_fill, - SurfaceCollection* fill_surfaces) - %code{% RETVAL = new PerimeterGenerator(slices, layer_height, *flow, - dynamic_cast(region_config), - dynamic_cast(object_config), - dynamic_cast(print_config), - false, - loops, gap_fill, fill_surfaces); %}; - ~PerimeterGenerator(); - - void set_lower_slices(ExPolygonCollection* lower_slices) - %code{% THIS->lower_slices = &lower_slices->expolygons; %}; - void set_layer_id(int layer_id) - %code{% THIS->layer_id = layer_id; %}; - void set_perimeter_flow(Flow* flow) - %code{% THIS->perimeter_flow = *flow; %}; - void set_ext_perimeter_flow(Flow* flow) - %code{% THIS->ext_perimeter_flow = *flow; %}; - void set_overhang_flow(Flow* flow) - %code{% THIS->overhang_flow = *flow; %}; - void set_solid_infill_flow(Flow* flow) - %code{% THIS->solid_infill_flow = *flow; %}; - - Ref config() - %code{% RETVAL = THIS->config; %}; - - void process_classic(); -};