明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 486|回复: 1

求帮忙添加板面按键与功能函数链接函数(此前看到一个前辈发的批量操作希望实现功能)

[复制链接]
发表于 2021-11-4 08:51 | 显示全部楼层 |阅读模式
15明经币
本帖最后由 dami 于 2021-11-6 17:16 编辑





(defun LM:GetFiles


    (
        title default ext


        /


        *error*
        _PopulateListBox
        _GetFiles
        _BrowseForFolder
        _Full->Relative
        _str->lst
        _UpdateFileList
        _UpdateSelected
        _UpDir
        _FixDir


        data dir filename files id openfile result
    )


    (defun *error* ( msg )
        (if (< 0 id) (unload_dialog id))
        (if (and filename (findfile filename)) (vl-file-delete filename))
        (if (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*"))
            (princ (strcat "\nError: " msg))
        )
        (princ)
    )


    (defun _PopulateListBox ( key lst )
        (start_list key)
        (foreach item lst (add_list item))
        (end_list)
        lst
    )


    (defun _GetFiles ( dir ext files )
        (vl-remove-if
            (function (lambda ( file ) (member (strcat dir "\\" file) files)))
            (cond
                (   (cdr (assoc dir data))   )
                (   (cdar
                        (setq data
                            (cons
                                (cons dir
                                    (append
                                        (vl-sort (vl-remove "." (vl-directory-files dir nil -1)) '<)
                                        (if (member ext '(("") ("*")))
                                            (vl-directory-files dir nil 1)
                                            (vl-sort
                                                (vl-remove-if-not
                                                    (function
                                                        (lambda ( file / extn )
                                                            (and
                                                                (setq extn (vl-filename-extension file))
                                                                (setq extn (strcase (substr extn 2)))
                                                                (vl-some
                                                                    (function (lambda ( wc ) (wcmatch extn wc)))
                                                                    ext
                                                                )
                                                            )
                                                        )
                                                    )
                                                    (vl-directory-files dir nil 1)
                                                )
                                                (function
                                                    (lambda ( a b )
                                                        (<
                                                            (vl-filename-extension a)
                                                            (vl-filename-extension b)
                                                        )
                                                    )
                                                )
                                            )
                                        )
                                    )
                                )
                                data
                            )
                        )
                    )
                )
            )
        )
    )


    (defun _BrowseForFolder ( msg dir flag / err shell fold self path )
        (setq err
            (vl-catch-all-apply
                (function
                    (lambda ( / acapp hwnd )
                        (if (setq acapp (vlax-get-acad-object)
                                  shell (vla-getinterfaceobject acapp "Shell.Application")
                                  hwnd  (vl-catch-all-apply 'vla-get-hwnd (list acapp))
                                  fold  (vlax-invoke-method shell 'BrowseForFolder (if (vl-catch-all-error-p hwnd) 0 hwnd) msg flag dir)
                            )
                            (setq self (vlax-get-property fold 'self)
                                  path (vlax-get-property self 'path)
                                  path (vl-string-right-trim "\\" (vl-string-translate "/" "\\" path))
                            )
                        )
                    )
                )
            )
        )
        (if self  (vlax-release-object  self))
        (if fold  (vlax-release-object  fold))
        (if shell (vlax-release-object shell))
        (if (vl-catch-all-error-p err)
            (prompt (vl-catch-all-error-message err))
            path
        )
    )


    (defun _Full->Relative ( dir path / p q )
        (setq dir (vl-string-right-trim "\\" dir))
        (cond
            (   (and
                    (setq p (vl-string-position 58  dir))
                    (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 92  dir))
                    (setq q (vl-string-position 92 path))
                    (eq (strcase (substr dir 1 p)) (strcase (substr path 1 q)))
                )
                (_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))
                (_Full->Relative (substr dir (+ 2 p)) (strcat "..\\" path))
            )
            (   (_Full->Relative "" (strcat "..\\" path)))
        )
    )


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


    (defun _UpdateFileList ( dir ext files )
        (_PopulateListBox "box1" (_GetFiles dir ext files))
    )


    (defun _UpdateSelected ( dir files )
        (_PopulateListBox "box2" (mapcar (function (lambda ( file ) (_Full->Relative dir file))) files))
        files
    )


    (defun _UpDir ( dir )
        (substr dir 1 (vl-string-position 92 dir nil t))
    )


    (defun _FixDir ( dir )
        (vl-string-right-trim "\\" (vl-string-translate "/" "\\" dir))
    )
   
    (cond
        (
            (not
                (and
                    (setq filename (vl-filename-mktemp nil nil ".dcl"))
                    (setq openfile (open filename "w"))
                    (progn
                        (foreach line
                           '(
                                "listbox : list_box { width = 40; height =  20; fixed_width = true; fixed_height = true;"
                                "                     alignment = centered; multiple_select = true; }"
                                "abutton : button   { width = 20; height = 1.8; fixed_width = true; fixed_height = true;"
                                "                     alignment = centered; }"
                                ""
                                "getfiles : dialog { key = \"title\"; spacer;"
                                "    : row { alignment = centered;"
                                "        : edit_box { key = \"directory\"; label = \"文件夹:\"; }"
                                "        : button   { key = \"browse\"; label = \"浏览\"; fixed_width = true; }"
                                "    }"
                                "    spacer;"
                              
                                ;;//添加命令
                                "    :boxed_radio_row {"
                                ;"          label="选择操作内容";
                                "          :radio_button{label=\"批量清理\" ; key = \"ea\" ;  }"
                                "          :radio_button{label=\"批量绑定\" ;key = \"eb\" ;  }"     
                                "          :radio_button{label=\"批量关非打印图层\" ;  key = \"ec\" ; }"  
                                "          :radio_button{label=\"批量颜色随层\" ;  key = \"ed\" ; }"  
                                                         
                                "        }"                                
                                "    spacer;"                                
                                
                                
                                "    : row {"
                                "        : column {"
                                "            : listbox { key = \"box1\"; }"
                                "            : abutton { key = \"add\" ; label = \"添加文件\"; }"
                                "        }"
                                "        : column {"
                                "            : listbox { key = \"box2\"; }"
                                "            : abutton { key = \"del\" ; label = \"删除文件\"; }"
                                "        }"
                                "    }"
                                "    spacer; ok_cancel;"
                                "}"
                            )
                            (write-line line openfile)
                        )
                        (close openfile)
                        (< 0 (setq id (load_dialog filename)))
                    )
                    (new_dialog "getfiles" id)
                )
            )
        )
        (   t
            (setq ext (_str->lst (strcase ext) ";"))
            (set_tile "title" (if (eq "" title) "Select Files" title))
            (set_tile "directory"
                (setq dir
                    (_FixDir
                        (if
                            (or
                                (eq "" default)
                                (null (vl-file-directory-p (_FixDir default)))
                             )
                             (getvar 'DWGPREFIX)
                             default
                        )
                    )
                )
            )
            (setq files (_UpdateFileList dir ext nil))
            (mode_tile "add" 1)
            (mode_tile "del" 1)


            (action_tile "browse"
                (vl-prin1-to-string
                   '(if (setq tmp    (_BrowseForFolder "" nil 512))
                        (setq files  (_UpdateFileList (set_tile "directory" (setq dir tmp)) ext result)
                              result (_UpdateSelected dir result)
                        )                              
                    )
                )
            )


            (action_tile "directory"
                (vl-prin1-to-string
                   '(if (= 1 $reason)
                        (setq files  (_UpdateFileList (set_tile "directory" (setq dir (_FixDir $value))) ext result)
                              result (_UpdateSelected dir result)
                        )
                    )
                )
            )


            (action_tile "box1"
                (vl-prin1-to-string
                   '(
                        (lambda ( / items tmp )
                            (setq items
                                (mapcar
                                    (function (lambda ( n ) (nth n files)))
                                    (read (strcat "(" $value ")"))
                                )
                            )
                            (if (= 4 $reason)
                                (cond
                                    (   (equal '("..") items)
                                        (setq files  (_UpdateFileList (set_tile "directory" (setq dir (_UpDir dir))) ext result)
                                              result (_UpdateSelected dir result)
                                        )
                                    )
                                    (   (and
                                            (null (vl-filename-extension (car items)))
                                            (vl-file-directory-p (setq tmp (strcat dir "\\" (car items))))
                                        )
                                        (setq files  (_UpdateFileList (set_tile "directory" (setq dir tmp)) ext result)
                                              result (_UpdateSelected dir result)
                                        )
                                    )
                                    (   t                                    
                                        (setq result (_UpdateSelected dir (vl-sort (append result (mapcar '(lambda ( file ) (strcat dir "\\" file)) items)) '<))
                                              files  (_UpdateFileList dir ext result)
                                        )
                                    )
                                )
                                (if (vl-some (function (lambda ( item ) (vl-filename-extension item))) items)
                                    (mode_tile "add" 0)
                                )
                            )
                        )
                    )
                )
            )


            (action_tile "box2"
                (vl-prin1-to-string
                   '(
                        (lambda ( / items )
                            (setq items
                                (mapcar
                                    (function (lambda ( n ) (nth n result)))
                                    (read (strcat "(" $value ")"))
                                )
                            )
                            (if (= 4 $reason)
                                (setq result (_UpdateSelected dir (vl-remove (car items) result))
                                      files  (_UpdateFileList dir ext result)
                                )
                                (mode_tile "del" 0)
                            )
                        )
                    )
                )
            )


            (action_tile "add"
                (vl-prin1-to-string
                   '(
                        (lambda ( / items )
                            (if (setq items
                                    (vl-remove-if-not
                                        (function (lambda ( file ) (vl-filename-extension file)))
                                        (mapcar
                                            (function (lambda ( n ) (nth n files)))
                                            (read (strcat "(" (get_tile "box1") ")"))
                                        )
                                    )
                                )
                                (setq result (_UpdateSelected dir (vl-sort (append result (mapcar '(lambda ( file ) (strcat dir "\\" file)) items)) '<))
                                      files  (_UpdateFileList dir ext result)
                                )
                            )
                            (mode_tile "add" 1)
                            (mode_tile "del" 1)
                        )
                    )
                )
            )


            (action_tile "del"
                (vl-prin1-to-string
                   '(
                        (lambda ( / items )
                            (if
                                (setq items
                                    (mapcar
                                        (function (lambda ( n ) (nth n result)))
                                        (read (strcat "(" (get_tile "box2") ")"))
                                    )
                                )
                                (setq result (_UpdateSelected dir (vl-remove-if (function (lambda ( file ) (member file items))) result))
                                      files  (_UpdateFileList dir ext result)
                                )
                            )
                            (mode_tile "add" 1)
                            (mode_tile "del" 1)
                        )
                    )
                )
            )
         
            (if (zerop (start_dialog))
                (setq result nil)
            )
        )
    )
    (if (< 0 id)
        (unload_dialog id)
    )
    (if (and filename (findfile filename))
        (vl-file-delete filename)
    )
    result
)








;; 作者:秋枫,参考了灯火的VBA程序
;; 用法:(qf_getFolder message)
;; 例子:(qf_getFolder "选择文件夹:")
;; 返回值:字符串,文件夹路径,如果点了cancel, 返回nil
 
(defun getFolder (message / WinShell shFolder path catchit)
  (vl-load-com)
  (setq winshell (vlax-create-object "Shell.Application"))
  (setq shFolder (vlax-invoke-method WinShell 'BrowseForFolder 0 message 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:1698 ( )
   (setvar "cmdecho" 0)
  (vl-load-com)
  (setq        sfiles
         (LM:GetFiles
           "选择处理的文件                     批量清理 "
           (getvar "dwgprefix")
           "dwg"
         )
  )
   (dcl_1698)


  (setvar "cmdecho" 1)
  (prin1)
)
  
  
  
  
  
  
(defun dcl_1698 ( )  








;(SETQ CHULI "ea206")
;(set_tile CHULI "1")
;(SETQ NAME (GET_ATTR CHULI "LABEL"))






(setq   chuli1 (atof (get_tile "ea"))
          chuli2 (atof (get_tile "eb"))
          chuli3 (atof (get_tile "ec"))
          chuli4 (atof (get_tile "ed"))
)


(if (not chuli1)(caozuo1));
(if (not chuli2)(caozuo2));
(if (not chuli3)(caozuo3));
(if (not chuli4)(caozuo4));




;  (action_tile "ea" "(caozuo1)")
  ;  (action_tile "eb" "(caozuo2)")
  ;  (action_tile "ec" "(caozuo3)")
  ;  (action_tile "ed" "(caozuo4)")




(princ)
)






(defun caozuo1()
(setq targetdir (getFolder "选择文件夹,以便保存绑定后的文件"))
  (setq scrfile (open "c:/bind.scr" "w"))
  (foreach dwgfile sfiles   
    (write-line (strcat "open \"" dwgfile "\"") scrfile)


     (write-line "_.purge all * n" scrfile)
     (write-line "zoom e" scrfile)
    (write-line "zoom e" scrfile)
    (write-line "saveas" scrfile)
    (write-line "2010" scrfile)
    (setq sfdir (strcat targetdir  "\\" (vl-filename-base  dwgfile)))
    (write-line  (strcat "\"" sfdir "\"" ) scrfile)
    (write-line  (strcat "(if (findfile \"" sfdir "\") (command \"yes\"))") scrfile)
    (write-line "close" scrfile)
  )
  (close scrfile)
  (command "script" "c:/bind.scr")  
)


(defun caozuo2()
(setq scrfile (open "c:/plql.scr" "w"))
  (foreach dwgfile sfiles   
    (write-line (strcat "open \"" dwgfile "\"") scrfile)


    (write-line "_.purge all * n" scrfile)
    (write-line "ggppa" scrfile)
    (write-line "zoom e" scrfile)
    (write-line "qsave" scrfile)
    (write-line "close" scrfile)
  )
  (close scrfile)
  (command "script" "c:/plql.scr")  
)


(defun caozuo3()
  (setq scrfile (open "c:/ggtt.scr" "w"))
  (foreach dwgfile sfiles   
    (write-line (strcat "open \"" dwgfile "\"") scrfile)


    (write-line "_.purge all * n" scrfile)
    (write-line "ggtt" scrfile)
    (write-line "zoom e" scrfile)
    (write-line "qsave" scrfile)
    (write-line "close" scrfile)
  )
  (close scrfile)
  (command "script" "c:/ggtt.scr")  
)




(defun caozuo4()
  (setq scrfile (open "c:/plsc.scr" "w"))
  (foreach dwgfile sfiles   
    (write-line (strcat "open \"" dwgfile "\"") scrfile)


    (write-line "_.purge all * n" scrfile)
    (write-line "cb11" scrfile)
    (write-line "zoom e" scrfile)
    (write-line "qsave" scrfile)
   (write-line "close" scrfile)
  )
  (close scrfile)
  (command "script" "c:/plsc.scr")  
)






 楼主| 发表于 2022-4-13 16:48 | 显示全部楼层
已经将该功能实现
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-4 06:25 , Processed in 0.175220 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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