It depends on your specific case, of course. That 0.4mm is indeed a good rule of thumb. But also, assuming you’re dealing with FFF-printed parts, generally if the two parts slide together along the layer lines, it’ll feel just a little looser than if they slide together perpendicular to layer lines. That’s just due to the ribbed texture inherent to FFF printing. Though printing at smaller layer heights will reduce that effect and also make the parts fit just a little looser over all.
Aside from that, probably the best advice I can give is:
- Measure/calibrate for dimensional accuracy. [Here]'s a random article on the topic that looks pretty good to me.
- Prototype. Print once, if it doesn’t fit right, adjust the model(s) and print again. Filament is pretty cheap, really. Also, depending on your situation, you might benefit from doing quick test prints just to see how well it fits. If the whole print is going to take 8 hours but by spending 30 minutes printing just part of the final product you can prove you’ve got the dimensions right, it’s probably worth it to do the 30 minute print.
- Use elasticity to your advantage. Make latches or attachments that snap into place. That’s useful whether the parts are meant to go together once and never come apart or connect and disconnect repeatedly. Another use for elasticity is if you need two arms of one piece to friction-grip another rectangulat piece, angle the arms inward just a degree or two. One word of caution, though. It can be really easy to overestimate the flexibility of PLA. I’ve ended up once or twice with some pretty hard to open latches.
Where I work in software development, we were about to undertake writing a pretty large application from scratch. Mostly, the company was a Java plus Spring shop with a few exceptions. One team wrote almost exclusively Python, for instance. But as far as I knew, there wasn’t any specific policy requiring the use of any particular language.
So as a team, we pushed to write our new project in Python. It was originally my idea, but my team got on board with it pretty quickly. Plus there was precedent for Python projects and Python was definitely appropriate for our use case.
The managers took it up the chain. The chain hemmed and hawed for months, but eventually made a more official policy that we had to use Java (and Spring).