Why BooleanSplit fails on this poysrf?

Hi everybody,
See the attached… I ask myself why BooleanSplit fails on this (relatively simple) poysrf?

Looks like a bug to me.

Latest Rhino 6… (v 5 same story)

gr, Tobias

split failed.3dm (452.7 KB)

No idea why it doesn’t work. CreateSolid does work however.

Hi Tobias -it works if you connect pairs of cutters into single polysurfaces that go all the way through the hole:

I’ll add this to the list.


After looking at the Help article for BooleanSplit, I used your surfaces to make closed solids. These then did work fine tieh BooleanSplit:

So then I went back to your original surfaces and checked the normals.
If they had been part of closed solids, two of them would have been pointing the other way, so I used DIR to Flip them.

Then BooleanSplit worked fine.

If you’re not using closed objects with Booleans, you need to manually manage the surface normal direction yourself.

Interesting… it shouldn’t be necessary though

Hi John, when splitting a closed polysrf with open (poly)srf’s the direction of the cutter shouldn’t make any difference since it has to affect both sides of the split. So there can’t be any “rule” to which side the normals have to point (at least I can’t come up with a logical rule here).

I use BooleanSplit a dozen times every day and I never ever care about the normals of the cutter :wink: Rhino should do that for me

It does in this case. I don’t know why.
Try it yourself.

I dit try and flip direction workes as you said

But even you guys don’t know why…
That’s good cause then I don’t feel like a total dumb :sweat_smile:

I’ve added a bug report:

I don’t know if the command can be improved to support splitting or not.
That will be up to the developer.

Basically speaking, Booleans need clean intersection curves. Then they read the surface normals to decide what to keep and what to delete.
In this case, because the normals were reversed on two of the surfaces, Rhino was confused.

I hope the command can be tuned up based on your example.

BooleanSplit uses a very simple switch in the BooleanUnion code and can’t work in this case. I will have to take a completely different approach, which is not particularly difficult and is much more general. Call NonmanifoldMerge on all the objects, then CreateRegions. In your example, the result will be what you want. In general, the solution is to keep all regions that use a surface from the object-to-be-spilt with the same orientation that it has in the original.