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

[Sửa lisp] Vẽ mặt cắt địa hình từ lisp tìm giao điểm

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

Sau khi trao đổi và học hỏi với phamthanhbinh mình viết được lisp sau:

http://www.cadviet.com/upfiles/3/10633_tim_gd_khong_gian1.lsp

http://www.cadviet.com/upfiles/3/10633_new_block.dwg

Nhưng xảy ra lỗi. Mình đã thể hiện cụ thể trong bản vẽ

Rất mong nhận được sự giúp đỡ của các bạn.

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

Hàm vlax-curve-getparamatpoint sẽ cho kết quả sai đối với LINE, vì vậy bạn dùng đường tìm giao điểm là pline hoặc dùng đoạn code sau thay cho

(setq plst (vl-sort plst .....

 

(setq pst (vlax-curve-getStartPoint e2))
(setq plst (vl-sort plst '(lambda (x y) (< (distance pst (list (car x) (cadr x) 0)) (distance pst (list (car y) (cadr y) 0))))))

Code bạn viết dùng (car vtmc) (cadr vtmc) rất nhiều chỗ, nên đặt biến trung gian VD: xo, yo

(+ (carvtmc) -30)  => x1

(+ (car vtmc) -31)  => x2

Dùng hàm atoi thay vì atof đối với số nguyên

(rtos (setq moc0 (+ moc0 1)) 2 0) => (atoi (setq moc0 (1+ moc0)))

  • 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

Hàm vlax-curve-getparamatpoint sẽ cho kết quả sai đối với LINE, vì vậy bạn dùng đường tìm giao điểm là pline hoặc dùng đoạn code sau thay cho

(setq plst (vl-sort plst .....

 

(setq pst (vlax-curve-getStartPoint e2))
(setq plst (vl-sort plst '(lambda (x y) (< (distance pst (list (car x) (cadr x) 0)) (distance pst (list (car y) (cadr y) 0))))))

Code bạn viết dùng (car vtmc) (cadr vtmc) rất nhiều chỗ, nên đặt biến trung gian VD: xo, yo

(+ (carvtmc) -30)  => x1

(+ (car vtmc) -31)  => x2

Dùng hàm atoi thay vì atof đối với số nguyên

(rtos (setq moc0 (+ moc0 1)) 2 0) => (atoi (setq moc0 (1+ moc0)))

Đang test phần sửa của bạn.

(rtos (setq moc0 (+ moc0 1)) 2 0) => (atoi (setq moc0 (1+ moc0))) là không được vì ở đây cần trả về giá trị STRING.

Còn vì sao mình không đặt điểm trung gian vì mình muốn quy định chỉ 1 điểm biết còn các điểm khác không biết.

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

ITOA chứ không phải ATOI. Chắc do bạn ntdnv viết vội nên nhầm.

không phải nhầm đầu vì cầu tiếp theo của bạn ý là atof mờ... hì hì hì

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

Quên mất các bạn giúp mình trong trường hợp các đường đồng mức trùng nhau thì plst phải xử lý thế nào để không có toạ độ trùng.

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

Hàm vlax-curve-getparamatpoint sẽ cho kết quả sai đối với LINE, vì vậy bạn dùng đường tìm giao điểm là pline hoặc dùng đoạn code sau thay cho

(setq plst (vl-sort plst .....

 

(setq pst (vlax-curve-getStartPoint e2))
(setq plst (vl-sort plst '(lambda (x y) (< (distance pst (list (car x) (cadr x) 0)) (distance pst (list (car y) (cadr y) 0))))))

Code bạn viết dùng (car vtmc) (cadr vtmc) rất nhiều chỗ, nên đặt biến trung gian VD: xo, yo

(+ (carvtmc) -30)  => x1

(+ (car vtmc) -31)  => x2

Dùng hàm atoi thay vì atof đối với số nguyên

(rtos (setq moc0 (+ moc0 1)) 2 0) => (atoi (setq moc0 (1+ moc0)))

Trong trường hợp như hình vẽ thì hàm của bạn chưa đúng bạn có thể sửa giúp mình không, mình đã nghĩ ra 1 hàm nhưng kết quả vẫn sai.

http://www.cadviet.com/upfiles/3/10633_dongmuc.dwg

(setq plst (vl-sort plst '(lambda (x y) (< (vlax-curve-getDistAtPoint e2 (list (car x) (cadr x) 0)) (vlax-curve-getDistAtPoint e2 (list (car y) (cadr y) 0))))))

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ách thành 2 trường hợp

 

(if (= (cdr (assoc 0 (entget e2))) "LINE")
        (progn
            (setq pst (vlax-curve-getStartPoint e2))
            (setq plst (vl-sort plst '(lambda (x y) (< (distance pst (list (car x) (cadr x) 0)) (distance pst (list (car y) (cadr y) 0))))))
        )
        (setq plst (vl-sort plst '(lambda (x y)
            (< (vlax-curve-getparamatpoint e2 (list (car x) (cadr x) 0)) (vlax-curve-getparamatpoint e2 (list (car y) (cadr y) 0)))))))

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ách thành 2 trường hợp

 

(if (= (cdr (assoc 0 (entget e2))) "LINE")
        (progn
            (setq pst (vlax-curve-getStartPoint e2))
            (setq plst (vl-sort plst '(lambda (x y) (< (distance pst (list (car x) (cadr x) 0)) (distance pst (list (car y) (cadr y) 0))))))
        )
        (setq plst (vl-sort plst '(lambda (x y)
            (< (vlax-curve-getparamatpoint e2 (list (car x) (cadr x) 0)) (vlax-curve-getparamatpoint e2 (list (car y) (cadr y) 0)))))))

mình cũng đã tách. Nhưng với bản vẽ #7 thì không cho kết quả đúng. Bạn có thể xem lại giúp mình không?

Mình thử bản vẽ mới thì tất cả ok. Nhưng với bản vẽ mình up lên ở #7 thì không đúng. Bạn có thể nói cho mình vì sao nó lại sai lệch không.

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

mình cũng đã tách. Nhưng với bản vẽ #7 thì không cho kết quả đúng. Bạn có thể xem lại giúp mình không?

Mình test đúng trên bản vẽ đó. Nhưng mặt cắt không đúng với thực tế là cao trình đỉnh giữa của pline phải cao hơn (hoặc thấp hơn) cao trình đường đồng mức trong cùng. Bạn phải thêm bằng thủ công hoặc vẽ thêm 1 pline cao trình lẻ qua đỉnh đó

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

Mình test đúng trên bản vẽ đó. Nhưng mặt cắt không đúng với thực tế là cao trình đỉnh giữa của pline phải cao hơn (hoặc thấp hơn) cao trình đường đồng mức trong cùng. Bạn phải thêm bằng thủ công hoặc vẽ thêm 1 pline cao trình lẻ qua đỉnh đó

Vấn đề không nằm ở đó bạn à. mình post ở đây bạn xem nhé

http://www.cadviet.com/forum/topic/85502-nho-giup-do-lisp-tim-giao-diem/

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

Thêm hàm sau và sửa đoạn sort plst

 

(defun getparam2d (e p)
    (vlax-curve-getparamatpoint e (vlax-curve-getClosestPointTo e (list (car p) (cadr p) 0))))

(setq plst (vl-sort plst '(lambda (x y)
            (< (getparam2d e2 x) (getparam2d e2 y)))))
 
  • 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

Cảm ơn bạn mình đã test nhưng ......... với ít đường đồng mức thì đúng, càng nhiều đường đồng mức thì lại sai một số điểm.

Bạn test lại hộ mình với bản vẽ này nhé.

http://www.cadviet.com/upfiles/3/10633_dongmuc_2.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

Do bản vẽ của bạn sử dụng 2DPolyline được tạo ra từ các phiên bản Cad đời cũ, nên k/quả đôi khi ko chính xác.

Cách khắc phục là dùng lệnh Convert hoặc PEdit để chuyển qua LWPolyline trước khi chạy Lisp.

  • 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

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

×