明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: kevinchan

关于读取文本的紧急求助!

  [复制链接]
 楼主| 发表于 2005-3-19 11:12:00 | 显示全部楼层
怎样能把刚才导入的圆数据(半径,XY坐标)经过修改后导出到txt中呢?
发表于 2005-3-20 11:07:00 | 显示全部楼层
要将AutoCAD图形信息导入Txt文件这本不是什么难事,但楼主的问题看似容易,实际上还有许多细节需要考虑,首先,由于原Txt文件中第三个字段没有导入到AutoCAD图形文件,尽管楼主提供的Txt示例文件该字段值都是一样的,但我认为实际应用中,该字段应该与AutoCAD图形中的那些圆总是有些关系的,从AutoCAD写回Txt文件后不应破坏这种关系。另外,这些圆对象的次序在导入Txt文件的前后是否要保持一致性,这点楼主没有说明。实际工作中,Txt文件会有多大,程序是否需要考虑执行效率?写回Txt文件,若全文改写,程序编写相对容易,但执行速度不会很快,若要仅对曾经修改过的部分进行操作,写Txt文件时将需要精确的定位。


在软件工程中,总是提倡在编写代码之前尽可能小心谨慎地做好系统分析,尽管这一点确实很难做到。请楼主在阅读以下文字前务必清楚明确地回答一段文字提出的问题。(我也希望以后看到的贴子都能先做好系统分析。)毕竟,你的工作领域别人不一定熟悉。


也许,楼主的需求并不复杂。但我仍然希望尽可能地深入讨论这个问题,希望其他的网友看到这个贴子也能从中收获点什么,这样我的目的就达到了。另外,我认为授人以鱼的同时,最好能授人以渔,因此,以下的文字我不提供完整的直接能用的代码段。尽管,写这些文字之前我已经编写了这些代码。


第一个问题,如何保持Txt文件中第三个字段与AutoCAD图形之间的关系。这个问题是由于该没有写入AutoCAD图形文件引起的,解决的方法就是在Txt文件第一次导入AutoCAD时就将该字段内容一同写入。 这样在二楼(也就是明总)的程序中需要作些修改:在While循环前先声明一个AcadCircle对象:


Dim MyCir As AcadCircle


添加圆对象时这样写:


Set MyCir = Thisdrawing.ModelSpace.AddCircle(...)


然后用AcadCircle对象的SetXData方法将Txt文件中的第三个字段内容作为扩展数据写入MyCir对象。具体的编程方法请参考帮助文档中AcadCircle对象的SetXData方法和GetXData方法,同时帮助文档中还有很好的关于这两个方法的示例代码。


写回Txt文件最简便的方法是读取AutoCAD图形中所有合适的圆对象,成批地重写Txt文档(当然,效率会比较低)。读取AutoCAD图形中所有合适的圆对象,需要使用AutoCAD的选择集操作,还要使用选择集的过滤功能。这些问题,本论坛已经有过很多次讨论,另外,帮助文档中关于AcadSelectionSet对象的Select方法的很好的示例代码。


写Txt文档用Write #或Print #语句,这要查看VB的联机帮助文档。这部份编程并不困难,只是提示一下楼主,记得使用Tab()函数,使输出的Txt文档排列整齐。


第二个问题,如何保持Txt文件中对象的次序一致性。最简捷的方法是类似以上保存Txt第三个字段一样,将对象的序号也加入到圆对象中。写入时,比较好理解的排序方法是直接选择排序:


Dim id As Integer


For id = 0 To Ssel.Count - 1


         For Each MyCir In Ssel                                         'Ssel是程序中使用的选择集对象


                 MyCir.GetXData ... '获取圆对象的扩展数据,并分离出ID号


         If ID号=id Then         '在Txt写入一行


        Next MyCir


Next id


这样的排序效率不高,需要更高效的排序,可能要专门设计排序算法。


第三个问题,如何有选择性地改写Txt文档。其实,如果真的需要这样做,用Txt做外部数据保存媒质,可能不如用EXCEL或者数据库。若一定要用Txt文档(毕竟读写Txt文档兼容性好,且Txt文件比EXCEL和数据库文件小)。大概需要仔细阅读VB的联机帮助中Seek语句和Put语句,然后还需要很仔细地编程(关键是使用Seek语句精确定位)。另外,Txt文档中的那些空白是用Spc()函数还是Tab()函数产生的,可能对Seek语句还有影响。而在EXCEL文档中,我们可以使用Range()方法很容易地定位,在数据库中可以使用RecordSet记录集指针。
 楼主| 发表于 2005-3-20 14:40:00 | 显示全部楼层
谢谢楼主细心的指导.您所提的第三个字段与圆的关系:应该说是有关系的,我这个TXT文件是从一个3D绘图工具上所产生的半球体(接近),字段MaximumHeight表示它的高度,因为我需要把3D的球体转成2D的圆,由于点的数量太多,如果直接存成SAT格式的话我试过要40小时才能完成,根据明总的代码已经可以很快的将TXT导入(10个圆只需要40秒左右),由于我对编程的欠缺,再次谢谢明总的帮助! 而另一方面,因为我需要将导入CAD的圆进行修改(如直径,XYDATA等),然后再转入原来的三维软件中变成球体,也就必须再改成和原来一样的TXT文本格式,字段MaximumHeight也就同样表示它的高度。 由于自己的能力问题,不知道如何才能导出和原来一样的txt格式,我现在解决的办法是:先导出XYDATE和半径值到EXCEL里面,但格式不一样,再慢慢把EXCEL里的数据复制到TXT文本中,修改成和原来TXT一样的排列方式。但这样导致时间上缓慢了许多,却没有更好的办法。 另外我还想请教一个问题就是,我用VBA做成的下拉菜单和工具条,我在acad2005.lsp中加入了代码 (command "-vbarun" "dots.dvb!dotsdesign.NewMenuItem")
(command "-vbarun" "dots.dvb!dotsdesign.NewMenuToolbar") 让它一运行CAD就执行菜单和工具条。出现了一个问题:就是在运行CAD以后,如果我在不关闭CAD的情况下再打开或者新建一个DWG文件,就出现了一个错误,说该宏已经运行。有什么办法才能够让它只在CAD第一次运行的时候执行上面两个宏命令,而不会在打开另一个图档的时候重复执行?
 楼主| 发表于 2005-3-20 15:00:00 | 显示全部楼层
我附上原始的TXT文件。
 楼主| 发表于 2005-3-20 15:04:00 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2005-3-23 21:48:00 | 显示全部楼层
超级斑竹果然是超级!!!佩服!!!以后要多请教了!!!
发表于 2005-10-5 19:08:00 | 显示全部楼层

终于找到这入门帖了,谢谢!

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

本版积分规则

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

GMT+8, 2024-11-27 10:39 , Processed in 0.158411 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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