Pawcyk Posted January 19, 2017 Report Share Posted January 19, 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. Quote Link to comment Share on other sites More sharing options...
kruszynski Posted January 19, 2017 Report Share Posted January 19, 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 Quote Link to comment Share on other sites More sharing options...
Pawcyk Posted January 19, 2017 Author Report Share Posted January 19, 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 Quote Link to comment Share on other sites More sharing options...
kruszynski Posted January 19, 2017 Report Share Posted January 19, 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. Quote Link to comment Share on other sites More sharing options...
kruszynski Posted January 19, 2017 Report Share Posted January 19, 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 / Quote Link to comment Share on other sites More sharing options...
Pawcyk Posted January 19, 2017 Author Report Share Posted January 19, 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 Quote Link to comment Share on other sites More sharing options...
Pawcyk Posted January 19, 2017 Author Report Share Posted January 19, 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. Quote Link to comment Share on other sites More sharing options...
kruszynski Posted January 20, 2017 Report Share Posted January 20, 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 "" ) ) Quote Link to comment Share on other sites More sharing options...
Pawcyk Posted January 20, 2017 Author Report Share Posted January 20, 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. Quote Link to comment Share on other sites More sharing options...
Pawcyk Posted January 20, 2017 Author Report Share Posted January 20, 2017 KOREKTA nowe ZWCady też potrafią. (sprawdzone ZWCad 2015+ i 2017) Wniosek...lisp niepotrzebny. Quote Link to comment Share on other sites More sharing options...
Pawcyk Posted January 27, 2017 Author Report Share Posted January 27, 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 Quote Link to comment Share on other sites More sharing options...
kruszynski Posted January 27, 2017 Report Share Posted January 27, 2017 A mógłby Pan napisać coś więcej o tym co rozumieć jako "nie działa" ? Quote Link to comment Share on other sites More sharing options...
Pawcyk Posted January 27, 2017 Author Report Share Posted January 27, 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. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.