SuperSlicer icon indicating copy to clipboard operation
SuperSlicer copied to clipboard

Wall thickness in addition to perimeters

Open guestisp opened this issue 4 years ago • 10 comments

Would be possible to add a wall thickness parameter in addition to perimeter number ?

In exaple, when printing with a 0.40 nozzle and extrusion width (0.40), 3 perimeters means 1.20mm. If you change the nozzle size to a 0.80 or bigger, with extrusion width set to 1.2, 3 perimeters means 3.60mm but in most cases, would be OK to print the same object with just 1 periemter (1.20mm) in much less time

So, if wall thickness is set, it should override the perimeter number, if left to 0, perimeter number should be considered.

This allow the user to change nozzle and extrusion width but keeping the same printed thickness.

guestisp avatar Jun 23 '20 09:06 guestisp

This would be a very nice addition! Some more info also about other issues this feature would address can be found here: https://github.com/prusa3d/PrusaSlicer/issues/4019

More specifically I already posted my idea of this feature there: https://github.com/prusa3d/PrusaSlicer/issues/4019#issuecomment-623184196

It boils down to this: Actually, nobody really cares about the number of perimeters of an object. Instead, one should be able to configure the desired wall thickness. Needed parameters are:

On Printer Settings tab:

  • Minimum extrusion width (already present in SuperSlicer, basically your nozzle diameter)
  • Maximum extrusion width (depends on nozzle geometry, can be large e.g. for E3D nozzles with flat surface)

On Print Settings tab:

  • Target wall thickness

The slicer then tries to ensure the target wall thickness everywhere with the minimum number of perimeters. If the space is too narrow between two outer perimeters (thin walls) it reduces the extrusion width (this feature is already present). If the space between two walls is a bit too wide and would require gap fill, it increases the extrusion width slightly to avoid the gap fill operation.

yschroeder avatar Jun 25 '20 07:06 yschroeder

Proposal:

  • add a Maximum extrusion width in extruder
    • the real extrusion width is min(extrusion width as defined in width tab, Maximum extrusion width)
  • add a Target wall thickness (in mm) near number of perimeters
    • will deactivate external perimeter width, perimeter width
    • will use at least "perimeters (minimum)" perimeters (it will fire a popup if there are too many for a given extruder, to be sure if it's the user intent)
    • will set custom perimeter extrusion widths & perimeter number for each object (or region if using a different extruder).

objective: if you're printing a box with a 1.5 mm wall, you'll get the best result in one click.

supermerill avatar Oct 01 '20 14:10 supermerill

You said it would be done per object. It would work for a box with 1.5mm walls on all sides, but would fail for a box with one wall being a different thickness, right? This would also not work correctly for the cog wheels mentioned in https://github.com/prusa3d/PrusaSlicer/issues/4019

I think this needs to be evaluated per layer/line segment (and that sounds very computationally expensive).

Let me try to understand your proposal with an example:

Settings

  • Nozzle size: 0.4mm
  • Maximum extrusion width: 1mm (flat E3D nozzle)
  • Extrusion width: 0.45mm (reasonable default for 0.4mm nozzle)
  • Target wall thickness: 2.5mm (I want a strong print)
  • Perimeters (minimum): 2

Test cases

Note: I omit the overlaps for the extrusions to bond together in my calculations.

Case 1

  • Object: Solid object
  • Result: 3 perimeters each 0.83mm (2.5mm / ceil(2.5mm / 1mm)) or
  • Result 5 perimeters each 0.5mm (2.5mm / floor(2.5mm / 0.45mm))

Case 2

  • Object: Hollow object (vase) 0.3mm wall thickness
  • Result: 1 perimeter (this would be below the minimum) of 0.45mm width (results in overextrusion)

Case 3

  • Object: Hollow object (vase) 0.5mm wall thickness
  • Result: 1 perimeter (this would be below the minimum) of 0.5mm width

Case 4

  • Object: Hollow object (vase) 1.5mm wall thickness
  • Result: 2 perimeters each 0.75mm (1.5mm / ceil(1.5mm / 1mm)) or
  • Result: 3 perimeters each 0.5mm (1.5mm / floor(1.5mm / 0.45mm))

I as you can see, there are two possible solutions for two of the tests cases. I would always prefer the solution with less but thicker perimeters as they are stronger and generally print faster with better surface finish.

Also there are two edge cases: bridges and overhangs.

For bridges the perimeter width (and spacing) should be the nozzle size to avoid gaps, see #407

For overhangs, the width of the external perimeter should be chosen, so that at least 50% of it is supported by the layer below (to avoid printing the external perimeter in thin air) and it should not exceed the nozzle diameter dramatically, as this would result in the line not being squished onto the layer below. Basically the maximum extrusion width of the extruder can only be reached when there is a layer below to squish the material onto.

yschroeder avatar Oct 02 '20 09:10 yschroeder

I said "per object / region" only because you can assign a different extruder (and so nozzle) / perimeter width to it.

before slicing, it will initialize the perimeter count & width with a formula something like:

count = min(perimeters, 1+ (peri_obj_width -  ext_peri_width) / to_spacing(peri_width))
peri_width = max(peri_width, min(max_width, to_width( (peri_obj_width -  ext_peri_width) / count ) ))
ext_peri_width = max(ext_peri_width, min(max_width, peri_obj_width - count *peri_width))

and nothing else to do.

For bridges the perimeter width (and spacing) should be the nozzle size to avoid gaps, see #407

407 is about overhangs. That's an other issue. If you ask for a setting to enforce a width ~= nozzle diameter for every perimeter loop that go over a little bit of overhang, please ask for it in 407;

supermerill avatar Oct 02 '20 11:10 supermerill

I think I misunderstood what all this is about. Also I am not able to follow your formulas, as I don't know what to_spacing does and some of the variables are.

My experience is that it is not sufficient to adjust only perimeters to the extrusion width of a different nozzle, but you also need to change infill percentage, as the infill width changes as well and all the infill patterns rescale dramatically with changing extrusion width.

yschroeder avatar Oct 02 '20 19:10 yschroeder

I added a "wall thickness". It doesn't compute the perimeter number but the perimeters width. Is it good enough or not?

supermerill avatar Jul 26 '22 21:07 supermerill

I guess that would work. However, with Arachne perimeters in prusa slicer 2.5 a lot of perimeter related issues become obsolete...

yschroeder avatar Jul 26 '22 22:07 yschroeder

with Arachne perimeters a lot of perimeter related issues become obsolete...

Depends on your model, I made some tests and it can be very suboptimal (worse than actual).

supermerill avatar Jul 27 '22 00:07 supermerill

Yeah, the "stepped" nature of the arachne engine is disappointing. Is there a functional reason the steps couldn't be much smaller and more dense?

CCS86 avatar Jul 27 '22 02:07 CCS86

Honestly, i'm using the arache version of SuperSlicer and i didn't find anything strange except some little underextrusion (i think it's a bug) solved by using 1.2 as extrusion multiplier. Having no gap-fill is priceless and makes printing MUCH easier avoiding that micro-extrusion done by gapfill

I can't wait for the "fixed" arachne version, as most of perimeters related things are not working anymore (like 1 periemeter on top surface). Other than that, i also don't care the perimeters number, I would like to set the wall thickness and stop (like the bottom and top thickness) but it doesn't work.

guestisp avatar Oct 19 '22 13:10 guestisp