kevinchan 发表于 2005-3-19 11:12:00

怎样能把刚才导入的圆数据(半径,XY坐标)经过修改后导出到txt中呢?

leeyeafu 发表于 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记录集指针。

kevinchan 发表于 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")<BR>(command "-vbarun" "dots.dvb!dotsdesign.NewMenuToolbar")


让它一运行CAD就执行菜单和工具条。出现了一个问题:就是在运行CAD以后,如果我在不关闭CAD的情况下再打开或者新建一个DWG文件,就出现了一个错误,说该宏已经运行。有什么办法才能够让它只在CAD第一次运行的时候执行上面两个宏命令,而不会在打开另一个图档的时候重复执行?

kevinchan 发表于 2005-3-20 15:00:00

我附上原始的TXT文件。

kevinchan 发表于 2005-3-20 15:04:00

lhlqq 发表于 2005-3-23 21:48:00

超级斑竹果然是超级!!!佩服!!!以后要多请教了!!!

mark0717 发表于 2005-10-5 19:08:00

<P>终于找到这入门帖了,谢谢!</P>
页: 1 [2]
查看完整版本: 关于读取文本的紧急求助!