Skip to content

欢迎!

1. 一个故事

原文作者回忆自己学完基础 Ruby 后,迅速上手 SketchUp Ruby API,用几行代码把工作中耗时的“推拉多个面”重复任务自动化,为自己和公司节省了大量时间。

2. 开始须知

新手需要知道的是:

  • SketchUp 自带 Ruby,无需额外安装

  • SketchUp 版本不同 Ruby 的版本也不同

ruby
# 查询当前的 Ruby 语言版本,可以在 Ruby 控制台中输入:
RUBY_VERSION

什么是 SketchUp Ruby API

应用程序编程接口 (API)是让用户使用 Ruby 语言来扩展 SketchUp,以实现更多的功能。推荐直接查看 Sketchup API 镜像文档

3. Ruby 控制台

本节了解如何使用 Ruby 代码在 Ruby 控制台上执行任务。

启动 SketchUp,从 Extensions > Developer > Ruby Console 打开 Ruby 控制台,复制以下代码段并将其粘贴到控制台中,然后按 Enter 键执行它。

ruby
1 + 2

你可以通过 Ruby 代码操纵控制台:

ruby
# 返回布尔值表示控制台是否开启
SKETCHUP_CONSOLE.show?

# 清除控制台中的所有输出
SKETCHUP_CONSOLE.clear
# 您也可以在控制台中键入 `cls` (但在ruby代码中无效)

# 打开控制台
SKETCHUP_CONSOLE.show

# 关闭控制台
SKETCHUP_CONSOLE.hide

使用控制台以及开发扩展的基础,是通过 Sketchup API 文档 了解所有可用的方法和类。

温馨提示

之后的代码也能复制到控制台运行!

4. 添加几何体

本节将展示:

  • 如何访问模型对象和实体集合

  • 向模型添加边、面和构造点

先添加一条边线!

ruby
# 定义两个变量为包含 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 类的文档。

继续前进,添加一个面!

ruby
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 个或更多点或边组成,这些点或边必须是共面的。开发人员有责任确保边或点是共面的,否则会报错。

再添加构造点!

重新调整上一段代码,改为将构造点添加到面的所有边的末端:

ruby
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)

更进一步!

是否太简单了?让我们创建一个圆,并为每个顶点添加一个构造点。请先删除模型中的所有内容,再执行以下代码

ruby
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 方法,尝试修改以下代码中的参数再运行,看看会发生什么:

ruby
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)

下一篇:开发扩展