乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 171|回复: 4

HELP! 如何让LISP打开图形文件?

[复制链接]

1

主题

3

帖子

1

银币

初来乍到

Rank: 1

铜币
7
发表于 2002-7-13 00:11:00 | 显示全部楼层 |阅读模式
有一套图纸(几十份),完成后需要修改,每份修改内容相同。怎样才能用LISP自动打开、修改、保存呢?已经完成修改,可保存,可关闭,但如何自动打开下一份图纸?用(command "open")好象不认啊?
回复

使用道具 举报

1

主题

3

帖子

1

银币

初来乍到

Rank: 1

铜币
7
发表于 2002-7-15 16:18:00 | 显示全部楼层

VISUAL LISP类的书很难找到,特别是象俺所在这么偏僻的地方。请问哪儿可以买到呢?或者可以邮寄?
回复

使用道具 举报

22

主题

248

帖子

10

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
336
发表于 2002-7-14 06:34:00 | 显示全部楼层
5.16  怎样在一个程序中处理多个图形文件
用专业设计程序,完全摆脱操作者的介入,自动、顺序生成全套图形文件,是任何专业 CAD 系统的基本要求之一。虽然在AutoCAD2000之后又添加了多图档控制,但是由于 VLISP是依附于加载时的图档空间,对另外的图档的操作仅提供了相当有限的支持,无法完成上述任务。
实际上,AutoCAD的设计中心功能是一个极好的工程数据管理机制。十分可惜的是,至今没有发现一种方法,能够由专业程序接近和使用设计中心。所以,在生成多个图形文件的操作中,设计资源(某专业的图块集、各种标注标准等)的使用,也只好沿用以前的,插入这个图形的方法。
实际上,2000以后的“纸空间布局”也是一种相当有趣的功能,可能使我们在二维设计中,装配图和相关零件图能够比较自动地关联起来。但是由于零件图附加图线、零件附加标注等问题,这个功能目前也很难在专业设计程序中使用起来。
下面是一个模拟程序,表明了一种比较可靠的,但是比较笨拙的方法,实现上述技术要求方法 (T510.LSP):
(Defun ISave (iname)
       (SetVar "filedia" 0)
       (Command "saveas" "2000" iname
                         (If (FindFile (StrCat iname ".dwg"))
                                   "y"
                              )
       )
       (SetVar "filedia" 1)
       (Command "erase" "all" "")
)
(Defun IOpen (iname)
       (SetVar "filedia" 0)
       (SetQ sf (Open "iopen.scr" "w"))
       (ForEach sn iname (Write-Line (StrCat "open " sn) sf))
       (Close sf)
       (Command "script" "iopen")
       (SetVar "filedia" 1)
)
(Defun C:TDD ()
       (Command "circle" '(10 10) 10
                "circle" '(100 50) 20
       )
       (ISave "tdd01")
       (Command "insert" "*TDD-A3" '(0 0) "" ""
                "rectang" '(5 5) '(100 30)
                "rectang" '(50 50) '(120 90)
       )
       (ISave "tdd02")
       (Command "circle" '(50 50) 30
                "rectang" '(50 50) '(120 90)
       )
       (ISave "tdd03")
       (Command "oops")
       (IOpen '("TDD01" "TDD02"))
)
(1)关于 (ISave) 函数
关闭 filedia 系统变量,是因为程序不能给对话框填充响应,必须将命令的响应放在命令行中进行。
(If (FindFile (StrCat iname ".dwg"))"y")
是为了在文件已存在的条件下,仍然能顺利完成存盘。
存盘之后删除所有的图线,是为新图形生成准备条件。可见,这样生成的图会存在一些垃圾,最后应当进行必要的清理(Purge)。
(2)关于 (IOpen) 函数
在应用程序中,可能生成了许多图形文件。利用 AutoCAD 的多图档功能,可以把它们全部打开,进行最后的校对(实际上,对于成熟的专业设计程序生成的图形,没有必要进行校对)。
(3)图形生成模拟程序
完全模拟交互操作的过程。一看就明白。注意:如果有专业实际需要的块、线形、字体、层等等,应当设置在一个专业设计模版中,在最一开始新图时,使用这个模版。
        从这个程序中可以看出,实际上我们没有真正使用AutoCAD2000之后的多图档功能,根本原因在于VLISP是按照图档加载,而不是按照进程加载。在VLISP这个档次的程序设计中,要想真正实现多图档操作,需要有一个“按进程加载”的管理者。这个管理者就是一个古老的开发方法——脚本文件。
        脚本文件的有效范围可以跨越多个图档,甚至从AutoCAD进程启动的时候就开始起作用(祥见启动快捷方式中的 /b 参数)。另外,SCR文件可以顺利执行VLISP表达式,设置进行自动化的程序加载和运行。这样,就可以让SCR充当司令员,VLISP充当执行者,完成多个图形文件的生成操作。例如下面的模拟程序:
open "00"
(alert "00.DWG")
open "01"
(Alert "01.DWG")
new "abc"
(Alert "New file...")
        其中,00.DWG、01.DWG是带有图框和固定图形的“哑图”,Open之后执行相关的VLISP程序,填写其它的内容。笔者认为,这是一种比较好的实用技术方法。简单而有效。如果对于各个图文件之间有设计数据的传递要求,用自定义数据结构的中间数据文件,可能会得到简单而可靠的效果。
        另外一种批量处理图形的要求,是“清理”、“执行标准”之类的,再已有DWG基础上的再修饰。下面是一个“清理”功能程序 (T510a.LSP)
(Defun C:IPurge (/ ifdire iflist ifnumb ifdwgl ifatom Check)
       (Defun *Error* (est)
                              (SetQ *error* nil)
                              (SetVar "filedia" 1)
                              (PrinC est)(PrinC)
       )
       (Defun Check (cfname / ck cn catom)
                              (SetQ ck T
                                              cn 1
              )
                              (Repeat (StrLen cfname)
                                              (SetQ catom (SubStr cfname cn 1))
                                              (If (Or (= "." catom)
                                                             (= "~" catom)
                                                          )
                                                          (SetQ ck nil)
                                              )
                                              (SetQ cn (1+ cn))
                              )
                              (If (Not ck)
                                           (Alert (StrCat "\n这个文件名含有无效字符: " cfname))
                              )
                             ck
       )
       (SetQ ifdire (GetString "\n要清理的DWG文件所在路径: "))
       (SetQ iflist (VL-Directory-Files ifdire))
       (If (Not iflist)
                             (Progn (Alert "没找到指定的路径...") (Exit))
       )
       (SetQ iflist (Cdr (Cdr iflist)))
       (SetQ ifnumb 0
                             ifdwgl '()
       )
       (Repeat (Length iflist)
                                 (SetQ ifatom (Nth ifnumb iflist))
                                 (If (= ".dwg" (VL-FileName-Extension ifatom))
                                             (If (Check (VL-FileName-Base ifatom))
                                                   (SetQ ifdwgl
(Cons (VL-FileName-Base ifatom) ifdwgl)
)
                                             )
                                 )
                                (SetQ ifnumb (1+ ifnumb))
       )
       (SetQ ifnumb 0)
       (SetVar "filedia" 0)(SetVar "cmdecho" 0)
       (Repeat (Length ifdwgl)
                                 (SetQ ifdwgn (StrCat ifdire "\\" (Nth ifnumb ifdwgl)))
                                 (Alert ifdwgn)
                                 (Command "insert" ifdwgn '(0 0) 1 1 0
                                                        "zoom" "e"
                                                        "explode" "l" ""
                                                        "purge" "a" "" "n"
                                                        "save" ifdwgn "y"
                                               "erase" "all" ""
                               )
                               (SetQ ifnumb (1+ ifnumb))
       )
       (SetVar "filedia" 1)(SetVar "cmdecho" 1)
       (SetQ *error* nil)
       (PrinC)
)
         
        点评:
1〉        这个程序先是筛选指定路径下所有的DWG文件,成为操作文件名表ifdwgl
2〉        之后,逐个文件按照:插入-〉全显示-〉分解-〉清理-〉回存-〉删除全部对象… 这样的过程完成所有图形的清理
3〉        但是,如果处理多达几百个文件,系统内存会消耗殆尽,速度也会下降。这是AutoCAD自身内存控制的一种弱点。因此,一次处理的文件数量不要多于100个。如果有许多文件要处理,可放在不同的路径下,每路径不多于100个文件,这样,在256兆内存的条件下,运行效率可以接受。
回复

使用道具 举报

22

主题

248

帖子

10

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
336
发表于 2002-7-16 08:34:00 | 显示全部楼层
《Visual LISP for AutoCAD2002程序设计...》尚未开印。
回复

使用道具 举报

20

主题

653

帖子

15

银币

中流砥柱

Rank: 25

铜币
733
发表于 2002-7-16 11:57:00 | 显示全部楼层
上次我在书城看到过有>,不知道现在还有没有
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-5-25 07:01 , Processed in 1.795542 second(s), 62 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表