AutoCAD... AutoLISP... VisualLISP...

  [58] GetFolder

index  

  AutoLISP wyposażony jest w kilka funkcji oferujących dostęp do plików, a VisualLISP rozszerza te możliwości, jednak na próżno szukać w nim funkcji wyświetlającej okno dialogowe do wskazywania folderu. Lispowi programiści przez lata tworzyli lepsze lub gorsze funkcje służące do tego celu, które jeszcze w systemie DOS (AutoCAD R12 i niżej), mogłyby być do przyjęcia, w Windows jednak wyglądają archaicznie, a w wielu sytuacjach nie spełniają podstawowych wymagań ("twarde" ścieżki do folderów systemowych, brak grafiki itp.) Jednym z rozwiązań jest wykorzystanie funkcji zdefiniowanej w pliku acet_util.arx. Plik ten dostarczany jest w pakiecie ExpressTools w każdym AutoCAD-zie od wersji 2000 począwszy. Przedstawienie kilkunastu użytecznych funkcji acet_util.arx wymaga osobnego (dość szerokiego) omówienia (na co być może z czasem się zdecyduję na tych stronach). Teraz przedstawię tylko funkcję służącą do wskazania folderu. Funkcja nazywa się acet_ui_pickidr i wywoływana jest z trzema argumentami: tekstem pojawiającym się w oknie, nazwą (ścieżką) katalogu startowego (początkowego), oraz tekstem będącym tytułem okna dialogowego. Przykładowe wywołanie może wyglądać tak:
(acet-ui-pick-dir "Wskaż folder" "C:\\" "Biblioteka")
Powyższe wywołanie uruchomi okno dialogowe:
Oczywiście acet_util.arx musi być wczytany. Wykorzystując okno dialogowe możemy wybrać dowolny folder.

Innym sposobem jest wykorzystanie systemowego okna przeglądania folderów, dostępnego po zainicjowaniu obiektu Shell Application. Możliwość taj dostępna jest tylko przy wykorzystaniu funkcjonalności ActiveX. Po udanej aktywacji obiektu wykorzystuje się dostępną dla niego metodę o nazwie BrowseForFolder. Wykorzystanie działania systemowego obiektu zwalnia nas ze sprawdzania poprawności działania programu - wszystko działa tak jak zostało to zdefiniowane w obiekcie. Do nas należy tylko przeglądanie w oknie i wybór odpowiedniego folderu.
Definicja funkcji wygląda tak:
(vl-load-com) 
;;; ------------------------------------------------------- ; 
;;; zwraca nazwe katalogu                                   ; 
;;; (jk:SYS_BrowseForFolder "Napis w oknie" eBox Root)      ; 
;;;   argumenty: Msg - tekst w oknie, eBox T/nil            ; 
;;;  - wyswietla edit-box                                   ; 
;;;              Root T/nil -> MyComputer/Desktop           ; 
;;;                                                         ; 
;;; np.                                                     ; 
;;; (jk:SYS_BrowseForFolder "Wskaz folder biblioteki:" T T) ; 
;;;                                                         ; 
(defun jk:SYS_BrowseForFolder 
       (Msg eBox Root / ShApp Ac HWND Dir Res) 
  (if 
    (setq ShApp (vlax-create-object "Shell.Application")) 
    (progn 
      (setq Ac (vlax-get-acad-object) 
            HWND (if 
                   (not 
                     (vlax-property-available-p Ac "HWND") 
                   ) 
                   (vlax-get-property 
                     (vla-get-activedocument Ac) "HWND") 
                   (vlax-get-property Ac "HWND") 
                 ) 
            Dir (vlax-invoke-method 
                  ShApp "BrowseForFolder" HWND Msg 
                  (if eBox "&H0011" "&H0001") 
                  (if Root 17 0) 
                ) 
      ) 
      (if 
        (vl-catch-all-apply 
          '(lambda () 
             (setq Res (vlax-get-property 
                          (vlax-get-property Dir "Self") 
                          "Path" 
                       ) 
             ) 
          ) 
        ) 
        nil 
        T 
      ) 
    ) 
  ) 
  (if Res 
    (setq Res 
      (cond 
        ( (= (substr Res 1 1) ":") nil) 
        ( (not (wcmatch Res "*\\*")) Nil) 
        (T Res) 
      ) 
    ) 
  ) 
  Res 
) 
;;; ------------------------------------------------------- ;
Funkcja wymaga trzech argumentów. Pierwszy typu STR to tekst wyświetlany w oknie, drugi o wartości T lub nil włączajacy lub wyłączający pole edycyjne pozwaląjace ręcznie wpisać nazwę folderu, oraz trzeci (również T / nil mający charakter przełącznika określającego główny folder systemowy MyComputer lub Desktop.
Poniżej prezentowane są wywołania:
(jk:SYS_BrowseForFolder "Wskaz folder biblioteki:" nil nil)
oraz:
(jk:SYS_BrowseForFolder "Wskaz folder biblioteki:" T nil)
     
Kolejne wywołania:
(jk:SYS_BrowseForFolder "Wskaz folder biblioteki:" nil T)

(jk:SYS_BrowseForFolder "Wskaz folder biblioteki:" T T)
definiują okna:
   
      aktualizacja: 15-01-2010

1981... Neue Deutsche Tanzmusik