【Rhino】【Python】批量将曲面Surface转换为Hatch
·
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("未选择曲面")
使用方法
- 在 Rhino 中输入命令
EditPythonScript - 将代码粘贴到编辑器中
- 按
F5运行脚本 - 根据提示选择要转换的曲面
- 按
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:
- 运行脚本创建 Hatch
- 选择所有 Hatch 对象
- 输入命令
Export - 选择
.dwg格式保存 - 在 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 的转换效率。无论是简单的实心填充,还是带孔洞的复杂情况,都能轻松处理。
相关资源:
更多推荐

所有评论(0)