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

  [73] Warstwy (XReference)

index  

  Dziś jeszcze raz o warstwach. O warstwach szczególnych, bo o warstwach odnośników zewnętrznych (XReference). Ponieważ tablica symboli LAYER, rysunku AutocAD-a może być tylko jedna, warstwy odnośnika kopiowane są do tablicy aktualnego rysunku. Aby odróżnić nazwy warstw, AutoCAD używa mechanizmu polegającego na zmianie nazwy warstwy wg formatu typu NAZWA_RYSUNKU + znak "|" + NAZWA_WARSTWY. Co ciekawe wykorzystujac tylko mechanizmy ActiveX jest to jedyna droga do wydzielenia z listy wszystkich warstw, tych należących do odnośnika zewnętrznego. Inaczej jest, gdy wykorzystuje się tradycyjne sposoby - a więc sprawdzenie kodu 70 DXF obiektu LAYER w tablicy obiektów nazwanych. Kod ten przechowuje bitowy znacznik stanu warstwy oraz informację czy warstwa nalezy do odnośnika. Poniżej funkcja która w zalezności od wartości argumentu, zwraca listę warstw w rysunku. I tak dla wartości 0, zwracane są tylko warstwy aktualnego rysunku, dla wartości 1 - tylko warstwy odnośnika (lub nil), dla wartości 2 zaś - wszystkie nazwy warstw. Funkcja działa właśnie na zasadzie sprawdzenia wartości kodów DXF obiektu.

; ================================================================= ;
; Funkcja zwraca liste nazw warstw w rysunku, Argument Mode=INT     ;
; Mode= 0 -> bez XRefs, Mode= 1 tylko -> XRefs, Mode= 2 ->Wszystkie ;
; ================================================================= ;
(defun jk:LAY_GetLayersName (Mode / r)
  (vlax-for % (vla-get-Layers (jk:ACX_ActDoc))
    (setq r
      (vl-remove-if
        'not
        (vl-sort
          (cons
            (if
              ( (eval (nth Mode (list /= = +)))
                16
                (logand 16
                  (cdr
                    (assoc 70
                      (entget (vlax-vla-object->ename %))
                    )
                  )
                )
              )
              (vla-get-Name %)
            )
            r
          )'<
        )
      )
    )
  )
  r
)
; ================================================================= ;
Funkcja wymaga innej funkcji bibliotecznej: jk:ACX_ActDoc, znajdującej się np tu: [54] Izolowanie obiektów
  Zobacz również: [67] znowu warstwy... oraz: [59] Tablice symboli     aktualizacja: 05-03-2011