1、框架引擎部分

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

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

2、常用Command和Tool

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

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

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扩展模块和多语言支持模块。

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

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

设计一,在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。并且里面大部分都是静态函数,方便直接调用。

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

ArcObjects SDK开发 021 开发框架搭建-FrameWork包设计的更多相关文章

  1. TortoiseSVN安装以及淘宝 TAE SDK 开发环境的搭建

    一.TortoiseSVN 的下载和安装 1.进入TortoiseSVN 官网下载地址http://tortoisesvn.net/downloads.html,根据自己的操作系统位数下载相应最新版本 ...

  2. esp8266 SDK开发之环境搭建

    最近在弄这个WiFi模块,发现网上SDK开发方面的资料很少,发现了一套视频教程,不过主讲人的讲课方式实在受不了.对基于SDK开发感兴趣的同学可以通过本帖在Ubuntu系统上通过Eclipes搭建开发环 ...

  3. SDK 开发 .a .framework .bundle (xcode引用) 依赖sdk工程

    一. 静态库.a 1.创建静态库工程 Cocoa Touch Static Libray  ,然后可以创建一个测试视图 TestView 2.暴露头文件 -> Build Phases--> ...

  4. Spring MVC 学习笔记12 —— SpringMVC+Hibernate开发(1)依赖包搭建

    Spring MVC 学习笔记12 -- SpringMVC+Hibernate开发(1)依赖包搭建 用Hibernate帮助建立SpringMVC与数据库之间的联系,通过配置DAO层,Service ...

  5. 基于Homestead搭建PHP项目开发环境(适合Zend Framework,Laravel,Yii,thinkphp等)

    参考: https://framework.zend.com/bl...参考: https://laravel.com/docs/5.5/... 第一步:软件的下载和安装 软件1:VirtualBox ...

  6. C# 快速开发框架搭建—开发工具介绍

    C# 快速开发框架搭建—开发工具介绍 一.VS2013,SQL SERVER R22008 以上两种工具如有不会者自行百度学习下. 二.动软代码生成器 对于经典的三层架构框架来说,使用动软代码生成器会 ...

  7. Linux学习心得之 Linux下命令行Android开发环境的搭建

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Linux学习心得之 Linux下命令行Android开发环境的搭建 1. 前言2. Jav ...

  8. Java开发环境的搭建以及使用eclipse从头一步步创建java项目

    一.java 开发环境的搭建 这里主要说的是在windows 环境下怎么配置环境. 1.首先安装JDK java的sdk简称JDK ,去其官方网站下载最近的JDK即可..http://www.orac ...

  9. Linux环境下Android开发环境的搭建

    本文主要介绍在Ubuntu下Android开发环境的搭建,所使用的IDE为Eclipse(Android Studio同理,且可省去配置SDK以及安装adt插件的步骤). 1.安装JDK (1)JDK ...

  10. Cordova开发环境的搭建

    Cordova开发环境的搭建 原文地址:http://imziv.com/blog/article/read.htm?id=66 Cordova为目前做混合式开发中比较受欢迎的一个解决方案了,并且拥有 ...

随机推荐

  1. 一文搞定 Spring事务

    Spring 事务 上文 使用SpringJDBC 1.JDBC事务控制 ​ 不管你现在使用的是那一种ORM开发框架,只要你的核心是JDBC,那么所有的事务处理都是围绕着JDBC开展的,而JDBC之中 ...

  2. 分享一个Vue实现图片水平瀑布流的插件

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.需求来源 今天碰到了一个需求,需要在页面里,用水平瀑布流的方式,将一些图片进行加载,这让我突然想起我很久以前写的一篇文章<JS两 ...

  3. Linux+Wine玩GTA5指南

    如果你的系统没有Wine先装Wine和winetricks,Wine在各大发行版的源都能找到.记住32位和64位的Wine都要装 安装wget后,输入指令 sudo -s cd /opt mkdir ...

  4. 用 VS Code 搞Qt6:使用 PySide 6

    一般来说,用C++写 Qt 应用才是正宗的,不过,为了让小学生也能体验 Qt 的开发过程,或者官方为了增加开发者人数,推出了可用 Python 来编程的 Qt 版本.此版本命名比较奇葩,叫 PySid ...

  5. MasaFramework -- 缓存入门与设计

    概念 什么是缓存,在项目中,为了提高数据的读取速度,我们会对不经常变更但访问频繁的数据做缓存处理,我们常用的缓存有: 本地缓存 内存缓存:IMemoryCache 分布式缓存 Redis: Stack ...

  6. 动词时态=>1.动作的时间和状态

    时态 什么是时态? 英语的时态,是由动作的时间 + 动作的状态:这俩一起构成了时态 动词的时间和状态在一起,合称时态 理论上的十六种时态 先将 时间和状态的概念搞清楚,再具体讨论,用什么词,去构成时态 ...

  7. Windows 环境搭建 PostgreSQL 逻辑复制高可用架构数据库服务

    本文主要介绍 Windows 环境下搭建 PostgreSQL 的主从逻辑复制,关于 PostgreSQl 的相关运维文章,网络上大多都是 Linux 环境下的操作,鲜有在 Windows 环境下配置 ...

  8. 人生苦短,我用 python 之入门篇

    Python 是一种跨平台的,开源的,免费的,解释型的高级编程语言,它具有丰富和强大的库,其应用领域也非常广泛,在 web 编程/图形处理/黑客编程/大数据处理/网络爬虫和科学计算等领域都能找到其身影 ...

  9. 三、docker镜像管理

    一.docker镜像管理 1.1.镜像搜索-search 从docker镜像仓库模糊搜索镜像 用法: docker search 镜像关键字 [root@zutuanxue ~]# docker se ...

  10. java简易两数计算器

    public class calculator { public static void main(String[] args) { Scanner scanner = new Scanner(Sys ...