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

Cao độ của đường LWPOLYLINE

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

txchuong    3

Các bác cho em hỏi nhờ tý:

Trong Lisp có hàm nào lấy được cao độ của đường lwpolyline (lwpolyline có cao độ).

Quả là em có bài toán như sau:

Trong bản vẽ của em có rất nhiều đường đồng mức, đó là các đường lwpolyline có cao độ.

Giờ em muốn nhặt ra cao độ của từng đường để biên tập lại

Cụ thể những đường đồng mức 0,5 sẽ bỏ đi (50.5, 51.5 ....) giữ lại các đường có cao độ tròn 50, 51 ... ( thay bước đường đm 0.5 thành 1). rồi chọn đường đồng mức cái ....

Em dùng (setq ss (ssget '((0 . "LWPOLYLINE")))) để chọn tất cả các lwpolyline  rồi duyệt từng đối tượng bằng entget nhưng không biết thằng cao độ nó nằm ở chỗ nào cả?

Mong các bác chỉ giáo. 

http://www.cadviet.com/upfiles/3/123735_ddm.dwg

 

 

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

Bạn tham khảo cái này nhé

(setq ss (vlax-ename->vla-object (car(entsel"\nChon polyline: ")))) ;chon duong polyline

(setq pt (vlax-curve-getEndPoint ss)) ; lay toa do diem cuoi cua polyline

(setq z (caddr pt)) ; lay cao do z cua diem pt

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
txchuong    3

Dùng entsel không được bác à vì như vậy chỉ chọn được 1 đối tượng mà em muốn khoanh 1 phát chọn tất cả các đường lwpolyline.

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
thanhduan2407    227

Bạn làm cách này được không nhé.

Từ các đường đồng mức có cao độ. Bạn dùng lisp dưới đây để ghi cao độ của Pline. 

Bạn sẽ nhập khoảng cách giữa các cao độ trên cùng 1 Pline.

Như vậy mỗi đường đồng mức ta đều có số liệu cao độ rồi. 

Từ số liệu này ta có thể chạy tạo lại đường đồng mức 1 m dễ dàng.

Code của bạn đây

(defun c:GDCPL( / olmode ss KCL h en CDPline n i Pnt1)
(vl-load-com)
(setvar "CMDECHO" 0)
(setq olmode (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setq ss (ssget  (list (cons 0 "POLYLINE,LWPOLYLINE"))))
(setq KCL (getreal "\n Nhap khoang cach can ghi cao do:  "))
(setq h (getreal "\n Nhap chieu cao Text cao do:  "))

(foreach en (acet-ss-to-list ss)
  	(progn
		(setq CDPline (Length1  en))
		(setq n (fix (/ CDPline KCL)))
		(setq i 1)
		(while (<= i n)
			(setq pnt1 (vlax-curve-getPointAtDist en (* i KCL)))
			(MakeText pnt1 (rtos (caddr Pnt1) 2 2) h 0 "L") 
		  	(setq i (1+ i))
		)
	  )
)
(setvar "osmode" olmode)
(princ)
)
(defun Length1 (e) (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e)))
  
(defun MakeText (point string Height Ang justify / Lst); Ang: Radial
(setq Lst (list '(0 . "TEXT")
								(cons 10 point)
								(cons 40 Height)
								(cons 1 string)
								(if Ang (cons 50 Ang))
								
								
		)
	justify (strcase justify)
)
(cond ((= justify "C") (setq Lst (append Lst (list (cons 72 1) (cons 11 point)))))
			((= justify "R") (setq Lst (append Lst (list (cons 72 2) (cons 11 point)))))
			((= justify "M") (setq Lst (append Lst (list (cons 72 4) (cons 11 point)))))
			((= justify "TL") (setq Lst (append Lst (list (cons 72 0) (cons 11 point) (cons 73 3)))))
			((= justify "TC") (setq Lst (append Lst (list (cons 72 1) (cons 11 point) (cons 73 3)))))
			((= justify "TR") (setq Lst (append Lst (list (cons 72 2) (cons 11 point) (cons 73 3)))))	
			((= justify "ML") (setq Lst (append Lst (list (cons 72 0) (cons 11 point) (cons 73 2)))))
			((= justify "MC") (setq Lst (append Lst (list (cons 72 1) (cons 11 point) (cons 73 2)))))
			((= justify "MR") (setq Lst (append Lst (list (cons 72 2) (cons 11 point) (cons 73 2)))))
			((= justify "BL") (setq Lst (append Lst (list (cons 72 0) (cons 11 point) (cons 73 1)))))
			((= justify "BC") (setq Lst (append Lst (list (cons 72 1) (cons 11 point) (cons 73 1)))))
			((= justify "BR") (setq Lst (append Lst (list (cons 72 2) (cons 11 point) (cons 73 1))))))
(entmakex Lst)
)

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
txchuong    3

Cảm ơn bác thanhduan2407 nhiều.

Em rất mù mờ về mấy hàm vl nhưng nhờ cái lsp của bác mà em xác định được cao độ của đường pline đó bằng cách ăn cắp cái hàm của bác để thành cái của em:

(setq caodo (last (vlax-curve-getPointAtDist valname 0))) 

Một lần nữa cảm ơn bác nhiều.

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
Tot77    501

Bạn dùng dxf code 38 để biết cao độ của pline.

 

(defun c:tmp()
  (mapcar '(lambda(x) (entmake (list '(0 . "TEXT")
(cons 10 (setq tm (vlax-curve-getstartPoint (vlax-ename->vla-object x))))
(cons 11 tm) (cons 1 (rtos (cdr (assoc 38 (entget x))))) (cons 40 (getvar 'textsize)))))
(acet-ss-to-list (ssget)))
)
  • 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
gia_bach    1.442

...................

Cụ thể những đường đồng mức 0,5 sẽ bỏ đi (50.5, 51.5 ....) giữ lại các đường có cao độ tròn 50, 51

... 

http://www.cadviet.com/upfiles/3/123735_ddm.dwg

Tham khảo Lisp chuyển các LwPolyline có cao độ là số thập phân về layer "0", các LwPolyline có cao độ là số nguyên không thay đổi.

(defun C:fpl(/ ele)
  (if(ssget "_:L" (list (cons 0 "LWPOLYLINE")))
    (vlax-for e (vla-get-activeSelectionSet (vla-get-ActiveDocument(vlax-get-acad-object)))
      (if (> (abs(- (setq ele (vla-get-elevation e)) (fix ele))) 0)
	(vla-put-layer e "0")) ))
  (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

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


×