I can’t find anything later related to my topic title than this example from about five years ago.
And the code I copied from there doesn’t seem to work for me.
I want to validate user input as a valid SU length.
I’ve tried using this code to replace my inputbox, but while there is an error showing in the Ruby console, it isn’t coming from the replacement inputbox, but from later in the code where I try to convert the (invalid) input into a length.
def inputs(*args)
results = nil
begin
results = UI.inputbox(*args)
puts "Results from inputs = " + results.inspect
rescue ArgumentError => error
UI.messagebox error.message
if args.length > 0
retry
end
end
results
end
I added the puts line just to make sure that my active code IS using this replacement for the inputbox. It is.
If I deliberately enter an invalid length as 40g in the second (text) field expecting a length value (the default set is 0.inch), the code isn’t triggering the messagebox but just shows this in the Ruby console while closing the inputbox on screen.
Results from inputs = ["14'", "40g", "4'", "0\"", "1\""]
Error: #<ArgumentError: Cannot convert "40g" to Length>
/Users/JohnWMcC/Library/Application Support/SketchUp 2020/SketchUp/Plugins/scenery.rb:161:in `to_l'
And that’s from a much later line where I am converting the value retrieved from the text box to length using .to_l
Does that mean I have to do the error trap at that point, since the inputs method replacing inputbox isn’t trapping the error there?
It looks like all of the default values are String objects. Inputbox will return the same type as the default type you provide. What happens if you use a Length as the default type?
In other words, if you expect an input to be an Integer, use an Integer as the default value. If you expect a Float, use a Float, etc.
I thought I had. E.g. 14.feet in drop down list, or 0.inch in the custom height field.
And in starting defaults as well as default values from last use.
As all my fields (drop down lists or custom values) are lengths, I though I might put the test in the results method instead, iterating through the fields. Would that work - trying to convert custom values to length and picking up invalid ones there using Argument Error?
They get displayed as text though, as feet & inches for (e.g., 30”) or inches, depending on Units - Architectural or Fractional.
Thank you again for that, Dan. I knew of it, and read it ages ago, but had lost the reference. I’ll study it again. The annoying thing I think I remember solving this some years ago, but don’t know where I put the solution.
Thanks to both @jim_foltz and @DanRathbun for your help. You pointed me in the right direction to look
I’ve found the problem. Although I set the defaults initially to lengths, when I’m saving the results as new defaults, I’m wrongly now not converting them back to lengths.
In a slightly earlier version, I had converted the accepted inputs into lengths, but then reverted to strings, or changed it back deliberately for the wrong reasons.
I CAN now trigger an error with an invalid customHeight input, and pop up the messagbox in the inputs method itself. I think I should now be able to fix the rest of the inputs.
The references (2 of them, ie, in the Ideas and the Reference lists) are in my Ruby Learning Resources that are pinned to this category. ( That’s where I went to grab the link to post it. )