在上一篇中,我们可以在鼠标点击的任意位置创建出一堵带窗洞的墙来,但是我们创建的墙都是一模一样的。在实际应用的,我们往往需要不同厚度、不同高度、不同长度的墙,如果要用我们的工具绘制出来就需要调整创建时的数据,也就是各种偏移、推拉等的数据。所以我们可以把这些数据定义成一个变量,根据交互来调整这些变量,以创建出来各种不同的墙。在本篇中,我们通过对话框来调整创建墙的数据。
为方便讲解,我们暂时仅创建墙,把添加窗洞的功能先去掉。
从代码中分析可以知道,墙底面的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)这样就可以创建出一个输入对话框。其中
prompts:每个编辑框的标题。defaults:输入框的默认值。title:输入对话框的标题。input:如果点“确定”按钮,返回所有编辑框中的输入的字符串数组,如果点“取消”按钮,返回false。我们把这段代码包装成我们的工具类的一个私有方法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其中
key:键盘按键的虚拟键码。repeat:按键按下去就释放该值是1,按键一直按下去则该值是2。view:视图对象。flags:按键的状态。比如,我们使用Ctrl键来触发参数修改,可以实现为
case key when VK_CONTROL change_wall end这样,在Ctrl键按下的时候,我们的修改参数对话框才会弹出来,在点击的时候就会使用上次修改过后的参数来生成墙,直到再次激活工具的时候,就又会恢复到我们设置的默认参数。