Nie działa zmienna w filtrze przy zaznaczaniu ssget


Recommended Posts

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?

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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?

Link to comment
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...
 Share