在上一篇中,我们可以在鼠标点击的任意位置创建出一堵带窗洞的墙来,但是我们创建的墙都是一模一样的。在实际应用的,我们往往需要不同厚度、不同高度、不同长度的墙,如果要用我们的工具绘制出来就需要调整创建时的数据,也就是各种偏移、推拉等的数据。所以我们可以把这些数据定义成一个变量,根据交互来调整这些变量,以创建出来各种不同的墙。在本篇中,我们通过对话框来调整创建墙的数据。
为方便讲解,我们暂时仅创建墙,把添加窗洞的功能先去掉。
从代码中分析可以知道,墙底面的x方向的偏移就是墙的长度,y方向的偏移就是墙的厚度,推拉的距离就是墙的高度,所以我们可以把这3个数据定义成工具的成员变量,在工具构造的时候分配一个默认值,在交互中修改这几个成员变量,在创建墙的时候使用这几个变量的值进行计算操作。
class DrawWallTool
# 初始化
def initialize
@thickness = 200
@length = 5000
@height = 3000
end
end
然后在创建墙的代码中,把原来硬编码的数值替换成我们定义的变量
...
x_offset = @length.mm
y_offset = @thickness.mm
...
face.pushpull(@height.mm)
...
SketchUp中可以创建出各种各样的对话框,从最简单的消息框到复杂的网页对话框,每种对话框都有其特定的用途。这里我们先从简单的输入对话框开始,输入对话框可以把用户的输入传递给程序,是一个固定格式的对话框。以我们将要修改的墙的几个参数为例
prompts = ['厚度(mm)', '高度(mm)', '长度(mm)']
defaults = [@thickness.to_s, @height.to_s, @length.to_s]
title = '修改墙参数'
input = UI.inputbox(prompts, defaults, title)
这样就可以创建出一个输入对话框。其中
我们把这段代码包装成我们的工具类的一个私有方法change_wall中,在每次创建墙之前进行调用,在鼠标点击时就可以看到弹出的对话框
不进行任何修改,点击确定之后,我们可以把结果打印到控制台中
所以我们按顺序把结果转为我们的墙参数就可以了
@thickness = input[0].to_i
@height = input[1].to_i
@length = input[2].to_i
如果我们对参数进行了修改,那现在创建出来的墙就是我们修改后的样子了。
上面每次点击都需要编辑墙的参数很不方便,实际上我们可能只需要编辑一次,然后就要创建很多堵墙,然后再编辑一次,再创建很多堵墙。所以我们需要另外一个时机来编辑墙参数,在这里我们使用键盘按键按下接口
def onKeyDown(key, repeat, flags, view)
p '按键按下接口'
p key
end
其中
比如,我们使用Ctrl键来触发参数修改,可以实现为
case key
when VK_CONTROL
change_wall
end
这样,在Ctrl键按下的时候,我们的修改参数对话框才会弹出来,在点击的时候就会使用上次修改过后的参数来生成墙,直到再次激活工具的时候,就又会恢复到我们设置的默认参数。