### Layout Monitor Availability LightWave® 7.0 Component Layout Header lwmonitor.h The Layout monitor global returns functions for initializing and displaying a progress dialog in Layout. This is primarily for showing the progress of lengthy or complex operations in non-handler plug-in classes. Filters and file importer classes have their own monitor mechanisms. See also the monitor global for Modeler. Global Call
       LWLMonFuncs *lmonf;
       lmonf = global( LWLMONFUNCS_GLOBAL, GFUSE_TRANSIENT );
The global function returns a pointer to an LWLMonFuncs.
       typedef struct st_LWLMonFuncs {
          LWLMonID (*create)   (void);
          void     (*setup)    (LWLMonID, char *title, unsigned int flags,
                                  const char *histfile);
          void     (*setwinpos)(LWLMonID, int x, int y, int w, int h);
          void     (*init)     (LWLMonID, unsigned int total, const char *);
          int      (*step)     (LWLMonID, unsigned int incr, const char *);
          void     (*done)     (LWLMonID);
          void     (*destroy)  (LWLMonID);
       } LWLMonFuncs;
`mon = create()` Create a new monitor instance. The monitor returned by `create` is passed as the first argument to the other monitor functions. `setup( mon, title, flags, histfile )` Configure the monitor. The `title` string is the title of the monitor window. The `histfile` is the filename of a history file where messages displayed to the user will also be written. This can be NULL if you don't want a history file. The flags can be any of the following combined using bitwise-or. `LMO_NOABORT` By default, the user can inform you that your operation should be stopped. This flag disables the Abort button. `LMO_REVIEW` If this is set, the monitor window remains open after you call `done`. This allows the user to review the messages displayed during the operation. `LMO_HISTAPPEND` By default, the history file is overwritten each time `init` is called. This flag causes new message strings to be appended to the file instead. `LMO_IMMUPD` Enables immediate update of the monitor on every step. The default is to delay updates to avoid incurring too much overhead for rapid step events. `setwinpos( mon, x, y, w, h )` Set the position and size of the monitor window. The dimensions are in pixels. If you don't call this, Layout will select defaults for you. `init( mon, total, message )` Open the monitor window. The `total` is the number of steps in the operation. While `step` is being called, Layout displays your progress to the user as a percentage of this total. The `message` is the first string displayed to the user. `abort = step( mon, increment, message )` Advance the progress display by the fraction `total/increment`. When the sum of the steps reaches the total, the progress display will indicate to the user that the task has finished. An increment of 0 is valid and can be used to change the message without changing the progress indication. The `message` can also be NULL, in which case Layout may substitute a generic progress message. If `step` returns 1, the user has requested that the task be aborted. `done( mon )` Tell the monitor that the task has been completed. If the flags passed to `setup` included `LMO_REVIEW`, the monitor window remains open and control won't be returned from `done` until the user closes the window. Otherwise `done` closes the window and control returns immediately. `destroy( mon )` Free the monitor instance and resources allocated by `create`. If it's open, the monitor window will be closed. Example This code fragment creates and displays a monitor in Layout. Displaying progress to the user is helpful but not essential, so in most cases failure in some part of the monitor processing shouldn't cause your plug-in to fail.
       #include <lwserver.h>
       #include <lwgeneric.h>
       #include <lwmonitor.h>
       #include <time.h>

       LWLMonFuncs *monf;
       LWLMonID mon;
       int i, total, step;

       /* get the global and a monitor */

       monf = global( LWLMONFUNCS_GLOBAL, GFUSE_TRANSIENT );
       if ( monf ) {
          mon = monf->create();
          if ( mon )
             monf->setup( mon, "Just Testing", LMO_REVIEW, NULL );
       }

       ...
       /* perform a lengthy task */

       if ( monf && mon ) monf->init( mon, total, "Starting..." );
       for ( i = 0; i < total; i += step ) {
          ...do something...
          if ( monf && mon )
             if ( monf->step( mon, step, NULL )) {
                monf->step( mon, 0, "Aborted!" );
                break;
             }
       }
       if ( monf && mon ) monf->done( mon );

       ...
       /* no longer need the monitor */

       if ( monf && mon ) monf->destroy( mon );