找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 759|回复: 2

[LISP程序]:一个制作消防光盘的工具

[复制链接]
发表于 2004-12-1 17:35:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
消防局要求建筑设计后制作消防光盘,每张图出一个dwg的r14文件,而我们大多人用acad2000,在模型空间放多张图,基于此,想到做这么一个程序,按图框做wblock到新建文件夹内,并将各文件存为r14版。下面为程序,请大家多多指教。

;;;针对于消防报审需单张图
;|使用方法:暂时限于最终出图,图框使用签字栏在右面方式,图签中应有“(注册工程盖章处)”字样
选用世界坐标系
图框外框线应为单线,不能有重线,图框大小暂时按1:100出图
图名设置为平面图或系统图、立面图、原理图
输出图形请到原图目录下查找
图形需在模型空间完成
使用ACAD命令:xdb

|;


;;;保存图层现状
(defun nowlayerstat ()
  (setq i 0)
  (repeat (vla-get-count *layers*)
    (setq
      layerstat        (append        layerstat
                        (list (vla-get-lock (vla-item *layers* i)))
                )
    )
    (vla-put-lock (vla-item *layers* i) :vlax-false)
    (setq i (1+ i))
  )
)
;;;还原图层状态
(defun oldlayerstat ()
  (setq i 0)
  (repeat (vla-get-count *layers*)
    (vla-put-lock (vla-item *layers* i) (nth i layerstat))
    (setq i (1+ i))
  )
)

;;;图框不是块时处理选择
;;;找图框选择
(defun noblockdwg ()
  (princ "请选择所有出图单位:")
  (setq        dwgselect (ssget '((1 . "(注册工程师盖章处)")))
        dwgnumber (sslength dwgselect)
  )
  (newdwgpath)
  (setq i 0)
  (repeat dwgnumber
    (setq flagtext (ssname dwgselect i))
    (setq textpoint (cdr (assoc 10 (entget flagtext))))
    (setq secondpoint (polar textpoint (* PI (/ 225 180.0)) 2000))
    (setq bolines (ssget "_C" textpoint secondpoint '((0 . "line"))))
    (setq boline (ssname bolines 0))
    (redraw boline 3)
    (setq firlinepo (cdr (assoc 10 (entget boline))))
    (setq seclinepos
           (ssget "_c"
                  (polar firlinepo 3.5 30)
                  (polar firlinepo 0.2 30)
           )
    )
    (ssdel boline seclinepos)
    (setq seclinepo (ssname seclinepos 0))
    (if        (< (cadr (setq pointtop (cdr (assoc 10 (entget seclinepo)))))
           (cadr firlinepo)
        )
      (setq pointtop (cdr (assoc 11 (entget seclinepo))))
    )
    (setq pointlod (cdr (assoc 11 (entget boline))))
    (setq startpo (cdr (assoc 10 (entget boline)))
          endpo          (cdr (assoc 11 (entget boline)))
    )
    (if        (< (car startpo) (car endpo))
      (setq selpo endpo)
      (setq selpo startpo)
    )
    (setq newdwgnamesel
           (ssget "_c"
                  selpo
                  (polar selpo (* pi (/ 120 180.0)) 15000)
                  '((0 . "text"))
           )
    )
    (setq j 0)
    (while (<= j (sslength newdwgnamesel))
      (setq newdwgname
             (cdr (assoc 1 (entget (ssname newdwgnamesel j))))
      )
      (if (wcmatch newdwgname "*平面*,*系统*,*原理*,*立面*")
        (setq j (sslength newdwgnamesel))
      )
      (setq j (1+ j))
    )
    (setq newdwgpathname (strcat newpath "\\" newdwgname ".dwg"))
    (setq selectenti (ssget "_c" pointlod pointtop))
    (setq VLXselct (vla-get-ActiveSelectionSet *activedocument*))
    (princ "\r请稍候...")
    (vla-wblock *activedocument* newdwgpathname VLXselct)
    (setq i (1+ i))
  )
)

;;;图块输出
(defun newdwgpath ()
  (setq        dwgname        (getvar "dwgname")
        dwgpath        (getvar "dwgprefix")
  )
  (setq pathadd (vl-string-trim ".dwg" dwgname))
  (setq newpath (strcat dwgpath "fire-" pathadd))
  (setq folders (vlax-Create-Object "Scripting.FileSystemObject"))
  (if (= :vlax-true
         (vlax-invoke-method folders 'FolderExists newpath)
      )
    (vlax-invoke-method
      folders
      'DeleteFolder
      newpath
      :vlax-true
    )
  )
  (vlax-invoke-method folders 'CreateFolder newpath)
)

;;;ACAD2002转为R14
(defun changver        ()
  (setq        acadpref (vla-get-opensave
                   (vla-get-preferences
                     (vla-get-application *activedocument*)
                   )
                 )
  )
  (vla-put-saveastype acadpref acR14_dwg)
  (setq filesdwgs (vl-directory-files newpath "*.dwg" 1))
  (setq i 0)
  (repeat (length filesdwgs)
    (setq filesdwg (nth i filesdwgs))
    (setq newopendwg
           (vla-open (vla-get-Documents
                       (vla-get-Application *activedocument*)
                     )
                     (strcat newpath "\\" filesdwg)
           )
    )
    (setq i (1+ i))
  )
  (setq        doccount (vla-get-count
                   (vla-get-Documents
                     (vla-get-Application *activedocument*)
                   )
                 )
  )
  (repeat (1- doccount)
    (setq closedwg (vla-item (vla-get-Documents
                               (vla-get-Application *activedocument*)
                             )
                             1
                   )
    )
    (vla-regen closedwg acActiveViewport)
    (vla-save closedwg)
    (vla-close closedwg)
  )
  (vla-put-saveastype acadpref acr15_dwg)
)

;;;主函数
(princ "\n消防报审出图命令:xdb")
(defun c:xdb ()
  (setvar "sdi" 0)
  (vl-load-com)
  (setq *acadobj*               (vlax-get-acad-object)
      *activedocument* (vla-get-activedocument *acadobj*)
      *mspace*               (vla-get-modelspace *activedocument*)
      *layers*               (vla-get-layers *activedocument*)
      layerstat               '()
   )
  (nowlayerstat)
  (noblockdwg)
  (oldlayerstat)
  (changver)
  ;;;(setq vlxselct nil)
  (setq        *acadobj* nil
        *activedocument* nil
        *mspace* nil
        *layers* nil
        layerstat nil
        i nil
        j nil
        dwgselect nil
        dwgnumber nil
        flagtext nil
        textpoint nil
        secondpoint nil
        seclinepo nil
        bolines        nil
        boline nil
        firlinepo nil
        pointtop nil
        pointlod nil
        selpo nil
        startpo        nil
        endpo nil
        newdwgnamesel nil
        newdwgname nil
        newdwgpathname nil
        activeselects nil
        selectenti nil
        VLXselct nil
        dwgname        nil
        dwgpath        nil
        pathadd        nil
        newpath        nil
        folders        nil
  filesdwg nil newopendwg nil closedwg nil doccount nil)
  (princ)
)
(defun *error* (msg)
   (princ)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2004-12-1 17:44:31 | 显示全部楼层
哦,还有本程序参考的dwg文件

高手为什么不来评点一下,看看有没有更好的方法。
1、判断图框范围
2、设定图纸名称
3、文件另存版本
4、如何让非activedocument实现zoomextents功能?
5、就象程序中用到的"Scripting.FileSystemObject",在VB中只能定义为object,但看不见任何属性等,creatobject方法还能加多少对象呀?
6、先解决上述问题吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-12-18 20:51:25 | 显示全部楼层
下一个批量转换的软件
到"小工具"去找

另一贴我删了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-27 17:33 , Processed in 0.159441 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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