33 Commits

Author SHA1 Message Date
Lukáš Hejl
dc00f0bf98 Modified variable offset in the avoid crossing perimeters to not cause scars on thin objects (#7699).
Previously, the minimum contour width was chosen too conservative and, on some thin objects, only allowed minimal (or non) offset. This could result in travels being planned along the outer perimeter.

Now, the minimum contour width is chosen much smaller at the start and tested if the variable offset wasn't failed (the outer contour broke up into more parts, more or fewer holes, etc.).
If any problem is detected, the variable offset is recalculated with a larger minimum contour width.
2022-01-14 00:59:25 +01:00
Lukáš Hejl
285e2a32a2 Fixed issues in inner_offset() in the avoid crossing perimeters that caused in some cases travels to follow the first perimeter instead of the second one. 2021-12-16 08:57:04 +01:00
Lukáš Hejl
729ffc9dd6 Fixed that external travels led inside holes (around the perimeter) instead of inside the model when the avoid crossing perimeters was enabled.
Caused by changed behaviour of offset/expand functions when called on CW polygons (holes) after 7ff76d07684858fd937ef2f5d863f105a10f798e. When it is called expand on CW polygons (holes), they shrunk instead of expanded.
2021-12-16 08:56:29 +01:00
Lukáš Hejl
08402abf2b Used double instead of float for computing distance between two polygon vertices in precompute_polygon_distances() in the avoid crossing perimeters.
Using a float instead of a double caused accumulation of error in the calculated distance, which in rare cases triggered an assert in get_shortest_direction().
2021-12-14 14:49:00 +01:00
Lukáš Hejl
7f951c2df8 Fixed an issue that travels could lead through a hole when the avoid crossing perimeters was enabled at the same with "External perimeter first" or "Detect thin walls". 2021-12-02 09:35:20 +01:00
Lukáš Hejl
4d47e9a184 Allow travels processed by the avoid crossing perimeters move further away from the outer perimeter. 2021-10-18 12:51:20 +02:00
Vojtech Bubnik
7ff76d0768 New ClipperUtils functions: opening(), closing() as an alternative
for offset2() with clear meaning.
New ClipperUtils functions: expand(), shrink() as an alternative
for offset() with clear meaning.
All offset values for the new functions are positive.

Various offsetting ClipperUtils (offset, offset2, offset2_ex) working
over Polygons were marked as unsafe, sometimes producing invalid output
if called for more than one polygon. These functions were reworked
to offset polygons one by one. The new functions working over Polygons
shall work the same way as the old safe ones working over ExPolygons,
but working with Polygons shall be computationally more efficient.

Improvements in FDM support generator:
1) For both grid and snug supports: Don't filter out supports for which
   the contacts are completely reduced by support / object XY separation.
2) Rounding / merging of supports using the closing radius parameter is
   now smoother, it does not produce sharp corners.
3) Snug supports: When calculating support interfaces, expand the projected
   support contact areas to produce wider, printable and more stable interfaces.
4) Don't reduce support interfaces for snug supports for steep overhangs,
   that would normally not need them. Snug supports often produce very
   narrow support interface regions and turning them off makes the support
   interfaces disappear.
2021-10-14 09:11:31 +02:00
Vojtech Bubnik
38bb7d2950 1) New methods PrintObject::num_regions() and ::has_region() to make
the code more readable and to highlight where PrintObject::region_volumes
   are actually set and consumed.
2) Replaced Slic3r::clamp() with std::clamp(). They differ in the order
   of their parameters, thus hopefully no new bugs were introduced.
3) Some refactoring of MultiMaterialSegmentation for efficiency.
2021-04-22 11:41:26 +02:00
Lukáš Hejl
77d007c484 Fixed calculation of a distance from begin of a contour in the avoid crossing perimeters.
The total length of a contour was incorrectly computed, which could cause the longest detour was selected instead of the shortest one in some cases.
2021-02-23 20:56:36 +01:00
Lukáš Hejl
dc576b0511 Fixed inner offset in the avoid crossing perimeters.
Minimum contour width was used incorrectly, which could lead to breaking contour to more disconnected polygons.
2021-02-23 20:43:34 +01:00
Vojtech Bubnik
5f86d11c74 EdgeGrid refactoring to support both open and closed contours.
Squashed commit of the following:

commit 4e13a8fe19abcc9aae39a9bc4c7953a743196504
Merge: 6ae766409 6f89da1f3
Author: Vojtech Bubnik <bubnikv@gmail.com>
Date:   Fri Feb 5 11:19:35 2021 +0100

    Merge remote-tracking branch 'remotes/origin/master' into vb_edgegrid_open_lines

commit 6ae76640942269993c942861f0444088843e3fa1
Author: Vojtech Bubnik <bubnikv@gmail.com>
Date:   Fri Feb 5 11:14:48 2021 +0100

    EdgeGrid enhancement to accept both the open and closed lines.

commit 36a5efcd558bd5fd5f46b5f561387a2c73221553
Author: Vojtech Bubnik <bubnikv@gmail.com>
Date:   Fri Feb 5 10:52:14 2021 +0100

    EdgeGrid improvements: Documentation, one bug fix after recent refactoring.

commit 6f89da1f394561c7338676a1c8e8e72faeb85aad
Author: tamasmeszaros <meszaros.q@gmail.com>
Date:   Thu Feb 4 20:31:50 2021 +0100

    Disable libicu for boost-regex

    Should have been disabled from the beginning

commit ffc77b1a72a0be9b5622fd33defeebb24bf07b34
Author: Vojtech Bubnik <bubnikv@gmail.com>
Date:   Thu Feb 4 18:40:33 2021 +0100

    EdgeGrid: Annotated those methods that do not work with open contours.

commit 8039a645b4bf0c46c99b90a9c34e7189d7442f86
Author: Vojtech Bubnik <bubnikv@gmail.com>
Date:   Thu Feb 4 18:28:21 2021 +0100

    Refactoring of EdgeGrid structure to support both closed and open lines.
2021-02-05 11:21:04 +01:00
Lukáš Hejl
80251e0cf9 Fixed of unintentional disabling of wipe even in cases when avoid crossing perimeters weren't applied due to exceeding the maximum detour length. 2020-12-16 13:17:09 +01:00
Lukáš Hejl
0ca337ac7a Apply avoid crossing perimeters also for supports. 2020-12-15 06:46:44 +01:00
Vojtech Bubnik
b5f95dd4b4 Avoid crossing perimeters max detour could newly be specified
in percentage of the direct path.
2020-12-14 12:45:49 +01:00
Lukáš Hejl
98055de28c External paths avoid crossing perimeters of holes 2020-12-03 09:43:21 +01:00
Lukáš Hejl
f917b83706 Fixed compiler warnings 2020-11-29 17:29:11 +01:00
Lukáš Hejl
dd97eaa812 Fixed case when lslices in Layer is empty 2020-11-29 17:26:02 +01:00
Lukáš Hejl
55c282d85d Revamp of implementation of the avoid crossing perimeters algorithm.
The strategy for the avoid crossing perimeters algorithm has been redesigned. But external travels (travel between objects or supports) have not been solved yet. For these travels is used a direct path between two points.
Much of the code has been reworked, which leads to significant speedup compared to the previous implementation.
Also, several potential bugs have been fixed.
2020-11-29 13:58:36 +01:00
Vojtech Bubnik
060f1d48c1 Little more refactoring. 2020-11-20 11:56:40 +01:00
Vojtech Bubnik
f206b743fd Avoid crossing perimeters: Further refactoring for clarity, code review. 2020-11-17 15:34:50 +01:00
Vojtech Bubnik
62ab17bf6e AvoidCrossingPerimeters: Refactored for better encapsulation. 2020-11-17 10:42:27 +01:00
Vojtech Bubnik
04c2fde671 Removed the old motion planner. 2020-11-17 09:33:30 +01:00
Lukáš Hejl
49ce613be7 Enable previous heuristics which was disabled by mistake 2020-11-16 14:37:42 +01:00
Lukáš Hejl
c702b3b71d Add heuristics for removing unnecessary detours 2020-11-16 14:22:32 +01:00
Lukáš Hejl
9936b8e34e Add missing includes 2020-11-16 14:22:32 +01:00
Lukáš Hejl
3db66af716 Fix another compiler warning 2020-11-16 14:22:32 +01:00
Lukáš Hejl
266e6dee5d Fix compiler warnings 2020-11-16 14:22:32 +01:00
Lukáš Hejl
c00c7eaed3 Rework of outer borders to reduce unnecessary detours along the border.
The resulting path now contains all intersection with borders, which allows eliminating more unnecessary detours and more simplify the path.
2020-11-16 14:22:32 +01:00
Lukáš Hejl
ef9de07740 Disabling wipe for avoid crossing perimeters 2020-11-16 14:22:32 +01:00
Lukáš Hejl
7f94e9fa59 Fixed perimeters crossing when supports are printed. 2020-11-16 14:22:32 +01:00
Lukáš Hejl
2afeea5b6f Fixed division by zero when the layer is empty 2020-11-16 14:22:32 +01:00
Lukáš Hejl
3e98e2a4bd Fixed avoiding of other printed objects, again
Calling std::move on itself causes that the first polygon is empty, which results in disabling this feature on Linux.
This was fixed before, but I accidentally reverted it when AvoidCrossingPerimeters was moved to separate file.
2020-11-16 14:22:32 +01:00
Lukáš Hejl
8adf02a289 Moved AvoidCrossingPerimeters to separate file 2020-11-16 14:22:32 +01:00