2015-04-13 2 views
1

В SketchUp можно запросить ввод пользователя, используя диалоговое окно, созданное с помощью метода UI.Inputbox. Основная задача - задать размер или длину некоторой геометрии, создаваемой впоследствии скриптом.Как спросить и подтвердить длину из поля `UI.Inputbox`?

Внутренний SketchUp использует Inches для определения геометрии. Пользователь даст ответ в своей локализованной размерной идиоме: «1,5 м» на 1,5 метра. Встроенный метод SketchUp .to_l преобразует строки в длину. См. https://github.com/thomthom/SketchUp-Units-and-Locale-Helper#sketchups-shortcomings для справки.

Я запрашиваю у пользователя длину в виде строки от UI.Inputbox, а затем преобразовываю ее в значение длины с помощью .to_l, но если пользователь вводит недопустимое значение, я не знаю, как проверить или как обрабатывать ошибку.

Поскольку мои локализованные входы длины имеют «,» как десятичное разделение (по-португальски это 1,5 м не 1,5 м), я не желаю запрашивать значение с плавающей запятой.

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

Как проверить входную строку или уловить .to_l отказ?

+1

вы можете предоставить код в качестве примера? трудно понять, что вы спрашиваете – dax

+0

@ dax посмотреть, похоже ли это на лучший вопрос ... – villares

+0

да, теперь это проще понять, но у меня все еще есть вопрос.Вы говорите, что не хотите запрашивать плавающие точки - значит ли это, что вы всегда будете получать целые числа целого числа в виде строк? – dax

ответ

1

Я спрашиваю у пользователя длины в виде строки из UI.Inputbox, а затем преобразования его в значение длины используя .to_l

Вопрос неправ, я имею в виду, что не стоит просить строку и попробовать себя для управления сложностями локализованных значений float. Не делай этого!

Акс для «длины» и SketchUp позаботится обо всем для вас. Используйте .m, и пользователю будет предложено значение в его локальных/выбранных единицах. Результирующий вход будет в разделе «Длина - внутренние единицы».

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/

1

Это должно сработать для вас, но, возможно, оно должно быть точно настроено в зависимости от того, что вы хотите сделать для каждого случая ошибки.

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 

Когда вы разбираете вход, он пытается «нормализовать» это - это означает, что он заменяет запятые с точками, а затем вызывает to_f. Поскольку похоже, что вы получаете это как поле ввода, inputs всегда будет String, поэтому вам не нужно беспокоиться о работе с другими типами. Пример вывода:.

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

Теперь, когда ввод нормализуется, вы можете обрабатывать ошибки (которые в основном, когда нормированный вход пустая строка, что вы хотите сделать, есть к вам и что лучше всего работает в вашем конкретный случай.

Наконец, вход возвращается, если нет ошибок ввода.

+0

Практически там ... Наверное, мне нужно будет проверить локализацию и фильтр. или ',' соответственно ... – villares

+0

Dax, ваш ответ был велик, но вопрос был неправильным. – villares

+0

не беспокойтесь, рад, что вы нашли решение! – dax

Смежные вопросы