|
AutoCAD... AutoLISP... VisualLISP... |
|
[6] Szerokość linii |
|
W AutoCAD 2000 dołączono nową cechę obiektów - lineweight czyli szerokość linii. Cecha ta widoczna jest zarówno na ekranie jak i wydruku. O możliwościach stosowania, poleceniach i zmiennych systemowych związanych z szerokościami linii odsyłam do podręcznika użytkownika lub pomocy programu. Dla nas najważniejsze jest jak wprowadzenie szerokości linii wpływa na AutoLISP.
Poniżej widoczne dostępne wartości szerokości linii używanych w programie AutoCAD (włączając wartości logiczne JAKWARSTWA, JAKBLOK i STANDARD):
|
|
Dane DXF obiektu zostały wzbogacone o dodatkowy kod (370) z danymi określającymi szerokość. Kod jest dodawany opcjonalnie. Zapewnia to zgodność z wcześniejszymi wersjami rysunków), obiekty bez określonej szerokości nie mają danych o kodzie 370. Podobnie jak inne wartości, danymi tymi można manipulować przy pomocy funkcji entget, entmake, entmod.
Ponieważ szerokość może być wyrażana w różnych jednostach (milimetry i cale) wartości kodów mają określone wartości które są zakodowane jako liczby całkowite. Są to liczy stukrotnie większe niż szerokość określona w milimetrach. I tak szerokość 0.13mm to wartość kodu 370 wynosi 13, itd. Wadą takiego rozwiązania jest konieczność zapamiętania dopuszczalnych wartości szerokości obiektów. Oczywiście parę linijek kodu LISP-a rozwiązuje problem. Wywołanie: |
(setq %0
(if
(setq %1
(vl-sort
(vl-remove-if-not
'(lambda (%2)(wcmatch %2 "ACLNWT*"))
(atoms-family 1)
)
'<
)
)
(mapcar
'(lambda (%3)(cons %3 (eval (read %3))))
%1
)
)
)/font>
|
zwraca listę par kropkowych gdzie pierwszymi elementami są symbole AutoLISP dla obiektów VLA zamienione na łańcuch tekstowe, a drugimi ich wartości liczbowe (takie jak kody 370):
|
(("ACLNWT000" . 0) ("ACLNWT005" . 5) ("ACLNWT009" . 9) ("ACLNWT013" . 13)
("ACLNWT015" . 15) ("ACLNWT018" . 18) ("ACLNWT020" . 20) ("ACLNWT025" . 25)
("ACLNWT030" . 30) ("ACLNWT035" . 35) ("ACLNWT040" . 40) ("ACLNWT050" . 50)
("ACLNWT053" . 53) ("ACLNWT060" . 60) ("ACLNWT070" . 70) ("ACLNWT080" . 80)
("ACLNWT090" . 90) ("ACLNWT100" . 100) ("ACLNWT106" . 106) ("ACLNWT120" . 120)
("ACLNWT140" . 140) ("ACLNWT158" . 158) ("ACLNWT200" . 200) ("ACLNWT211" . 211)
("ACLNWTBYBLOCK" . -2) ("ACLNWTBYLAYER" . -1) ("ACLNWTBYLWDEFAULT" . -3))
|
|
Wywołując teraz:
|
(vl-sort (mapcar 'cdr %0) '<) |
|
Wynikiem będzie sama lista dopuszczalnych kodów 370 dla obiektów:
|
(-3 -2 -1 0 5 9 13 15 18 20 25 30 35 40 50 53 60 70 80 90 100 106 120 140 158 200 211) |
|
Wykorzystuję tutaj pewne cechy LISP-a ogólnie: możliwość zapisania części programu (symbole) tak jak kod (string) a następnie jego wykonania (eval i read).
|
|
|
|