Firebat 发表于 2004-1-4 19:14:00

如何把某一文件夹下的所有DWG文件自动转换为DXF文件,用lisp怎样实现?

如题

meflying 发表于 2004-1-5 08:43:00

VLISP的,这个是要在程序中打开文件并自动关闭。如果要不打开文件,则会复杂些。。。

(vl-load-com)
;函数:GetFolder
;功能:调用Windows通用目录选取对话框,返回选中路径
;参数: msg-对话框提示字符串

(defun GetFolder (msg / WinShell shFolder path catchit)
(vl-load-com)
(setq winshell (vlax-create-object "Shell.Application"))
(setq
    shFolder (vlax-invoke-method WinShell 'BrowseForFolder 0 msg 1)
)
(setq
    catchit (vl-catch-all-apply
              '(lambda ()
               (setq shFolder (vlax-get-property shFolder 'self))
               (setq path (vlax-get-property shFolder 'path))
             )
          )
)
(if (vl-catch-all-error-p catchit)
    nil
    path
)
)

(defun c:Tran( / Docs doc files file path i sset)
(setq Docs (vla-get-documents (vlax-get-acad-object)))
(setq path (GetFolder "选择文件夹"))
(setq files (vl-directory-files path "*.dwg" 1))
(setq sset (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))
(setq i 0)
(repeat (length files)
    (setq file (nth i files))
    (setq doc (vla-open docs (strcat path "\\" file)))
    (vla-export doc (strcat path "\\" file) "DXF" sset)
    (vla-close doc)
    (vlax-release-object doc)
    (setq i (1+ i))
)
(vlax-release-object sset)
(vlax-release-object docs)
(princ)
)

Firebat 发表于 2004-1-5 20:40:00

非常感谢meflying超级版主的解答,谢谢了.

deepmoon 发表于 2004-1-6 14:46:00

to MeFlying:
看了你的程式,開究了一下VL,請教些問題.
可以用VL控制用vla-open打開的圖檔的行為嗎?如視圖控制,圖層控制等.
好象用vla-open,再用vla-activate,程式就停住了.
另可不可以用VL不打開圖檔,即不顯示圖形,只查尋圖形數據庫內的東西.

meflying 发表于 2004-1-6 15:27:00

我用的就是vla-open啊
你不能使用vla-activate,必须使用activeX直接去访问它。
如果不打开图形,要用ObjectDBX,等我做一下

meflying 发表于 2004-1-6 16:06:00


(vl-load-com)
;函数:GetFolder
;功能:调用Windows通用目录选取对话框,返回选中路径
;参数: msg-对话框提示字符串
(defun GetFolder (msg / WinShell shFolder path catchit)
(vl-load-com)
(setq winshell (vlax-create-object "Shell.Application"))
(setq
    shFolder (vlax-invoke-method WinShell 'BrowseForFolder 0 msg 1)
)
(setq
    catchit (vl-catch-all-apply
              '(lambda ()
               (setq shFolder (vlax-get-property shFolder 'self))
               (setq path (vlax-get-property shFolder 'path))
             )
          )
)
(if (vl-catch-all-error-p catchit)
    nil
    path
)
)

(defun REGISTEROBJECTDBX (/ DBXSERVER)        ;by Tony Tanzillo
(cond
    ((vl-registry-read
       "HKEY_CLASSES_ROOT\\ObjectDBX.AxDbDocument\\CLSID"
   )
    )
    ((not (setq DBXSERVER (findfile "AxDb15.dll")))
   (alert "Error: Can't locate ObjectDBX Library (AxDb15.dll)")
    )
    (t
   (startapp "regsvr32.exe" (strcat "/s \"" DBXSERVER "\""))
   (or
       (vl-registry-read
       "HKEY_CLASSES_ROOT\\ObjectDBX.AxDbDocument\\CLSID"
       )
       (alert
       "Error: Failed to register ObjectDBX ActiveX services."
       )
   )
    )
)
)

(defun Main(DOC DwgName sset / App DOC DBXDOC NAME1)
(if (= "15" (substr (getvar "acadver") 1 2))
    (progn
      (if (not (REGISTEROBJECTDBX))
        (exit)       
      )
      (setq
        DBXDOC (vla-getinterfaceobject APP "ObjectDBX.AxDbDocument")
      )
    )
    (setq
      DBXDOC (vla-getinterfaceobject (vlax-get-acad-object) "ObjectDBX.AxDbDocument.16")
    )
)
(setq NAME1 (strcat (getvar "dwgprefix") (getvar "dwgname")))
(if (= NAME1 DwgName)
    (Wl-DXFOut DOC DwgName sset nil)
    (Wl-DXFOut DBXDOC DwgName sset t)
)
(vlax-release-object DBXDOC)
)

(defun Wl-DXFOut(DOC filename sset flags / )
(if Flags
    (progn
      (vla-open DOC filename)
      (vlax-invoke-method DOC 'DXFOut (strcat (substr filename 1 (- (strlen filename) 4)) ".dxf"))
    )
    (vla-export DOC (substr filename 1 (- (strlen filename) 4)) "DXF" sset)
)

)

(defun c:Tran( / Docs doc files file path i sset)
(setq Doc (vla-get-activedocument (vlax-get-acad-object)))
(setq path (GetFolder "选择文件夹"))
(if (not path)
    (exit)
)
(setq files (vl-directory-files path "*.dwg" 1))
(setq sset (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))
(setq i 0)
(repeat (length files)
    (setq file (nth i files))
    (main Doc (strcat path "\\" file) sset)
    (setq i (1+ i))
)
(vlax-release-object sset)
(vlax-release-object doc)
(princ)
)

deepmoon 发表于 2004-1-6 16:40:00

呵呵,你真快,多謝多謝.
看來我又得在DBX方面補補課了!

wb0815 发表于 2004-1-6 19:02:00

报告斑竹好像不太好使呀

meflying 发表于 2004-1-6 22:00:00

这说明程序好使,这个错误是程序控制的出错信息。
可能你的CA安装不完全,我在2004和2000下都试了,还有98系统下的...
不过98下的对话框不好使,可以改用别的方法

jxphklibin 发表于 2009-3-20 17:07:00

<strong><font color="#ff0000">meflying,强!!!</font></strong>
页: [1] 2
查看完整版本: 如何把某一文件夹下的所有DWG文件自动转换为DXF文件,用lisp怎样实现?