全面分析VB.NET MOVE命令
本章的目的是解釋AutoCAD事件怎樣才能被用于控制AutoCAD圖形中的行為。我們不想讓用戶能改變EMPLOYEE塊索引的位置,而對于其它的非EMPLOYEE塊索引的位置則沒有這個限制。我們將混合使用數據庫與文檔事件來做到這一點。
#t#首先,我們想要監視將要被執行的AutoCAD命令(使用CommandWillStart事件)。特別地,我們要監視VB.NET MOVE命令。另外,當一個對象要被修改時,我們應該被通知(使用ObjectOpenedForModify事件),這樣我們可以確定它是否為一個EMPLOYEE塊索引。如果這時就修改對象可能是無效的,因為我們的修改可能會再次觸發事件,從而引起不穩定的行為。所以,我們要等待VB.NET MOVE命令的執行結束(使用CommandEnded事件),這時就可以安全地修改對象了。當然,任何對塊索引的修改將會觸發ObjectOpenedForModify事件。我們還需要設置一些全局變量來表明一個VB.NET MOVE命令在運行和被修改的對象是一個EMPLOYEE塊索引。
注意:因為本章需要比較多的代碼來獲得想要的結果,所以我們不會解釋任何與事件處理無關的代碼,而只是將它們粘貼到事件處理函數中。這里的重點是成功創建和注冊事件處理函數。
創建新工程
我們以第六章的工程開始。請新加入一個類AsdkClass2。我們還要加入四個全局變量。前兩個是Boolean型的:一個用來表示我們監視的命令是否是活動的,另外一個用來表示ObjectOpenedForModify事件處理函數是否該被忽略。
- '全局變量
- Dim bEditCommand As Boolean
- Dim bDoRepositioning As Boolean
接下來,我們要聲明一個全局變量來表示一個ObjectIdCollection,它用來存儲我們所選擇的要修改的對象的ObjectID。
- Dim changedObjects As New ObjectIdCollection()
最后,我們要聲明一個全局變量來表示一個Point3dCollection,它用來包含我們所選對象的位置(三維點)。
- Dim employeePositions As New Point3dCollection()
創建第一個文檔事件處理函數(回調函數)
現在我們要創建一個事件處理函數。當AutoCAD命令開始執行的時候它會通知我們。我們要檢查GlobalCommandName的值是否為MOVE。
- If e.GlobalCommandName = "MOVE" Then
- 'Set the global variables
- 'Delete all stored information
- End If
如果VB.NET MOVE命令開始執行的話,我們要相應地設置Boolean變量bEditCommand的值,這樣我們可以知道我們所監視的命令是活動的。同樣地,我們應該把另外一個Boolean變量bDoRepositioning設置為false來忽略ObjectOpenedForModify事件處理函數。兩個變量設置好以后,在命令活動期間,我們必須要獲得所選塊索引的信息。
我們還應該把兩個集合對象的內容清空。我們只關心當前選擇的對象。