Below is an example of a plug-in which does a viewframe on all picked objects. It is a simple example of a momentary plug-in.
;; This file simply gives the defaults for the Scheme variables ;; used in the option box. (ui-symbol "frame" 0) (ui-string "frame" "Frame")
;; This file defines the option box (ui-editor "frame.options" (list 'symbols 'frame ) (list 'title "View Frame Options") (ui-integer-widget "frame" (list 'range 0 65535) ) )
#include <AlUniverse.h> #include <AlViewFrame.h> #include <AlPickList.h> #include <AlObject.h> #include <AlLiveData.h> #include <AlFunction.h> #include <AlFunctionHandle.h> #include <AlIterator.h> #include <strings.h> // A simple iterator used to pass the frame number // along when viewing an object. class viewIterator: public AlIterator { public: viewIterator( double frame = 0.0 ) : frameNum( frame ) {}; virtual ~viewIterator() {}; virtual int func( AlObject* ); private: double frameNum; }; // The iterator's one and only method. Does a viewframe // on the passed in object using the frame number in the // iterator object. int viewIterator::func( AlObject* obj ) { if ( obj == NULL ) return 0; AlAnimatable* animitem; AlCurve* curve; AlSurface* surface; AlObjectType type = obj->type(); if( animitem = obj->asAnimatablePtr() ) AlViewFrame::viewFrame( animitem, frameNum, AlViewFrame::kObjectAndBelow ); else if( curve = obj->asCurvePtr() ) AlViewFrame::viewFrame( curve, frameNum ); else if( surface = obj->asSurfacePtr() ) AlViewFrame::viewFrame( surface, frameNum ); else AlPrintf( kPrompt, "Sorry, %s is not a viewable object", obj->name() ); ; // a non viewable object return 0; } // The actual plug-in function. void my_view() { int frameNum; // Get the frame number from the option box. if( sSuccess == AlGetInteger( "frame", frameNum ) ) { // Print the number to the promptline. AlPrintf( kPrompt, "Viewing frame %d.", frameNum ); // Instantiate an iterator and apply it to all picked // objects. int rc; viewIterator* view = new viewIterator( frameNum ); if ( sSuccess != AlPickList::applyIteratorToItems( view, rc ) ) AlPrintf( kPrompt, "Iterator failed." ); if ( rc != 0 ) AlPrintf( kPrompt, "Return code is %d.", rc ); AlPrintf( kPrompt, "Viewing complete." ); } } // This handle may have to be global if you wish to remove the // plug-in from the menu using the h.destroy() method in the // 'momentary_exit' function. // The menu entry is automatically removed when Alias exits. // static AlFunctionHandle h; static AlMomentaryFunction hFunc; extern "C" int PLUGINAPI_DECL int plugin_init( const char *dirName ) // // This routine initializes the plugins and attaches it to the menu. // It returns 0 if there is no initialization error. // { char *dirScm; // Initialize the universe. This must be done by all // plug-ins. If the universe is not initialized the plug-in // will fail. AlUniverse::initialize( ); dirScm = makeAltPath(dirName,"scm"); // Invoke the scheme file which sets defaults for the scheme // variables. AlInvokeSchemeFile( "frame_init.scm", dirScm ); // Allocate a function handle. The first argument is the label on // the menu and the second is the function to invoke when the // menu item is selected. hFunc.create( my_view ); h.create( "View Frame", &hFunc ); // Define the attribute string for the attribute line below // the prompt line. h.setAttributeString( "viewframe" ); // Read in the option box. The first argument is the // option box in $ALIAS_WORKENV, and // the second argument is the name of the option box given // in the scheme file. The third argument is a directory // path(possibly NULL) where to look for the scheme file. // If a call to this method is omitted, there will be no option box. if ( sSuccess != h.setOptionBox( "frame.scm", "frame.options", dirScm) ) { AlPrintf( kPrompt, "Frame plug-in unable to find .scm file for option box" ); return (1); } // Indicate which menu to add the plugin to. addToMenu() // adds the plugin to the bottom of the menu, while // appendToMenu() will add it to the top of the menu. h.addToMenu( "mp_objtools" ); h.setIconPath( makeAltPath( dirName, NULL ) ); // Return a success code. // Returning a non zero indicates an error. // An error value ( a non-zero ) will be printed on the prompt // line in Alias. AlPrintf( kPrompt, "Frame attached to Palette 'Object Edit'"); return 0; } extern "C" PLUGINAPI_DECL int plugin_exit( void ) { // Remove the plugin from the menu and free the FunctionHandle. // Note that h.destroy() implicitly calls h.removeFromMenu() h.deleteObject(); hFunc.deleteObject(); return 0; }