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

lisp offset nhiều đối tượng

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

Chào các bác! Mong các bác chỉnh sửa hoặc giúp e lisp offset nhiều đối tượng với ạ.
- Có thể chọn nhiều đối tượng bao gồm cả Pline, circle,... 

- nhập dương thì offset ra ngoài, âm thì offset vào trong

- Sử dụng layer và màu theo layer hiện hành.

Em cảm ơn ạ, e có nhờ thằng GPT viết nhưng với pline nó không xác định được bên ngoài và bên trong.

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

không gửi được tệp nên e xin phép để lisp ở đây ạ

(defun c:OM ( / ss i obj dis actdoc curLay rad cen cenvar newRad before entnew sidept)
  (vl-load-com)
  (setq actdoc (vla-get-ActiveDocument (vlax-get-acad-object)))
  (setq curLay (getvar "clayer"))
  (setq ss (ssget '((0 . "LWPOLYLINE,CIRCLE"))))
  (if ss
    (progn
      (setq dis (getreal "\nNhập khoảng cách offset (âm = vào trong, dương = ra ngoài): "))
      (if dis
        (progn
          (setq i 0)
          (repeat (sslength ss)
            (setq obj (ssname ss i))
            (setq vobj (vlax-ename->vla-object obj))
            (setq before (entlast))

            (cond
              ;; --- Nếu là Polyline ---
              ((= (vla-get-ObjectName vobj) "AcDbPolyline")
               ;; điểm xác định hướng offset
               (setq sidept
                 (if (>= dis 0)
                   (polar (vlax-curve-getpointatparam vobj 0) pi (abs dis)) ; ra ngoài
                   (polar (vlax-curve-getpointatparam vobj 0) 0 (abs dis))  ; vào trong
                 )
               )
               (command "_.OFFSET" (abs dis) obj sidept "")
              )

              ;; --- Nếu là Circle ---
              ((= (vla-get-ObjectName vobj) "AcDbCircle")
               (setq cen (vlax-get vobj 'Center))
               (setq rad (vlax-get vobj 'Radius))
               (setq newRad (+ rad dis))
               (if (> newRad 0)
                 (progn
                   (setq cenvar (vlax-3d-point cen))
                   (setq newCircle (vla-addCircle (vla-get-ModelSpace actdoc) cenvar newRad))
                   (vla-put-Layer newCircle curLay)
                   (vla-put-Color newCircle acByLayer)
                 )
                 (prompt "\nBán kính mới không hợp lệ (<=0), bỏ qua.")
               )
              )
            )

            ;; đổi layer & màu đối tượng mới về layer hiện hành + ByLayer
            (setq entnew (entlast))
            (while (and entnew (/= entnew before))
              (setq ed (entget entnew))
              (setq ed (subst (cons 8 curLay) (assoc 8 ed) ed)) ; về layer hiện hành
              (setq ed (subst (cons 62 256) (assoc 62 ed) ed))   ; màu ByLayer
              (entmod ed)
              (setq entnew (entnext entnew))
            )

            (setq i (1+ i))
          )
        )
      )
    )
  )
  (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

@Htn02 offset trong/ngoài, trái/phải là do người vẽ và định nghĩa của cad. lisp sau là của @ketxu thì phải, mình sửa lại chút thôi

;======== OFFSET VE 2 PHIA ====================
(defun c:oo( / offlst #cayer)
  (or #d (setq #d 1))
  (setq #d (cond ((getdist (strcat "\nKhoang cach Offset < " (vl-princ-to-string #d) " > :")))(#d)))
  (princ "\n Chon doi tuong :")
  (if (ssget (list (cons 0 "Ellipse,Lwpolyline,Spline,Line,Xline,Circle,Arc,Pline")))
    (PROGN
      (vlax-for x (vla-get-activeselectionset(vla-get-activedocument(vlax-get-acad-object)))
	(vl-every '(lambda (d / o)
		     (if (not (vl-catch-all-error-p
				(setq o (vl-catch-all-apply 'vlax-invoke (list x 'Offset d)))
				)
			      )
		       (setq offlst (cons (car o) offlst))
		       )
		     )
		  ;(list #d (- #d))
		  (list #d )
		  )
	)
      (SETQ #cayer (getvar "clayer"))
      
      (mapcar '(lambda (x) (vla-put-layer x #cayer)
		 (vla-put-color x 256)
		 )
	      offlst)
      )
    )
  (PRINC)
  )

 

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

@Htn02 offset trong/ngoài, trái/phải là do người vẽ và định nghĩa của cad. lisp sau là của @ketxu thì phải, mình sửa lại chút thôi


;======== OFFSET VE 2 PHIA ====================
(defun c:oo( / offlst #cayer)
  (or #d (setq #d 1))
  (setq #d (cond ((getdist (strcat "\nKhoang cach Offset < " (vl-princ-to-string #d) " > :")))(#d)))
  (princ "\n Chon doi tuong :")
  (if (ssget (list (cons 0 "Ellipse,Lwpolyline,Spline,Line,Xline,Circle,Arc,Pline")))
    (PROGN
      (vlax-for x (vla-get-activeselectionset(vla-get-activedocument(vlax-get-acad-object)))
	(vl-every '(lambda (d / o)
		     (if (not (vl-catch-all-error-p
				(setq o (vl-catch-all-apply 'vlax-invoke (list x 'Offset d)))
				)
			      )
		       (setq offlst (cons (car o) offlst))
		       )
		     )
		  ;(list #d (- #d))
		  (list #d )
		  )
	)
      (SETQ #cayer (getvar "clayer"))
      
      (mapcar '(lambda (x) (vla-put-layer x #cayer)
		 (vla-put-color x 256)
		 )
	      offlst)
      )
    )
  (PRINC)
  )

 

B ơi, có vẻ lisp của bạn đối với pline nó bị ngược sao ấy. Nhập - thì nó offset ra ngoài nhập + nó lại offset vào trong

  • 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

@Htn02Bạn không đọc bài của tôi viết à "offset trong/ngoài, trái/phải là do người vẽ và định nghĩa của cad"

Bạn thử vẽ 2 pline (có thể khép kín) theo 2 chiều khác nhau rồi chạy lisp để thấy kết quả

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

@Htn02Bạn không đọc bài của tôi viết à "offset trong/ngoài, trái/phải là do người vẽ và định nghĩa của cad"

Bạn thử vẽ 2 pline (có thể khép kín) theo 2 chiều khác nhau rồi chạy lisp để thấy kết quả

Vấn đề của mình ở chỗ đó ý b, ko biết làm thế nào cho nó hiể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
Vào lúc 28/10/2025 tại 14:39, Htn02 đã nói:

Chào các bác! Mong các bác chỉnh sửa hoặc giúp e lisp offset nhiều đối tượng với ạ.
- Có thể chọn nhiều đối tượng bao gồm cả Pline, circle,... 

- nhập dương thì offset ra ngoài, âm thì offset vào trong

- Sử dụng layer và màu theo layer hiện hành.

Em cảm ơn ạ, e có nhờ thằng GPT viết nhưng với pline nó không xác định được bên ngoài và bên trong.

Bạn dùng thử lisp này, lisp nhận diện dấu âm và dương để offset ra ngoài hoặc vào trong.

Link download, tên lệnh vẫn là: oo

https://limewire.com/d/VMMvf#JH0rtyZ0N3

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

×