扩展开发入门
在节将介绍如何编写良好的 SketchUp 扩展,包括:
安全地命名扩展,以将其与其他扩展隔离。
向 SketchUp 扩展管理器注册您的“扩展类”扩展。
将扩展添加到 SketchUp 菜单系统。
在模型中绘制基本几何体(立方体)!
1. 注册扩展的通用模板
ruby
# 首先向 SketchUp 请求一些已经自带了的扩展注册功能
require 'sketchup.rb'
require 'extensions.rb'
# 在 SketchUp Ruby 中,所有代码都得加载到一个模块 (module) 中。如果不这么做,你很有可能会破坏别人的代码,别人也会破坏你的代码
# 请使用以下二级命名的模式(你的名字和扩展的名字)
module YourName
module ExtensionName
# 使用 file_loaded? 防止扩展被 SketchUp 多次加载
# __FILE__ 常量是一个 Ruby 常量,它返回一个带有当前文件路径的字符串
unless file_loaded?(__FILE__)
# 请注意,加载的扩展文件 (hello_world/main) 必须位于与Root文件同名的文件夹中
# ruby 文件的扩展名可以省略。实际加载的文件路径就是 hello_world/main.rb
ex = SketchupExtension.new('Hello Cube', 'hello_cube/main')
# 向扩展添加一些信息,方便管理
ex.description = 'SketchUp Ruby API example creating a cube.'
ex.version = '1.0.0'
ex.copyright = 'Trimble Navigations © 2016'
ex.creator = 'SketchUp'
# 告诉 SketchUp 注册此扩展
# 须将第二个参数设置为 true,否则用户在安装后还得手动启用扩展
Sketchup.register_extension(ex, true)
# 声明文件以被加载
# 重复调用时在 unless file_loaded?(__FILE__) 处便会直接终止
file_loaded(__FILE__)
end
end # module HelloCube
end # module Examples在您的 SketchUp 扩展文件夹中创建一个空白文本文件,将以上代码复制进去并保存,最后将其命名为 hello_cube.rb。
这个文件被称为 “Root” 文件,用于向 SketchUp 注册你的扩展。
注意
不要使用 Root 文件执行任何其他代码任务,以避免与其他扩展发生冲突。
2. hello_cube\main.rb 的源码
这是扩展 Root 文件所加载的文件,包含了扩展的所有功能性代码。 请阅读注释,以了解每行代码的作用。
ruby
# 与 Root 文件中的命名结构相同,以便将所有代码干净地包装在自己的 namepsace
module YourName
module ExtensionName
# 定义一个方法,用于在模型中的组内创建一个简单的立方体
def self.create_cube
# 引用当前的活动模型
# SketchUp API 仅允许您处理活动模型
# 在 Windows 下,一次只打开一个模型,但在 OSX 下可能会打开多个模型
# 如果在 OSX 下没有打开任何模型,则 model 的值将为 nil
model = Sketchup.active_model
# 为了简单起见,此示例中默认环境为 Windows,省略了以下这行的真值判断
# return if !model
# 请注意,必须使用 start_operation 和 commit_operation 封装该函数所有对模型的修改
# 否则,用户将可能需要手动点击几百次才能撤消该函数所做的修改
# 确保模型更改可在单个步骤中撤消,是进入官方扩展仓库时质量检查的要求之一
# 第一个参数是一个字符串,将附加到 Edit > Undo 菜单中,请确保是用户可以理解的名称
model.start_operation('Create Cube', true)
# 通过 API 创建群组(group),然后再将内容添加到其中
group = model.active_entities.add_group
entities = group.entities
# SketchUp 中的内部单位是英寸,数据始终以英寸为单位存储
# 直接输入 1 表示的是 0.0254 米(1 英寸)
# 为了更容易处理长度,Numeric 类扩展了一些单位换算的方法,例如输入 1.m 表示 “1米”
points = [
Geom::Point3d.new(0, 0, 0),
Geom::Point3d.new(1.m, 0, 0),
Geom::Point3d.new(1.m, 1.m, 0),
Geom::Point3d.new(0, 1.m, 0)
]
# 请注意,生成面的方向(法线)一般是由点的顺序决定。但创建的水平面默认法线始终朝下
face = entities.add_face(points)
# 调用 SketchUp 的推拉功能从面生成体块
# 请注意,必须使用负数才能使其沿 Z 轴的正方向向上挤出,这是因为之前创建的是水平面
face.pushpull(-1.m)
# 函数结束时提交所有操作到撤销记录
model.commit_operation
# 请注意,在生产环境中还需要捕获并处理可能发生的错误。简单起见,这里不这样做
end
# 创建扩展菜单
# 再次使用负载防护来防止意外重复创建相同菜单
unless file_loaded?(__FILE__)
# 获取对要添加的顶级菜单的引用
# 请注意,使用的 'Plugins' 是旧名称,以保持向后兼容。
menu = UI.menu('Plugins')
# 将菜单项直接添加到菜单的根目录中
# 点击菜单项时将调用 create_cube 方法
menu.add_item('Create Cube Example') {
self.create_cube
}
file_loaded(__FILE__)
end
end
end