diff --git a/lib/Slic3r/Config.pm b/lib/Slic3r/Config.pm index 6693dcb18..b17c93106 100644 --- a/lib/Slic3r/Config.pm +++ b/lib/Slic3r/Config.pm @@ -9,7 +9,7 @@ use List::Util qw(first max); our @Ignore = qw(duplicate_x duplicate_y multiply_x multiply_y support_material_tool acceleration adjust_overhang_flow standby_temperature scale rotate duplicate duplicate_grid rotate scale duplicate_grid start_perimeters_at_concave_points start_perimeters_at_non_overhang - randomize_start seal_position); + randomize_start seal_position bed_size); our $Options = print_config_def(); @@ -23,7 +23,7 @@ $Options->{threads}{readonly} = !$Slic3r::have_threads; *{$opt_key} = sub { $_[0]->get($opt_key) }; } } -sub bed_size { [200,200] } + sub new_from_defaults { my $class = shift; my (@opt_keys) = @_; @@ -297,11 +297,6 @@ sub validate { die "Invalid value for --infill-every-layers\n" if $self->infill_every_layers !~ /^\d+$/ || $self->infill_every_layers < 1; - # --bed-size - die "Invalid value for --bed-size\n" - if !ref $self->bed_size - && (!$self->bed_size || $self->bed_size !~ /^\d+,\d+$/); - # --skirt-height die "Invalid value for --skirt-height\n" if $self->skirt_height < -1; # -1 means as tall as the object diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 8565e6668..1007c33fa 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -50,7 +50,7 @@ sub new { my ($parent) = @_; my $self = $class->SUPER::new($parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); $self->{config} = Slic3r::Config->new_from_defaults(qw( - bed_size bed_shape print_center complete_objects extruder_clearance_radius skirts skirt_distance + bed_shape print_center complete_objects extruder_clearance_radius skirts skirt_distance )); $self->{model} = Slic3r::Model->new; $self->{print} = Slic3r::Print->new; @@ -132,7 +132,7 @@ sub new { } } - $self->{list} = Wx::ListView->new($self, -1, wxDefaultPosition, wxDefaultSize, wxLC_SINGLE_SEL | wxLC_REPORT | wxBORDER_SUNKEN | wxTAB_TRAVERSAL | wxWANTS_CHARS); + $self->{list} = Wx::ListView->new($self, -1, wxDefaultPosition, [250,-1], wxLC_SINGLE_SEL | wxLC_REPORT | wxBORDER_SUNKEN | wxTAB_TRAVERSAL | wxWANTS_CHARS); $self->{list}->InsertColumn(0, "Name", wxLIST_FORMAT_LEFT, 145); $self->{list}->InsertColumn(1, "Copies", wxLIST_FORMAT_CENTER, 45); $self->{list}->InsertColumn(2, "Scale", wxLIST_FORMAT_CENTER, wxLIST_AUTOSIZE_USEHEADER); @@ -284,6 +284,7 @@ sub new { { my $box = Wx::StaticBox->new($self, -1, "Info"); $object_info_sizer = Wx::StaticBoxSizer->new($box, wxVERTICAL); + $object_info_sizer->SetMinSize([350,-1]); my $grid_sizer = Wx::FlexGridSizer->new(3, 4, 5, 5); $grid_sizer->SetFlexibleDirection(wxHORIZONTAL); $grid_sizer->AddGrowableCol(1, 1); @@ -299,14 +300,14 @@ sub new { ); while (my $field = shift @info) { my $label = shift @info; - my $text = Wx::StaticText->new($self, -1, "$label:", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT); + my $text = Wx::StaticText->new($box, -1, "$label:", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT); $text->SetFont($Slic3r::GUI::small_font); $grid_sizer->Add($text, 0); - $self->{"object_info_$field"} = Wx::StaticText->new($self, -1, "", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT); + $self->{"object_info_$field"} = Wx::StaticText->new($box, -1, "", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT); $self->{"object_info_$field"}->SetFont($Slic3r::GUI::small_font); if ($field eq 'manifold') { - $self->{object_info_manifold_warning_icon} = Wx::StaticBitmap->new($self, -1, Wx::Bitmap->new("$Slic3r::var/error.png", wxBITMAP_TYPE_PNG)); + $self->{object_info_manifold_warning_icon} = Wx::StaticBitmap->new($box, -1, Wx::Bitmap->new("$Slic3r::var/error.png", wxBITMAP_TYPE_PNG)); $self->{object_info_manifold_warning_icon}->Hide; my $h_sizer = Wx::BoxSizer->new(wxHORIZONTAL); @@ -676,7 +677,7 @@ sub changescale { sub arrange { my $self = shift; - my $bb = Slic3r::Polygon->new_scale(@{$self->{config}->bed_shape})->bounding_box; + my $bb = Slic3r::Geometry::BoundingBoxf->new_from_points($self->{config}->bed_shape); eval { $self->{model}->arrange_objects($self->GetFrame->config->min_object_distance, $bb); }; @@ -752,7 +753,8 @@ sub split_object { sub schedule_background_process { my ($self) = @_; - $self->{apply_config_timer}->Start(PROCESS_DELAY, 1); # 1 = one shot + $self->{apply_config_timer}->Start(PROCESS_DELAY, 1) # 1 = one shot + if defined $self->{apply_config_timer}; } sub async_apply_config { @@ -835,7 +837,7 @@ sub start_background_process { sub stop_background_process { my ($self) = @_; - $self->{apply_config_timer}->Stop; + $self->{apply_config_timer}->Stop if defined $self->{apply_config_timer}; $self->statusbar->SetCancelCallback(undef); $self->statusbar->StopBusy; $self->statusbar->SetStatusText(""); @@ -1141,7 +1143,7 @@ sub on_config_change { $self->Layout; } elsif ($self->{config}->has($opt_key)) { $self->{config}->set($opt_key, $value); - if ($opt_key eq 'bed_size') { + if ($opt_key eq 'bed_shape') { $self->{canvas}->update_bed_size; $self->update; } diff --git a/lib/Slic3r/GUI/Plater/2D.pm b/lib/Slic3r/GUI/Plater/2D.pm index e7e69d7eb..97ef5fb36 100644 --- a/lib/Slic3r/GUI/Plater/2D.pm +++ b/lib/Slic3r/GUI/Plater/2D.pm @@ -221,8 +221,8 @@ sub mouse_event { my $model_object = $self->{model}->objects->[$obj_idx]; $model_object->instances->[$instance_idx]->set_offset( Slic3r::Pointf->new( - unscale($pos->[X] - $self->{drag_start_pos}[X]), - unscale($pos->[Y] - $self->{drag_start_pos}[Y]), + unscale($point->[X] - $self->{drag_start_pos}[X]), + unscale($point->[Y] - $self->{drag_start_pos}[Y]), )); $model_object->update_bounding_box; $self->Refresh; @@ -305,14 +305,11 @@ sub scaled_points_to_pixel { sub point_to_model_units { my ($self, $point) = @_; - my $canvas_height = $self->GetSize->GetHeight; my $zero = $self->{bed_origin}; - my $p = Slic3r::Point->new( + return Slic3r::Point->new( scale ($point->[X] - $zero->[X]) / $self->{scaling_factor}, - scale ($point->[Y] - $zero->[Y]) / $self->{scaling_factor}, + scale ($zero->[Y] - $point->[Y]) / $self->{scaling_factor}, ); - use XXX; YYY $p->pp; - return $p; } 1; diff --git a/xs/src/BoundingBox.cpp b/xs/src/BoundingBox.cpp index 9975eb025..17a9f5644 100644 --- a/xs/src/BoundingBox.cpp +++ b/xs/src/BoundingBox.cpp @@ -18,6 +18,7 @@ BoundingBoxBase<PointClass>::BoundingBoxBase(const std::vector<PointClass> &poin } } template BoundingBoxBase<Point>::BoundingBoxBase(const std::vector<Point> &points); +template BoundingBoxBase<Pointf>::BoundingBoxBase(const std::vector<Pointf> &points); template <class PointClass> BoundingBox3Base<PointClass>::BoundingBox3Base(const std::vector<PointClass> &points) @@ -65,6 +66,7 @@ BoundingBoxBase<PointClass>::scale(double factor) this->max.scale(factor); } template void BoundingBoxBase<Point>::scale(double factor); +template void BoundingBoxBase<Pointf>::scale(double factor); template void BoundingBoxBase<Pointf3>::scale(double factor); template <class PointClass> void @@ -76,6 +78,7 @@ BoundingBoxBase<PointClass>::merge(const PointClass &point) this->max.y = std::max(point.y, this->max.y); } template void BoundingBoxBase<Point>::merge(const Point &point); +template void BoundingBoxBase<Pointf>::merge(const Pointf &point); template <class PointClass> void BoundingBoxBase<PointClass>::merge(const BoundingBoxBase<PointClass> &bb) @@ -86,6 +89,7 @@ BoundingBoxBase<PointClass>::merge(const BoundingBoxBase<PointClass> &bb) this->max.y = std::max(bb.max.y, this->max.y); } template void BoundingBoxBase<Point>::merge(const BoundingBoxBase<Point> &bb); +template void BoundingBoxBase<Pointf>::merge(const BoundingBoxBase<Pointf> &bb); template <class PointClass> void BoundingBox3Base<PointClass>::merge(const PointClass &point) @@ -111,6 +115,7 @@ BoundingBoxBase<PointClass>::size() const return PointClass(this->max.x - this->min.x, this->max.y - this->min.y); } template Point BoundingBoxBase<Point>::size() const; +template Pointf BoundingBoxBase<Pointf>::size() const; template <class PointClass> PointClass BoundingBox3Base<PointClass>::size() const @@ -126,6 +131,7 @@ BoundingBoxBase<PointClass>::translate(coordf_t x, coordf_t y) this->max.translate(x, y); } template void BoundingBoxBase<Point>::translate(coordf_t x, coordf_t y); +template void BoundingBoxBase<Pointf>::translate(coordf_t x, coordf_t y); template <class PointClass> void BoundingBox3Base<PointClass>::translate(coordf_t x, coordf_t y, coordf_t z) @@ -144,6 +150,7 @@ BoundingBoxBase<PointClass>::center() const ); } template Point BoundingBoxBase<Point>::center() const; +template Pointf BoundingBoxBase<Pointf>::center() const; template <class PointClass> PointClass BoundingBox3Base<PointClass>::center() const diff --git a/xs/src/BoundingBox.hpp b/xs/src/BoundingBox.hpp index 92c2d063f..371985ec5 100644 --- a/xs/src/BoundingBox.hpp +++ b/xs/src/BoundingBox.hpp @@ -53,10 +53,15 @@ class BoundingBox : public BoundingBoxBase<Point> }; /* -class BoundingBoxf : public BoundingBoxBase<Pointf> {}; class BoundingBox3 : public BoundingBox3Base<Point3> {}; */ +class BoundingBoxf : public BoundingBoxBase<Pointf> { + public: + BoundingBoxf() {}; + BoundingBoxf(const std::vector<Pointf> &points) : BoundingBoxBase<Pointf>(points) {}; +}; + class BoundingBoxf3 : public BoundingBox3Base<Pointf3> { public: BoundingBoxf3() {}; diff --git a/xs/src/Point.cpp b/xs/src/Point.cpp index a17d0cd39..1f3cd9eb9 100644 --- a/xs/src/Point.cpp +++ b/xs/src/Point.cpp @@ -293,6 +293,18 @@ Pointf::from_SV(SV* point_sv) this->y = SvNV(sv_y); return true; } + +void +Pointf::from_SV_check(SV* point_sv) +{ + if (sv_isobject(point_sv) && (SvTYPE(SvRV(point_sv)) == SVt_PVMG)) { + if (!sv_isa(point_sv, perl_class_name(this)) && !sv_isa(point_sv, perl_class_name_ref(this))) + CONFESS("Not a valid %s object (got %s)", perl_class_name(this), HvNAME(SvSTASH(SvRV(point_sv)))); + *this = *(Pointf*)SvIV((SV*)SvRV( point_sv )); + } else { + this->from_SV(point_sv); + } +} #endif void diff --git a/xs/src/Point.hpp b/xs/src/Point.hpp index 9ba665f55..44914eea0 100644 --- a/xs/src/Point.hpp +++ b/xs/src/Point.hpp @@ -74,6 +74,7 @@ class Pointf #ifdef SLIC3RXS bool from_SV(SV* point_sv); + void from_SV_check(SV* point_sv); SV* to_SV_pureperl() const; #endif }; diff --git a/xs/xsp/BoundingBox.xsp b/xs/xsp/BoundingBox.xsp index 8ae2653be..3154de194 100644 --- a/xs/xsp/BoundingBox.xsp +++ b/xs/xsp/BoundingBox.xsp @@ -20,10 +20,10 @@ Clone<Point> center(); Clone<Point> min_point() %code{% RETVAL = THIS->min; %}; Clone<Point> max_point() %code{% RETVAL = THIS->max; %}; - double x_min() %code{% RETVAL = THIS->min.x; %}; - double x_max() %code{% RETVAL = THIS->max.x; %}; - double y_min() %code{% RETVAL = THIS->min.y; %}; - double y_max() %code{% RETVAL = THIS->max.y; %}; + long x_min() %code{% RETVAL = THIS->min.x; %}; + long x_max() %code{% RETVAL = THIS->max.x; %}; + long y_min() %code{% RETVAL = THIS->min.y; %}; + long y_max() %code{% RETVAL = THIS->max.y; %}; %{ @@ -39,6 +39,37 @@ new_from_points(CLASS, points) %} }; +%name{Slic3r::Geometry::BoundingBoxf} class BoundingBoxf { + ~BoundingBoxf(); + Clone<BoundingBoxf> clone() + %code{% RETVAL = THIS; %}; + void merge(BoundingBoxf* bb) %code{% THIS->merge(*bb); %}; + void merge_point(Pointf* point) %code{% THIS->merge(*point); %}; + void scale(double factor); + void translate(double x, double y); + Clone<Pointf> size(); + Clone<Pointf> center(); + Clone<Pointf> min_point() %code{% RETVAL = THIS->min; %}; + Clone<Pointf> max_point() %code{% RETVAL = THIS->max; %}; + double x_min() %code{% RETVAL = THIS->min.x; %}; + double x_max() %code{% RETVAL = THIS->max.x; %}; + double y_min() %code{% RETVAL = THIS->min.y; %}; + double y_max() %code{% RETVAL = THIS->max.y; %}; + +%{ + +BoundingBoxf* +new_from_points(CLASS, points) + char* CLASS + Pointfs points + CODE: + RETVAL = new BoundingBoxf(points); + OUTPUT: + RETVAL + +%} +}; + %name{Slic3r::Geometry::BoundingBoxf3} class BoundingBoxf3 { ~BoundingBoxf3(); Clone<BoundingBoxf3> clone() diff --git a/xs/xsp/my.map b/xs/xsp/my.map index e84a14403..27c85fe49 100644 --- a/xs/xsp/my.map +++ b/xs/xsp/my.map @@ -12,6 +12,10 @@ BoundingBox* O_OBJECT_SLIC3R Ref<BoundingBox> O_OBJECT_SLIC3R_T Clone<BoundingBox> O_OBJECT_SLIC3R_T +BoundingBoxf* O_OBJECT_SLIC3R +Ref<BoundingBoxf> O_OBJECT_SLIC3R_T +Clone<BoundingBoxf> O_OBJECT_SLIC3R_T + BoundingBoxf3* O_OBJECT_SLIC3R Ref<BoundingBoxf3> O_OBJECT_SLIC3R_T Clone<BoundingBoxf3> O_OBJECT_SLIC3R_T diff --git a/xs/xsp/typemap.xspt b/xs/xsp/typemap.xspt index d56f3fda0..a7959ad87 100644 --- a/xs/xsp/typemap.xspt +++ b/xs/xsp/typemap.xspt @@ -28,6 +28,9 @@ %typemap{BoundingBox*}; %typemap{Ref<BoundingBox>}{simple}; %typemap{Clone<BoundingBox>}{simple}; +%typemap{BoundingBoxf*}; +%typemap{Ref<BoundingBoxf>}{simple}; +%typemap{Clone<BoundingBoxf>}{simple}; %typemap{BoundingBoxf3*}; %typemap{Ref<BoundingBoxf3>}{simple}; %typemap{Clone<BoundingBoxf3>}{simple};