pkgsrc-WIP-changes archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

prusaslicer: Update to 2.7.0



Module Name:	pkgsrc-wip
Committed By:	Paul Ripke <stix%stix.id.au@localhost>
Pushed By:	stix
Date:		Sat Dec 2 18:22:55 2023 +1100
Changeset:	47c3a34fe9c0fbb20517cc92c2ecd711a67b9b4e

Modified Files:
	prusaslicer/Makefile
	prusaslicer/PLIST
	prusaslicer/distinfo
	prusaslicer/patches/patch-src_libslic3r_SupportSpotsGenerator.cpp
	prusaslicer/patches/patch-src_slic3r_GUI_GLCanvas3D.cpp
	prusaslicer/patches/patch-src_slic3r_GUI_Preferences.cpp
	prusaslicer/patches/patch-src_slic3r_GUI_PrintHostDialogs.cpp
	prusaslicer/patches/patch-src_slic3r_GUI_Tab.cpp
Added Files:
	prusaslicer/patches/patch-src_imgui_imgui__demo.cpp
	prusaslicer/patches/patch-src_slic3r_GUI_EditGCodeDialog.cpp
	prusaslicer/patches/patch-src_slic3r_Utils_WifiScanner.cpp
Removed Files:
	prusaslicer/patches/patch-src_slic3r_GUI_GUI__ObjectManipulation.cpp

Log Message:
prusaslicer: Update to 2.7.0

Bug fixes with respect to 2.7.0-rc1

- macOS specific: Fixed a crash when using the spin controls in parameter pages
  (#11688).
- Fixed incorrect generation of a thumbnail in specific cases (#11686).
- Fixed wipe tower generating outside of its perimeter when extra spacing
  parameter was used (#11692).
- Fixed occasional stray extrusions when generating the wipe tower brim (#11708).

Improvements with respect to 2.7.0-beta1

- PrusaSlicer 2.7.0-alpha1 introduced the binary G-code format. The new format
  is enabled in our system profiles for Original Prusa MINI, XL and MK4
  printers, but it requires that the printer firmware is updated. Old firmware
  would not show the binary G-code files at all. Based on the feedback that we
  collected, this was a frequent problem and a source of confusion. Therefore,
  we decided to add an extra dialog informing the user about the need to
  update firmware. The dialog is shown when exporting binary G-code for the
  printer models mentioned above, and it contains a "Don't show again"
  checkbox, which dismisses the dialog for good.

Bug fixes with respect to 2.7.0-beta1

- macOS specific: Fixed a crash when modifying purging volumes (#11627).
- It was not possible to change selection in a focused combo boxes using the
  mouse wheel (#11640).
- Fixed a crash when opening the Shape Gallery (#11681).
- macOS specific: Fixed occasional failures to upload G-code to PrusaConnect.
  The problem was possibly caused by a bug in libCURL library shipped with the
  affected macOS versions (possibly curl/curl#11353). We worked around the
  problem by using HTTP/1.1 for libCURL requests (#11076, #11355, #11399).
- The helper arrows in the scene indicating direction when a value in Object
  Manipulation is being edited were not shown by mistake (#11636).
- Overhang fan speed was not reset before printing infill, which is now fixed.
  Thanks to @jschuh for debugging the issue and providing a fix (PR #11650,
  #11648).
- Fixed a possible crash when deleting the last object with auto-center enabled
  (#11186).
- Fixed incorrect placement of checkboxes in some of the dialogs.
- Linux specific: Fixed appearance of checkboxes in GTK2 version (#11664).
- Fixed updates of some Preferences options, e.g. when it changed as a result
  of "Remember my choice" checkbox in some dialog.
- Focus of spin controls did not work correctly in Config Wizard and Ramming
  dialog.
- Linux and macOS specific: Colors in the combo boxes did not change when
  system settings were changed (#11556).
- File names in the Shape Gallery were cut short (#11642).
- Fixed a hang occasionally happening during Arrange (#11392).
- When loading a 3MF containing a profile based on a system profile which is
  currently not installed, an incorrect preset was sometimes chosen instead of
  the temporary installed preset. Also, a notification is now shown when the
  temporary preset is installed (it was inadvertently removed in 2.7.0-alpha1).
- In certain cases, materials and filaments in Configuration Wizard were
  incorrectly marked as not compatible with the printer.
- When loading a 3MF with multiple filament profiles, some of the profiles were
  incorrectly marked as modified, even though they were not.

Infrastructure

- Update build_win.bat max version to Visual Studio 2022 (PR #11646, thanks to
  @jschuh, related to #11635).
- Updated build instructions for Windows, added deps/README.md containing
  details about building dependencies.

Travel moves improvements

To help fight stringing and oozing deposition, PrusaSlicer now implements
ramping travel moves. Previously you could set just the Lift height (Printer
Settings->Extruder) which resulted in the print head lifting up before each
travel move and then returning back down after the travel move. Such lift could
result in undesirable stringing, especially while using wider nozzles. Now you
can use the new ramping lift which ensures that the print head lifts up
gradually during the travel.

The feature can be turned on in Printer Settings->Extruder for each extruder
you are using in the new Travel lift section. You can override the setting for
each filament in the Filament overrides section. The ramping travel is
parametrized by an angle and a maximal ramping lift:

The ramping travel moves are now enabled in our system profiles for Original
Prusa XL.

To fully harness the stringing reduction potential of the ramping travels moves
a new layer change strategy is implemented while the ramping travel moves are
active. Instead of going straight up to the next layer the printer head follows
a helical ("screw thread") trajectory while changing layers. This feature is on
by default once the ramping travel move is used.

The helical travel move was inspired by the same feature in BambuStudio. Thanks
to bambulab for the idea.

Other improvements with respect to 2.7.0-alpha1

- After we collected feedback to the UI improvements presented in the previous
  alpha, we did several tweaks to the combo boxes. They react better to
  keyboard input, the spacing of the items is smaller, the scrollbar has been
  made wider and it allows dragging by mouse (#11499, #11505).
- Arrange is now faster in processing more complex scenarios (#11360).
- The thumbnails in the G-code are now colored correctly even when using the
  painting tool.
- A notification suggesting to upload Wi-Fi configuration data is opened when
  USB flash drive containing the configuration file is inserted. PrusaSlicer is
  then able to append the Wi-Fi data into the file.
- When PrusaConnect print host is selected in the Physical Printer dialog, the
  Browse button is now hidden as it would make little sense. When confirming
  the dialog, the URL field is checked and if it contains anything different
  from https://connect.prusa3d.com, the user is asked to confirm that it is
  intentional.
- A notification suggesting to upload Wi-Fi configuration data is opened when
  USB flash drive containing the configuration file is inserted. PrusaSlicer is
  then able to append the Wi-Fi data into the file.
- The SVG dialog contains an extra button "Face the camera", which rotates the
  SVG so it is perpendicular to current view direction.
- Trying to exporting ASCII G-code with binary G-code extension or vice versa
  is now reported as an error (#11498).
- Colors of selected volumes in the scene were slightly changed so the negative
  volumes are visible even when selected (#11496).

Bug fixes with respect to 2.7.0-alpha1

- The new "Wi-Fi Configuration File" dialog did not show correctly in dark mode
  and it did not use the new UI controls.
- Cancel object G-codes were not correctly emitted for RepRapFirmware and the
  objects were not labeled as a result (#11492).
- In some scenarios, an item in a combo box was duplicated.
- When using the cut tool and assigning a part of the model to the other side,
  connectors were missing after slicing (#11415, #11487).
- Fixed a rare crash when using 'Split to Objects' (#11484).
- Password authentication did not work correctly when sending G-code to Duet
  SBC (#10061).
- Perimeters were not generated when using Arachne perimeter generator with
  specific configuration (#11082, #11510).
- The wipe tower was not generated correctly when non-zero extruder offset was
  used.
- Number of tool changes in the statistics only showed when the wipe tower was
  enabled (#6832).
- When slicing with the wipe tower enabled and then disabling it, PrusaSlicer
  sometimes ended up in an infinite loop.
- Fixed incorrect label object markers at the start of the G-code when it was
  set to "OctoPrint comments" and the firmware flavor was Klipper (#11569).
- Fixed a UI glitch related to the scrollbar in Preferences dialog (#11566).
- Fixed invalid link to Organic Supports documentation (#11555).
- When using the experimental option "Wipe tower with no sparse layers", a
  travel move to the wipe tower was sometimes missing, which resulted in the
  print head digging into the last printed object (#11089).
- Spin controls which allow setting the value negative now accept minus sign
  input from the keyboard (#11574).
- When configuring a physical printer, the IP address was not always correctly
  read from the text field, resulting in failed uploads later on.
- Fixed a crash when slicing a sinking object with multiple instances (#11562).
- Fixed synchronization of instances when rotating an instance in Object
  Coordinates.
- Fixed a bug resulting in monotonic infill was not being monotonic (#11565).
- Fixed crash in multi-material painting gizmo and during generating multicolor
  thumbnails when number of extruders was changed.

Other

- 3DBenchy model and template models for signs were added to Shape Gallery.

Improvements with respect to 2.6.1

SVG embossing tool (#6916, #9373)

In addition to the text embossing tool first presented in PrusaSlicer 2.6.0, it
is now possible to emboss SVG images onto the models. The feature can be
accessed through right button click and it allows similar options for
projection and manipulation like the text tool.

When saving a project file, the user is asked whether they want to save the
path to the SVG file, which would allow them to further modify the embossing
parameters or reload the SVG from disk later. Otherwise, the SVG part is saved
as a model and editing it is no longer possible.

G2 and G3 G-code support #4352

Starting with this release, PrusaSlicer is able to emit G2 and G3 G-codes (arc
and circle moves). This results in smaller G-code files when compared to the
classic stream of plain G1 commands. The feature can be enabled in
Print Settings->Advanced->Slicing->Arc fitting. The G-code size reduction
heavily depends on the contents of the G-code, but we are talking tens of
percent in general.

Note that emission of G2 and G3 is not compatible with Pressure Equalizer
feature and with Spiral Vase mode. When either of the two is active, the G2 and
G3 G-codes will not be emitted regardless of how arc_fitting is set.

This feature is based on ArcWelderLib by @FormerLurker, who is also the author
of the famous ArcWelder OctoPrint plugin. Big thanks to @FormerLurker for all
the effort invested into the project and for making it open-source.

Binary G-code

G-code files are easy to read and interpret, but their downside is that the
data is not saved efficiently and the file size is often very large.
Compression of the file is problematic because the printers usually run on
limited hardware and they may not have enough memory and/or CPU power to
decompress it. Several solutions to the problem were proposed by members of the
community, such as MeatPack encoding (utilizing the fact that the character set
of a typical G-code is very limited) or heatshrink compression algorithm
(designed to have very small memory requirements).

We are proposing a new standard for a binary G-code format for encoding and
compressing ASCII G-code files (see the specification). The format is flexible
and the encoding and compression of individual blocks is variable. We also
provide libbgcode library which contains the routines to convert ASCII G-codes
to binary and vice versa. The library is written in C++ and the repository
includes bindings for Python.

Regarding comparison of ASCII vs binary G-code sizes, the result depends on the
contents of the G-code. Our testing shows that using binary G-code reduces the
size by about 70 % on average. Using arc fitting (described above) at the same
time can reduce the size even further. Following chart shows the comparison for
10 randomly selected 3MF projects:

The support for the new .bgcode file format was implemented in PrusaSlicer,
including its export, loading configs, previewing G-code or file associations.
Exporting binary G-code can be enabled in
Print Settings->Output options->Export as binary G-code. An option to convert
ASCII G-code to binary (or the opposite) has been added into File menu.

To print a binary G-code, it has to be supported by firmware of the printer.
For Original Prusa MINI, MK4 and XL printers, this is supported since version
5.1.0-alpha2. It is necessary to update printer firmware before using the
binary G-code format.

We would like to thank Scott Vokes (@atomicobject) for his work on heatshrink
and Scott Mudge (@scottmudge) for developing and maintaining MeatPack.

Improved user interface

The visual looks of user interface controls has been improved. They are now
more pleasant to look at in both light and dark mode and various UI quirks have
been resolved (e.g. #8877, #6399).

It is also now possible to change font size in the UI
(Configuration->Preferences->Other). #6317, #8278, #7159

Custom G-code editor

One of the features of PrusaSlicer is a powerful macro language that can be
used in various custom G-codes. In this release we added a dedicated dialog for
editing these G-codes. The dialog contains list of all available placeholders
for the given G-code and there is also a short description of each of the
placeholders. Double-clicking a placeholder (or clicking the "plus" button)
copies it into the G-code.

We believe that this will make editing custom G-codes more user-friendly and
better documented at the same time.

Cancel object (Marlin, RRF and Klipper)

For a long time, PrusaSlicer can emit object annotations for OctoPrint
CancelObject plugin, which allows to cancel an individual object while
printing. Starting with this release, we support these annotations also for
Marlin, RepRapFirmware and Klipper firmware, so the cancel object feature can
be used without relying on OctoPrint.

The feature can be configured in Print Settings->Output options->Label objects.
The option used to be a checkbox, it was now turned into a dropdown with
Disabled, OctoPrint comments and Firmware-specific options. When set to
Firmware-specific, the style of the annotations is chosen based on currently
selected firmware flavor in Printer Settings (Marlin/RRF: M486,
Klipper: EXCLUDE_OBJECT). When a different firmware flavor is selected, the
annotations are not generated.

List of all objects is emitted at the very beginning of the print, so the
printer knows about all the objects from the start.

For Klipper which supports graphical selection of the object to cancel, outline
polygons are also provided for each object. Thanks to @jschuh for providing the
implementation for Klipper (#10618).

The support for Marlin-style cancel object feature is implemented in Original
Prusa MINI, MK4 and XL printer firmware since version 5.1.0-alpha2.

Other improvements with respect to 2.6.1

- It is newly possible to emit several different thumbnail types (e.g. PNG and
  QOI) into the G-code. The old configuration options thumbnails and
  thumbnails_format were merged into one option called thumbnails and it
  accepts a string describing the required thumbnails. For example,
  440x240/QOI, 640x480/PNG, etc.
- Opening an old configuration in new PrusaSlicer will automatically convert
  the old configuration options into the new one. Opening the new configuration
  in older PrusaSlicer will also work, but only the extension of the first
  thumbnail in the list will be used.
- PrusaSlicer can generate an INI file containing Wi-Fi SSID and password for
  easier configuration of Original Prusa XL, MK4 and MINI printers. The option
  is available in Configuration->Wi-Fi Configuration File. You can select one
  of currently available networks and type in the password (PrusaSlicer will
  try to retrieve the password from the system and will auto-fill it when
  successful). Then you can save the configuration file on the USB drive of
  your choice. The INI file contains the Wi-Fi password in plaintext, make
  sure it is deleted after use. Note that loading the Wi-Fi info can fail in
  some cases. You can always enter the SSID and password as a text yourself.
- Connectors in the Cut tool can be rotated using a new slider in the Cut tool
  panel (#10284).
- macOS specific: The "About" menu item was moved from the Help section to the
  application menu (#10591, thanks to @iammattcoleman).
- When using Variable Layer Height tool, the value in the tooltip is truncated
  to 3 digits (#10298, thanks to @vovodroid)
- When importing a project containing multiple objects, there is a dialog
  asking whether they should be imported as parts of a single object. This is
  annoying in cases when one imports multiple projects at once. An extra "Apply
  to all" option was added into the dialog.
- Opening of Configuration Wizard is now faster.
- PrusaConnect print host is now available for Original Prusa MINI printer.
- It is now possible to use dark mode in the standalone G-code Viewer
  application.
- When loading a project/config containing post-processing scripts, the user is
  now notified and the post-processing script is shown to avoid unexpected
  behavior (thanks to Kamil Bre#ski for the suggestion).
- When the Configuration Update contains new printer models, the user is
  notified.

Bug fixes with respect to 2.6.1

- Fixed ooze prevention when 'other layers' temp is set to zero (#11194)
- Hyperlinks from parameter pages to Prusa Help did not work when using
  PrusaSlicer translated into a language that the help is not translated to
  (#11254).
- Fixed a crash during infill generation occurring with specific geometries
  (#11267, #11287).
- Some support extrusions were incorrectly considered as support interfaces
  even when support interfaces were disabled. This triggered an unwanted
  toolchanges when support interfaces were set to specific extruder (#11281).
- Fixed incorrect setting of near z plane in Preview, resulting in part of the
  Preview not being rendered.
- The placeholder input_filename was removed from PrusaSlicer macro language.
  The placeholder is not really useful and it was not generated correctly since
  PrusaSlicer 2.0.0.
- Fixed mangled preset name in Substitutions dialog when it contained non-ASCII
  characters.
- Fixed flickering of controls in parameter pages when a configuration option
  was being edited.
- Fixed incorrect color of modifiers when the object is below the bed.
- It was not possible to use all documented placeholders in Filament End G-code
  (#11329).
- Modifiers were incorrectly shown after using Undo in supports/seam painting
  tool.
- Fixed a crash in Configuration Wizard when installing a filament not
  compatible with currently selected printer (#11390).
- Menu items referring to NetFabb mesh-fixing service were changed to 'Windows
  repair algorithm', which is what is currently used (mentioned in #11199).
- Fixed a crash in the Cut tool in specific cases when cutting with dowels
  (mentioned in #11415).
- Fixed a rare crash when manipulating profiles with aliases.
- It was not possible to manipulate with mirrored object when it contained
  parts. This is now fixed.
- Fixed a problem with unresponsive controls in the scene when controls from
  Object Manipulation panel were used in between.
- Arrange did not account for extruder clearance when sequential printing was
  active, unless the Arrange settings dialog was opened first (#11258).
- macOS specific: Fixed rare issues with loading OBJ files on macOS Sonoma.
- Fixed visualization of toolpaths in the first layer and tool position when
  using z offset (#11337).
- Travel moves above the top layer were not shown in preview.
- Travel moves on the first layer were incorrectly shown even when first layer
  was not visible.
- Fixed a rare crash during G-code conflict checking.

Architecture, infrastructure

- More unit tests were rewritten from Perl to C++.
- Fixed several asserts triggered by wxWidgets (#10811, thanks to @pmjdebruijn).

Translations

- Updated dictionaries (CS, DE, ES, FR, IT, PL)

To see a diff of this commit:
https://wip.pkgsrc.org/cgi-bin/gitweb.cgi?p=pkgsrc-wip.git;a=commitdiff;h=47c3a34fe9c0fbb20517cc92c2ecd711a67b9b4e

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

diffstat:
 prusaslicer/Makefile                               | 19 ++++--
 prusaslicer/PLIST                                  | 71 ++++++++++++++++++++++
 prusaslicer/distinfo                               | 20 +++---
 .../patches/patch-src_imgui_imgui__demo.cpp        | 16 +++++
 .../patch-src_libslic3r_SupportSpotsGenerator.cpp  | 18 +++---
 .../patch-src_slic3r_GUI_EditGCodeDialog.cpp       | 33 ++++++++++
 .../patches/patch-src_slic3r_GUI_GLCanvas3D.cpp    | 13 +++-
 ...atch-src_slic3r_GUI_GUI__ObjectManipulation.cpp | 15 -----
 .../patches/patch-src_slic3r_GUI_Preferences.cpp   | 24 +++++++-
 .../patch-src_slic3r_GUI_PrintHostDialogs.cpp      | 23 ++-----
 prusaslicer/patches/patch-src_slic3r_GUI_Tab.cpp   | 19 ++++--
 .../patches/patch-src_slic3r_Utils_WifiScanner.cpp | 22 +++++++
 12 files changed, 227 insertions(+), 66 deletions(-)

diffs:
diff --git a/prusaslicer/Makefile b/prusaslicer/Makefile
index 689a1986ec..516de81131 100644
--- a/prusaslicer/Makefile
+++ b/prusaslicer/Makefile
@@ -1,6 +1,6 @@
 # $NetBSD$
 
-PKGVERSION=	2.6.1
+PKGVERSION=	2.7.0
 PKGNAME=	prusaslicer-${PKGVERSION}
 DISTNAME=	PrusaSlicer-${PKGVERSION:C/(beta|rc)/-\1/}
 CATEGORIES=	cad
@@ -18,11 +18,12 @@ LICENSE=	gnu-agpl-v3
 ONLY_FOR_PLATFORM=	*-*-aarch64 *-*-x86_64 *-*-earmv6 *-*-earmv7 *-*-i386
 
 # Uses std::to_chars_result from <charconv> which is actually gcc8+.
-GCC_REQD+=	10
-USE_LANGUAGES=	c c++17
-USE_TOOLS+=	cmake gmake pkg-config:run
-USE_CMAKE=	yes
-ICON_THEMES=	yes
+GCC_REQD+=		10
+USE_LANGUAGES=		c c++
+USE_CXX_FEATURES=	c++17
+USE_TOOLS+=		cmake gmake pkg-config:run
+USE_CMAKE=		yes
+ICON_THEMES=		yes
 
 BUILDLINK_TRANSFORM.NetBSD+=	rm:-ldl
 BUILDLINK_TRANSFORM.NetBSD+=	l:libexpat:expat
@@ -32,6 +33,11 @@ BUILDLINK_TRANSFORM.NetBSD+=	l:libexpat:expat
 CMAKE_ARGS+=	-DSLIC3R_FHS:BOOL=TRUE
 #CMAKE_ARGS+=	-DCMAKE_CXX_FLAGS:STRING=-g
 
+# CMake goes looking for this binary. Make it happy.
+pre-configure:
+	${LN} -s ${PREFIX}/bin/heatshrink ${BUILDLINK_DIR}/bin/
+	${LN} -s ${PREFIX}/bin/bgcode ${BUILDLINK_DIR}/bin/
+
 .include "../../archivers/brotli/buildlink3.mk"
 .include "../../comms/libhidapi/buildlink3.mk"
 .include "../../databases/shared-mime-info/buildlink3.mk"
@@ -62,6 +68,7 @@ CMAKE_ARGS+=	-DSLIC3R_FHS:BOOL=TRUE
 .include "../../textproc/expat/buildlink3.mk"
 .include "../../wip/cereal/buildlink3.mk"
 .include "../../wip/cgal/buildlink3.mk"
+.include "../../wip/libbgcode/buildlink3.mk"
 .include "../../wip/nanosvg/buildlink3.mk"
 .include "../../wip/nlopt/buildlink3.mk"
 .include "../../wip/opencascade-git/buildlink3.mk"
diff --git a/prusaslicer/PLIST b/prusaslicer/PLIST
index 2401c9c274..85a89b9c97 100644
--- a/prusaslicer/PLIST
+++ b/prusaslicer/PLIST
@@ -47,8 +47,16 @@ share/PrusaSlicer/icons/browse.svg
 share/PrusaSlicer/icons/bullet_black.png
 share/PrusaSlicer/icons/bullet_blue.png
 share/PrusaSlicer/icons/bullet_white.png
+share/PrusaSlicer/icons/burn.svg
 share/PrusaSlicer/icons/cancel.svg
 share/PrusaSlicer/icons/change_extruder.svg
+share/PrusaSlicer/icons/check_off.svg
+share/PrusaSlicer/icons/check_off_disabled.svg
+share/PrusaSlicer/icons/check_off_focused.svg
+share/PrusaSlicer/icons/check_on.svg
+share/PrusaSlicer/icons/check_on_disabled.svg
+share/PrusaSlicer/icons/check_on_focused.svg
+share/PrusaSlicer/icons/checked.svg
 share/PrusaSlicer/icons/cog.svg
 share/PrusaSlicer/icons/cog_.svg
 share/PrusaSlicer/icons/cog_go.png
@@ -60,12 +68,22 @@ share/PrusaSlicer/icons/colorchange_add_m.svg
 share/PrusaSlicer/icons/colorchange_del.svg
 share/PrusaSlicer/icons/colorchange_del_f.svg
 share/PrusaSlicer/icons/compare.svg
+share/PrusaSlicer/icons/convert_file.svg
 share/PrusaSlicer/icons/cooling.svg
 share/PrusaSlicer/icons/copy.svg
 share/PrusaSlicer/icons/copy_menu.svg
 share/PrusaSlicer/icons/cross.svg
 share/PrusaSlicer/icons/cross_focus.svg
 share/PrusaSlicer/icons/cross_focus_large.svg
+share/PrusaSlicer/icons/custom-gcode_gcode.svg
+share/PrusaSlicer/icons/custom-gcode_measure.svg
+share/PrusaSlicer/icons/custom-gcode_object-info.svg
+share/PrusaSlicer/icons/custom-gcode_single.svg
+share/PrusaSlicer/icons/custom-gcode_slicing-state.svg
+share/PrusaSlicer/icons/custom-gcode_slicing-state_global.svg
+share/PrusaSlicer/icons/custom-gcode_stats.svg
+share/PrusaSlicer/icons/custom-gcode_vector-index.svg
+share/PrusaSlicer/icons/custom-gcode_vector.svg
 share/PrusaSlicer/icons/cut.svg
 share/PrusaSlicer/icons/cut_.svg
 share/PrusaSlicer/icons/cut_connectors.svg
@@ -76,6 +94,7 @@ share/PrusaSlicer/icons/dot.svg
 share/PrusaSlicer/icons/dot_small.svg
 share/PrusaSlicer/icons/dot_white.svg
 share/PrusaSlicer/icons/dowel.svg
+share/PrusaSlicer/icons/drop_down.svg
 share/PrusaSlicer/icons/drop_to_bed.svg
 share/PrusaSlicer/icons/edit.svg
 share/PrusaSlicer/icons/edit_button.svg
@@ -208,6 +227,9 @@ share/PrusaSlicer/icons/re_slice.svg
 share/PrusaSlicer/icons/redo.svg
 share/PrusaSlicer/icons/redo_menu.svg
 share/PrusaSlicer/icons/redo_toolbar.svg
+share/PrusaSlicer/icons/reflection_x.svg
+share/PrusaSlicer/icons/reflection_y.svg
+share/PrusaSlicer/icons/refresh.svg
 share/PrusaSlicer/icons/remove.svg
 share/PrusaSlicer/icons/remove_copies.svg
 share/PrusaSlicer/icons/remove_menu.svg
@@ -215,6 +237,7 @@ share/PrusaSlicer/icons/resin.svg
 share/PrusaSlicer/icons/revert_all_.svg
 share/PrusaSlicer/icons/rotate.svg
 share/PrusaSlicer/icons/save.svg
+share/PrusaSlicer/icons/scalar_param.svg
 share/PrusaSlicer/icons/scale.svg
 share/PrusaSlicer/icons/seam.svg
 share/PrusaSlicer/icons/seam_.svg
@@ -232,6 +255,10 @@ share/PrusaSlicer/icons/sla_supports.svg
 share/PrusaSlicer/icons/sla_view_original.svg
 share/PrusaSlicer/icons/sla_view_processed.svg
 share/PrusaSlicer/icons/snap.svg
+share/PrusaSlicer/icons/spin_dec.svg
+share/PrusaSlicer/icons/spin_dec_act.svg
+share/PrusaSlicer/icons/spin_inc.svg
+share/PrusaSlicer/icons/spin_inc_act.svg
 share/PrusaSlicer/icons/splashscreen-gcodepreview.jpg
 share/PrusaSlicer/icons/splashscreen.jpg
 share/PrusaSlicer/icons/split_object_SMALL.svg
@@ -243,6 +270,9 @@ share/PrusaSlicer/icons/stl.icns
 share/PrusaSlicer/icons/support.svg
 share/PrusaSlicer/icons/support_blocker.svg
 share/PrusaSlicer/icons/support_enforcer.svg
+share/PrusaSlicer/icons/svg_modifier.svg
+share/PrusaSlicer/icons/svg_negative.svg
+share/PrusaSlicer/icons/svg_part.svg
 share/PrusaSlicer/icons/switch_presets.svg
 share/PrusaSlicer/icons/test.svg
 share/PrusaSlicer/icons/thumb_down.svg
@@ -253,6 +283,8 @@ share/PrusaSlicer/icons/tick_mark.svg
 share/PrusaSlicer/icons/time.svg
 share/PrusaSlicer/icons/timer_dot.svg
 share/PrusaSlicer/icons/timer_dot_empty.svg
+share/PrusaSlicer/icons/toggle_off.svg
+share/PrusaSlicer/icons/toggle_on.svg
 share/PrusaSlicer/icons/toolbar_arrow.svg
 share/PrusaSlicer/icons/toolbar_arrow_2.svg
 share/PrusaSlicer/icons/toolbar_background.png
@@ -260,6 +292,8 @@ share/PrusaSlicer/icons/undo.svg
 share/PrusaSlicer/icons/undo_menu.svg
 share/PrusaSlicer/icons/undo_toolbar.svg
 share/PrusaSlicer/icons/upload_queue.svg
+share/PrusaSlicer/icons/vector_filament_param.svg
+share/PrusaSlicer/icons/vector_param.svg
 share/PrusaSlicer/icons/wrench.svg
 share/PrusaSlicer/icons/wrench_white.svg
 share/PrusaSlicer/localization/PrusaSlicer.pot
@@ -377,6 +411,7 @@ share/PrusaSlicer/profiles/Anycubic/I3MEGAS_thumbnail.png
 share/PrusaSlicer/profiles/Anycubic/I3MEGA_thumbnail.png
 share/PrusaSlicer/profiles/Anycubic/MEGA0_thumbnail.png
 share/PrusaSlicer/profiles/Anycubic/PHOTON MONO SE_thumbnail.png
+share/PrusaSlicer/profiles/Anycubic/PHOTON MONO X 6K_thumbnail.png
 share/PrusaSlicer/profiles/Anycubic/PHOTON MONO X_thumbnail.png
 share/PrusaSlicer/profiles/Anycubic/PHOTON MONO_thumbnail.png
 share/PrusaSlicer/profiles/Anycubic/PREDATOR_thumbnail.png
@@ -405,6 +440,11 @@ share/PrusaSlicer/profiles/BIQU.ini
 share/PrusaSlicer/profiles/BIQU/BIQUBX_thumbnail.png
 share/PrusaSlicer/profiles/BIQU/BX_Bed.stl
 share/PrusaSlicer/profiles/BIQU/BX_Texture.png
+share/PrusaSlicer/profiles/CocoaPress.idx
+share/PrusaSlicer/profiles/CocoaPress.ini
+share/PrusaSlicer/profiles/CocoaPress/CocoaPress_MiniChef.png
+share/PrusaSlicer/profiles/CocoaPress/minichef_bed.stl
+share/PrusaSlicer/profiles/CocoaPress/minichef_texture.svg
 share/PrusaSlicer/profiles/Creality.idx
 share/PrusaSlicer/profiles/Creality.ini
 share/PrusaSlicer/profiles/Creality/CR10MAX_thumbnail.png
@@ -576,6 +616,9 @@ share/PrusaSlicer/profiles/Jubilee/Jubilee_texture.svg
 share/PrusaSlicer/profiles/Jubilee/Jubilee_thumbnail.png
 share/PrusaSlicer/profiles/LNL3D.idx
 share/PrusaSlicer/profiles/LNL3D.ini
+share/PrusaSlicer/profiles/LNL3D/LNL3D_D3_V2_bed.stl
+share/PrusaSlicer/profiles/LNL3D/LNL3D_D3_V2_texture.svg
+share/PrusaSlicer/profiles/LNL3D/LNL3D_D3_V2_thumbnail.png
 share/PrusaSlicer/profiles/LNL3D/LNL3D_D3_VULCAN_bed.stl
 share/PrusaSlicer/profiles/LNL3D/LNL3D_D3_VULCAN_texture.svg
 share/PrusaSlicer/profiles/LNL3D/LNL3D_D3_VULCAN_thumbnail.png
@@ -616,6 +659,9 @@ share/PrusaSlicer/profiles/Print4Taste/MC2.0_texture.svg
 share/PrusaSlicer/profiles/Print4Taste/MC2.0_thumbnail.png
 share/PrusaSlicer/profiles/PrusaResearch.idx
 share/PrusaSlicer/profiles/PrusaResearch.ini
+share/PrusaSlicer/profiles/PrusaResearch/MINIIS_ALPHA_thumbnail.png
+share/PrusaSlicer/profiles/PrusaResearch/MINIIS_BETA_thumbnail.png
+share/PrusaSlicer/profiles/PrusaResearch/MINIIS_thumbnail.png
 share/PrusaSlicer/profiles/PrusaResearch/MINI_thumbnail.png
 share/PrusaSlicer/profiles/PrusaResearch/MK2.5MMU2_thumbnail.png
 share/PrusaSlicer/profiles/PrusaResearch/MK2.5SMMU2S_thumbnail.png
@@ -623,8 +669,11 @@ share/PrusaSlicer/profiles/PrusaResearch/MK2.5S_thumbnail.png
 share/PrusaSlicer/profiles/PrusaResearch/MK2.5_thumbnail.png
 share/PrusaSlicer/profiles/PrusaResearch/MK2SMM_thumbnail.png
 share/PrusaSlicer/profiles/PrusaResearch/MK2S_thumbnail.png
+share/PrusaSlicer/profiles/PrusaResearch/MK39IS_thumbnail.png
+share/PrusaSlicer/profiles/PrusaResearch/MK39_thumbnail.png
 share/PrusaSlicer/profiles/PrusaResearch/MK3MMU2_thumbnail.png
 share/PrusaSlicer/profiles/PrusaResearch/MK3SMMU2S_thumbnail.png
+share/PrusaSlicer/profiles/PrusaResearch/MK3SMMU3_thumbnail.png
 share/PrusaSlicer/profiles/PrusaResearch/MK3S_thumbnail.png
 share/PrusaSlicer/profiles/PrusaResearch/MK3_thumbnail.png
 share/PrusaSlicer/profiles/PrusaResearch/MK4IS_thumbnail.png
@@ -632,12 +681,26 @@ share/PrusaSlicer/profiles/PrusaResearch/MK4IS_thumbnail_v2.png
 share/PrusaSlicer/profiles/PrusaResearch/MK4_thumbnail.png
 share/PrusaSlicer/profiles/PrusaResearch/SL1S_thumbnail.png
 share/PrusaSlicer/profiles/PrusaResearch/SL1_thumbnail.png
+share/PrusaSlicer/profiles/PrusaResearch/XL2IS_alpha_thumbnail.png
+share/PrusaSlicer/profiles/PrusaResearch/XL2IS_beta_thumbnail.png
+share/PrusaSlicer/profiles/PrusaResearch/XL2IS_thumbnail.png
+share/PrusaSlicer/profiles/PrusaResearch/XL2_thumbnail.png
+share/PrusaSlicer/profiles/PrusaResearch/XL5IS_alpha_thumbnail.png
+share/PrusaSlicer/profiles/PrusaResearch/XL5IS_beta_thumbnail.png
+share/PrusaSlicer/profiles/PrusaResearch/XL5IS_thumbnail.png
+share/PrusaSlicer/profiles/PrusaResearch/XL5_thumbnail.png
+share/PrusaSlicer/profiles/PrusaResearch/XLIS_alpha_thumbnail.png
+share/PrusaSlicer/profiles/PrusaResearch/XLIS_beta_thumbnail.png
+share/PrusaSlicer/profiles/PrusaResearch/XLIS_thumbnail.png
 share/PrusaSlicer/profiles/PrusaResearch/XL_thumbnail.png
 share/PrusaSlicer/profiles/PrusaResearch/mini.svg
+share/PrusaSlicer/profiles/PrusaResearch/miniIS.svg
+share/PrusaSlicer/profiles/PrusaResearch/miniISbeta.svg
 share/PrusaSlicer/profiles/PrusaResearch/mini_bed.stl
 share/PrusaSlicer/profiles/PrusaResearch/mk2.svg
 share/PrusaSlicer/profiles/PrusaResearch/mk2_bed.stl
 share/PrusaSlicer/profiles/PrusaResearch/mk3.svg
+share/PrusaSlicer/profiles/PrusaResearch/mk39.svg
 share/PrusaSlicer/profiles/PrusaResearch/mk3_bed.stl
 share/PrusaSlicer/profiles/PrusaResearch/mk4.svg
 share/PrusaSlicer/profiles/PrusaResearch/mk4_bed.stl
@@ -648,6 +711,8 @@ share/PrusaSlicer/profiles/PrusaResearch/sl1s.svg
 share/PrusaSlicer/profiles/PrusaResearch/sl1s_bed.stl
 share/PrusaSlicer/profiles/PrusaResearch/xl.svg
 share/PrusaSlicer/profiles/PrusaResearch/xl_bed.stl
+share/PrusaSlicer/profiles/PrusaResearch/xlis_alpha.svg
+share/PrusaSlicer/profiles/PrusaResearch/xlis_beta.svg
 share/PrusaSlicer/profiles/RatRig.idx
 share/PrusaSlicer/profiles/RatRig.ini
 share/PrusaSlicer/profiles/RatRig/VC3_300_thumbnail.png
@@ -890,6 +955,8 @@ share/PrusaSlicer/shaders/ES/variable_layer_height.fs
 share/PrusaSlicer/shaders/ES/variable_layer_height.vs
 share/PrusaSlicer/shaders/ES/wireframe.fs
 share/PrusaSlicer/shaders/ES/wireframe.vs
+share/PrusaSlicer/shapes/3DBenchy.png
+share/PrusaSlicer/shapes/3DBenchy.stl
 share/PrusaSlicer/shapes/M3_hex_nut.png
 share/PrusaSlicer/shapes/M3_hex_nut.stl
 share/PrusaSlicer/shapes/M3x10_screw.png
@@ -912,6 +979,10 @@ share/PrusaSlicer/shapes/helper_disk.png
 share/PrusaSlicer/shapes/helper_disk.stl
 share/PrusaSlicer/shapes/pyramid.png
 share/PrusaSlicer/shapes/pyramid.stl
+share/PrusaSlicer/shapes/sign_base.png
+share/PrusaSlicer/shapes/sign_base.stl
+share/PrusaSlicer/shapes/sign_base_rounded.png
+share/PrusaSlicer/shapes/sign_base_rounded.stl
 share/PrusaSlicer/shapes/sphere.png
 share/PrusaSlicer/shapes/sphere.stl
 share/PrusaSlicer/shapes/torus.png
diff --git a/prusaslicer/distinfo b/prusaslicer/distinfo
index b2274a04b5..3898fdddcc 100644
--- a/prusaslicer/distinfo
+++ b/prusaslicer/distinfo
@@ -1,19 +1,20 @@
 $NetBSD$
 
-BLAKE2s (PrusaSlicer-2.6.1.tar.gz) = 5c651adf66c360282f18c7483d2ad0fb01ec30d8dae1745090705ef035bac0fb
-SHA512 (PrusaSlicer-2.6.1.tar.gz) = 2b04eeff4feca2afd560b2fb6a5bbdaae6cabed2180d1416f2e4c7c385a50f859ec334c864a737b7c09eb3fd88f80af68655a0ef25ce9216b16549b16b3020b0
-Size (PrusaSlicer-2.6.1.tar.gz) = 58479800 bytes
+BLAKE2s (PrusaSlicer-2.7.0.tar.gz) = e6f2f3c46f61560f9a9480e70275c99acbff57daba501b922847a986ba16b366
+SHA512 (PrusaSlicer-2.7.0.tar.gz) = 787ba0a9c773a1cf0bf96f311cda13ba5c6354a36d893cfd2c1d0694b5cc438a6c8e0b88b34608d7dee049153c08a75ab419518e287b3a815e64f33b8b84dbe6
+Size (PrusaSlicer-2.7.0.tar.gz) = 64973946 bytes
 SHA1 (patch-CMakeLists.txt) = 33eb39d85ba7b33226f2cc022250872c3ffa28d8
 SHA1 (patch-cmake_modules_FindOpenVDB.cmake) = 4f2afc423a70fe60617b33ff7f26859b39775faa
 SHA1 (patch-src_CMakeLists_txt) = 24e0b8e6512b2a3f84204b03d8161aca903748a1
 SHA1 (patch-src_avrdude_arduino.c) = ff02a4cab1c2d8c82ec7b22c7447ed5ec360ac57
 SHA1 (patch-src_avrdude_libavrdude.h) = 62d48054b147985249664f257dbd8bbd670df233
+SHA1 (patch-src_imgui_imgui__demo.cpp) = 2de572e8ce6a53b9ce3755945985c3a8133ffa41
 SHA1 (patch-src_libslic3r_GCodeSender.cpp) = bd69c52e92ff85dba7f357eab62788a8e67a440e
 SHA1 (patch-src_libslic3r_LocalesUtils.cpp) = 33a473cadbc05eba7f0c218110e53babea36568c
 SHA1 (patch-src_libslic3r_LocalesUtils.hpp) = 88edc6156dd317e08ff6bfdf6f6f2d796c41ae05
 SHA1 (patch-src_libslic3r_Platform.cpp) = 3066585efc98ba4963e41bda5952df38a7b095a0
 SHA1 (patch-src_libslic3r_Platform.hpp) = 5626058616d04396bff6c8550951d04fe03249e4
-SHA1 (patch-src_libslic3r_SupportSpotsGenerator.cpp) = 332b8c8f0b4b7157d856bf0424e7c92a8a950f49
+SHA1 (patch-src_libslic3r_SupportSpotsGenerator.cpp) = b1080470f18e873ad7b39a5e56b4aabd8be87011
 SHA1 (patch-src_libslic3r_Thread.cpp) = 8aa488b933baa97132058f88a82eef8db73ab2f5
 SHA1 (patch-src_occt__wrapper_CMakeLists.txt) = 2e11271757bcc76f3832c8fd27943f3ef97136f1
 SHA1 (patch-src_slic3r_CMakeLists.txt) = 443efdac84f6b60f6016abaf034d40b80f5c1560
@@ -22,15 +23,15 @@ SHA1 (patch-src_slic3r_GUI_ConfigWizard.cpp) = 33b8539987e93d2392daca51729dc6f56
 SHA1 (patch-src_slic3r_GUI_ConfigWizard.hpp) = 6eed54e08497ec1dc6fea33263ab65d2d7e0dc0d
 SHA1 (patch-src_slic3r_GUI_DesktopIntegrationDialog.cpp) = 35ccd8882313eb3270e88c47d496d62db96f4d36
 SHA1 (patch-src_slic3r_GUI_DesktopIntegrationDialog.hpp) = c8760f69fac22d1a4cf8c7843fb96b12fdb69def
+SHA1 (patch-src_slic3r_GUI_EditGCodeDialog.cpp) = 4a66003e5eb8f78961560cdf5f4805e7f6b10e0f
 SHA1 (patch-src_slic3r_GUI_ExtraRenderers.cpp) = ac803510123ff016b8fa6f22d491c898166e0929
 SHA1 (patch-src_slic3r_GUI_Field.cpp) = a0901064c68aa5e6c2396ccec36018e45f92fbcb
-SHA1 (patch-src_slic3r_GUI_GLCanvas3D.cpp) = c6ba7c5418cbe0cd09310ed0c0f724de027ee2b6
+SHA1 (patch-src_slic3r_GUI_GLCanvas3D.cpp) = 11e42a87d7124ac92027af9e385533f0455d788b
 SHA1 (patch-src_slic3r_GUI_GUI.cpp) = ab8bb26e14f17eed20587693ac1ef568b8cd8cd5
 SHA1 (patch-src_slic3r_GUI_GUI.hpp) = 52442f3881564cfe7c31ff51d63c96129f162aed
 SHA1 (patch-src_slic3r_GUI_GUI__App.cpp) = bc9a4dc325caec2c3a7774b70e4074c73476b170
 SHA1 (patch-src_slic3r_GUI_GUI__Factories.cpp) = a3db8dc6e41c4df3cba7282fdd0cdadd1bc7d956
 SHA1 (patch-src_slic3r_GUI_GUI__ObjectLayers.cpp) = da99be89d62efffceaccc81ade8e55e1fadb7919
-SHA1 (patch-src_slic3r_GUI_GUI__ObjectManipulation.cpp) = 8c4e9e451642d5d5139d2ef64b3ca666655d05a5
 SHA1 (patch-src_slic3r_GUI_GUI__Preview.cpp) = 8555c73aa6aa3d65b4d34fc93ccb1fbb2957a76f
 SHA1 (patch-src_slic3r_GUI_GUI__Preview.hpp) = 904556d0f85f28a8174845089647bb3691783f37
 SHA1 (patch-src_slic3r_GUI_GUI__Utils.cpp) = bcbc83109ba7806e6371d0ef10f3c05cc480d730
@@ -42,12 +43,12 @@ SHA1 (patch-src_slic3r_GUI_Mouse3DController.hpp) = 6a008114e932b08951428b6fa882
 SHA1 (patch-src_slic3r_GUI_OpenGLManager.cpp) = 594d8a99824fead23010cdbf8f97d8ba6727ddbe
 SHA1 (patch-src_slic3r_GUI_OptionsGroup.cpp) = c413f24a9a50069b93bdd611b95fa85ccab45567
 SHA1 (patch-src_slic3r_GUI_Plater.cpp) = a9c45bac6bf524b411882f3eedc859401e8a1a35
-SHA1 (patch-src_slic3r_GUI_Preferences.cpp) = 522ee0f2b024836b2b1d5521f0d368c3dd2c24c5
+SHA1 (patch-src_slic3r_GUI_Preferences.cpp) = 3694f45161b03d7072249c815c462aa9e85f95cc
 SHA1 (patch-src_slic3r_GUI_PresetComboBoxes.cpp) = ae083491bb2b1228c0f666fdc36b1b3ca4008c3c
 SHA1 (patch-src_slic3r_GUI_PresetComboBoxes.hpp) = 0c84c1b706a1f4e00f60c1677c7edf53845d4467
-SHA1 (patch-src_slic3r_GUI_PrintHostDialogs.cpp) = bbdd89d236b4596f009616e553d601d3e032114c
+SHA1 (patch-src_slic3r_GUI_PrintHostDialogs.cpp) = fb83c21579d675c8459431e429e2e2d0c41fc623
 SHA1 (patch-src_slic3r_GUI_RemovableDriveManager.cpp) = 413499908128be48106d5fd6aea5d413bb959b35
-SHA1 (patch-src_slic3r_GUI_Tab.cpp) = ed793cdab5c04319f254b9dae5a63cf52056122a
+SHA1 (patch-src_slic3r_GUI_Tab.cpp) = 3b5a75e6feddd9434b7d17dc7c6b35e4debd7d92
 SHA1 (patch-src_slic3r_GUI_UnsavedChangesDialog.cpp) = 1594eb7521f23c42700b0fbed7c039b62e9d4029
 SHA1 (patch-src_slic3r_GUI_UnsavedChangesDialog.hpp) = 0bd01147f0b654d190534959708fbf346cbb364e
 SHA1 (patch-src_slic3r_GUI_UpdateDialogs.cpp) = 7fdcc609e66c619c110db2da18b24ddfd0ffe2a2
@@ -55,5 +56,6 @@ SHA1 (patch-src_slic3r_GUI_wxExtensions.cpp) = f36725675ad69d0f3a68183a8719ca4ba
 SHA1 (patch-src_slic3r_GUI_wxExtensions.hpp) = aa5bd2f325452cb2d9c2cef1dd50f37a149d7b6a
 SHA1 (patch-src_slic3r_Utils_FontConfigHelp.hpp) = 8027a1bc90a7f0ad1b53787a25f1e8a28c343ba2
 SHA1 (patch-src_slic3r_Utils_Serial.cpp) = 77dbb4e3526e932c04b8020b6f808278d1319bdb
+SHA1 (patch-src_slic3r_Utils_WifiScanner.cpp) = fbc26c4c6c48b8923b2427730351df55c1e05cfe
 SHA1 (patch-src_slic3r_Utils_WxFontUtils.cpp) = cc033a04f3219b0f4229344e14d44be63192db60
 SHA1 (patch-tests_fff__print_test__data.cpp) = 588e2a7ea980d82b7bb43eb7522b639101d0a337
diff --git a/prusaslicer/patches/patch-src_imgui_imgui__demo.cpp b/prusaslicer/patches/patch-src_imgui_imgui__demo.cpp
new file mode 100644
index 0000000000..be22804c6b
--- /dev/null
+++ b/prusaslicer/patches/patch-src_imgui_imgui__demo.cpp
@@ -0,0 +1,16 @@
+$NetBSD$
+
+Treat NetBSD like Linux.
+
+--- src/imgui/imgui_demo.cpp.orig	2023-11-23 14:51:47.000000000 +0000
++++ src/imgui/imgui_demo.cpp
+@@ -5678,6 +5678,9 @@ void ImGui::ShowAboutWindow(bool* p_open
+ #ifdef __linux__
+         ImGui::Text("define: __linux__");
+ #endif
++#ifdef __NetBSD__
++        ImGui::Text("define: __NetBSD__");
++#endif
+ #ifdef __APPLE__
+         ImGui::Text("define: __APPLE__");
+ #endif
diff --git a/prusaslicer/patches/patch-src_libslic3r_SupportSpotsGenerator.cpp b/prusaslicer/patches/patch-src_libslic3r_SupportSpotsGenerator.cpp
index a39d92a266..f63efc26f3 100644
--- a/prusaslicer/patches/patch-src_libslic3r_SupportSpotsGenerator.cpp
+++ b/prusaslicer/patches/patch-src_libslic3r_SupportSpotsGenerator.cpp
@@ -2,14 +2,14 @@ $NetBSD$
 
 Fix ambiguous lambda return type on netbsd evbarm.
 
---- src/libslic3r/SupportSpotsGenerator.cpp.orig	2023-06-02 13:41:15.000000000 +0000
+--- src/libslic3r/SupportSpotsGenerator.cpp.orig	2023-11-23 14:51:47.000000000 +0000
 +++ src/libslic3r/SupportSpotsGenerator.cpp
-@@ -849,7 +849,7 @@ std::tuple<SupportPoints, PartialObjects
-                         }
-                     }
+@@ -979,7 +979,7 @@ SliceMappings update_active_object_parts
                  }
--                auto estimate_conn_strength = [bottom_z](const SliceConnection &conn) {
-+                auto estimate_conn_strength = [bottom_z](const SliceConnection &conn) -> float {
-                     if (conn.area < EPSILON) { // connection is empty, does not exists. Return max strength so that it is not picked as the
-                                                // weakest connection.
-                         return INFINITY;
+             }
+             const float bottom_z = layer->bottom_z();
+-            auto estimate_conn_strength = [bottom_z](const SliceConnection &conn) {
++            auto estimate_conn_strength = [bottom_z](const SliceConnection &conn) -> float {
+                 if (conn.area < EPSILON) { // connection is empty, does not exists. Return max strength so that it is not picked as the
+                                            // weakest connection.
+                     return INFINITY;
diff --git a/prusaslicer/patches/patch-src_slic3r_GUI_EditGCodeDialog.cpp b/prusaslicer/patches/patch-src_slic3r_GUI_EditGCodeDialog.cpp
new file mode 100644
index 0000000000..c4a022097f
--- /dev/null
+++ b/prusaslicer/patches/patch-src_slic3r_GUI_EditGCodeDialog.cpp
@@ -0,0 +1,33 @@
+$NetBSD$
+
+Treat NetBSD like Linux.
+
+--- src/slic3r/GUI/EditGCodeDialog.cpp.orig	2023-11-23 14:51:47.000000000 +0000
++++ src/slic3r/GUI/EditGCodeDialog.cpp
+@@ -565,7 +565,7 @@ void ParamsModel::GetValue(wxVariant& va
+ 
+     ParamsNode* node = static_cast<ParamsNode*>(item.GetID());
+     if (col == (unsigned int)0)
+-#ifdef __linux__
++#if defined(__linux__) || defined(__NetBSD__)
+         variant << wxDataViewIconText(node->text, get_bmp_bundle(node->icon_name)->GetIconFor(m_ctrl->GetParent()));
+ #else
+         variant << DataViewBitmapText(node->text, get_bmp_bundle(node->icon_name)->GetBitmapFor(m_ctrl->GetParent()));
+@@ -580,7 +580,7 @@ bool ParamsModel::SetValue(const wxVaria
+ 
+     ParamsNode* node = static_cast<ParamsNode*>(item.GetID());
+     if (col == (unsigned int)0) {
+-#ifdef __linux__
++#if defined(__linux__) || defined(__NetBSD__)
+         wxDataViewIconText data;
+         data << variant;
+         node->icon = data.GetIcon();
+@@ -657,7 +657,7 @@ ParamsViewCtrl::ParamsViewCtrl(wxWindow 
+     this->AssociateModel(model);
+     model->SetAssociatedControl(this);
+ 
+-#ifdef __linux__
++#if defined(__linux__) || defined(__NetBSD__)
+     wxDataViewIconTextRenderer* rd = new wxDataViewIconTextRenderer();
+ #ifdef SUPPORTS_MARKUP
+     rd->EnableMarkup(true);
diff --git a/prusaslicer/patches/patch-src_slic3r_GUI_GLCanvas3D.cpp b/prusaslicer/patches/patch-src_slic3r_GUI_GLCanvas3D.cpp
index 8d3ee71c05..bc262b3b1f 100644
--- a/prusaslicer/patches/patch-src_slic3r_GUI_GLCanvas3D.cpp
+++ b/prusaslicer/patches/patch-src_slic3r_GUI_GLCanvas3D.cpp
@@ -2,9 +2,9 @@ $NetBSD$
 
 Treat NetBSD like Linux.
 
---- src/slic3r/GUI/GLCanvas3D.cpp.orig	2023-06-02 13:41:15.000000000 +0000
+--- src/slic3r/GUI/GLCanvas3D.cpp.orig	2023-11-23 14:51:47.000000000 +0000
 +++ src/slic3r/GUI/GLCanvas3D.cpp
-@@ -97,7 +97,7 @@ float RetinaHelper::get_scale_factor() {
+@@ -108,7 +108,7 @@ float RetinaHelper::get_scale_factor() {
  #endif // __WXGTK3__
  
  // Fixed the collision between BuildVolume::Type::Convex and macro Convex defined inside /usr/include/X11/X.h that is included by WxWidgets 3.0.
@@ -13,3 +13,12 @@ Treat NetBSD like Linux.
  #undef Convex
  #endif
  
+@@ -3622,7 +3622,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& 
+             mouse_up_cleanup();
+         }
+ 
+-//#if defined(__WXMSW__) || defined(__linux__)
++//#if defined(__WXMSW__) || defined(__linux__) || defined(__NetBSD__)
+ //        // On Windows and Linux needs focus in order to catch key events
+         if (m_canvas != nullptr) {
+ 
diff --git a/prusaslicer/patches/patch-src_slic3r_GUI_GUI__ObjectManipulation.cpp b/prusaslicer/patches/patch-src_slic3r_GUI_GUI__ObjectManipulation.cpp
deleted file mode 100644
index 29c81e103e..0000000000
--- a/prusaslicer/patches/patch-src_slic3r_GUI_GUI__ObjectManipulation.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-$NetBSD$
-
-Treat NetBSD like Linux.
-
---- src/slic3r/GUI/GUI_ObjectManipulation.cpp.orig	2023-06-02 13:41:15.000000000 +0000
-+++ src/slic3r/GUI/GUI_ObjectManipulation.cpp
-@@ -490,7 +490,7 @@ void ObjectManipulation::Show(const bool
-         const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection();
-         bool show_world_local_combo = wxGetApp().get_mode() != comSimple && (selection.is_single_full_instance() || selection.is_single_volume_or_modifier());
-         if (selection.is_single_volume_or_modifier() && m_word_local_combo->GetCount() < 3) {
--#ifdef __linux__
-+#if defined(__linux__) || defined(__NetBSD__)
-             m_word_local_combo->Insert(coordinate_type_str(ECoordinatesType::Local), 2);
- #else
-             m_word_local_combo->Insert(coordinate_type_str(ECoordinatesType::Local), wxNullBitmap, 2);
diff --git a/prusaslicer/patches/patch-src_slic3r_GUI_Preferences.cpp b/prusaslicer/patches/patch-src_slic3r_GUI_Preferences.cpp
index 2db0048f0f..693cfcffcf 100644
--- a/prusaslicer/patches/patch-src_slic3r_GUI_Preferences.cpp
+++ b/prusaslicer/patches/patch-src_slic3r_GUI_Preferences.cpp
@@ -2,9 +2,9 @@ $NetBSD$
 
 Treat NetBSD like Linux.
 
---- src/slic3r/GUI/Preferences.cpp.orig	2023-06-02 13:41:15.000000000 +0000
+--- src/slic3r/GUI/Preferences.cpp.orig	2023-11-23 14:51:47.000000000 +0000
 +++ src/slic3r/GUI/Preferences.cpp
-@@ -18,7 +18,7 @@
+@@ -28,7 +28,7 @@
  #ifdef WIN32
  #include <wx/msw/registry.h>
  #endif // WIN32
@@ -13,7 +13,16 @@ Treat NetBSD like Linux.
  #include "DesktopIntegrationDialog.hpp"
  #endif //__linux__
  
-@@ -688,7 +688,7 @@ void PreferencesDialog::accept(wxEvent&)
+@@ -262,7 +262,7 @@ void PreferencesDialog::build()
+ 	tabs = new Notebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_TOP | wxTAB_TRAVERSAL | wxNB_NOPAGETHEME | wxNB_DEFAULT);
+ #else
+     tabs = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_TOP | wxTAB_TRAVERSAL  |wxNB_NOPAGETHEME | wxNB_DEFAULT );
+-#ifdef __linux__
++#if defined(__linux__) || defined(__NetBSD__)
+ 	tabs->Bind(wxEVT_NOTEBOOK_PAGE_CHANGED, [this](wxBookCtrlEvent& e) {
+ 		e.Skip();
+ 		CallAfter([this]() { tabs->GetCurrentPage()->Layout(); });
+@@ -753,7 +753,7 @@ void PreferencesDialog::accept(wxEvent&)
  			downloader->allow(it->second == "1");
  		if (!downloader->on_finish())
  			return;
@@ -22,3 +31,12 @@ Treat NetBSD like Linux.
  		if( downloader->get_perform_registration_linux()) 
  			DesktopIntegrationDialog::perform_downloader_desktop_integration();
  #endif // __linux__
+@@ -1136,7 +1136,7 @@ void PreferencesDialog::create_settings_
+ 		font_example->SetFont(font);
+ 		m_values[opt_key] = format("%1%", val);
+ 		stb_sizer->Layout();
+-#ifdef __linux__
++#if defined(__linux__) || defined(__NetBSD__)
+ 		CallAfter([this]() { refresh_og(m_optgroup_other); });
+ #else
+ 		refresh_og(m_optgroup_other);
diff --git a/prusaslicer/patches/patch-src_slic3r_GUI_PrintHostDialogs.cpp b/prusaslicer/patches/patch-src_slic3r_GUI_PrintHostDialogs.cpp
index d2fb60868d..8f4792dfb1 100644
--- a/prusaslicer/patches/patch-src_slic3r_GUI_PrintHostDialogs.cpp
+++ b/prusaslicer/patches/patch-src_slic3r_GUI_PrintHostDialogs.cpp
@@ -5,20 +5,9 @@ Treat NetBSD like Linux.
 Upstream fix for boost deprecations:
 https://github.com/prusa3d/PrusaSlicer/issues/9294
 
---- src/slic3r/GUI/PrintHostDialogs.cpp.orig	2023-06-02 13:41:15.000000000 +0000
+--- src/slic3r/GUI/PrintHostDialogs.cpp.orig	2023-11-21 12:30:33.000000000 +0000
 +++ src/slic3r/GUI/PrintHostDialogs.cpp
-@@ -100,8 +100,8 @@ PrintHostSendDialog::PrintHostSendDialog
-     if (size_t extension_start = recent_path.find_last_of('.'); extension_start != std::string::npos)
-         m_valid_suffix = recent_path.substr(extension_start);
-     // .gcode suffix control
--    auto validate_path = [this](const wxString &path) -> bool {
--        if (! path.Lower().EndsWith(m_valid_suffix.Lower())) {
-+    auto validate_path = [this](const std::wstring &path) -> bool {
-+        if (! (new wxString(path))->Lower().EndsWith(m_valid_suffix.Lower())) {
-             MessageDialog msg_wingow(this, wxString::Format(_L("Upload filename doesn't end with \"%s\". Do you wish to continue?"), m_valid_suffix), wxString(SLIC3R_APP_NAME), wxYES | wxNO);
-             if (msg_wingow.ShowModal() == wxID_NO)
-                 return false;
-@@ -111,7 +111,7 @@ PrintHostSendDialog::PrintHostSendDialog
+@@ -115,7 +115,7 @@ PrintHostSendDialog::PrintHostSendDialog
  
      auto* btn_ok = add_button(wxID_OK, true, _L("Upload"));
      btn_ok->Bind(wxEVT_BUTTON, [this, validate_path](wxCommandEvent&) {
@@ -27,7 +16,7 @@ https://github.com/prusa3d/PrusaSlicer/issues/9294
              post_upload_action = PrintHostPostUploadAction::None;
              EndDialog(wxID_OK);
          }
-@@ -121,7 +121,7 @@ PrintHostSendDialog::PrintHostSendDialog
+@@ -125,7 +125,7 @@ PrintHostSendDialog::PrintHostSendDialog
      if (post_actions.has(PrintHostPostUploadAction::QueuePrint)) {
          auto* btn_print = add_button(wxID_ADD, false, _L("Upload to Queue"));
          btn_print->Bind(wxEVT_BUTTON, [this, validate_path](wxCommandEvent&) {
@@ -36,7 +25,7 @@ https://github.com/prusa3d/PrusaSlicer/issues/9294
                  post_upload_action = PrintHostPostUploadAction::QueuePrint;
                  EndDialog(wxID_OK);
              }
-@@ -131,7 +131,7 @@ PrintHostSendDialog::PrintHostSendDialog
+@@ -135,7 +135,7 @@ PrintHostSendDialog::PrintHostSendDialog
      if (post_actions.has(PrintHostPostUploadAction::StartPrint)) {
          auto* btn_print = add_button(wxID_YES, false, _L("Upload and Print"));
          btn_print->Bind(wxEVT_BUTTON, [this, validate_path](wxCommandEvent&) {
@@ -45,7 +34,7 @@ https://github.com/prusa3d/PrusaSlicer/issues/9294
                  post_upload_action = PrintHostPostUploadAction::StartPrint;
                  EndDialog(wxID_OK);
              }
-@@ -142,7 +142,7 @@ PrintHostSendDialog::PrintHostSendDialog
+@@ -146,7 +146,7 @@ PrintHostSendDialog::PrintHostSendDialog
          // Using wxID_MORE as a button identifier to be different from the other buttons, wxID_MORE has no other meaning here.
          auto* btn_simulate = add_button(wxID_MORE, false, _L("Upload and Simulate"));
          btn_simulate->Bind(wxEVT_BUTTON, [this, validate_path](wxCommandEvent&) {
@@ -54,7 +43,7 @@ https://github.com/prusa3d/PrusaSlicer/issues/9294
                  post_upload_action = PrintHostPostUploadAction::StartSimulation;
                  EndDialog(wxID_OK);
              }        
-@@ -152,7 +152,7 @@ PrintHostSendDialog::PrintHostSendDialog
+@@ -156,7 +156,7 @@ PrintHostSendDialog::PrintHostSendDialog
      add_button(wxID_CANCEL);
      finalize();
  
diff --git a/prusaslicer/patches/patch-src_slic3r_GUI_Tab.cpp b/prusaslicer/patches/patch-src_slic3r_GUI_Tab.cpp
index e29c36ed93..29396b1c9d 100644
--- a/prusaslicer/patches/patch-src_slic3r_GUI_Tab.cpp
+++ b/prusaslicer/patches/patch-src_slic3r_GUI_Tab.cpp
@@ -2,9 +2,18 @@ $NetBSD$
 
 Treat NetBSD like Linux.
 
---- src/slic3r/GUI/Tab.cpp.orig	2023-06-02 13:41:15.000000000 +0000
+--- src/slic3r/GUI/Tab.cpp.orig	2023-11-23 14:51:47.000000000 +0000
 +++ src/slic3r/GUI/Tab.cpp
-@@ -279,7 +279,7 @@ void Tab::create_preset_tab()
+@@ -296,7 +296,7 @@ void Tab::create_preset_tab()
+     m_treectrl = new wxTreeCtrl(panel, wxID_ANY, wxDefaultPosition, wxSize(20 * m_em_unit, -1),
+         wxTR_NO_BUTTONS | wxTR_HIDE_ROOT | wxTR_SINGLE | wxTR_NO_LINES | wxBORDER_SUNKEN | wxWANTS_CHARS);
+     m_treectrl->SetFont(wxGetApp().normal_font());
+-#ifdef __linux__
++#if defined(__linux__) || defined(__NetBSD__)
+     m_treectrl->SetBackgroundColour(m_parent->GetBackgroundColour());
+ #endif
+     m_left_sizer->Add(m_treectrl, 1, wxEXPAND);
+@@ -310,7 +310,7 @@ void Tab::create_preset_tab()
      // This helps to process all the cursor key events on Windows in the tree control,
      // so that the cursor jumps to the last item.
      m_treectrl->Bind(wxEVT_TREE_SEL_CHANGED, [this](wxTreeEvent&) {
@@ -13,7 +22,7 @@ Treat NetBSD like Linux.
          // Events queue is opposite On Linux. wxEVT_SET_FOCUS invokes after wxEVT_TREE_SEL_CHANGED,
          // and a result wxEVT_KILL_FOCUS doesn't invoke for the TextCtrls.
          // see https://github.com/prusa3d/PrusaSlicer/issues/5720
-@@ -3411,7 +3411,7 @@ void Tab::load_current_preset()
+@@ -3716,7 +3716,7 @@ void Tab::load_current_preset()
                          else
  #endif
                              wxGetApp().tab_panel()->InsertPage(wxGetApp().tab_panel()->FindPage(this), tab, tab->title());
@@ -22,7 +31,7 @@ Treat NetBSD like Linux.
                              int page_id = wxGetApp().tab_panel()->FindPage(tab);
                              wxGetApp().tab_panel()->GetPage(page_id)->Show(true);
                          #endif // __linux__
-@@ -3821,7 +3821,7 @@ bool Tab::tree_sel_change_delayed()
+@@ -4137,7 +4137,7 @@ bool Tab::tree_sel_change_delayed()
      // There is a bug related to Ubuntu overlay scrollbars, see https://github.com/prusa3d/PrusaSlicer/issues/898 and https://github.com/prusa3d/PrusaSlicer/issues/952.
      // The issue apparently manifests when Show()ing a window with overlay scrollbars while the UI is frozen. For this reason,
      // we will Thaw the UI prematurely on Linux. This means destroing the no_updates object prematurely.
@@ -31,7 +40,7 @@ Treat NetBSD like Linux.
      std::unique_ptr<wxWindowUpdateLocker> no_updates(new wxWindowUpdateLocker(this));
  #else
      /* On Windows we use DoubleBuffering during rendering,
-@@ -3867,7 +3867,7 @@ bool Tab::tree_sel_change_delayed()
+@@ -4183,7 +4183,7 @@ bool Tab::tree_sel_change_delayed()
          if (wxGetApp().mainframe!=nullptr && wxGetApp().mainframe->is_active_and_shown_tab(this))
              activate_selected_page(throw_if_canceled);
  
diff --git a/prusaslicer/patches/patch-src_slic3r_Utils_WifiScanner.cpp b/prusaslicer/patches/patch-src_slic3r_Utils_WifiScanner.cpp
new file mode 100644
index 0000000000..d3276b3d5d
--- /dev/null
+++ b/prusaslicer/patches/patch-src_slic3r_Utils_WifiScanner.cpp
@@ -0,0 +1,22 @@
+$NetBSD$
+
+Treat NetBSD like Linux.
+
+--- src/slic3r/Utils/WifiScanner.cpp.orig	2023-11-23 14:51:47.000000000 +0000
++++ src/slic3r/Utils/WifiScanner.cpp
+@@ -19,7 +19,7 @@
+ #include "WifiScannerMac.h"
+ #endif 
+ 
+-#if __linux__
++#if defined(__linux__) || defined(__NetBSD__)
+ #include <dbus/dbus.h> /* Pull in all of D-Bus headers. */
+ #endif //__linux__
+ 
+@@ -457,4 +457,4 @@ std::string WifiScanner::get_psk(const s
+     }
+     return {};
+ }
+-} // Slic3r
+\ No newline at end of file
++} // Slic3r


Home | Main Index | Thread Index | Old Index