Rekomendowane odpowiedzi

Opublikowano

Chcę napisać lispa który zaznaczy mi okręgi o średnicach znajdujących się w przedziale.

Zacząłem od napisania takiego programu, który zaznacza wszystkie okręgi w rysunku o promieniu większym lub równym od podanego.

Ten skrypt działa ale muszę wpisać promień wewnątrz skryptu czyli tak (40 . 10 ) - zaznacza okręgi o promieniu >=10

Cytuj

(defun c:okregi (/)
    ;(setq malypromien (getreal "Podaj maly promien: ")) 
    (setq zbior (ssget "X" '( (0 . "CIRCLE") (410 . "Model")(-4 . ">=") (40 . 10 ) ) ))
    (setq ile (sslength zbior))
)

Jeśli jednak zapytam o promień i zmodyfikuję program to dostanę błąd

Cytuj

(defun c:okregi (/)
    (setq malypromien (getreal "Podaj maly promien: ")) 
    (setq zbior (ssget "X" '( (0 . "CIRCLE") (410 . "Model")(-4 . ">=") (40 . malypromien ) ) ))
    (setq ile (sslength zbior))
)
 

Cytuj

Polecenie: OKREGI
Podaj maly promien: 10
błąd: nieprawidłowy typ - nil

Doszukałem, że trzeba zamienić (40 . malypromien ) na (cons 40 malypromien ) ale błąd jest dalej.

Jakieś sugestie?

Opublikowano

Może to pomoże :

(defun c:okregi (/)
    (setq malypromien (getreal "Podaj maly promien: ")) 
    (setq aaa '( (0 . "CIRCLE") (410 . "Model") (-4 . ">=")) ) 
    (setq bbb (append aaa (list (cons 40 malypromien))))
    (setq zbior (ssget "X" bbb))
    (if zbior (princ (setq ile (sslength zbior))) (princ "\nBrak elementow"))
    (princ)
)

 

Opublikowano
34 minuty temu, perlon napisał:

Może to pomoże :

Działa pięknie. I jest też sprawdzenie czy lista nie jest pusta.

okregi_ssget.gif

 

Apostrof (albo quote) przed nawiasem powoduje utworzenie listy bez obliczania jej wartości.

ssget_zmienna_problem.png

 

Aby obliczyć wartość można użyć funkcji list.

ssget_variable.png

 

Czyli linię

 (setq zbior (ssget "X" '( (0 . "CIRCLE") (410 . "Model")(-4 . ">=") (40 . malypromien ) ) ))

można zamienić na

(setq zbior (ssget "X" (list (cons 0 "CIRCLE") (cons 410 "Model")(cons -4 ">=") (cons 40 malypromien ) ) ))

jeśli się nie mylę.

PS. cons tworzy parę z kropką.

Opublikowano

Dziękuję.

Oto kod jaki mam teraz. Wyświetla się też komunikat o ilości znalezionych elementów.

(defun c:okregi (/)
	(setq malypromien (getreal "Podaj maly promien: ")) 
	(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"))
    (princ)
)

Dziwi mnie że te obiekty nie są wybrane na rysunku.

Można je ręcznie zaznaczyć z linii poleceń tak

Polecenie: !ile
47 
Polecenie: _SELECT
Wybierz obiekty: _p
znaleziono 47
Wybierz obiekty: 

i po enterze są zaznaczone z gripami.

Jak to robię w lispie to nic się nie dzieje:

(command "_select" "_p" "")

Jak zaznaczyć z lispa na ekranie te elementy ze zbioru "ile" albo ostatnie zaznaczone?

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