`
zhangziyangup
  • 浏览: 1078783 次
文章分类
社区版块
存档分类
最新评论

ArcGIS 下的GP function Tool开发

 
阅读更多

Visual C++ 开发Geoprocessing 工具

GP工具开发步骤

继承IGPFunctionFactory和IGPFunction接口
2.实现上述接口中的方法
3.定义UI参数
4.处理UI参数(验证期处理和执行期调用)
5.如何调用GP工具
GP工具涉及的主要接口
IGPFunctionFactory
IGPFunction
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><font size="3"> </font> <div><font size="3"> 1.GP工具的模式</font></div> <div><font size="3"> 对象创建型模式(工厂模式)</font></div> <div style="TEXT-INDENT: 21pt"><font size="3">只要实现IGPFunctionFactory接口,便可以在ArcGIS软件启动时,ArcToolBox加载自 定义的GP工具。</font></div> <div style="TEXT-INDENT: 21pt"><font size="3">自定义的GP工具需要实现IGPFunction接口。一旦实现该接口,ArcToolBox根据名字列出每个自定义GP工具。</font></div> <div style="TEXT-INDENT: 21pt"><font size="3"></font></div> <div style="TEXT-INDENT: 21pt"></div> <div style="TEXT-INDENT: 21pt" align="left"><font size="3">2.GP工具开发中需要自己实现的方法</font></div> <div style="TEXT-INDENT: 21pt"><font size="3">IGPFunctionFactory主要的三个方法</font></div> <div style="TEXT-INDENT: 21pt"><font size="3"></font></div> <div style="TEXT-INDENT: 21pt"><font size="3">GetFunction(BSTR Name, IGPFunction * * Function)</font></div> <div style="TEXT-INDENT: 21pt"><font size="3">// Returns the geoprocessing function object with the given name</font></div> <div style="TEXT-INDENT: 21pt"><font size="3"></font></div> <div style="TEXT-INDENT: 21pt"> <font size="3">GetFunctionName(BSTR Name, IGPName * * functionname)</font><font size="3"> </font> </div> <div style="TEXT-INDENT: 21pt"> <div><font size="3">//Returns the geoprocessing function name object with the given name.</font></div> <div><font size="3"></font></div> <div><font size="3">GetFunctionNames (IEnumGPName * * functionnames)</font></div> <div><font size="3">// Returns an enumeration of function name objects of all the geoprocessing functionsmanaged by this function factory</font></div> <div><font size="3"></font></div> <div><font size="3">IGPFunction的主要方法</font></div> <div><font size="3">get_Name(BSTR * Name)</font></div> <div><font size="3">get_ParameterInfo(IArray * * params)</font></div> <div><font size="3">get_FullName(IName * * Name)</font></div> <div><font size="3">IsLicensed(VARIANT_BOOL * IsLicensed)</font></div> <div><font size="3">Validate(IArray * paramvalues, VARIANT_BOOL updateValues, IGPEnvironmentManager * envMgr, IGPMessages * * message)</font></div> <div><font size="3">Execute(IArray * paramvalues, ITrackCancel * trackcancel, IGPEnvironmentManager * envMgr, IGPMessages * message)</font></div> <div><font size="3"></font></div> <div><font size="3"></font></div> <div> <font size="3"> </font> <div><font size="3">3.关键的操作(主要涉及GPFunction中的方法)</font></div> <div><font size="3">(1)UI参数定义-----------get_ParameterInfo(IArray * * params)</font></div> <div><font size="3"></font></div> <div> <font size="3"> </font> <div><font size="3">Params是保存每一项自定义的UI参数的动态数组</font></div> <div><font size="3"></font></div> <div> <font size="3"> </font> <div><font size="3">图中m_ipParameters变量为IArrayPtr类型,直接传递给Params参数</font></div> <div><font size="3"></font></div> <div><span><font size="3"> STDMETHOD(get_ParameterInfo)(IArray * * params)</font></span></div> <div><span><font size="3"> {</font></span></div> <div><span><font size="3"> if (params == NULL)</font></span></div> <div><span><font size="3"> return E_POINTER;</font></span></div> <div><span><font size="3"> IArrayPtr ipArray=m_ipParameters;</font></span></div> <div><span><font size="3"> *params=ipArray.Detach(); </font></span></div> <div><span><font size="3"> return S_OK;</font></span></div> <div><span><font size="3"> }</font></span></div> <div style="TEXT-INDENT: 21pt"><font size="3">这个方法的作用是根据用户设置的各类参数来设置GP Function Tool 的UI。</font></div> <div style="TEXT-INDENT: 21pt"><font size="3">如何交互的细节已经被隐藏。用户只需要设定参数类型,自动的得到参数对应的UI。</font></div> <div><font size="3"></font></div> <div><font size="3">可直接定义的参数类型如下(具体查看ao帮助IGPDataType Interface)</font></div> <div><font size="3"></font></div> <div> <font size="3"> </font> <div><font size="3">定义一个double参数</font></div> <div align="left"><font size="3">//变量Version------参数类型double</font></div> <div align="left"> <font size="3"> </font> <div align="left"><font size="3">ipGPParameterEdit.CreateInstance(CLSID_GPParameter);</font></div> <div align="left"><font size="3">ipGPDataType.CreateInstance(<span style="COLOR: red">CLSID_GPDoubleType);//</span>参数类型<span> </span></font></div> <div align="left"><font size="3">ipGPParameterEdit-&gt;putref_DataType(ipGPDataType);</font></div> <div align="left"><font size="3">ipGPParameterEdit-&gt;put_Direction(esriGPParameterDirectionInput);//定义为输入或输出</font></div> <div align="left"><font size="3">ipGPParameterEdit-&gt;put_DisplayName(CComBSTR("Input Version of VCT ")); </font></div> <div align="left"><font size="3">ipGPParameterEdit-&gt;put_Name(CComBSTR("Input Version (Just support 2.0)"));//参数名称</font></div> <div align="left"><font size="3">ipGPParameterEdit-&gt;put_ParameterType(esriGPParameterTypeRequired); //必须输入参数</font></div> <div align="left"><font size="3">m_ipParameters-&gt;Add(ipGPParameterEdit);</font></div> <div align="left"><font size="3"></font></div> <div align="left"> <font size="3"> </font> <div><font size="3">(2)参数验证--------- Validate()方法</font></div> <div><font size="3">自定义类型参数后,通过Validate方法来提示输入的参数信息是否正确。</font></div> <div style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt"><font size="3"><span> 1.<span style="FONT: 7pt 'Times New Roman'"> </span></span>增强客户体验</font></div> <div style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt"><font size="3"><span> 2.<span style="FONT: 7pt 'Times New Roman'"> </span></span>执行较简单的数据校验</font></div> <div style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt"><font size="3"><span> 3.<span style="FONT: 7pt 'Times New Roman'"> </span></span>反馈一系列的校验信息</font></div> <div><font size="3"></font></div> <div><font size="3">如何进行参数验证</font></div> <div><font size="3">可以使用IGPUtilities的InternalValidate方法</font></div> <div><font size="3">m_ipGPUtilities-&gt;InternalValidate (m_ipParameters,paramvalues,updateValues,TRUE,envMgr,&amp;ipGPMessages);</font></div> <div><font size="3"></font></div> <div><font size="3"></font></div> <div> <font size="3"> </font> <div><font size="3">(3)执行---------------Execute()方法</font></div> <div><font size="3">最重要的方法之一, </font></div> <div><font size="3">1.根据用户输入得到参数对象,包括Featureclass,Table等</font></div> <div><font size="3">2.结合获取参数类型做普通的AO开发</font></div> <div><font size="3">3.错误信息的友好提示</font></div> <div><font size="3"></font></div> <div> <font size="3"> </font> <div><font size="3">If(ipFeatureClass==NULL)</font></div> <div><span><font size="3"> {</font></span></div> <div><span><font size="3"> </font></span></div> <div><font size="3">ipMsg.CreateInstance(CLSID_GPMessage);</font></div> <div><font size="3">ipMsg-&gt;put_Type(esriGPMessageTypeError);<span> </span></font></div> <div><font size="3">ipMsg-&gt;put_Description(CComBSTR("Error in Open Featureclass!"));<span> </span></font></div> <div><font size="3">message-&gt;Add(ipMsg);<span> </span></font></div> <div><font size="3">return E_FAIL;</font></div> <div><span><font size="3"> }</font></span></div> <div><span><font size="3"> </font></span></div> <div><font size="3">else</font></div> <div><span><font size="3"> {</font></span></div> <div><span><font size="3"> ipMsg.CreateInstance(CLSID_GPMessage);</font></span></div> <div><span><font size="3"> ipMsg-&gt;put_Type(esriGPMessageTypeInformative);</font></span></div> <div><span><font size="3"> ipMsg-&gt;put_Description(CComBSTR("/n----succeed to Open FeatureClass !---"));</font></span></div> <div><span><font size="3"> message-&gt;Add(ipMsg);</font></span></div> <div><font size="3">Return S_OK;</font></div> <div><span><font size="3"> }</font></span></div> <div><span><font size="3"></font></span></div> <div><span><font size="3"> </font> <div><font size="3">部署</font></div> <div><font size="3">直接注册DLL。</font></div> <div><font size="3">在ArcToolBox中添加工具到自定义的ArcToolBox目录中。</font></div> <div><font size="3"></font></div> <div> <font size="3"> </font> <div><font size="3">总结</font></div> <div><font size="3">1.GP工具适用于常用的数据处理工作</font></div> <div><font size="3">2.可以实现多个GP工具构建MoudleBuilder完成较复杂的业务流程。</font></div> <div><font size="3"></font></div> </div> </span></div> </div> <div><font size="3"></font></div> </div> </div> </div> </div> </div> </div> </div> </div> <stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 297pt; HEIGHT: 117.75pt" type="#_x0000_t75"><imagedata cropright="1928f" cropbottom="4376f" croptop="3881f" o:title="" src="file:///C:/DOCUME~1/esri/LOCALS~1/Temp/msohtml1/01/clip_image001.emz"></imagedata></shape>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics