你是否喜欢数值精准无比的Rhino,但又讨厌在卡卡的KeyShot里渲染?你是否喜欢用Blender渲染,却发现.3dm文件无法直接拖入?你该不会还在手动地一个个地把物件导出来吧?现在,这些都不再是问题!
借助Python功能,我们终于可以从这种劳累的工作中解脱出来了!
# _*_ coding: utf-8 _*_
import rhinoscriptsyntax as rs
import scriptcontext as sc
import os
def GetSTLSettings(ang, ar, dist, grid, den, maxL=0, minL=0.0001):
e_str = "_ExportFileAs=_Binary "
e_str += "_ExportUnfinishedObjects=_Yes "
e_str += "_UseSimpleDialog=_No "
e_str += "_UseSimpleParameters=_{} ".format("Yes" if rs.ExeVersion() == 7 else "No")
e_str += "_Enter _DetailedOptions "
e_str += "_JaggedSeams=_No "
e_str += "_PackTextures=_No "
e_str += "_Refine=_Yes "
e_str += "_SimplePlane=_Yes "
e_str += "_AdvancedOptions "
e_str += "_Angle={} ".format(ang)
e_str += "_AspectRatio={} ".format(ar)
e_str += "_Distance={} ".format(dist)
e_str += "_Density={} ".format(den)
e_str += "_Grid={} ".format(grid)
e_str += "_MaxEdgeLength={} ".format(maxL)
e_str += "_MinEdgeLength={} ".format(minL)
e_str += "_Enter _Enter"
return e_str
def BatchExportSTLByObject():
us = rs.UnitSystem()
# 2 - Millimeters (1.0e-3 meters)
if us != 2:
msg = "模型单位不是毫米"
rs.MessageBox(msg)
return
msg = "选择需要导出为单独STL文件的几何体:"
objs = rs.GetObjects(msg, 8 + 16 + 32, preselect=True)
if not objs: return
# 获取文件名,未保存为None
doc_name = sc.doc.Name
fileType = "STL Files (*.stl)|*.stl||"
if not doc_name:
rs.MessageBox("文件尚未保存,请保存文件后再执行程序")
return
else:
# document has been saved, get path
msg = "选择需要保存的目录:"
# Display browse-for-folder dialog allowing the user to select a folder
folder = rs.BrowseForFolder(rs.WorkingFolder(), msg)
if not folder: return
filename = os.path.join(folder, doc_name)
# 不同精度的转换参数
# (最大角度,最大长宽比,边缘至曲面最大距离,网格面最小数目,密度,最大边缘长度,最小边缘长度)
coarse_mm = [30, 0, 0.03, 16, 0, 0, 0.01]
medium_mm = [15, 0, 0.01, 32, 0, 0, 0.001]
fine_mm = [5, 0, 0.005, 64, 0, 0, 0.0001]
extrafine_mm = [2, 0, 0.0025, 64, 0, 0, 0.0001]
# 设置需要的精度类别,主要通过最小边长度控制
a = '低精度' ; b = '中精度' ; c = '高精度' ; d = '超高精'
if us == 2:
exs = [a + ' (0.03mm)', b + ' (0.01mm)', c + ' (0.005mm)', d + ' (0.0025mm)']
msg = "选择需要的精度"
ex_choice = rs.ListBox(exs, msg, "STL export", exs[2])
if ex_choice is None: return
if ex_choice == exs[0]:
sett_str = GetSTLSettings(*coarse_mm)
elif ex_choice == exs[1]:
sett_str = GetSTLSettings(*medium_mm)
elif ex_choice == exs[2]:
sett_str = GetSTLSettings(*fine_mm)
elif ex_choice == exs[3]:
sett_str = GetSTLSettings(*extrafine_mm)
# 开始导出文件
rs.EnableRedraw(False)
for i, obj in enumerate(objs):
objName = rs.ObjectName(obj)
e_file_name = "{}-{}-{}.stl".format(filename[:-4], str(i+1), objName)
print(e_file_name)
rs.UnselectAllObjects()
rs.SelectObject(obj)
rs.Command('-_Export "{}" {} _Enter'.format(e_file_name, sett_str), True)
rs.EnableRedraw(True)
BatchExportSTLByObject()
本代码源自微信公众号:XrayStudio,然而好像已经搜不到了。全网各处转载的代码直接复制粘贴时总是会出现一些奇怪的问题,比如缩进啊空格之类的,甚至还有把行号1234都算进去的。
这个代码用Kimi AI修复过,可以和犀牛7兼容运行,其他版本未测试。
你可以在文章顶部下载文件
或用以下方式来手动创建一个Python脚本文件
要使用这个代码,请右键桌面,创建一个.txt文本文档,并命名为你想要的名字,
我这里就命名为STL_export
.txt后缀会自动生成
然后将以上代码直接复制进去,大概是这个样子:
并将这个文本文件的后缀名改为.py
它会自动转变为这个样子:
这样文件的写入就完成了。
接下来打开犀牛工程文件,看左上角指令栏目:
输入RunPythonScript,一般输入Run之后下面就会自动显示出RunPythonScript,直接选择即可
选择后会自动弹出一个界面:
选择之前做好的脚本文件STL_export.py并打开,如果你在这个界面里没看到脚本文件,请再想想自己把这个文件放到哪去了。
然后左上角应该会出现这个:
在犀牛里把你想要的物体都框中,按Enter回车完成。
然后在弹出来的页面中选择你想要导出的位置,用脚本导出时可能会生成大量文件,请找个合适的文件夹。
之后在弹出的窗口选择导出精度,爱用哪个用哪个:
这样脚本就会开始自动运行了,软件在处理复杂模型的时候会卡顿,耐心等待即可。
一段时间后,物件会均被导出,如果选中部分物件不是实体(封闭的多重曲面)的话,会导出一些不能被读取的STL文件。
导出后如图所示:
敬请使用。