AutoCAD, AutoLISP

BLOK- 5 (kolejnych) rzeczy o których być może nie wiesz…

… czyli następna porcja (mniej lub bardziej) blokowych informacji:

  1. WYGODNE ROZBIJ – czyli polecenie BURST. Standardowe polecenie ROZBIJ (_EXPLODE), rozbija blok na elementy składowe zgodnie z definicją bloku. Co ważne, atrybuty takich bloków stają się definicjami atrybutów, a wartości ich są tracone. Z pomocą przychodzi polecenie BURST, które rozbija bloki w ten sposób że elementy go definiujące pozostają na warstwie bloku, zaś atrybuty zamieniane są na obiekty tekstowe zachowując wartości i przejmują warstwę i styl pierwotnej definicji atrybutu. BURST nie jest standardowym poleceniem AutoCAD-a, jest poleceniem zdefiniowanym w aplikacji AutoLISP (burst.lsp). Jest częścią pakietu Express Tool.
  2. KOPIOWANIE ELEMENTÓW BLOKU. To zawsze sprawiało problemy. Zwykle blok trzeba rozbić i… po prostu wziąć potrzebny obiekt. Istnieje jednak polecenie NKOPIUJ (_NCOPY), które pozwala skopiować dowolny (oprócz atrybutu) obiekt z bloku… Oczka? Pół owieczki?…
  3. RODZAJE BLOKÓW. Pozornie prosta sprawa, jednak… Naprostszy podział (ze względu na funkcjonalność) to: bloki statyczne i dynamiczne. Ale te mogą być również podzielone na: bloki z atrybutami i bez… Ponadto w blokach (ze względu na nazwę) wyróżniamy dwa rodzaje: bloki nazwane i bloki anonimowe. Tych ostatnich jest też kilka rodzajów (*U / *S / *T / *E / *D). Odnośniki zewnętrzne XReference, (w końcu) to też są przecież bloki, że nie wspomnę o specjalnych blokach obszarów: *Model_Space i *Paper_Space… Chyba trzeba pomyśleć o osobnym wpisie (?)…
  4. OKNA DIALOGOWE W LISP-ACH. Piszący programy LISP-owe, mogą korzystać z poleceń BLOK (_BLOCK), do definiowania bloków, czy też PISZBLOK (_WBLOCK) do zapisywania bloków na dysku. Cała sekwencja polecenia musi być zawarta w kodzie makra, czyli określone muszą być z góry wszystkie parametry. Istnieje jednak też możliwość wywołania okien dialogowych odpowiadających poleceniom BLOCK i WBLOCK, tak aby pozostawić możliwości ustawień użykownikowi. Służą do tego polecenia: ACADBLOCKDIALOG oraz ACADWBLOCKDIALOG. Oczywiście można je stosować w funkcji command.
  5. NAZWY BLOKÓW. Wprowadzenie w oknie dialogowym polecenia _INSERT (WSTAW) niepoprawnego znaku w nazwie i wybranie przycisku [Przeglądaj] wywołuje nieco archaiczny komunikat: Zaskakująca jest informacja o dłuższej niż 8 znakowej długości nazwy – rzeczywiście takie ograniczenie istniało… ale w czasach systemu operacyjnego DOS… (!). Niemniej dziś też warto wiedzieć o zmiennej systemowej EXTNAMES, która określa znaki przyjęte dla nazw bloków, warstw, stylów tekstu / wymiarowania i innych nazwanych obiektów. Ma ona dwie wartości: 0 – jak dla Release 14, przez co ogranicza długość nazw do 31 znaków. Nazwy mogą zawierać litery od A do Z, cyfry od 0 do 9 i znaki specjalne dolar ($), podkreślenie (_) i łącznik (–), oraz 1 – obecnie domyślna i używa parametrów wersji  R2000 (i nowszych). Nazwy mogą zawierać do 255 znaków, litery od A do Z, cyfry od 0 do 9, spacje oraz dowolne znaki specjalne, które nie są używane przez system i AutoCAD-a.

To na razie tyle o blokach. Liczę że informacje będą przydatne. Oczywiście do bloków nie raz jeszcze wrócimy…

 .  .  .   )

Reklamy
AutoCAD, AutoLISP

BLOK – 5 rzeczy o których być może nie wiesz…

Chyba każdy użytkownik AutoCAD-a, w mniejszym (podstawowym) lub większym (rozszerzonym) zakresie stosuje bloki. Dziś kilka zagadnień związanych z blokami, zarezerwowanych dla „wytrawnych znawców AutoCAD-a„… 😉 … Być może jednak znasz już te wszystkie rzeczy niemniej zapraszam do lektury:

  1. BLOK JEST NIEEDYTOWALNY… Nie można uruchomić Edytora Bloku dwuklikiem, ani wybrać polecenia z pod prawego klawisza myszy: Odpowiedzialną za ten stan rzeczy jest zmienna systemowa o nazwie BLOCKEDITLOCK. Gdy ma wartość 1 – edytor bloku jest zablokowany.  Domyślną wartością jest 0. Zdarza się jednak że zmienna jest przestawiona, i edytor jest zablokowany co przy blokach dynamicznych jest już sporym utrudnieniem.
  2. KOPIUJ I WKLEJ JAKO BLOK. Któż nie korzysta ze schowka Windows? To prosty i szybki sposób na tworzenie bloków:Oczywiście w sytuacji gdy nie zależy nam na kontrolowaniu nazwy bloku. AutoCAD bowiem ustala nazwę wklejonego bloku wg schematu: A$C + 8 znaków alfanumerycznych (liczba hexadecymalna), tworząc w ten sposób unikalną nazwę:Tego rodzaju nazwy mogą być (rzecz jasna) zmieniane na bardziej czytelne dla użytkownika. Poleceniem (to dla LISP-aczy) wstawiającym obiekty ze schowka Windows jako blok jest _PASTEBLOCK (WKLEJBLOK). Operacje (copy/paste) potrafią jednak czasem sprawić nieco kłopotów w AutoCAD-zie, ale to są już  osobne historie…
  3. NIEWIDZIALNE BLOKI (PLIKI)… Poleceniem _WBLOCK (PISZBLOK), można zapisać dowolne, nazwane (nieanonimowe) bloki na dysku. Gdy zrobimy to z blokami utworzonymi za pomocą operacji opianej w punkcie [2]… po otwarciu ich – nie będą one widoczne w zakładkach plików w AutoCAD-zie: pomimo tego że są otwarte, i można je dowolnie edytować: Sprawdzić możemy to również LISP-em, wykorzystując funkcję CADPL-Pack‚a, zwracającą listę otwartych dokumentów:Generalnie dotyczy to wszystkich plików których nazwa składa się z A$Cnnn, gdzie nnn, jest ciągiem 8 znaków składających się z liczb i liter (bez innych znaków).
  4. WSTAW ROZBITY. Jeżeli są powody aby wstawić do rysunku blok a następnie go rozbić, możesz skorzystać z dwóch opcji: „zaptaszając” opcję Rozbij okna dialogowego polecenia _INSERT (WSTAW): albo (ważne gdy używasz LISP-a), poprzedzając gwiazdką nazwę bloku w argumencie funkcji command dla polecenia _-INSERT (-WSTAW):
  5. SZYK BLOKU – MINSERT. Bloki można wstawiać w szyku prostokątnym, określając ilość wierszy i kolumn, oraz odległości między nimi. Takie wstawienia trakowane są jak jeden element. Służy do tego polecenie _MINSERT (WWSTAW). Wstawienia takiego nie można rozbić poleceniem ROZBIJ (_EXPLODE). Z punktu widzenia rysunkowej bazy danych jest to obiekt o nazwie INSERT (jak inne bloki): Kody DXF: 70, 71, (ilość wierszy i kolumn) oraz 44, 45 (odpowiednio odległości między wierszami i kolumnami) choć występują w danych „zwyczajnego” wstawienia są dla niego ignorowane. Warto zauważyć że jest możliwe utworzenie szyku z 1 wierszem i 1 kolumną, oraz zerowymi odległościami między nimi. Takie wstawienie, choć graficznie wygląda tak samo jak zwykły blok, niemniej nadal jest obiektem klasy AcDbMinsertBlock.

Kolejnych pięć (niekoniecznie) powszechnie znanych rzeczy o blokach –  wkrótce…

(   .   .   .   )

 

AutoCAD

Symbole a FONTALT

Parę słów o symbolach, czcionkach i złożonych rodzajach linii. Nieco teorii na początek. Symbole są obiektami rysunkowymi AutoCAD-a, których grafika definiowana jest podobnie jak definicje (rdzennych) czcionek w plikach shx (po kompilacji, bo źródłowe definicje zapisane są w plikach shp). Złożone rodzaje linii (korzystające z tekstów i/lub symboli) wymagają (do poprawnego wyświetlenia) zdefiniowanego stylu tekstu (albo) wczytanego pliku symboli. Ponieważ zarówno w przypadku czcionek jak i symboli, informacje nie są zapisywane w rysunku, wymagane jest aby pliki czcionek (i/lub) symboli były „widziane” przez AutoCAD-a. W przeciwnym wypadku zamiast:

możemy mieć coś takiego:

Rzecz jasna AutoCAD przy wczytywaniu rysunku, potrafi rozpoznać brakujące pliki shx, oraz proponuje w oknie dialogowym wybranie jednej z dwóch opcji :

Wybór pierwszej ma sens gdy (w rzeczywistości) istnieją na dysku brakujące pliki i potrafimy wskazać ich lokalizację. Zwykle jednak jesteśmy skazani na wybór drugiej opcji i wtedy w linii poleceń możemy zauważyć takie (lub podobne) informacje:

Uważny użytkownik AutoCAD-a zwróci uwagę na dwie rzeczy:

  • po pierwsze: skąd się bierze podstawianie pliku simplex.shp (oraz)
  • dlaczego (to po drugie) plik  ltypeshp.shx jest podstawiany, skoro jest standardowym plikiem AutoCAD-a?

Opdowiadając od końca: nie jest to jasne – ten problem nie występuje zawsze i nie we wszystkich wersjach AutoCAD-a. W rzeczywistości istniejący plik ltypeshp.shx  (w domyślnej lokalizacji AutoCAD-a), w niektórych sytuacjach nie jest rozpoznawany. Niemniej sprawdźcie sami:

Natomiast podstawienie pliku simplex.shp bierze się z ustawienia zmiennej systemowej o nazwie FONTALT. Określa ona tak zwaną czcionkę zatępczą. Jeżeli w rysunku są określone czcionki, których nie ma w systemie, zostanie automatycznie wstawiona czcionka, która została wybrana jako czcionka zastępcza. Domyślnie używany jest plik simplex.shx. Co ciekawe, w przypadku nierozpoznania istniejącej czcionki, zamiana wartości zmiennej systemowej FONTALT na wartość <brak>, rozwiązauje ten problem. Widać to na poniższej animacji:

Rzecz jasna dotyczy to tylko plików symboli (lub czcionek) które są w rzeczywistości widoczne dla AutoCAD-a – a tak jest dla pliku ltypeshp.shx

Skąd biorą się problemy z brakującymi plikami? Odpowiedź jest prosta, przekazywanie plików rysunków AutoCAD-a. W prostych dokumentach, w których znajdują się tylko elementy zapisywane w rysunku, lub korzystające ze standardowych zasobów, zwykle nie ma problemu. Rysunki bardziej skomplikowane, wykorzystujące odniesienia zewnętrzne, powiązania z innymi dokumentami, plikami rastrowymi, specjalnymi rodzajami linii, stylami tekstu, niestandardowymi symbolami itp. przekazywane powinny być przy wykorzystaniu polecenia ETRANSMIT. Pozwala ono stworzyć pakiet dokument ze wszystkimi zależnymi zasobami. ETRANSMIT jest poleceniem zastępującym wycofaną opcję pakietu Express Tools o  nazwie PACK&GO.

O tekstach (również BigFont-ach) pisałem w TEXT + BigFont. Style tekstu związane z symbolami opisywałem w Tajemniczy styl tekstu… Ogólniee zaś o stylach tekstu można poczytać we wpisie Standardy – Style tekstu. Natomiast złożone rodzaje linii opisywałem w WeldLine, oraz Izolacja – BATTING. Komentarze do tego wpisu były inspiracją dzisiejszego (#170) wpisu …

.  .  .  >

AutoLISP

Remove FIELDs

Stosowanie pól danych (FIELD-ów) jest prostą i wygodną metodą zachowania spójności opisów, poprzez połączenie ich z innymi obiektami. FIELD-y powodują, że obiekty opisowe w rysunku zmieniają się, gdy zmienie podlegają ich źródłowe odniesienia. FIELD-y mogą mieć zastosowania do większości obiektów opisowych z wyjątkiem tolerancji (TOLERANCE). Poniżej przykład zastosowania pól danych dla różnych obiektów:

Poniższa animacja ilustruje działanie LISP-owego polecenia CONV-FIELD, które zdefiniowałem w celu konwersji wybranych obiektów zawierających pola danych, na obiekty statyczne:

Efektem działania programu są (jak widać poniżej) trwałe ustalenie ostatniego stanu wartości pól danych. Od tego momentu wszystkie obiekty podlegają tylko ręcznej edycji:

Program dokonuje zmian na wszystkich możliwych obiektach mogących zawierać pola danych, z wyjątkiem tabel (obiekt ACAD_TABLE). Są to obiekty typu tekst (TEXT), tekst wielowierszowy (MTEXT), wymiar (DIMENSION), blok z atrybutami (INSERT), oraz wielolinia odniesienia (MLEADER). W przypadku bloków konwersji mogą podlegać wszyskie atrybuty (opcja Tekst), lub tylko jego unikalne wystąpienia (opcja Atrybut). Pozwala to w sposób elastyczny kontrolować stan opisów w rysunku. W przypadku wyboru wielolinii odniesienia, zmianie podlegają zarówno MLEADER-y z MTEXT-em, jak też z BLOCK-iem.

Kod programu wygląda tak:


; ===================================================================== ;
; Std-Fields.lsp <by kojacek 2019>                                      ;
; --------------------------------------------------------------------- ;
; Usuwa (zamienia na statyczny tekst) pola danych (FIELD) w obiektach:  ;
; tekst, tekst wielowierszowy, wielolinia odniesienia, wymiary, bloki z ;
; atrybutami (dla całego bloku), atrybuty (pojedynczy wybor)            ;
; ===================================================================== ;
(defun C:CONV-FIELD (/ u s l)
  (if
    (setq u
      (cd:USR_GetKeyWord
        "\nUsuń FIELD z tekstu, mtext-u, mleader-a, bloku, wymiaru "
        '("Tekst" "Atrybut" "Koniec")
        "Tekst"
      )
    )
    (cond
      ( (= u "Tekst")
        (if
          (and
            (setq s
              (ssget "_:L"
                '((0 . "TEXT,MTEXT,INSERT,MULTILEADER,DIMENS*"))
              )
            )
            (setq l (jk:ENT_Field-List (cd:SSX_Convert s 0)))
          )
          (progn
            (cd:SYS_UndoBegin)
            (foreach % l (jk:ENT_RemField %))
            (princ
              (strcat
                "\nPrzekształcono " (itoa (length l)) " obiektów. "
              )
            )
            (cd:SYS_UndoEnd)
          )
          (princ "\nNie wybrano obiektów FIELD.")
        )
      )
      ( (= u "Atrybut")
        (if
          (and
            (setq s (car (nentsel "\nWybierz atrybut bloku:")))
            (= (cdr (assoc 0 (entget s))) "ATTRIB")
            (jk:ENT_Field-p s)
          )
          (progn
            (cd:SYS_UndoBegin)
            (jk:ENT_RemField s)
            (cd:SYS_UndoEnd)
          )
          (princ "\nNie wybrano obiektów FIELD.")
        )
      )
      (t (princ "\nAnulowano. "))
    )
    (princ "\nNie wybrano obiektów do zmiany. ")
  )
  (princ)
)
; --------------------------------------------------------------------- ;
; dla obiektu INSERT <Ent> zwraca liczbe atrybutow bedacych Field'em,   ;
; albo 0 jesli blok ich nie ma                                          ;
; --------------------------------------------------------------------- ;
(defun jk:BLK_Fields-In-Atts (Ent)
  (apply '+
    (mapcar '(lambda (%)(if (jk:ENT_Field-p %) 1 0))
      (cd:BLK_GetAttEntity Ent)
    )
  )
)
; --------------------------------------------------------------------- ;
; dla obiektu INSERT <Ent> usuwa wszystkie odniesienia Field w atrybutach
; --------------------------------------------------------------------- ;
(defun jk:BLK_RemField-All-Atts (Ent / l)
  (if
    (not (zerop (jk:BLK_Fields-In-Atts Ent)))
    (progn
      (setq l (cd:BLK_GetAttEntity Ent))
      (foreach % l
        (jk:ENT_RemField %)
      )
    )
  )
)
; --------------------------------------------------------------------- ;
; usuwa ceche Field z obiektu <Ent>                                     ;
; --------------------------------------------------------------------- ;
(defun jk:ENT_RemField (Ent / c o x v)
  (setq o (cdr (assoc 0 (entget Ent))))
  (cond
    ( (= "INSERT" o)(jk:BLK_RemField-All-Atts Ent))
    (T
      (if
        (member "ACAD_FIELD"
          (cd:DCT_GetDictList (setq x (cd:DCT_GetExtDict Ent T)) nil)
        )
        (progn
          (setq c (if (= o "MULTILEADER") 304 1)
                v (cdr (assoc c (entget Ent)))
          )
          (cd:DCT_RemoveDict x "ACAD_FIELD")
          (cd:ENT_SetDXF Ent c v)
        )
      )
    )
  )
)
; --------------------------------------------------------------------- ;
; zwraca T jesli obiekt <Ent> jest Field'em                             ;
; --------------------------------------------------------------------- ;
(defun jk:ENT_Field-p (Ent)
  (cond
    ( (= "INSERT" (cdr (assoc 0 (entget Ent))))
      (not (zerop (jk:BLK_Fields-In-Atts Ent)))
    )
    (T (= 1 (getpropertyvalue Ent "HasFields")))
  )
)
; --------------------------------------------------------------------- ;
; z listy obiektow <Lst> usuwa niebedace Field'ami                      ;
; --------------------------------------------------------------------- ;
(defun jk:ENT_Field-List (Lst / l)
  (vl-remove-if-not '(lambda (%)(jk:ENT_Field-p %)) Lst)
)
; --------------------------------------------------------------------- ;
(princ)

Do prawidłowego działania konieczne jest załadowanie biblioteki CADPL-Pack. program działa na wszystkich wersjach AutoCAD-a począwszy od wersji 2005…

 

.  .  .  )

Wpis: #169

AutoLISP

SLeader

Polecenia _LEADER (LODNIES) i _MLEADER (WIELOLODN) tworzą linie odniesienia zwykle łączące dowolny element rysunkowy z obiektem opisującym. Może to być formatowany tekst wielowierszowy, tolerancja czy też blok, również z atrybutami. Szerokie możliwości dostosowania stylu linii i wielolinii odniesienia, pozwalają tworzyć złożone obiekty opisowe. Idąc w przeciwnym kierunku – czyli chcąc utworzyć najprostszy dwupunktowy element linii odniesienia bez opisu, czyli „zwyczajną” strzałkę, napisałem krótkie LISP-owe makro którego działanie widać poniżej:

Wykorzystanie obiektu typu LEADER, pozwala na wprowadzenie zmian cech strzałki podczas ewentualnej późniejszej edycji:

Kod definicji polecenia SLEADER wygląda tak:


; ===================================================================== ;
; SLeader.lsp <kojacek 2019>                                            ;
; ===================================================================== ;
; Polecenie SLEADER rysuje prosta strzalke z grotem jako LEADER         ;
; --------------------------------------------------------------------- ;
(defun C:SLEADER (/ ps pe)
  (if
    (setq ps (getpoint "\nOkreśl położenie grota strzałki:"))
    (if
      (setq pe (getpoint ps "\nOkreśl punkt końcowy:"))
      (progn
        (cd:SYS_UndoBegin)
        (jk:ENT_AddLeader2P
          (cd:ACX_ASpace)
          (list ps pe)
          nil
          '( ("ArrowHeadSize" . 3.0)
             ("DimensionLineColor" . 1)
          )
        )
        (cd:SYS_UndoEnd)
      )
    )
  )
  (princ)
)
; --------------------------------------------------------------------- ;
(defun jk:ENT_AddLeader2P (Space Pts LoType LProp / obj p a)
  (setq  p (vlax-3d-point (last Pts)))
  (setq Pts
    (apply
      (quote append)
      (mapcar
        (function
          (lambda (%)
            (list (car %)(cadr %)(caddr %))
          )
        )
        (mapcar
          (function
            (lambda (%)
              (trans % 1 (trans '(0 0 1) 1 0 T))
            )
          )
          Pts
        )
      )
    )
       
        a (vla-AddMText Space p 1 "")
  )
  (setq obj
    (vla-AddLeader Space
      (vlax-make-variant
        (vlax-safearray-fill
          (vlax-make-safearray vlax-vbdouble (cons 0 5))
          Pts
        )
      )
      a
      (if (not LoType) acLineWithArrow)
    )
  )
  (vla-Erase a)
  (vla-put-Coordinate obj 1 p)
  (cd:ACX_SetProp obj LProp)
)
; --------------------------------------------------------------------- ;
(princ)

Rzecz jasna, do prawidłowego działania konieczne jest załadowanie biblioteki CADPL-Pack. Jest to uproszczona wersja, pokazująca schemat działania – po wskazaniu dwóch punktów wywoływana jest funkcja tworząca obiekt typu LEADER, za pomocą mechanizmu ActiveX. Zmiana cech obiektu dokonywana jest na podstawie listy właściwości przesłanej jako argument funkcji. Tutaj jest to kolor czerwony dla obiektu i 3 jednostki jako wielkość grota. Taka konstrukcja (lista właściwości jako argument funkcji) pozwala w elastyczny sposób dostosować program do tworzenia Leadera według swoich potrzeb.

We wcześniej publikowanych wpisach omawiałem już zagadnienia zwiazane z rysowaniem linii i obiektów symbolizujących różnego rodzaju strzałki. W [Linie z grotem czyli strzałki] przedstawiłem makro do seryjnego rysowania strzałek przy użyciu obiektu typu LEADER. Tam zastosowałem technikę tworzenia obiektów przy pomocy funkcji entmake. Podobnie działające makro, ale wykorzystujące bloki dynamiczne opisałem we wpisie [Linie z grotem czyli strzałki (2)]. Natomiast program [arrow.fas], do rysowania kilku rodzajów strzałek i ich dynamicznej edycji, przedstawiłem we wpisach: [Rysowanie strzałki] oraz (unowocześniona wersja) [Rysowanie strzałek – aktualizacja].

 

(  .  .  . )

Wpis: #168

AutoLISP

MTEXT – usuwanie maski tła

AutoCAD-owy formatowany tekst wielowierszowy (MTEXT) jest obiektem służącym do tworzenia złożonych pod względem formy opisów tekstowych. Jedną z możliwych właściwości jest zastosowanie dla tekstu tak zwanej maski tła. Jest to prostokątny obszar pola tekstowego, który pozwala „przykrywać” inne obiekty, przez co opisy są bardziej czytelne. Maska tła może mieć dowolny kolor, zwykle jednak korzysta się z opcji koloru tła rysunku.

Bogate życie AutoCAD-owego klikacza stwarza jednak (nieco irytujące) sytuacje (na przykład wszelkiej maści importy), gdy (niektóre) maski tła nie są jednak potrzebne, a usuwanie ich przez operacje żmudnych wyborów i zmian ustawień właściwości wydają się być zbyt żmudne… W takich chwilach, warto skorzystać z doświadczeń (LISP-owych) wron, które zawsze mogą wydziobać nieco kodu…  Popatrzmy:

Powyższy przykład ilustrujący działanie stosunkowo prostego makra LISP-owego, pokazuje jak w szybki sposób można usunąć maski tła dla dowolnego zbioru wskazań tekstów wielowierszowych. Zdefiniowane polecenie DELBKG, tworzy zbiór wskazań złożony z obiektów MTEXT (kod DXF 0) które posiadają właściwość maski tła (kod DXF 90 większy od 0), a następnie dla właściwości BackgroundFill przypisuje wartość 0 (nie). Kod makra wygląda tak:


; ------------------------------------------------------------------ ;
; Polecenie DELBKG dla wskazanych MTEXT-ow usuwa maske tla.          ;
; by kojacek - 2019                                                  ;
; ------------------------------------------------------------------ ;
(defun C:DELBKG (/ s l)
  (if
    (setq s (ssget '((0 . "MTEXT")(-4 . ">")(90 . 0))))
    (progn
      (setq l (cd:SSX_Convert s 0))
      (cd:SYS_UndoBegin)
      (foreach % l
        (setpropertyvalue % "BackgroundFill" 0)
      )
      (cd:SYS_UndoEnd)
    )
    (princ "\nNot selected objects.")
  )
  (princ)
)
; ------------------------------------------------------------------ ;
(princ)

Rzecz jasna (tradycynie już) do poprawnego działania, konieczne jest załadowanie biblioteki CADPL-Pack

(   .  .  .   )

To jest #167 wpis na blogu…

 

AutoLISP

Zrozumieć 3D : kod 210 – następny krok

Poprzedni wpis zasygnalizował (pozornie nieistniejący) związek pomiędzy dwuwymiarowymi a trójwymiarowymi obiektami AutoCAD-a. Tytułowy kod 210 DXF, który jest przypisany dla każdego obiektu 2D, determinuje (jednak) jego położenie w przestrzeni trójwymiarowej. Spójrzmy zatem, na płaski rysunek (w podstawowych rzutach) prostej, biednej (bez lusterek i bez prestiżowych literek TDI) furki:

W widoku izometrycznym, (właściwie) nadal niewiele wiecej widać. Rysunek jest nadal dwuwymiarowy i płaski:

Każdy z widoków (z boku, z przodu, z tyłu, (oraz) z góry), jest wstawieniem bloku dynamicznego. Oznacza to że każde wstawienie (INSERT) posiada swój kod 210… Tak długo jak leży ono na jednej płaszczyźnie, jest on (ten kod) jednakowy dla wszytkich odniesień. W tym miejscu, nadchodzi moment który wszystkie wrony (dziobiące w kodzie) lubią najbardziej: zmiana kodu 210 DXF… Popatrzmy:

Pomimo tego że powyższy film (z różnych względów) nie zasługuje na Oscara, spostrzegawczy widz zauważyć może (jednak ważnych) kilka scen, które (być może) zapamięta… Po wybraniu obiektu (bloku tutaj widoku samochodu), widać wskazanie dwóch punktów, określających (nowy) wektor wyciągania (kod 210). Rezultatem jest ustawienie wskazanych rzutów na płaszczyznach prostopadłych od X-0-Y, przez co tworząc (wprawdzie nadal płaski) niemniej już trójwymiarowy przestrzenny model:

Oczywiście całość realizowana jest za pomocą machanizmu zdefiniowanego w LISP-ie. A o nim szerzej w kolejnych odsłonach…

.  .  .  )

To jest #166 wpis…