【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 的逻辑控制,就能实现各种自动化工作流。


参考资源

相关推荐
难以怀瑾4 分钟前
pytest.param`与 allure.dynamic.title()全解析
python
山峰哥44 分钟前
数据库工程与SQL调优:从慢查询到秒级响应的实战之路
java·开发语言·数据库·sql·深度优先·启发式算法
wangjialelele1 小时前
Selenium4 + Java Web自动化测试入门指南:从环境搭建到常用操作详解
java·开发语言·前端·测试工具·自动化
Awna1 小时前
Golang 大小写可见性规范
开发语言·后端·golang
leoZ2311 小时前
实战复盘:用 Claude Code 从零搭一个 GitHub PR 统计工具
java·人工智能·python·深度学习·自然语言处理·github·llama
AI科技星2 小时前
曲率‑挠率与 $\boldsymbol{\omega/c}$ 的关系、精算验证及其物理意义
c语言·开发语言·线性代数·算法·决策树·机器学习·ai科技星
夏天测2 小时前
Python 网络编程入门:从 Socket 底层到 HTTP 并发实战
python·socket·httpx·requests·tcp udp·python网络编程·爬虫基础
鹿角片ljp2 小时前
Java框架篇:Spring + SpringMVC + SpringBoot + MyBatis深度复习
java·开发语言
玉鸯3 小时前
多 Agent 并行时如何保证状态一致性?
分布式·python·agent
aGdF8E3gQ3 小时前
【Application Insights】采样率对Function App日志收集的影响和解决方法
python·flask·wpf