明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1488|回复: 0

第三章利用Excel的VBA,通过CADdxf文件格式,把Excel数据表与AutoCAD,LT图内的数据连

[复制链接]
发表于 2009-5-1 09:34:00 | 显示全部楼层 |阅读模式
第三章利用Excel的VBA,通过CADdxf文件格式,把Excel数据表与AutoCAD,LT图内的数据连接起来[br]

2009/04/29本人发表了” 利用Excel的VBA,通过CADdxf文件格式,把Excel数据表与AutoCAD,LT图内的数据连接起来.”的系统构思说明文章.

现在再就软件包的代码编制进行说明.

第三章

2.      dxf文件的读写以及ProcessFile.dxf的生成 (本文仅仅给出关键语句)

ü          Sub ExcelSendtoCAD()

ü          Mypass = ActiveWorkbook.Path ’(Excel文件所在位置检出. 建议: D:\AutoDrawing)

ü          Kill (Mypass & "\" & "ProcessFile.dxf") ’(删除上次的 ProcessFile.dxf, ProcessFile)

ProcessFile.dxf是程序私用的自生成文件.它用来承载dxf传来的,经过逐句推敲的所有字符串.当整个程序结束以后,它就是一页CADdxf图.然后用AutoCAD打开它,根据图纸目录,别名保存为*.dwg文件, ProcessFile.dxf的使命就结束了.它应该随即被删除.因为相关的语句[Open Mypass & "\" & "ProcessFile.dxf" For Append As #2],只有在当前位置不存在ProcessFile.dxf时,才自动新建一个ProcessFile.dxf,而如果前次的ProcessFile.dxf没有来得及删除,它就会被打开使用,这样就发生了前后两张图混杂的糟糕文件.那么为什么不在前次程序结束时删除它呢?这是因为程序的后半部分是启动AutoCAD,而它又必须在CAD用过以后才允许删除,而windows focus 一旦转给了AutoCAD,就很难再回到VBA解决删除它.所以删除它就放在了下次的开头.好在kill()这个命令有容错功能,即使删除对象不存在也没事.

ü          略(CADdxf图纸目录逐次装入)(Put 001.dxf,002.dxf,…100.dxf in UserForm1.TextBox1 at every time)

ü          Open UserForm1.TextBox1.Value For Input As #1 'read ***.dxf file with txt(读操作文件的准备)

ü          Open Mypass & "\" & "ProcessFile.dxf" For Append As #2

'Write every letter of ***.dxf into ProcessFile.dxf and edit the attributes while reading/writing

(写操作文件的准备)

ü          Do Until TextWord1 = "EOF" ‘外层,监视dxf的终了行

Ø         Do Until TextWord1 = "ATTRIB"‘内层1, 监视dxf的属性变量入口

²         Line Input #1, TextWord1‘#1是***.dxf,读到什么

²         Print #2, TextWord1‘#2是ProcessFile.dxf,就写进什么

²         If TextWord1 = "EOF" Then GoTo Line1‘遇到结束行就转到dxf访问终了处理

²         If TextWord1 = "SEQEND" Then‘遇到No.1模块结束行, 次外层内清零处理,寻找No.2模块"ATTRIB"

Ø         Loop‘内层1返回, 监视dxf的属性变量入口

Ø         Do Until TextWord1 = "AcDbText"‘内层2, 监视属性题字信息入口行

²         Line Input #1, TextWord1‘读到什么

²         Print #2, TextWord1‘就写进什么

Ø         Loop‘‘内层2返回, 监视属性题字信息入口行

Ø         Do Until LineCounter = 9‘内层3,十行计数层

²         LineCounter = LineCounter + 1‘行数加1

²         Line Input #1, TextWord1‘读到什么

²         Print #2, TextWord1‘就写进什么

Ø         Loop‘内层3返回, 十行计数层

Ø         Line Input #1, TextWord1‘

‘此时读出的TextWord1,就是属性值,如果是首次读到,就是第一个属性值ID.

拿着这个ID,到Excel文件读写sheet的对应页里,寻找相应的ID,并把光标移到该格子上.随后的属性值,都在这一行的相应列上.为什么要校对ID行呢?因为dxf文件是按句柄的大小排序的,最先遇到的模块,不一定是No.1模块.如果dxf文件的模块ID有重号,那它们就会读到sheet同一行的属性值. 如果dxf属性模块ID是0,或者在读写sheet里不存在,程序就会出错,需要出错处理.这部分内容本文省略了.

接下来的程序是dxf属性值检出带动Excel读写sheet光标移动的操作. 如前所述, dxf模块定义了59个变量(本文的例),它对应于读写sheet59.实际上在某一张图里,大部分属性值是空白,之所以这样是因为59个变量对应了全部CAD图,这张图用不到的变量,那张图会用到.所以如何处理此时的TextWord1,需要做些约定.请参考如下语句,理解这样的逻辑安排;

1.      Excel读写sheetà dxf图的数据传送操作时:

Ø       If TextWord1 <> " " and TextWord1 <> ActiveCell.value then

Ø       TextWord1 = ActiveCell.value

Ø       ActiveCell.Offset (0, 1).select‘右移格操作

Ø       End if

‘如果dxf图的属性值不空白,而且不如Excel读写sheet,则TextWord1被改写,用如下语句传送给ProcessFile.dxf

Ø         Print #2, TextWord1‘写进ProcessFile.dxf

2. dxfàExcel读写sheet的数据传送操作时:

Ø         If TextWord1 <> " " and TextWord1 <> ActiveCell.value then ActiveCell.value = TextWord1

‘如果dxf图的属性值不空白,而且比Excel读写sheet更新,则读写sheet格被改写.根本不需要ProcessFile.dxf.

ü          Loop‘外层返回,监视dxf的终了行

ü          Close #1‘关闭#1 这两条语句很重要,如果没被执行,下次操作就会死掉.

ü          Close #2‘关闭#2 在系统测试时,中途人为终止;或连续作图操作时,中途AutoCAD死掉等情况下,它们很可能没有被执行.

ü          Call OpenCADProcessFile

ü          End sub

以上是对dxf文件读写处理程序的重点叙述,实际代码是配合Excel侧的关连操作,周密地实现以上逻辑.包括步进计数,多元函数一括读写等技巧.Excel与AutoDAD之间数据交换的操作,以ProcessFile.dxf完整被作出为止,实际上已经实现目的了.接下来的操作是启动CAD,打开ProcessFile.dxf,用别名保存为CADdwg就好了.

另外,对于dxfàExcel的操作, dxf图的新信息直接写到Excel读写sheet上,根本不需要ProcessFile.dxf.随后的操作是把读写sheet的内容,再回存到统一数据库sheet里,这纯粹是一个Excel内部各个sheet间的操作,难度不大,本文省略了.

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-23 19:16 , Processed in 0.183286 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表