Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
11 replies to this topic

#1 ngocutcbg

ngocutcbg

    biết zoom

  • Members
  • Pip
  • 15 Bài viết
Điểm đánh giá: -7 (bình thường)

Đã gửi 20 October 2015 - 11:38 AM

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:

 


  • -3

#2 hiepttr

hiepttr

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1298 Bài viết
Điểm đánh giá: 518 (tốt)

Đã gửi 20 October 2015 - 12:36 PM

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)
)

  • 1

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#3 anti lazy

anti lazy

    biết lệnh erase

  • Members
  • PipPipPip
  • 107 Bài viết
Điểm đánh giá: 27 (tàm tạm)

Đã gửi 20 October 2015 - 02:20 PM

Thiếu trường hợp có nhiều giao điểm


  • 0

#4 ngocutcbg

ngocutcbg

    biết zoom

  • Members
  • Pip
  • 15 Bài viết
Điểm đánh giá: -7 (bình thường)

Đã gửi 20 October 2015 - 07:12 PM

Bác nào giúp mình với :(


  • -2

#5 minhtu2004

minhtu2004

    biết lệnh chamfer

  • Members
  • PipPipPipPip
  • 219 Bài viết
Điểm đánh giá: 34 (tàm tạm)

Đã gửi 21 October 2015 - 07:41 AM

-Có người giúp rồi đó load về dùng đi có gi thi up file lên nhờ tiếp. Có người giúp rồi còn kêu gì nữa, cũng hok thấy cám ơn luôn.


  • 0

-Nhận thực hiện bản vẽ 3D bằng revit.
-Liên hệ: 01664793290.


#6 ngocutcbg

ngocutcbg

    biết zoom

  • Members
  • Pip
  • 15 Bài viết
Điểm đánh giá: -7 (bình thường)

Đã gửi 21 October 2015 - 03:40 PM

 

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


  • 0

#7 hiepttr

hiepttr

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1298 Bài viết
Điểm đánh giá: 518 (tốt)

Đã gửi 22 October 2015 - 08:18 AM

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)
)


  • 1

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#8 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 22 October 2015 - 12:15 PM

 

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) ????


  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#9 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 22 October 2015 - 12:28 PM

(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


  • 0

#10 hiepttr

hiepttr

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1298 Bài viết
Điểm đánh giá: 518 (tốt)

Đã gửi 22 October 2015 - 12:46 PM

@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


  • 0

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#11 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 22 October 2015 - 01:49 PM

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


  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#12 ngocutcbg

ngocutcbg

    biết zoom

  • Members
  • Pip
  • 15 Bài viết
Điểm đánh giá: -7 (bình thường)

Đã gửi 23 October 2015 - 01:34 PM

Cảm ơn bác hiepttr nha  :) 


  • 0