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

  [34] handent

index  

  Parę słów o funkcji handent. Uchwyty (handle) wprowadzono do rysunkowej bazy danych AutoCAD-a w Release 10 (10.1988), wcześniej obiekty rysunkowe nie miały stałego identyfikatora. Ponieważ nazwa obiektu ename jest zmienna w każdej nowej sesji AutoCAD-a, uchwyt jest jedynym stałym elementem identyfikującym obiekty. Uchwyt jest łańcuchem tekstowym reprezentującym liczbę (numer) obiektu zapisanym w postaci liczby heksadecymalnej. W rysunku uchwyt pojawia się tylko raz - po wymazaniu dowolnego elementu, nowy obiekt nigdy nie otrzyma wcześniej używanego uchwytu. Gwarantuje to zawsze pewny dostęp do określonego obiektu (np. przez zewnętrzne programy). Uchwyty zapisywane są jako wartość kodu 5 danych DXF obiektu.
Funkcja wymaga jednego argumentu w postaci łańcucha tekstowego będącego identyfikatorem obiektu. Zwraca zmienną nazwę obiektu (ename), lub nil jeśli obiekt o takim identyfikatorze nie istnieje. I tak, wywołanie:
(handent "105") może zwrócić np.: <Nazwa elementu: 2369798>

  Dochodzimy tutaj do bardzo szczególnej cechy funkcji handent - zwraca ona nazwę obiektu (o określonym handle), przez całą sesję rysunkową AutoCAD-a, nawet wtedy gdy obiekt już nie istnieje (został wcześniej wymazany). Ponieważ dane wszystkich usuniętych elementów są przechowywane w rysunkowej bazie danych AutoCAD-a, aż do końca sesji, za pomocą funkcji handent, otrzymujemy nazwę ename usuniętego obiektu. Znając zaś ename obiektu, możemy go za pomocą funkcji entdel ponownie przywrócić, (ponieważ entdel usuwa wskazany obiekt jeśli istnieje i przywraca jeśli został wcześniej usunięty).

Mając powyższą wiedzę można wykonać następujące doświadczenie:
  • narysować dowolny obiekt np. linię, albo okrąg.
  • w linii poleceń wywołać (setq A (cdr (assoc 5 (entget (entlast)))))
  • wymazać obiekt (linię lub okrąg)
  • wykonać dowolną ilość operacji rysunkowych, (rysowanie, wymazywanie, przesuwanie itp.)
  • w dowolnej chwili wywołać w linii poleceń (entdel (handent A))
Jak widać wymazany dawno temu obiekt został przywrócony! Spróbujcie tego w VBA! :)))