Bugfix: lack of strong type checking when passing arrayref objects to XS caused random lack of infill. Now added strong type checking for all XS entities. Also fixes a potential issue with bridges caused by the same error. #1652
This commit is contained in:
parent
130e8dd8e7
commit
a64f7aa8df
@ -214,7 +214,7 @@ sub make_perimeters {
|
|||||||
|
|
||||||
# make sure we don't infill narrow parts that are already gap-filled
|
# make sure we don't infill narrow parts that are already gap-filled
|
||||||
# (we only consider this surface's gaps to reduce the diff() complexity)
|
# (we only consider this surface's gaps to reduce the diff() complexity)
|
||||||
@last = @{diff(\@last, \@last_gaps)};
|
@last = @{diff(\@last, [ map @$_, @last_gaps ])};
|
||||||
|
|
||||||
# create one more offset to be used as boundary for fill
|
# create one more offset to be used as boundary for fill
|
||||||
# we offset by half the perimeter spacing (to get to the actual infill boundary)
|
# we offset by half the perimeter spacing (to get to the actual infill boundary)
|
||||||
@ -508,7 +508,7 @@ sub process_external_surfaces {
|
|||||||
sub _detect_bridge_direction {
|
sub _detect_bridge_direction {
|
||||||
my ($self, $expolygon, $lower_layer) = @_;
|
my ($self, $expolygon, $lower_layer) = @_;
|
||||||
|
|
||||||
my $grown = $expolygon->offset_ex(+$self->perimeter_flow->scaled_width);
|
my $grown = $expolygon->offset(+$self->perimeter_flow->scaled_width);
|
||||||
my @lower = @{$lower_layer->slices}; # expolygons
|
my @lower = @{$lower_layer->slices}; # expolygons
|
||||||
|
|
||||||
# detect what edges lie on lower slices
|
# detect what edges lie on lower slices
|
||||||
@ -516,7 +516,7 @@ sub _detect_bridge_direction {
|
|||||||
foreach my $lower (@lower) {
|
foreach my $lower (@lower) {
|
||||||
# turn bridge contour and holes into polylines and then clip them
|
# turn bridge contour and holes into polylines and then clip them
|
||||||
# with each lower slice's contour
|
# with each lower slice's contour
|
||||||
my @clipped = map $_->split_at_first_point->clip_with_polygon($lower->contour), map @$_, @$grown;
|
my @clipped = map $_->split_at_first_point->clip_with_polygon($lower->contour), @$grown;
|
||||||
if (@clipped == 2) {
|
if (@clipped == 2) {
|
||||||
# If the split_at_first_point() call above happens to split the polygon inside the clipping area
|
# If the split_at_first_point() call above happens to split the polygon inside the clipping area
|
||||||
# we would get two consecutive polylines instead of a single one, so we use this ugly hack to
|
# we would get two consecutive polylines instead of a single one, so we use this ugly hack to
|
||||||
@ -567,7 +567,7 @@ sub _detect_bridge_direction {
|
|||||||
|
|
||||||
# detect anchors as intersection between our bridge expolygon and the lower slices
|
# detect anchors as intersection between our bridge expolygon and the lower slices
|
||||||
my $anchors = intersection_ex(
|
my $anchors = intersection_ex(
|
||||||
[ @$grown ],
|
$grown,
|
||||||
[ map @$_, @lower ],
|
[ map @$_, @lower ],
|
||||||
1, # safety offset required to avoid Clipper from detecting empty intersection while Boost actually found some @edges
|
1, # safety offset required to avoid Clipper from detecting empty intersection while Boost actually found some @edges
|
||||||
);
|
);
|
||||||
|
@ -111,6 +111,8 @@ void
|
|||||||
ExPolygon::from_SV_check(SV* expoly_sv)
|
ExPolygon::from_SV_check(SV* expoly_sv)
|
||||||
{
|
{
|
||||||
if (sv_isobject(expoly_sv) && (SvTYPE(SvRV(expoly_sv)) == SVt_PVMG)) {
|
if (sv_isobject(expoly_sv) && (SvTYPE(SvRV(expoly_sv)) == SVt_PVMG)) {
|
||||||
|
if (!sv_isa(expoly_sv, "Slic3r::ExPolygon") && !sv_isa(expoly_sv, "Slic3r::ExPolygon::Ref"))
|
||||||
|
CONFESS("Not a valid Slic3r::ExPolygon object");
|
||||||
// a XS ExPolygon was supplied
|
// a XS ExPolygon was supplied
|
||||||
*this = *(ExPolygon *)SvIV((SV*)SvRV( expoly_sv ));
|
*this = *(ExPolygon *)SvIV((SV*)SvRV( expoly_sv ));
|
||||||
} else {
|
} else {
|
||||||
|
@ -79,6 +79,8 @@ void
|
|||||||
Line::from_SV_check(SV* line_sv)
|
Line::from_SV_check(SV* line_sv)
|
||||||
{
|
{
|
||||||
if (sv_isobject(line_sv) && (SvTYPE(SvRV(line_sv)) == SVt_PVMG)) {
|
if (sv_isobject(line_sv) && (SvTYPE(SvRV(line_sv)) == SVt_PVMG)) {
|
||||||
|
if (!sv_isa(line_sv, "Slic3r::Line") && !sv_isa(line_sv, "Slic3r::Line::Ref"))
|
||||||
|
CONFESS("Not a valid Slic3r::Line object");
|
||||||
*this = *(Line*)SvIV((SV*)SvRV( line_sv ));
|
*this = *(Line*)SvIV((SV*)SvRV( line_sv ));
|
||||||
} else {
|
} else {
|
||||||
this->from_SV(line_sv);
|
this->from_SV(line_sv);
|
||||||
|
@ -122,6 +122,8 @@ void
|
|||||||
Point::from_SV_check(SV* point_sv)
|
Point::from_SV_check(SV* point_sv)
|
||||||
{
|
{
|
||||||
if (sv_isobject(point_sv) && (SvTYPE(SvRV(point_sv)) == SVt_PVMG)) {
|
if (sv_isobject(point_sv) && (SvTYPE(SvRV(point_sv)) == SVt_PVMG)) {
|
||||||
|
if (!sv_isa(point_sv, "Slic3r::Point") && !sv_isa(point_sv, "Slic3r::Point::Ref"))
|
||||||
|
CONFESS("Not a valid Slic3r::Point object");
|
||||||
*this = *(Point*)SvIV((SV*)SvRV( point_sv ));
|
*this = *(Point*)SvIV((SV*)SvRV( point_sv ));
|
||||||
} else {
|
} else {
|
||||||
this->from_SV(point_sv);
|
this->from_SV(point_sv);
|
||||||
|
@ -126,6 +126,15 @@ Polygon::to_SV_clone_ref() const {
|
|||||||
sv_setref_pv( sv, "Slic3r::Polygon", new Polygon(*this) );
|
sv_setref_pv( sv, "Slic3r::Polygon", new Polygon(*this) );
|
||||||
return sv;
|
return sv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Polygon::from_SV_check(SV* poly_sv)
|
||||||
|
{
|
||||||
|
if (sv_isobject(poly_sv) && !sv_isa(poly_sv, "Slic3r::Polygon") && !sv_isa(poly_sv, "Slic3r::Polygon::Ref"))
|
||||||
|
CONFESS("Not a valid Slic3r::Polygon object");
|
||||||
|
|
||||||
|
MultiPoint::from_SV_check(poly_sv);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ class Polygon : public MultiPoint {
|
|||||||
bool is_valid() const;
|
bool is_valid() const;
|
||||||
|
|
||||||
#ifdef SLIC3RXS
|
#ifdef SLIC3RXS
|
||||||
|
void from_SV_check(SV* poly_sv);
|
||||||
SV* to_SV_ref();
|
SV* to_SV_ref();
|
||||||
SV* to_SV_clone_ref() const;
|
SV* to_SV_clone_ref() const;
|
||||||
#endif
|
#endif
|
||||||
|
@ -96,6 +96,15 @@ Polyline::to_SV_clone_ref() const
|
|||||||
sv_setref_pv( sv, "Slic3r::Polyline", new Polyline(*this) );
|
sv_setref_pv( sv, "Slic3r::Polyline", new Polyline(*this) );
|
||||||
return sv;
|
return sv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Polyline::from_SV_check(SV* poly_sv)
|
||||||
|
{
|
||||||
|
if (!sv_isa(poly_sv, "Slic3r::Polyline") && !sv_isa(poly_sv, "Slic3r::Polyline::Ref"))
|
||||||
|
CONFESS("Not a valid Slic3r::Polyline object");
|
||||||
|
|
||||||
|
MultiPoint::from_SV_check(poly_sv);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,7 @@ class Polyline : public MultiPoint {
|
|||||||
Points equally_spaced_points(double distance) const;
|
Points equally_spaced_points(double distance) const;
|
||||||
|
|
||||||
#ifdef SLIC3RXS
|
#ifdef SLIC3RXS
|
||||||
|
void from_SV_check(SV* poly_sv);
|
||||||
SV* to_SV_ref();
|
SV* to_SV_ref();
|
||||||
SV* to_SV_clone_ref() const;
|
SV* to_SV_clone_ref() const;
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user