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


参考资源

相关推荐
章鱼丸-3 分钟前
DAY31 文件的拆分和写法
开发语言·python
左左右右左右摇晃10 分钟前
Java并发——synchronized锁
java·开发语言
☆56613 分钟前
C++中的命令模式
开发语言·c++·算法
唐叔在学习15 分钟前
Python桌面端应用最小化托盘开发实践
后端·python·程序员
2501_9454235416 分钟前
使用Fabric自动化你的部署流程
jvm·数据库·python
wenlonglanying17 分钟前
Windows安装Rust环境(详细教程)
开发语言·windows·rust
2401_8463416518 分钟前
用Pandas处理时间序列数据(Time Series)
jvm·数据库·python
未知鱼28 分钟前
Python安全开发之子域名扫描器(含详细注释)
网络·python·安全·web安全·网络安全
2401_8318249631 分钟前
编写一个Python脚本自动下载壁纸
jvm·数据库·python
CQU_JIAKE33 分钟前
3.21【A】
开发语言·php