jarekw90 Opublikowano 29 Maja 2017 Zgłoś Opublikowano 29 Maja 2017 Witam, Napisałem prostego lispa, który uśrednia wybrane punkty. Chciałbym jednak aby działał przy użyciu funkcji "ssget" na dowolnej liczbie zaznaczonych punktów. Nie bardzo rozumiem jeszcze działanie tej funkcji więc proszę o pomoc. Wiem, że ilość zaznaczonych punktów mogę wyznaczyć za pomocą sslenght, nie wiem natomiast jak z tego zbioru wydobyć współrzędne, stworzyć listę i uśrednić współrzędne. new1.lsp srednia.lsp Cytuj
kruszynski Opublikowano 29 Maja 2017 Zgłoś Opublikowano 29 Maja 2017 Przygotowane przez Pana lispy to krok w dobrym kierunku. Jakiej pomocy Pan oczekuje? Działanie funkcji ssget sprowadza się do tego, że wybiera z rysunku obiekty po zadanych kryteriach. Ma całkiem sporo trybów , które można przełączać. Funkcja może np pozwolić Użytkownikowi na wskazanie elementów albo wybrać automatycznie z całego rysunku. W helpie ZWCADa jest artykuł na temat tej funkcji i jej trybów. Współrzędne ze zbioru wskazań może Pan pobrać np w funkcji repeat sprawdzając każdy element ssname. Do pobrania współrzędnych może przydać się assoc 10 Cytuj
jarekw90 Opublikowano 29 Maja 2017 Autor Zgłoś Opublikowano 29 Maja 2017 Jak zatem pobrać sumę np współrzędnych X ze zbioru wskazań punktów? Cytuj
kruszynski Opublikowano 29 Maja 2017 Zgłoś Opublikowano 29 Maja 2017 Współrzędne można pobrać łącząc funkcje repeat, ssname, assoc, ( może jescze entget ) sumy nie można "pobrać" trzeba ją wyliczyć Cytuj
jarekw90 Opublikowano 29 Maja 2017 Autor Zgłoś Opublikowano 29 Maja 2017 Dobrze kombinuję? Niestety zwraca mi wartość 0 0 0 (defun c:aaaaa() (setq ss (ssget '((0 . "POINT")))) (setq n (sslength ss)) (setq nss 0) (princ "zaznaczonych:") (princ n) (setq pkt2 (list 0 0 0)) (while (< nss 1+n) (setq ssnam (ssname ss nss)) (setq entgi (entget ssnam )) (setq pkt0 (cdr (assoc 10 entgi))) (setq pkt1 (list (car pkt0) (cadr pkt0) (caddr pkt0))) (princ pkt1) (setq pkt2 (list (+(car pkt2) (car pkt1)) (+(cadr pkt2) (cadr pkt1)) (+(caddr pkt2) (caddr pkt1)))) (princ pkt2) (setq nss (1+ nss)) );end while (princ pkt2) ); end func Cytuj
jarekw90 Opublikowano 30 Maja 2017 Autor Zgłoś Opublikowano 30 Maja 2017 Już wiem gdzie był błąd. Działa ;) Chyba zrozumiałem już mniej więcej o co chodzi. (defun c:aaaaa() (setq ss (ssget '((0 . "POINT")))) (setq n (sslength ss)) (setq nss 0) (princ "zaznaczonych:") (princ n) (setq pkt1 (list 0 0 0)) (while (< nss n);nss mniejsze poniewaz numeracja od zera (setq ssnam (ssname ss nss)) ; ze zbioru wskazań ss pobiera element o indeksie nr, elementy liczone są od 0 (setq entgi (entget ssnam )); wybór opisu elementu jako listy dla podanej nazwy elementu (setq pkt0 (cdr (assoc 10 entgi)));10 kod punktu wstawienia dla punktu dxf (setq pkt1 (list (+(car pkt0) (car pkt1)) (+(cadr pkt0) (cadr pkt1)) (+(caddr pkt0) (caddr pkt1)))) (setq nss (+ nss 1)) );end while (princ pkt1) (setq pkt2 (list (/(car pkt1) n) (/(cadr pkt1) n) (/(caddr pkt1) n))) (command "_erase" "_si" ss) (command "_point" pkt2) );end prog kruszynski 1 Cytuj
jarekw90 Opublikowano 30 Maja 2017 Autor Zgłoś Opublikowano 30 Maja 2017 Dlaczego podczas używania polecenia (command "_point" ....), pomimo tego, że punkt posiada konkretne współrzędne program snapuje punkty do obiektów? Da się to jakoś ominąć w lispie, aby nie musieć wyłączać snapowania na czas działania funkcji? Cytuj
dmatusz3 Opublikowano 30 Maja 2017 Zgłoś Opublikowano 30 Maja 2017 Niem jestem do końca pewien czy o to chodzi, ale proszę spróbować: sprawdzić wartość zmiennej OSMODE i zapamiętać, ustawić snapowanie tylko do punktów (chyba OSMODE=8) albo wyłączyć zupełnie, wskazywać lub co potrzeba, przywrócić zmienną OSMODE. Cytuj
kruszynski Opublikowano 31 Maja 2017 Zgłoś Opublikowano 31 Maja 2017 Moim zdaniem lepiej ustawić zmienną na OSMODE na 0 niż 8 Sprawdzić wartość zmiennej systemowej można korzystając z funkcji getvar. funkcja setvar ustawia wartość zmiennej. Cytuj
jarekw90 Opublikowano 31 Maja 2017 Autor Zgłoś Opublikowano 31 Maja 2017 Trochę inaczej poradziłem sobie z tym problemem, zamieniłem (command "point") na funkcję (entmake ...). Cytuj
gruzin Opublikowano 1 Czerwca 2017 Zgłoś Opublikowano 1 Czerwca 2017 kiedyś miałem taki problem i załatwiłem to w ten sposób: ;=========================================================== (setvar "dimzin" 0) (setvar "osnapcoord" 1) ;============================================================= Cytuj
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ą.