karence 发表于 2007-2-10 10:02:00

从虚拟文件到cad的高难度问题

<p>这是一个虚拟文件(vrml),可以使用文本文件打开。图形是一个飞行器</p><p></p><p>&nbsp;</p><p>我希望能在cad中做到以下几项:</p><p>1、设置一个按钮点击后弹出一个打开文本的对话框,选择.wrl格式的文件(这个比较简单,我用易语言和vb都可以很简单的做到)</p><p>2、自动查找到这一部分开始绘制#err1后再开始绘制#err2直至最后一个[图形1]<br/>============================<br/>405&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;coord Coordinate {<br/>406&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point [ <br/>407&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# err 1<br/>408&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-2500.00 5.33 859.18, <br/>409&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-2500.00 -0.76 805.89, <br/>410&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-2500.00 -17.31 681.64, <br/>.......<br/>=============================</p><p>3、将所有的#err之间连接成surface,[图形2]<br/>==================================<br/>34&nbsp;&nbsp;&nbsp;# Canopy<br/>35&nbsp;&nbsp;&nbsp;Shape {<br/>36&nbsp;&nbsp;&nbsp;&nbsp;geometry IndexedFaceSet {<br/>37&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;coordIndex [<br/>38&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# err 1<br/>39&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,&nbsp;&nbsp;&nbsp; 40&nbsp;&nbsp;&nbsp; 32,&nbsp;33, 34, 35, 36, 37, 38, 39, 40, 41, 42, -1<br/>41&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;42, 41, 40, 39, 38, 37,<br/>========================================</p><p>是否有人可以做到?</p><p>恳请大家帮忙,我的cad不太懂,公司要求在cad中做</p><p>你也可以留下qq 或email 我们今天放假,年后我就会联系,</p><p>你也可以将代码发送到我的邮箱:barque-123@163.com 谢谢大家</p>

karence 发表于 2007-2-10 10:06:00

本帖最后由 作者 于 2007-2-10 10:13:21 编辑 <br /><br /> <p>也可以用vb实现,但cad中只需要点一个按钮就执行完成</p><p></p><p>***所有行数都不固定,但文字是固定的,如:</p><p>&nbsp;&nbsp;&nbsp;# Canopy<br/>&nbsp;&nbsp;&nbsp;Shape {<br/>&nbsp;&nbsp;&nbsp;&nbsp;geometry IndexedFaceSet {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;coordIndex [</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;coord Coordinate {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point [ </p><p># err&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个就会有重复出现</p>

spshchen 发表于 2007-2-12 00:39:00

<p>如果你能把 这个文件 解析为 2个坐标为一组的线,颜色,那么交给CAD就很好处理了,或者你把VB的代码那出来看看。因为你的 文件格式大家不理解。156558475</p>

karence 发表于 2007-2-25 09:26:00

本帖最后由 作者 于 2007-2-25 16:17:15 编辑 <br /><br /> <p>我已经用另一个程序(易语言)将所有的内容改写成命令模式,在rhino(犀牛)中用读入命令文本即可自动执行所有命令</p><p>=====类似于这样=====</p><p>line 0,0 100,100&nbsp; <br/>line 300,200 400,500&nbsp; <br/>pline 0,70 400,200 300,460&nbsp; </p><p>============<br/>希望大家帮我实现:<br/><font color="#0033ff">我想在autocad中实现:当打开一个特定(指定的)dwg文件时自动读入某个文件夹某个文本内的命令并执行,而且整个过程不需要手动执行任何命令或点击。(文本大约20kb,2000行以上)</font></p><p>我正在考虑用宏来执行(考虑中...),请大家指点</p>

karence 发表于 2007-2-27 14:45:00

<p>仍然没有解决!</p><p>期待大家帮助...</p>

fools 发表于 2007-2-27 16:02:00

本帖最后由 作者 于 2007-2-27 16:30:02 编辑

假设文件名为abc.txt,内容如下:
line 0,0 100,100
line 300,200 400,500
pline 0,70 400,200 300,460
代码如下即可

(DEFUN c:tmp (/ FILE LINE)
(SETQ file (OPEN "c://abc.txt" "r"));可改改文件路径及名称
(WHILE (SETQ line (READ-LINE file))
    (apply 'command (std-strtok line " "))
    (command "")
)
(CLOSE file)
)
(DEFUN STD-STRTOK (s delims / len s1 i c lst)
(SETQ delims (vl-string->list delims)
len    (STRLEN s)
s1   ""
i      (1+ len)
)
(WHILE (> (SETQ i (1- i)) 0)
    (SETQ c (SUBSTR s i 1))
    (IF (MEMBER (ASCII c) delims)
      (IF (/= s1 "")   ; no null tokens
(SETQ lst (CONS s1 lst)
       s1""
)
      )
      (SETQ s1 (STRCAT c s1))
    )
)
(IF (/= s1 "")
    (CONS s1 lst)   ; no ("" "1" "2")!
    lst
)
)
这里只是教你一个方法,如果可以,你最好把那个2000行的文本上传,这样程序可以写的更有针对性
其实lisp要实现你的要求一点也不高难度,呵呵

karence 发表于 2007-2-27 16:39:00

<p>非常谢谢<strong><font face="Verdana" color="#61b713">fools</font></strong> 的帮助,但是我想要的是当我打开34839893.dwg这个文件时,程序便自动执行<font color="#ff00ff">c://abc.txt"这个文本内的命令</font></p><p>当打开其他的.dwg文件时则一切同正常</p>

fools 发表于 2007-2-27 17:25:00

还是讲方法,实现自动加载的方法有很多,以最常用的acad.lsp为例
1.将ACADLSPASDOC值设为1,为了保证每次打开图形的时候都会执行acad.lsp
2.将下面的代码加入到acad.lsp的末尾

(DEFUN tmp (/ FILE LINE)
(SETQ file (OPEN "c://abc.txt" "r")) ;可修改文件路径及名称
(WHILE (SETQ line (READ-LINE file))
    (APPLY 'COMMAND (std-strtok line " "))
    (COMMAND "")
)
(CLOSE file)
)
(DEFUN STD-STRTOK (s delims / len s1 i c lst)
(SETQ delims (VL-STRING->LIST delims)
len    (STRLEN s)
s1   ""
i      (1+ len)
)
(WHILE (> (SETQ i (1- i)) 0)
    (SETQ c (SUBSTR s i 1))
    (IF (MEMBER (ASCII c) delims)
      (IF (/= s1 "")   ; no null tokens
(SETQ lst (CONS s1 lst)
       s1""
)
      )
      (SETQ s1 (STRCAT c s1))
    )
)
(IF (/= s1 "")
    (CONS s1 lst)   ; no ("" "1" "2")!
    lst
)
)
(IF (EQUAL (STRCASE (GETVAR "dwgname")) "34839893.DWG")
(tmp)
)
注意最后增加了一行,这只是示例,实际应用时,你不一定要这样写,
比如,你可以先将所有希望操作dwg和txt同名,然后程序自动找同名字的txt,然后执行

karence 发表于 2007-2-28 10:33:00

<p>总是不对,有点问题:因为文本第一行开始就是命令</p><p>附上文本,请<strong><font face="Verdana" color="#61b713">fools</font></strong>继续帮助</p>

fools 发表于 2007-2-28 12:09:00

本帖最后由 作者 于 2007-2-28 12:16:25 编辑

因为你提供的文本文件格式变了,所以代码要做调整,如下:
注意:你提供的文件123.txt,第二行的0要去掉.

(DEFUN c:tmp (/ file lines line)
(SETQ file (OPEN "c:/123.txt" "r"))
(SETQ lines nil)
(WHILE (SETQ line (READ-LINE file))
    (SETQ lines (CONS line lines))
)
(APPLY 'COMMAND (REVERSE lines))
(command "")
(close file)
)
这个程序只是示例,未加任何错误判断,执行后效果如下:
页: [1] 2
查看完整版本: 从虚拟文件到cad的高难度问题