如何询问和验证“UI.Inputbox”字段的长度?

How to ask and validate a length from a `UI.Inputbox` field?

在 SketchUp 上,可以使用使用 UI.Inputbox 方法创建的对话框 window 请求用户输入。询问脚本随后将创建的某些几何体的尺寸或长度是一项基本任务。

SketchUp 在内部使用英寸来定义几何体。用户将在 his/her 本地化维度成语中给出答案:'1,5m' 表示 1.5 米。内置的 SketchUp 方法 .to_l 将字符串转换为长度。请参阅 https://github.com/thomthom/SketchUp-Units-and-Locale-Helper#sketchups-shortcomings 以供参考。

我要求用户输入来自 UI.Inputbox 的字符串长度,然后使用 .to_l 将其转换为长度值,但如果用户键入无效值我不知道如何检查或如何处理错误。

由于我的本地化长度输入有','作为小数分隔符(在葡萄牙语中是 1.5m 而不是 1.5m),我不愿意要求浮点值。

prompts = ['Length']
defaults = ['1,2']
inputs = UI.inputbox( prompts, defaults ,'Length Input')
inputs[0].to_l
#try inputs[0].to_f 

如何检查输入字符串或捕获.to_l失败?

这应该适合您,但可能需要根据您希望每个错误案例执行的操作对其进行微调。

prompts = ['Length']
defaults = ['1,2']
inputs = UI.inputbox( prompts, defaults ,'Length Input')

假设以上,我们可以为您的输入创建一个方法来处理错误情况。

def parse_input(inputs)
  input = normalize(inputs)

  handle_error if input.empty?
  input
end

def normalize(input)  
   input.gsub(/[a-zA-Z]/, "")
end

def handle_error
  # you could raise an error or just return the default
end

当您解析输入时,它会尝试 'normalize' 它 - 这意味着它用点替换逗号,然后调用 to_f。由于看起来您是从字段中获取此作为输入,因此 inputs 将始终是 String,因此无需担心处理其他类型。示例输出:

normalize('1,4') #=> '1.4'
normalize('2.6') #=> '2.6'
normalize('5a.2') #=> '5.2'
normalize('text') #=> ''

现在输入已规范化,您可以处理错误(这基本上是在规范化输入为空字符串时。您想要做什么取决于您自己以及在您的特定情况下最有效的方法。

如果没有输入错误,最后返回输入。

I'm asking the user for a length as a string from UI.Inputbox and then converting it to a length value using .to_l

这个问题是错误的,我的意思是,要求一个字符串并尝试自己管理本地化浮点值的复杂性并不是一个好主意。不要这样做!

请求 'length',SketchUp 会为您处理一切。使用 .m,系统将提示用户输入 local/chosen 单位的值。结果输入将在 'Length - internal units'.

prompts = ['Name', 'Width', 'Height']
defaults = ['My Own Square', 5.m, 2.m]
input = UI.inputbox( prompts, defaults, 'Create Square' )
# User enters Width: 300cm, Height 4
p input
# => ["My Own Square", 118.110236220472, 157.48031496063]
p input.map { |n| n.class }
# => [String, Length, Length]
p input.map { |n| n.to_s }
# => ["My Own Square", "3000mm", "4000mm"]

资料来源:ThomThom http://www.thomthom.net/thoughts/2012/08/dealing-with-units-in-sketchup/