Pawcyk Opublikowano 19 Stycznia 2017 Zgłoś Udostępnij Opublikowano 19 Stycznia 2017 Dzień dobry. Kombinuje z pewnym lispem, który wpisywałby współrzędną Y w wierzchołkach polilini. Na stronie ZWCada napotkałem na taki kod: https://www.zwcad.pl/help/lisp-help/270-assoc.html moja wariacja na ten temat (która nie działa): defun c:yy () (setvar "dimzin" 2) (setq PozOdn (getreal "\nPodaj poziom odniesienia \n")) (setq P1 (getpoint "\nWskaz początek ukladu wspolrzednych \n")) (setq x1 (nth 0 P1) y1 (nth 1 P1)) (setq polilinia(entget (car(entsel "\nWskaż polilinię \n")))) (setq wierzchołki nil ) (while (setq wierzchołek (assoc 10 polilinia)) (setq wierzchołki (append wierzchołki (list (cdr wierzchołek)))) (setq Polilinia (cdr (member wierzchołek polilinia) ) ) (setq x2 (nth 0 wierzchołki) y2 (nth 1 wierzchołki)) (setq rzedna (+ PozOdn (/ (- y2 y1) 5))) (command "_text" wierzchołki "" "" (RTOS rzedna 2 2)) ) );KONIEC Dziękuję za pomoc i proszę o wyrozumiałość dla początkującego. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kruszynski Opublikowano 19 Stycznia 2017 Zgłoś Udostępnij Opublikowano 19 Stycznia 2017 (setq wierzchołek (assoc 10 polilinia)) to współrzędne w formacie (10 x y z) A Ty chcesz odczytywać współrzędne z listy wszystkich współrzędnych, a nie z listy współrzędnych jednego wierzchołka (setq x2 (nth 0 wierzchołki) y2 (nth 1 wierzchołki)) Powinno być: (setq wierzchołek (cdr wierzchołek )) (setq x2 (nth 0 wierzchołek) ) (setq y2 (nth 1 wierzchołek) ) Czyli całość: (defun c:yy () (setvar "dimzin" 2) (setq PozOdn (getreal "\nPodaj poziom odniesienia \n")) (setq P1 (getpoint "\nWskaz początek ukladu wspolrzednych \n")) (setq x1 (nth 0 P1) y1 (nth 1 P1)) (setq polilinia(entget (car(entsel "\nWskaż polilinię \n")))) (setq wierzchołki nil ) (while (setq wierzchołek (assoc 10 polilinia)) (setq wierzchołki (append wierzchołki (list (cdr wierzchołek)))) (setq Polilinia (cdr (member wierzchołek polilinia) ) ) (setq wierzchołek (cdr wierzchołek )) (setq x2 (nth 0 wierzchołek) ) (setq y2 (nth 1 wierzchołek) ) (setq rzedna (+ PozOdn (/ (- y2 y1) 5))) (command "_text" wierzchołek "" "" (RTOS rzedna 2 2)) ) );KONIEC Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Pawcyk Opublikowano 19 Stycznia 2017 Autor Zgłoś Udostępnij Opublikowano 19 Stycznia 2017 Dziękuję za pomoc. Jeżeli można to mam jeszcze problem z funkcją "wyciągnij" tz. działa tylko na jednym elemencie (powierzchni 3d). Pomyślałem ze można wykorzystać powyższy kod...ale oczywiście nie działa. (defun c:zz () (print "\nWskaż ścieżkę wyciągania") (setq sciezka (ssget "_:S")) ;a może tak:(setq sciezka(entget (car(entsel "\nWskaż polilinię \n")))) (print "\nWskaż wszystkie powierzchnie") (setq pow3D (ssget)) (setq wszystkie nil ) (while (setq JednaPow (assoc 10 pow3D)) (setq wszystkie (append wszystkie (list (cdr JednaPow)))) (setq pow3D (cdr (member JednaPow pow3D) ) ) (setq JednPow (cdr JednaPow )) (command "_extrude" JednaPow "c" sciezka) ) );KONIEC Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kruszynski Opublikowano 19 Stycznia 2017 Zgłoś Udostępnij Opublikowano 19 Stycznia 2017 A jakiś komunikat błędu jest? czy jak nie działa Bardziej dziwi mnie że działa na powierzchni 3d niż że nie działa. To jest zupełnie niepotrzebne: (setq wszystkie nil ) (setq wszystkie (append wszystkie (list (cdr JednaPow)))) Jedną powierzchnię ze Zbioru selectionset wybiera się tak: (ssname pow3D i) gdzie i to kolejny index. kod: (setq JednaPow (assoc 10 pow3D)) Wyświetla mi komunikat: Error: incorrect type - <Selection Set: ffd188c0> I w sumie racja bo assoc wybiera z listy element powiązany z liczbą 10. a nie 10 czy 11 element z listy. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kruszynski Opublikowano 19 Stycznia 2017 Zgłoś Udostępnij Opublikowano 19 Stycznia 2017 Jeszcze czegoś nie rozumiem, Kiedy czytałem to pierwszy raz pomyślałem o wyciąganiu w sensie zamiany np prostokąta na prostopadłościan. Jeśli tak, to to się robi funkcją _sweep a nie _extrude. W takim przypadku cały kod mógłby wyglądać tak: (defun c:zz () (setq sciezka(car(entsel "\nWskaż ścieżkę wyciągania \n"))) (print "\nWskaż wszystkie powierzchnie") (setq pow3D (ssget)) (setq i 0) (while (< i (sslength pow3D)) (setq JednaPow (ssname pow3D i )) (command "_sweep" JednaPow "" sciezka ) (setq i (1+ i) ) ) ) Chyba że chodzi o wyciąganie pojedynczej powierzchni w bryle (_extrude) ale to już ciut bardziej skomplikowane / Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Pawcyk Opublikowano 19 Stycznia 2017 Autor Zgłoś Udostępnij Opublikowano 19 Stycznia 2017 Chodzi mi o coś takiego (rys 2 i 3): w powyższym przykładzie zrobiłem to funkcją: _extrude Dodaje także przykładowy plik. Pow3d.dwg Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Pawcyk Opublikowano 19 Stycznia 2017 Autor Zgłoś Udostępnij Opublikowano 19 Stycznia 2017 zmiana kodu na taki: (command "_sweep" JednaPow "" sciezka "n") powoduje działanie lispa, jednak tworzy bryły w jednym miejscu, a chodzi o wyciągnięcie do góry w miejscu, w którym ta powierzchnia się znajduje. Chyba sam powyższego wywodu bym nie zrozumiał, dlatego zachęcam do odpalenia lispa w załączonym wyżej pliku. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kruszynski Opublikowano 20 Stycznia 2017 Zgłoś Udostępnij Opublikowano 20 Stycznia 2017 to może tak: (defun c:zz () (setq sciezka(car(entsel "\nWskaż ścieżkę wyciągania \n"))) (print "\nWskaż wszystkie powierzchnie") (setq pow3D (ssget)) (command "_Extrude" pow3d "" "_P" sciezka "" ) ) Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Pawcyk Opublikowano 20 Stycznia 2017 Autor Zgłoś Udostępnij Opublikowano 20 Stycznia 2017 tylko nowsze autocady potrafią wyciągać wiele powierzchni na raz.... dlatego myślałem, żeby zaznaczyć wiele obiektów, ale żeby brał po jednym do wyciągania. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Pawcyk Opublikowano 20 Stycznia 2017 Autor Zgłoś Udostępnij Opublikowano 20 Stycznia 2017 KOREKTA nowe ZWCady też potrafią. (sprawdzone ZWCad 2015+ i 2017) Wniosek...lisp niepotrzebny. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Pawcyk Opublikowano 27 Stycznia 2017 Autor Zgłoś Udostępnij Opublikowano 27 Stycznia 2017 Czy kod do opisywania wierzchołków polilinii może działać dla polilinii 3d?? Jeżeli tak to czemu taka modyfikacja nie działa: (defun c:ps_ow () (setvar "dimzin" 2) (setq polilinia(entget (car(entsel "\nWskaż polilinię \n")))) (setq wierzchołki nil ) (while (setq wierzchołek (assoc 10 polilinia)) (setq wierzchołki (append wierzchołki (list (cdr wierzchołek)))) (setq Polilinia (cdr (member wierzchołek polilinia) ) ) (setq wierzchołek (cdr wierzchołek )) (setq z1 (nth 2 wierzchołek) ) (command "_text" wierzchołek "" "" (RTOS z1 2 2)) ) );KONIEC Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kruszynski Opublikowano 27 Stycznia 2017 Zgłoś Udostępnij Opublikowano 27 Stycznia 2017 A mógłby Pan napisać coś więcej o tym co rozumieć jako "nie działa" ? Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Pawcyk Opublikowano 27 Stycznia 2017 Autor Zgłoś Udostępnij Opublikowano 27 Stycznia 2017 po wpisaniu komendy "ps_ow" wyświetla: Polecenie: ps_ow Wskaż polilinię 0.0 Polecenie: Moje rozumienie działania to takie, że kod wstawia tekst z wartością współrzędnej Z w wierzchołkach polilinii 3d. A niestety tego nie robi. 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ą.