-
Postów
253 -
Dołączył
-
Ostatnia wizyta
-
Wygrane w rankingu
36
Aktywność reputacji
-
kojacek otrzymał(a) reputację od dmatusz3 w Numerowanie arkuszy - Zmienne lisp - brak na liście zmiennych [Rozwiązany]
W Ac możemy wstawić zmienną do pola, pod warunkiem że Ac nie jest LT:
-
kojacek otrzymał(a) reputację od kruszynski w Prostokąt obejmujący MTEXT i transformacje układów współrzędnych
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.
-
kojacek otrzymał(a) reputację od perlon w Prostokąt obejmujący MTEXT i transformacje układów współrzędnych
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.
-
kojacek otrzymał(a) reputację od swazy w [LISP] Odmrażanie warstw za pomocą kodu.
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) )
-
kojacek otrzymał(a) reputację od RobS w [LISP] Odmrażanie warstw za pomocą kodu.
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) )
-
kojacek otrzymał(a) reputację od dmatusz3 w [LISP] Odmrażanie warstw za pomocą kodu.
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) )
-
kojacek otrzymał(a) reputację od Pawel.G w Zamykanie obiektów w bloku
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/)
-
kojacek otrzymał(a) reputację od kruszynski w Program do podmiany wartości atrybutów w tym w liście bloków
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.
-
kojacek otrzymał(a) reputację od RobS w Program do podmiany wartości atrybutów w tym w liście bloków
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.
-
kojacek otrzymał(a) reputację od dmatusz3 w Program do podmiany wartości atrybutów w tym w liście bloków
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:
-
kojacek otrzymał(a) reputację od kruszynski w Program do podmiany wartości atrybutów w tym w liście bloków
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:
-
kojacek otrzymał(a) reputację od wedzik w Program do podmiany wartości atrybutów w tym w liście bloków
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:
-
kojacek otrzymał(a) reputację od swazy w [LISP] Dostęp do elementów 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
-
kojacek otrzymał(a) reputację od swazy w [LISP] Dostęp do elementów w szyku
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.
-
kojacek otrzymał(a) reputację od dmatusz3 w [LISP] Dostęp do elementów w szyku
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.
-
kojacek otrzymał(a) reputację od swazy w [LISP] Dostęp do elementów w szyku
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ą.
-
kojacek otrzymał(a) reputację od dmatusz3 w [LISP] Dostęp do elementów w szyku
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ą.
-
kojacek otrzymał(a) reputację od dmatusz3 w Wyciągnięcie danych z bloku dynamicznego
Możesz użyć funkcji cd:BLK_GetDynamicProps z biblioteki CADPL-Pack-v1.lsp, tak jak na animacji poniżej dla bloku dynamicznego ścian wielowarstwowych. Ma to zastosowanie dla AutoCAD w wersji 2004 i wyższych, dla ZwCAD - nie wiem niestety.
-
kojacek otrzymał(a) reputację od swazy w Wyciągnięcie danych z bloku dynamicznego
Możesz użyć funkcji cd:BLK_GetDynamicProps z biblioteki CADPL-Pack-v1.lsp, tak jak na animacji poniżej dla bloku dynamicznego ścian wielowarstwowych. Ma to zastosowanie dla AutoCAD w wersji 2004 i wyższych, dla ZwCAD - nie wiem niestety.
-
kojacek otrzymał(a) reputację od dmatusz3 w Jak narysować trapez równoramienny?
W AutoCAD-zie mam 4 kliki:
(1) klik - zaznaczam prostokąt (2) klik - zaznaczam prawy górny wierzchołek (3) klik - po przesunięciu klikam środek górnego boku (4) klik - zanaczam lewy dolny uchwyt. Tu już wiecej nie klikam (przesuwam kursor), a z klawiatury wpisuję 50 i voila (i jeszcze ESC (z klawiatury)):
-
kojacek otrzymał(a) reputację od dmatusz3 w Lisp - zlecenie napisania programu
Z mojej strony takie coś:
; -------------------------------------------------------------------------------------------- ; ; by kojacek 2022 ; -------------------------------------------------------------------------------------------- ; (defun C:MOD_WAR (/ d) (if (setq d (cd:SYS_ReadFile nil (findfile "warstwy.dat"))) (if (setq d (vl-remove-if '(lambda (%)(/= (substr % 1 1) "*")) d) ) (progn (cd:SYS_UndoBegin) (foreach % d (LayChProp %)) (cd:SYS_UndoEnd) ) ) ) (princ) ) ; -------------------------------------------------------------------------------------------- ; (defun LayChProp (Data / d s c v p g x y cl :color :tcolor :lweight) (defun :lweight (/ %1 %2 %3) (vl-remove-if 'minusp (if (setq %1 (vl-sort (vl-remove-if-not '(lambda (%2)(wcmatch %2 "ACLNWT*")) (atoms-family 1) )'< ) ) (mapcar '(lambda (%3) (eval (read %3))) %1 ) ) ) ) (defun :tcolor () (vla-getinterfaceobject (vlax-get-acad-object) (strcat "AutoCAD.AcCmColor." (substr (getvar "ACADVER") 1 2) ) ) ) (defun :color (i m / r) (if (<= (strlen i) 3) (progn (setq r (abs (atoi i))) (if m (if (and (>= r 0)(<= r 256)) r) (if (and (>= r 1)(<= r 255)) r) ) ) (progn (setq r (cd:STR_Parse i "," t)) (if (and (listp r)(= 3 (length r))) (mapcar 'atoi r) ) ) ) ) (setq d (cd:STR_Parse Data ";" t) l (substr (car d) 2) ) (if (= 5 (length d)) (if (tblobjname "LAYER" l) (progn (setq s (cadr d) ; lay-on-off v (vlax-ename->vla-object (tblobjname "LAYER" l)) ; lay-vlaxobj c (:color (caddr d) nil) ; lay-color p (cadddr d) ; lay-ltype g (atoi (car (cddddr d))) ; lay-lwght x (ssget "_x" (list (cons 8 l) (cons 410 (getvar "CTAB")) ) ) ) (if (member s '("0" "1")) (if (zerop (read s)) (LayOnOff l) ) ) (if c (if (= (type c) 'INT) (vla-put-Color v c) (progn (setq cl (:tcolor)) (vla-SetRGB cl (car c)(cadr c)(caddr c)) (vla-put-TrueColor v cl) ) ) ) (if (tblobjname "LTYPE" p) (vla-put-Linetype v p) ) (if (and g (member g (:lweight))) (vla-put-LineWeight v g) ) (if x (progn (setq x (cd:SSX_Convert x 1)) (foreach % x (vla-put-Color % 256) (vla-put-LineType % "ByLayer") (vla-put-LineWeight % -1) ) ) ) ) ) ) ) ; -------------------------------------------------------------------------------------------- ; (defun LayOnOff (Lay / e d) (if (setq e (tblobjname "LAYER" Lay)) (progn (setq d (entget e)) (setq d (subst (cons 62 (* -1 (cdr (assoc 62 d))) ) (assoc 62 d) d) ) (entmod d) ) ) ) ; -------------------------------------------------------------------------------------------- ; (princ) Potrzebne będą:
1) Załadowany plik CADPL-Pack-v1.lsp (tutaj info: https://kojacek.wordpress.com/2015/11/04/cadpl-pack/)
2) plik o nazwie warstwy.dat i poniższej strukturze:
;;;*name,status,layercolor,layelinetype,layerlineweight *jezdnia (powierzchnia);1;7;Continous;30 *krawężnik (linia);1;1;Continous;30 *plac (powierzchnia);1;147,39,143;%;% *chodnik (powierzchnia);1;147,39,143;%;% *219-linia granicy;1;3;218-500;%;% *211- Nr działki;1;3;%;% *238-Punkt adresowy budynku;1;7;%;% *238-Punkt adresowy;1;7;%;% *994-Nazwa ulicy;1;27;%;30 Działa to wszystko tak:
- wywołujemy polecenie MOD_WAR (trzeba załadowac wczesniej kod i Pack-a)
- jezeli zostanie znaleziony plik tekstowy warswtwy,dat, to dla danych z kazdej linii wykonywane sa zmiany dla warstw.
Skladnia pliku jest prosta:
- brane sa pod uwage tylko linie rozpoczynajace sie od * (gwiazdki)
- po niej nastepuje nazwa warstwy,
- separatorami sa znaki "srednika" ;
- po warstwie wystepuja koleno dane: stan warstwy (jezeli jest to 0 warstwa jest ukrywana) dopuszczalne wartosci to 0 i 1
- potem jest kolor warstwy - liczba (od 1 do 255) lub RGB formatu rrr,ggg,bbb (separatorem jest przecinek)
- po kolejnym sredniku jest nazwa rodzaju linii, jezeli zostanie znaleziony w rysunku zostanie przypisany do warstwy
- na koncu jest szerokosc linii. Tylko dopuszczalne szerokosci, (zobacz: https://kojacek.wordpress.com/2015/11/26/szerokosc-linii/)
ogólnie dla wartosci dla których nic nie zmieniamy wstawiamy znak procent (%). program kontroluje poprawnosc dla czesci danych, wtedy je pomija.
Plik dat trzeba sobie rozbudowac o kolejne wpisy,
-
kojacek otrzymał(a) reputację od Marek-M w Lisp - zlecenie napisania programu
Z mojej strony takie coś:
; -------------------------------------------------------------------------------------------- ; ; by kojacek 2022 ; -------------------------------------------------------------------------------------------- ; (defun C:MOD_WAR (/ d) (if (setq d (cd:SYS_ReadFile nil (findfile "warstwy.dat"))) (if (setq d (vl-remove-if '(lambda (%)(/= (substr % 1 1) "*")) d) ) (progn (cd:SYS_UndoBegin) (foreach % d (LayChProp %)) (cd:SYS_UndoEnd) ) ) ) (princ) ) ; -------------------------------------------------------------------------------------------- ; (defun LayChProp (Data / d s c v p g x y cl :color :tcolor :lweight) (defun :lweight (/ %1 %2 %3) (vl-remove-if 'minusp (if (setq %1 (vl-sort (vl-remove-if-not '(lambda (%2)(wcmatch %2 "ACLNWT*")) (atoms-family 1) )'< ) ) (mapcar '(lambda (%3) (eval (read %3))) %1 ) ) ) ) (defun :tcolor () (vla-getinterfaceobject (vlax-get-acad-object) (strcat "AutoCAD.AcCmColor." (substr (getvar "ACADVER") 1 2) ) ) ) (defun :color (i m / r) (if (<= (strlen i) 3) (progn (setq r (abs (atoi i))) (if m (if (and (>= r 0)(<= r 256)) r) (if (and (>= r 1)(<= r 255)) r) ) ) (progn (setq r (cd:STR_Parse i "," t)) (if (and (listp r)(= 3 (length r))) (mapcar 'atoi r) ) ) ) ) (setq d (cd:STR_Parse Data ";" t) l (substr (car d) 2) ) (if (= 5 (length d)) (if (tblobjname "LAYER" l) (progn (setq s (cadr d) ; lay-on-off v (vlax-ename->vla-object (tblobjname "LAYER" l)) ; lay-vlaxobj c (:color (caddr d) nil) ; lay-color p (cadddr d) ; lay-ltype g (atoi (car (cddddr d))) ; lay-lwght x (ssget "_x" (list (cons 8 l) (cons 410 (getvar "CTAB")) ) ) ) (if (member s '("0" "1")) (if (zerop (read s)) (LayOnOff l) ) ) (if c (if (= (type c) 'INT) (vla-put-Color v c) (progn (setq cl (:tcolor)) (vla-SetRGB cl (car c)(cadr c)(caddr c)) (vla-put-TrueColor v cl) ) ) ) (if (tblobjname "LTYPE" p) (vla-put-Linetype v p) ) (if (and g (member g (:lweight))) (vla-put-LineWeight v g) ) (if x (progn (setq x (cd:SSX_Convert x 1)) (foreach % x (vla-put-Color % 256) (vla-put-LineType % "ByLayer") (vla-put-LineWeight % -1) ) ) ) ) ) ) ) ; -------------------------------------------------------------------------------------------- ; (defun LayOnOff (Lay / e d) (if (setq e (tblobjname "LAYER" Lay)) (progn (setq d (entget e)) (setq d (subst (cons 62 (* -1 (cdr (assoc 62 d))) ) (assoc 62 d) d) ) (entmod d) ) ) ) ; -------------------------------------------------------------------------------------------- ; (princ) Potrzebne będą:
1) Załadowany plik CADPL-Pack-v1.lsp (tutaj info: https://kojacek.wordpress.com/2015/11/04/cadpl-pack/)
2) plik o nazwie warstwy.dat i poniższej strukturze:
;;;*name,status,layercolor,layelinetype,layerlineweight *jezdnia (powierzchnia);1;7;Continous;30 *krawężnik (linia);1;1;Continous;30 *plac (powierzchnia);1;147,39,143;%;% *chodnik (powierzchnia);1;147,39,143;%;% *219-linia granicy;1;3;218-500;%;% *211- Nr działki;1;3;%;% *238-Punkt adresowy budynku;1;7;%;% *238-Punkt adresowy;1;7;%;% *994-Nazwa ulicy;1;27;%;30 Działa to wszystko tak:
- wywołujemy polecenie MOD_WAR (trzeba załadowac wczesniej kod i Pack-a)
- jezeli zostanie znaleziony plik tekstowy warswtwy,dat, to dla danych z kazdej linii wykonywane sa zmiany dla warstw.
Skladnia pliku jest prosta:
- brane sa pod uwage tylko linie rozpoczynajace sie od * (gwiazdki)
- po niej nastepuje nazwa warstwy,
- separatorami sa znaki "srednika" ;
- po warstwie wystepuja koleno dane: stan warstwy (jezeli jest to 0 warstwa jest ukrywana) dopuszczalne wartosci to 0 i 1
- potem jest kolor warstwy - liczba (od 1 do 255) lub RGB formatu rrr,ggg,bbb (separatorem jest przecinek)
- po kolejnym sredniku jest nazwa rodzaju linii, jezeli zostanie znaleziony w rysunku zostanie przypisany do warstwy
- na koncu jest szerokosc linii. Tylko dopuszczalne szerokosci, (zobacz: https://kojacek.wordpress.com/2015/11/26/szerokosc-linii/)
ogólnie dla wartosci dla których nic nie zmieniamy wstawiamy znak procent (%). program kontroluje poprawnosc dla czesci danych, wtedy je pomija.
Plik dat trzeba sobie rozbudowac o kolejne wpisy,
-
kojacek otrzymał(a) reputację od swazy w [AutoLisp] Zmiana widoczności warstwy.
Byłoby dziwne gdyby wpółpracował. Lista z tblsearch nie jest poprawną listą dla entmod. Użyj tu formy entget + tblobjname. Zobacz:
(setq e (tblobjname "layer" "zbrojenie_linie" )) (setq d (entget e)) (entmod (subst (cons 62 -8)(assoc 62 d) d)) a to prowadzić może do bardziej ogólnej funkcji:
(defun LayOnOff (Lay / e d) (if (setq e (tblobjname "LAYER" Lay)) (progn (setq d (entget e)) (setq d (subst (cons 62 (* -1 (cdr (assoc 62 d))) ) (assoc 62 d) d) ) (entmod d) ) ) ) Funkcja steruje widocznością warstwy podanej jako jej argument tak jak przełącznik, wywołaj kolejno:
(LayOnOff "zbrojenie_linie")
-
-
kojacek otrzymał(a) reputację od dmatusz3 w lisp, generowanie kierunków/grotów strzałek na zadanej polilinii
Zadanie z tych banalnych raczej... Można rozwiązać tak:
; ---------------------------------------------------------------------------- ; (defun c:testuj ()(InsBlkInPolySeg (car (entsel)) "arrow1" 20.0 15.0)(princ)) ; ---------------------------------------------------------------------------- ; ; funkcja zwraca liste segmentow LWPOLY typu: ((p1 bulge1 p2)(p2 bulge2 p3)...); ; ---------------------------------------------------------------------------- ; (defun jk:LWP_GetSegments (e / p d r) (setq d (entget e) p (if (= 1 (logand (cdr (assoc 70 d)) 1)) (cdr (assoc 10 d)) ) d (mapcar 'cdr (vl-remove-if-not '(lambda (%)(member (car %) '(10 42))) d ) ) ) (if p (setq d (append d (list p))) ) (while (> (length d) 2) (setq r (cons (list (car d) (cadr d) (caddr d) ) r ) d (cddr d) ) ) (reverse r) ) ; ---------------------------------------------------------------------------- ; (defun InsBlkInPolySeg (Poly Block Scale MinLength / d b n a p) (if (not (tblobjname "BLOCK" Block)) (princ (strcat "\nBłąd: w rysunku nie ma bloku " (strcase Block) "." ) ) (if (not (setq d (jk:LWP_GetSegments Poly)) ) (princ "\nBłąd - niepoprawna Polilinia.") (if (not (setq d (vl-remove-if-not '(lambda (%)(zerop (cadr %))) d) ) ) (princ "\nBłąd - polilinia składa sie z samych łuków.") (if (not (setq d (vl-remove-if '(lambda (%) (< (distance (car %)(caddr %)) MinLength) ) d ) ) ) (princ "\nBłąd - segmenty polilinii są za krótkie.") (progn (cd:SYS_UndoBegin) (foreach % d (setq a (angle (car %)(caddr %)) p (polar (car %) a (/ (distance (car %)(caddr %)) 2.0)) ) (cd:BLK_InsertBlock p Block (list Scale Scale Scale) a nil) ) (cd:SYS_UndoEnd) ) ) ) ) ) ) ; ---------------------------------------------------------------------------- ; Polecenie TESTUJ, wywołuje funkcję InsBlkInPolySeg, dla której jednak kluczem jest funkcja jk:LWP_GetSegments. Dla całości trzeba CADPL-Pack-a który opisywałem kiedyś tutaj: https://kojacek.wordpress.com/2015/11/04/cadpl-pack/ . W uproszczeniu - groty strzałek w postaci bloku (argument Block) wstawiane są na liniowych segmentach wskazanej polilinii (argument Block - tutaj trzeba wstawić jeszcze jakieś testowanie wyboru), których długość jest większa niż argument MinLength.