wedzik Opublikowano 21 Grudnia 2020 Zgłoś Udostępnij Opublikowano 21 Grudnia 2020 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? Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
perlon Opublikowano 21 Grudnia 2020 Zgłoś Udostępnij Opublikowano 21 Grudnia 2020 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) ) wedzik i dmatusz3 2 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
dmatusz3 Opublikowano 21 Grudnia 2020 Zgłoś Udostępnij Opublikowano 21 Grudnia 2020 34 minuty temu, perlon napisał: Może to pomoże : Działa pięknie. I jest też sprawdzenie czy lista nie jest pusta. Apostrof (albo quote) przed nawiasem powoduje utworzenie listy bez obliczania jej wartości. Aby obliczyć wartość można użyć funkcji list. 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ą. wedzik 1 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
wedzik Opublikowano 22 Grudnia 2020 Autor Zgłoś Udostępnij Opublikowano 22 Grudnia 2020 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? Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
dmatusz3 Opublikowano 22 Grudnia 2020 Zgłoś Udostępnij Opublikowano 22 Grudnia 2020 Ostatnie wybrane elementy można zaznaczyć w taki sposób: (command "_pselect" "_p" "") Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ą.