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

Nhờ viết Lisp Dim nhanh đường PLINE

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

 

Nhờ ae viết giúp 1 lisp Dim nhanh đường Pline bằng cách chọn đường Pline như hình mà lớp kích thước đặt cách đều đường Pline 1 đoạn bằng 1 tính từ trung điểm các đoạn thẳng, cong của đường PLine như file mẫu. Trân trọng cảm ơn!

DimPL.dwg

 

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
;; nguồn lấy từ cadviet.com
;; https://www.cadviet.com/forum/index.php?app=forums&module=forums&controller=topic&id=185294
;; sửa đổi bởi hungmanhcuong 24/5/2025
;; mục tiêu: dim line cách polyline 1.0 đơn vị
;; command: DIMPL
(defun c:dimpl (/ doc ep i mp obj oldosn pllst plset sp spc dimOffsetDist dimPoint tempPolyline)
  ;; Hàm tính tâm cung tròn (không thay đổi)
  (defun LM:BulgeCenter ( p1 p2 b )
    (polar p1
	   (+ (angle p1 p2) (- (/ pi 2) (* 2 (atan b))))
	   (/ (* (distance p1 p2) (1+ (* b b))) 4 b)    )  )

  (princ "\n<<< Chọn LwPolyline để ghi kích thước >>> ")
  (setq doc (vla-get-activedocument (vlax-get-acad-object))
        spc (vlax-get doc (if (eq (getvar 'CVPORT) 1)
			    'Paperspace
			    'Modelspace	    )	    )  )

  ;; Khoảng cách offset để đặt dim
  (setq dimOffsetDist 1.0) ;; Đặt khoảng cách bạn muốn ở đây (ví dụ: 1.0 đơn vị)

  (if (setq plSet (ssget '((0 . "LWPOLYLINE"))))
    (progn
      (setq pLlst (vl-remove-if 'listp (mapcar 'cadr (ssnamex plSet)))
	    oldOsn (getvar "OSMODE"))
      (setvar "OSMODE" 0)

      (foreach pl pLlst
	(setq obj (vlax-ename->vla-object pl)
	      i 0)

	(Repeat (fix (vlax-curve-getEndParam obj))
	  (setq sp (vlax-curve-getpointatparam obj i)
		ep (vlax-curve-getpointatparam obj (1+ i))
		mp (vlax-curve-getpointatparam obj (+ i 0.5))) ;; Điểm giữa đoạn PLINE

	  ;; Tính toán điểm đặt Dim Offset
	  (if (< (vla-GetBulge obj i) 0.0001) ;; Kiểm tra đoạn thẳng (bulge gần như 0)
	    (progn
	      ;; Đoạn thẳng: dùng vector pháp tuyến
	      (setq
	        segAngle (angle sp ep) ;; Góc của đoạn thẳng
	        normalAngle (+ segAngle (/ pi 2)) ;; Góc pháp tuyến (90 độ so với đoạn thẳng)
	        dimPoint (polar mp normalAngle dimOffsetDist) ;; Offset điểm giữa theo hướng pháp tuyến
	      )
	    )
	    (progn
	      ;; Đoạn cong (Arc): dùng tâm cung tròn để xác định hướng offset
	      (setq
	        arcCenter (LM:BulgeCenter sp ep (vla-GetBulge obj i))
	        ;; Offset điểm giữa đoạn cong ra xa tâm cung một khoảng nhất định
	        dimPoint (polar mp (angle arcCenter mp) dimOffsetDist)
	      )
	    )
	  )

	  ;; Ghi kích thước
	  (if (= 0 (vla-GetBulge obj i)) ;; Nếu là đoạn thẳng
	    (vla-AddDimAligned spc
	      (vlax-3d-point sp) (vlax-3d-point ep) (vlax-3d-point dimPoint)) ;; Sử dụng dimPoint đã offset
	    (vla-AddDimArc spc
	      (vlax-3d-point (LM:BulgeCenter sp ep (vla-GetBulge obj i)))
	      (vlax-3d-point sp) (vlax-3d-point ep) (vlax-3d-point dimPoint)) ;; Sử dụng dimPoint đã offset
	    );if
	  (setq i (1+ i))
	  ); Repeat
	); end foreach
      (setvar "OSMODE" oldOsn)
      ); end progn
    ); end if
  (princ)
  ); end of defun

 

  • 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

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

×