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

Lisp rải taluy trên đường cong

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

Yêu cầu 1 của bạn hãy tham khảo ở trên đây.

Yêu cầu 2 của bạn trong lisp đã có giải quyết rồi bằng cách lựa chọn Change khi lisp hỏi. Lisp không phân biệt phải hay trái mà phân biệt theo chiều của polyline. Vì thế bạn cứ rải bình thường, nếu thấy đúng chiều rồi thì Ok còn nếu chưa thì change là được

Em xin cảm ơn anh Bình.

Em đã làm được rồi. Tuy nhiên em thấy nó hơi bất tiện ở chỗ chọn rải taly bên trái hay bên phải đường cần rải bởi vì lúc đầu mình chưa biết nó rải bên nào cả.

Nếu có thể anh nâng cấp lên giúp em là thêm 1 đoạn code để cho lisp nhắc thêm dòng lệnh rải bên trái hay bên phải ( nhập T cho bên trái và P cho bên phải ) giống như dòng lệnh hỏi về chiều dài đoạn ngắn, chiều dài đoạn dài....

Em xin cảm ơn anh

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

Sao không thấy anh Bình quay lại topic nữa vậy.

Nhờ anh Bình giúp em.

Với lại anh Bình ơi sao em post bài mới mà post không được anh ạ.

Anh chỉ cụ thể giúp em tí.

Em cảm ơn anh

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

Rất mong anh em hoàn thiện giúp mình cái lisp này với. Cái lisp này được anh Bình viết cho nhưng có lẽ anh bận việc quá nên không quay lại diễn đàn nữa.

Nhờ anh em giúp em là thêm 1 đoạn code để cho lisp nhắc thêm dòng lệnh rải taluy bên trái hay bên phải ( nhập T cho bên trái và P cho bên phải ) giống như dòng lệnh hỏi về chiều dài đoạn ngắn, chiều dài đoạn dài....

tại vì mình rải mà cứ phải change lại liên lục vì mình không biết lisp sẽ rải bên phải hay bên trái của đường cần rải hết.

Rất mong anh em giúp đỡ.

Xin cảm ơn anh em

http://www.cadviet.com/upfiles/3/104866_rai_taluy__tl_1.lsp

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

Rất mong anh em hoàn thiện giúp mình cái lisp này với. Cái lisp này được anh Bình viết cho nhưng có lẽ anh bận việc quá nên không quay lại diễn đàn nữa.

Nhờ anh em giúp em là thêm 1 đoạn code để cho lisp nhắc thêm dòng lệnh rải taluy bên trái hay bên phải ( nhập T cho bên trái và P cho bên phải ) giống như dòng lệnh hỏi về chiều dài đoạn ngắn, chiều dài đoạn dài....

tại vì mình rải mà cứ phải change lại liên lục vì mình không biết lisp sẽ rải bên phải hay bên trái của đường cần rải hết.

Rất mong anh em giúp đỡ.

Xin cảm ơn anh em

http://www.cadviet.c...taluy__tl_1.lsp

Hề hề hề,

Không phải mình không quay lại mà là vấn đề của bạn mình đã trả lời rồi.

Bạn nên nhớ rằng bên phải hay bên trái là bạn phải căn cứ vào chiều của đường polyline. Mà cái này bạn lại hoàn toàn chả thể xác định được nó trước khi chạy lisp. vậy nên cho dù có làm thêm như bạn nói vẫn có trường hợp bạn xác định sai toét và phải change lại. Vậy tại sao phải cần nó trong khi lisp đã có khả năng change một phát là xong rất nhẹ nhành êm ái.

Bạn cũng cần hiểu rằng lisp này vẽ nét taluy dựa trên phương của hai điểm chân ta luy kế tiếp nhua theo chiều ngược với chiều của đường polyline. Vậy nên nếu bạn đã không chắc chắn về chiều của polyline thì cái việc phải hay trái của bạn sẽ là vô nghĩa.

Hơn nữa lisp này viết không chỉ dùng cho polyline mà còn có thể dùng cho các loại đường khác nữa.

Theo suy nghĩ của mình thì cách xử lỳ của lisp này hay hơn cách bạn suy nghĩ nhiều. Và minh không muốn sửa nữa.

 

Mình cũng xin đính chính là lisp này không do mình viết mà mình chỉ chỉnh sửa lại chút xíu cho phù hợp với yêu cầu của người dùng đặt ra thôi. Cách giải quyết vấn đề của bạn đã được người viết lisp này giải quyết khá gọn ghẽ bởi chức năng change phía rải taluy. Bạn hãy tận dụng điều này sẽ tốt hơn nhiều là việc đẻ ra một giải pháp không hoàn chỉnh mới.

 

Chúc bạn vui.

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ấy các bạn yêu cầu nhiều về lisp vẽ taluy và trên diễn đàn có share nhiều lisp. Tuy nhiên sau khi dùng thử mọi cái tôi thấy cái lisp của Lamteco đưa lên là hợp lý; tuy nhiên nó bị lỗi nên khi xài tôi phát hiện ra và hiệu chỉnh lại .

Các lệnh vẫn giữ nguyên:

1/ Khai báo các kiểu nét taluy dài ngắn, khoảng cách và số vạch ngắn chen giữa vạch dài = lệnh: VTL0;

2/ Vẽ taluy cho 1 đường riêng biệt = lệnh: VTL1, cho phép chọn đổi bên trái sang phải;

3/ Vẽ taluy chọn đường đỉnh mái taluy và đường chân mái taluy, cho phép đổi ngược lại = lệnh: VTL2.

(setq ktdoantaluy1 0.2 ktdoantaluy2 0.4 khoangcachtl 0.2 chieutaluy 1sodoan 0 sodoanngan 4);Ve taluy tren 1 doan(defun ve1doantaluy ( p1 p2 / pvt diemcu ktdoantaluy ketthuc )(setq pvt (+ (angle p1 p2) (* (/ pi 2) chieutaluy)))(setq ketthuc 1)(if (< sodoan sodoanngan)(progn(setq ktdoantaluy ktdoantaluy1)(setq sodoan (1+ sodoan)))(progn(setq ktdoantaluy ktdoantaluy2)(setq sodoan 0)))(setq p2 (polar p1 pvt ktdoantaluy))(command "_.Line" p1 p2 "")(setq dem (1+ dem)))(Defun xddsd ( com epl kc / e0 e p dsd )(setq e0 (entlast))(while e0(setq e e0)(setq e0 (entnext e0)))(command com epl kc)(setq e (entnext e))(while e(setq p (cdr (assoc 10 (entget e))))(if p(setq dsd (cons p dsd)))(setq e (entnext e)))(command "_.Undo" 1)(setq dsd dsd)); ve ta luy cho 1 doi tuong(Defun vetaluy ( ep / le e ketthuc them dsd thutu)(setq dem 0)(setq e (entget (car ep)))(if (or (= (cdr (assoc 0 e)) "POLYLINE")(= (cdr (assoc 0 e)) "LINE")(= (cdr (assoc 0 e)) "ARC")(= (cdr (assoc 0 e)) "CIRCLE")(= (cdr (assoc 0 e)) "SPLINE")) (setq ketthuc 1))(if (or (= (cdr (assoc 0 e)) "LWPOLYLINE") (= (cdr (assoc 0 e)) "POLYLINE"))(setq ketthuc 1))(if ketthuc(progn(setq thutu 0)(setq dsd (xddsd "_.Measure" ep khoangcachtl))(setq p1 (car dsd))(repeat (1- (length dsd))(setq thutu (1+ thutu))(setq p2 (nth thutu dsd))(ve1doantaluy p1 p2)(setq p1 p2))))(setq dem dem))(Defun C:vtl1 ( / il ill ep chon lai solan )(setq il (getvar "cecolor"))(setq ill (getvar "osmode"))(setvar "osmode" 0);(setvar "cecolor" "9")(setvar "cmdecho" 0)(setvar "blipmode" 0)(command "undo" "begin")(setq ep 1)(while ep(setq solan 0 chieutaluy 1)(setq ep (entsel))(if ep(progn(setq solan (vetaluy ep))(setq chon (getstring "\nU-UNDO/D-Doi nguoc lai:"))))(if chon (setq chon (strcase chon nil)))(if (= chon "U")(command "_.Undo" solan))(if (= chon "D")(progn(setq chieutaluy -1)(command "_.Undo" solan)(setq solan (vetaluy ep))))(setq chon nil))(setvar "cecolor" il)(setvar "osmode" ill)(command "undo" "end"))(Defun C:vtl0 ( / tg )(setq tg (getreal (strcat "Chieu dai doan ngan<" (rtos ktdoantaluy1 2 2) ">:")))(if tg (setq ktdoantaluy1 tg))(setq tg (getreal (strcat "Chieu dai doan dai<" (rtos ktdoantaluy2 2 2) ">:")))(if tg (setq ktdoantaluy2 tg))(setq tg (getreal (strcat "Khoang cach giua cac doan<" (rtos khoangcachtl 2 2) ">:")))(if tg (setq khoangcachtl tg))(setq tg (getint (strcat "So doan ngan trong 1 doan dai<" (rtos sodoanngan 2 0) ">:")))(if tg (setq sodoanngan tg)))(Defun ve1doantaluy1 ( p1 p2 / d pv diemcu ktdoantaluy ketthuc )(if (and p1 p2)(progn(setq ketthuc 1)(setq pv (angle p1 p2))(setq d (distance p1 p2))(setq d (* d (/ ktdoantaluy1 ktdoantaluy2)))(setq pv (polar p1 pv d))(if (< sodoan sodoanngan)(progn(setq p2 pv)(setq sodoan (1+ sodoan)))(progn(setq p2 p2)(setq sodoan 0)))(command "_.Line" p1 p2 "")(setq dem (1+ dem))))(setq dem dem))(Defun vetaluy1 ( ep1 ep2 dao / le e1 e2 ketthuc them thutu )(setq dem 0)(setq e1 (entget (car ep1)))(setq e2 (entget (car ep2))) (if (and (or (= (cdr (assoc 0 e1)) "POLYLINE") (= (cdr (assoc 0 e1)) "LINE") (= (cdr (assoc 0 e1)) "ARC") (= (cdr (assoc 0 e1)) "CIRCLE") (= (cdr (assoc 0 e1)) "LWPOLYLINE") (= (cdr (assoc 0 e1)) "SPLINE")) (or (= (cdr (assoc 0 e2)) "POLYLINE") (= (cdr (assoc 0 e2)) "LINE") (= (cdr (assoc 0 e2)) "ARC") (= (cdr (assoc 0 e2)) "CIRCLE") (= (cdr (assoc 0 e2)) "LWPOLYLINE") (= (cdr (assoc 0 e2)) "SPLINE")) ) (setq ketthuc 1))(if (and (= (cdr (assoc 0 e1)) "POLYLINE") (= (cdr (assoc 0 e2)) "LWPOLYLINE"))(setq ketthuc 1))(if ketthuc(progn(setq thutu 0)(setq dsd1 (xddsd "_.Measure" ep1 khoangcachtl))(setq dsd2 (xddsd "_.Divide" ep2 (length dsd1)))(if dao(setq dsd2 (reverse dsd2)))(repeat (length dsd1)(setq p1 (nth thutu dsd1))(setq p2 (nth thutu dsd2))(setq thutu (1+ thutu))(ve1doantaluy1 p1 p2))))(setq dem dem))(Defun C:vtl2 ( / ep1 ep2 chon lai solan dsd1 dsd2 )(setq il (getvar "cecolor"))(setq ill (getvar "osmode"))(setvar "osmode" 0);(setvar "cecolor" "9")(setvar "cmdecho" 0)(setvar "blipmode" 0)(command "undo" "begin")(setq solan 0 ep1 1 ep2 1)(while (and ep1 ep2)(setq chieutaluy 1)(setq ep1 (entsel "\nDoi tuong thu nhat:"))(setq ep2 (entsel "\nDoi tuong thu hai:"))(if (and ep1 ep2)(progn(setq solan (vetaluy1 ep1 ep2 nil))(setq chon (getstring "\nU-UNDO/D-Doi nguoc lai:"))))(if chon (setq chon (strcase chon nil)))(if (= chon "U")(command "_.Undo" solan))(if (= chon "D")(progn(command "_.Undo" solan)(setq chieutaluy -1)(setq solan (vetaluy1 ep2 ep1 nil))))(setq chon nil))(command "undo" "end")(setvar "cecolor" il)(setvar "osmode" ill))
Mèo tui test thấy ngon không thua gì các lệnh RTL của Nova, các bạn test lại xem sao

 

Anh có thể sửa lại cho các đoạn ngắn dài khi dùng VTL2 vuông góc với 1 trong 2 đường thẳng chọn không? Nếu được thì hay quá. Thanks!

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  

×