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