岳增川,張朝輝
(朝陽師范高等專科學校 生化工程系,遼寧 朝陽 122000)
AutoCAD(Autodesk Computer Aided Design)是一款科研與工程領域常用的計算機輔助設計軟件,具有圖形繪制和編輯功能完善、二次開發方便、數據交換能力強的特點[1].利用AutoCAD繪制的曲線,數據擬合精準,讀數直觀準確,可方便地對曲線進行積分、微分等操作,此外,利用AutoCAD繪制的曲線文件在交換、傳遞和輸出過程中不會出現失真現象,因此得到了廣大科研、工程設計工作者的認可.但依次繪制坐標、逐個確定數據點、連線作曲線擬合圖的手動繪圖方式,只能適應小數據量的繪圖任務,而現代大型分析儀器檢測所得的數百甚至上萬個數據,顯然無法通過手動繪圖的方式完成其擬合曲線的繪制.因此,本文結合Excel的數據運算功能和AutoCAD中內嵌VBA模塊的編程功能,以差熱-熱重分析儀測得的數據為例,設計了一種可自動、批量化繪制大數據量曲線的方法.為方便大部分大型分析儀器使用者,該繪圖方法源程序中所用到的語言與算法都比較基礎,較易為非專業編程人員所掌握.研究中所用軟件版本為Microsoft Excel 2010和AutoCAD 2008.
差熱-熱重分析數據由島津TG-60AH型差熱-熱重儀測得,樣品為某高分子材料,于鉑金坩堝內完成實驗.基本實驗條件:空氣氣氛,樣品初始質量4.938 mg,初始溫度70 ℃,升溫速度為10 ℃/min,終點溫度為250 ℃,數據采集間隔為1.00 s.原始數據文件為“.txt”格式的文本文檔,主要數據內容有Time(時間,s)、Temp(溫度,℃)、DTA(差熱,μV)、TGA(質量,單位mg)四項.常用的差熱-熱重曲線圖中橫坐標為Temp,左縱坐標為DTA,右縱坐標為TGA,因此我們只需將以上三個項目的數據從文本文檔中復制到Excel文件中即可.
Excel中原始數據的截圖如圖1所示(由于數據眾多,截圖只展示Excel工作表頂端和末端的單元格),Temp、DTA和TGA每項均有1080個數據,位于A2~A1081、B2~ B1081、C2~ C1081單元格中,Temp的數值大小在69~251之間,DTA的數值大小在-11~13的范圍內,TGA的數值大小在3.49~4.95的范圍內.

為了能夠將差熱-熱重曲線在AutoCAD中直觀、準確且盡可能美觀地繪制出來,我們將以上三項數據的數值經相應運算轉換成AutoCAD中具體的長度值,以適應AutoCAD中曲線的坐標軸范圍和刻度單位.轉換完成的數據保存于文件名為“TG-DTA”的Excel文件的“sheet1”工作表中.具體轉換過程如下:以Temp為橫坐標,在AutoCAD中以1個長度單位表示1 ℃,坐標軸范圍為0~300 ℃,坐標線起點坐標為(0,0,0),終點坐標為(300,0,0);以DTA為左縱坐標,在AutoCAD中以10個長度單位表示1 μV,坐標軸范圍為-15~15 μV,坐標線起點坐標為(0,0,0),終點坐標為(0,300,0);以TGA為右縱坐標,在AutoCAD中以 125個長度單位表示1 mg,坐標軸范圍為3.0~5.4 mg,坐標線起點坐標為(300,0,0),終點坐標為(300,300,0).即AutoCAD中三個坐標軸的線長均為300個長度單位.轉換后數據見圖2中Excel工作表的D、E、F列,其中D列數值=A列數值,E列數值=B列數值×10+150,F列數值=(C列數值-3)×125. 三項數據每項均有1080個數據,位于D3~D1082、E3~E1082、F2~F1083單元格中,D列數值大小在69~251之間,E列數值大小在40~280的范圍內,F列的數值大小在61.25~243.75的范圍內.


首先,打開AutoCAD 程序,將工作空間設置為“二維草圖與注釋”.通過“Alt + F8”快捷鍵打開“宏”窗口,然后通過點擊“VBA 管理器”按鍵進入“VBA 管理器”窗口,點擊“新建”按鍵新建一個工程,最后點擊“VBA 編輯器”按鍵調出“VBA 程序編輯器”.由于繪圖過程中需要聯用AutoCAD和Excel兩個軟件,因此編程前需在“VBA程序編輯器”界面下的“工具”菜單中關聯Excel軟件[2].完成以上各項操作后,接下來開始進行曲線繪制的編程.
首先繪制坐標格,坐標格的最終效果圖如圖3所示(圖中L1、L2、L3、L4、L12和L22等標注內容與相關箭頭指示線是特意為方便介紹程序語言所繪制,并非程序自動生成內容).源程序如下:
Public Sub 畫坐標格()
Dim L(1 To 4) As Object, p1(0 To 2) As Double, p2(0 To 2) As Double, p3(0 To 2) As Double, p4(0 To 2) As Double, p5(0 To 2) As Double, p6(0 To 2) As Double
p1(0) = 0: p1(1) = 0: p1(2) = 0
p2(0) = 0: p2(1) = 300: p2(2) = 0
p3(0) = 300: p3(1) = 0: p3(2) = 0
p4(0) = 50: p5(1) = 0: p5(2) = 0
p5(0) = 50: p4(1) = 5: p4(2) = 0
p6(0) = 0: p5(1) = 50: p5(2) = 0
p7(0) = 300: p6(1) = 50: p6(2) = 0
聲明變量,L表示坐標線,L1-L4所代表的具體坐標線如圖3所示,L1、L2分別表示DTA坐標線和Temp坐標線,L3和L4分別代表Temp坐標線的刻度線和DTA坐標線的刻度線,p為坐標線L的端點,p(0-2)依次表示各點在x、y、z軸的坐標值[2-3].
Set L1 = ThisDrawing.ModelSpace.AddLine(p1, p2)
Set L2 = ThisDrawing.ModelSpace.AddLine(p1, p3)
Set L3 = ThisDrawing.ModelSpace.AddLine(p4, p5)
Set L4 = ThisDrawing.ModelSpace.AddLine(p6, p7)
L4.Linetype = "Dashed2"
L4.LinetypeScale = 2
做出各坐標線,并將L4設定為“Dashed2”線型,比例因子為2.
Dim L12 As Variant, L22 As Variant
L12 = L1.Offset(-300): L22 = L2.Offset(300)
通過將坐標線L1、L2偏移得到L12、L22,其中L12表示TGA坐標線.
Dim I As Integer
For I = 1 To 4
Dim Ls() As Variant
ReDim Ls(I)
Ls(I) = L3.Offset(-50 * I)
Next I
Dim J As Integer
For J = 1 To 4
Dim Lh() As Variant
ReDim Lh(J)
Lh(J) = L4.Offset(50 * J)
Next J
通過將刻度線L3、L4偏移得到其余的刻度線.
ZoomExtents
顯示整個圖形.
End Sub
程序編碼完成后,通過點擊“工具”菜單下的“Run Sub/UserForm”命令,即可在AutoCAD主界面中繪制出相應內容.
接下來通過編程完成對坐標值的標注,以左縱坐標軸(DTA坐標軸)為例,源程序如下:
Public Sub 標注DTA值()
Dim A(1 To 8) As AcadText, tA(1 To 8) As String
Dim PA1(0 To 2) As Double, PA2(0 To 2) As Double
Dim PA3(0 To 2) As Double, PA4(0 To 2) As Double
Dim PA5(0 To 2) As Double, PA6(0 To 2) As Double
Dim PA7(0 To 2) As Double, PA8(0 To 2) As Double
tA1= "-15.0":tA2= "-10.0":tA3 ="-5.0":tA4= "0.0"
tA5= "+5.0":tA6= "+10.0": tA7= "+15.0":tA8 ="DTA/μV"
PA1(0) = -23: PA1(1) = -3: PA1(2) = 0
PA2(0) = -23: PA2(1) = 47: PA2(2) = 0
PA3(0) = -23: PA3(1) = 97: PA3(2) = 0
PA4(0) = -23: PA4(1) = 147: PA4(2) = 0
PA5(0) = -23: PA5(1) = 197: PA5(2) = 0
PA6(0) = -23: PA6(1) = 247: PA6(2) = 0
PA7(0) = -23: PA7(1) = 297: PA7(2) = 0
聲明變量,以A表示CAD中的文字,txt表示具體文字內容,PA表示文字的插入點,PA(0-2)依次表示文字插入點在x、y、z軸的坐標值.
Set A1 = ThisDrawing.ModelSpace.AddText(tA1, PA1, 6)
Set A2 = ThisDrawing.ModelSpace.AddText(tA2, PA2, 6)
Set A3 = ThisDrawing.ModelSpace.AddText(tA3, PA3, 6)
Set A4 = ThisDrawing.ModelSpace.AddText(tA4, PA4, 6)
Set A5 = ThisDrawing.ModelSpace.AddText(tA5, PA5, 6)
Set A6 = ThisDrawing.ModelSpace.AddText(tA6, PA6, 6)
Set A7 = ThisDrawing.ModelSpace.AddText(tA7, PA7, 6)
插入各坐標值,文字大小為6.
PA8(0) = -35: PA8(1) = 150: PA8(2) = 0
Set A8 = ThisDrawing.ModelSpace.AddText(tA8, PA8, 6)
A8.Rotate A8.InsertionPoint, 1.570796
插入坐標軸名稱“DTA/μV”,文字大小為6,并將文字進行旋轉,旋轉值為1.570 796 rad,約為0.5π rad.
ZoomExtents
End Sub
同理,可通過編程對橫坐標軸(Temp坐標軸)和右縱坐標軸(TGA坐標軸)完成標注.
在完成差熱-熱重曲線坐標的繪制后,便可通過編程,利用Excel表中D、E、F列數據進行差熱-熱重曲線的繪制.以利用Excel表中D、E列數據繪制差熱(DTA)曲線為例,源程序如下:
Public Sub 曲線()
Dim Excl As Excel.Application
Dim Excl_Book As Excel.Workbook
Dim Excl_Sheet As Excel.Worksheet
依次對Excel程序、Excel工作薄、Excel工作表進行變量聲明[4].
Set Excl = CreateObject("Excel.Application")
Set Excl_Book = Excl.Workbooks.Open("E:TG-DTA.xlsx")
Set Excl_Sheet = Excl_Book.Sheets("sheet1")
依次打開Excel程序,打開E盤中名稱為“TG-DTA”的Excel文件,打開sheet1工作表.
Dim DTALine As Object
Dim I As Integer
以I表示Excel表中第4列(D列)或第5列(E列)數據的行數.
I = 1
Do
If IsEmpty(Excl_Sheet.Cells(I, 4)) Then Exit Do
當第4列(D列)的第I行的單元格中沒有數據時,結束循環.
I = I + 1
行數I值加1,繼續循環,判定D列第I行單元格是否為空.
Loop
I = I-1
由于程序結束時第I行單元格為空,因此該列數據實際行數為I-1.
Dim PDTA() As Double
N = (I - 2) * 2
N為Excel表中D列和E列數值型數據的總個數,因為D列和E列的前兩行單元格中的內容為文字,并不是實驗數值,因此N=(I-2) × 2.
ReDim PDTA(1 To N)
Dim J As Integer
For J = 3 To I
PDTA(J * 2 - 5) = Excl_Sheet.Cells(J, 4)
PDTA(J * 2 - 4) = Excl_Sheet.Cells(J, 5)
Next J
PDTA(1)為第一個點的橫坐標,即Excel表中第3行第4列(D列)單元格中的Temp值,PDTA(2)為第一個點的縱坐標,即Excel表中第3行第5列(E列)單元格中的DTA值,以此類推.
Set DTALine=ThisDrawing.ModelSpace.AddL
-ightWeightPolyline (PDTA)
DTALine.Color=5
畫多段線,并將多段線的顏色改成藍色.
ZoomExtents
顯示圖形.
Excl.Application.Quit
關閉Excel程序.
End Sub

編碼完成后,運行程序即可繪制出差熱曲線,但此時繪制的曲線為多段線,需要將其擬合為更為光滑的樣條曲線.具體操作為:通過鼠標左鍵選中需要修改的曲線,依次點擊AutoCAD主界面下的“修改、對象、多段線”指令,然后在命令欄中輸入“S”,敲擊回車鍵后,即可將曲線的形式由多段線轉換為樣條曲線.同理,可通過編程利用Excel表中D列和F列數據完成熱重(TGA)曲線的繪制.最終完成的差熱-熱重曲線圖如圖4 所示.
當有多組差熱-熱重分析的平行實驗數據時,可將上述Excel文件中相應Temp、DTA和TGA項的原始數據進行替換后,直接加載該程序代碼文件來完成對應曲線的自動化、批量化繪制,或者將原始實驗數據分別保存在Excel文件中的多個工作表(sheet)內,通過逐次修改程序代碼中所調用工作表名稱的方式,即“Set Excl_Sheet = Excl_Book.Sheets("sheet1")”中的“sheet1”,來實現相應曲線的繪制.
本文以差熱-熱重曲線為例,在利用Excel軟件對原始數據進行簡單處理后,通過AutoCAD軟件內嵌的VBA模塊進行簡單編程,便可實現差熱-熱重曲線的自動繪制,且源程序簡單易懂,可為編程基礎較差甚至零編程基礎的大型分析儀器使用人員所熟練掌握.氣相/液相色譜譜圖、X-射線衍射圖、電化學分析曲線、拉曼光譜與紅外光譜譜圖等數據量較大的曲線繪制時均可參照該方法.另外,當有多組平行實驗數據時,通過該方法還可以實現大數據量曲線的批量化繪制.該方法可為大型分析儀器操作者及相關科研人員的實驗報告編制、論文寫作工作提供一定的參考價值.