将代码和设计分离

本节内容可以参考文件"\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


本页地址:http://www.foxtable.com/webhelp/topics/6178.htm