2017-04-14

[AutoCAD]VBA中SendCommand方法

在AutoCAD中VBA的程式開發中,要創建圖元(如Line/Circle.....)等,是輕而易舉的,然若需要進行圖元編輯(如extend/fillet/trim...)等,這部分是無法直接使用方法來達成的,較常使用的方式,是用鍵盤模擬的方式(SendCommand)來模擬操作者的輸入方式...

以下面為例
ThisDrawing.SendCommand "_Circle" & vbCr & "2,2,0" & vbCr & "4" & vbCr
 或
ThisDrawing.SendCommand "_Circle 2,2,0 4 "  '不推薦的作法
你可以在圓心(2,2)的位置畫出半徑(r)=4的圓,不過既然是創建,我們是不會利用上面的方式處理,而是利用如下程式碼:
dim cPt as Double
cPt(0)=2:cPt(1)=2
ThisDrawing.ModleSpace.AddCircle cPt,4
如上所述,對於編修是沒有方法可以利用的(除了Delete/Copy), 我們以fillet(圓角)編輯功能來說好了,當下_fillet指令後,我們需要再點選兩條線。
但如何描述點選兩條線??在SendCommand方法中,只能以送出兩條線上某點的座標的方式,來模擬選取線條,其實這種方式有一定的風險,比如
1. 若剛好點位在兩條線交點,算點到哪條線??
2. 若圖元挑選器(aperture)的尺寸太大,含括兩條以上的線段??

為了確保選到的線是我們想要的,有個另外的作法是由SendCommand來呼叫Lisp的command指令,為何需要這麼複雜的呼叫??主要原因是VBA的SendCommand只能送出字串資料,而Lisp的command指令,卻能包含座標/圖元...等,這也讓Lisp的command只能增加了不少的彈性,以下是不太完善的程式參考:
Dim aLine as AcadLine,bLine as AcadLine
Dim aHandle as String,bHandle as String 
......( 創建Line圖元)
aHandle=aLine.Handle:bHandle=bLine.Handle
Dm cmdStr as string 
cmdStr="(command " & Chr(34) & "_.fillet" & Chr(34) & " (handent " _
               & Chr(34) & aHandle & Chr(34) & ")" & Chr(32) & "(handent " _
               & Chr(34) & bHandle & Chr(34) & "))" & vbCr
ThisDrawing.SendCommand  cmdStr
 (註:chr(32)=space ; chr(34)=" )
以上我們發現我們可以利用獲取圖元的Handle,於Lisp中利用handent指令來確實描述該圖元,就可解決圖元獲取不確定的困擾了。

結論

1. SendCommand原則上少用為妙,不過也要看情況,有時候是不得不..
2. 利用Lisp來解決問題,你還要熟悉Lisp指令,話說回來,既然熟悉Lisp指令又何必用VBA來開發??
3. 你可以利用空格" "或是vbCr來模擬按下Enter鍵,但有時候空格方式會造成失效,所以以vbCr為主。
4. VBA開發中,還是多多少少需要利用Lisp來達到想要的功能。

其實單純利用Lisp,並無法確實解決實際的問題,可參考如下:


當兩條線未有交點的時候,利用Lisp手法可以較為完美的解決問題,但是若如下圖有相交的狀況,Lisp僅能處理成狀況4的圖形,若要其他樣式的結果,還真不得不傳送座標訊息給程式,如下:
cmdStr = "_fillet" & vbCr & aPt(0) & "," & aPt(1) & "," & aPt(2) & vbCr _
                    & bPt(0) & "," & bPt(1) & "," & bPt(2) & vbCr

ThisDrawing.SendCommand cmdStr


沒有留言:

張貼留言