【Rhino】【Python】 查询指定字段并cloud标注

这里写自定义目录标题

  • [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 脚本的核心是:

  1. 获取对象rs.AllObjects(), rs.GetObject()
  2. 读取信息rs.ObjectType(), rs.CurveLength(), bbox
  3. 创建几何rs.AddLine(), rs.AddArc3Pt(), etc.
  4. 修改属性rs.ObjectColor(), rs.ObjectLayer()
  5. 清理刷新rs.DeleteObject(), sc.doc.Views.Redraw()

掌握这些基础,结合 Python 的逻辑控制,就能实现各种自动化工作流。


参考资源

相关推荐
多思考少编码16 分钟前
PAT甲级真题1001 - 1005题详细题解(C++)(个人题解)
c++·python·最短路·pat·算法竞赛
cen__y20 分钟前
Linux07(信号01)
linux·运维·服务器·c语言·开发语言
ZhengEnCi22 分钟前
M5-markconv自定义CSS样式指南 📝
前端·css·python
xingpanvip40 分钟前
星盘接口开发文档:星相日历接口指南
android·开发语言·前端·css·php·lua
ZhengEnCi43 分钟前
M4-更新日志v0.1.3-Mermaid图表支持 📝
python
guygg881 小时前
基于遗传算法的双层规划模型求解MATLAB实现
开发语言·matlab
hsjcjh1 小时前
多模态长文本协同:用Gemini 3.1 Pro镜像官网破解复杂办公场景的效率困局(国内实测方案)
python
凯瑟琳.奥古斯特1 小时前
SQLAlchemy核心功能解析
开发语言·python·flask
卷Java1 小时前
GPTQ vs AWQ vs GGUF:模型量化工具横向测评
开发语言·windows·python
charlie1145141912 小时前
嵌入式C++工程实践第20篇:GPIO 输入模式内部电路 —— 芯片是如何“听“到外部信号的
开发语言·c++·stm32·单片机