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

Lisp vát góc giữa hai đường thẳng (chiều dài vát phụ thuộc vào góc)

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

Với đoạn thằng mình cũng góp thử 1 đoạn.

(defun c:ZZ (/ e1 e2 ss1 ss2 diembd1 diemkt1 diembd2 diemkt2 diemgoc ang)
(setq e1 (entsel "Select 1th"))
(setq e2 (entsel "Select 2th"))
(setq ss1 (list (caadr e1) (cadadr e1)))
(setq ss2 (list (caadr e2) (cadadr e2)))
(setq diembd1 (vlax-curve-getStartPoint (car e1)))
(setq diemkt1 (vlax-curve-getEndPoint (car e1)))
(setq diembd2 (vlax-curve-getStartPoint (car e2)))
(setq diemkt2 (vlax-curve-getEndPoint (car e2))) 
(setq diemgoc (inters diembd1 diemkt1 diembd2 diemkt2 nil) )
(setq ang (rtd (LM:GetInsideAngle diembd1 diemgoc diembd2)))
(cond
((< ang 45) (setq dis "8"))
((and (>= ang 45) (< ang 90)) (setq dis "5"))
((= ang 90) (setq dis "4"))
((and (> ang 90) (< ang 135)) (setq dis "3"))
((> ang 135) (setq dis "2"))
)  
(command "_.chamfer" "d" dis dis)
(command "_.chamfer" ss1 ss2)  
(princ)
)
(defun LM:GetInsideAngle ( p1 p2 p3 )
    (   (lambda ( a ) (min a (- (+ pi pi) a)))
        (rem (+ pi pi (- (angle p2 p1) (angle p2 p3))) (+ pi pi))
    )
)
(defun rtd ( r ) (* 180.0 (/ r pi)))

 

  • 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
Vào lúc 31/10/2023 tại 09:27, tannguyen291 đã nói:

Lisp khá đơn giản.

Chọn 2 đối tượng.

Dùng lệnh fillet để cắt gọt đối tượng.

Tìm điểm trùng nhau giữa 2 đoạn thẳng. Nếu có thì sắp xếp trật tự của 2 danh sách điểm.

từ điểm trùng nhau tính góc giữa 2 đoạn thẳng.

Từ góc đó đếm trường hợp tính khoảng cách chamfer.

Sau đó sửa điểm của 2 đối tượng theo khoảng cách chamfer.

Cuối cùng nối liền bằng 1 đoạn thẳng line.

mình thử qua thì nó fillet xong dừ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
2 giờ trước, DungNguyen685 đã nói:

mình thử qua thì nó fillet xong dừng.

chủ thớt đã dùng và cảm ơn rồi, bạn thao tác kiểu gì mà không chạy?

Có thể máy của bạn dùng cad đời cũ thử gõ (vl-load-com) sau đó chạy lại lisp.

mình đã xem lisp của bạn. Cẩn thận trường hợp này sảy ra :)

image.png.86a53f1c6f621c877175fe5a52361a59.png

image.png.4680a1173fd6bc90b2d5330a82adad01.png

image.png.e4b88bfbc689ceab4f37edbe9844bb81.png

Không phải tự nhiên mà mình phải dùng fillet 0 ngay đầu tiên và kèm theo hàm vl-some

  • Like 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
1 giờ trước, tannguyen291 đã nói:

chủ thớt đã dùng và cảm ơn rồi, bạn thao tác kiểu gì mà không chạy?

Có thể máy của bạn dùng cad đời cũ thử gõ (vl-load-com) sau đó chạy lại lisp.

mình đã xem lisp của bạn. Cẩn thận trường hợp này sảy ra :)

image.png.86a53f1c6f621c877175fe5a52361a59.png

image.png.4680a1173fd6bc90b2d5330a82adad01.png

image.png.e4b88bfbc689ceab4f37edbe9844bb81.png

Không phải tự nhiên mà mình phải dùng fillet 0 ngay đầu tiên và kèm theo hàm vl-some

Bạn viết rồi nên mình góp vui thôi trường hợp 2 đường chưa giao hoặc trùng điểm giao.

Mình biết vài dòng code thì cái (vl-load-com) này thì mình biết rồi mà ko phải nó.

Vấn đề ở chỗ mình đọc code bạn thấy dùng entsel để chọn 2 đối tượng ent1 và ent2 sau đó FILLET nó lại thì từ 2 đối tượng đó sẽ tạo thành 1 đối tượng mang entity name của "ent1" và thằng "ent2" không còn nên từ (vlax-ename->vla-object (car ent2)) princ ra nó là nil => Dừng lisp

Bạn chủ thớt chạy đc thì mình ko hiểu sao chứ mình ko chạy góp ý bạn xem lại thôi còn fix thì mình cũng có cách.

  • 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
5 phút trước, NTHAHT đã nói:

@DungNguyen685Bạn dùng Inters để lấy điểm giao là ngon rồi, để xét góc bạn nên lấy điểm pick (khi chọn các line) nữa là Ok.

Cảm ơn bạn nhé! Mình cũng mới tập tành viết. Lúc viết mình chỉ nghĩ đến như hình minh hoạ thôi.

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
11 giờ trước, DungNguyen685 đã nói:

Bạn viết rồi nên mình góp vui thôi trường hợp 2 đường chưa giao hoặc trùng điểm giao.

Mình biết vài dòng code thì cái (vl-load-com) này thì mình biết rồi mà ko phải nó.

Vấn đề ở chỗ mình đọc code bạn thấy dùng entsel để chọn 2 đối tượng ent1 và ent2 sau đó FILLET nó lại thì từ 2 đối tượng đó sẽ tạo thành 1 đối tượng mang entity name của "ent1" và thằng "ent2" không còn nên từ (vlax-ename->vla-object (car ent2)) princ ra nó là nil => Dừng lisp

 Bạn chủ thớt chạy đc thì mình ko hiểu sao chứ mình ko chạy góp ý bạn xem lại thôi còn fix thì mình cũng có cách.

à là do bạn pick vào pline nên bị nối vào nhau. Bị mất 1 đối tượng. chứ line  thì không gặp tình trạng đó. mình cũng đã hỏi thớt và thớt nói chỉ có đường line thôi. :))

Lisp của bạn nếu pline nhiều cạnh sẽ không còn chính xác đâ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
11 giờ trước, NTHAHT đã nói:

@DungNguyen685Bạn dùng Inters để lấy điểm giao là ngon rồi, để xét góc bạn nên lấy điểm pick (khi chọn các line) nữa là Ok.

Góp ý chút điểm pick thì nên dùng (vlax-curve-getclosestpointto obj1 pt1) sẽ chính xác hơn.

@DungNguyen685 ngoài ra bạn dùng hàm lấy góc của ông thần LM cẩn thận góc của bạn trên 180d nhé. Thêm 1 lệnh (if (> ang 180) (setq ang (- 360 ang)) nữa là ngon

  • Like 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
1 giờ} trướ}c, tannguyen291 đã nói:

à là do bạn pick vào pline nên bị nối vào nhau. Bị mất 1 đối tượng. chứ line  thì không gặp tình trạng đó. mình cũng đã hỏi thớt và thớt nói chỉ có đường line thôi. :))

Lisp của bạn nếu pline nhiều cạnh sẽ không còn chính xác đâu ạ.

Đúng rồi thì mình test qua thế. 

Nếu dùng cho Pline nhiều cạnh thì có thể dùng như này nhưng chú ý vị trí Pick chọn trên đối tượng.

(defun c:ZZ (/ e1 e2 ss1 ss2 diembd1 diemkt1 diembd2 diemkt2 diemgoc ang)
(setq e1 (entsel "Select 1th"))
(setq e2 (entsel "Select 2th"))
(setq pt1 (cadr e1))
(setq pt2 (cadr e2))
(setq ss1 (list (caadr e1) (cadadr e1)))
(setq ss2 (list (caadr e2) (cadadr e2)))
(setq ent (car e1))
(setq point	(cadr e1))
(setq pointlist1 (extract-vertex ent))
(setq pointlist1 (list (nth 0 pointlist1) (nth 0 (reverse pointlist1))))
(findPointByPick)
(setq vitri1 (nth (nth 0 pointToDraw1) pointlist1))
(setq ent1 (car e2))
(setq point	(cadr e2))
(setq pointlist1 (extract-vertex ent1))
(setq pointlist1 (list (nth 0 pointlist1) (nth 0 (reverse pointlist1))))
(findPointByPick)
(setq vitri2 (nth (nth 0 pointToDraw1) pointlist1))
(setq diemgoc (inters pt1 vitri1  pt2 vitri2 nil) )
(setq ang (rtd (LM:GetInsideAngle pt1 diemgoc pt2)))
(cond
((< ang 45) (setq dis "8"))
((and (>= ang 45) (< ang 90)) (setq dis "5"))
((= ang 90) (setq dis "4"))
((and (> ang 90) (< ang 135)) (setq dis "3"))
((> ang 135) (setq dis "2"))
)  
(command "_.chamfer" "d" dis dis)
(command "_.chamfer" ss1 ss2)  
(princ)
)
(defun LM:GetInsideAngle ( p1 p2 p3 )
    (   (lambda ( a ) (min a (- (+ pi pi) a)))
        (rem (+ pi pi (- (angle p2 p1) (angle p2 p3))) (+ pi pi))
    )
)
(defun rtd ( r ) (* 180.0 (/ r pi)))
(defun	findPointByPick()
(if (<= (distance point (nth 0 pointlist1)) (distance point (nth 1 pointlist1))	)
(progn
(setq pointToDraw1 (list 0 (nth 0 pointlist1 )))
(setq pointToDraw2 (list 1 (nth 1 pointlist1 )))	
)
(progn		
(setq pointToDraw1 (list 1 (nth 1 pointlist1 )))
(setq pointToDraw2 (list 0 (nth 0 pointlist1 )))			
)			
)
)
(defun extract-vertex(entity )
(if	(= "LINE" (cdr (assoc 0 (setq elist(entget entity)))))
(list (cdr (assoc 10 elist)) (cdr (assoc 11 elist))	)
(progn
(if (= "LWPOLYLINE" (cdr (assoc 0 elist)))
(acet-geom-vertex-list entity)
(list)
)
)
)
)

 

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
1 giờ} trướ}c, tannguyen291 đã nói:

Góp ý chút điểm pick thì nên dùng (vlax-curve-getclosestpointto obj1 pt1) sẽ chính xác hơn.

@DungNguyen685 ngoài ra bạn dùng hàm lấy góc của ông thần LM cẩn thận góc của bạn trên 180d nhé. Thêm 1 lệnh (if (> ang 180) (setq ang (- 360 ang)) nữa là ngon

(if (> ang 180) (setq ang (- 360 ang)) )

MÌnh chưa hiểu ý này lắm nhỉ cái này mình lấy tại điểm góc làm p2

(defun LM:GetInsideAngle ( p1 p2 p3 )
    (   (lambda ( a ) (min a (- (+ pi pi) a)))
        (rem (+ pi pi (- (angle p2 p1) (angle p2 p3))) (+ pi pi))
    )
)

 

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
17 phút trước, DungNguyen685 đã nói:

(if (> ang 180) (setq ang (- 360 ang)) )

MÌnh chưa hiểu ý này lắm nhỉ cái này mình lấy tại điểm góc làm p2


(defun LM:GetInsideAngle ( p1 p2 p3 )
    (   (lambda ( a ) (min a (- (+ pi pi) a)))
        (rem (+ pi pi (- (angle p2 p1) (angle p2 p3))) (+ pi pi))
    )
)

 

Không sao đâu bạn, @tannguyen291nhầm. Hàm đó luôn lấy góc nhỏ hơn khi tính góc từ 3 điểm rồi.

image.png.02b8645e92cf3d44e3782d0bd8b23723.png

  • Like 2

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ực ra lisp này không hữu ích lắm. Chỉ dành cho việc chamfer nhà liền kề với đường giao thông nội bộ. các ô đất công cộng, cơ quan... đất khác áp dụng sẽ bị sai. Chưa kể các trục đường đô thị, đường khu vực khi áp dụng sẽ bị trả hồ sơ về kk. tốt nhất nên chamfer theo bán kính bó vỉa như thế này dễ nhất không ảnh hưởng đến luật nào.

image.png.67532135d68158a0c5daef364e78810a.png

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
8 giờ trước, tannguyen291 đã nói:

Thực ra lisp này không hữu ích lắm. Chỉ dành cho việc chamfer nhà liền kề với đường giao thông nội bộ. các ô đất công cộng, cơ quan... đất khác áp dụng sẽ bị sai. Chưa kể các trục đường đô thị, đường khu vực khi áp dụng sẽ bị trả hồ sơ về kk. tốt nhất nên chamfer theo bán kính bó vỉa như thế này dễ nhất không ảnh hưởng đến luật nào.

image.png.67532135d68158a0c5daef364e78810a.png

Em chuyên bên thiết kế đường bộ bác à. Thỉnh thoảng công ty nhận thêm quy hoạch khu dân cư nho nhỏ để làm thêm lúc đói kém thôi.

Cách vát vỉa hè thì tùy quan điểm của thẩm định mà có khi họ yêu cầu vát theo 2 cách:

+ Cách 1 là theo tiêu chuẩn nhà liền kề như bài đăng ở trên

+ Cách 2 bên em thường lấy vẽ đường xline (màu hồng) vuông góc với đường mép đường (màu xanh), đường xline này sẽ cắt đường mép vỉa hè (màu vàng). Từ đó vẽ đường thẳng nối 2 điểm cắt từ đừng xline và mép vỉa hè (như hình ảnh dưới)

Nếu được thì bác viết giúp em lisp vẽ cho cách 2 thì hay quá. kaka

image.thumb.png.195e8114d9a3f4c2c6b2bb98814a71fb.png

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

Để làm được theo bán kính cong cần tối thiểu 3 cú click chuột.

- trường hợp đường màu vàng là pline kín. Dễ thực hiện

- trường hợp đường màu vàng là 2 đường line(pline) riêng biệt, hoặc hỗn hợp. Phức tạp hơ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

@711a041092 nếu bạn muốn có thứ thật chất lượng thì inbox mình.

Lệnh chamfer theo bó vỉa.

 giphy.gif

Lệnh chamfer đường cong, giống 99% lệnh chamfer gốc (mình dùng thay thế luôn)

giphy.gif

Lệnh chamfer cho nút gt

giphy.gif

Lệnh fillfet

giphy.gif

 

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
2 giờ trước, tannguyen291 đã nói:

@711a041092 nếu bạn muốn có thứ thật chất lượng thì inbox mình.

Lệnh chamfer theo bó vỉa.

 giphy.gif

Lệnh chamfer đường cong, giống 99% lệnh chamfer gốc (mình dùng thay thế luôn)

giphy.gif

Lệnh chamfer cho nút gt

giphy.gif

Lệnh fillfet

giphy.gif

 

Anh laij thích trà sửa rồi! Kết cái lệnh FAR, anh có thể nói về nó 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
20 phút trước, limfx đã nói:

Anh laij thích trà sửa rồi! Kết cái lệnh FAR, anh có thể nói về nó tý

Cũng không có gì. Việc dùng entsel để tạo ra list ename point. Thì ssget cũng có thể cho ra danh sách như vậy. Cần có 1 hàm để quy các đoạn thằng, đoạn cong về phương trình toán học. Cứ 2 đường có cùng phương trình thì nối vào nhau. 2 đường song song thì nhóm vào 1 cụm. Sau đó dùng 1 công cụ giống như lệnh trim các khoảng ở giữa. Rồi đếm quy tắc 0 nhóm, 1 nhóm, 2 nhóm, 3 nhóm... để chia ra 2 phần từ fillet với nhau từng đôi một. mỗi nhóm đó có 1 phương thức fillet khác nhau. (cách đếm quy tắc này mình dùng chung cả car và far, nhiều nhất là 8 nhóm)

  • 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
12 phút trước, cuongtk2 đã nói:

Quy định về bán kính cua xe có phụ thuộc vào chiều rộng lòng đường không vậy ae.

  

Dạ không ạ. Nhưng lại tuỳ thuộc vào cấp đường. Đường nội bộ F - 8,, đường khu vức f-12, đường đô thị F-15 (còn đặt cấp đường thì do đồ án cấp trên quy định ), ví dụ như đường quốc lộ tính chất đặc biệt nhưng chưa chắc đã có chiều rộng lớn . Vì fillet có quy định rõ ràng còn chamfer thì không, nên lấy chamfer theo fillet là chuẩn nhất ạ.

  • Like 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
3 giờ trước, tannguyen291 đã nói:

Cũng không có gì. Việc dùng entsel để tạo ra list ename point. Thì ssget cũng có thể cho ra danh sách như vậy. Cần có 1 hàm để quy các đoạn thằng, đoạn cong về phương trình toán học. Cứ 2 đường có cùng phương trình thì nối vào nhau. 2 đường song song thì nhóm vào 1 cụm. Sau đó dùng 1 công cụ giống như lệnh trim các khoảng ở giữa. Rồi đếm quy tắc 0 nhóm, 1 nhóm, 2 nhóm, 3 nhóm... để chia ra 2 phần từ fillet với nhau từng đôi một. mỗi nhóm đó có 1 phương thức fillet khác nhau. (cách đếm quy tắc này mình dùng chung cả car và far, nhiều nhất là 8 nhóm)

Cảm ơn anh. Em tập làm một cái xem sao.

  • Like 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
58 phút trước, limfx đã nói:

Cảm ơn anh. Em tập làm một cái xem sao.

Cố lên bạn nhé. Đâu đó cỡ 600 dòng code thôi. :))

Mình viết xong cái này khả năng suy luận logic nó lạ lắm. If else liên tục. :)) bây giờ bảo sửa nó là chịu. K biết sửa kiểu gì luôn.

Mình không dùng lệnh (command ...) trong lisp nên hơi dài.

image.png.c8875cfff32b6d3ade662b4e7b2e8abf.png

 

  • 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  

×