ArcObjects|如何弹出GP工具的执行界面?

推荐代码

由于要吐槽的太多,先贴代码,免得找不到重点。有两段代码都能实现这个功能,共同点是这必须是个Desktop插件或使用Desktop许可的程序,因为GPToolCommandHelperClass位于GeoprocessingUI模块中:

  1. 如果是自定义的工具箱,或者是独立应用程序(不是在Desktop的扩展插件),须用第一段:
IGPToolCommandHelper gpCommandHelper = new GPToolCommandHelperClass(); 
gpCommandHelper.SetToolByName(@"C:\Program Files (x86)\ArcGIS\Desktop10.3\ArcToolbox\Toolboxes\Data Management Tools.tbx","Append");
//或者用gpCommandHelper.SetTool(IGPTool);
IGPToolCommandHelper2 gpCommandHelper2 = gpCommandHelper as IGPToolCommandHelper2;
bool pOk;
IGPMessages pGPMessage;
gpCommandHelper2.InvokeModal(0, null, out pOk, out pGPMessage);
  1. 如果执行时需要设置环境变量,则须用下面这段:
//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. ArcToolboxClass对象貌似是可以直接new的(可实例化类),但new出来的根本就不能用。这个对象只能从IArcToolboxExtension中获得,而IArcToolboxExtension只能从IApplication获得,因此独立的应用程序只能用GPToolCommandHelperClass对象。
  3. 上面的方法都有一个参数,IArray,可以控制弹出界面中的参数值。但是,根本就不起作用!!
    但是,new一个新的Array是不行的,需要从IGPTool.ParameterInfo获得。
  4. 上面的方法还需要另一个参数,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函数几乎就是这几句的快捷方式。

  1. 说到快捷方式,还有一个IGPToolboxFactory接口,只有俩函数,打开和创建IGPToolbox,完全就是IToolboxWorkspace的部分快捷方式,这是个高频的功能么,需要这么多快捷方式?
  2. IGPToolCommandHelper2.InvokeModal函数没有substituteEnvironments参数,弹出的界面中环境变量是空的,因此独立应用程序用不了GP的环境变量。而IArcToolbox.InvokeTool和IArcToolbox2.InvokeModalTool是有这个参数的,可以设置环境变量。
  3. IArcToolbox2.InvokeModalTool貌似比IArcToolbox.InvokeTool多了out IGPMessages参数,应该可以返回执行时的消息,但测试一下返回值却总是null。同样,IGPToolCommandHelper2.InvokeModal多出来的out IGPMessages参数也是这个鬼样子。后来经指点,new一个完全不相干的Geoprocessor对象,在IArcToolbox或IGPToolCommandHelper2这边执行完成后,可以在Geoprocessor那边获得GPMessages。好奇葩的想法,完全不管别人的智商。

综上所述,做插件时如果贪图省事用GP的界面,还是可以控制默认参数和环境变量的。但如果开发自己的应用,还想设置环境变量,甚至还想用Engine许可,这属于既想oo,又想xx,还想yy,趁早洗洗睡吧!

你可能感兴趣的:(ArcObjects|如何弹出GP工具的执行界面?)