Co dzisiaj robiłem w lispie?


Rekomendowane odpowiedzi

Zaciekawił mnie bardzo LISP. Niewiele wiem ale znalazłem starą książkę.

Czytam powoli i w tym wątku chcę napisać co ciekawego udało mi się nauczyć :)

Nawiasy i inne drobiazgi.

  • Wszystko ma być w nawiasach. 
  • Polecenia w cudzysłowach "".
  • Słowo "command" uruchamia polecenie programu.

Przykład 

(command "okrąg")


powoduje uruchomienie rysowania okręgu.

Za poleceniem możemy wpisać kolejne parametry np.

(command "okrąg" "2.5,20" 30)

Polecenie narysuje okrąg o środku w punkcie 2.5 i 20 o promieniu 30.

 

Pauza czyli przystanek na żądanie.

Słowo "pause" czeka na wskazanie czegoś przez użytkownika.

To polecenie pozwala pokazać środek okręgu i rysuje okrąg o promieniu 5 i środku we wskazanym punkcie.

(command "okrąg" pause 5)

To rysuje prostokąt we wskazanym punkcie o szerokości 25, długość sami wprowadzamy.

(command "prostokąt" pause "W" 25 pause)

 

Odnośnik do komentarza
Udostępnij na innych stronach

Po próbach i poprawkach oraz uzupełnianiu nawiasów doszedłem do takiego skryptu:

(defun c:WS (/)
  (setq pnt1 (getpoint "Wskaz srodek polprostych: "))
  (command "_line" pnt1 "D" 100 0 "")
  (command "_line" pnt1 "D" 100 30 "")
  (command "_line" pnt1 "D" 100 60 "")
  (command "_line" pnt1 "D" 100 90 "")
  (command "_line" pnt1 "D" 100 120 "")
  (command "_line" pnt1 "D" 100 150 "")
  (command "_line" pnt1 "D" 100 180 "")
)

ws.lsp

Polecenie "WS". Skrypt pyta o wskazanie punktu i rysuje linie co 30 stopni.

1369540586_2020-11-1712_56_09-ZWCAD2021Wersjatestowa(Pozostao30dni)-Rysunek1_dwg.png.aafa1d94fd19d1fbf879cb5c4811754d.png

 

Teraz chyba czas na pętle.

 

Odnośnik do komentarza
Udostępnij na innych stronach

No tak :)

Mam takie coś:

(defun c:PETLA (/)
  (setq pnt1 (getpoint "Wskaz srodek polprostych: ")) 
  (setq a (getint "\nPodaj ilosc polprostych: " ))
  (setq k (/ 360 a)) ; obliczam kat pomiedzy polprostymi
  (setq i 0) ; zmienna do petli
  (while i
  	(command "_line" pnt1 "D" 100 (* k i) "") ; rysowanie linii, kat pomnozony przez zmienna petli i
	(setq i (1+ i)) ; zwiekszam o 1 wartosc zmiennej i
	(if (= i a)  ; jesli mam dosc polprostych to wychodze z petli
		(setq i nil)
	)
	
   )
)

Problem polega na tym, że jak kąt jest liczbą całkowitą np. 36 stopni to rysuje poprawnie. Jeśli to ułamek to nie rysuje wszystkich linii.

 

2020-11-18 13_42_49-ZWCAD 2021 Wersja testowa (Pozostało 30 dni) - [Rysunek1.dwg].png

Odnośnik do komentarza
Udostępnij na innych stronach

Proszę się zastanowić nad tym 

Polecenie: (/ 360 10)
36
Polecenie: (/ 360.0 10)
36.0
Polecenie: (/ 360 11)
32
Polecenie: (/ 360.0 11)
32.7273
Polecenie: 

Po poprawce

(defun c:PETLA (/)
  (setq pnt1 (getpoint "Wskaz srodek polprostych: ")) 
  (setq a (getint "\nPodaj ilosc polprostych: " ))
  (setq k (/ 360.0 a)) ; obliczam kat pomiedzy polprostymi
  (setq i 0) ; zmienna do petli
  (while i
  	(command "_line" pnt1 "D" 100 (* k i) "") ; rysowanie linii, kat pomnozony przez zmienna petli i
	(setq i (1+ i)) ; zwiekszam o 1 wartosc zmiennej i
	(if (= i a)  ; jesli mam dosc polprostych to wychodze z petli
		(setq i nil)
	)
	
   )
)

2020-11-18 20_06_25-ZWCAD 2021 Wersja profesjonalna - [C__Users_dmatu_Documents_drzwi-do-lazienki.dw.png

Odnośnik do komentarza
Udostępnij na innych stronach

Dziękuję teraz jest znacznie lepiej.

(defun c:PETLA (/)
  (setq pnt1 (getpoint "Wskaz srodek polprostych: ")) 
  (initget (+ 1 2 4))
  (setq a (getint "\nPodaj ilosc polprostych: " ))
  (setq k (/ 360.0 a)) ; obliczam kat pomiedzy polprostymi
  (setq i 0) ; zmienna do petli
  (while i
  	(command "_line" pnt1 "D" 100 (* k i) "") ; rysowanie linii, kat pomnozony przez zmienna petli i
	(setq i (1+ i)) ; zwiekszam o 1 wartosc zmiennej i
	(if (= i a)  ; jesli mam dosc polprostych to wychodze z petli
		(setq i nil)
	)
	
   )
)

 

Zastanawiam się jak zrobić żeby przy pytaniu o ilość program zaproponował coś domyślnie np. <23>:

Trzeba taką zmienną zadeklarować wcześniej i potem jakoś wyświetlić w getint?

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki, przyda się.

Teraz pracuję nad czymś dużym.

Zrobiłem początek: zapytanie o zaznaczenie obiektów i wyświetlenie liczby zaznaczonych obiektów i ich właściwości.

(defun c:krawedzie ()
	(setq okrag (ssget)) ;prosimy o wskazanie obiektów oknem
	(setq ile (sslength okrag)) ;liczymy ile obiektow zaznaczylismy
	(setq i 0) ; ustawiamy zmienna i zeby sobie odliczac
	(repeat ile	 ; powtarzamy tyle razy ile jest obiektow
		(setq nazwyobiektow (ssname okrag i))  ; ustalamy nazwe kolejnych obiektow
		(setq listaobiektu (entget nazwyobiektow))  ;pobieramy wlasciwosci obiektu o nazwie jak w lini wyzej
		(prompt "Obiekt")	;
		(princ nazwyobiektow) ;drukujemy nazwe obiektu
		(princ listaobiektu) ; drukujemy wlasciwosci obiektu
		(setq i (1+ i)) ;zwiekszamy zmienna i aby odczytac kolejny obiekt
		)
	)

W wyniku działania otrzymujemy np. taką listę 

Wskaż drugi narożnik: 
znaleziono 7
Wybierz obiekty: 
Obiekt<ENTITY NAME: 9d2fc8a8>((-1 . <ENTITY NAME: 9d2fc8a8>) (0 . LWPOLYLINE) (5 . 240) (330 . <ENTITY NAME: 9d2f9590>) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (100 . AcDbPolyline) (90 . 4) (70 . 1) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 253.739 563.116) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 541.421 563.116) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 541.421 398.539) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 253.739 398.539) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (210 0.0 0.0 1.0))
Obiekt<ENTITY NAME: 9d2fc890>((-1 . <ENTITY NAME: 9d2fc890>) (0 . CIRCLE) (5 . 23F) (330 . <ENTITY NAME: 9d2f9590>) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (100 . AcDbCircle) (10 494.711 459.655 0.0) (40 . 28.7788) (210 0.0 0.0 1.0))
Obiekt<ENTITY NAME: 9d2fc878>((-1 . <ENTITY NAME: 9d2fc878>) (0 . CIRCLE) (5 . 23E) (330 . <ENTITY NAME: 9d2f9590>) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (100 . AcDbCircle) (10 461.97 514.66 0.0) (40 . 29.5208) (210 0.0 0.0 1.0))
Obiekt<ENTITY NAME: 9d2fc860>((-1 . <ENTITY NAME: 9d2fc860>) (0 . CIRCLE) (5 . 23D) (330 . <ENTITY NAME: 9d2f9590>) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (100 . AcDbCircle) (10 419.625 450.488 0.0) (40 . 24.386) (210 0.0 0.0 1.0))
Obiekt<ENTITY NAME: 9d2fc848>((-1 . <ENTITY NAME: 9d2fc848>) (0 . CIRCLE) (5 . 23C) (330 . <ENTITY NAME: 9d2f9590>) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (100 . AcDbCircle) (10 337.992 440.884 0.0) (40 . 22.7003) (210 0.0 0.0 1.0))
Obiekt<ENTITY NAME: 9d2fc830>((-1 . <ENTITY NAME: 9d2fc830>) (0 . CIRCLE) (5 . 23B) (330 . <ENTITY NAME: 9d2f9590>) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (100 . AcDbCircle) (10 380.773 504.183 0.0) (40 . 21.6078) (210 0.0 0.0 1.0))
Obiekt<ENTITY NAME: 9d2fc818>((-1 . <ENTITY NAME: 9d2fc818>) (0 . CIRCLE) (5 . 23A) (330 . <ENTITY NAME: 9d2f9590>) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (100 . AcDbCircle) (10 302.195 483.665 0.0) (40 . 27.7815) (210 0.0 0.0 1.0))7
Polecenie: 

i właśnie w tym momencie trochę zacząłem rozumieć o co chodzi z tym wszystkim.

Modyfikując np. wartość w kodzie 40 w okręgu zmienimy jego średnice. Kod 10 odpowiada za współrzędne.

 

Odnośnik do komentarza
Udostępnij na innych stronach

Teraz coś co działa. Program do tworzenia krawędzi otworów na drugim rzucie. Wybieramy wszystkie obiekty, odfiltrują się otwory. Wskazujemy gdzie maja się zaczynać i kończyć otwory.

Na rysunku po lewej przed rzutowaniem po prawej po rzutowaniu. Jak ktoś jest chętny to plik dwg jest tutaj rzutownie-otworow.dwg

rzutowanie.png.445e6ecbadf699bd712e34d90ff7c140.png

Plik lispa z opisem krawedzieotworux.lsp

Teraz pochwalę się moim kodem:

(defun c:krawedzieotworux ()
	(princ "Zaznacz okregi do rzutownia: \n")
	(setq okrag (ssget  '((0 . "CIRCLE")) )) 		;prosimy o wskazanie obiektów oknem. Pozwalamy na wybor tylko okregow
	(setq ile (sslength okrag)) 				;liczymy ile obiektow zaznaczylismy
	(setq i 0) 						;ustawiamy zmienna i zeby sobie odliczac
	(setq pt1 (getpoint "Wskaz poczatek linii: ")) 
	(setq pt2 (getpoint "Wskaz koniec linii: ")) 
	(repeat ile	 					; powtarzamy tyle razy ile jest obiektow
		(setq nazwyobiektow (ssname okrag i))  		; ustalamy nazwe kolejnych obiektow
		(setq listaobiektu (entget nazwyobiektow))  	;pobieramy wlasciwosci obiektu o nazwie jak w lini wyzej
		(setq promien (assoc 40 listaobiektu)) 		;odczytujemy promień aktualnego okregu np. (40 . 27.7815)
		(setq srodek (assoc 10 listaobiektu)) 		;odczytujemy srodek okregu np. (10 310.596 514.272 0.0) 
		(setq r (cdr promien)) 				;przypisuje do r promien np. 27.7815
		(setq y (cadr(cdr srodek))) 			;przypisuje do y wspolrzedna Y np. 514.272
		(command "_line" (list (car pt1) (+ y r))  (list (car pt2) (+ y r)) "") ;rysuje linie car pobiera wspolrzedna X z kliknietych punktow
		(command "_line" (list (car pt1) (- y r))  (list (car pt2) (- y r)) "") 
		(setq i (1+ i)) 				;zwiekszamy zmienna i aby odczytac kolejny obiekt
		)
	)
	

 

Odnośnik do komentarza
Udostępnij na innych stronach

Kolejna wersja programu: rysuje osie i grupuje elementy otworu.

Przed

1278865376_2020-11-2918_58_16-ZWCAD2021Wersjatestowa(Pozostao20dni)-C__Users_jaros_Desktop_krawedzie.png.8e5825bd4658cd0181ade643c4d5d2cb.png

Po

1844186092_2020-11-2918_59_13-ZWCAD2021Wersjatestowa(Pozostao20dni)-C__Users_jaros_Desktop_krawedzie.png.f070b072ea1061324f130546a9844b76.png

(defun c:krawedzieotworux ()
	(princ "Zaznacz okregi do rzutownia: \n")
	(setq okrag (ssget  '((0 . "CIRCLE")) )) 			;prosimy o wskazanie obiektów oknem. Pozwalamy na wybor tylko okregow
	(setq ile (sslength okrag)) 						;liczymy ile obiektow zaznaczylismy
	(setq i 0) 											;ustawiamy zmienna i zeby sobie odliczac
	(setq pt1 (getpoint "Wskaz poczatek linii: ")) 
	(setq pt2 (getpoint "Wskaz koniec linii: ")) 
	(setq przedluzenieosi (* (- (car pt2) (car pt1) )  0.1 ))
	(setq aktualnawarstwa (getvar "CLAYER"))
	(command "_-LAYER" "_M" "osie" "_C" "red" "" "_L" "CENTER" "" "") ; Tworze warstwe dla osi
	(repeat ile	 						; powtarzamy tyle razy ile jest obiektow
		(setq nazwyobiektow (ssname okrag i))  			;ustalamy nazwe kolejnych obiektow
		(setq listaobiektu (entget nazwyobiektow))  	;pobieramy wlasciwosci obiektu o nazwie jak w lini wyzej
		(setq promien (assoc 40 listaobiektu)) 			;odczytujemy promień aktualnego okregu np. (40 . 27.7815)
		(setq srodek (assoc 10 listaobiektu)) 			;odczytujemy srodek okregu np. (10 310.596 514.272 0.0) 
		(setq r (cdr promien)) 							;przypisuje do r promien np. 27.7815
		(setq y (cadr(cdr srodek))) 					;przypisuje do y wspolrzedna Y np. 514.272
		(setq x (cadr srodek)) 				        	;przypisuje do x wspolrzedna Y np. 310.596
		(setq grupa (ssadd))
		(command "_-LAYER" "_S" aktualnawarstwa "")
		(command "_line" (list (car pt1) (+ y r))  (list (car pt2) (+ y r)) "") ;rysuje linie car pobiera wspolrzedna X z kliknietych punktow
		(ssadd (entlast) grupa)
		(command "_line" (list (car pt1) (- y r))  (list (car pt2) (- y r)) "") 
		(ssadd (entlast) grupa)
		(command "_-LAYER" "_S" "osie" "")
		(command "_line" (list (- (car pt1) przedluzenieosi) y )       (list (+ (car pt2) przedluzenieosi) y) "") ;rysujemy osie symetrii otworów z boku
		(ssadd (entlast) grupa)
		;osie na otworach w widoku z góry, na początku os X potem Y
		(command "_line" (list (- x r przedluzenieosi) y) (list (+ x r przedluzenieosi) y) "" )
		(ssadd (entlast) grupa)
		(command "_line" (list x (- y r przedluzenieosi) ) (list x (+ y r przedluzenieosi) ) "" )
		(ssadd (entlast) grupa)
		(command "_group" "_c" "*" "opis" grupa "")
		(setq i (1+ i)) 								;zwiekszamy zmienna i aby odczytac kolejny obiekt
		)
	(command "_-LAYER" "_S" aktualnawarstwa "")
	)
	

 

krawedzieotworux1.lsp

Odnośnik do komentarza
Udostępnij na innych stronach

Abs nie wystarczył, trzeba było dorzucić IFa.

Działa już po lewej i po prawej kierunek zaznaczania bez znaczenia.

(defun c:krawedzieotworux ()
	(princ "Zaznacz okregi do rzutownia: \n")
	(setq okrag (ssget  '((0 . "CIRCLE")) )) 		;prosimy o wskazanie obiektów oknem. Pozwalamy na wybor tylko okregow
	(setq ile (sslength okrag)) 					;liczymy ile obiektow zaznaczylismy
	(setq i 0) 										;ustawiamy zmienna i zeby sobie odliczac
	(setq pt1 (getpoint "Wskaz poczatek linii: ")) 
	(setq pt2 (getpoint "Wskaz koniec linii: ")) 
	(setq przedluzenieosi (* (abs (- (car pt2) (car pt1) ))  0.1 ))
	(setq aktualnawarstwa (getvar "CLAYER"))
	(command "_-LAYER" "_M" "osie" "_C" "red" "" "_L" "CENTER" "" "") ; Tworze warstwe dla osi
	(repeat ile	 									; powtarzamy tyle razy ile jest obiektow
		(setq nazwyobiektow (ssname okrag i))  		; ustalamy nazwe kolejnych obiektow
		(setq listaobiektu (entget nazwyobiektow))  ;pobieramy wlasciwosci obiektu o nazwie jak w lini wyzej
		(setq promien (assoc 40 listaobiektu)) 		;odczytujemy promień aktualnego okregu np. (40 . 27.7815)
		(setq srodek (assoc 10 listaobiektu)) 		;odczytujemy srodek okregu np. (10 310.596 514.272 0.0) 
		(setq r (cdr promien)) 						;przypisuje do r promien np. 27.7815
		(setq y (cadr(cdr srodek))) 				;przypisuje do y wspolrzedna Y np. 514.272
		(setq x (cadr srodek)) 				        ;przypisuje do x wspolrzedna Y np. 310.596
		(setq grupa (ssadd))
		(command "_-LAYER" "_S" aktualnawarstwa "")
		(command "_line" (list (car pt1) (+ y r))  (list (car pt2) (+ y r)) "") ;rysuje linie car pobiera wspolrzedna X z kliknietych punktow
		(ssadd (entlast) grupa)
		(command "_line" (list (car pt1) (- y r))  (list (car pt2) (- y r)) "") 
		(ssadd (entlast) grupa)
		(command "_-LAYER" "_S" "osie" "")
		
		(if (< (car pt1) (car pt2))
				(command "_line" (list (- (car pt1) przedluzenieosi) y )       (list (+ (car pt2) przedluzenieosi) y) "") ;rysujemy osie symetrii otworów z boku
				(command "_line" (list (- (car pt2) przedluzenieosi) y )       (list (+ (car pt1) przedluzenieosi) y) "") ;rysujemy osie symetrii otworów z boku
		)
		(ssadd (entlast) grupa)
		;osie na otworach w widoku z góry, na początku os X potem Y
		(command "_line" (list (- x r przedluzenieosi) y) (list (+ x r przedluzenieosi) y) "" )
		(ssadd (entlast) grupa)
		(command "_line" (list x (- y r przedluzenieosi) ) (list x (+ y r przedluzenieosi) ) "" )
		(ssadd (entlast) grupa)
		(command "_group" "_c" "*" "opis" grupa "")
		(setq i (1+ i)) 							;zwiekszamy zmienna i aby odczytac kolejny obiekt
		)
	(command "_-LAYER" "_S" aktualnawarstwa "")
	)
	

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • 4 tygodnie później...

Dzięki pomocy tutaj 

zrobiłem lispa do zaznaczania okręgów większych niż wpisany promień.

Na początku jest mechanizm zapamiętywania promienia okręgu. Jeśli nie jest ustawiony to przyjmuję 10.

(defun c:okregi (/ ile zbior rtemp)
	(if (= malypromien nil)(setq malypromien 10.0))
	(prompt "\Podaj maly promien: <")(princ malypromien)(princ "> ")
	(initget 4)
	(setq rtemp (getreal)) 
	(if (= rtemp nil)(setq rtemp malypromien))
	(setq malypromien rtemp)
	
	(setq zbior (ssget "X" (list (cons 0 "CIRCLE") (cons 410 "Model")(cons -4 ">=") (cons 40 malypromien ) ) ))
	(if zbior (princ (list "Ilosc znalezionych elementow: " (setq ile (sslength zbior)))) (princ "\nBrak elementow"))
	(if zbior (command "_pselect" "_p" ""))
	(princ)
)

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 miesiące temu...

Zawsze zastanawiałem się dlaczego w niektórych lispach jest taka konstrukcja z kropką

._circle

Winne temu jest polecenie UNDEFINE, które potrafi wyłączyć polecenie cada.

Jeśli użyjemy wtedy _circle to nie będzie takiego polecenia. Natomiast polecenie z kropką ignoruje UNDEFINE i korzysta z oryginalnych poleceń.

Polecenie: _CIRCLE
Określ środek okręgu lub [3P/2P/Ssr (sty sty promień)]: *Anuluj*
Polecenie: undefine
Podaj nazwę polecenia:circle
Polecenie: _CIRCLE
Nieznane polecenie "_CIRCLE". Naciśnij F1, aby uzyskać pomoc.
Polecenie: ._CIRCLE
Określ środek okręgu lub [3P/2P/Ssr (sty sty promień)]: *Anuluj*

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 lata później...

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.

obraz_2024-03-04_135431828.thumb.png.8442472eed1ebf977dc551014f70b67b.png

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...

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 

image.thumb.gif.7ebae61657defce493cdef4902155220.gif

(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
        )
    )
)

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • 7 miesięcy temu...

kod, który zamienia punkty na rysunku na okręgi :)

 

(defun c:OkragiNaObiektach ()

(setq obiekty (ssget "_:L" '((0 . "POINT"))))

(if obiekty

(progn

(setq i 0)

(repeat (sslength obiekty)

(setq ent (ssname obiekty i))

(setq i (1+ i))

(setq punkt (cdr (assoc 10 (entget ent))))

(if punkt

(progn

(command "_.CIRCLE" punkt "10.0")

)

)

)

)

)

(princ)

)

image.gif

kod.lsp

Odnośnik do komentarza
Udostępnij na innych stronach

  • 3 tygodnie później...

problem z p3

chcę, żeby p3 powracał do p1 z punktu p2, co by tworzyło drugi łuk kółka, lecz w obecnym kodzie tworzy mi się jedynie prosta linia 

(defun c:kolko1 ()

 

(setq p1(getpoint "wskaż początek łuku:"))

(setq p2(getpoint "wskaż koniec łuku:"))

 

(setq p3 (list p1))

 

(command "_.pline" p1 "_a" p2 p3 "")

 

(prompt "okrąg został narysowany")


 

)

Odnośnik do komentarza
Udostępnij na innych stronach

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ć.

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