AutoCAD-VBA技术在杭州萧山机场T3航站楼金属吊顶工程中的初步应用

时间:2022-10-04 10:33:18

AutoCAD-VBA技术在杭州萧山机场T3航站楼金属吊顶工程中的初步应用

摘要:本文介绍了在萧山机场T3航站楼金属吊顶工程中,如何运用AutoCAD-VBA技术,解决大规模曲面吊顶AutoCAD模型空间点坐标数据提取和金属吊顶单元面板数据(面板加工尺寸数据)生成等工程问题。通过该技术的应用,减少了大量的从吊顶三维曲面模型到实际金属面板加工工艺尺寸的转化时间和人工成本。

关键词:AutoCAD-VBA;AutoCAD二次开发;金属吊顶

Abstract: This paper introduces the metal ceiling project of the Xiaoshan airport terminal T3, how to use AutoCAD-VBA technology to solve large-scale curved ceiling, AutoCAD model spatial coordinate data extraction and metal ceiling panel data (panel processing unit size data) generation and other engineering problems. Through the application of the technology, reduce the amount of the 3D surface model from the ceiling into actual metal panel processing size and labor costs.

Keywords: AutoCAD-VBA; AutoCAD two; metal ceiling

中图分类号:TU74

一、杭州萧山机场T3航站楼金属吊顶工程基本介绍

该吊顶工程是大型的异形曲面(双曲面)金属吊顶,总面积超过5万平面。吊顶单元组块为平面三角形,每个三角形组块的边长都不一致。通过三角形的空间拼接,拟合出波浪形曲面。

萧山机场吊顶效果图

二、工程中遇到的难题

吊顶原始模型是AutoCAD文件中大量的空间点。这些空间点连线形成的三角形就形成三角形板块的分格线,由于工程安装需要和考虑环境温度变化等因素,板块与板块之间必须留有一定的缝隙,所以空间点连接形成的三角形还必须进行边的偏移处理(偏缝处理)才能得到真实的金属面板尺寸模型。最后提取真实模型的边长尺寸,制成Excel加工清单表格,才能最终用到工厂的生成加工中去。

分格线与真实面板边线示意图

人工处理必须经过以下过程:

空间点连线—>空间三角形分格模型—>三角形边线偏移处理—>真实面板尺寸—>尺寸数据制成Excel加工清单表格

整个工程有5万多块三角形面板需要经过上面的过程处理,这将是十分繁重的工作,需要大量的时间和人力。转换过程数据量巨大,容易出错,给工程带来很大经济风险。

三、问题分析和解决方案

分析前面的问题,发现虽然要处理的板块数量十分巨大,但是处理的步骤是一致的。对于这种数据相对简单,流程统一的批量化处理,计算机程序最擅长的。我们只要运用合适的计算机语言,把中间的转换过程打包成“黑箱程序”,就能避免前面的各种风险,也可以节省大量的人力和时间。

真实金属面板尺寸模型

简化后的过程:原始模型空间点输入—>黑箱程序

Excel加工清单表格

过程中唯一要求人工操作的是选择原始模型空间的三个点,最终输出真实金属面板尺寸模型和Excel加工清单表格都由程序完成。

满足上述“黑箱程序”程序的语言,首先要能与AutoCAD进行交互操作,而且能与Excel进行通讯,把最终模型尺寸信息储存在Excel文件中。这样,大量的模型操作和数据操作都由程序完成,杜绝了人工出错的可能。

AutoCAD-VBA技术使用的语言Microsoft VBA语法简单。语句容易从表面意思理解,容易被非计算机程序专业人员掌握,而且能与Excel表格程序进行很好通讯,所以本工程采用了AutoCAD-VBA技术。

五、真实模型的几何推导

从空间三角形分格模型到真实金属面板尺寸模型必须预先进行几何推导,再把推导写成计算机语言的形式。

几何推导模型如下图:

已知P01、P02、P03点空间点坐标

需要求解的是真实金属面板尺寸模型, 即求解P11、P12、P13的空间坐标和L11、L12、L13的长度。本工程off=2.5mm。

推导过程:

已知P01[x、y、z]、P02[x、y、z]和P03[x、y、z]

可得三角形边长L01、L02、L03

L01={(P01[x]-P02[x])2+(P01[y]-P02[y])2+(P01[z]-P02[z])2}0.5

L02={(P02[x]-P03[x])2+(P02[y]-P03[y])2+(P02[z]-P03[z])2}0.5

L03={(P03[x]-P01[x])2+(P03[y]-P01[y])2+(P03[z]-P01[z])2}0.5

有三角形三边长度,可得三角形角度a1、a2、a3

a1=Arc cos(L012+ L032- L022)/(2*L01*L03)

a2=Arc cos(L022+ L012- L032)/(2*L02*L01)

a3=Arc cos(L032+ L022- L012)/(2*L03*L02)

根据几何关系可得P11、P12、P13的坐标:

P11[x]= P01[x]+ Off/sin(a1)*{(P02[x]-P01[x])/L01}+

Off/sin(a1)*{(P03[x]-P01[x])/L03}

P11[y]= P01[y]+ Off/sin(a1)*{(P02[y]-P01[y])/L01}+

Off/sin(a1)*{(P03[y]-P01[y])/L03}

P11[z]= P01[z]+ Off/sin(a1)*{(P02[z]-P01[z])/L01}+

Off/sin(a1)*{(P03[z]-P01[z])/L03}

P12[x]= P02[x]+ Off/sin(a2)*{(P03[x]-P02[x])/L02}+

Off/sin(a2)*{(P01[x]-P02[x])/L01}

P12[y]= P02[y]+ Off/sin(a1)*{(P03[y]-P02[y])/L02}+

Off/sin(a2)*{(P01[y]-P02[y])/L01}

P12[z]= P02[z]+ Off/sin(a2)*{(P03[z]-P02[z])/L02}+

Off/sin(a2)*{(P01[z]-P02[z])/L01}

P13[x]= P03[x]+ Off/sin(a3)*{(P01[x]-P03[x])/L03}+

Off/sin(a3)*{(P02[x]-P03[x])/L02}

P13[y]= P03[y]+ Off/sin(a3)*{(P01[y]-P03[y])/L03}+

Off/sin(a3)*{(P02[y]-P03[y])/L02}

P13[z]= P03[z]+ Off/sin(a3)*{(P01[z]-P03[z])/L03}+

Off/sin(a3)*{(P02[z]-P03[z])/L02}

最后得到L11、L12、L13长度尺寸

L11={(P11[x]-P12[x])2+(P11[y]-P12[y])2+(P11[z]-P12[z])2}0.5

L12={(P12[x]-P13[x])2+(P12[y]-P13[y])2+(P12[z]-P13[z])2}0.5

L13={(P13[x]-P11[x])2+(P13[y]-P11[y])2+(P13[z]-P11[z])2}0.5

到此,整个几何推导完毕,真实面板的空间点坐标和面板边长都已经得到求解。

六、本工程“黑箱程序”

Public Sub Angle_Panel()

Dim P01 , P02 ,PO3''定义P01、PO2、PO3空间点坐标变量

Repeat:

P01 = ThisDrawing.Utility.GetPoint_

(, vbCrLf & "请输入三个点坐标,第一点: ") '从模型中得到第一点坐标

P02 = ThisDrawing.Utility.GetPoint_

(, vbCrLf & "第二点: ") '从模型中得到第二点坐标

P03 = ThisDrawing.Utility.GetPoint_

(, vbCrLf & "第三点: ") '从模型中得到第三点坐标

Dim L01 As Double ,L02 As Double,L03 As Double ''定义L01、L02、L03长度变量

L01 = ((P01(0) - P02(0)) ^ 2 + (P01(1) - P02(1)) ^ 2_

+ (P01(2) - P02(2)) ^ 2) ^ 0.5

L02 = ((P02(0) - P03(0)) ^ 2 + (P02(1) - P03(1)) ^ 2 _

+ (P02(2) - P03(2)) ^ 2) ^ 0.5

L03 = ((P03(0) - P01(0)) ^ 2 + (P03(1) - P01(1)) ^ 2 _

+ (P03(2) - P01(2)) ^ 2) ^ 0.5

Dim a1 As Double,a2 As Double,a3 As Double ''定义a1、a2、a3角度变量

Dim x1 As Double,x2 As Double,x3 As Double''中间变量

x1 = (L01 ^ 2 + L03 ^ 2 - L02 ^ 2) / (2 * L01 * L03)

x2 = (L02 ^ 2 + L01 ^ 2 - L03 ^ 2) / (2 * L02 * L01)

x3 = (L03 ^ 2 + L02 ^ 2 - L01 ^ 2) / (2 * L03 * L02)

a1 = Abs(Atn((1 - x1 ^ 2) ^ 0.5 / x1))

a2 = Abs(Atn((1 - x2 ^ 2) ^ 0.5 / x2))

a3 = Abs(Atn((1 - x3 ^ 2) ^ 0.5 / x3))

Dim P11(0 To 2) As Double ''定义P11空间点坐标变量

Dim P12(0 To 2) As Double ''定义P12空间点坐标变量

Dim P13(0 To 2) As Double ''定义P13空间点坐标变量

Dim Off As Double''定义偏移距离

Off = 2.5

P11(0) = P01(0) + Off / Sin(a1) * (P02(0) - P01(0)) / L01 _

+ Off / Sin(a1) * (P03(0) - P01(0)) / L03

P11(1) = P01(1) + Off / Sin(a1) * (P02(1) - P01(1)) / L01 _

+ Off / Sin(a1) * (P03(1) - P01(1)) / L03

P11(2) = P01(2) + Off / Sin(a1) * (P02(2) - P01(2)) / L01 _

+ Off / Sin(a1) * (P03(2) - P01(2)) / L03

P12(0) = P02(0) + Off / Sin(a2) * (P03(0) - P02(0)) / L02 _

+ Off / Sin(a2) * (P01(0) - P02(0)) / L01

P12(1) = P02(1) + Off / Sin(a2) * (P03(1) - P02(1)) / L02 _

+ Off / Sin(a2) * (P01(1) - P02(1)) / L01

P12(2) = P02(2) + Off / Sin(a2) * (P03(2) - P02(2)) / L02 _

+ Off / Sin(a2) * (P01(2) - P02(2)) / L01

P13(0) = P03(0) + Off / Sin(a3) * (P01(0) - P03(0)) / L03 _

+ Off / Sin(a3) * (P02(0) - P03(0)) / L02

P13(1) = P03(1) + Off / Sin(a3) * (P01(1) - P03(1)) / L03 _

+ Off / Sin(a3) * (P02(1) - P03(1)) / L02

P13(2) = P03(2) + Off / Sin(a3) * (P01(2) - P03(2)) / L03 _

+ Off / Sin(a3) * (P02(2) - P03(2)) / L02

''生成真实面板边线

ThisDrawing.ModelSpace.AddLine P11, P12

ThisDrawing.ModelSpace.AddLine P12, P13

ThisDrawing.ModelSpace.AddLine P13, P11

Dim L11 As Double,L12 As Double,L13 As Double ''定义真实面板边长L11、L12、L13变量

L11 = ((P11(0) - P12(0)) ^ 2 + (P11(1) - P12(1)) ^ 2_

+ (P11(2) - P12(2)) ^ 2) ^ 0.5

L12 = ((P12(0) - P13(0)) ^ 2 + (P12(1) - P13(1)) ^ 2 _

+ (P12(2) - P13(2)) ^ 2) ^ 0.5

L13 = ((P13(0) - P11(0)) ^ 2 + (P13(1) - P11(1)) ^ 2_

+ (P13(2) - P11(2)) ^ 2) ^ 0.5

''L11、L12、L13尺寸输入到Excel中

Dim XLApp As Object

On Error Resume Next

If XLApp Is Nothing Then

Set XLApp = GetObject(, "Excel.Application")

If Err 0 Then

Err.Clear

Set XLApp = CreateObject("Excel.Application")

If Err 0 Then

ThisDrawing.Utility.Prompt "不能连接Excel" + vbCrLf

Exit Sub

End If

End If

XLApp.workbooks.add

Dim XlWorksheet As Object

Set XlWorksheet = XLApp.ActiveWorkbook.Worksheets.add

XlWorksheet.Name = "面板尺寸"

XlWorksheet.Activate

XLApp.ActiveSheet.Cells(1, 1) = "编号"

XLApp.ActiveSheet.Cells(1, 2) = "L11"

XLApp.ActiveSheet.Cells(1, 3) = "L12"

XLApp.ActiveSheet.Cells(1, 4) = "L13"

End If

Err.Clear

Dim i As Integer

XLApp.ActiveSheet.Cells(i + 2, 1) = "面板" & (i + 1)

XLApp.ActiveSheet.Cells(i + 2, 2) = L11

XLApp.ActiveSheet.Cells(i + 2, 3) = L12

XLApp.ActiveSheet.Cells(i + 2, 4) = L13

i = i + 1

GoTo Repeat

EXT:

On Error Resume Next

XLApp.Visible = True

Set XLApp = Nothing

Set XlWorksheet = Nothing

End Sub

运行后,Excel文件如下图:

七、AutoCAD-VBA的使用总结

当前工程中,经常会遇到类似萧山机场T3航站楼吊顶工程的问题,工程处理的模型数据量大,时间紧张、设计人员力量又不是十分充裕。充分利用CAD软件和软件支持的二次开发技术,往往能很好的解决问题。本文中的AutoCAD-VBA技术是一种相对来说容易被工程技术人员掌握的CAD软件二次开发技术,而且该技术的功能也十分强大,适合在工程技术人员中推广使用。

参考文献:

[1]Autodesk,《ActiveX 和 VBA 开发人员手册》

[2]Autodesk,《ActiveX and VBA Reference》

[3] Microsoft,《Visual Basic 参考》

[4] 曾洪飞,张帆,卢择临 编著,《AutoCAD VBA & 开发基础与实例教程》中国电力出版社,2008年

[5] (美)marioncottingham著,《autocad vba从入门到精通》电子工业出版社 ,2001年

上一篇:手机支付在城市一卡通系统中的应用及实现研究 下一篇:单元幕墙设计问题要点及应用分析