将代码和设计分离
本节内容可以参考文件"\CaseStudy\流程图\纯代码流程图\纯代码绘制之二.Table"
上一节我们基于草图用硬编码的方式绘制了一个流程图,需要极大的耐心,而且流程图的设计一旦有变化,就需要大面积修改代码,很容易让程序员崩溃。
这一节我们将草图中的坐标转为一个数据表,然后基于数据表的内容绘制流程图,这样不管流程的设计如何变化,我们都能用完全一样的代码来完成绘制。
草图还是原来的:

基于这个草图,我们得到了下面的数据表,注意决定菱形位置和大小的不是对角点,而是相邻的两个点(也就是任意一条边的两个点):

现在我们绘制这个流程图的代码就简单很多了,代码是通用的,
不管流程图有多复杂,也不管流程图未来如何变化,
你都不需要再修改代码了:
'初始化地图控件,不是必须的,只是使得地图控件更适合作为流程图控件使用:
Dim
map
As
GeoMap = e.Form.Controls("Map1").GeoMap
map.UseGallPetersProjection =
True
'采用Gall
Peters投影方式
map.Viewport.Limits.MaxLat = 60
'排除高纬度地区,因为高纬度地区变形大
map.Viewport.Limits.MinLat = -60
map.Zoom = 12
'缩放指数设置为12,留足够的区间用于放大和缩小
map.CenterTo( - 160, 50)
'中心点设置在有效区域的左上,因为通常都是往右下绘制,同时也留有一定的余地往左上绘制
'增加矢量层:
Dim
layer
As
New
VectorLayer()
map.Layers.Add(layer)
layer.Style.Stroke.Width = 2
layer.Style.Font =
New
Font("微软雅黑",
12)
'用代码绘制流程图,注意以下定位均采用像素,在绘制时候要转为经纬度,
Dim
xStart
As
Integer
= 50
'本流程图整体是从左到右,所以起点在左中位置
Dim
yStart
As
Integer
= 200
Dim
xStep
As
Integer
= 96
'默认形状宽度,也是箭头的默认长度
Dim
yStep
As
Integer
= 64
'默认形状高度,宽高比大概是3:2,
96*2/3 = 64
For
Each
dr
As
DataRow
In
DataTables("流程图").DataRows
'绘制流程图
Dim
gps
As
New
List(Of
GeoPoint)
Dim
pts()
As
String
= dr("位置").Split(",")
For
idx
As
Integer
= 0
To
pts.Length - 1
Step
2
Dim
dx
As
Integer
= xStart + Val(pts(idx)) * xStep
Dim
dy
As
Integer
= yStart + Val(pts(idx + 1)) * yStep
Dim
p
As
New
Point(dx, dy)
gps.Add(map.ToGeoPoint(p))
Next
Dim
item
As
VectorItem =
Nothing
Select
Case
dr("类型")
Case
"四边形"
item = map.CreateRectangle(gps(0), gps(1))
Case
"菱形"
item = map.CreateDiamond(gps(0), gps(1))
Case
"箭头"
item = map.CreateLineWithArrow(gps)
Case
"文本"
Dim
txt
As
New
VectorPlacemark()
txt.Geometry = gps(0)
txt.Marker.Shape = MarkerShape.Custom
txt.Marker.CustomShape = map.CreateTextShape(dr("文本"))
item = txt
End
Select
item.Tag = dr
'将tag设置为对应的数据行,用于响应事件
layer.Items.Add(item)
Next