犀牛(Rhino)批量导出STL格式文件

你是否喜欢数值精准无比的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文件。

导出后如图所示:

敬请使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值