美文网首页Geomatics(GIS,GPS,RS,Surveying)
ArcObjects|如何弹出GP工具的执行界面?

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

作者: 12ebfd5642fe | 来源:发表于2016-06-01 11:16 被阅读489次

    推荐代码

    由于要吐槽的太多,先贴代码,免得找不到重点。有两段代码都能实现这个功能,共同点是这必须是个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工具的执行界面?

        本文链接:https://www.haomeiwen.com/subject/mvacdttx.html