首页 > 其他分享 >ArcObjects SDK开发 021 开发框架搭建-FrameWork包设计

ArcObjects SDK开发 021 开发框架搭建-FrameWork包设计

时间:2022-12-23 10:55:35浏览次数:47  
标签:... ProcessInfo SetProcess ArcObjects FrameWork pProcessInfo 021 ._ new

1、框架引擎部分

引擎模块其实就是之前我们说的App-Command-Tool模块,通过这个模块,把系统的主干框架搭建起来。

image1.png

其中大部分出现在菜单以及工具条上的按钮都会继承这个框架定义ICommand和ITool。整个系统也是通过整合一些列Comand和Tool的方式,把整个系统搭建出来,这点也可以通过我们系统的主窗体代码中看到。

image2.png

2、常用Command和Tool

一些常用的工具,例如地图放大、缩小、平移等。这些工具要求定义能够被框架引擎识别,并且符合当前使用的UI风格。定义如下。

image3.png

使用的时候,只需要一行代码即可。

this.UI_Tool_Bar.Items.Add(new BarCheckItemCommandUI(new FrameworkUI.MapTools.MapZoomInTool(this._MapApplication)));
this.UI_Tool_Bar.Items.Add(new BarCheckItemCommandUI(new FrameworkUI.MapTools.MapZoomOutTool(this._MapApplication)));
FrameworkUI.MapTools.MapPanTool myMapPanTool = new FrameworkUI.MapTools.MapPanTool(this._MapApplication);
this.UI_Tool_Bar.Items.Add(new BarCheckItemCommandUI(myMapPanTool));
this._MapApplication.MapPanTool = myMapPanTool;
this._MapApplication.CrruteTool = myMapPanTool;
this.UI_Tool_Bar.Items.Add(new BarButtonItemCommandUI(new FrameworkUI.MapTools.MapFullExtentCommand(this._MapApplication)));
this.UI_Tool_Bar.Items.Add(new BarButtonItemCommandUI(new FrameworkUI.MapTools.MapZoomInFixedCommand(this._MapApplication)));
this.UI_Tool_Bar.Items.Add(new BarButtonItemCommandUI(new FrameworkUI.MapTools.MapZoomOutFixedCommand(this._MapApplication)));
this.UI_Tool_Bar.Items.Add(new BarButtonItemCommandUI(new FrameworkUI.MapTools.MapZoomBackCommand(this._MapApplication)));
this.UI_Tool_Bar.Items.Add(new BarButtonItemCommandUI(new FrameworkUI.MapTools.MapZoomForwardCommand(this._MapApplication)));

3、通用模块部分

通用模块设计主要包括一些比较通用且核心的模块定义。目前我开发的GeoChem系统定义了三个模块。进度信息模块,Geoprocessor扩展模块和多语言支持模块。

image4.png

能在Core里面出现的模块,要满足通用性以及核心性两点。我们以最简单的ProcessInfo为例,来说明这样的模块的特性。

image5.png

配合这个ProcessInfo的是FrameworkUI里面定义的ProcessInfoDialog对话框,定义如下。

image6.png

设计一,在ProcessInfoDialogHelper使用了一个新线程弹出进度对话框,在主线程进行运算的时候,进度条可以很顺畅的响应进度变化不会卡。

设计二,ProcessInfo定义了SubProcessInfo的概念,可以很好的和子函数衔接。例如一个模型计算,有5个步骤,A(10)、B(30)、C(60)、D(90)、E(100)。其中两个步骤比较复杂,其中B包含3个步骤,B1(20)、B2(80)、B3(100)。D包含了5个步骤,分别是和D1(20)、D2(40)、D3(60)、D4(80)、D5(100)。如何把B和D的计算进度反馈更方便的反馈给计算模型呢?

版本1,不关注B和D的细节了,进度到了A之后,进度条不在动了,只是更新上面的计算信息,等B计算完,一下跳到B该有的进度。D同理。

版本2,加入B是一个专门为本模型定义的一个函数,那么可以把ProcessInfo传入进去,直接设置B1的计算完值为14%,B2计算完之后,设置为26%,B3计算完设置为30%。假如D是一个通用的函数,除了该模块调用,其他模块也会调用,那么可以传ProcessInfo进入,然后再传起始进度值和结束进度值进度。例如调用D,传入ProcessInfo和60、90。计算完D1,设置进度之为60+(90-60)*20%,依次类推。

版本3,设计了SubProcess的概念。当模型调用B的时候,会调用主ProcessInfo,创建一个子ProcessInfo,并设置这个子ProcessInfo应该进度到何值。当子ProcessInfo进度值发生变化的时候,反馈给其父ProcessInfo,由父ProcessInfo计算自己应该前进多少进度。二接收子ProcessInfo的函数,还是设置进度从0-100即可。

调用代码如下。

public void Exe(ProcessInfo pProcessInfo)
{
    //获取栅格CellSize
    pProcessInfo.SetProcess(5, "Get cell size...");
    double myCellSize = GetRasterCellSize();

    //提取栅格数据的范围
    pProcessInfo.SetProcess(10, "Data Extent...");
    string myRasterDomainFile = this.GetRasterDomain();

    //平滑数据
    pProcessInfo.SetProcess(12, "Smooth Data...");
    string myRasterFilePath = this.SmoothData(this.RasterFilePath);

    //生成等值线
    pProcessInfo.SetProcess(20, "ContourList...");
    string myContourLineFile = this.CreateContourLine(myRasterFilePath);

    //调整等值线值的数据精度
    pProcessInfo.SetProcess(25, "Calculate CONTOUR field...");
    this.AdjustAccuracy(myContourLineFile);

    //平滑等值线
    pProcessInfo.SetProcess(30, "SmoothLine...");
    myContourLineFile = this.SmoothContourLine(myContourLineFile, myCellSize);

    //用栅格数据的范围裁切等值线
    pProcessInfo.SetProcess(35, "Clip Contour Line...");
    myContourLineFile = this.ClipContourLineByRasterDomain(myContourLineFile, myRasterDomainFile);

    //根据等值线,生成等值面
    pProcessInfo.SetProcess(40, "Create Contour Polygon");
    pProcessInfo.StartSubProcess(70);
    string myContourPolygonFile = this.GetContourPolygonFile(pProcessInfo.SubProcessInfo, myContourLineFile, myRasterDomainFile);
    pProcessInfo.EndSubProcess();

    //得到切割时使用的 Shape文件
    pProcessInfo.SetProcess(75, "Clip data...");
    this.ClipContourLineAndPolygon(myRasterDomainFile, ref myContourLineFile, ref myContourPolygonFile);

    //删除面积较为小的面
    pProcessInfo.SetProcess(88, "Eliminate Small Area...");
    this.ContourEliminate(ref myContourLineFile, ref myContourPolygonFile);

    //计算极值标注
    pProcessInfo.SetProcess(90, "Create Limite Value Point...");
    this.UpdateThresholdLabel(myContourPolygonFile);

    pProcessInfo.SetProcess(95, "Save Map Document...");
    this.SaveAsMxdFile(myContourLineFile, myContourPolygonFile);
    pProcessInfo.SetProcess(100, "Complete!");
}

使用子进度对象的函数定义如下。

private string GetContourPolygonFile(ProcessInfo pProcessInfo, string pContourLineFile, string pRasterDomainFile)
{
    var myContourPolygonCal = new ContourPCreator
    {
        ContourLineFilePath = pContourLineFile,
        ExtentFilePath = pRasterDomainFile,
        ResultPolygonFilePath = FilePathHelper.GetTempShapeFilePath()
    };
    myContourPolygonCal.Exe(pProcessInfo);
    return myContourPolygonCal.ResultPolygonFilePath;
}
ContourPCreator类的Exe函数定义如下。
public void Exe(ProcessInfo pProcessInfo)
{
    this._PolygonList.Clear();
    this._PolylineList.Clear();

    //把线转换成面
    pProcessInfo.SetProcess(0, "Feature To Polygon...");
    var myPolygonFilePath = FilePathHelper.GetTempShapeFilePath();
    var myFeatureToPolygon = new FeatureToPolygon()
    {
        in_features = this.ContourLineFilePath + ";" + this.ExtentFilePath,
        out_feature_class = myPolygonFilePath,
        cluster_tolerance = "0.001 Meters"
    };
    GPEx myGPEx = new GPEx();
    myGPEx.Execute(myFeatureToPolygon);

    //用栅格范围裁切面
    string myClipOutFilePath = FilePathHelper.GetTempShapeFilePath();
    pProcessInfo.SetProcess(10, "Clip...");
    var myClip = new ESRI.ArcGIS.AnalysisTools.Clip()
    {
        in_features = myPolygonFilePath,
        clip_features = this.ExtentFilePath,
        out_feature_class = myClipOutFilePath
    };
    myGPEx.Execute(myClip);

    //添加字段
    pProcessInfo.SetProcess(20, "Add Field...");
    var myAddField = new AddField
    {
        in_table = myClipOutFilePath,
        field_name = "Value",
        field_type = "DOUBLE"
    };
    myGPEx.ExecuteByGP(myAddField);

    //拷贝结果数据
    ShapeFileHelper.Copy(myClipOutFilePath, this.ResultPolygonFilePath);

    //读取面信息
    pProcessInfo.SetProcess(30, "Init ContourPolygon ...");
    this.LoadContourPolygonList();

    //分析面与面之间的临近关系
    pProcessInfo.SetProcess(40, "Polygon Neighbors ...");
    this.LoadContourPolygonRels();

    //读取等值线的值列表
    pProcessInfo.SetProcess(50, "Read Line Value ...");
    this.LoadContourPolylineList();

    //面与线 临近分析
    pProcessInfo.SetProcess(60, "Load Contour Polygon Line Rels ...");
    this.LoadContourPolygonLineRels();

    //计算等值面值,在此循环,主要是为了避免特殊情况,导致死循环
    pProcessInfo.SetProcess(70, "Cal Contour Polygon Value...");
    for (int i = 0; i < 100; i++)
    {
        int myUnCalCount = this.CalContourPolygonValue();
        if (myUnCalCount == 0)
        {
            break;
        }
    }

    //把计算的值写入该文件中
    pProcessInfo.SetProcess(90, "Write Value To Contour Polygon File...");
    this.WritePolygonValueToFeatureClass();

    //计算完成
    pProcessInfo.SetProcess(100, "Contour Polygon Cal Complete...");
}

因为ProcessInfo是非常核心一个类,使用范围非常广泛,如果把这个定义好了,会让系统非常清晰。这样的话,每个需要暴露进度的函数,值需要定义一个ProcessInfo参数传入进来即可,在函数内部进度从0开始,100结束,其他的都不需要关心了。

4、常用函数库

常用函数库,我一般会定义到Framework程序集的Helper目录下。如果是字段相关的会定义成FieldHelper,空间参考相关的会定义成SpatialReferenceHepler。并且里面大部分都是静态函数,方便直接调用。

image7.png

在这些里面用的最多的就是FolderPathHelper、ShapeFileHelper、SpatialReferenceHepler以及FeatureClassHelper等。

标签:...,ProcessInfo,SetProcess,ArcObjects,FrameWork,pProcessInfo,021,._,new
From: https://www.cnblogs.com/mytudousi/p/17000161.html

相关文章

  • 2021年10月自考总结
    18日自考成绩出来,查到成绩之后还是有些激动的,这次学习了三科:C++、信息系统开发与管理和数据结构导论。很遗憾的是信息系统开发与管理没有通过,在考试之前觉得这个科目应该会......
  • [省选联考 2021 B 卷] 数对 题解
    题目描述给定\(n\)个正整数\(a_i\),请你求出有多少个数对\((i,j)\)满足\(1\lei\len\),\(1\lej\len\),\(i\nej\)且\(a_i\)是\(a_j\)的倍数。提示对于......
  • ArcObjects SDK开发 019 SpatialReference
    1、SpatialReference的结构ArcObjectsSDK帮助中Esri.ArcGIS.Geometry命名空间帮助中的ObjectModelDiagram共两页,第一页就是Geometry的结构,第二页就是SpatialReference......
  • Media Encoder 2021 for Mac(ame 2021永久版) v15.4.1中文版
    MediaEncoder2021中文版是一款优秀的视频音频编码器,能够将多种设备格式的音频或视频进行导出,提供了丰富的硬件设备编码格式设置以及专业设计的预设设置,方便用户导出与特定......
  • 论文解读:A Hierarchical Framework for Relation Extraction with Reinforcement Lear
    论文解读:AHierarchicalFrameworkforRelationExtractionwithReinforcementLearning  关系抽取是一项比较基础的自然语言处理任务,而联合实体和关系抽取则是一种端到......
  • ArcObjects SDK开发 018 Geometry
    1、Geometry体系结构如果要看完整的Geometry体系结构,那么可以去查看帮助中的类结构图,非常完整和严谨。可以通过下图方式打开。点击打开后,会发现里面的结构非常复杂。但......
  • robotframework自动化测试用例标准
    1、每条自动化用例是否完整和正确的覆盖了ManualCases里的验证点2、是否做了错误处理3、是否做了数据初始化和其他前置条件判断(比方说outofstock的功能用例,是否做了清......
  • 中国轿车销量排行榜变化 - 2015 ~ 2021
    中国轿车销量排行榜变化-2015~202120152015年3月中国​​轿车销量排行榜​​​1-100名数据来源:http://www.515fa.com排名车型所属厂商所属品牌......
  • org.springframework.util.Assert
    使用assert的好处就是比较简介,不用加trycatch就可以附加一些预期的提示信息,方便定位问题importorg.springframework.util.Assert;publicclassDemo{publicstaticv......
  • Error creating bean with name 'org.springframework.validation.beanvalidation.Loc
    Errorcreatingbeanwithname‘org.springframework.validation.beanvalidation.LocalValidatorFactoryBean#0’Causedby:javax.validation.ValidationException:Unab......