Lisp

Jak tworzyć procedury LISP do konfiguracji rysowania.

BricsCAD Lisp

Migracja z AutoCAD®

Kiedy zaczniesz migrować do BricsCAD, przekonasz się, że nie ma praktycznie żadnych różnic w BricsCAD LISP w porównaniu z OtherLISP. Twój kod ładuje się i działa, a funkcjonalność jest identyczna. Podstawowymi różnicami podczas "przenoszenia" aplikacji będzie kilka drobnych kroków konfiguracji, struktura wiersza poleceń i ewentualnie lokalizacje plików. Na początek przejrzyjmy konfigurację i uruchomienie istniejących programów w BricsCAD.

W przypadku automatycznego uruchamiania programów przy użyciu Acad.lsp lub Acaddoc.lsp, należy zmienić ich nazwy odpowiednio na on_start.lsp lub on_doc_load.lsp. Najlepszym rozwiązaniem jest użycie on_doc_load.lsp, zamiast on_start.lsp.

Panel ustawień BricsCAD
Aby włączyć automatyczne uruchamianie programu, ustaw zmienną systemową ACADLSPASDOC na 1 lub po prostu przełącz opcję w Ustawienia / Opcje programu / System:
Zaleca się również poświęcenie trochę czasu na zapoznanie się z menu Opcje/Ustawienia w BricsCAD, ponieważ istnieją ustawienia i opcje specyficzne dla środowiska BricsCAD.
Następnym krokiem w oknie ustawień będzie dodanie folderów pomocniczych do ścieżki wyszukiwania plików, która znajduje się w menu Ustawienia / Opcje programu / Pliki:
Zaleca się korzystanie ze ścieżek pomocniczych dodanych w powyższy sposób i/lub znajdujących się jeden poziom poniżej bieżącego folderu projektu. Dobrą praktyką jest użycie funkcji findfile w celu sprawdzenia, czy plik istnieje przed wykonaniem poleceń, jak w poniższej metodzie:
(if (findfile "custom-code.lsp") (load "custom-code")) 
Jest to jedna z metod, których można użyć do ładowania funkcji na żądanie w pliku on_doc_load.lsp:

Jest to jedna z metod, których można użyć do ładowania funkcji na żądanie w pliku on_start.lsp:

Polecenie DEFUN (DEfine FUNction) ma taką samą nazwę jak funkcja wewnątrz pliku on_doc_load.lsp, a funkcja ta redefiniuje funkcję wywołującą po jej uruchomieniu.

Procedury Lisp konfiguracji rysowania dla BricsCAD

Przykładowy kod
Poniższa prosta procedura konfiguracji rysowania może być dostosowana do twoich potrzeb przy minimalnych zmianach.
(defun C:MYSETUP ( / )                    ;define the command line function "mysetup"
  (setvar "cmdecho" 0)
  (command "_audit" "_y")                 ;audit current drawing
  (command "_-purge" "_all" "*" "_n")     ;purge all unused styles, etc
  (command "_-layer" "_m" "1" "_c" "1" "" "")  ; create layer "1" color "1"
  (command "_-layer" "_m" "2" "_c" "2" "" "")
  (command "_-layer" "_m" "3" "_c" "3" "" "")
  (command "_-layer" "_m" "4" "_c" "4" "" "")
  (command "_viewres" "_y" "20000")        ;set view resolution to maximum
  (setvar "filedia" 1)                     ;turn file dialogs on
  (setvar "attdia" 1)                      ;turn attribute dialogs on
  (setvar "attreq" 1)                      ;enable attribute editing on placement
  (setvar "cecolor" "bylayer")             ;set current color bylayer
  (setvar "clayer" "0")                    ;set current layer to "0"
  (setvar "maxsort" 5000)                  ;set maximum layer sort to 5,000
  (command "_zoom" "_e" "_zoom" "0.95x")   ;zoom extents, then out a little
  (setvar "cmdecho" 1)
  (princ)
)
Każda pojedyncza linia w tej procedurze konfiguracji rysunku mogła zostać wpisana w wierszu poleceń w BricsCAD. Zawijając je w rutynę Lisp, defun(funkcja definiowania) sprawia, że rutynę konfiguracji rysowania "można wywołać" z menu lub wpisując jej nazwę w wierszu poleceń BricsCAD.

Jeśli nie dołączysz defun, program zostanie uruchomiony tylko raz, po załadowaniu go przez nazwę pliku. Użycie defun i załadowanie tej procedury w lsp sprawi, że funkcja będzie dostępna w dowolnym momencie po wpisaniu jej nazwy: mysetup.

Polecenia z poprzedzającymi myślnikami (np. -layer i -purge) służą do zapobiegania uruchamianiu okien dialogowych polecenia.

Uwaga: Zawsze używaj angielskich nazw poleceń i opcji, aby uniknąć błędów w zlokalizowanych (nieanglojęzycznych) wersjach BricsCAD.

Dobrą praktyką podczas otwierania plików od innych osób jest wykonanie testu, a następnie wyczyszczenie w celu usunięcia wszelkich nieużywanych elementów.

Polecenie Wyczyść może być uruchamiane wielokrotnie w celu usunięcia zagnieżdżonych elementów. Zobacz poniższy przykład:

(repeat 3 (command "-purge" " all" " *" " n"))
Uwaga: Wyczyść odbywa się przed dodaniem nowych, pustych warstw, ponieważ zostałyby one usunięte, gdybyśmy zrobili to później.

Polecenie wywołujące ustawianie warstw można połączyć w jedno polecenie, ale łatwiej jest je odczytać, gdy każda linia występuje osobno.

Setvar wywołuje ustawienie zmiennej systemowej na określoną wartość, np. ustawienia stylu dla wymiarów i tekstu, ustawienia jednostek itp.

Ustawienie maxsort zostało wprowadzone z dwóch powodów.
  1. Maxsort kontroluje maksymalną liczbę wpisów okna dialogowego, które zostaną posortowane.
  2. Domyślną wartością dla maxsort jest 1,000. Przy dzisiejszych komputerach i często spotykanych większych plikach projektów, liczba ta może być zbyt niska.
W przypadku otwierania rysunków, w których nazwy warstw nie są sortowane w kolejności alfabetycznej, przyczyną może być domyślna wartość maxsort.
Bardziej wszechstronny kreator warstw do rutynowej konfiguracji rysowania
Poniższy przykład można dodać do wersji mysetup.lsp. Tworząc prosty plik tekstowy "Layers.txt" za pomocą edytora, takiego jak Notatnik, można dodać listę nazw warstw, które zostaną utworzone po uruchomieniu procedury. Jest to alternatywa dla zakodowanego na stałe procesu przedstawionego powyżej. Korzystając z funkcji findfile, BricsCAD najpierw przeszuka bieżący katalog, a następnie sekwencyjnie przez zdefiniowane foldery pomocnicze, aby znaleźć plik Layers.txt. Domyślny plik tekstowy konfiguracji warstwy można umieścić w ścieżce pomocniczej, a jego alternatywne wersje w poszczególnych folderach projektu.

(if (not (findfile "Layers.txt"))                   ;"not" = looking for no result from findfile
(alert "Can't find Layers.txt!")                    ;No file? Yell at the user and exit!
(progn                                              ;Otherwise, do the stuff in the progn group
(setq layerfile (open (findfile "Layers.txt") "r")) ;open layers.txt to "read"
(while (setq layername (read-line layerfile))       ;while reading each line, store the text to layername
(command "-layer" "m" layername "")                 ;make layer with the layername
)                                                   ;end the while loop
(close layerfile)                                   ;close the Layers.txt file
)                                                   ;end the progn
)                                                   ;end the if