天天看点

SketchUp插件开发(十)画墙工具——工具条和菜单命令类 Command工具条 Toolbar菜单 Menu代码触发时机

前面我们创建了一个带窗洞的墙,并且知道了如何复制出多个一模一样的墙。但是我们经常会需要在不同的位置绘制出不同长度不同高度的墙,这就需要一个画墙工具,设置好墙的高度和厚度之后,在地上绘制一条线就对应的生成一堵墙。所以从本篇开始讲解画墙工具如何实现,首先了解一下SketchUp的工具条和菜单栏。

无论是工具条还是菜单栏,原理上来说实际都是一个按钮的集合,点击一个按钮就执行一条命令,所以这里涉及到3个主要的类:工具条Toolbar、菜单Menu、命令类Command。

命令类 Command

命令对象并不能单独存在直接起作用,它都是被添加到工具条或菜单中,用于对工具条或菜单中的按钮进行控制并在按钮被点击时执行指定的操作。

例如,我们创建一个画墙的命令对象

cmd = UI::Command.new('画墙工具') {
  # 按钮点击时执行的操作
}
           

在这个命令对象上我们可以获取和设置以下几个属性:

  • 大图标 large_icon:用于工具条上的图标。
  • 小图标 small_icon:用于工具条提示文字中的图标。
  • 菜单文本 menu_text:在菜单中显示的按钮名称,和命令对象构造时的参数是一样的。
  • 状态栏提示文字 status_bar_text:鼠标移到对应的按钮上时状态栏的提示文本,鼠标移到工具条按钮上时还作为提示气泡的内容显示。
  • 工具条提示文字 tooltip:鼠标移到工具条按钮上时弹出的提示气泡标题。

以Console+插件的按钮为例来说明

SketchUp插件开发(十)画墙工具——工具条和菜单命令类 Command工具条 Toolbar菜单 Menu代码触发时机
SketchUp插件开发(十)画墙工具——工具条和菜单命令类 Command工具条 Toolbar菜单 Menu代码触发时机

这里需要注意的是,大图标和小图标需要设置为一个图片文件的路径,一般这个路径使用相对于当前代码所在文件的相对路径。

工具条 Toolbar

有了命令对象之后,添加到对应的工具条上很简单。首先我们需要有一个工具条

toolbar = UI::Toolbar.new('画墙工具条')
           

然后把命令添加到工具条上,并把工具条显示出来

toolbar.add_item(cmd)
toolbar.show
           

这样就创建出来一个添加了我们刚才创建的命令的工具条。

菜单 Menu

和工具条不同的是,我们并不能创建出一个新的菜单出来,而只能在现有的菜单的添加新的子菜单或菜单项。所以首先我们要先获取到现有的菜单对象

menu = UI.menu('Extensions')
           

其中的参数是菜单的名称,在SketchUp菜单栏上的每一个菜单都有一个名称

SketchUp插件开发(十)画墙工具——工具条和菜单命令类 Command工具条 Toolbar菜单 Menu代码触发时机

一般情况下,如果我们的功能属于独立的功能,我们会把在扩展程序里添加一个子菜单,再在子菜单下添加菜单项。

有了菜单对象之后,我们就可以添加新的菜单项了,比如我们使用上个实例的名称

submenu = menu.add_submenu('带窗洞的墙')
submenu.add_item(cmd)
           

这样就可以在扩展程序菜单下面看到一个子菜单“带窗洞的墙”,在下面还有一个菜单项“画墙工具”。

SketchUp插件开发(十)画墙工具——工具条和菜单命令类 Command工具条 Toolbar菜单 Menu代码触发时机

代码触发时机

前面所有的讲解中,我们的代码都是在控制台中执行的。在最开始的时候我们还介绍了一种方法是在SketchUp启动的时候,利用其插件加载机制加载执行我们的代码。

这里我们又介绍了一种代码触发的时机,就是在工具条或菜单栏按钮点击的时候。在真正的插件开发中,我们用的最多的就是这种方式的触发,例如点击按钮弹出对话框、激活工具等。但是这种方式需要先把工具栏和菜单创建出来,所以我们可以结合加载插件的方式,在SketchUp启动的时候执行我们创建工具条和菜单的代码,在点击按钮的时候再执行我们的业务代码。

所以我们可以在Plugins目录下新建一个文件:plugin_demo.rb,然后把上面创建工具条和菜单栏的代码写到文件中

cmd = UI::Command.new('画墙工具') {
  # 按钮点击时执行的操作
}
toolbar = UI::Toolbar.new('画墙工具条')
toolbar.add_item(cmd)
toolbar.show

menu = UI.menu('Extensions')
submenu = menu.add_submenu('带窗洞的墙')
submenu.add_item(cmd)
           

结合我们前面讲解的实例,把实例中所有的代码添加到上面创建的命令中

model = Sketchup.active_model
entities = model.entities
points = [Geom::Point3d.new(0, 0, 0), Geom::Point3d.new(0, 200.mm, 0), Geom::Point3d.new(5000.mm, 200.mm, 0), Geom::Point3d.new(5000.mm, 0, 0)]
face = entities.add_face(points)

unless face.normal.samedirection?(Z_AXIS)
  face.reverse!
end
face.pushpull(3000.mm)

points = [Geom::Point3d.new(1000.mm, 0, 200.mm), Geom::Point3d.new(1000.mm, 0, 2000.mm), Geom::Point3d.new(3000.mm, 0, 2000.mm), Geom::Point3d.new(3000.mm, 0, 200.mm)]
face = entities.add_face(points)
face.pushpull(-200.mm)

group = entities.add_group(entities.to_a)

materials = model.materials
material = materials.add('Test')
material.texture = 'd:/wall.jpg'
group.material = material
texture = material.texture
texture.size = 3000.mm
           

这样在启动SketchUp的时候就可以看到我们创建的工具条和菜单

SketchUp插件开发(十)画墙工具——工具条和菜单命令类 Command工具条 Toolbar菜单 Menu代码触发时机

点击工具条上的按钮或菜单中的“画墙工具”就可以创建出我们讲解的上一个实例中的墙了。

补充:我们的工具条上的按钮之所以显示成一个哭脸的样子,是因为我们没有为命令设置图标,这样SketchUp会显示一个默认的图标。