This has been something I’ve been tracking down as well. Below is what looks to be happening, at least from what I’ve seen. (Note, some, including bot, might describe me as blind, so…)
First, why is Z so accurate? It’s because the absolute height of the bottom of the nozzle (in most cases) sets the top of the layer. The material could flow sideways, which is what helps it adhere, but there’s no place to go in the up direction, at least not the pressures we’re working with. When the head moves to the next vertical layer, that relative movement is quite accurate, and again, the material’s top surface is limited by the nozzle.
Now, all that changes on the X and Y axes, right? By way of example, imagine a 200mm, single-thread-perimeter square. As the left-side thread is put down, the centerline of the nozzle’s opening is effectively at 0.000000…mm relative for that part. When the nozzle is later moved to the right-hand side, based on the stepsPerUnit, the controller ticks off (at current defaults) 10,050 steps. The resulting position of the head, then is at 100.00000…mm, assuming everything is perfectly exact.
Makes sense, right, and we’d have a fit if that head DIDN’T move exactly 100mm!
Now imagine the plastic being pressed into those exactly-positioned lines. Notice something? Yup, that’s right…the plastic isn’t constrained in the direction parallel to the bed. So the actual far-left edge is 0.000 - (0.5 * lineWidth), and the actual far-right edge is 100.000 + (0.5 * lineWidth). On a normal print, where the perimeters are done inside-first to outside-last, that outside thread is constrained to the inside, but not to the outside, and can somewhat freely vary.
I just confirmed that this appears to be exactly the issue. Earlier today I had printed a circular part with a 70.0 diameter, printed with an 0.5mm nozzle at an 0.30 line width. And guess what…I just measured it, and the part diameter varies from 70.31-70.50mm.
So, it seems we’re looking at something that’s totally normal to the medium.
The “proper” way to correct this then, is indeed as the other poster mentioned: include compensating offsets to crucial and mating perimeters/edges, measures of 0.5 line-width.
Sure, we could change the Xsteps/min and Ysteps/min, but that is not going to solve the problem, it will make ti worse, because smaller parts will get too little, and large parts too much compensation. And, as they say, they come “calibrated”, if only because the motors have a fixed, exact number of steps per revolution, and the lead screws has a specific and exact number of threads and thread-per-inch. When you add those up, there’s not really an place where “error” is going to creep in, unless it’s the horrible step-swallowing nightmare.
What is especially unkind in this regard is that we now have to encode production-processing details into the 3D model. The very idea offends my object-oriented sensibilities.
I seem to remember “guidance” at some point being to remove some percentage of an ABS part, blah blah blah. Maybe this is the thing that drove that advice?