码迷,mamicode.com
首页 > 其他好文 > 详细

让博客园支持Autolisp语法

时间:2015-07-19 21:36:04      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:

 

;;------------------=={ Get Files Dialog }==------------------;;
;;                                                            ;;
;;  An analog of the ‘getfiled‘ function for multiple files.  ;;
;;------------------------------------------------------------;;
;;  Author: Lee Mac, Copyright ?2013 - www.lee-mac.com       ;;
;;------------------------------------------------------------;;
;;  Arguments:                                                ;;
;;  msg - Dialog box label; ‘Select Files‘ if nil or "".      ;;
;;  def - Default directory; dwgprefix if nil or "".          ;;
;;  ext - File extension filter (e.g. "dwg;lsp"); "*" if nil  ;;
;;------------------------------------------------------------;;
;;  Returns:  List of selected files, else nil                ;;
;;------------------------------------------------------------;;
;;  Version 1.3    -    25-07-2013                            ;;
;;------------------------------------------------------------;;
 
(defun LM:getfiles ( msg def 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-mktempnilnil".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 (if ext (LM:getfiles:str->lst (strcase ext)";")("*")))
           (set_tile"title"(if(member msg ‘(nil""))"Select Files" msg))
           (set_tile"dir"
               (setq dir
                   (LM:getfiles:fixdir
                       (if(or(member def ‘(nil""))(not(vl-file-directory-p(LM:getfiles:fixdir def))))
                           (getvardwgprefix)
                           def
                       )
                   )
               )
           )
           (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 ""nil512))
                       (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 )
                           (if(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-somevl-filename-extension itm)
                                       (mode_tile"add"0)
                                   )
                               )
                           )
                       )
                   )
               )
           )
 
           (action_tile"box2"
               (vl-prin1-to-string
                  ‘(
                       (lambda(/ itm )
                           (if(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-notvl-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 nil1)
                                           (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 nil1)
                                           )
                                       )
                                   )
                               )
                           )
                           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-position92 dir nilt))))
               )
               (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 )
   (applyappend
       (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
                       (applyappend
                           (mapcar
                               (function
                                   (lambda( a b c )
                                       (cond
                                           (   (=92 b)
                                               (list323492 b 3432)
                                           )
                                           (   (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)
                                           )
                                           (   (list3234 b 3432))
                                       )
                                   )
                               )
                               (consnil 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-applyvla-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 (LM:getfiles:fixdir (vlax-get-property slf ‘path))
                       )
                   )
               )
           )
       )
   )
   (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-position58  dir))
               (setq q (vl-string-position58 path))
               (/=(strcase(substr dir 1 p))(strcase(substr path 1 q)))
           )
           path
       )
       (   (and
               (setq p (vl-string-position92  dir))
               (setq q (vl-string-position92 path))
               (=(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-position92 path))
               (=(strcase dir)(strcase(substr path 1 q)))
           )
           (strcat".\\"(substr path (+2 q)))
       )
       (   (="" dir)
           path
       )
       (   (setq p (vl-string-position92 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-position92 dir nilt))
)
 
(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)

让博客园支持Autolisp语法

标签:

原文地址:http://www.cnblogs.com/MindCAD/p/4659452.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!