Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
anonmyous

[Hỏi] CODE đọc dữ liệu đường 2D POLYLINE

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

Chào các bác !

Bác nào cho em xin đoạn mã đọc dữ liệu đường 2D POLYLINE

Đường mà (assoc 0 data ) = (0 . "POLYLINE") đấy ạ, không phải (0 . "LWPOLYLINE") đâu

E nhớ trên 4r cũng có rồi nhưng mà dùng các hàm khi chạy (vl-load-com)

E muốn đọc nó bằng LISP thuần túy, đồng thời cũng xác định luôn vị trí các đoạn cong trên đường 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

Chào các bác !

Bác nào cho em xin đoạn mã đọc dữ liệu đường 2D POLYLINE

Đường mà (assoc 0 data ) = (0 . "POLYLINE") đấy ạ, không phải (0 . "LWPOLYLINE") đâu

E nhớ trên 4r cũng có rồi nhưng mà dùng các hàm khi chạy (vl-load-com)

E muốn đọc nó bằng LISP thuần túy, đồng thời cũng xác định luôn vị trí các đoạn cong trên đường này

Khái niệm "đọc" dữ liệu hơi khó hiểu tí.

Bạn dùng đoạn code này để chọn 1 đối tượng POLYLINE xem có đúng ý bạn không?

(entget (car (entsel "\nChon POLYLINE: ")))

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

Chào các bác !

Bác nào cho em xin đoạn mã đọc dữ liệu đường 2D POLYLINE

Đường mà (assoc 0 data ) = (0 . "POLYLINE") đấy ạ, không phải (0 . "LWPOLYLINE") đâu

E nhớ trên 4r cũng có rồi nhưng mà dùng các hàm khi chạy (vl-load-com)

E muốn đọc nó bằng LISP thuần túy, đồng thời cũng xác định luôn vị trí các đoạn cong trên đường này

Code này đọc dữ liệu 2Dpolyline, xác định tọa độ đỉnh của Polyline này :

Quick code :


(defun c:gvert(/ e lst)
 (setq e (car(entsel "\nChon Polyline 2D")))
 (while (/= (cdr(assoc 0 (entget (setq e (entnext e))))) "SEQEND")
   (setq lst (append lst (list (cdr(assoc 10 (entget e))))))
 )
 (alert (vl-princ-to-string lst))
 (princ "\n")
lst
)

  • 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

Thanks bác, giờ thì e đã hiểu

Vậy còn đoạn cong trên đường này thì sao bác

Hề hề hề,

Với mỗi dỉnh của polyline, bạn check mã DXF 42 của nó, nếu giá trị của nó khác 0 thì đoạn polyline kế tiếp đỉnh đó có độ cong. và độ cong này chính là gia trị của mã dxf 42.

Khái niệm về độ cong này bạn có thể tham khảo thêm trên diễn đàn hay trong help của CAd.

Chúc bạn vui.

  • 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

Thanks bác, giờ thì e đã hiểu

Vậy còn đoạn cong trên đường này thì sao bác

Hề hề hề,

Đoạn lisp này mình viết vội để giúp bạn xác định các polyline có đoạn cong hay không và các đoạn cong này nằm ở phân đoạn nào trên polyline với bán kinh cong bằng bao nhiêu??

Bạn hãy test thử xem nhé. Do viết vội nên mình chưa khử biến và chưa check hết các trường hợp. Bạn có thể dựa vào đó để tự hoàn thiện nó nhé.

 

(defun c:xdr ()
(setq en (car (entsel "\n chon Polyline"))
         elst (entget en) 
         selst (list) )
(if (= (cdr (assoc 0 elst)) "POLYLINE") 
   (progn
        (setq en1 (entnext en)
                  i 1)
        (while (/= (cdr (assoc 0 (entget en1))) "SEQEND")
               (setq elst1 (entget en1))
               (if (/= (setq bul (cdr (assoc 42 elst1))) 0)
                   (progn 
                         (setq p1 (cdr (assoc 10 elst1))
                                  p2 (cdr (assoc 10 (entget (entnext en1))))
                                  l (distance p1 p2)
                                 R (/ l  2 (sin (* 2 (atan bul))) )
                                 selst (append selst (list (list i R)))
                          )
                     )
                 )
                 (setq i (1+ i)
                           en1 (entnext en1)
                 )
         )
     )
)
(if (= (cdr (assoc 0 elst)) "LWPOLYLINE")
   (progn
         (setq i 0)
         (setq plst (list))
         (foreach cod elst 
                (if (= (car cod) 10)
                    (setq plst (append plst (list (cdr cod))))
                )
         )
         (foreach code elst
                 (if (= (car code) 42)
                     (progn
                          (setq i (1+ i))
                          (if (/= (setq bul (cdr code)) 0)
                              (progn
                                   (setq p1 (nth (1- i) plst)
                                             p2 (nth i plst)
                                             l (distance p1 p2)
                                             R  (/ l  2 (sin (* 2 (atan bul))) )
                                   )     
                                   (setq selst (append selst (list (list i R))))
                               )
                            )
                       )
                    )
           )
     )
)


(if selst
    (foreach sec selst
      (alert (strcat "\n Phan doan " (rtos (car sec) 2 0) " cong voi ban kinh cong là: " (rtos (cadr sec) 2 2)))
    )
    (alert "\n Polyline khong co phan doan cong")
)

(princ)
)                                

Chúc bạn vui và nếu có gì chưa hài lòng hãy post lên để mình hiệu chỉnh lại lisp nhé.

  • 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

Đoạn cong e có search trên google nó có 1 khái niệm về cái số Bulge gì gì đó & e đã tính toán cũng như chuyển đổi ra tất cả các thông số của đoạn cong đó được rồi.

Cảm ơn các bác nhiều 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

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  

×