Face normals are being reversed when exporting from Rhino to Revit

We’re seeing something that I’ve read about before & I’d like to see if there’s any new light around it.

We’re getting models exported as .sat files from Rhino. We’re setting them up as Conceptual Masses and then adding them to our Revit model.

What we’re seeing though is that some (not all) of the model face normals are being reversed or in some cases just set to 0 degrees. So a face that should be facing North say, is coming through in Revit as facing South.

I’ve tried the workflow myself & have experienced the same thing. We are exporting from Solid models.

Is there anything we can do to cure this behaviour?

Hi Edwin - are the face normals facing in their ‘natural’ direction in Rhino on export?


Hello Pascal.

Yes they are. Everything looks good in Rhino at the export stage…

I’ve seen this result when I have a high edge tolerance on my solid. Revit won’t take any of Rhino’s sloppy slop when it comes to loose edges and sometimes when they’re close to failing they’ll appear inside out. You can use “what” to check an objects edge tolerance or use this script: Exposing Edge Tolerances

Hi Alexander - how are you getting these sloppy edge tolerances? How are the objects made?


Admittedly it’s usually my fault and I can sometimes pin down when it happened (although it’s hard to realize until its too late). I do a lot of gumball editing of surface edges and push/pulling of faces. That doesn’t seem to create it as long as my relative tolerance is set really fine. The project I was having edge tolerance issues with had a curved&faceted thing going on that was pretty hard to keep track of.

Basically my workflow has been to export a portion of my revit model and build little pieces to reimport (cabinets, weird walls, etc.). This goes great and I can get Revit solids but it’s just been pretty trying of my Rhino skills. Enough so that I’m having hesitance recommending others try it unless they check edge tolerances throughout the modeling process.

edit: I’d also say that with boolean modeling (which is what I like to default to for solid modeling) I get 0" edge tolerances which is swell. It’s only really when I do surface modeling that I get edge tolerances, which makes sense.

I’m not sure what you mean here. This should certainly not be the case, unless by ‘surface modeling’ you mean sub-object manipulation of faces in a polysurface - that can indeed lead to some edge problems.


no I mean extracting surfaces and building new faces.

I’ve actually found subobject manipulation to be fairly reliable.

In my mind (be it true or not) I’m solid modeling with suboject manipulation and booleans but then surface modeling when I extract surfaces to build new portions of my model. It’s just a particular workflow rhino5 has gotten me into.

Pretty typical of the Level of detail I’m building to.

Thanks for the avenue for investigation Alexander & Pascal.

I’m just getting going with Rhino, so I’ll try Boolean/Solid modelling & see how I get on. I’ll also try and investigate the edge-tolerance for my test model.

No luck though. I’ve set the model tolerance to as close to zero as it will allow. I’m also pretty sure that I’m exporting a Solid model & not surfaces. Same behaviour - on a cube shaped solid, three face normals are reversed in Revit.

I read Alexander saying that setting it close to zero will lead to problems…

Hello Wim.

Thanks for your reply. My new(bie) question now is: where/how do you set the edge tolerances? I’ve set the model’s absolute tolerance for lower tolerance (trying values from 1.0 to 0.1), but the face normals are still being reversed in Revit.

Looking into Alexander’s approach I couldn’t check edge tolerances on the solid cube using the ‘What’ command. When I extract surfaces from the solid I can check the edge tolerance for a surface & they come back as 0.00, despite the absolute tolerance setting.

From there I did a boolean union on the surfaces to get back to a solid. This time the ‘what’ command does return the 0.00 edge tolerance. Exporting this & importing it into Revit still has the reversed face normals.

Nope for revit I set my relative tolerance to .0000001 . Wish I knew another way. Edwin sorry for hijacking the thread. You’re saving from rhino as an SAT and then into revit without even exploding they’re inside out? I don’t think it’s your problem but have you tried using model in place masses instead of seperate masses? This workflow I know works (not that it’s what you want)

No worries Alexander.

Yes. I’m opening a new Conceptual mass family and importing the .sat file. From there I’m loading it into the project. Exploding the model turns it into a mesh, so that’s no good.

Importing the .sat into a model-in-place mass still returns faces with reversed normals. I wonder if it’s not something to do with Revit’s Conceptual Mass somehow. Are you using this workflow for other families?

I actually haven’t tried to set the relative tolerance so low, so will try that next.

Thanks again.

exploding actually won’t turn it into a mesh. ACIS is a solid / polysurface / nurb-like representation of your object so exploding it will allow you to push pull and parametrize its surfaces. You shouldn’t have to set the tolerance so low with a simple cube. Only during certain operations will your tolerance be applied to your object. During booleans and many others the tolerance (as I understand it) is effectively 0.

I have used the workflow for several families.

Thanks Alexander. You’re right… From the in-place model I can partially explode the import, but there’s no change to the model behaviour. Two out of four faces of the cube have reversed normals. I think I’ll try it with a couple of other family types to see if I can get it to work there. At least I can exclude my own Rhino export errors after that.

Just fyi, relative tolerance comes into play almost never in Rhino - the setting is removed from the next version of Rhino.


Pascal, yes I noticed that. It seems to be used when joining to determine the allowable edge tolerance which is why turning it down decreases edge tolerances. Rhino demands tighter tolerances and wont allow “bad” edge pairs to join.

More info here: