swazy Posted April 5, 2024 Report Posted April 5, 2024 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. Quote
kojacek Posted April 6, 2024 Report Posted April 6, 2024 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: 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ą. dmatusz3 and swazy 2 Quote
swazy Posted April 6, 2024 Author Report Posted April 6, 2024 Dziękuję za odpowiedź. Muszę się z tym przespać i pewnie będę męczył pytaniami dalej 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 ). Quote
swazy Posted April 13, 2024 Author Report Posted April 13, 2024 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)? Quote
kruszynski Posted April 15, 2024 Report Posted April 15, 2024 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, Quote
kojacek Posted April 15, 2024 Report Posted April 15, 2024 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. Quote
swazy Posted April 17, 2024 Author Report Posted April 17, 2024 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ć? Quote
swazy Posted April 18, 2024 Author Report Posted April 18, 2024 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? Quote
kruszynski Posted April 19, 2024 Report Posted April 19, 2024 @kojacek wytłumaczył tutaj: https://kojacek.wordpress.com/2016/12/01/visual-dumpallproperties/ Niestety na chwilę obecną w ZWCAD to nie jest jeszcze obsługiwane mamy do dyspozycji vlax-dump-object swazy 1 Quote
swazy Posted May 24, 2024 Author Report Posted May 24, 2024 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? ;) Quote
kojacek Posted May 25, 2024 Report Posted May 25, 2024 (edited) 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. 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: 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: To wszystko. Edited May 25, 2024 by kojacek dmatusz3 and swazy 2 Quote
swazy Posted May 26, 2024 Author Report Posted May 26, 2024 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? Quote
kojacek Posted May 26, 2024 Report Posted May 26, 2024 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 swazy 1 Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.