Chuyển đến nội dung
Diễn đàn CADViet
thuanledo

XIN GIÚP ĐỠ VỀ OFFSET POLYLINE DẠNG RECTANG

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

CHÀO CÁC ANH CHỊ, TÌNH HÌNH LÀ EM CÓ MỘT CÁI POLYLINE DẠNG RECTANG HOẶC 1 ĐA GIÁC NHIỀU ĐỈNH EM MUỐN OFFSET NÓ RA 500M THÌ CODE VBA AUTOCAD NHƯ THẾ NÀO

MONG CÁC ANH CHỊ GIÚP ĐỠ

HÌNH EM GỬI ĐÍNH KÈM BÊN DƯỚI Ạ.

 

RECTANG.png

DA GIAC.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
3 giờ trước, thuanledo đã nói:

CHÀO CÁC ANH CHỊ, TÌNH HÌNH LÀ EM CÓ MỘT CÁI POLYLINE DẠNG RECTANG HOẶC 1 ĐA GIÁC NHIỀU ĐỈNH EM MUỐN OFFSET NÓ RA 500M THÌ CODE VBA AUTOCAD NHƯ THẾ NÀO

MONG CÁC ANH CHỊ GIÚP ĐỠ

Offset 500 và -500 rồi so sánh 2 pline mới, thằng nào có diện tích (AREA) lớn hơn thì chọn, xóa thằng kia.

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

Offset 500 và -500 rồi so sánh 2 pline mới, thằng nào có diện tích (AREA) lớn hơn thì chọn, xóa thằng kia.

Một cách khác không phải so sánh diện tích rồi xoá đỡ tốn thời gian. Lisp này lấy trên nền lisp OFS của @tranducanh18 gửi ở trên

(vl-load-com)
(defun GetA (lst)
    (apply '+
           (mapcar '(lambda (a b) (- (* (car b) (cadr a)) (* (car a) (cadr b))))
                   lst
                   (cons (last lst) lst)
           )
    )
)
(defun c:ofs (/ ss lay lst obj bit #d #dold)
    (setq ActDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
    (vla-StartUndoMark ActDoc)
    (acet-sysvar-set '("cmdecho" 0 "osmode" 0))
    (setq #dold (getvar "offsetdist"))
    (cond ((setq ss (ssget '((0 . "CIRCLE,ELLIPSE,*POLYLINE,SPLINE"))))
           (if (null
                   (setq #d (getdist (strcat "\nOffsetdist <" (rtos #dold 2 2) ">")))
               )
               (setq #d #dold)
               (setvar "offsetdist" #d)
           )
           (foreach ent (acet-ss-to-list ss)
               (setq obj (vlax-ename->vla-object ent)
                     bit (GetA (acet-geom-vertex-list ent))
               )
               (if (vlax-method-applicable-p obj 'Offset)
                   (cond ((< bit 0) (vlax-invoke obj 'Offset #d))
                         ((> bit 0) (vlax-invoke obj 'Offset (- #d)))
                   )
               )
           )
          )
          (T (princ "\nNo thing to do"))
    )
    (acet-sysvar-restore)
    (vla-EndUndoMark ActDoc)
    (princ)
)

 

  • 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

Mình không rõ về VBA lắm nhưng quy trình cũng biết, offset 2 hướng được 2 cái pline. Có thể so sánh bằng Centroid to CurveClosedPoint, Area, hay tổng khoảng cách từ 1 điểm trên pline cũ đến toàn bộ điểm trên pline mới. Cái nào lớn hơn là ngoài.

  • 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ôi có cái tool bé xíu, viết cho mấy mục đích nho nhỏ, có phần chọn offset trong/ngoài đó, bác có thể tải về dùng thử ở đây.

 

51227660900_be39b73faf_z.jpg

 

 

  • 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 5/6/2021 tại 22:17, anhcos đã nói:

Tôi có cái tool bé xíu, viết cho mấy mục đích nho nhỏ, có phần chọn offset trong/ngoài đó, bác có thể tải về dùng thử ở đây.

 

51227660900_be39b73faf_z.jpg

 

 

Link bị dead rồi ạh, nhờ a update lại link mới với ạ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
Vào lúc 5/6/2021 tại 22:17, anhcos đã nói:

Tôi có cái tool bé xíu, viết cho mấy mục đích nho nhỏ, có phần chọn offset trong/ngoài đó, bác có thể tải về dùng thử ở đây.

 

51227660900_be39b73faf_z.jpg

 

 

Lại mượn giao diện của anh này. Cũng hàm hố viết thử vb.net xem thế nào, nhưng các anh cho hỏi sao đường polyline nó lại tạo kiểu này nhỉ

 

image.thumb.png.6d10fe9c7f792e2a3576ec4bd5c456ac.png

Với polyline có giá trị âm < 0 thì nó tạo kiểu này

image.png.b0ef77eb156a0ca903ade2fc9e65ec07.png

Còn nếu giá trị dương > 0 thì nó lại ra thế này 

image.png.70afb3a851a4dab7492426c123a538c8.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
Vào lúc 5/6/2021 tại 12:25, cuongtk2 đã nói:

Mình không rõ về VBA lắm nhưng quy trình cũng biết, offset 2 hướng được 2 cái pline. Có thể so sánh bằng Centroid to CurveClosedPoint, Area, hay tổng khoảng cách từ 1 điểm trên pline cũ đến toàn bộ điểm trên pline mới. Cái nào lớn hơn là ngoài.

Như đường pline thì làm cách nào xác định in or out để xóa cái out Anh? Thanks!

in out.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
13 phút trước, cuongtk2 đã nói:

Theo hướng của pline, offset + sẽ sang phải và ngược lại.

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

Như đường pline thì làm cách nào xác định in or out để xóa cái out Anh? Thanks!

Đường line, pline như bạn vẽ thì làm sao có trong với ngoài. Chỉ đơn giản là bạn muốn offset về hướng nào. 

Mình không muốn offset 2 lần rồi so sánh để chọn 1.  Mà dùng hàm Clockwise-p để so sánh từ trước sau đó mới offset.

Ví dụ: 3 điểm ABC theo chiều kim đồng hồ thì DISTANCE = - DISTANCE

Còn nếu pline kín thì xác định gần giống như vậy. 

muốn offset ra bên ngoài. Nếu pline các điểm theo chiều kim đồng hồ thì DISTANCE = - DISTANCE

image.png.0d08be6a66d6fbf630d8bbbf72608599.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

Clockwise-p chỉ đúng với toàn là chính nó thôi. Vì ít gặp nên mình không để ý. Nếu muốn lấy trong- ngoài thì nên so sánh Length.

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

Clockwise-p chỉ đúng với toàn là chính nó thôi. Vì ít gặp nên mình không để ý. Nếu muốn lấy trong- ngoài thì nên so sánh Length.

Em dùng clockwise-p chưa sai phát nào :)) bác dùng hàm nào ảo thế :))

Em hay dùng hàm này:

(defun LM:ListClockwise-p ( lst )
  (minusp 
    (apply '+ 
      (mapcar 
        '(lambda ( a b )
            (- (* (car b) (cadr a))(* (car a) (cadr b)))
         )
         lst (cons (last lst) 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
1 phút trước, tannguyen291 đã nói:

Em dùng clockwise-p chưa sai phát nào :)) bác dùng hàm nào ảo thế :))

Em hay dùng hàm này:


(defun LM:ListClockwise-p ( lst )
  (minusp 
    (apply '+ 
      (mapcar 
        '(lambda ( a b )
            (- (* (car b) (cadr a))(* (car a) (cadr b)))
         )
         lst (cons (last lst) lst)
      )
    )
  )
)

 

Đầu tiên em cho 3 điểm đi cùng chiều kim đồng hồ, sau đó cua ngược kim đồng hồ rồi close. Vậy 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
5 phút trước, cuongtk2 đã nói:

Đầu tiên em cho 3 điểm đi cùng chiều kim đồng hồ, sau đó cua ngược kim đồng hồ rồi close. Vậy thôi

Vẫn không thấy có gì sai ở đây. Bác gửi file nào bị sai em xem sao. Chứ k hiều ý bác 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
13 phút trước, tannguyen291 đã nói:

Em dùng clockwise-p chưa sai phát nào :)) bác dùng hàm nào ảo thế :))

Em hay dùng hàm này:


(defun LM:ListClockwise-p ( lst )
  (minusp 
    (apply '+ 
      (mapcar 
        '(lambda ( a b )
            (- (* (car b) (cadr a))(* (car a) (cadr b)))
         )
         lst (cons (last lst) lst)
      )
    )
  )
)

 

image.png.53cabb5189c08039e84d33def1c35635.pngĐầu tiên em cho 3 điểm đi cùng chiều kim đồng hồ, sau đó cua ngược kim đồng hồ rồi close. Vậy 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
7 phút trước, cuongtk2 đã nói:

image.png.53cabb5189c08039e84d33def1c35635.pngĐầu tiên em cho 3 điểm đi cùng chiều kim đồng hồ, sau đó cua ngược kim đồng hồ rồi close. Vậy thôi

  

Nếu các cạnh của pline không giao nhau thì luôn chuẩn ạ. Chứ với hình như của bác chỉ đơn thuần là nét vẽ trên máy không có tính áp dụng trong thực tế thiết kế. có thể thêm hàm check vào báo lỗi cho người dùng thì hợp lý 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

Hàm offset vào trong hoặc ra ngoài tôi viết sẵn. Ai cần thì dùng.

;----- Offset + (out) / - (in). Tra ve enttity. By HA
(defun Offset_dau(ent kc / obj obj1 obj2 dau)
 (setq obj (vlax-ename->vla-object ent) obj1 (car (vlax-invoke obj 'Offset 1E-3)) obj2 (car (vlax-invoke obj 'Offset -1E-3)) dau (if (> (vla-get-Area obj1)(vla-get-Area obj2)) + -))
 (mapcar 'vla-delete (list  obj1 obj2))
 (vlax-vla-object->ename (car (vlax-invoke obj 'Offset (dau kc)))))

  • 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ới trường hợp không giao cũng vậy thôi em. Còn có áp dụng trong thực tế hay không thì dính đòn mới biết nó là có thật.

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

Với trường hợp không giao cũng vậy thôi em. Còn có áp dụng trong thực tế hay không thì dính đòn mới biết nó là có thật.

image.png

theo hình của bác là cùng chiều kim đồng hồ đúng rồi mà bác. :)) có gì sai đâu. bác thử thêm hàm offset xem có sai chỗ nào. :))

Cùng chiều thì offset - ngược chiều thì offset + bác 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

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

×