APP下载

利用AutoCAD -VBA 编程绘制差热-热重曲线

2020-06-24岳增川张朝辉

关键词:纵坐标坐标轴单元格

岳增川,张朝辉

(朝阳师范高等专科学校 生化工程系,辽宁 朝阳 122000)

0 引言

AutoCAD(Autodesk Computer Aided Design)是一款科研与工程领域常用的计算机辅助设计软件,具有图形绘制和编辑功能完善、二次开发方便、数据交换能力强的特点[1].利用AutoCAD绘制的曲线,数据拟合精准,读数直观准确,可方便地对曲线进行积分、微分等操作,此外,利用AutoCAD绘制的曲线文件在交换、传递和输出过程中不会出现失真现象,因此得到了广大科研、工程设计工作者的认可.但依次绘制坐标、逐个确定数据点、连线作曲线拟合图的手动绘图方式,只能适应小数据量的绘图任务,而现代大型分析仪器检测所得的数百甚至上万个数据,显然无法通过手动绘图的方式完成其拟合曲线的绘制.因此,本文结合Excel的数据运算功能和AutoCAD中内嵌VBA模块的编程功能,以差热-热重分析仪测得的数据为例,设计了一种可自动、批量化绘制大数据量曲线的方法.为方便大部分大型分析仪器使用者,该绘图方法源程序中所用到的语言与算法都比较基础,较易为非专业编程人员所掌握.研究中所用软件版本为Microsoft Excel 2010和AutoCAD 2008.

1 数据整理

差热-热重分析数据由岛津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的范围内.

2 通过VBA编程绘制差热-热重曲线

2.1 调出VBA 程序编辑器

首先,打开AutoCAD 程序,将工作空间设置为“二维草图与注释”.通过“Alt + F8”快捷键打开“宏”窗口,然后通过点击“VBA 管理器”按键进入“VBA 管理器”窗口,点击“新建”按键新建一个工程,最后点击“VBA 编辑器”按键调出“VBA 程序编辑器”.由于绘图过程中需要联用AutoCAD和Excel两个软件,因此编程前需在“VBA程序编辑器”界面下的“工具”菜单中关联Excel软件[2].完成以上各项操作后,接下来开始进行曲线绘制的编程.

2.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坐标轴)完成标注.

2.3 绘制差热-热重曲线

在完成差热-热重曲线坐标的绘制后,便可通过编程,利用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 所示.

2.4 多组平行数据的批量化绘制

当有多组差热-热重分析的平行实验数据时,可将上述Excel文件中相应Temp、DTA和TGA项的原始数据进行替换后,直接加载该程序代码文件来完成对应曲线的自动化、批量化绘制,或者将原始实验数据分别保存在Excel文件中的多个工作表(sheet)内,通过逐次修改程序代码中所调用工作表名称的方式,即“Set Excl_Sheet = Excl_Book.Sheets("sheet1")”中的“sheet1”,来实现相应曲线的绘制.

3 结语

本文以差热-热重曲线为例,在利用Excel软件对原始数据进行简单处理后,通过AutoCAD软件内嵌的VBA模块进行简单编程,便可实现差热-热重曲线的自动绘制,且源程序简单易懂,可为编程基础较差甚至零编程基础的大型分析仪器使用人员所熟练掌握.气相/液相色谱谱图、X-射线衍射图、电化学分析曲线、拉曼光谱与红外光谱谱图等数据量较大的曲线绘制时均可参照该方法.另外,当有多组平行实验数据时,通过该方法还可以实现大数据量曲线的批量化绘制.该方法可为大型分析仪器操作者及相关科研人员的实验报告编制、论文写作工作提供一定的参考价值.

猜你喜欢

纵坐标坐标轴单元格
·更正·
更正
勘 误
用坐标轴平移妙解斜率和(或积)为定值问题
流水账分类统计巧实现
玩转方格
玩转方格
浅谈Excel中常见统计个数函数的用法
巧用仿射变换妙解高考解析几何题
第五届播睿智杯“奇思妙想”有奖数学知识竞赛