Inconsistent inner/outer dimensions


Using CuraEngine with my Ender 3, I'm getting what I'd call inconsistent inner and outer dimensions - for example, a nominally 3 mm peg is significantly larger than a 3 mm hole, and it takes dimensions something like 2.9 mm for the peg and 3.1 mm for the hole to get them to fit. Is this level of error normal? Is it caused by overextrusion, or does CuraEngine run its paths along the curve of the slice rather than offset by approximately half the nozzle width inside the sliced region? The magnitude of the error being almost exactly 0.2 mm, which is half of the 0.4 mm nozzle diameter, makes me wonder if it's the latter.


Posted 2019-02-09T02:29:53.833

Reputation: 5 311



Cura does correctly account for line extrusion widths wheen positioning the lines, and attempting to fix this with negative xy_offset was a mistake that led to lots of problems: in some cases, it completely eliminated tiny components of the model and left gaps in layers. At some point after asking this question, I did a new test with 8mm peg and hole, and I was actually able to force the 8mm peg into the hole (but not remove it) using tools, without cracking the parts, so I think past tiny sizes where dimensional accuracy is very difficult to achieve, everything is just about right.


Posted 2019-02-09T02:29:53.833

Reputation: 5 311


Filament expands slightly as it is extruded. Also, the width of the extrusion depends on the volume of plastic extruded (not the nozzle size), as well as the amount that it is "squidged" down. Some slicers (e.g. Simplify3D) allow you to specify the width of the extrusion that you desire, but I'm not sure if Cura does this. You can fine tune the width of extrusions by adjusting the flow rate. Note that apertures get larger as nozzles wear out, but this should not affect the width of the extrusion very much since the determining factor is volumetric flow rate.

I would say that if you are getting a dimensional accuracy of +/- 0.1mm, you are doing pretty well. If you want to improve on this, you will need to calibrate your extruder and also monitor closely the average diameter of the filament that you are using. I have included a link to an external article, since doing this is beyond the scope of my answer. However, I doubt if it is possible to get push-fit accuracy with FDM printing without fudging the dimensions of the objects that you want to print.

3D Hubs: How to calibrate, tune and fine tune your printer and filament


Posted 2019-02-09T02:29:53.833

Reputation: 2 597


The effect you are describing is called "die swell"; you can counteract this effect in the calibration of the extruder.

– 0scar – 2019-02-09T09:52:32.440

Do you know if Cura compensates for the width of extrusion it's attempting to produce by positioning of the path? Of course this won't solve the problem if the width of extrusion (after "die swell") differs from what it expects, but if it doesn't do such compensation I don't think any reduction in extrusion rate could fix this. – R.. GitHub STOP HELPING ICE – 2019-02-09T13:59:59.570

I've no idea. You could, of course, just examine the G-code. S3D sets a default line width of 0.48mm for a 0.4mm nozzle, whereas Cura just uses the nozzle diameter. Maybe S3D is trying to compensate for die swell? – Mick – 2019-02-09T14:29:20.750

1Interesting. Yeah, I probably need to dig into the gcode output to figure out what it's doing (or the source, but that's usually worse). – R.. GitHub STOP HELPING ICE – 2019-02-09T14:37:33.740

I'm not sure I'd call it "fudging." For a given material, and a reasonable range of hole sizes, you should be able to calibrate (much nicer-sounding word :-) ) the excess pin diameter and/or the loss of hole diameter. – Carl Witthoft – 2019-02-11T19:00:12.683

@CarlWitthoft: I'd call it fudging (or a hack) if you have to modify the object geometry rather than the slicing parameters to fix it. Calibration should be something that happens at the slicing layer to produce an output that accurately reflects the source model. – R.. GitHub STOP HELPING ICE – 2019-02-11T19:38:05.610

I think the wall_0_inset setting of CuraEngine might be what I need. It looks like it's auto-set when called from Cura python gui (but doesn't do anything even then unless wall_line_width_0 is less than machine_nozzle_size), but needs to be computed and set manually when invoking CuraEngine directly. – R.. GitHub STOP HELPING ICE – 2019-02-11T19:50:09.757

Or perhaps just xy_offset... – R.. GitHub STOP HELPING ICE – 2019-02-11T20:08:52.250

I've been able to fudge/calibrate it with either xy_offset=-0.1 or material_flow=80, but the latter leaves serious ridges in the top skin and obviously isn't right. I haven't been able to get wall_0_inset to do anything meaningful. – R.. GitHub STOP HELPING ICE – 2019-02-11T21:29:39.307

@Mick: From examining the gcode, Cura does indeed position the path for the outer wall inset by half the nozzle-width from the surface. Further, xy_offset behaves as expected and allows it to be offset from there in either direction. – R.. GitHub STOP HELPING ICE – 2019-02-11T23:20:31.380