-
Postów
247 -
Dołączył
-
Ostatnia wizyta
-
Wygrane w rankingu
35
Ostatnia wygrana kojacek w dniu 28 Października
Użytkownicy przyznają kojacek punkty reputacji!
Profile Information
-
Gender
Male
Ostatnie wizyty
Osiągnięcia kojacek
Nowicjusz (2/6)
63
Reputacja
-
kruszynski zareagował(a) na odpowiedź w temacie: Prostokąt obejmujący MTEXT i transformacje układów współrzędnych
-
Prostokąt obejmujący MTEXT i transformacje układów współrzędnych
kojacek odpowiedział(a) na perlon temat w Wsparcie programistyczne LISP i VisualLISP
WIdzę teraz, że odsunięcie ramki nie jest wyrażone w jednostkach, tylko jako jako współczynnik wysokości. Wartość 1 daje odsunięcie o wartości Height MTEXT-u. -
perlon zareagował(a) na odpowiedź w temacie: Prostokąt obejmujący MTEXT i transformacje układów współrzędnych
-
swazy zareagował(a) na odpowiedź w temacie: [LISP] Odmrażanie warstw za pomocą kodu.
-
Prostokąt obejmujący MTEXT i transformacje układów współrzędnych
kojacek odpowiedział(a) na perlon temat w Wsparcie programistyczne LISP i VisualLISP
Potrzebujesz: 1) (załadowanego) CADPL-Pack'a (wiadomo) 2) funkcji z Express Tools: acet-geom-mtxtbox (oprócz AutoCAD-a jest w BricsCAD-zie i GStar'ze. Nie wiem jak jest w ZwCAD-ie) 3) Poniższego kawałka kodu: ;;; ramka MTEXTu (2024 by kojacek) (defun C:MTEST (/ %e %d %p %o %z) (if (and (setq %e (car (entsel "\Wybierz MTEXT:"))) (= "MTEXT" (cdr (assoc 0 (setq %d (entget %e))))) ) (progn (setq %p (acet-geom-mtxtbox %d 0.0) %z (cdr (assoc 210 %d)) %p (mapcar '(lambda (%) (trans % 1 %z) ) %p ) ) (setq %o (cd:ACX_AddLWPolyline (cd:ACX_ASpace) %p t)) (vla-TransformBy %o (cd:CON_TransMatrix 0)) ) (princ "\nZły wybór.") ) ) Z tego co na szybko przetestowałem, maluje prostokąt dla wskazanego MTEXT-u, niezależnie od aktywnego układu współrzednych. Funkcja acet-geom-mtxtbox, zwraca współrzędne prostokata opisującego rzeczywisty obszar MTEXT-u (porównaj z ramką MTEXT-u). Swego czasu poruszałem to tu: https://kojacek.wordpress.com/2017/10/08/wielkosc-obszaru-mtext-u/. Drugi argument funkcji (tutaj 0.0), to odsunięcie prostokąta. Pozwala to na rysowanie większego obramowania. -
RobS zareagował(a) na odpowiedź w temacie: [LISP] Odmrażanie warstw za pomocą kodu.
-
dmatusz3 zareagował(a) na odpowiedź w temacie: [LISP] Odmrażanie warstw za pomocą kodu.
-
[LISP] Odmrażanie warstw za pomocą kodu.
kojacek odpowiedział(a) na swazy temat w Wsparcie programistyczne LISP i VisualLISP
Być może przyczyną jest funkcja entmod. Wprawdzie może ona modyfikować obiekty niegraficzne (tutaj LAYER), ale gdzieś czytałem że są wyjątki dla kodu 70 - nie pamiętam jednak czego dotyczyły. W autocadowskich "antycznychch" czasach (przed ActiveX (czyli przed 1999 )), pewnie bym użył command zamiast entmod… ale pewnie dlatego że byłoby łatwiej. Na marginesie - Twoje warunkowanie kodu 70 jest błędne - działa tylko w wyjątkowych sytuacjach. Kod 70 jest wartością bitową, więc na przykład 1 jest prawdziwe nie tylko dla 1, ale też 3 (2+1)... 5 (4+1)... 7 (2+4+1)... 9... etc. Teraz przykład z użyciem ActiveX (i CADPack'a). Krótko (i co ważniejsze) działa: (defun C:ODMROZWAR () (vlax-for % (cd:ACX_Layers) (if (and (= :vlax-true (vla-get-freeze %)) (wcmatch (vla-get-name %) "LS*") ; <- moj testowy filtr ) (vla-put-freeze % :vlax-false) ) ) (vla-regen (cd:ACX_ADoc) 0) (princ) ) -
Pawel.G zareagował(a) na odpowiedź w temacie: Zamykanie obiektów w bloku
-
Zamykanie obiektów w bloku
kojacek odpowiedział(a) na Pawel.G temat w Wsparcie programistyczne LISP i VisualLISP
Jeszcze: 1) sprawdzić czy trzeba cokolwiek robić (bo blok który chcemy stworzyć już istnieje) 2) deklarować zmienne lokalne (zawsze) 3) poznać funkcję initget dla getreal / getint / getangle / getpoint (ilość modułów = 0, a kąt 666...) 4) blok można tworzyć przez command / entmake / activeX (https://kojacek.wordpress.com/2017/11/22/programowe-tworzenie-bloku/) 5) alternatywnie pomysleć o szykach (https://kojacek.wordpress.com/2024/05/26/dostep-do-elementow-szyku/) albo MINSERT (https://kojacek.wordpress.com/2019/06/23/blok-5-rzeczy-o-ktorych-byc-moze-nie-wiesz/) -
Zaznaczanie obiektów wewnątrz polilinii
kojacek odpowiedział(a) na dmatusz3 temat w ZWCAD Standard i Professional
Nieco mnie to zmobilizowało... do uporządkowania pewnych rozważań nad zbiorami wskazań. Trochę bardziej rozbudowane tworzenie zbiorów wskazań przez krzywe (LINE/LWPOLYLINE/ARC/ELLIPSE/SPLINE), krawędzią, oknem, oknem przecinającym. Także z filtrami. Więcej: https://kojacek.wordpress.com/2024/09/08/zbior-wskazan-okreslony-krzywa/ -
kruszynski zareagował(a) na odpowiedź w temacie: Program do podmiany wartości atrybutów w tym w liście bloków
-
RobS zareagował(a) na odpowiedź w temacie: Program do podmiany wartości atrybutów w tym w liście bloków
-
Program do podmiany wartości atrybutów w tym w liście bloków
kojacek odpowiedział(a) na Robert11 temat w Wsparcie programistyczne LISP i VisualLISP
(defun %aaa () (foreach % (list "ENE" "DUE" "RABE" "POLKNAL" "CHINCZYK" "NAME") (progn (setq *ATT-LIST* (list % "SYMBOL" "LPS")) (C:ATR-ZMIANA) ) ) )- 11 odpowiedzi
-
- jedna operacja
- wiele bloków
-
(i 3 więcej)
Oznaczone tagami:
-
Program do podmiany wartości atrybutów w tym w liście bloków
kojacek odpowiedział(a) na Robert11 temat w Wsparcie programistyczne LISP i VisualLISP
Można się pokusić o (w istocie drobną) przeróbkę tego kodu, aby pracował w trybie "wsadowym". Kod wygląda teraz tak: ; -------------------------------------------------------------------------- ; ; C:ATR-ZMIANA by kojacek 2024 (http://kojacek.wordpress.com) ; ; -------------------------------------------------------------------------- ; (defun C:ATR-ZMIANA ()(jk:140824_GetBklMask)(princ)) ; -------------------------------------------------------------------------- ; (defun jk:140824_GetBklMask ( / %m %s %l %a %b %r %e %i %o :t) (defun :t (i) (getstring (strcat "\nPodaj " (nth i (list "pierwszy" "drugi")) " tag atrybutu do zamiany: " ) ) ) (if (setq %m (if (not *ATT-LIST*) (getstring "\nPodaj początkowy fragment nazwy bloku: ") (car *ATT-LIST*) ) ) (if (member %m (list "" " ")) (princ "\nBłąd - zła nazwa.") (if (setq %s (ssget "_x" (list (cons 0 "INSERT") (cons 410 (getvar "CTAB")) (cons 2 (strcase (strcat %m "*"))) ) ) ) (progn (setq %l (cd:SSX_Convert %s 0)) (if (and (setq %a (if (not *ATT-LIST*) (strcase (:t 0)) (cadr *ATT-LIST*) ) ) (setq %b (if (not *ATT-LIST*) (strcase (:t 1)) (caddr *ATT-LIST*) ) ) ) (progn (setq %r (mapcar '(lambda (% / %1 %2 %3) (if (setq %1 (cd:BLK_GetAtts %)) (if (and (setq %2 (cdr (assoc %a %1))) (setq %3 (cdr (assoc %b %1))) ) (list % %2 %3) 1 ) 1 ) ) %l ) %e (vl-remove-if-not 'numberp %r) %r (mapcar 'car (vl-remove-if 'numberp %r)) ) (if %r (progn (cd:SYS_UndoBegin) (foreach % %r (setq %i (cd:BLK_GetAtts %) %o (vlax-ename->vla-object %) ) (cd:BLK_SetAttValueVLA %o %a (cdr (assoc %b %i)) ) (cd:BLK_SetAttValueVLA %o %b (cdr (assoc %a %i)) ) ) (princ (strcat "\nZmieniono atrybuty w " (itoa (length %r)) " blokach." (if %e (strcat " Odrzucono " (itoa (length %e)) " bloków." ) "" ) ) ) (cd:SYS_UndoEnd) ) (princ (strcat "\n" (itoa (length %l)) " bloków nie spełnia wymagań do zmiany atrybutów." ) ) ) ) (princ "\nBłąd. Wymagane nazwy atrybutów.") ) ) (princ "\nNie znaleziono odpowienich bloków.") ) ) (princ "\nBłąd. Brak nazwy") ) ) ; -------------------------------------------------------------------------- ; (princ) Przed wywołaniem polecenia wystarczy teraz zadeklarować zmienną globalną o nazwie *ATT-LIST*. Jest to trzyelementowa lista gdzie pierwszy element to maska (początkowy fragment) nazwy bloku, a dwa kolejne to tagi atrybutów do zamiany. Deklaracja zmiennej: (setq *ATT-LIST* (list "NAME" "SYMBOL" "LPS")) Następnie wywołania polecenia ATR-ZMIANA skutkują jak na animacji poniżej. Gdy zmienna nie jest zadeklarowana polecenie działa jak w poprzednim poście. Nie trzeba tłumaczyć że wartości zmiennej można modyfikować w zależności od potrzeb.- 11 odpowiedzi
-
- jedna operacja
- wiele bloków
-
(i 3 więcej)
Oznaczone tagami:
-
dmatusz3 zareagował(a) na odpowiedź w temacie: Program do podmiany wartości atrybutów w tym w liście bloków
-
kruszynski zareagował(a) na odpowiedź w temacie: Program do podmiany wartości atrybutów w tym w liście bloków
-
Program do podmiany wartości atrybutów w tym w liście bloków
kojacek odpowiedział(a) na Robert11 temat w Wsparcie programistyczne LISP i VisualLISP
Potrzebujesz wykonać następujące czynności: 1) załadować CADPL-Pack'a. Znajdziesz go tutaj: https://kojacek.wordpress.com/2015/11/04/cadpl-pack/ 2) oraz poniższy kod definiujący polecenie ATR-ZMIANA: ; -------------------------------------------------------------------------- ; ; C:ATR-ZMIANA by kojacek 2024 (http://kojacek.wordpress.com) ; ; -------------------------------------------------------------------------- ; (defun C:ATR-ZMIANA ()(jk:140824_GetBklMask)(princ)) ; -------------------------------------------------------------------------- ; (defun jk:140824_GetBklMask ( / %m %s %l %a %b %r %e %i %o :t) (defun :t (i) (getstring (strcat "\nPodaj " (nth i (list "pierwszy" "drugi")) " tag atrybutu do zamiany: " ) ) ) (if (setq %m (getstring "\nPodaj początkowy fragment nazwy bloku: ") ) (if (member %m (list "" " ")) (princ "\nBłąd - zła nazwa.") (if (setq %s (ssget "_x" (list (cons 0 "INSERT") (cons 410 (getvar "CTAB")) (cons 2 (strcase (strcat %m "*"))) ) ) ) (progn (setq %l (cd:SSX_Convert %s 0)) (if (and (setq %a (strcase (:t 0))) (setq %b (strcase (:t 1))) ) (progn (setq %r (mapcar '(lambda (% / %1 %2 %3) (if (setq %1 (cd:BLK_GetAtts %)) (if (and (setq %2 (cdr (assoc %a %1))) (setq %3 (cdr (assoc %b %1))) ) (list % %2 %3) 1 ) 1 ) ) %l ) %e (vl-remove-if-not 'numberp %r) %r (mapcar 'car (vl-remove-if 'numberp %r)) ) (if %r (progn (cd:SYS_UndoBegin) (foreach % %r (setq %i (cd:BLK_GetAtts %) %o (vlax-ename->vla-object %) ) (cd:BLK_SetAttValueVLA %o %a (cdr (assoc %b %i)) ) (cd:BLK_SetAttValueVLA %o %b (cdr (assoc %a %i)) ) ) (princ (strcat "\nZmieniono atrybuty w " (itoa (length %r)) " blokach." (if %e (strcat " Odrzucono " (itoa (length %e)) " bloków." ) "" ) ) ) (cd:SYS_UndoEnd) ) (princ (strcat "\n" (itoa (length %l)) " bloków nie spełnia wymagań do zmiany atrybutów." ) ) ) ) (princ "\nBłąd. Wymagane nazwy atrybutów.") ) ) (princ "\nNie znaleziono odpowienich bloków.") ) ) (princ "\nBłąd. Brak nazwy") ) ) ; -------------------------------------------------------------------------- ; (princ) 3) wywołujesz polecenie ATR-ZMIANA, jak na poniższym ruchomym obrazie:- 11 odpowiedzi
-
- jedna operacja
- wiele bloków
-
(i 3 więcej)
Oznaczone tagami:
-
[LISP] Dostęp do elementów w szyku
kojacek odpowiedział(a) na swazy temat w Wsparcie programistyczne LISP i VisualLISP
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 -
[LISP] Dostęp do elementów w szyku
kojacek odpowiedział(a) na swazy temat w Wsparcie programistyczne LISP i VisualLISP
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. -
[LISP] Dostęp do elementów w szyku
kojacek odpowiedział(a) na swazy temat w Wsparcie programistyczne LISP i VisualLISP
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. -
[LISP] Dostęp do elementów w szyku
kojacek odpowiedział(a) na swazy temat w Wsparcie programistyczne LISP i VisualLISP
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ą. -
Zamiana multilinii na polilinie
kojacek odpowiedział(a) na wedzik temat w ZWCAD Standard i Professional
Natomiast tutaj: https://kojacek.wordpress.com/2017/11/13/zamiana-mline-na-lwpolyline/ zamiana podwójnej (tylko) multilinii na polilinię z szerokością (taką jak odstępy między segmentami: -
Wyciągnięcie danych z bloku dynamicznego
kojacek odpowiedział(a) na swazy temat w Wsparcie programistyczne LISP i VisualLISP
Błędów jest więcej. Już w pierwszej linii - nie deklarujesz zmiennych lokalnych. W drugiej - nie warunkujesz utworzenia listy, Twoje wywołanie zadziała tylko w jednym przypadku - gdy blok istnieje. Potem już z górki... Warunek (if (= (cdr (assoc 2 (entget POM ))) (nth n LISTA )) jest właściwie losowy... Z drugiej strony nie rozumiem tych podwójnych repeat. Zbiór wskazań bloków dynamicznych uzyskasz przecież (w uproszczeniu) tak: (ssget "x" (list (cons 0 "INSERT") (cons 2 (cd:STR_ReParse (cd:BLK_GetDynBlockNames "<Nazwa bloku>") ",`" ) ) ) )