Rhino Python 脚本:批量将曲面转换为 Hatch 填充

前言

在建筑设计和制图过程中,我们经常需要将 3D 曲面转换为 2D 的 Hatch 填充,用于平面图、剖面图的表达。手动操作不仅耗时,还容易出错。本文介绍一个简单实用的 Python 脚本,可以在 Rhino 中批量完成这一任务。

应用场景

这个脚本适用于以下情况:

  • 建筑平面图中的墙体填充
  • 剖面图中的材料表达
  • 批量处理多个曲面
  • 需要快速出图的项目

基础版本

代码

import rhinoscriptsyntax as rs

# 选择曲面
surfaces = rs.GetObjects("选择曲面", rs.filter.surface | rs.filter.polysurface)

if surfaces:
    for srf in surfaces:
        # 获取边界曲线
        edges = rs.DuplicateSurfaceBorder(srf, type=0)
        
        if edges:
            # 创建Hatch
            hatch = rs.AddHatch(edges, "Solid")
            
            # 删除临时边界曲线
            rs.DeleteObjects(edges)
    
    print("完成,共处理 {} 个曲面".format(len(surfaces)))
else:
    print("未选择曲面")

使用方法

  1. 在 Rhino 中输入命令 EditPythonScript
  2. 将代码粘贴到编辑器中
  3. F5 运行脚本
  4. 根据提示选择要转换的曲面
  5. Enter 确认

进阶版本:自定义填充样式

如果你需要选择不同的填充图案,可以使用以下版本:

import rhinoscriptsyntax as rs

surfaces = rs.GetObjects("选择曲面", rs.filter.surface | rs.filter.polysurface)

if surfaces:
    # 可选样式:Solid, Hatch1, Hatch2, Dash 等
    pattern = rs.GetString("输入填充样式", "Solid")
    
    for srf in surfaces:
        edges = rs.DuplicateSurfaceBorder(srf, type=0)
        if edges:
            rs.AddHatch(edges, pattern)
            rs.DeleteObjects(edges)
    
    print("完成")

Rhino 内置填充样式

样式名称 说明
Solid 实心填充
Hatch1 斜线填充
Hatch2 交叉斜线
Hatch3 水平线
Dash 虚线填充
Grid 网格填充
Grid60 60度网格
Plus 十字填充
Squares 方格填充

完整版本:支持孔洞

如果你的曲面内部有开孔(如门窗洞口),需要使用以下版本来保留孔洞:

import rhinoscriptsyntax as rs

surfaces = rs.GetObjects("选择曲面", rs.filter.surface | rs.filter.polysurface)

if surfaces:
    hatch_pattern = "Solid"
    hatch_scale = 1.0
    created_hatches = []
    
    for srf in surfaces:
        # 提取外边界
        outer = rs.DuplicateSurfaceBorder(srf, type=0)
        # 提取内边界(孔洞)
        inner = rs.DuplicateSurfaceBorder(srf, type=2)
        
        all_curves = []
        
        # 处理外边界
        if outer:
            if len(outer) >= 2:
                outer_joined = rs.JoinCurves(outer, delete_input=True)
            else:
                outer_joined = outer
            
            for crv in outer_joined:
                if rs.IsCurveClosed(crv):
                    all_curves.append(crv)
                else:
                    rs.DeleteObject(crv)
        
        # 处理内边界(孔洞)
        if inner:
            if len(inner) >= 2:
                inner_joined = rs.JoinCurves(inner, delete_input=True)
            else:
                inner_joined = inner
            
            for crv in inner_joined:
                if rs.IsCurveClosed(crv):
                    all_curves.append(crv)
                else:
                    rs.DeleteObject(crv)
        
        # 创建带孔洞的 Hatch
        if all_curves:
            hatch = rs.AddHatch(all_curves, hatch_pattern, hatch_scale)
            if hatch:
                created_hatches.append(hatch)
            
            for crv in all_curves:
                rs.DeleteObject(crv)
    
    print("已创建 {} 个 Hatch(保留孔洞)".format(len(created_hatches)))
    
    if created_hatches:
        rs.SelectObjects(created_hatches)
else:
    print("未选择任何曲面")

核心函数解析

rs.DuplicateSurfaceBorder(surface, type)

这是脚本的核心函数,用于提取曲面的边界曲线。

type 参数 说明
0 外边界(Outer)
1 所有边界(All)
2 内边界/孔洞(Inner)

rs.AddHatch(curves, pattern, scale)

创建 Hatch 填充的函数。当传入多条闭合曲线时,Rhino 会自动识别外边界和内边界(孔洞)。

参数 说明
curves 边界曲线列表
pattern 填充图案名称
scale 图案缩放比例(可选,默认 1.0)

导出到 AutoCAD

创建的 Hatch 可以直接导出到 AutoCAD:

  1. 运行脚本创建 Hatch
  2. 选择所有 Hatch 对象
  3. 输入命令 Export
  4. 选择 .dwg 格式保存
  5. 在 AutoCAD 中打开,Hatch 将保持完整

常见问题

Q: 为什么有些曲面无法创建 Hatch?

A: 确保曲面的边界是闭合的。非闭合边界无法创建 Hatch。

Q: 如何修改填充颜色?

A: 创建 Hatch 后,可以添加以下代码设置颜色:

rs.ObjectColor(hatch, (255, 0, 0))  # RGB 红色

Q: 如何将 Hatch 放到指定图层?

A: 添加以下代码:

rs.ObjectLayer(hatch, "Your_Layer_Name")

总结

这个脚本通过自动化提取边界、创建填充、清理临时对象的流程,大大提高了从曲面到 Hatch 的转换效率。无论是简单的实心填充,还是带孔洞的复杂情况,都能轻松处理。


相关资源:

更多推荐