[LISP] Dostęp do elementów w szyku


Rekomendowane odpowiedzi

Dobry wieczór,
Mam pytanie programistyczne odnośnie szyków. Gdzie i w jaki sposób zapisane są dane poszczególnych elementów szyku?
Czy da się uzyskać dane położenia poszczególnych jego elementów? Czy możliwa jest edycja zakresu szyku, liczby elementów czy rozstawu
poprzez Lisp'a?

I drugie pytanie z innej beczki: czy możliwe jest zaprogramowanie własnych osnapów? Przykładowo chciałbym uzyskać endpoint i middlepoint, ale tylko dla obiektów ze wskazanej warstwy.

Odnośnik do komentarza
Udostępnij na innych stronach

Szyki jeśli mówimy o ich geometrycznej reprezentacji są (jak (powszechnie) wiadomo) blokami. Blokami anonimowymi. Ich struktura jest dwupoziomowa i wygląda tak: z obiektów które są powielane tworzone są bloki anonimowe. Następnie już w bloku szyku (również anonimowym) te bloki są układane w szyku prostokatnym, biegunowym lub po ścieżce, w odpowiedniej ilości.
Progra(mistycznie) trzeba w pierwszej kolejności: wybrać blok, ma być on anonimowy, i reprezentować szyk (bo nie każdy blok anonimowy nim jest). Tu mozna skorzystać z mojej funkcji jk:BLK_getInsertType (którą znajdziesz TUTAJ). Następnie mając wybrany blok szyku trzeba zbadać jego wszystkie obiekty będą to (rzecz jasna) bloki anonimowe. Tu można skorzystać z funkcji CADPL_Pack-a, o nazwie cd:BLK_GetEntity. Tak na szybko ten proces wykonuje funkcja:

; getinsidearray - by kojacek
(defun getinsidearray (Ename / %a)
  (if
    (and
      (setq %a (jk:BLK_getInsertType Ename))
      (wcmatch %a "ACDBASSOC*ARRAY")
    )
    (cd:BLK_GetEntity
      (cdr (assoc 2 (entget Ename)))
      nil
    )
    (prompt "\nTo nie szyk.")
  )
)

To może wyglądać tak:

image.png.e8b4ddb7969d71e39a57316c260197d1.png

Funkcję cd:BLK_GetEntity możesz użyć do zbadania każdego bloku anonimowego w szyku.

Druga rzecz:
Możliwe, acz (uważam) nie warte zachodu. Można tu wykorzystać taki sam mechanizm tworzenia osnap'ów jak dla funkcji grread. Jak wiadomo funkcja ta nie obsługuje trybów lokalizacji więc... jest w sieci kilka różnych rozwiązań (mniej lub bardziej skomplikowanych), które to symulują. 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Dziękuję za odpowiedź. Muszę się z tym przespać i pewnie będę męczył pytaniami dalej :)

obraz.png.c5f86eb22e96f41a360892ca4f109f0a.png

A póki co to mam jeszcze jedno pytanie z kolejnej beczki. Jak mogę się dostać do tych danych?
To jest point parameter, ale nie ma jego wartości w atrybutach, cd:BLK_GetEntity też tego nie pokazuje.
Dodam jeszcze, że to nie jest blok dynamiczny (wg cd:BLK_IsDynamicInsert ).

 

Odnośnik do komentarza
Udostępnij na innych stronach

W dniu 13.04.2024 o 15:37, swazy napisał:

Czy brak reakcji na pytanie oznacza, że w internecie było to wałkowane miliard razy i powinienem sobie to znaleźć (oczywiście próbowałem)?

Nie. Raczej znaczy że jest to skrajnie trudne. A tak trudno było mi przyznać się do własnej ignorancji.

Znam dwa sposoby utworzenia właściwości dla elementu. W pierwszym cały element jest "Custom Entity" czyli właściwości i geometria wyświetlają się tylko jeśli aplikacja jest wczytana. Jeśli aplikacja nie jest wczytana element wyświetla sie jako obiekt typu proxy. W tym przypadku nie znam sposobu dostania się do parametrów elementu. W drugim sposobie jest to tylko element interfejsu, wiec dane dodatkowe mogą nie być nigdzie w nim zapisywane. A mogą mogą być zapisywane w XData, albo Dictionary,

Odnośnik do komentarza
Udostępnij na innych stronach

36 minut temu, kruszynski napisał:

Nie. Raczej znaczy że jest to skrajnie trudne. A tak trudno było mi przyznać się do własnej ignorancji.

Znam dwa sposoby utworzenia właściwości dla elementu. W pierwszym cały element jest "Custom Entity" czyli właściwości i geometria wyświetlają się tylko jeśli aplikacja jest wczytana. Jeśli aplikacja nie jest wczytana element wyświetla sie jako obiekt typu proxy. W tym przypadku nie znam sposobu dostania się do parametrów elementu. W drugim sposobie jest to tylko element interfejsu, wiec dane dodatkowe mogą nie być nigdzie w nim zapisywane. A mogą mogą być zapisywane w XData, albo Dictionary,

Błędnym założeniem jest że ktokolwiek będzie wiedział skąd się wzięły i jak są zbudowane bloki na komputerze swazy'ego, po zaprezentowaniu obrazka właściwości. Pewnie inaczej sprawy by się miały, gdyby został udostępniony plik dwg.

Odnośnik do komentarza
Udostępnij na innych stronach

W dniu 15.04.2024 o 06:18, kojacek napisał:

Pewnie inaczej sprawy by się miały, gdyby został udostępniony plik dwg

Wiem, tylko że nie mogę tego udostępnić bo to element sytemu, prawa autorskie, bla, bla, bla....

https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/get-list-of-parameters-being-used-in-block-without-vla-vlax/m-p/8461420#M378276
 

Wykopałem z czeluści internetów taki post - chodzi mi praktycznie o to samo co w przytoczonym trójkącie.
Tylko z tego co rozumiem AutoCad ma (albo miał) wbudowaną funkcję getpropertyvalue. Sprawdzę to jutro (zaraz) w pracy.
Czy ZWCAD ma coś analogicznego, albo czy da się takowe wydziobać?

 

Odnośnik do komentarza
Udostępnij na innych stronach

Przy pomocy:

(getpropertyvalue blkEnt "AcDbDynBlockPropertyA1 X")

...udało mi się wyciągnąć współrzędne, które mnie interesują, ale ogrom niewiedzy pozostał...
 

(dumpallproperties blkEnt)

Co to właściwie jest i czy da się to w jakiś w miarę łopatologiczny sposób wyjaśnić laikowi co się tutaj wydarza?

 

Odnośnik do komentarza
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie