这里写自定义目录标题
- [Rhino Python 查询指定字段并cloud标注](#Rhino Python 查询指定字段并cloud标注)
-
- 前言
- [1. 脚本基础结构](#1. 脚本基础结构)
-
- [1.1 导入模块](#1.1 导入模块)
- [2. 对象获取与筛选](#2. 对象获取与筛选)
-
- [2.1 获取所有对象](#2.1 获取所有对象)
- [2.2 判断对象类型](#2.2 判断对象类型)
- [2.3 深入获取对象几何信息](#2.3 深入获取对象几何信息)
- [3. 边界框 (Bounding Box)](#3. 边界框 (Bounding Box))
- [4. 曲线操作](#4. 曲线操作)
-
- [4.1 创建折线](#4.1 创建折线)
- [4.2 曲线长度与参数域](#4.2 曲线长度与参数域)
- [4.3 根据参数获取曲线上的点](#4.3 根据参数获取曲线上的点)
- [4.4 创建三点圆弧](#4.4 创建三点圆弧)
- [4.5 合并曲线](#4.5 合并曲线)
- [5. 对象属性修改](#5. 对象属性修改)
-
- [5.1 修改颜色](#5.1 修改颜色)
- [5.2 删除对象](#5.2 删除对象)
- [6. 视图刷新](#6. 视图刷新)
- [7. 文字对齐方式](#7. 文字对齐方式)
- [8. 实战:云线生成算法](#8. 实战:云线生成算法)
-
- [8.1 核心思路](#8.1 核心思路)
- [8.2 计算向外方向](#8.2 计算向外方向)
- [9. 常用函数速查表](#9. 常用函数速查表)
- [10. 调试技巧](#10. 调试技巧)
-
- [10.1 打印调试](#10.1 打印调试)
- [10.2 检查 None](#10.2 检查 None)
- [10.3 Try-Except](#10.3 Try-Except)
- 结语
- 参考资源
Rhino Python 查询指定字段并cloud标注
前言
本文通过一个实际案例------自动为图纸中的 "(U.S.S.)" 文字添加云线标注,来介绍 Rhino Python 脚本的常用命令和函数。
1. 脚本基础结构
1.1 导入模块
python
#coding=utf-8
import Rhino
import rhinoscriptsyntax as rs
import scriptcontext as sc
import math
| 模块 | 用途 |
|---|---|
Rhino |
访问 RhinoCommon API,提供底层几何操作 |
rhinoscriptsyntax (rs) |
高级封装函数,语法简洁,适合快速开发 |
scriptcontext (sc) |
访问当前文档和视图上下文 |
math |
Python 标准数学库 |
提示 :
rs是对Rhino的高级封装,大多数情况下用rs就够了,需要更精细控制时再用Rhino。
2. 对象获取与筛选
2.1 获取所有对象
python
all_objects = rs.AllObjects()
返回文档中所有对象的 GUID 列表。
2.2 判断对象类型
python
obj_type = rs.ObjectType(obj_id)
if obj_type == 512: # 512 = 文字对象
# 处理文字
常用对象类型代码:
| 代码 | 类型 |
|---|---|
| 1 | Point |
| 4 | Curve |
| 8 | Surface |
| 16 | Polysurface |
| 32 | Mesh |
| 512 | Annotation (文字、标注) |
2.3 深入获取对象几何信息
python
rhino_obj = sc.doc.Objects.Find(obj_id)
geom = rhino_obj.Geometry
if isinstance(geom, Rhino.Geometry.TextEntity):
text = geom.PlainText # 获取纯文本内容
当 rs 模块功能不够时,使用 sc.doc.Objects.Find() 获取 RhinoCommon 对象。
3. 边界框 (Bounding Box)
python
bbox = geom.GetBoundingBox(True)
if bbox.IsValid:
min_pt = bbox.Min # 最小角点
max_pt = bbox.Max # 最大角点
width = max_pt.X - min_pt.X
height = max_pt.Y - min_pt.Y
边界框用于快速获取对象的空间范围。
4. 曲线操作
4.1 创建折线
python
pt1 = [0, 0, 0]
pt2 = [10, 0, 0]
pt3 = [10, 10, 0]
pt4 = [0, 10, 0]
rect_curve = rs.AddPolyline([pt1, pt2, pt3, pt4, pt1]) # 闭合需回到起点
4.2 曲线长度与参数域
python
length = rs.CurveLength(curve)
domain = rs.CurveDomain(curve) # 返回 (start, end)
4.3 根据参数获取曲线上的点
python
# 参数 t 在 domain 范围内
point = rs.EvaluateCurve(curve, t)
4.4 创建三点圆弧
python
arc = rs.AddArc3Pt(start_pt, end_pt, mid_pt)
通过起点、终点和弧上一点创建圆弧。
4.5 合并曲线
python
joined = rs.JoinCurves(curve_list, delete_input=True)
将多条首尾相连的曲线合并为一条。
5. 对象属性修改
5.1 修改颜色
python
rs.ObjectColor(obj_id, (255, 0, 0)) # RGB 红色
5.2 删除对象
python
rs.DeleteObject(obj_id)
6. 视图刷新
python
sc.doc.Views.Redraw()
脚本执行后刷新视图以显示更改。
7. 文字对齐方式
python
justification = geom.Justification
# 常用对齐方式
Rhino.Geometry.TextJustification.Left
Rhino.Geometry.TextJustification.Center
Rhino.Geometry.TextJustification.Right
Rhino.Geometry.TextJustification.TopLeft
Rhino.Geometry.TextJustification.BottomRight
# ... 等
8. 实战:云线生成算法
8.1 核心思路
1. 找到包含 "(U.S.S.)" 的文字
2. 计算该文字片段的边界框
3. 沿边界框路径均匀分布圆弧
4. 每个圆弧向外凸起,形成云线效果
5. 合并所有圆弧
8.2 计算向外方向
python
# 矩形中心
center = [center_x, center_y, 0]
# 弧中点
mid_pt = rs.EvaluateCurve(rect_curve, mid_t)
# 从中心指向外的单位向量
outward = [mid_pt[0] - center[0], mid_pt[1] - center[1], 0]
length = math.sqrt(outward[0]**2 + outward[1]**2)
outward = [o / length for o in outward]
# 弧顶点向外偏移
arc_mid = [mid_pt[0] + outward[0] * offset,
mid_pt[1] + outward[1] * offset,
mid_pt[2]]
9. 常用函数速查表
获取对象
| 函数 | 说明 |
|---|---|
rs.AllObjects() |
获取所有对象 |
rs.GetObject() |
让用户选择一个对象 |
rs.GetObjects() |
让用户选择多个对象 |
rs.ObjectType(id) |
获取对象类型 |
创建几何
| 函数 | 说明 |
|---|---|
rs.AddPoint(pt) |
添加点 |
rs.AddLine(pt1, pt2) |
添加直线 |
rs.AddPolyline(pts) |
添加折线 |
rs.AddCircle(center, r) |
添加圆 |
rs.AddArc3Pt(p1, p2, p3) |
三点圆弧 |
rs.AddRectangle(plane, w, h) |
添加矩形 |
曲线操作
| 函数 | 说明 |
|---|---|
rs.CurveLength(id) |
曲线长度 |
rs.CurveDomain(id) |
参数域 |
rs.EvaluateCurve(id, t) |
取点 |
rs.CurveTangent(id, t) |
切向量 |
rs.JoinCurves(ids) |
合并曲线 |
rs.OffsetCurve(id, dir, dist) |
偏移曲线 |
对象操作
| 函数 | 说明 |
|---|---|
rs.DeleteObject(id) |
删除 |
rs.CopyObject(id, vec) |
复制 |
rs.MoveObject(id, vec) |
移动 |
rs.RotateObject(id, center, angle) |
旋转 |
rs.ScaleObject(id, origin, scale) |
缩放 |
属性
| 函数 | 说明 |
|---|---|
rs.ObjectColor(id, color) |
颜色 |
rs.ObjectLayer(id, layer) |
图层 |
rs.ObjectName(id, name) |
名称 |
10. 调试技巧
10.1 打印调试
python
print("变量值: {}".format(variable))
print("对象数量: {}".format(len(objects)))
10.2 检查 None
python
result = rs.AddLine(pt1, pt2)
if result:
# 成功
else:
print("创建失败")
10.3 Try-Except
python
try:
# 可能出错的代码
curve = rs.AddArc3Pt(p1, p2, p3)
except Exception as e:
print("错误: {}".format(e))
结语
Rhino Python 脚本的核心是:
- 获取对象 →
rs.AllObjects(),rs.GetObject() - 读取信息 →
rs.ObjectType(),rs.CurveLength(),bbox - 创建几何 →
rs.AddLine(),rs.AddArc3Pt(), etc. - 修改属性 →
rs.ObjectColor(),rs.ObjectLayer() - 清理刷新 →
rs.DeleteObject(),sc.doc.Views.Redraw()
掌握这些基础,结合 Python 的逻辑控制,就能实现各种自动化工作流。