推荐代码
由于要吐槽的太多,先贴代码,免得找不到重点。有两段代码都能实现这个功能:
1.如果是自己的工具箱,或者是独立应用程序(不是在Desktop上扩展的,但必须用Desktop许可,因为GPToolCommandHelperClass位于GeoprocessingUI模块中),须用前面这段
IGPToolCommandHelper gpCommandHelper = new GPToolCommandHelperClass();
gpCommandHelper.SetToolByName(@"C:\Program Files (x86)\ArcGIS\Desktop10.3\ArcToolbox\Toolboxes\Data Management Tools.tbx","Append");
IGPToolCommandHelper2 gpCommandHelper2 = gpCommandHelper as IGPToolCommandHelper2;
bool pOk;
IGPMessages pGPMessage;
gpCommandHelper2.InvokeModal(0, null, out pOk, out pGPMessage);
2.如果需要设置环境变量,则须用后面这段:
//pApplication是IApplication对象,是Desktop扩展的必要对象
UID uID = new UIDClass();
uID.Value = "esriGeoprocessingUI.ArcToolboxExtension";
IArcToolboxExtension arcToolboxExtension = pApplication.FindExtensionByCLSID(uID) as IArcToolboxExtension;
IArcToolbox arcToolbox = arcToolboxExtension.ArcToolbox;
IGPTool gpTool = arcToolbox.GetToolbyNameString("Append_management");
arcToolbox.InvokeTool(0, gpTool, null, true);
开始吐槽
1. 实现这个功能的对象有两个:ArcToolboxClass或GPToolCommandHelperClass;接口就多了些,有四个:IArcToolbox,IArcToolbox2,IGPToolCommandHelper,IGPToolCommandHelper2;相关的函数就更乱了:Invoke, InvokeModal, InvokeTool, InvokeModalTool,而它们的区别仅在于是否支持环境变量和返回Message,看到这一坨我猜那个开发已经凌乱了。
2. 上面的方法都有一个参数,IArray,可以用代码控制弹出界面中的参数值,这个参数必须要用IGPTool.ParameterInfo,不能new一个新的数组。
3. 上面的方法还都需要另一个参数,IGPTool,就是你想执行的那个工具。打开一个IGPTool的方法大致有两种:IArcToolbox.GetToolbyNameString和IGPToolbox.OpenTool,这俩用的参数居然还不一样,例如Append工具,前者用“Append_management”,后者用“Append”。前者在上面第二段代码中用到了,后者的示例如下(这结构看着眼熟吧):
IWorkspaceFactory pWsf = new ToolboxWorkspaceFactoryClass();
IToolboxWorkspace pToolWs = pWsf.OpenFromFile(@"C:\Program Files (x86)\ArcGIS\Desktop10.3\ArcToolbox\Toolboxes", 0) as IToolboxWorkspace;
IGPToolbox pGPtoolbox = pToolWs.OpenToolbox("Data Management Tools.tbx");
IGPTool pGPtool = pGPtoolbox.OpenTool("Append");
上面第一段代码中,那个IGPToolCommandHelper.SetToolByName函数几乎就是这几句的快捷方式。
4. 说到快捷方式,还有一个IGPToolboxFactory接口,只有俩函数,打开和创建IGPToolbox,完全就是IToolboxWorkspace的部分快捷方式,这是个多高频的功能啊,真的需要这么多快捷方式么?
5. ArcToolboxClass对象貌似是可以直接new的(可实例化类),但new出来的根本就不能用。这个对象只能从IArcToolboxExtension中获得,因此独立的应用程序只能用GPToolCommandHelperClass对象。
6. IGPToolCommandHelper2.InvokeModal函数没有substituteEnvironments参数,弹出的界面中环境变量是空的,因此独立应用程序用不了GP的环境变量。
7. IArcToolbox2.InvokeModalTool貌似比IArcToolbox.InvokeTool多了out IGPMessages参数,但使用时返回值却总是null,不知是干啥的。同样,IGPToolCommandHelper2.InvokeModal多出来的out IGPMessages参数也是这个鬼样子。
综上所述,如果既想oo,又想xx,还想yy,趁早洗洗睡吧(睡醒自己开发)!
文章来源:http://www.jianshu.com/p/bd2a2270e71c