求助:同一图块插入到文件夹内所有文件
本帖最后由 qfkxc 于 2011-9-17 18:15 编辑求助:指定图块插入到图形的指定位置的LISP程序
要求:1,将D盘中TK.DWG文件插入到已经打开的另一文件中(例如67.25-80.75.dwg),插入基点坐标根据文件名计算得到,如文件67.25-80.75.dwg,其插入的基点坐标为(67250,80750)。(根据文件名计算插入的基点是此程序的关键点)
2,ZOOM E
3,存盘退出。
本帖最后由 gufeng 于 2011-9-26 10:47 编辑
(defun c:tt (/ FILE_LIST FOLD INSERTBLOCK INSERTPOINT RUNNOW SF SFF X STRPARSE QF_GETFOLDER GETFILELIST)
(vl-load-com)
;_解析字符串
(defun StrParse (Str Delimiter / CHAR N RETURN SEARCHSTR STRINGLEN)
(setq SearchStr Str)
(setq StringLen (strlen SearchStr))
(setq return '())
(while (> StringLen 0)
(setq n 1)
(setq char (substr SearchStr 1 1))
(while (and (/= char Delimiter) (/= char ""))
(setq n (1+ n))
(setq char (substr SearchStr n 1))
)
(setq return (cons (substr SearchStr 1 (1- n)) return))
(setq return (cons (substr SearchStr (1+ n)) return))
(setq StringLen 0)
)
(reverse return)
)
;_Thanks caoyin
;_http://bbs.mjtd.com/forum.php?mod=viewthread&tid=69986&replyID=&skin=0
(defun GetFileList (dirName / files lst)
(defun path-addBackSlash (path)
(if (not (member (substr path (strlen path)) '("\\" "/")))
(strcat path "\\")
path
)
)
(setq dirName (path-addBackSlash dirName)
files (mapcar '(lambda (x) (strcat dirName x))
(vl-directory-files dirName "*.dwg" 1)
)
)
(mapcar '(lambda (x)
(setq lst (append lst (GetFileList (strcat dirName x))))
)
(vl-remove-if
'(lambda (x) (member x '("." "..")))
(vl-directory-files dirName nil -1)
)
)
(append files lst)
)
;; 本代码仅提供作为应用上的参考, 而未声明或隐含任何保证; 对于任何特殊
;; 用途之适应性, 以及商业销售所隐含作出的保证, 在此一概予以否认.
;; ========================================================
;; 作者:秋枫,参考了灯火的VBA程序
;; 用法:(qf_getFolder msg)
;; 例子:(qf_getFolder "选择文件夹:")
;; 返回值:字符串,文件夹路径,如果点了cancel, 返回nil
;; http://www.mjtd.com/Functions/ArticleShow.asp?ArticleID=302
(defun qf_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
)
)
(setq fold (qf_getFolder "选择文件所在目录:"))
(if fold
(progn
(setq file_list (GetFileList fold))
(if file_list
(progn
(setq insertblock (getfiled "选择插入的块文件" "d:\\tk.dwg" "dwg" 0))
(if (not insertblock)
(exit)
)
(setq sf (strcat (getvar "TEMPPREFIX") "批处理文件20110925.scr"))
(setq sff (open sf "w"))
(mapcar '(lambda (x)
(setq insertpoint (StrParse (vl-filename-base x) "-"))
(setq insertpoint
(strcat (rtos (* (distof (last insertpoint)) 1000) 2 0)
","
(rtos (* (distof (car insertpoint)) 1000) 2 0)
)
)
(princ (strcat "open \"" x "\"\n" "-insert " insertblock " " insertpoint " 1 1 0 zoom e qsave close\n")
sff
)
)
file_list
)
(close sff)
(princ (strcat "\n目录下" fold "\n\t共有DWG文件数: "))
(initget "Y N")
(setq RunNow (getkword "\n是否立刻执行[是(Y)/否(N)]:<否>"))
(if (= RunNow "Y")
(progn
(command "._script" sf)
(princ "\n处理完成")
)
(princ "\n放弃立刻执行")
)
)
(princ "\n目录下没有DWG文件")
)
)
(princ "\n请选择目录")
)
(princ)
)
用DBX方法解决 可否贴上源码,我是菜鸟。 期待高手来解决,最好用LISP程序 本帖最后由 qfkxc 于 2011-9-10 23:49 编辑
把同一图块插入到文件夹内每一个图形的左下角(插入基点:样图左下角圆圈内两线的交点位置,即文件名66.75-80.50变为66750,80500)
编程思路:1,打开文件夹内第一个文件
2,插入图块。选择要插入的图块,指定图块的基点为(0,0)。
3,计算插入的基点(根据打开的文件名计算)。
4,存盘退出。
5,循环操作1-4.
http://bbs.mjtd.com/thread-89419-1-1.html(princ (strcat "open \"" x "\"\n" "-insert tk.dwg " memredlist " 1 1 0 qsave close\n") sff)
;_ To
(princ (strcat "open \"" x "\"\n" "-insert tk.dwg " memredlist " 1 1 0 zoom e qsave close\n") sff) 用gufeng所写的程序需要先做一个所有文件的文本信息对吗? 现在的程序要比http://bbs.mjtd.com/thread-89419-1-1.html的更好了,剩掉了制作文本信息的步骤 能否实现把“插入块”改为“插入一个外部参照”?
毕竟外部参照不占空间,且作为大批量图纸的图框,修改起来比较方便
页:
[1]
2