Home   Archive   Permalink



getting values from gui and using them in functions

I'm slowly going mad trying to do something I'm sure is really easy: I modified the simple 3d box drawing program in the tutorial to show a window first that asked for coordinates of the corners and colours for the sides. I've got it to show that window without any trouble, and as long as i leave the values for the box hard-coded, when i press the 'draw box' button, it does that.
    
However, I'm confused as to how to get the values from the input to use as parameters fot drawing the box. Although I've assigned a name to the color-picker, for instance, i can 'print get-face c10' in the code, and it prints the RGB value. but there's no 'to-color' or 'to-rgb' that i can tell from the internal help, and i just can't seem to get the fill command to understand that c10 is supposed to be a color.
    
Similarly, I've tried to enter separate x and y coordinates for the corners, and then concatenate them into the XxY format for coordinates, but it won't accept the variable names, having tried several options including 'to-integer', get-face and so-on.
    
FYI, my background is BASIC programmer as a youth, then 15 years as a professional RPG programmer on IBM s/38 and AS/400, writing transaction-processing programs. virtually no PC or graphics programming, but exploring Rebol on Android. Here is the program in its. Im sure the solution is simple, but either I misunderstood or couldn't find the relevant documentation. Any help appreciated
    
R E B O L [title: "here"]
do %r3-gui.r3
bck: make image! 400x220
view [ c1: field 75 "top left x"
    c2: field 75 "top left y"
    c3: field 75 "top right x"
    c4: field 75 "top right y"
    c5: field 75 "top front x"
    c6: field 75 "top front y"
    c7: field 75 "top back x"
    c8: field 75 "top back y"
    c9: field 75 "height"
    c10: color-picker
;    c11: color-picker
;    c12: color-picker
    button "make box" on-action [
print get-face c10
view/no-wait [image bck]
draw bck to-draw [
    t1: rejoin [to-integer get-face c1, "x", to-integer get-face c2]
    t2: join [c3, "x", c4]
    t3: join [c5, "x", c6]
    t4: join [c7, "x", c8]
    b1: join [c1, "x", (c2 +c9)]
    fill-pen c10
    polygon t1 t2 t3 t4
    fill-pen c10
    polygon 20x40 200x50 200x200 20x100
    fill-pen c10
    polygon 200x50 380x40 380x100 200x200]
copy []
do-events
]
]


posted by:   Mike Hersee     30-Mar-2014/4:27:18-7:00



Hi Mike,
    
If you type this into the R3 console:
    
     type? red     ; or any other color
    
You'll see the response is:
    
     == tuple!
    
If you type:
    
     help tuple
    
You'll see that one of the choices is:
    
     to-tuple        function! Converts to tuple! value.
    
That's the function you need to convert to a color data type. Now try typing:
    
     help pair
    
You'll see that there are 'as-pair and 'to-pair functions. Try looking at the source to see what the function arguments are:
    
     >> source as-pair
    
     as-pair: make native! [[
         "Combine X and Y values into a pair."
         x [number!]
         y [number!]
     ]]
    
That's the function you need to convert your number input into a coordinate (pair) value. Notice in the definition above that the 'x and 'y arguments must be number! values:
    
     >> as-pair "10" "23"
     ** Script error: as-pair does not allow string! for its x argument
    
     >> as-pair to-integer "10" to-integer "23"
     == 10x23
    
You can usually find the answers to any documentation questions in the interpreter console, once you know where to look. Using 'what, 'help, 'source, and exploring the built in system objects is an important part of being able to find answers. I wrote some basics about it:
    
     http://business-programming.com/business_programming.html#section-13.1 (R2)
     http://learnrebol.com/rebol3_book.html#section-17.1 (R3)

posted by:   Nick     30-Mar-2014/9:11-7:00



This should do the job:
    
R E B O L [title: "here"]
do %r3-gui.r3
bck: make image! 400x220
view [
     c1: field 75 "top left x"
     c2: field 75 "top left y"
     c3: field 75 "top right x"
     c4: field 75 "top right y"
     c5: field 75 "top front x"
     c6: field 75 "top front y"
     c7: field 75 "top back x"
     c8: field 75 "top back y"
     c9: field 75 "height"
     c10: color-picker
     button "make box" on-action [
         color1: to-tuple get-face c10
         t1: as-pair to-integer get-face c1 to-integer get-face c2
         t2: as-pair to-integer get-face c3 to-integer get-face c4
         t3: as-pair to-integer get-face c5 to-integer get-face c6
         t4: as-pair to-integer get-face c7 to-integer get-face c8
         b1: as-pair to-integer get-face c1 ((to-integer get-face c2) + (to-integer get-face c9))
         view/no-wait [image bck]
         draw bck to-draw [
             fill-pen color1
             polygon t1 t2 t3 t4
             fill-pen color1
             polygon 20x40 200x50 200x200 20x100
             fill-pen color1
             polygon 200x50 380x40 380x100 200x200]
         copy []
         do-events
     ]
]

posted by:   Nick     30-Mar-2014/9:16:28-7:00



Doing it this way would be my preference:
    
R E B O L [title: "here"]
do %r3-gui.r3
bck: make image! 400x220
view [
     text "Top Left:" c1: field 75 "20x40"
     text "Top Back:" c2: field 75 "200x20"
     text "Top Right:" c3: field 75 "380x40"
     text "Top Front:" c4: field 75 "200x80"
     text "Height" c9: field 75 "30"
     c10: color-picker
     button "make box" on-action [
         color1: to-tuple get-face c10
         height: as-pair 0 (to-integer get-face c9)
         t1: to-pair get-face c1
         t2: to-pair get-face c2
         t3: to-pair get-face c3
         t4: (to-pair get-face c4) - height
         view/no-wait [image bck]
         draw bck to-draw compose [
             fill-pen color1
             polygon t1 t2 t3 t4
             fill-pen color1
             polygon 20x40 (200x80 - height) 200x200 20x100
             fill-pen color1
             polygon (200x80 - height) 380x40 380x100 200x200
         ]
         copy []
         do-events
     ]
]

posted by:   Nick     30-Mar-2014/22:48:34-7:00



I'd add some validation to ensure users don't enter invalid data:
    
R E B O L [title: "here"]
do %r3-gui.r3
bck: make image! 400x220
btndo: [if error? try [to-pair arg] [alert "Please enter a coordinate pair (i.e., 20x40)"]]
view [
     text "Top Left:" c1: field 75 "20x40" on-action btndo
     text "Top Back:" c2: field 75 "200x20" on-action btndo
     text "Top Right:" c3: field 75 "380x40" on-action btndo
     text "Top Front:" c4: field 75 "200x80" on-action btndo
     text "Height" c9: field 75 "30"
     c10: color-picker
     button "make box" on-action [
         color1: to-tuple get-face c10
         height: as-pair 0 (to-integer get-face c9)
         t1: to-pair get-face c1
         t2: to-pair get-face c2
         t3: to-pair get-face c3
         t4: (to-pair get-face c4) - height
         view/no-wait [image bck]
         draw bck to-draw compose [
             fill-pen color1
             polygon t1 t2 t3 t4
             fill-pen color1
             polygon 20x40 (200x80 - height) 200x200 20x100
             fill-pen color1
             polygon (200x80 - height) 380x40 380x100 200x200
         ]
         copy []
         do-events
     ]
]
    
(Notice that the 'height' calculation is included in the code above)

posted by:   Nick     30-Mar-2014/23:01:10-7:00



Gosh, thank you Nick for that copious help. Will try it out at the earliest opportunity. Actually, I did try 'tuple', but i wasn't sure if it applied only to ip addresses, and i didn't have the rest of the syntax correct so i was led astray. i specifically set it to ask for x and y separately just to test myself joining the values together. I agree, for that simple purpose, it's easier to input the combined coordinate as one field


posted by:   Mike Hersee     31-Mar-2014/14:56:41-7:00