如何用excel畫樓梯?
最近知道可以用excel輸入數據,鏈接進CAD畫樓梯,求具體方法~
雖然這和BIM好像沒什麼關係,但是還是簡單回答一下吧,本人倒是做過幾個CAD,Excel和word開發的項目,也不敢說多在行,但基本原理還是懂一些的,由於非計算機專業出身,所以語言不專業請見諒。上正文。
(對於本解答之中不甚理解之處,或是程序代碼運行錯誤可以私信本人,本人將給與力所能及的幫助。)
===============================================================
其實做這個事情方法有三種:在Excel VBA上調用CAD,在CAD VBA IDE上調用Excel,在自己的平台上調用兩者。不過但本質還是一樣的,就是運用其他軟體提供給你的介面把你想實現的過程接進去就可以了。
下面的一些圖解和代碼選自原來寫的些論文,和您提出的問題可能沒直接關係,但可以根據這些實例進行類比,也可以實現您需要的過程。
1 如何獲取程序的進程
1.1 添加引用
這一步是多平台交互的基礎,沒有捕捉到目標平台的進程怎麼能在目標平台上操作呢?所以為了實現我們的繪圖操作或是數據讀取,我們首先要捕捉當前的CAD進程或者Excel進程。這裡我採用的是COM程序集的方法,雖然現在的CAD也支持.net的開發模式了,但...(好吧,我不會調用.net開發CAD)...
打開一個VB的集成開發環境(VB6.0,VisualStudio,CAD VBA IDE 或者 Excel VBA)這兒以Excel VBA作為開發環境為例。
在Excel的[工具]中單擊[宏]選項,在子菜單中單擊[VisualBasic編輯器]即可打開VB編輯器,單擊[工具]選項中的[引用]打開以下對話框,將上面所述的兩個組件勾選便成功添加了對CAD的引用。
圖1 添加工程引用
引用了以上的兩個COM組件後,我們就可以開始調用CAD的一些對象和命令了。
1.2 獲取COM對象
AutoCAD在COM組件中的架構如下圖所示,要想在CAD的模型空間中進行操作則必須先獲取CAD應用和模型空間所依附的文檔。
圖2 CAD的結構
具體實現獲取模型空間的代碼如下:
首先定義變數:
Dim myCADapp As AcadApplication
Dim myCADdoc As AcadDocument
Dim space As AcadModelSpace
在過程中輸入以下代碼即可得到AutoCAD進程:
On Error Resume Next
"如果當前有CAD正在運行,則捕捉當前程序進程
Set myCADapp = GetObject(, "AutoCAD.Application")
"如果當前CAD未運行,則創建一個CAD的程序進程
If Err.Number &> 0 Then
Err.Clear
Set myCADapp = CreateObject("AutoCAD.Application")
"此時創建的CAD進程可見性為[假],需將其改為[真]
myCADapp.Visible = True
End If
myCADdoc = myCADapp.ActiveDocument "獲取當前活動文檔
space = myCADdoc.ModelSpace "獲取該文檔的模型空間
獲取了模型空間,我們就可以對模型空間裡面的圖元進行一些操作了。
2. CAD自動化繪圖的基本原理
2.1 利用代碼控制CAD的基本原理
如果我們打開對象管理器,我們會發現其實CAD提供給我們的所有的類、介面和他們派生的一些方法,函數在結構上和CAD的交互界面設計的結構是一個樣的,也就是說,比如,UI里一個文檔有好多圖層,你就可以在AcadDocument裡面找到AcadLayers這個對圖層進行管理的類;同樣你在模型空間裡面可以添加各種圖元,你就可以利用AcadModelSpace派生的各種Add***函數來添加圖元。本質來說,在你不需要一些智能演算法輔助的情況下,其實我們的程序無非是把我們手工過程等效成了一個自動化的流程,其實也沒啥區別,只是人家計算機處理的比我們手工的要快多了。
圖3 CAD代替人工實現自動化的基本原理
2.2 向模型空間添加一個圖元
理解了這個,我們就可以嘗試去向模型空間中添加一條線了。
AutoCAD的界面操作中,用戶需要指定兩點,才能生成一條直線;同樣對於外部程序,想在AutoCAD中生成一條直線,除了調用生成直線的命令外,還應給予必要的參數(對於直線,就是兩個端點),實例如下:
Public Sub AddLine()
" 定義起點和終點並給其賦值
Dim StartPt(0 To 2) As Double, EndPt(0 To 2) As Double
StartPt(0) = 0: StartPt(1) = 4: StartPt(2) = 3
EndPt(0) = 2: EndPt(1) = 3: EndPt(2) = 1
" 定義直線,並賦值 #另:ThisDrawing是本地全局變數,代指本工程文件
Dim ln As AcadLine
Set ln = ThisDrawing.ModelSpace.AddLine(StartPt, EndPt)
End Sub
需要註明的是ThisDrawing這個關鍵詞只在CAD VBA中才有用,其他的平台還是得按照第一節給的方法捕捉模型空間,並賦予某個變數才行。
如果不出意外,運行完該代碼應該就能完成添加命令了。下面是我運行得到的結果。
圖4 代碼運行結果
2.3 所以說CAD實現繪圖的自動化該怎麼做
其實非常囧的就是,如果是一次性的任務,運用這種自動化程序的效率其實並不高,因為它需要將所有關鍵的點的坐標都表達出來,而且還時不時蹦出個bug...但沒辦法啊,程序就是這樣的...比如要繪製一個傾斜的矩形,首先就是要把這個矩形的長寬及中心的表達式算出來,然後繪製一個直立的矩形,然後通過它派生的Rotate函數將它旋轉。(說白了,和CAD界面操作基本上還是沒啥區別的,而且...有些操作在界面上完成好像還更簡單啊!!!=-=傷不起)
給一個畫歪著的矩形的一個代碼段吧:
主程序如下:
Public Sub AddRect()
Dim StartPt(0 To 1) As Double
Dim EndPt(0 To 1) As Double
StartPt(0) = 0: StartPt(1) = 0
EndPt(0) = 2000: EndPt(1) = 4000
Dim Rect As AcadLWPolyline
Set Rect = RectAngle(StartPt, EndPt, ThisDrawing.ModelSpace)
Dim Centre(0 To 2) As Double
Centre(0) = 0: Centre(1) = 0: Centre(2) = 0
"旋轉多段線LWpln
Const Degree = 3.1415926 / 180
Rect.Rotate Centre, 30 * Degree
End Sub
自定義函數如下:
Public Function RectAngle(Point1() As Double, Point2() As Double,
_Space As AcadModelSpace) As AcadLWPolyline
Dim Pt(0 To 9) As Double
Pt(0) = Point1(0): Pt(1) = Point1(1)
Pt(2) = Point1(0): Pt(3) = Point2(1)
Pt(4) = Point2(0): Pt(5) = Point2(1)
Pt(6) = Point2(0): Pt(7) = Point1(1)
Pt(8) = Point1(0): Pt(9) = Point1(1)
Set RectAngle = Space.AddLightWeightPolyline(Pt)
End Function
運行出來大概就是這個樣子了:
圖5 代碼運行結果
基本上簡單一點的CAD的自動化也就是這樣了,把所有的關鍵點的坐標求出來,寫好每個圖元的表達式,然後把參數接進去,運行。就完了...
3. Excel
忘了說Excel,其實Excel比CAD要知道的少許多,因為基本上如果你只將他做一個數據來源的話,記著一個sheet派生的cells屬性就足夠解決所有問題了。(畢竟是有了單元格裡面的數據)
Excel的捕捉和CAD差不多的,引用的話就引用下圖的這麼幾個文件就可以了。(哦,我用的是WPS,MS的Excel引用文件名和這個是不一樣的~)
引用之後和CAD差不多,用GetObject函數捕捉進程,其中的那個ProgID改成「Excel.Application」就可以。捕捉了進程後,捕捉你想用的Workbook和WorkSheet,使用Sheet派生的Cells(單元格)來獲取數據。基本上和Excel的交互也就完了...
================================================================
回答時默認題主的設計是二維的所以沒涉及三維圖元的添加和修改,但CAD自動程序在三維圖形上的設計能力也是可以接受的。比如下圖是本人在一個平台開發時利用軟體生成的實體。效果也還不錯。
但是經過開發CAD後,基於對CAD的天生缺陷的理解,我非常支持題主多去了解BIM,並不是說三維的就一定好,而是BIM從軟體平台上來說,已經比CAD要高許多了。現在我也無心在去做什麼CAD開發了,原因也非常簡單,當我想做的事情其實別人早就做完了,或者就算別人沒做或者沒做好,我也能在他通過的平台上通過了了百句的代碼完成我的目標,而非像現在拼了老命寫了上萬句還只能實現些基礎的功能,更可悲的是還增加了很多人為的限制。有時候我在想,牛頓的話也是至理了:
如果說我看得比別人更遠些,那是因為我站在巨人的肩膀上。
祝在BIM的路上共進!
Ps:
如果覺得我說的太啰嗦當然也可以參考這篇:
龍曉林,王國順.使用VB應用程序調用AutoCAD和Excel軟體的方法[J].武漢理工大學學報(信息與管理工程版),2001,23(4).
以及這兩本書
曾洪飛,盧擇臨,張帆.AutoCAD VBAhttp://VB.Net開發基礎與實例教程[M].北京:中國電力出版社,2008.
佟士懋,邢芳芳等.AutoCAD ActiveX/VBA二次開發技術基礎及應用實例[M].北京:國防工業出版社,2006(4).
這個沒什麼用吧,這樣做還不如建塊快。最近我也在做CAD的拓展開發。
推薦閱讀: