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ị

Em hiện đang vẽ bản vẽ quy hoạch. Trong đó, có việc phải bo góc lô đất.

Yêu cầu cần là đo góc giữa 2 đường thẳng a và b.

Nếu góc này nhỏ hơn 45 độ thì chiều dài bo là 8m

        góc này từ 45 độ đến nhỏ hơn 90 độ thì chiều dài bo là 5m

        góc này bằng 90 độ thì chiều dài bo là 4m

        góc này lớn hơn 90 độ đến nhỏ hơn hoặc bằng 135 độ thì chiều dài bo là 3m

       góc này lớn hơn 135 độ thì chiều dài bo là 2m

Công việc này lặp lại và mất thời gian đo rồi so sánh góc. Vậy nên mong các bác có thể viết cho em 1 cái lisp để giải quyết công việc trên.

Cảm ơn các bác

Chúc các bác  tuần mới vui vẻ!

 

 

image.png.86fa2175bb423578a7ba93d038e87a3d.pngimage.png.c76b9dab7c0fb96fbf0ca6f58f1c57cc.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

Bạn làm quy hoạch ở đâu mà lạ vậy. Tiêu chuẩn 9411 này mình biết. Vì đây là tiêu chuẩn không phải Quy chuẩn nên hầu hết các địa phương đều bỏ qua và yêu cầu chamfer đồng nhất để tiện quản lý. Ví dụ fillet 8 thì chamfer 4. 12 - 6, 15- 8. Tuy nhiên nếu cần chính xác thì cần áp dụng công thức đặc biệt của phần thiết kế giao thông với  công thức S2=(V2+20)^2/100). Ngoài ra các nhà đầu tư cũng không thích làm góc vát lung tung để tránh gây ra nhiều mẫu công trình khác nhau.

image.png.22921bc2026bd48cbd467c38834a31c0.png

Bạn yêu cầu 1 lisp như trên khá phức tạp và có khi mấy hôm nữa có khi lại bỏ không dùng tớ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

Mục 11.3.4: Tầm nhìn trong nút . (Page 54 TCVN_4054_2005. Đường ô tô - Yêu cầu thiết kế).

V= 50km/h=13.8m/s -> S=70*70/100 = 49m.

Mất 49m /138 = 3.5s để đến điểm xung đột

V= 20km/h = 5.5m/s -> S= 40*40/100 =16m. 

Mất 16/5.5 = 2.9s để đến điểm xung đột

Chạy càng chậm càng nguy hiểm

  • Like 1
  • 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

Chung quy là người ta xin lisp vát góc, cái này trên mạng chắc cũng hơi hiếm đó bạn vì nó khá phức tạp, chưa nói đến theo đề bài của bạn phải vát theo góc chuyển hướng nữa.

Bạn nên mua lisp về quy hoạch của bác @tannguyen291, cái này mình giới thiệu thôi nhé chứ cũng ko có ăn đc tiền quảng cáo :))

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
21 phút trước, Duong Nhat Duy đã nói:

Chung quy là người ta xin lisp vát góc, cái này trên mạng chắc cũng hơi hiếm đó bạn vì nó khá phức tạp, chưa nói đến theo đề bài của bạn phải vát theo góc chuyển hướng nữa.

 Bạn nên mua lisp về quy hoạch của bác @tannguyen291, cái này mình giới thiệu thôi nhé chứ cũng ko có ăn đc tiền quảng cáo :))

à mình cũng không viết lisp chamfer kiểu này đâu ạ. :)) mình cũng làm quy hoạch. chưa bao giờ bị sở ban ngành yêu cầu chamfer kiểu này.

Trước mình có viết một lisp chamfer line arc. Giao diện giống 99% lệnh chamfer gốc của cad.

Nhưng nó loằng ngoằng vãi chầy ra, nhất là khoản tính xem chamfer về start hay end point theo chiều kích chuột. 

Giờ viết cái lisp này cũng dài kha khá. :))

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

Bài toán vạt góc cũng đơn giản thôi. Join ranh giới thành 1 pline khép kín. Theo góc của từng điểm mà vạt góc phù hợp rồi dimalign. Trước mình cũng viết 1 tool cho ai đó mà không biết để đâ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
10 phút trước, cuongtk2 đã nói:

Bài toán vạt góc cũng đơn giản thôi. Join ranh giới thành 1 pline khép kín. Theo góc của từng điểm mà vạt góc phù hợp rồi dimalign. Trước mình cũng viết 1 tool cho ai đó mà không biết để đâu. 

Để viết được cái chamfer giống chamfer của cad cần đâu đó cỡ 16 trường hợp mà bác. :)) 

image.png.7f6f8bc5a775c30c55fbc5e1c86bc29c.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

Đơn giản hoá mà viết thôi, nhiệm vụ cắt gọt tạo ranh giới đường đỏ là của người dùng. Mình chỉ chamfer cho ranh giới đó.

image.png.27be808eb6aae851afb37035e9bb7be5.png

  • 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:

Bạn làm quy hoạch ở đâu mà lạ vậy. Tiêu chuẩn 9411 này mình biết. Vì đây là tiêu chuẩn không phải Quy chuẩn nên hầu hết các địa phương đều bỏ qua và yêu cầu chamfer đồng nhất để tiện quản lý. Ví dụ fillet 8 thì chamfer 4. 12 - 6, 15- 8. Tuy nhiên nếu cần chính xác thì cần áp dụng công thức đặc biệt của phần thiết kế giao thông với  công thức S2=(V2+20)^2/100). Ngoài ra các nhà đầu tư cũng không thích làm góc vát lung tung để tránh gây ra nhiều mẫu công trình khác nhau.

image.png.22921bc2026bd48cbd467c38834a31c0.png

Bạn yêu cầu 1 lisp như trên khá phức tạp và có khi mấy hôm nữa có khi lại bỏ không dùng tới.

Em thấy tiêu chuẩn thiết kế đường thì công thức tầm nhìn không thấy xét đến yếu tố góc giao. (S=(V2+20)^2/100))
Hai lisp trên có nội dung khác nhau nên em không gộp trong một chủ đề, đang có nhu cầu gấp nên em đăng lên luô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
1 giờ trước, Duong Nhat Duy đã nói:

Chung quy là người ta xin lisp vát góc, cái này trên mạng chắc cũng hơi hiếm đó bạn vì nó khá phức tạp, chưa nói đến theo đề bài của bạn phải vát theo góc chuyển hướng nữa.

Bạn nên mua lisp về quy hoạch của bác @tannguyen291, cái này mình giới thiệu thôi nhé chứ cũng ko có ăn đc tiền quảng cáo :))

Vát góc theo yc như này có gì khó nhỉ còn mình ko chuyên Quy Hoạch nên ko rõ cái sâu bên trong còn bình thường tính góc tạo bởi so sánh  rồi dùng CHAMFER - D - 2 cạnh vát bằng nhau theo đk là đc thôi mà.

Yêu cầu cần là đo góc giữa 2 đường(đoạn) thẳng a và b.

Nếu góc này nhỏ hơn 45 độ thì chiều dài bo là 8m

        góc này từ 45 độ đến nhỏ hơn 90 độ thì chiều dài bo là 5m

        góc này bằng 90 độ thì chiều dài bo là 4m

        góc này lớn hơn 90 độ đến nhỏ hơn hoặc bằng 135 độ thì chiều dài bo là 3m

       góc này lớn hơn 135 độ thì chiều dài bo là 2m

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, cuongtk2 đã nói:

Đơn giản hoá mà viết thôi, nhiệm vụ cắt gọt tạo ranh giới đường đỏ là của người dùng. Mình chỉ chamfer cho ranh giới đó.

Bác vừa cho em 1 ý tưởng cực kỳ táo bạo. Lợi dụng lệnh fillet 0 để cắt gọt trước khi tính toán chamfer arc. Quả nhiên hiệu quả. Không cần mất 16 trường hợp kia nữa, chỉ còn có 4 trường hợp. Hahaha

23 phút trước, 711a041092 đã nói:

Em thấy tiêu chuẩn thiết kế đường thì công thức tầm nhìn không thấy xét đến yếu tố góc giao. (S=(V2+20)^2/100))
Hai lisp trên có nội dung khác nhau nên em không gộp trong một chủ đề, đang có nhu cầu gấp nên em đăng lên luôn.

Lệnh của bạn nếu chỉ là đường thằng chamfer thì khá đơn giản. Nếu đường thẳng và đường cong thì chắc sẽ cần trà sữa. :))

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

Bác vừa cho em 1 ý tưởng cực kỳ táo bạo. Lợi dụng lệnh fillet 0 để cắt gọt trước khi tính toán chamfer arc. Quả nhiên hiệu quả. Không cần mất 16 trường hợp kia nữa, chỉ còn có 4 trường hợp. Hahaha

Lệnh của bạn nếu chỉ là đường thằng chamfer thì khá đơn giản. Nếu đường thẳng và đường cong thì chắc sẽ cần trà sữa. :))

Đường thẳng thôi bác.

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

Dùng thử lisp mình viết xem sao. Ngoài ra mình có rất nhiều công cụ dành cho quy hoạch đó. Mời bạn tham khảo nhé.

ở đây nè. https://www.cadviet.com/forum/index.php?app=forums&module=forums&controller=topic&id=195662

(defun c:CDR (/ ent1 ent2 lst1 lst2 pt1 pt2 fle dis ange)
  (setq ent1 (entsel "Select 1th"))
  (redraw (car ent1) 3)
  (setq 
    ent2 (entsel "Select 2th")
    pt1 (list (caadr ent1) (cadadr ent1))
    pt2 (list (caadr ent2) (cadadr ent2))
    fle (getvar "filletrad")
  )
  (setvar "filletrad" 0) 
  (command-s "FILLET" pt1 pt2)
  (setq 
    ent1 (vlax-ename->vla-object (car ent1))
    lst1 (list (vlax-curve-getstartpoint ent1) (vlax-curve-getendpoint ent1))
    ent2 (vlax-ename->vla-object (car ent2))
    lst2 (list (vlax-curve-getstartpoint ent2) (vlax-curve-getendpoint ent2))
  )
  (if (vl-some
        '(lambda (x) 
          (vl-some 
            '(lambda (y) 
              (if (equal x y 1e-6)
                (setq 
                  lst1 (cons x (vl-remove x lst1))
                  lst2 (cons y (vl-remove y lst2))
                )
              )
            )
            lst2
          )
         )
        lst1
      )
    (progn
      (setq ange (* 180 (/ (abs (- (apply 'angle lst1) (apply 'angle lst2))) pi)))
	  (if (< 180 ange) (setq ange (- 360 ange))) ;; mình sửa 2 dòng này
      (cond
        ((< ange 45) (setq dis 8))
        ((< ange 80) (setq dis 5))
        ((< ange 100) (setq dis 4))
        ((< ange 135) (setq dis 3))
        (t (setq dis 2))
      )
      (if (equal (car lst1) (vlax-curve-getstartpoint ent1) 1e-6)
        (vla-put-StartPoint ent1 (vlax-3D-point (setq pt1 (polar (car lst1) (apply 'angle lst1) dis))))
        (vla-put-EndPoint ent1 (vlax-3D-point (setq pt1 (polar (car lst1) (apply 'angle lst1) dis))))
      )
      (if (equal (car lst2) (vlax-curve-getstartpoint ent2) 1e-6)
        (vla-put-StartPoint ent2 (vlax-3D-point (setq pt2 (polar (car lst2) (apply 'angle lst2) dis))))
        (vla-put-EndPoint ent2 (vlax-3D-point (setq pt2 (polar (car lst2) (apply 'angle lst2) dis))))
      )
      (entmake (list '(0 . "LINE") (cons 10 pt1) (cons 11 pt2)))
    )
  )
  (setvar "filletrad" fle)
  (princ)
)

 

  • Vote tăng 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
22 phút trước, tannguyen291 đã nói:

Dùng thử lisp mình viết xem sao. Ngoài ra mình có rất nhiều công cụ dành cho quy hoạch đó. Mời bạn tham khảo nhé.

ở đây nè. https://www.cadviet.com/forum/index.php?app=forums&module=forums&controller=topic&id=195662


(defun c:CDR (/ ent1 ent2 lst1 lst2 pt1 pt2 fle dis ange)
  (setq ent1 (entsel "Select 1th"))
  (redraw (car ent1) 3)
  (setq 
    ent2 (entsel "Select 2th")
    pt1 (list (caadr ent1) (cadadr ent1))
    pt2 (list (caadr ent2) (cadadr ent2))
    fle (getvar "filletrad")
  )
  (setvar "filletrad" 0) 
  (command-s "FILLET" pt1 pt2)
  (setq 
    ent1 (vlax-ename->vla-object (car ent1))
    lst1 (list (vlax-curve-getstartpoint ent1) (vlax-curve-getendpoint ent1))
    ent2 (vlax-ename->vla-object (car ent2))
    lst2 (list (vlax-curve-getstartpoint ent2) (vlax-curve-getendpoint ent2))
  )
  (if (vl-some
        '(lambda (x) 
          (vl-some 
            '(lambda (y) 
              (if (equal x y 1e-6)
                (setq 
                  lst1 (cons x (vl-remove x lst1))
                  lst2 (cons y (vl-remove y lst2))
                )
              )
            )
            lst2
          )
         )
        lst1
      )
    (progn
      (setq ange (rem (* 180 (/ (abs (- (apply 'angle lst1) (apply 'angle lst2))) pi)) 180))
      (cond
        ((< ange 45) (setq dis 8))
        ((< ange 80) (setq dis 5))
        ((< ange 100) (setq dis 4))
        ((< ange 135) (setq dis 3))
        (t (setq dis 2))
      )
      (if (equal (car lst1) (vlax-curve-getstartpoint ent1) 1e-6)
        (vla-put-StartPoint ent1 (vlax-3D-point (setq pt1 (polar (car lst1) (apply 'angle lst1) dis))))
        (vla-put-EndPoint ent1 (vlax-3D-point (setq pt1 (polar (car lst1) (apply 'angle lst1) dis))))
      )
      (if (equal (car lst2) (vlax-curve-getstartpoint ent2) 1e-6)
        (vla-put-StartPoint ent2 (vlax-3D-point (setq pt2 (polar (car lst2) (apply 'angle lst2) dis))))
        (vla-put-EndPoint ent2 (vlax-3D-point (setq pt2 (polar (car lst2) (apply 'angle lst2) dis))))
      )
      (entmake (list '(0 . "LINE") (cons 10 pt1) (cons 11 pt2)))
    )
  )
  (setvar "filletrad" fle)
  (princ)
)

 

Lisp hay quá. 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
16 giờ trước, tannguyen291 đã nói:

Dùng thử lisp mình viết xem sao. Ngoài ra mình có rất nhiều công cụ dành cho quy hoạch đó. Mời bạn tham khảo nhé.

ở đây nè. https://www.cadviet.com/forum/index.php?app=forums&module=forums&controller=topic&id=195662


(defun c:CDR (/ ent1 ent2 lst1 lst2 pt1 pt2 fle dis ange)
  (setq ent1 (entsel "Select 1th"))
  (redraw (car ent1) 3)
  (setq 
    ent2 (entsel "Select 2th")
    pt1 (list (caadr ent1) (cadadr ent1))
    pt2 (list (caadr ent2) (cadadr ent2))
    fle (getvar "filletrad")
  )
  (setvar "filletrad" 0) 
  (command-s "FILLET" pt1 pt2)
  (setq 
    ent1 (vlax-ename->vla-object (car ent1))
    lst1 (list (vlax-curve-getstartpoint ent1) (vlax-curve-getendpoint ent1))
    ent2 (vlax-ename->vla-object (car ent2))
    lst2 (list (vlax-curve-getstartpoint ent2) (vlax-curve-getendpoint ent2))
  )
  (if (vl-some
        '(lambda (x) 
          (vl-some 
            '(lambda (y) 
              (if (equal x y 1e-6)
                (setq 
                  lst1 (cons x (vl-remove x lst1))
                  lst2 (cons y (vl-remove y lst2))
                )
              )
            )
            lst2
          )
         )
        lst1
      )
    (progn
      (setq ange (* 180 (/ (abs (- (apply 'angle lst1) (apply 'angle lst2))) pi)))
	  (if (< 180 ange) (setq ange (- 360 ange))) ;; mình sửa 2 dòng này
      (cond
        ((< ange 45) (setq dis 8))
        ((< ange 80) (setq dis 5))
        ((< ange 100) (setq dis 4))
        ((< ange 135) (setq dis 3))
        (t (setq dis 2))
      )
      (if (equal (car lst1) (vlax-curve-getstartpoint ent1) 1e-6)
        (vla-put-StartPoint ent1 (vlax-3D-point (setq pt1 (polar (car lst1) (apply 'angle lst1) dis))))
        (vla-put-EndPoint ent1 (vlax-3D-point (setq pt1 (polar (car lst1) (apply 'angle lst1) dis))))
      )
      (if (equal (car lst2) (vlax-curve-getstartpoint ent2) 1e-6)
        (vla-put-StartPoint ent2 (vlax-3D-point (setq pt2 (polar (car lst2) (apply 'angle lst2) dis))))
        (vla-put-EndPoint ent2 (vlax-3D-point (setq pt2 (polar (car lst2) (apply 'angle lst2) dis))))
      )
      (entmake (list '(0 . "LINE") (cons 10 pt1) (cons 11 pt2)))
    )
  )
  (setvar "filletrad" fle)
  (princ)
)

 

Lisp  hay qúa anh, nhưng mà em chưa hiểu nội dung lắm

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

Lisp  hay qúa anh, nhưng mà em chưa hiểu nội dung lắm

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.

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

Sao mình không tận dụng lệnh chamfer a?

  

Không hiểu ???? nếu bạn hỏi cái command fillet kia thì

Mình dùng lệnh fillet vì có thể phát triển lisp thêm nữa. Dùng được với cả đường thẳng đường cong. 

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, limfx đã nói:

Ý em là:

(setvar "chamfera" d)
(setvar "chamferb" d)

(Command "_.chamfer" ent1 ent1 "")

Nó gọi hơn anh!

 

Chẳng sao cả. Nếu chương trình đã hoạt động tốt, đừng sửa nó.

Còn nếu mà pline hay arc thì lại cần trà sữa rồ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

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  

×