[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

  • 1 miesiąc temu...
W dniu 6.04.2024 o 11:09, kojacek napisał:

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.

Rzeczywiście działa 🤩 Dziękuję! A w jaki sposób ( o ile to jest możliwe ) mogę dostać się do elementu źródłowego szyku coby go edytować?

I drugie pytanie: czy to narzędzie poniżej jest tylko dla magów, czy też może zostało udostępnione śmiertelnikom? ;)
image.png.2623cf4bf474f3aa72a89bc2a0ee5547.png

Odnośnik do komentarza
Udostępnij na innych stronach

To jest stosunkowo proste. Zatem pokażę to na prostym przykładzie. Do tego potrzeba użyć tylko paru nawiasów. Na obrazie widać polilinię, której kopia posłużyła do stworzenia szyku (powyżej polilinii) ów szyk

array_01.gif.aee4ae4f2de7416ee64c4cba1979c995.gif

Jak wcześniej zostało ustalone, mamy tutaj blok anonimowy (będący szykiem) który (w swojej definicji) składa się z instancji, innego bloku anonimowego reprezentującego grafikę obiektów powielanych w szyku. Ustalmy zatem jego nazwę. Wykorzystamy funkcje już wcześniej przezentowane. Wywołanie:

(setq %b
  (mapcar
   '(lambda (%)
      (cdr (assoc 2 (entget %)))
    )
    (getinsidearray (car (entsel)))
  )
)


Pokaże nam listę nazw bloków (składowych szyku) - jest to jeden (powielony) blok:

BlockNameList.png.57a81107094b47bfbbaab4e89c8cfbd5.png

Właściwie to już wszystko, bo mając nazwę bloku mamy nieograniczony dostęp do jego definicji, którą to możemy w dowolny sposób modyfikować (zmieniać/dodawać/usuwać obiekty). Przykładowo - modyfikacja może wygladać tak. Bierzemy elementy w tym bloku (tutaj dla uproszczenia tylko jeden - polilinia):

(setq %e
  (vlax-ename->vla-object
    (car
      (cd:BLK_GetEntity (car %b) nil)
    )
  )
)

i modyfikujemy polilinię - nadajemy jej stałą szerokość = 10.0, oraz kolor czerwony...

(vla-put-ConstantWidth %e 5.0)(vla-put-Color %e 1)

Nic nie widać? Regenerujemy rysunek i... voila:

array_02.gif.9f9d46a28dd0f8343bbd9b35e9bb4827.gif

To wszystko.

Edytowane przez kojacek
Odnośnik do komentarza
Udostępnij na innych stronach

Faktycznie, nie jest to skomplikowane. Spodziewałem się, że gdzieś siedzi definicja zbioru który jest obiektem/ami źródłowym szyku.
A idąc za ciosem to czy (a znając Was to raczej "gdzie" :) ) da się modyfikować liczbę elementów/kolumn/wierszy i ich rozstaw w szyku?

Odnośnik do komentarza
Udostępnij na innych stronach

22 minuty temu, swazy napisał:

Faktycznie, nie jest to skomplikowane. Spodziewałem się, że gdzieś siedzi definicja zbioru który jest obiektem/ami źródłowym szyku.
A idąc za ciosem to czy (a znając Was to raczej "gdzie" :) ) da się modyfikować liczbę elementów/kolumn/wierszy i ich rozstaw w szyku?

Jeżeli: (getpropertyvalue ENAME "ClassName") gdzie ENAME to ename szyku
zwróci "AcDbAssociativeRectangularArray"

można dać:

(setpropertyvalue ENAME "Items" INT) <- ilość kolumn
(setpropertyvalue ENAME "ItemSpacing" REAL) <- odległość między kolumnami

to samo dla: 
RowsWithExpression <- Wiersze
RowSpacingWithExpression <- Odstępy między wierszami

oraz:

Levels  <- Poziomy
LevelSpacing <- Odstęp między poziomami

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