我亲爱的宝贝呀:ENVI下用菜单调用IDL程序的方法
IDL程序可以手动添加菜单或自动为ENVI添加菜单,自动方式详细可见文章http://hi.baidu.com/dyqwrp/blog/item/5b6c6ac45edbf6a18326ac7a.html。如果是独立运行的IDL的pro文件或sav文件则添加到envi的菜单中则需要一点技巧。
如果是IDL的pro文件,如果直接调用的话,只需在pro主程序定义后面添加", **",其中**可以是任意字符(初步测试^_^)。
如果是IDL的sav文件,放在envi安装路径的"\save_add"目录下,调用时需要新建一个pro进行调用转换,因IDL的pro主程序一般不写", **"的,那样调用会出错。
有一点需要注意:如用相对路径,例用cd,current = root,此时获得是IDL安装路径下的"\lib\hook"路径,那么sav文件就必须要放在"\lib\hook"下而不能放在envi安装路径的"\save_add"目录下了。
测试代码如下:
;sav文件可自己写,或可下载,http://www.rayfile.com/files/9146338c-4a64-11de-b154-0019d11a795f/
;自动创建ENVI菜单
PRO Envi_use_idl_define_buttons, buttonInfo
compile_opt idl2
; 创建主菜单-在Basic Tools菜单前后
ENVI_DEFINE_MENU_BUTTON, buttonInfo, VALUE = '外部IDL程序', $
/MENU, REF_VALUE = 'Help', /SIBLING, POSITION = 'after'
;创建子菜单
ENVI_DEFINE_MENU_BUTTON, buttonInfo, VALUE = '调用IDL-Pro', $
uValue = '', $
event_pro ='Envi_use_idl', $
REF_VALUE = '外部IDL程序'
ENVI_DEFINE_MENU_BUTTON, buttonInfo, VALUE = '调用IDL-Sav', $
uValue = '', $
event_pro ='Envi_use_idl_sav', $
REF_VALUE = '外部IDL程序'
END
;
;
PRO Envi_use_idl_sav,abc ;abc可任意修改
; 第一种方式-直接调用,sav必须放在save_add目录下
Test_widget_slider
;第二种方式-定义路径调用,此时返回的路径是IDL的lib\hook目录
CD,current = root
savFile = root+'\test_widget_slider.sav'
IF FILE_TEST(savfile) EQ 0 THEN BEGIN
tmp = DIALOG_MESSAGE(savfile+'文件不存在',/error)
RETURN;
ENDIF
RESTORE,savfile
;
Test_widget_slider
END
PRO Envi_use_idl_event, ev
HELP,ev
END
;
PRO Envi_use_idl,event
;
;
tlb1 = WIDGET_BASE(title='对象图形法', $
xOffset = 200)
;object draw
wDraw1 = WIDGET_DRAW(tlb1, $
xSize =200,ySize =200, $
graphics_level = 2,$
/wheel_events, $
retain = 2, $
/Expose_events )
WIDGET_CONTROL,tlb1,/realize
geo = WIDGET_INFO(wDraw1,/geom)
;
WIDGET_CONTROL, wDraw1,get_value = odraw
HELP,odraw
;
Xmanager, 'envi_use_idl',tlb1,/no_Block
;
END