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

  [6] Szerokość linii

index  

  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
    )
  )
)
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).