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


参考资源

相关推荐
浪子明X13 分钟前
十六位账本怎样发现传输差错:Internet Checksum 生活类比
开发语言
niucloud-admin2 小时前
JAVA V6 多商户商城 开发文档——job 计划任务开发
java·python·github
小叶肥辉2 小时前
LangChain链和LangGraph图的学习笔记【三】——分别用langchain_openai库和langchain_community库调用大模型
笔记·python·langchain
2401_873479402 小时前
IP属地为什么有时显示外省?用IP查询工具核查动态分配、运营商出口与GeoIP库
python·tcp/ip·ip
xiangyun613 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun613 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
OKkankan4 小时前
LangChain 能力详解!:输出解析、RAG、向量数据库与 Retriever 检索器
数据结构·python·langchain·ai应用
白远山4 小时前
家政服务家政社区派单实战:调度系统架构设计与实现指南
java·开发语言·小程序·架构·需求分析
山哥ol5 小时前
【Geany 环境配置与中文乱码解决参考】
python
DevRay5 小时前
Java 21虚拟线程深度实战:告别线程池焦虑,百万并发吞吐量直接翻倍(原理+代码+避坑)
java·开发语言