### getdata.sml ### Sample script for Building Dialogs in SML ### Illustrates different available methods for reading values from a dialog. ### Global variable declarations numeric errXML, dlgreturn; string xmlfile$; # clear the console window clear(); ### create string with path and filename of XML file with the ### dialog specification (assumed to be in same directory as this script) xmlfile$ = _context.ScriptDir + "/getdata.xml"; ### read and parse XML file; returns an error code (number < 0 ) if there are syntax errors class XMLDOC doc; errXML = doc.Read(xmlfile$); if (errXML < 0) { PopupError(errXML); # Popup an error dialog. "Details" button shows syntax errors. Exit(); } ### declare class instance for the dialog element in the XML structure ### and get the dialog handle from the XML structure. ### Pop up an error dialog and exit if the dialog ID can't be found in the XML. class XMLNODE dlgnode; dlgnode = doc.GetElementByID("tigrds"); if (dlgnode == 0) { PopupMessage("Could not find dialog node in XML document"); Exit(); } ### declare class instance for the dialog window and set the XML structure ### in memory as the source for the dialog. class GUI_DLG dlgwin; dlgwin.SetXMLNode(dlgnode); ### open as a modal dialog; the DoModal() method doesn't return until the dialog is ### closed; it returns -1 if the user presses [Cancel], or 0 if the user presses [OK]. dlgreturn = dlgwin.DoModal(); if (dlgreturn == -1) { # exit script when Cancel button on dialog is pressed Exit(); } # Here are four ways to get settings out of the dialog. # The extracted values are printed to the console window as an example. proc GetValues () { # 1 -- Use the GetValues() class method for the dialog window (in GUI_DLG) # to get all of the control settings at once. They are returned to a # previously-declared instance of class GUIFORMDATA. Use GetValue...() # methods in that class to read the values as needed. printf("Dialog values using GUI_FORMDATA:\n"); class GUI_FORMDATA data; data = dlgwin.GetValues(); printf(" Extract Road Lines toggle (numeric value)= %d\n", data.GetValueNum("getrds") ); printf(" Extract Road Lines toggle (string value)= %s\n", data.GetValueStr("getrds") ); printf(" Make Roads Buffer toggle (numeric value)= %d\n", data.GetValueNum("mkbuf") ); printf(" Make Roads Buffer toggle (string value) = %s\n", data.GetValueStr("mkbuf") ); printf(" Buffer distance value = %d\n", data.GetValueNum("buffdist") ); # 2 -- Use GetCtrlValueNum() and GetCtrlValueStr() class methods for the dialog # window (in class GUI_DLG) to ask the dialog for each control value as # needed. No GUI_FORMDATA class instance is required. Less efficient than # #1 if multiple control values are needed. Internally it calls dlgwin.GetValues, # pulls out the one value asked for, and discards the rest. printf("\nDialog values using GetCtrlValue... methods in GUI_DLG class:\n"); printf(" Extract Road Lines toggle (numeric value)= %d\n", dlgwin.GetCtrlValueNum("getrds") ); printf(" Extract Road Lines toggle (string value)= %s\n", dlgwin.GetCtrlValueStr("getrds") ); printf(" Make Roads Buffer toggle (numeric value)= %d\n", dlgwin.GetCtrlValueNum("mkbuf") ); printf(" Make Roads Buffer toggle (string value) = %s\n", dlgwin.GetCtrlValueStr("mkbuf") ); printf(" Buffer distance value = %d\n", dlgwin.GetCtrlValueNum("buffdist") ); # 3 -- Use the GetCtrlByID() method in GUI_DLG to get the handle for a control, # which is assigned to a previously-declared instance of the appropriate control # class. Then use a GetValue...() or similar method in the individual GUI_CTRL... # class to read the control value individually as needed. class GUI_CTRL_TOGGLEBUTTON getrds; class GUI_CTRL_TOGGLEBUTTON mkbuf; class GUI_CTRL_EDIT_NUMBER buffdist; getrds = dlgwin.GetCtrlByID( "getrds" ); mkbuf = dlgwin.GetCtrlByID( "mkbuf" ); buffdist = dlgwin.GetCtrlByID( "buffdist" ); printf("\nDialog values using GetCtrlByID and control class methods:\n"); printf(" Extract Road Lines toggle (numeric value) = %d\n", getrds.GetValueNum() ); printf(" Extract Road Lines toggle (string value)= %s\n", getrds.GetValueStr() ); printf(" Make Roads Buffer toggle (numeric value)= %d\n", mkbuf.GetValueNum() ); printf(" Make Roads Buffer toggle (string value) = %s\n", mkbuf.GetValueStr() ); printf(" Buffer distance value = %d\n", buffdist.GetValueNum() ); # 4 -- A more compact (but perhaps less clear version of method 3. Methods to get # the control handle and its value are strung together, eliminating the need to # declare the control handle class variable. printf("\nDialog values using GetCtrlByID strung together with control class methods:\n"); printf(" Extract Road Lines toggle (numeric value) = %d\n", dlgwin.GetCtrlByID("getrds").GetValueNum() ); printf(" Extract Road Lines toggle (string value)= %s\n", dlgwin.GetCtrlByID("getrds").GetValueStr() ); printf(" Make Roads Buffer toggle (numeric value)= %d\n", dlgwin.GetCtrlByID("mkbuf").GetValueNum() ); printf(" Make Roads Buffer toggle (string value) = %s\n", dlgwin.GetCtrlByID("mkbuf").GetValueStr() ); printf(" Buffer distance value = %d\n", dlgwin.GetCtrlByID("buffdist").GetValueNum() ); }