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


参考资源

相关推荐
草履虫建模11 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq13 小时前
分布式系统安全通信
开发语言·c++·算法
学嵌入式的小杨同学13 小时前
【Linux 封神之路】信号编程全解析:从信号基础到 MP3 播放器实战(含核心 API 与避坑指南)
java·linux·c语言·开发语言·vscode·vim·ux
Re.不晚14 小时前
Java入门17——异常
java·开发语言
精彩极了吧14 小时前
C语言基本语法-自定义类型:结构体&联合体&枚举
c语言·开发语言·枚举·结构体·内存对齐·位段·联合
好家伙VCC14 小时前
### WebRTC技术:实时通信的革新与实现####webRTC(Web Real-TimeComm
java·前端·python·webrtc
南极星100515 小时前
蓝桥杯JAVA--启蒙之路(十)class版本 模块
java·开发语言
baidu_2474386115 小时前
Android ViewModel定时任务
android·开发语言·javascript
Dev7z15 小时前
基于 MATLAB 的铣削切削力建模与仿真
开发语言·matlab
不能隔夜的咖喱15 小时前
牛客网刷题(2)
java·开发语言·算法