Wierzchołki polilini


Rekomendowane odpowiedzi

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.

Odnośnik do komentarza
Udostępnij na innych stronach

 (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 

 

Odnośnik do komentarza
Udostępnij na innych stronach

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 

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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 /

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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 

Odnośnik do komentarza
Udostępnij na innych stronach

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

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie