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

[Yêu Cầu]Lisp thay thế donut

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

Trên bản vẽ mình có 2 loại donut,loại 1 có đường kính 100,loại 2 đường kính 50,mỗi loại có số lượng rất nhiều.Nhờ các bác viết giùm lisp,khi đánh lệnh sẽ kêu chọn donut chuẩn sau đó chọn donut cần thay thế,khi chọn xong thì tất cả các donut cần thay thế sẽ bị xoá đi và thay vào đó là donut chuẩn và vẫn giữ nguyên tâm của của donut đã bị thay thế.Thanks.

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

Đây bạn.Mình ngại Entmod hoặc entmake, tốt nhất là copy.

(defun c:test (/ lstVar lstVal dump)
(setq lstVar '("osmode" "cmdecho")
  lstVal (mapcar 'getvar lstVar)
  dump (mapcar 'setvar lstVar '(0 0))
)
(defun ST:Ss->ListEnt (ss / n e l)
 (setq n (sslength ss))
 (while (setq e (ssname ss (setq n (1- n))))
   (setq l (cons e l))
 )  
)
(defun ST:Geom-Center (ent / p1 p2)
(vla-getboundingbox (vlax-ename->vla-object ent) 'p1 'p2)
(mapcar  '(lambda (a B) (* 0.5 (+ a B)))
(vlax-safearray->list p1) (vlax-safearray->list p2))
)
((lambda (ename ss / basePnt )
(setq basePnt (ST:Geom-Center ename))
(foreach en (ST:Ss->ListEnt ss)
	(command ".copy" ename "" basePnt (ST:Geom-Center en))
	(entdel en)
)
)
(car(entsel "\nDonut mau :"))(ssget))
(mapcar 'setvar lstVar lstVal)
)

  • 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

Câu đấy để bạn hiểu nguyên lý làm việc của lisp là copy donut mẫu vào vị trí các donut chọn, rồi xóa donut chọn, chứ không phải là tạo 1 donut mới tại vị trí các donut chọn, hoặc sửa lại bán kính ở các donut chọn :lol:

P/s : quên mất vừa nãy không lọc đối tượng cho bạn. Vì donut là 1 PLine đặc biệt nên có khi hơi hài hước nhỉ ^^

(defun c:test (/ lstVar lstVal dump)
(setq lstVar '("osmode" "cmdecho")
  lstVal (mapcar 'getvar lstVar)
  dump (mapcar 'setvar lstVar '(0 0))
)
(defun ST:Ss->ListEnt (ss / n e l)
 (setq n (sslength ss))
 (while (setq e (ssname ss (setq n (1- n))))
   (setq l (cons e l))
 )  
)
(defun ST:Geom-Center (ent / p1 p2)
(vla-getboundingbox (vlax-ename->vla-object ent) 'p1 'p2)
(mapcar  '(lambda (a B) (* 0.5 (+ a B)))
(vlax-safearray->list p1) (vlax-safearray->list p2))
)
((lambda (ename ss / basePnt )
(setq basePnt (ST:Geom-Center ename))
(foreach en (ST:Ss->ListEnt ss)
	(command ".copy" ename "" basePnt (ST:Geom-Center en))
	(entdel en)
)
)
(car(entsel "\nDonut mau :"))(ssget (list (cons 0 "LWPOLYLINE")(cons 90 2)(cons 70 1))))
(mapcar 'setvar lstVar lstVal)
)

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  

×