集合类

图元被创建以后需要保存起来,以便于后面进行拾取、重画等操作。被选择的图元也要单独保存起来,后面的几何变换、删除等操作将只针对这部分单独保存起来的图元进行。利用.NET提供的集合类如ArrayList可以实现图元对象的保存。ArrayList类的功能很强大,利用它可以实现不同对象的添加、索引和删除。

具体应用时,需要首先创建ArraLit类的实例。如下所示,创建一个ges对象和一个geSels对象,分别实现所有图元的保存和被选中图元的保存。如果用VB.NET编程,可以将它们设置为全局变量。但VC#.NET中没有全局变量,可以在Form1类中声明,然后作为方法的参数进行传递。

code.vb.net
Public ges As New ArrayListO
Public geSels As New ArrayListO

集合类中图元的添加一般在图元创建完毕以后进行。下面是用于创建直线段的CCreaceLine 类中描述左键单击行为的部分代码。第2次单击鼠标左 以后,将新创焦的newLine对象添加到集合类中。

code.vb.net
Public Sub LButtonDown(ByVal g As Graphics,_
            By Val aPos As PointF) Implements ICommand.LButtonDown
    '记录鼠标左键的单击次数
    m_Step +=1
    Select Case m_Step
        Case 1            '第1次单击鼠标左键
            '…
        Case 2            '第2次单击鼠标左键
            '…
            ges.Add(newLine)
            '…
    End Select
End Sub

选择图元时, 要遍历图元类ges中的元素,如果第i个元素被拾取,则用选择模式绘制它,并将它放到选择集geSels中去。

code.vb.net
Public Sub LButtonDown(ByVal g As System.Drawing.Graphics,
            ByVal aPos As System.Drawing.PointF)
            Implements CAD_Net.ICommand.LButtonDown
    Dimi As Integer
    For i=0 To ges.Count - 1
        '如果图元被拾取,则用选择模式绘制图元
        '并将该图元添加到选择集中去"
        If(ges(i).Pick(aPos) = True) Then
            ges(i).Draw(g,CGElement.geDrawMode.Selec)
            geSels. Add(ges(i)
        End If
    Next
End Sub

图元被选到选择集中去以后,随后进行的变换操作和删除操作将只针对它们进行。下面的代码段将选择集中的图元进行平移变换。

code.vb.net
    '如果选择集中的图元个数大于0
    If geSels.Count >0 Then
        For i=0 To geSels.Count - 1
            '清除图元在当前位置上的图形
            geSels(i).draw(g, CGElement.geDrawMode.Delete)
            '将所有被选中的图元移动到目标位置并进行绘制
            geSels(i).Move(g,m_basePos,m_desPos)
            geSels(i).Draw(g, CGElement.geDrawMode.Selec)
        Next j
    End If