Current Page: NeXtMidas Training Macros - Part 2 (Graphics) Lab 1 - Macro Graphics Instructions
- - | Lab 1 - Macro Graphics (Part A): This lab will have you create a NeXtMidas GUI from a macro. It will be a simple GUI with just five controls in it, so don't get worried. First create a new macro called `graphicslab1` and add it to the TRAIN option tree. The macro will not take in any parameters so you can add it to the command dictionary at any time. Inside the macro create a new pipe section. Inside the pipe section add a line to bring up a `PANEL`; you will want to use the `/CONTROLS=GC` switch with `PANEL`. Just after creating the panel you will need to add five controls. A `BUTTON` named `STATE` with no title and a single button "`Stop`". A `CALENDAR` named `DATE`. A `LVAL` named `YEAR` (min=2000, max=2100). A `LVAL` named `MONTH` (min=1, max=12). A `LVAL` named `DAY` (min=1, max=31). Part B will cover the details of `processMessage` procedure. For now just make it print out the message received.
        procedure processMessage m:msg
          say "Got message name=^msg.name info=^msg.info data=^msg.data"
        return
Now try running your macro, it should look something like this: Take note of the messages received when you click on things. Lab 1 - Macro Graphics (Part B): Now its time to fill in the `processMessage` procedure. When the user clicks the "Stop" button the macro should stop. You can do this by calling `PIPE STOP`. When the user clicks on the graphical calendar, you need to update the year, month, and day widgets to match the date the user selected. The date selected is in the data field of the message. You will need to use `SEDIT` to parse the date (look at the ELEMent function in the SEDIT explain file). You can make the output of `SEDIT` set the value of each of the widgets. Hint: Remember adding the `/CONTROLS=GC` back in Part A? That was so that we can use `GC.<name>.VALUE` to set the values of the widgets. When the user updates the year, month, or day fields you will need to update the calendar to match. For this you will need to `INVOKE` the `setDate(year,month,day)` method in the calendar widget. Hint: This time use `GC.<name>.VALUE` to get the values of the widgets. Hint: Since all three `LVAL` widgets end up calling the same code, you might want to write the code once and make use of the `OR` in your `IF`. Finally, if you get a message that doesn't match any of the above, you should print out a message saying you got an "Unhandled message". Hint: Lab 1 - Macro Graphics (Part X): This is not actually part of the lab... If you finish the lab quickly, here are a few things you might want to consider adding to your macro: If the user selects a date that is invalid (such as "April 31"), alert the user using `POPUP`. Hint: A procedure that computes leap years might be helpful. Add a text field control. When the user changes the date update the control to include the date.