|
AutoCAD... AutoLISP... VisualLISP... |
|
[63] Wielkość MTEXT-u |
| Wielowierszowy tekst czyli obiekt typu MTEXT pojawił się w AutoCAD-zie już bardzo dawno temu. Wcześniej w skrócie przedstawiałem tutaj kilka sposobów formatowania tekstu wielowierszowego: MTEXT - ułamki. Nie miejsce zajmować się tutaj opisem cech i możliwości wynikających ze stosowania tekstu wielowierszowego - tutaj interesuje nas definicja obiektu. Oczywiście dostęp na poziomie programowym - tutaj za pomocą LISP-a. "Badaniem" zostanie objęte zagadnienie obszaru zajmowanego przez obiekt typu MTEXT. AutoLISP wyposażony jest w funkcję textbox, która zwraca punkty przekątnej prostokąta opisującego element tekstowy, jednak funkcja ta nie działa na obiektach tekstu wielowierszowego. | Poniżej przedstawię funkcję która zwraca cztery punkty definiujące prostokąt opisany na obiekcie typu MTEXT. Zanim jednak to nastąpi przeanalizujemy "budowę" tego obiektu. Poniżej widoczny element tekstu wielowierszowego: |
|
| Po zaznaczeniu elementu rysunkowego wyświetlają się cztery uchwyty (GRIPS) obiektu, które pokazują obszar w granicach którego zdefiniowany jest obiekt. Obszar ten w zależności od zawartości tekstu dynamicznie zmienia się w wymiarze H (wysokość), natomiast szerokość (wymiar W) pozostaje bez zmian. |
|
W rzeczywistości sam tekst zajmuje mniejszy obszar niż zdefiniowany dla MTEXT-u prostokąt: |
|
Właściwości Height i Width (VLA-Oobject) są wartościami wymiaru H i W. Podobnie wielkość prostokąta określą dwa punkty przekątne prostokąta zwrócone przez funkcję vla-getBoundingBox (ale tylko dla poziomej orientacji obiektu w globalnym układzie współrzędnych (WCS)). |
|
Z pomocą przychodzi sprawdzenie danych DXF obiektu. I tak: Kod 40 określa wysokość tekstu (tak jak właściwość Height) Kod 41 określa szerokość tekstu (tak jak właściwość Width) Kod 42 określa rzeczywistą szerokość tekstu Kod 43 określa rzeczywistą wysokość tekstu tak jak na rysunku poniżej: |
|
|
Należy zwrócić uwagę że do obliczenia rzeczywistego obszaru jaki zajmuje sam tekst kody 42 i 43 nie wystarczają. Musimy brać pod uwagę jeszcze: kod 10 - punkt wstawienia obiektu, kod 10 - kąt (w radianach) obrotu obiektu, oraz (bardzo ważny) kod 71 dopasowanie tekstu (tzw. Attachment point) Może on przybierać jedną z dziewięciu wartości, których ilustracją jest rysunek poniżej: |
|
|
|
| Teraz jesteśmy gotowi do utworzenia funkcji obliczającej wartości czterech punktów prostokąta określającego rzeczywisty obszar zajmowany przez tekst. Funkcja jest stosunkowo prosta. Po odczytaniu wcześniej omówionych kodów DXF obiektu, punkty wiliczane są za pomocą funkcji polar: |
;;; ===============================================================; ; Funkcja zwraca 4 punkty określające narożniki prostokąta będącego; ; rzeczywistym obszarem MTEXT-u podanego jako argument e ; ;;; ===============================================================; (defun jk:TXT_Get-MText-RealBox (e / d ip ap wb hb an p1 p2 p3 p4) (if (= (cdr (assoc 0 (setq d (entget e)))) "MTEXT" ) (progn (setq ap (cdr (assoc 71 d)) ip (cdr (assoc 10 d)) wb (cdr (assoc 42 d)) hb (cdr (assoc 43 d)) an (cdr (assoc 50 d)) ) (cond ( (= ap 1) (setq p1 (polar ip (+ an (* 1.5 pi)) hb) p2 (polar p1 an wb) p3 (polar ip an wb) p4 ip ) ) ( (= ap 2) (setq p3 (polar ip an (* 0.5 wb)) p4 (polar p3 (+ pi an) wb) p2 (polar p3 (+ an (* 1.5 pi)) hb) p1 (polar p4 (+ an (* 1.5 pi)) hb) ) ) ( (= ap 3) (setq p3 ip p4 (polar ip (+ pi an) wb) p2 (polar p3 (+ an (* 1.5 pi)) hb) p1 (polar p4 (+ an (* 1.5 pi)) hb) ) ) ( (= ap 4) (setq p1 (polar ip (+ (* 1.5 pi) an)(* 0.5 hb)) p4 (polar ip (+ (* 0.5 pi) an)(* 0.5 hb)) p2 (polar p1 an wb) p3 (polar p4 an wb) ) ) ( (= ap 5) (setq ip (polar ip (+ an (* 0.5 pi))(* 0.5 hb)) p3 (polar ip an (* 0.5 wb)) p4 (polar p3 (+ pi an) wb) p2 (polar p3 (+ an (* 1.5 pi)) hb) p1 (polar p4 (+ an (* 1.5 pi)) hb) ) ) ( (= ap 6) (setq p3 (polar ip (+ (* 0.5 pi) an)(* 0.5 hb)) p4 (polar p3 (+ pi an) wb) p1 (polar p4 (+ (* 1.5 pi) an) hb) p2 (polar p1 an wb) ) ) ( (= ap 7) (setq p1 ip p4 (polar ip (+ (* 0.5 pi) an) hb) p3 (polar p4 an wb) p2 (polar ip an wb) ) ) ( (= ap 8) (setq p1 (polar ip (+ pi an)(* 0.5 wb)) p4 (polar p1 (+ (* 0.5 pi) an) hb) p3 (polar p4 an wb) p2 (polar p1 an wb) ) ) ( (= ap 9) (setq p1 (polar ip (+ pi an) wb) p2 ip p4 (polar p1 (+ (* 0.5 pi) an) hb) p3 (polar ip (+ (* 0.5 pi) an) hb) ) ) (T nil) ) (if p1 (list p1 p2 p3 p4)) ) nil ) ) |
| Ponieważ funkcja nie wykorzystuje funkcjonalności ActiveX, będzie działać na wszystkich wersjach AutoCAD-a w których zdefiniowany jest obiekt typu MTEXT - czyli od AutoCAD Relaease 13 (wydanie: czerwiec 1995). | ![]()
aktualizacja: 02-05-2010
|
![]()
|
|
|
|
|
|
|