||
基于ENVI5.3+IDL8.5开发了pro程序,可以在c#中调用的方式主要有以下:
1、c#直接运行pro
方法有IDLDrawWidget和COM_IDL_CONNECT两个组件可用,可以参考http://blog.sciencenet.cn/blog-344887-518195.html。
经常会遇到“对COM组件的调用返回了错误HRESULT E_FAIL”等错误。需要注意的问题是
(1)C#工程配置和IDL的32bit和64bit要一致
(2)dll要经过cmd运行regsvr32 *.dll来注册成功
(3),在c#中引用-控件属性要嵌入互动选false
(4)idl代码pro第一句要有 COMPILE_OPT IDL2
(5)ENVI二次开发代码中时不需要ENVI_Batch_Exit(结尾)
(6)pro中调用math_doit、envi_register_doit、fx_doit等函数时,最后需要调用* _record,在主pro之前加上:
pro resize_doit_record, _extra=extra
END
pro ENVI_MASK_DOIT_record, _extra=extra
END
pro ENVI_MASK_APPLY_DOIT_record, _extra=extra
END
pro envi_register_doit_record, _extra=extra
END
2、编译成sav文件来运行
高版本的如果是建立同名工程来生成sav文件(建议采用该方法),需要在工程属性中勾选相应设置,如下图
使用命令行编译和生成,需要注意:
(1)编译的设置
可以参考http://blog.sina.com.cn/s/blog_764b1e9d0102xw9p.html
编译sav文件的操作顺序和命令很重要,一定逐步完成。
第一步:重置IDL进程
可单击IDL工具栏中的"重置"按钮,也可在IDL控制台中输入 .f 然后回车。
第二步:编译pro文件
如果pro文件个数较少时,逐个手动编译即可。
如果文件个数较多,建议以工程方式构建项目,一步即可构建sav文件。
第三步:加载pro调用的函数
在IDL控制台执行如下命令即可:
resolve_all, skip_routines='envi', /continue_on_error |
第四步:构建sav文件
在IDL控制台执行如下命令:
save,filename='D:\temp\test_ENVITask_Args.sav',/routines |
注:filename指定为sav文件输出路径,sav文件名必须与pro主过程同名。
(2)pro文件的编译预设
如果envi二次开发使用了早期版本的函数,在idl和envi同时打开时,编译是没问题的,但按照上述步骤重置idl时,会关闭envi,编译时无法通过。
原因可以参考http://blog.sina.com.cn/s/blog_87a1a0090102ws9p.html
解决方案就是在主pro之前声明一下:
Forward_function ENVI_PROJ_CREATE, ENVI_CREATE_ROI
如此,仅通过idl开发环境就可以编译成功,然后生成sav。
3、C#调用idlrt.exe来运行envi二次开发程序
相当于c#调用一个控制台命令。
首先要制作好双击即可运行的sav文件,也可以制作成exe(envi+idl的exe实际上也是调用sav,终点需要关注ini文件)
可以参考http://blog.sina.com.cn/s/blog_764b1e9d010164ym.html
对于参数传递问题,(1)如果是几个变量,用idlrt命令传递的时候加入-args就可以了,(2)也可以在固定的文件夹放置一个txt,在pro里写好读取命令,sav运行后自动去获取txt中中准备好的传递参数,(3)如果较大的数据,那就以文件的形式,仅用前面两种方法传递文件路径就可以了。
运行sav的idlrt.exe命令参考如下,在cmd中直接运行即可:
"C:\Program Files\Exelis\IDL85\bin\bin.x86_64\idlrt.exe" "C:\Users\mimi\IDLWorkspace\geoangle\GEOANGLE.SAV" -args "C:\Users\mimi\Desktop\*.MOD021KM.hdf"
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-27 09:05
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社