Trying to Understand this Boolean Union

The attached file illustrates my struggle with a boolean union from an old file that I never got working right but return to for education.

Problem Union.3dm (1.9 MB)

At the very bottom, I have two closed polysrfs that I am trying to union. It appears to me the smallest detail is 0.009" and the tolerance is 0.001". Making the tolerance smaller (0.0001) or larger (0.01) creates problems.

Boolean union fails.

The intersection (red) creates the closed curve I expect plus to additional (horizontal) open curves that it is a mystery to my why they show up at all.

Splitting the smaller with the larger give me the desired result. Splitting the larger with the smaller gives weird results.

Moving up, to try to work around this. I look at doing splits and joins rather than boolean operations. I removed the top, bottom, and forward surface of the smaller object (correctly) expecting that the extra horizontal lines in the intersection will disappear.

Moving up, I intersect and get the closed curve that I expected originally. However, I cannot split the larger with the smaller (but can split the smaller with the larger).

Moving right, I split using the intersection curve, did a shrinktrimmedsrf, and joined and all is good.

Moving up, I split both parts using the curve, did a join, and get a bad surface.

Moving up, I extracted the bad surface and capped. And it looks like all is good.

I am wondering why this combination causes such difficulty in joining.

Hi -

When I open that file, the tolerance is set to 0.0001 units. I take it that you modeled the objects at 0.001 and at some point changed this to 0.0001 but it’s hard to know at which point and what was done after doing so.

There are over 100 edges that are 0.005 units.

You can’t really just change the tolerance up and down during modeling without rebuilding all the edges in the model.

As was said a few times in the recent past, you need to set your document tolerance to at least one order of magnitude smaller than the smallest feature. You need to do this at the very start to avoid issues. When you don’t know ahead of time how much detail you are going to need, it’s best to err on the safe side and set the tolerance tighter rather than looser.

1 Like

I will add to Wim’s excellent reply.

Changing tolerance does not affect existing geometry. Intersections are created using the tolerance set when the intersection is made. Rebuilding edges will not improve the tolerance of interesecting edges… Trims and splits are the same. The only way to ensure intersections trims and splits are within a tighter tolerance is to recreate the geometry.

ALWAYS start with the absolute tolerance an order fo magnitude or more smaller than the smallest detail. NEVER make the absolute tolerance smaller while modeling.

The penalty for a tighter absolute tolerance than needed is “heavy” geometry with more control points than needed. If a looser tolerance is acceptable heavy geometry can be simplified with careful use of the rebuild and fit commands, knot removal and similar.

The penalty for a looser absolute tolerance than needed is continuing problems and operations not working properly. Frequently the only solution is to remodel with a tighter tolerance.

1 Like

Everything in these files have been created with a tolerance of 0.0001. I rebuilt everything in the source files from scratch. This was the tenth file from this project I was rebuilding.

That was what I was trying to do, going back to an old set of files as an exercise. Go to each file. Ensure the tolerance is set to one fixed value (0.0001). Delete all existing surfaces and blocks. Rebuild everything from scratch.

No, that is not correct. Regarding the change to 0.01 or 0.00001, I rebuilt everything using those values in a different file. To test what would happen. At 0.01, details would be lost. At 0.0001, things would joint together that should not join.

For these, I copied the original file, ensured tolerance was set to 0.0001, which in this case it may have been set that way to begin with. I then deleted all the surfaces and blocks in the file. Then I rebuilt everything with a tolerance of 0.0001.

When I ran into this issue (again), I did the same to test at 0.001 and 0.0001 to bad results.

This particular union/join had been problematic in the past.

In going back to the file, I found I needed to:

  1. Intersect
  2. Delete the two horizontal lines from the intersection.
  3. Split both parts on the intersection
  4. ShrinkTrimmedSrf
  5. Join

Hello - pretty much any time an edge of one part lands exactly on an edge or surface you can expect difficulties, I would say - Intersect shows that ‘extra’ line of intersection. If you make the inner object start and end filly within the volume of the outer, it ought to work.

well, no, as it turns out. Digging some more…Oh, I see I still have corresponding edges. Probably not worth the effort to get BU to work - faster to use trimming. As far as I can see the problem is that there are surfaces on one part that end (have their edges) exactly on a surface on the other input. This will always be hard. Trimming both with a clean curve of intersection and joining, just works.


Problem Union (1.1 MB)

Here is test where I extended the smaller part so that it extends above and below the larger part,

From bottom to top:

  1. The starting point. They still will not union.

  2. Intersect produces a closed curve. However, neither part will split the other.

  3. The intersection will split the small part, but not the larger part. The split smaller part still will not split the larger part.

  4. After splitting the smaller part, I intersect with the larger part, creating a new closed curve.

The curve will split the larger part and I can join to form a closed polysrf.

Dunno- Trimming each with the curve of intersection seems to work. But it should also work, I would think, trimming the breps to each other and that does not… I’ll put that one on the pile, thanks.


I discovered that, if cut out the curved part of the intersection area, they union with no problem.