wedzik

Co dzisiaj robiłem w lispie?

Recommended Posts

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)

 

Share this post


Link to post
Share on other sites

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.

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

Może coś takiego?

(defun C:MPI (/)
	(initget "2 3 4")
	(setq k (cond ((getkword "\nPrzez ile pomnozyc liczbe PI? [2/3/4] <3>: ")) ("3")))
	(prompt "Liczba PI pomnozona przez ") 
	(prompt k)
	(prompt "= ")
	(prompt (* pi (atoi k)))
)

 

Share this post


Link to post
Share on other sites

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.

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...