Wierzchołki polilini


Recommended Posts

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.

Link to comment
Share on other sites

 (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 

 

Link to comment
Share on other sites

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 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 /

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...