AutoLISP, CADPL-Pack

Bloki dynamiczne: wybieranie na podstawie parametru

Lipiec w tym roku to miesiąc urlopowy. W tym czasie odbyły się również TWG, oraz WGP, stąd też nie powinno dziwić nieco zwolnione tempo ukazywania się tutejszych wpisów… Skoro jednak wszystko się kończy, a dziś ostatni dzień miesiąca, trzeba zatem nadrobić zaległości.

Bloki dynamiczne już bardzo mocno zadomowiły się w AutoCAD-zie, ich szerokie możliwości, dają użytkownikom szerokie pole zastosowań. Od tworzenia małych i prostych do całkiem skomplikowanych modeli parametrycznych.  Dla zaawansowanych użytkowników, a zwłaszcza lispowych wyjadaczy (wron), dużym wyzwaniem są próby manipulacji blokami dynamicznymi z poziomu LISP-a. Jednym z nich jest wybieranie wstawień bloków dynamicznych czyli tworzenie zbiorów wskazań. Sam wybór takich bloków jest i tak już stosunkowo skomplikowany, jeśli zaś dodać do tego wybór bloków na podstawie określonych wartości ich parametrów, sprawa wydaje się być jeszcze bardziej trudniejsza.

Na początek zatem o „zwykłym” wyborze wstawień bloków dynamicznych, przy wykorzystaniu standardowej funkcji ssget. Koniecznym jest tutaj zapoznanie się z pojęciem  nazwa efektywna, o czym już pisałem wcześniej TUTAJ.  Wspomniana została tam funkcja zdefiniowana w CADPL-Pack-u, o nazwie cd:BLK_GetBlockNames.  Zwraca ona listę wszystkich nazw wstawień bloków dynamicznych o określonej nazwie. Poniżej wywołanie i wynik działania funkcji, dla  przykładowego bloku o nazwie „Pojazdy – metryczny” (z katalogu Sample AutoCAD-a):

Taka lista pozwala dopiero zbudować filtr zbioru wskazań funkcji ssget, dla wyboru przez nazwę (kod 2 DXF). Najprościej jest połączyć elementy listy w łańcuch tekstowy i przekazać jako wartość kodu 2 filtra ssget.

Pokazany tutaj sposób utworzenia zbioru wskazań określonego przez nazwę bloku, nazwę jego parametru i jego wartość, realizowany jest w dwóch etapach. Po pierwsze utworzony jest zbiór wskazań bloku dynamicznego (oknem) i przez nazwę. Gdy taki zbiór powstanie, ( w drugim etapie) zmieniany jest on na listę obiektów, które kolejno są „przeglądane”, pod kątem zgodności nazwy i wartości parametru bloku. Spełniające warunki są  listy usuwane, a z pozostałych jest tworzony drugi zbiór wskazań. Ich różnica jest wynikiem zwracanym przez funkcję. Zilustrowane jest to poniżej. Wybierane są bloki o nazwie: „Pojazdy – metryczny”, parametrze widoczności: „Typ (widok)”, i jego wartości: „Sedan (przód)”:

Tak samo jak dla parametru widoczności, w wywołaniu funkcji można wykorzystać inny dowolny parametr bloku. Poniżej wybór bloków na podstawie wartości parametru liniowego:

Oczywiście prezentowana funkcja ilustruje mechanizm działania tworzenia zbiorów wskazań bloków dynamicznych na podstawie wartości ich parametru. To najprostszy przykład. Na jego podstawie można zbudować inne bardziej rozbudowane procedury wyboru (np. z zadanego zbioru wskazań, z dowolną nazwą bloku, z dowolnym parametrem, z wieloma parametrami itp.).

Funkcja wygląda tak:


; ------------------------------------------------------------------ ;
; funkcja jk:BLK_DynPropSS tworzy zbior wskazan blokow dynamicznych
; o nazwie [BName] parametrze [PropName] i jego wartosci [PropValue]
; by kojacek 2017
; ------------------------------------------------------------------ ;
(defun jk:BLK_DynPropSS (BName PropName PropValue / s l n r c)
  (if
    (setq s
      (ssget
        (list
         '(0 . "INSERT")
          (cons 2
            (cd:STR_ReParse
              (cd:BLK_GetDynBlockNames BName)
              ",`"
            )
          )
        )
      )
    )
    (progn
      (setq l (cd:SSX_Convert s 0))
      (setq c (getvar "CMDECHO")
            n (ssadd)
      )
      (foreach % l
        (if
          (/= PropValue
            (cdr
              (assoc
                PropName
                (cd:BLK_GetDynamicProps % nil)
              )
            )
          )
          (ssadd % n)
        )
      )
      (if
        (< (sslength n)(sslength s))
        (progn
          (setvar "CMDECHO" 0)
          (setq r (SS_SSsub s n))
          (setvar "CMDECHO" c)
          (sssetfirst nil r)
          r
        )
      )
    )
  )
)

Do prawidłowego działania wymaga wcześniejszego załadowania funkcji bibliotecznych, zdefiniowanych w CADPL-Pack,  (cd:STR_ReParse, cd:BLK_GetDynBlockNames, cd:BLK_GetDynamicProps i cd:SSX_Convert), oraz funkcji SS_SSsub, którą znajdziesz w opisie tworzenia różnicy zbiorów wskazań.

( . . . )

2 uwagi do wpisu “Bloki dynamiczne: wybieranie na podstawie parametru

  1. Hm. I czy to było/jest takie trudne żeby zamieścić „filmik” z użycia lispa (jak np u Lee M.) ?
    Teraz każdy (również nie Polsko języczny) użytkownik AC wie co „robi” ten lisp – nawet jeśli nie rozumie jego opisu.
    Chylę czoła przed Pana wiedzą ale komunikacja z „fanami” nadal kuleje – choć idzie w dobrym kierunku.
    Pozdrawiam
    MW

    Polubione przez 1 osoba

Dodaj komentarz

Ta witryna wykorzystuje usługę Akismet aby zredukować ilość spamu. Dowiedz się w jaki sposób dane w twoich komentarzach są przetwarzane.