slic3r / Slic3r

Open Source toolpath generator for 3D printers
https://slic3r.org/
GNU Affero General Public License v3.0
3.35k stars 1.29k forks source link

"Avoid crossing perimeters" causes unnecessarily long moves #1326

Open kefir- opened 11 years ago

kefir- commented 11 years ago

I enable "avoid crossing perimeters", not because I'm so bothered about crossing perimeters, but because I want prints to finish perimeters and infill on separate islands before moving on.

When I enable this, I sometimes get really long moves that don't really seem to make sense. Here's an example. This is based on a print of 2 items of the "Hollower calibration pyramid" from http://www.thingiverse.com/thing:29429

long-moves-on-avoid-perimeters

I'd like to make a couple of suggestions:

  1. Using "avoid crossing perimeters" to complete islands is a workaround, because that option does a lot more than I really want. There should be a separate option for "complete islands"
  2. The "avoid crossing perimeters" option appears to avoid perimeters not just on the current or even the last layer, but it appears to avoids perimeters that are tens of layers down or more. Is that intentional? I don't see the point of that.
  3. The moves should be optimized to be as short as possible. I get blobs where the moves are extra long, I've seen moves that are farther than the farthest straight move possible on my entire print bed, so it's not surprising that the nozzle dribbles a little. In addition, it seems the islands are often printed in a suboptimal order. I think slic3r goes out of it's way to print all the islands belonging to one part first, and then all the islands belonging to another part later. It would be better if slic3r just treated all the islands as if they had equal priority, and tried to minimize move distance. The 8 islands in the picture should be printed in a clockwise or counterclockwise order, and then repeat on the next layer.

Here's the gcode the screenshot is taken from, config embedded. Gcode generated with current git head, but I've had similar issues with recent releases.

http://kefirshare.dreamhosters.com/Hollower_pyramid_20130715-225316_0.9.11-dev.gcode

rohieb commented 11 years ago

I have a similar issue with "Avoid crossing perimeters". My model is basically a frame, with two ears on the short sides at the top. For printing these ears I need support, so there is support on the left and on the right of the frame. In this case, Slic3r (rev. 94330488730) generates long moves away from the currently printed support, just to return to where the print head was, and print the next line of support. Also, it sometimes even crosses the perimeters of the frame when changing between the two support islands.

The resulting GCode can be found at http://rohieb.name/stuff/case-lcd-T035ZT241F-mirror-nozzle40.gcode, an example video is at http://www.youtube.com/watch?v=zHWcXeJqdEs

whosawhatsis commented 11 years ago

Another problem is that this creates sharp corners at maximum (travel) speed, making the machine likely to skip and lose position. This feature needs to try to find more direct paths through empty interior space rather than always jumping to the outside (maybe use the normal travel path but divert around objects that are in the way, staying outside islands that are not being printed the same way it stays inside ones that are), and it would be nice if would limit the angle of corners in travel moves to smooth out the motion. It should also recognize when there is no unobstructed path (like passing through a ring to print something inside it) and just take the most direct route.

kefir- commented 11 years ago

I may be straying from the issue here, but as mentioned, I only use the "avoid crossing perimeters" to make slic3r always finish each island before moving on. I actually don't see why that isn't the default - and only - behaviour. When is it a good thing to do all the perimeters on all the disjoint islands, and then come back to do the infills later? I can only see that this could make sense if printing with multiple extruders, but that's a different case. I'd like to suggest that slic3r should always finish each disjoint island, perimeter and infill, and I don't really think there's a reason to have an option to do all perimeters and then all infills when printing with one extruder. "Avoid crossing perimeters" could continue to exist like today, but I probably wouldn't use it most of the time.

alranel commented 10 years ago

An update: as @kefir- suggested, recent Slic3r versions always finish every island completely before moving onto next one, even if Avoid crossing perimeters is not enabled.

lordofhyphens commented 8 years ago

@kefir- is this still a problem then in 1.2.9 or 1.3.0-dev?