-
Postów
52 -
Dołączył
-
Ostatnia wizyta
-
Wygrane w rankingu
12
Treść opublikowana przez RobS
-
Co dzisiaj robiłem w lispie?
RobS odpowiedział(a) na wedzik temat w Wsparcie programistyczne LISP i VisualLISP
Hej, @mili napisz co dokładnie ma robić twój skrypt. Dla wygody własnej i innych twórców warto dodawać komentarze do swoich programów. W języku LISP są poprzedzone średnikiem, np. ;Zapisanie współrzędnych pierwszego punktu w zmiennej p1 Skrypt z twojej wiadomości tworzy polilinię która jest łukiem. Jeśli dobrze rozumiem, że chcesz stworzyć okrąg pojedynczym segmentem polilinii to chyba nie da się tego zrobić. -
Kopiowanie wraz z obracaniem
RobS odpowiedział(a) na PiotrI temat w Wsparcie programistyczne LISP i VisualLISP
Żeby uściślić, chcesz najpierw określić kąt obrotu skopiowanego elementu i później go wkleić w we wskazanym punkcie? Kąt obrotu chcesz określić na ekranie czy wpisując w pasku poleceń? -
Kopiowanie wraz z obracaniem
RobS odpowiedział(a) na PiotrI temat w Wsparcie programistyczne LISP i VisualLISP
Hej, Chodzi o to, żeby skopiować element i w trakcie wklejania poza miejscem określić także kąt? W nakładce ZWToolbox jest funkcja Kopiuj poprzez obrót, może to jakoś ułatwi twoje zadanie. Działanie funkcji pokazałem na poniższym nagraniu. -
Zamykanie obiektów w bloku
RobS odpowiedział(a) na Pawel.G temat w Wsparcie programistyczne LISP i VisualLISP
Dodałem kilka linijek do twojego programu które tworzą blok. Można podejść do sprawy na kilka sposobów, ja wybrałem dość podstawowy. Współrzędne lewego dolnego rogu zapisałem w zmiennej PU0. Po stworzeniu konstrukcji w zmiennej BlkName zostaje zapisana nazwa nowo utworzonego bloku według twojego opisu. Tutaj warto dodać jakieś wyróżnienie, w przypadku duplikatu program jest przerwany komunikatem. Później blok zostaje stworzony ze zbioru wybranego funkcją ssget. "_W" zaznacza obiekty w oknie opisanym podobniej jak prostokąt, lewy dolny róg PU0 i prawy górny róg PU2. Po utworzeniu blok jest wstawiony poleceniem _insert, ponieważ znika on z rysunku. Kod programu poniżej (DEFUN C:KONS (/ W H K O L R PU H_NEW X0 Y0 X_START Y_START PU0 PU2 BlkName) (SETQ W (GETREAL "\nPodaj szerokosc modulu: ")) (SETQ H (GETREAL "\nPodaj wysokosc modulu: ")) (SETQ K (GETREAL "\nPodaj kat nachylenia konstrukcji (w stopniach): ")) (SETQ O (GETREAL "\nPodaj odstep miedzy modulami: ")) (SETQ L (fix (GETREAL "\nPodaj ilosc modulow w poziomie: "))) ; Konwersja na typ całkowity (SETQ R (fix (GETREAL "\nPodaj ilosc modulow w pionie: "))) ; Konwersja na typ całkowity (SETQ PU (GETPOINT "\nPodaj naroznik konstrukcji PV: ")) ;; Obliczenie nowej wysokości (SETQ H_NEW (* H (COS (* K (/ PI 180.0))))) ; Konwersja kąta na radiany ;; WYZNACZENIE PRZECIWLEGŁEGO NAROŻNIKA MODUŁU (SETQ X0 (CAR PU)) (SETQ Y0 (CADR PU)) (SETQ X_START X0) ; Zapisanie początkowego X (SETQ Y_START Y0) ; Zapisanie początkowego Y (SETQ PU0 (list X_START Y_START )) ;Zapisanie współrzędnych lewego dolnego rogu konstrukcji w zmiannej PU0 ;; RYSOWANIE MODUŁÓW (repeat L (progn (repeat R (progn (SETQ PU2 (list (+ X0 W) (+ Y0 H_NEW))) ;; RYSOWANIE PROSTOKĄTA (COMMAND "_RECTANG" PU PU2) ;; Przesunięcie w dół o wysokość i odstępu modułu (SETQ Y0 (+ Y0 H_NEW O)) ; Y0 zwiększamy o nową wysokość i odstęp (SETQ PU (list X0 Y0)) ; Nowy punkt startowy ) ) ;; Przesunięcie w prawo o szerokość modułu i zadany odstęp (SETQ X0 (+ X0 W O)) ; X0 zwiększamy o szerokość i odstęp (SETQ Y0 Y_START) ; Resetowanie Y0 do początkowej wartości (SETQ PU (list X0 Y0)) ; Nowy punkt startowy ) ) (setq BlkName (strcat "Konstrukcja " (itoa L) " x " (itoa R))) ;Stworzenie nazwy nowego bloku i zapisanie jej w zmiennej BlkName (command "_Block" BlkName PU0 (ssget "_W" PU0 PU2) "") ;Stworzenie Bloku nazwanego BlkName z punktem bazowym w lewym dolnym rogu konstrukcji (command "_Insert" BlkName PU0 "" "" "") ;Wstawienie bloku który znika po utworzeniu ) -
Zamykanie obiektów w bloku
RobS odpowiedział(a) na Pawel.G temat w Wsparcie programistyczne LISP i VisualLISP
Hej, Spojrzałem na Twój skrypt i chcę się upewnić czy dobrze rozumiem zamysł. Chcesz, żeby pojedynczy moduł był blokiem? Blok można stworzyć funkcją command "_block", wstawić przy pomocy command "_insert". Ponadto skrypt można odrobinę uprościć. Kąt można wprowadzić używając "getangle". Przekształcenie na liczbę całkowitą pominąć używając "getint". Do odczytywania narysowanych elementów użyć "entlast". Rysowanie warto wstawić do osobnej funkcji. -
wyświetlanie punktów (koniec) na linii lub polilinii [Rozwiązany]
RobS odpowiedział(a) na ESPESA temat w ZWCAD Standard i Professional
Hej, Napisałem skrypt PunktyNaKoncach.lsp według pomysłu @dmatusz3 Plik należy wczytać poleceniem AP. Instrukcja użycia wyświetla się w pasku poleceń. Wystarczy tylko wpisać polecenie PunktyNaKoncach, zaznaczyć obiekty i kliknąć Enter. Pomarańczowe punkty zostaną wstawione na warstwie Punkty na końcach, jeśli takiej warstwy nie ma to skrypt automatycznie ją utworzy. Wszystko działa jak na nagraniu 😏 -
[LISP] Kopia definicji bloku pod inną nazwą
RobS odpowiedział(a) na swazy temat w Wsparcie programistyczne LISP i VisualLISP
Hej, Sprawdź poniższy skrypt, spełnia funkcjonalność o której piszesz 😁 Copy or Rename Block Reference -
Do liczenia bloków na rysunku możesz użyć skryptu Block Counter autorstwa Lee Mac. Skrypt uruchamia polecenie BLKCOUNT. Wynik wstawiany jest w formie tabeli z podglądem wyglądu, nazwą i ilością bloków na rysunku.
-
Hej, Długości linii i polilinii możesz zsumować poleceniem LINESUM, wynik wyświetli się w pasku poleceń. Obiekty na tej samej warstwie najlepiej wybrać klikając Prawy przycisk myszy -> Szybki wybór i ustawiając odpowiednie filtry. Po wybraniu obiektów wpisz w pasku poleceń LINESUM. Następnie wpisz P i kliknij Enter, żeby wrócić do poprzedniego zbioru elementów który zniknął po wywołaniu funkcji sumowania. Całość sumowania widać na poniższym nagraniu.
-
Program do podmiany wartości atrybutów w tym w liście bloków
RobS odpowiedział(a) na Robert11 temat w Wsparcie programistyczne LISP i VisualLISP
Hej, Czyli LISP ma automatycznie przejść po blokach NAME1 do NAME30 i zmienić wartość atrybutu SYMBOL na wartość atrybutu LPS, i vice versa? Czy możesz podesłać jakiś przykładowy rysunek z takimi blokami?- 11 odpowiedzi
-
- jedna operacja
- wiele bloków
-
(i 3 więcej)
Oznaczone tagami:
-
Hej, Spróbuj wykonać reset profilu 1. Reset profilu wykonajć przy zamkniętym programie ZWCAD. 2. Otwórz dowolny folder i w pasku adresu (z lewej strony) wklej: %appdata%\ZWSOFT\ZWCAD\2025 3. Zmienić nazwę katalogu en-US na en-US_kopia lub analogicznie pl-PL.
-
Jak szybko przywrócić widok?
RobS odpowiedział(a) na Stefan Wiatr temat w ZWCAD Standard i Professional
Hej, Widok z góry można ustawić jak na poniższych obrazach W obszarze modelu (bez względu na ustawiony interfejs) W interfejsie wstążkowym W interfejsie klasycznym -
OPCJA - SKALUJ SZEROKOŚĆ LINII [Rozwiązany]
RobS odpowiedział(a) na si4lex temat w ZWCAD Standard i Professional
Hej, Skalowanie szerokości linii oznacza, że wraz ze zmianą skali wydruku szerokość linii również zostanie przeskalowana. Na przykład linia o szerokość 2mm w skali 1:2 będzie miała po wydrukowaniu 1mm szerokości. -
Określanie powierzchni
RobS odpowiedział(a) na daria.anielska temat w Wsparcie programistyczne LISP i VisualLISP
Cześć, Element jest tłoczony. Najlepiej będzie poprosić autora rysunku o odczytanie powierzchni w programie Catia gdzie był robiony projekt. Chcesz znać powierzchnię przed czy po zgięciu? -
Bloki dynamiczne - obracanie tekstu
RobS odpowiedział(a) na Ernest125 temat w ZWCAD Standard i Professional
-
zwcad 2025_zestawienie pytań, spostrzeżeń i błędów
RobS odpowiedział(a) na alf temat w ZWCAD Standard i Professional
Cześć, Co do punktu 1, zwróć uwagę na to czy podpięty plik jest otwarty w oddzielnej karcie. Jeśli tak to Edycja odnośnika lokalnie (w pliku z załączonym XRef'em) nie będzie możliwa, wyświetli się komunikat jak niżej. Włącz tylko plik z załączonym XRef'em, wybierz podpięty obiekt i kliknij Edytuj odnośnik lokalnie. Po skończonej edycji klikaj Zapisz edycję odnośnika, żeby zapisać zmiany w podpiętym pliku. Jeśli problem jest w czymś innym to opisz dokładnie tok postępowania. -
Stworzenie własnego stylu kreskowania [Rozwiązany]
RobS odpowiedział(a) na ESPESA temat w ZWCAD Standard i Professional
Cześć, Stworzyłem kreskowanie o którym piszesz wyżej modyfikując delikatnie oryginalny wzór ANSI 34. *ANSI34A,ANSI Plastic, Rubber 45, 0, 0, 0, 16 45, 2, 0, 0, 16 45, 4, 0, 0, 16 45, 6, 0, 0, 16 *ANSI34B,ANSI Plastic, Rubber 45, 8, 0, 0, 16 45, 10, 0, 0, 16 45, 12, 0, 0, 16 45, 14, 0, 0, 16 Odległości pomiędzy liniami (wartość 16 w kodzie) zostały zmniejszone, ponadto jest zdefiniowane przesunięcie (8, 10, 12, 14 w kodzie) dzięki czemu kreskowania możesz wstawić do Palety narzędzi (Ctrl + 3) i wygodnie używać. Tak jak na nagraniu tworzysz tło z kreskowania Solid, później ANSI34A i ANSI34B. Na przykładzie grubość linii ustawiona jest na 0.3 mm -
Skorowidz obiektów MLEADER
RobS odpowiedział(a) na marcin.czyzewski temat w Wsparcie programistyczne LISP i VisualLISP
Cześć, Napisałem skrypt PRZENIESBLOKI.lsp który zautomatyzuje punkt 5. Będąc w rzutni za pomocą polecenia PRZENIESBLOKI bloki o nazwie Skorowidz zostają wybrane i przeniesione do przestrzeni papieru. (princ (strcat " Copyright © 2000 — 2024 Uslugi Informatyczne Szansa www.zwcad.pl Dostepne polecenia: PRZENIESBLOKI - Przeniesienie blokow o nazwie Skorowidz do przestrzeni papieru ") ) (defun C:PRZENIESBLOKI (/ blockList) (setq blockList (ssget "X" (list (cons 0 "INSERT") (cons 2 "Skorowidz")))) (command "_chspace" blockList "") (princ) ) -
Skorowidz obiektów MLEADER
RobS odpowiedział(a) na marcin.czyzewski temat w Wsparcie programistyczne LISP i VisualLISP
Cześć, Wprowadziłem zmianę zgodnie z sugestiami, elementy można zaznaczyć grupowo oknem. Poza tym wszystko działa bez zmian, funkcję można wywołać poleceniem SKOROWIDZ (widzę, że powyżej przez pomyłkę pisałem skoroszyt) Plik LSP z wprowadzonym usprawnieniem załączam do posta. SKOROWIDZ.lsp -
Skorowidz obiektów MLEADER
RobS odpowiedział(a) na marcin.czyzewski temat w Wsparcie programistyczne LISP i VisualLISP
Cześć, Napisałem skrypt LISP który realizuje zagadnienie wyżej. Po wpisaniu polecenia SKOROSZYT i wybraniu MLeadera wstawia blok w grocie strzałki. Do atrybutu bloku przepisany jest tekst z MLeadera. Nagranie jak to działa poniżej. Plik DWG ze zdefiniowanym blokiem na którym przeprowadziłem test załączam do posta. (princ (strcat " Copyright © 2000 — 2024 Uslugi Informatyczne Szansa www.zwcad.pl Dostepne polecenia: SKOROSZYT - Wstawia blok z atrybutem w punkcie wstawienia MLeadera ") ) (defun C:SKOROSZYT (/ mLeader mLeaderCord mLeaderText) (setvar "CMDECHO" 0) (setvar "CMDDIA" 0) (setvar "ATTDIA" 0) (while (not (and (setq mLeader (entsel "\nWybierz MLEADERA: ") mLeaderName (car mLeader) ) (eq (cdr (assoc 0 (entget mLeaderName)))"MULTILEADER") ) ) (prompt "\nProsze wybrac MLEADERA!") ) (setq mLeaderCord (list (cadr (assoc 110 (entget mLeaderName))) (caddr (assoc 110 (entget mLeaderName)))) mLeaderText (cdr (assoc 304 (entget mLeaderName))) ) (command "-insert" "Skoroszyt" mLeaderCord "" "" "" mLeaderText) (princ) ) Skoroszyt.dwg Skoroszyt.lsp -
Skalowanie linii podczas zoom kółkiem myszki
RobS odpowiedział(a) na kurt_1984 temat w Wsparcie programistyczne LISP i VisualLISP
Cześć, Jeśli skala zmienia się w Arkuszu to sprawdź zmienną PSLTSCALE, która odpowiada za skalowanie linii przerywanych w rzutniach. Domyślna wartość to 1, wszystkie linie przerywane będą skalowane jednakowo na wszystkich rzutniach w przestrzenie papieru. Dla wartości 0 w każdej rzutni linie będą skalowane inaczej. -
Nie wyświetlają się nowe obiekty [Rozwiązany]
RobS odpowiedział(a) na Stefan Wiatr temat w ZWCAD Standard i Professional
Wystarczy kliknąć na pozycję którą chcesz odznaczyć trzymając wciśnięty Ctrl. -
atrybuty w blokach
RobS odpowiedział(a) na picaro temat w Wsparcie programistyczne LISP i VisualLISP
Cześć, Napisałem program PIKIETAZ.lsp w LISPie który zdecydowanie skróci twoją pracę. Działanie jest bardzo proste W Pasku poleceń wpisujesz PIKIETAZ Wybierasz oś drogi (która musi być polilinią) Wpisujesz początkową wartość kilometrów i metrów na pikietażu Na koniec klikasz po kolei na bloki w których chcesz zmienić wartość Żeby wyjść z programu klikasz ESC Drobne różnice w wartościach w stosunku do twojego przykładu wynikają ze sposobu wstawiania bloków. Program rzutuje punkt bazowy bloku prostopadle na oś drogi. Warto zwrócić na to uwagę przy wstawianiu bloków lub zmienić ich punkt bazowy. Nagranie z działania i kod poniżej. Miłej pracy! (princ (strcat " Copyright © 2000 — 2024 Uslugi Informatyczne Szansa www.zwcad.pl Dostepne polecenia: PIKIETAZ - uruchamia funkcje automatycznego pomiaru odleglosci do pikietazu i zapisanie wartosci w atrybucie bloku ") ) (defun C:PIKIETAZ (/ roadAxis startDistKm startDistM blk blkName blkBasePnt polyPnt distToPnt meters kilometers attValue) (while (not (and (setq roadAxis (car (entsel "\nWybierz os drogi: "))) (eq (cdr (assoc 0 (entget roadAxis)))"LWPOLYLINE") )) (prompt "\nProsze wybrac polilinie!") ) (setq startDistKm (atoi (getstring "\nOkresl wartosc kilometrow na poczatku drogi: ")) startDistM (atoi (getstring "\nOkresl wartosc metrow na poczatku drogi: ")) kilometers 0 ) (while t (setq blk (entsel "\nWybierz blok: ") blkName (car blk) blkBasePnt (cadr blk) polyPnt (vlax-curve-getClosestPointTo roadAxis blkBasePnt) distToPnt (atoi (rtos (vlax-curve-getDistAtPoint roadAxis polyPnt) 2 0)) meters (+ startDistM distToPnt) ) (if (>= meters 1000) (setq kilometers (/ meters 1000) meters (- meters (* 1000 kilometers)) ) ) (setq attValue (strcat (itoa (+ startDistKm kilometers)) "+" (itoa meters))) (foreach Att (vlax-invoke (vlax-ename->vla-object blkName) 'GetAttributes ) (if (= (strcase (vla-get-TagString Att)) "KM") (progn (vla-put-textstring Att attValue) attValue) ) ) ) (princ) ) -
Co dzisiaj robiłem w lispie?
RobS odpowiedział(a) na wedzik temat w Wsparcie programistyczne LISP i VisualLISP
Kolejny skrypt, "delikatne" rozwinięcie poprzedniego programu. Tym razem rysowanie okręgów w środku każdego segmentu polilinii. Średnica okręgu to 1/10 długości danego segmentu. Kod i nagranie działania poniżej (defun C:CIRCATMID (/ poly polyName polyAtt polyLen segLen circCenDist circCord circDia vertexLst pp pt) (setq poly (entsel "\nWskaz polilinie: ") ;Wybór polilinii polyName (car poly) ;Identyfikator polilinii polyAtt (entget (car poly)) ;Zapisanie atrybutów w zmiennej polyprop polyLen (vla-get-length (vlax-ename->vla-object polyName)) ;Pomiar długości polilinii ) (foreach pp polyAtt (if (= (car pp) 10) ;Warunek sprawdza czy atrybut zawiera współrzędne (zaczyna się od kodu 10) (setq vertexLst (cons (cdr pp) vertexLst)) ;Dodawanie współrzędnych do listy vertexLst ) ) (foreach pt vertexLst (setq segLen (- polyLen (vlax-curve-getDistAtPoint polyName pt)) ;Obliczanie długości segmentów polilinii circCenDist (+ (vlax-curve-getDistAtPoint polyName pt) (/ segLen 2.0)) ;Dystans do środka okręgu polyLen (vlax-curve-getDistAtPoint polyName pt) ;Nadpisanie długości do obliczenia kolejnego segmentu circCord (vlax-curve-getPointAtDist polyName circCenDist) ;Współrzędne środka segmentu polilinii circDia (/ segLen 10.0) ;Obliczenie średnicy okręgu ) (if (> circDia 0) ;Warunek sprawdza czy średnica jest większa od 0 w przypadku polilinii otwartych (command "_.CIRCLE" circCord "_D" circDia) ;Rysowanie okręgu ) ) ) -
Co dzisiaj robiłem w lispie?
RobS odpowiedział(a) na wedzik temat w Wsparcie programistyczne LISP i VisualLISP
Cześć, Chciałem się pochwalić swoim programem w języku LISP. Zadaniem programu jest automatyczne wstawienie trójkątów o określonym przez siebie rozmiarze w każdy wierzchołek dowolnej polilinii. (defun C:TRIATVERTEX () (setq trirad (getstring "Okresl wielkosc trojkatow w wierzcholkach: ") ;Podanie średnicy okregu na którym bedą opisane trójkąty vertexlst nil ;Czyszczenie listy współrzędnych poly (entget (car (entsel "\nWskaz polilinie: "))) ;Wybór polilinii i zapisanie jej atrybutów w zmiennej poly ) (foreach pp poly (if (= (car pp) 10) ;Sprawdzenie czy atrybut zawiera współrzędne (zaczyna się od kodu 10) (setq vertexlst (cons (cdr pp) vertexlst)) ;Dodawanie współrzędnych do listy vertexlst ) ) ;Pętla która tworzy listę współrzędnych wierzchołków (foreach pt vertexlst (command "_.POLYGON" "3" pt "O" trirad) ) ;Pętla wstawiania trójkąty we wszystkich wierzchołkach polilinii ) Nie pisałem nic wcześniej w tym języku, ale myślę że jest całkiem schludnie. Wiedzę czerpałem z książki "AutoLISP czyli programowanie AutoCADa" wydawnictwa HELION, polecam nie tylko początkującym.