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

0
分享 2016-06-06
推荐代码
由于要吐槽的太多,先贴代码,免得找不到重点。有两段代码都能实现这个功能:
 
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

    1 个评论

    自己写的GP如何后台执行,利用64位后台gp

    要回复文章请先登录注册