I made, With Tons of help of “Testure” over at blender artists, a script that is Fairly required after you import. Rhino data in the viewport doesn’t have welded vertices. If you have a few objects, fine, merging those overlapping/double verts is pretty easy. But you then have to fix the normals as well, change to smooth shading, and turn on autosmooth with a reasonable angle.
So the script does all that for you.
Warning, it is designed to ignore your selection. It will do this to Every mesh object in your scene. If you’re trims small on a large face, you’ll need to adjust your mesh settings also to have more mesh also. You can do that a few ways, like limiting the max edge length, or adjusting the ratio (that’s my recommendation) to something like 4-6. When it subdivides to those small trims inside of your big surface, it will help by subdividing until the ratio of any triangles created are within that ratio. Imagine a rectangle who’s length is 1:6. That’s the maximum that triangle would fit in. The more square, the more mesh. This doesn’t always work though. Rhino mesh is never perfect. Booleans are never perfect when it comes to mesh, unless you designed them for mesh. So either you fix it manually after the fact, or you mesh the heck out of your model till it goes away.
But removing doubles is Absolutely necessary. So copy this into your text editor in blender and run it after import. Hint: you have to hit New in that view first. Then you can paste, and hit the play button.
import bpy, bmesh
from math import radians
SmoothAngle = 45
MergeThreshold = .0001
# I don't think this is needed so commenting out. selection = bpy.context.selected_objects
ctx = bpy.context.copy() #created context override variable. copies the context
smooth_radians = radians(SmoothAngle) #blender uses radians. So just converts the SmoothAngle to radians for the smooth angle number.
for ob in bpy.context.scene.objects:
if not isinstance(ob.data, bpy.types.Mesh): #this is a python function, not blender specific. If it's not mesh, return false, so continue.
continue #this means if it isn't Mesh, continue to the next object without processing what's next in the for loop
# create a context override so you don't need to handle selecting/deselecting objects to make the operators work correctly
ctx['object'] = ob
ctx['active_object'] = ob
ctx['selected_objects'] = [ob]
ctx['selected_editable_objects'] = [ob]
bpy.ops.object.shade_smooth(ctx)
ob.data.use_auto_smooth = True
ob.data.auto_smooth_angle = smooth_radians
bm = bmesh.new()
bm.from_mesh(ob.data)
bmesh.ops.remove_doubles(bm, verts=bm.verts, dist=MergeThreshold)
bm.to_mesh(ob.data)
bm.free()
If you want it to work on just a selection, you have to get rid of the context override. So just comment out line 17-20. It’s not perfect. I’m not sure you Actually need line 17-19. But I don’t know why line 20 works the way it does…because I’m not a programmer.
Anyway, it would be pretty cool if this action was built into the importer as an option. But I thought I’d share it with this group.
Oh, if you actually need some 45 degree angles to be sharp, you’ll have to override that number. Default is usually 30. But my Rhino models often have tiny fillets. I don’t mesh things by angle, but rather use maximum distance to surface. This way, Large sweeping curves get meshed a ton, but tiny fillets may only get 1-3 subdivisions. If it only gets 1, then I need that number to be 45.