欢迎!
1. 一个故事
原文作者回忆自己学完基础 Ruby 后,迅速上手 SketchUp Ruby API,用几行代码把工作中耗时的“推拉多个面”重复任务自动化,为自己和公司节省了大量时间。
2. 开始须知
新手需要知道的是:
SketchUp 自带 Ruby,无需额外安装
SketchUp 版本不同 Ruby 的版本也不同
# 查询当前的 Ruby 语言版本,可以在 Ruby 控制台中输入:
RUBY_VERSION什么是 SketchUp Ruby API
应用程序编程接口 (API)是让用户使用 Ruby 语言来扩展 SketchUp,以实现更多的功能。推荐直接查看 Sketchup API 镜像文档
3. Ruby 控制台
本节了解如何使用 Ruby 代码在 Ruby 控制台上执行任务。
启动 SketchUp,从 Extensions > Developer > Ruby Console 打开 Ruby 控制台,复制以下代码段并将其粘贴到控制台中,然后按 Enter 键执行它。
1 + 2你可以通过 Ruby 代码操纵控制台:
# 返回布尔值表示控制台是否开启
SKETCHUP_CONSOLE.show?
# 清除控制台中的所有输出
SKETCHUP_CONSOLE.clear
# 您也可以在控制台中键入 `cls` (但在ruby代码中无效)
# 打开控制台
SKETCHUP_CONSOLE.show
# 关闭控制台
SKETCHUP_CONSOLE.hide使用控制台以及开发扩展的基础,是通过 Sketchup API 文档 了解所有可用的方法和类。
温馨提示
之后的代码也能复制到控制台运行!
4. 添加几何体
本节将展示:
如何访问模型对象和实体集合
向模型添加边、面和构造点
先添加一条边线!
# 定义两个变量为包含 3 个值的数组
# 这样的数组被 SketchUp 解释为3D空间中的点
# [0,0,0] 就是模型的原点
point1 = [0,0,0]
point2 = [100,100,100]
# 定义变量,以便引用当前模型的元素集合
# SketchUp 是默认的全局变量,无需定义就使用,专门用于调用API
# 从 SketchUp 调用 active_model 方法获取当前模型对象
# 从模型对象调用 active_entities 方法获取当前实体集合
# 这是一个非常常见的链式调用
entities = Sketchup.active_model.active_entities
# 使用 Entities.add_edges 方法将边缘添加到该实体集合中
entities.add_edges(point1, point2)可以通过文档进一步了解以上使用到的 API:
active_model, active_entities, add_edges
注意
在 Ruby API 中使用的单位始终是 “英寸(inch)”。例如上面代码中 point2 的 x 值 100,在 SU 中可能显示为 100 x 0.0254 = 2.54 米。有关如何在不同单位之间进行转换的信息,请参阅 Numeric 类的文档。
继续前进,添加一个面!
point1 = [0,0,0]
point2 = [100,100,100]
point3 = [0,100,100]
entities = Sketchup.active_model.active_entities
entities.add_face(point1, point2, point3, point1)温馨提示
SketchUp 中的面由 3 个或更多点或边组成,这些点或边必须是共面的。开发人员有责任确保边或点是共面的,否则会报错。
再添加构造点!
重新调整上一段代码,改为将构造点添加到面的所有边的末端:
point1 = [0,0,0]
point2 = [100,100,100]
point3 = [0,100,100]
entities = Sketchup.active_model.active_entities
entities.add_cpoint(point1)
entities.add_cpoint(point2)
entities.add_cpoint(point3)更进一步!
是否太简单了?让我们创建一个圆,并为每个顶点添加一个构造点。请先删除模型中的所有内容,再执行以下代码
centerpoint = Geom::Point3d.new(0,0,0)
vector = Geom::Vector3d.new 0,0,1
entities = Sketchup.active_model.active_entities
# 创建圆时会返回一个边数组。使用该数组可以找到定义圆的所有边
edges = entities.add_circle( centerpoint, vector, 10 )
# 定义一个空的 aray 用于存储顶点
vertices = []
edges.each do |edge|
# 每个顶点将添加两次,因为它被 2 条边使用。
vertices << edge.start
vertices << edge.end
end
# 删除重复顶点
vertices.uniq!
# 使用顶点的位置将构造点添加到模型中
vertices.each do |vert|
entities.add_cpoint(vert.position)
end试试自由创作?
在 Ruby API 文档中查找 Entities 类中的 add_3d_text 方法,尝试修改以下代码中的参数再运行,看看会发生什么:
entities = Sketchup.active_model.entities
string = "Hello World in 3D!"
align = TextAlignLeft
font = "Arial"
is_bold = true
is_italic = false
height = 12.0
tolerance = 0.0
z_position = 1.0
is_filled = true
depth = 5.0
success = entities.add_3d_text(string, align, font, is_bold, is_italic, height, tolerance, z_position, is_filled, depth)