Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
ngocutcbg

Nội Suy Cao Độ Y Từ Cao Độ X Và Đồ Thị Bằng Pline, Arc

Các bài được khuyến nghị

ngocutcbg    7

Các bác cho em hỏi:

Em có một đường Polyline gồm có các đường line và đường Arc

Em có các tọa độ x trên đường polyline này - giờ em muốn lấy tạo độ y trên đường polyline nay thì làm thế nào a.

các bác giúp em với- em đang cần gấp lắm a :blink:

 

  • Vote giảm 3

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
hiepttr    523

Lâu không được code nên ngứa ngáy viết đại :D

Bạn nên sửa TUT lại cho đúng quy định kẻo bị xóa :D :D :D

(defun c:TIMY ( / lst_va old pl x xl int_pt)
(vl-load-com)
(setq lst_va '("osmode" "cmdecho"))
(setq old (mapcar 'getvar lst_va))
(mapcar 'setvar lst_va '(0 0))
(prompt "\nChon PL! ")
(while (null pl) (prompt "\nChon PL! ") (setq pl (ssget "_+.:E:S" '((0 . "LWPOLYLINE")))))
(setq pl (vlax-ename->vla-object (ssname pl 0)))
(while (setq x (getreal "\nNhap X: "))
		(progn
			(command ".xline" "v" (list x 0) "")
			(setq xl (vlax-ename->vla-object (entlast)))
			(if (setq int_pt (vlax-invoke pl 'intersectwith xl acExtendNone)) (princ (strcat "\ Y = " (rtos (cadr int_pt) 2 3)))
				(princ (strcat "*** \Khong co diem nao co gia tri X= " (rtos x 2 3) " thuoc PL da chon ! ***"))
				)	;if
			(vla-erase xl)
		)
)
(mapcar 'setvar lst_va old)
(princ)
)
  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
ngocutcbg    7

 

Lâu không được code nên ngứa ngáy viết đại :D

Bạn nên sửa TUT lại cho đúng quy định kẻo bị xóa :D :D :D

(defun c:TIMY ( / lst_va old pl x xl int_pt)
(vl-load-com)
(setq lst_va '("osmode" "cmdecho"))
(setq old (mapcar 'getvar lst_va))
(mapcar 'setvar lst_va '(0 0))
(prompt "\nChon PL! ")
(while (null pl) (prompt "\nChon PL! ") (setq pl (ssget "_+.:E:S" '((0 . "LWPOLYLINE")))))
(setq pl (vlax-ename->vla-object (ssname pl 0)))
(while (setq x (getreal "\nNhap X: "))
		(progn
			(command ".xline" "v" (list x 0) "")
			(setq xl (vlax-ename->vla-object (entlast)))
			(if (setq int_pt (vlax-invoke pl 'intersectwith xl acExtendNone)) (princ (strcat "\ Y = " (rtos (cadr int_pt) 2 3)))
				(princ (strcat "*** \Khong co diem nao co gia tri X= " (rtos x 2 3) " thuoc PL da chon ! ***"))
				)	;if
			(vla-erase xl)
		)
)
(mapcar 'setvar lst_va old)
(princ)
)

cảm ơn bác hiepttr. nhưng lisp của bác khó quán, em đọc không hiểu.

ý em không phải hỏi lisp để dùng luôn, mà em hỏi để vận dụng vào trường hợp của em đang cần

Bác nào giải thích hộ em cái lisp trên với

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
hiepttr    523

Fix trường hợp có nhiều điểm thỏa mãn:

(defun c:TIMY ( / lst_va old pl x xl int_pt len)
(vl-load-com)
(setq lst_va '("osmode" "cmdecho"))
(setq old (mapcar 'getvar lst_va))
(mapcar 'setvar lst_va '(0 0))
(prompt "\nChon PL! ")
(while (null pl) (prompt "\nChon PL! ") (setq pl (ssget "_+.:E:S" '((0 . "LWPOLYLINE")))))
(setq pl (vlax-ename->vla-object (ssname pl 0)))
(while (setq x (getreal "\nNhap X: "))
		(progn
			(command ".xline" "v" (list x 0) "")
			(setq xl (vlax-ename->vla-object (entlast)))
			(if (setq int_pt (vlax-invoke pl 'intersectwith xl acExtendNone)) 
				(if
					(> (setq len (length int_pt)) 3)
						(repeat (/ len 3)
							(princ (strcat "\     Y = " (rtos (cadr int_pt) 2 3)))
							(setq int_pt (cdddr int_pt))
						)	  ;repeat
					(princ (strcat "\ Y = " (rtos (cadr int_pt) 2 3)))
				)	  ;if trong
				(princ (strcat "*** \Khong co diem nao co gia tri X= " (rtos x 2 3) " thuoc PL da chon ! ***"))
				)	;if ngoai
			(vla-erase xl)
		)
)
(mapcar 'setvar lst_va old)
(princ)
)

Và tám :D :D :D

Lisp trên làm việc theo phương thức:

1, Chọn LWpolyline cho đến lúc được thì

2, Vẽ Xline theo phương đứng (Ver...)

3, Xác định giao giữa PL và XL vừa vẽ ra,

   Nếu có, nếu list điểm giao do hàm vlax-invoke ...trả về  có length >3 thì >>> vòng lặp: in phần tử thứ 2, cắt 3 phần tử đầu list...

                nếu không (tức length = 3) thì in phần tử thứ 2;

  Nếu không giao, in dòng thông báo ...

 

Các hàm vl đều là kết quả mà mình mót được của các bác trên diễn đàn nên mình không dám lải nhải nhiều thêm :D :D :D

Hoặc là:

(defun c:TIMY ( / lst_va old pl x xl int_pt len)
(vl-load-com)
(setq lst_va '("osmode" "cmdecho"))
(setq old (mapcar 'getvar lst_va))
(mapcar 'setvar lst_va '(0 0))
(prompt "\nChon PL! ")
(while (null pl) (prompt "\nChon PL! ") (setq pl (ssget "_+.:E:S" '((0 . "LWPOLYLINE")))))
(setq pl (vlax-ename->vla-object (ssname pl 0)))
(while (setq x (getreal "\nNhap X: "))
		(progn
			(command ".xline" "v" (list x 0) "")
			(setq xl (vlax-ename->vla-object (entlast)))
			(if (not (setq int_pt (vlax-invoke pl 'intersectwith xl acExtendNone))) 
				(princ (strcat "*** \Khong co diem nao co gia tri X= " (rtos x 2 3) " thuoc PL da chon ! ***"))
				(while int_pt
					(princ (strcat "\     Y = " (rtos (cadr int_pt) 2 3)))
					(setq int_pt (cdddr int_pt))
				)	  ;while
			)	  
			(vla-erase xl)
		)
)
(mapcar 'setvar lst_va old)
(princ)
)

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
phamthanhbinh    3.123

 

Fix trường hợp có nhiều điểm thỏa mãn:

(defun c:TIMY ( / lst_va old pl x xl int_pt len)
(vl-load-com)
(setq lst_va '("osmode" "cmdecho"))
(setq old (mapcar 'getvar lst_va))
(mapcar 'setvar lst_va '(0 0))
(prompt "\nChon PL! ")
(while (null pl) (prompt "\nChon PL! ") (setq pl (ssget "_+.:E:S" '((0 . "LWPOLYLINE")))))
(setq pl (vlax-ename->vla-object (ssname pl 0)))
(while (setq x (getreal "\nNhap X: "))
		(progn
			(command ".xline" "v" (list x 0) "")
			(setq xl (vlax-ename->vla-object (entlast)))
			(if (setq int_pt (vlax-invoke pl 'intersectwith xl acExtendNone)) 
				(if
					(> (setq len (length int_pt)) 3)
						(repeat (/ len 3)
							(princ (strcat "\     Y = " (rtos (cadr int_pt) 2 3)))
							(setq int_pt (cdddr int_pt))
						)	  ;repeat
					(princ (strcat "\ Y = " (rtos (cadr int_pt) 2 3)))
				)	  ;if trong
				(princ (strcat "*** \Khong co diem nao co gia tri X= " (rtos x 2 3) " thuoc PL da chon ! ***"))
				)	;if ngoai
			(vla-erase xl)
		)
)
(mapcar 'setvar lst_va old)
(princ)
)

Và tám :D :D :D

Lisp trên làm việc theo phương thức:

1, Chọn LWpolyline cho đến lúc được thì

2, Vẽ Xline theo phương đứng (Ver...)

3, Xác định giao giữa PL và XL vừa vẽ ra,

   Nếu có, nếu list điểm giao do hàm vlax-invoke ...trả về  có length >3 thì >>> vòng lặp: in phần tử thứ 2, cắt 3 phần tử đầu list...

                nếu không (tức length = 3) thì in phần tử thứ 2;

  Nếu không giao, in dòng thông báo ...

 

Các hàm vl đều là kết quả mà mình mót được của các bác trên diễn đàn nên mình không dám lải nhải nhiều thêm :D :D :D

Hoặc là:

(defun c:TIMY ( / lst_va old pl x xl int_pt len)
(vl-load-com)
(setq lst_va '("osmode" "cmdecho"))
(setq old (mapcar 'getvar lst_va))
(mapcar 'setvar lst_va '(0 0))
(prompt "\nChon PL! ")
(while (null pl) (prompt "\nChon PL! ") (setq pl (ssget "_+.:E:S" '((0 . "LWPOLYLINE")))))
(setq pl (vlax-ename->vla-object (ssname pl 0)))
(while (setq x (getreal "\nNhap X: "))
		(progn
			(command ".xline" "v" (list x 0) "")
			(setq xl (vlax-ename->vla-object (entlast)))
			(if (not (setq int_pt (vlax-invoke pl 'intersectwith xl acExtendNone))) 
				(princ (strcat "*** \Khong co diem nao co gia tri X= " (rtos x 2 3) " thuoc PL da chon ! ***"))
				(while int_pt
					(princ (strcat "\     Y = " (rtos (cadr int_pt) 2 3)))
					(setq int_pt (cdddr int_pt))
				)	  ;while
			)	  
			(vla-erase xl)
		)
)
(mapcar 'setvar lst_va old)
(princ)
)

Hề hề hề,

Bác hieptr cho hỏi thăm đường với:

(setq int_pt (vlax-invoke pl 'intersectwith xl acExtendNone)) 

Vậy thằng int_pt là một list các giao điểm của xl và pl có phải không ạ????

Và nếu vậy thì list đó phải có dạng là (list p1, p2, ..... pn) chứ ạ???

Vậy thì tại sao lại cần: (length  int_pt >= 3) ????

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
tien2005    97

(setq int_pt (vlax-invoke pl 'intersectwith xl acExtendNone)) trả về 1 list (x1 y1z1 x2 y2 z2 ... xn yn zn)

từ list (x1 y1z1 x2 y2 z2 ... xn yn zn) chuyển về list (p1 p2 .... pn) thì hay hơn và cũng sẽ dùng nhiều sau này

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
hiepttr    523

@Bác Bình:

vla-invoke ... trả về có dạng (x1 y1z1 x2 y2 z2 ... xn yn zn) chứa ạh !

nên: trong code đầu (mình sửa lại từ code cũ) mình phân ra trường hợp có > 1 điểm giao thì chạy vòng lặp

>>> thấy việc phân ra trường hợp có 1 giao & >1 giao là "thừa" nên mình sửa lại code thứ 2.

 

@Bác tien2005:

Mình chỉ code theo yêu cầu chủ thớt như việc bóc củ khoai nóng thôi nên mới vậy :D :D :D

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
phamthanhbinh    3.123

@Bác Bình:

vla-invoke ... trả về có dạng (x1 y1z1 x2 y2 z2 ... xn yn zn) chứa ạh !

nên: trong code đầu (mình sửa lại từ code cũ) mình phân ra trường hợp có > 1 điểm giao thì chạy vòng lặp

>>> thấy việc phân ra trường hợp có 1 giao & >1 giao là "thừa" nên mình sửa lại code thứ 2.

 

@Bác tien2005:

Mình chỉ code theo yêu cầu chủ thớt như việc bóc củ khoai nóng thôi nên mới vậy :D :D :D

Hề hề hề,

Thank các bác chỉ dạy. Mình chưa biết cái (vlax-invoke ....) này nên phải hỏi tha9m đường. Mình hay dùng (acet-geom-intersect .....) nên nghĩ là nó trả về list p1 p2 ....

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

Đăng nhập để thực hiện theo  

×