偏爱云~小吴 发表于 2013-12-4 20:24:04

求一可以以图框为单位对CAD内若干图分割另存为每个CAD一张的模式


现在的困惑是CAD内有若干A4图幅的图,由于过多导致打开非常非常的慢,基本上超过了4MB,所以求一可以分割另存的程序。
图框未A4的块。另外另存时命名也是问题,图内的名称基本是AA-BB的形式,可以另存的是读取该名称进行另存。
请大侠。

菜卷鱼 发表于 2013-12-4 20:28:31

把你图框发给我看看,我正好搞了一个程序,应该稍微改一下你就能用了

edata 发表于 2013-12-4 20:42:27

不知道你用没有用过秋枫 的bplot批量打印。可以实现这个。

flyfox1047 发表于 2013-12-4 21:07:29

本帖最后由 flyfox1047 于 2013-12-7 21:53 编辑

试试LEEMAC的程序:

(defun c:c2dwg ( / *error* _getitem acd app dbx doc dwl inc lst sel tab var vrs )

    (defun *error* ( msg )
      (if (and (= 'vla-object (type dbx)) (not (vlax-object-released-p dbx)))
            (vlax-release-object dbx)
      )   
      (if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
            (princ (strcat "\nError: " msg))
      )
      (princ)
    )

    (defun _getitem ( col itm )
      (if (not (vl-catch-all-error-p (setq itm (vl-catch-all-apply 'vla-item (list col itm)))))
            itm
      )
    )

    (setq app (vlax-get-acad-object)
          acd (vla-get-activedocument app)
          tab (if (= 1 (getvar 'cvport)) (getvar 'ctab) "Model")
    )
    (cond
      (   (not
                (and
                  (setq sel (ssget (list '(0 . "~VIEWPORT") (cons 410 tab))))
                  (setq lst (LM:GetFiles "Select Drawings to Copy to" "" "dwg;dwt;dws"))
                )
            )
            (princ "\n*Cancel*")
      )
      (   (progn
                (setq dbx
                  (vl-catch-all-apply 'vla-getinterfaceobject
                        (list (setq app (vlax-get-acad-object))
                            (if (< (setq vrs (atoi (getvar 'acadver))) 16)
                              "objectdbx.axdbdocument" (strcat "objectdbx.axdbdocument." (itoa vrs))
                            )
                        )
                  )
                )
                (or (null dbx) (vl-catch-all-error-p dbx))
            )
            (prompt "\nUnable to interface with ObjectDBX.")
      )
      (   t
            (vlax-for doc (vla-get-documents app)
                (setq dwl (cons (cons (strcase (vla-get-fullname doc)) doc) dwl))
            )
            (repeat (setq inc (sslength sel))
                (setq var (cons (vlax-ename->vla-object (ssname sel (setq inc (1- inc)))) var))
            )
            (setq var
                (vlax-make-variant
                  (vlax-safearray-fill
                        (vlax-make-safearray vlax-vbobject (cons 0 (1- (length var)))) var
                  )
                )
            )
            (foreach dwg lst
                (if
                  (or (setq doc (cdr (assoc (strcase dwg) dwl)))
                        (and (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-open (list dbx dwg))))
                           (setq doc dbx)
                        )
                  )
                  (progn
                        (vla-copyobjects acd var
                            (vla-get-block
                              (cond
                                    (   (_getitem (vla-get-layouts doc) tab))
                                    (   (vla-add(vla-get-layouts doc) tab))
                              )
                            )
                        )
                        (vla-saveas doc dwg)
                  )
                  (princ (apply 'strcat (cons "\nUnable to interface with file: " (cdr (fnsplitl dwg)))))
                )
            )
            (princ
                (strcat "\n"
                  (itoa (sslength sel))
                  (if (= 1 (sslength sel))
                        " object"
                        " objects"
                  )
                  " copied to " (itoa (length lst))
                  (if (= 1 (length lst))
                        " drawing."
                        " drawings."
                  )
                )
            )
            (if (= 'vla-object (type dbx))
                (vlax-release-object dbx)
            )
      )
    )
    (princ)
)

(defun LM:GetFiles ( title default ext / *error* dch dcl des dir dirdata lst rtn )

    (defun *error* ( msg )
      (if (= 'file (type des))
            (close des)
      )
      (if (and (= 'int (type dch)) (< 0 dch))
            (unload_dialog dch)
      )
      (if (and (= 'str (type dcl)) (findfile dcl))
            (vl-file-delete dcl)
      )
      (if (and msg (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*")))
            (princ (strcat "\nError: " msg))
      )
      (princ)
    )   
   
    (if
      (and
            (setq dcl (vl-filename-mktemp nil nil ".dcl"))
            (setq des (open dcl "w"))
            (progn
                (foreach x
                   '(
                        "lst : list_box"
                        "{"
                        "    width = 40.0;"
                        "    height = 20.0;"
                        "    fixed_width = true;"
                        "    fixed_height = true;"
                        "    alignment = centered;"
                        "    multiple_select = true;"
                        "}"
                        ""
                        "but : button"
                        "{"
                        "    width = 20.0;"
                        "    height = 1.8;"
                        "    fixed_width = true;"
                        "    fixed_height = true;"
                        "    alignment = centered;"
                        "}"
                        ""
                        "getfiles : dialog"
                        "{"
                        "    key = \"title\"; spacer;"
                        "    : row"
                        "    {"
                        "      alignment = centered;"
                        "      : edit_box { key = \"dir\"; label = \"Folder:\"; }"
                        "      : button"
                        "      {"
                        "            key = \"brw\";"
                        "            label = \"Browse\";"
                        "            fixed_width = true;"
                        "      }"
                        "    }"
                        "    spacer;"
                        "    : row"
                        "    {"
                        "      : column"
                        "      {"
                        "            : lst { key = \"box1\"; }"
                        "            : but { key = \"add\" ; label = \"Add Files\"; }"
                        "      }"
                        "      : column {"
                        "            : lst { key = \"box2\"; }"
                        "            : but { key = \"del\" ; label = \"Remove Files\"; }"
                        "      }"
                        "    }"
                        "    spacer; ok_cancel;"
                        "}"
                  )
                  (write-line x des)
                )
                (setq des (close des))
                (< 0 (setq dch (load_dialog dcl)))
            )
            (new_dialog "getfiles" dch)
      )
      (progn
            (setq ext (LM:getfiles:str->lst (strcase ext) ";"))
            (set_tile "title" (if (= "" title) "Select Files" title))
            (set_tile "dir"
                (setq dir
                  (LM:getfiles:fixdir
                        (if (or (= "" default) (not (vl-file-directory-p (LM:getfiles:fixdir default))))
                            (getvar 'dwgprefix)
                            default
                        )
                  )
                )
            )
            (setq lst (LM:getfiles:updatefilelist dir ext nil))
            (mode_tile "add" 1)
            (mode_tile "del" 1)

            (action_tile "brw"
                (vl-prin1-to-string
                   '(if (setq tmp (LM:getfiles:browseforfolder "" nil 512))
                        (setq lst (LM:getfiles:updatefilelist (set_tile "dir" (setq dir tmp)) ext rtn)
                              rtn (LM:getfiles:updateselected dir rtn)
                        )                              
                  )
                )
            )

            (action_tile "dir"
                (vl-prin1-to-string
                   '(if (= 1 $reason)
                        (setq lst (LM:getfiles:updatefilelist (set_tile "dir" (setq dir (LM:getfiles:fixdir $value))) ext rtn)
                              rtn (LM:getfiles:updateselected dir rtn)
                        )
                  )
                )
            )

            (action_tile "box1"
                (vl-prin1-to-string
                   '(
                        (lambda ( / itm tmp )
                            (setq itm (mapcar '(lambda ( n ) (nth n lst)) (read (strcat "(" $value ")"))))
                            (if (= 4 $reason)
                              (cond
                                    (   (equal '("..") itm)
                                        (setq lst (LM:getfiles:updatefilelist (set_tile "dir" (setq dir (LM:getfiles:updir dir))) ext rtn)
                                              rtn (LM:getfiles:updateselected dir rtn)
                                        )
                                    )
                                    (   (and
                                          (not (vl-filename-extension (car itm)))
                                          (vl-file-directory-p (setq tmp (LM:getfiles:checkredirect (strcat dir "\\" (car itm)))))
                                        )
                                        (setq lst (LM:getfiles:updatefilelist (set_tile "dir" (setq dir tmp)) ext rtn)
                                              rtn (LM:getfiles:updateselected dir rtn)
                                        )
                                    )
                                    (   (setq rtn (LM:getfiles:sort (append rtn (mapcar '(lambda ( x ) (strcat dir "\\" x)) itm)))
                                              rtn (LM:getfiles:updateselected dir rtn)
                                              lst (LM:getfiles:updatefilelist dir ext rtn)
                                        )
                                    )
                              )
                              (if (vl-some 'vl-filename-extension itm)
                                    (mode_tile "add" 0)
                              )
                            )
                        )
                  )
                )
            )

            (action_tile "box2"
                (vl-prin1-to-string
                   '(
                        (lambda ( / itm )
                            (setq itm (mapcar '(lambda ( n ) (nth n rtn)) (read (strcat "(" $value ")"))))
                            (if (= 4 $reason)
                              (setq rtn (LM:getfiles:updateselected dir (vl-remove (car itm) rtn))
                                    lst (LM:getfiles:updatefilelist dir ext rtn)
                              )
                              (mode_tile "del" 0)
                            )
                        )
                  )
                )
            )

            (action_tile "add"
                (vl-prin1-to-string
                   '(
                        (lambda ( / itm )
                            (if
                              (setq itm
                                    (vl-remove-if-not 'vl-filename-extension
                                        (mapcar '(lambda ( n ) (nth n lst)) (read (strcat "(" (get_tile "box1") ")")))
                                    )
                              )
                              (setq rtn (LM:getfiles:sort (append rtn (mapcar '(lambda ( x ) (strcat dir "\\" x)) itm)))
                                    rtn (LM:getfiles:updateselected dir rtn)
                                    lst (LM:getfiles:updatefilelist dir ext rtn)
                              )
                            )
                            (mode_tile "add" 1)
                            (mode_tile "del" 1)
                        )
                  )
                )
            )

            (action_tile "del"
                (vl-prin1-to-string
                   '(
                        (lambda ( / itm )
                            (if (setq itm (read (strcat "(" (get_tile "box2") ")")))
                              (setq rtn (LM:getfiles:updateselected dir (LM:getfiles:removeitems itm rtn))
                                    lst (LM:getfiles:updatefilelist dir ext rtn)
                              )
                            )
                            (mode_tile "add" 1)
                            (mode_tile "del" 1)
                        )
                  )
                )
            )
         
            (if (zerop (start_dialog))
                (setq rtn nil)
            )
      )
    )
    (*error* nil)
    rtn
)

(defun LM:getfiles:listbox ( key lst )
    (start_list key)
    (foreach x lst (add_list x))
    (end_list)
    lst
)

(defun LM:getfiles:listfiles ( dir ext lst )
    (vl-remove-if '(lambda ( x ) (member (strcat dir "\\" x) lst))
      (cond
            (   (cdr (assoc dir dirdata)))
            (   (cdar
                  (setq dirdata
                        (cons
                            (cons dir
                              (append
                                    (LM:getfiles:sortlist (vl-remove "." (vl-directory-files dir nil -1)))
                                    (LM:getfiles:sort
                                        (if (member ext '(("") ("*")))
                                          (vl-directory-files dir nil 1)
                                          (vl-remove-if-not
                                                (function
                                                    (lambda ( x / e )
                                                      (and
                                                            (setq e (vl-filename-extension x))
                                                            (setq e (strcase (substr e 2)))
                                                            (vl-some '(lambda ( w ) (wcmatch e w)) ext)
                                                      )
                                                    )
                                                )
                                                (vl-directory-files dir nil 1)
                                          )
                                        )
                                    )
                              )
                            )
                            dirdata
                        )
                  )
                )
            )
      )
    )
)

(defun LM:getfiles:checkredirect ( dir / itm pos )
    (cond
      (   (vl-directory-files dir)
            dir
      )
      (   (and
                (=(strcase (getenv "UserProfile"))
                  (strcase (substr dir 1 (setq pos (vl-string-position 92 dir nil t))))
                )
                (setq itm
                  (cdr
                        (assoc (substr (strcase dir t) (+ pos 2))
                           '(
                              ("my documents" . "Documents")
                              ("my pictures". "Pictures")
                              ("my videos"    . "Videos")
                              ("my music"   . "Music")
                            )
                        )
                  )
                )
                (vl-file-directory-p (setq itm (strcat (substr dir 1 pos) "\\" itm)))
            )
            itm
      )
      (   dir   )
    )
)

(defun LM:getfiles:sort ( lst )
    (apply 'append
      (mapcar 'LM:getfiles:sortlist
            (vl-sort
                (LM:getfiles:groupbyfunction lst
                  (lambda ( a b / x y )
                        (and
                            (setq x (vl-filename-extension a))
                            (setq y (vl-filename-extension b))
                            (= (strcase x) (strcase y))
                        )
                  )
                )
                (function
                  (lambda ( a b / x y )
                        (and
                            (setq x (vl-filename-extension (car a)))
                            (setq y (vl-filename-extension (car b)))
                            (< (strcase x) (strcase y))
                        )
                  )
                )
            )
      )
    )
)

(defun LM:getfiles:sortlist ( lst )
    (mapcar (function (lambda ( n ) (nth n lst)))
      (vl-sort-i (mapcar 'LM:getfiles:splitstring lst)
            (function
                (lambda ( a b / x y )
                  (while
                        (and
                            (setq x (car a))
                            (setq y (car b))
                            (= x y)
                        )
                        (setq a (cdr a)
                              b (cdr b)
                        )
                  )
                  (cond
                        (   (null x) b)
                        (   (null y) nil)
                        (   (and (numberp x) (numberp y)) (< x y))
                        (   (= "." x))
                        (   (numberp x))
                        (   (numberp y) nil)
                        (   (< x y))
                  )
                )
            )
      )
    )
)

(defun LM:getfiles:groupbyfunction ( lst fun / tmp1 tmp2 x1 )
    (if (setq x1 (car lst))
      (progn
            (foreach x2 (cdr lst)
                (if (fun x1 x2)
                  (setq tmp1 (cons x2 tmp1))
                  (setq tmp2 (cons x2 tmp2))
                )
            )
            (cons (cons x1 (reverse tmp1)) (LM:getfiles:groupbyfunction (reverse tmp2) fun))
      )
    )
)

(defun LM:getfiles:splitstring ( str )
    (
      (lambda ( l )
            (read
                (strcat "("
                  (vl-list->string
                        (apply 'append
                            (mapcar
                              (function
                                    (lambda ( a b c )
                                        (cond
                                          (   (= 92 b)
                                                (list 32 34 92 b 34 32)
                                          )
                                          (   (or (< 47 b 58)
                                                    (and (= 45 b) (< 47 c 58) (not (< 47 a 58)))
                                                    (and (= 46 b) (< 47 a 58) (< 47 c 58))
                                                )
                                                (list b)
                                          )
                                          (   (list 32 34 b 34 32))
                                        )
                                    )
                              )
                              (cons nil l) l (append (cdr l) '(( )))
                            )
                        )
                  )
                  ")"
                )
            )
      )
      (vl-string->list (strcase str))
    )
)

(defun LM:getfiles:browseforfolder ( msg dir flg / err fld pth shl slf )
    (setq err
      (vl-catch-all-apply
            (function
                (lambda ( / app hwd )
                  (if (setq app (vlax-get-acad-object)
                              shl (vla-getinterfaceobject app "shell.application")
                              hwd (vl-catch-all-apply 'vla-get-hwnd (list app))
                              fld (vlax-invoke-method shl 'browseforfolder (if (vl-catch-all-error-p hwd) 0 hwd) msg flg dir)
                        )
                        (setq slf (vlax-get-property fld 'self)
                              pth (vlax-get-property slf 'path)
                              pth (vl-string-right-trim "\\" (vl-string-translate "/" "\\" pth))
                        )
                  )
                )
            )
      )
    )
    (if slf (vlax-release-object slf))
    (if fld (vlax-release-object fld))
    (if shl (vlax-release-object shl))
    (if (vl-catch-all-error-p err)
      (prompt (vl-catch-all-error-message err))
      pth
    )
)

(defun LM:getfiles:full->relative ( dir path / p q )
    (setq dir (vl-string-right-trim "\\" dir))
    (cond
      (   (and
                (setq p (vl-string-position 58dir))
                (setq q (vl-string-position 58 path))
                (not (eq (strcase (substr dir 1 p)) (strcase (substr path 1 q))))
            )
            path
      )
      (   (and
                (setq p (vl-string-position 92dir))
                (setq q (vl-string-position 92 path))
                (eq (strcase (substr dir 1 p)) (strcase (substr path 1 q)))
            )
            (LM:getfiles:full->relative (substr dir (+ 2 p)) (substr path (+ 2 q)))
      )
      (   (and
                (setq q (vl-string-position 92 path))
                (eq (strcase dir) (strcase (substr path 1 q)))
            )
            (strcat ".\\" (substr path (+ 2 q)))
      )
      (   (eq "" dir)
            path
      )
      (   (setq p (vl-string-position 92 dir))
            (LM:getfiles:full->relative (substr dir (+ 2 p)) (strcat "..\\" path))
      )
      (   (LM:getfiles:full->relative "" (strcat "..\\" path)))
    )
)

(defun LM:getfiles:str->lst ( str del / pos )
    (if (setq pos (vl-string-search del str))
      (cons (substr str 1 pos) (LM:getfiles:str->lst (substr str (+ pos 1 (strlen del))) del))
      (list str)
    )
)

(defun LM:getfiles:updatefilelist ( dir ext lst )
    (LM:getfiles:listbox "box1" (LM:getfiles:listfiles dir ext lst))
)

(defun LM:getfiles:updateselected ( dir lst )
    (LM:getfiles:listbox "box2" (mapcar '(lambda ( x ) (LM:getfiles:full->relative dir x)) lst))
    lst
)

(defun LM:getfiles:updir ( dir )
    (substr dir 1 (vl-string-position 92 dir nil t))
)

(defun LM:getfiles:fixdir ( dir )
    (vl-string-right-trim "\\" (vl-string-translate "/" "\\" dir))
)

(defun LM:getfiles:removeitems ( itm lst / idx )
    (setq idx -1)
    (vl-remove-if '(lambda ( x ) (member (setq idx (1+ idx)) itm)) lst)
)

;;----------------------------------------------------------------------;;

(vl-load-com)
(princ
    (strcat
      "\n:: Copy2Drawings.lsp | Version 1.2 | \\U+00A9 Lee Mac "
      (menucmd "m=$(edtime,$(getvar,date),YYYY)")
      " lee-mac ::"
      "\n:: Type \"c2dwg\" to Invoke ::"
    )
)
(princ)

命令C2DWG 然后框选。。。

偏爱云~小吴 发表于 2013-12-7 20:32:50

flyfox1047 发表于 2013-12-4 21:07 static/image/common/back.gif
试试LEEMAC的程序:

(defun c:c2dwg ( / *error* _getitem acd app dbx doc dwl inc lst sel tab var vr ...

谢了大神谢了大神谢了大神

flyfox1047 发表于 2013-12-7 21:51:32

偏爱云~小吴 发表于 2013-12-7 20:32 static/image/common/back.gif
谢了大神谢了大神谢了大神

呵,不客气,问题解决了么?

偏爱云~小吴 发表于 2013-12-9 21:29:13

flyfox1047 发表于 2013-12-7 21:51 static/image/common/back.gif
呵,不客气,问题解决了么?

差不多了,基本可以解决问题了。只是程序太长,还没看懂怎么回事,感觉就是实现了不开图复制,是这样的吧

flyfox1047 发表于 2013-12-9 22:00:57

偏爱云~小吴 发表于 2013-12-9 21:29 static/image/common/back.gif
差不多了,基本可以解决问题了。只是程序太长,还没看懂怎么回事,感觉就是实现了不开图复制,是这样的吧

嗯,解决了就好!

tianyi1230 发表于 2014-12-15 21:35:44

flyfox1047 发表于 2013-12-4 21:07 static/image/common/back.gif
试试LEEMAC的程序:

(defun c:c2dwg ( / *error* _getitem acd app dbx doc dwl inc lst sel tab var vr ...

能翻译一下吗?李的程序是神作!还有就是图框的要求
页: [1]
查看完整版本: 求一可以以图框为单位对CAD内若干图分割另存为每个CAD一张的模式