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

Set Uniformly Scale To Block

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

Chào mọi người,

 

Như tiêu đề tôi cần 1 giải pháp chuyển 1 block bất kỳ có scale x,y,z thành block có uniforn scale. 

Tôi biết là có thể bedit nó rồi điều chỉnh bên bảng properties, chọn "YES" cho uniformly scale. Nhưng trên bản vẽ có nhiều block nên việc điều chỉnh cho từng block như vậy sẽ mất nhiều thời gian.

Tôi đã tìm trên mạng thì được 1 cái lisp này của Ken Cooper nhưng khi chạy nó chả có tác dụng gì... không biết nó sai ở đâu

{code}
(defun C:BUS ; for Block to Uniform Scale
(/ blk sclX sclY sclZ)
(vl-load-com)
(setq
blk (vlax-ename->vla-object
(car (entsel "\nSelect Block to make of uniform scales: ")))
sclX (vlax-get blk 'XScaleFactor)
sclY (vlax-get blk 'YScaleFactor)
sclZ (vlax-get blk 'ZScaleFactor)
); end setq
(vlax-put blk 'YScaleFactor
(if (> (* sclX sclY) 0) sclX (- sclX)))
(vlax-put blk 'ZScaleFactor
(if (> (* sclX sclZ) 0) sclX (- sclX)))
(princ)
); end defun
{code}

--
Kent Cooper

 

Xin cảm ơ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

Sai ở chỗ nó sử dụng cho "Insert" (khối đã chèn vào bản vẽ), không phải cho "Block" (định nghĩa khối nằm trong dictionary). VD: bạn chèn vào bản vẽ cùng 1 block 10 lần sẽ được 10 insert.

Hàm trên chỉ chỉnh lại cho X=Y=Z cho 1 insert thôi.

Muốn chỉnh lại Block thành uniform thì bạn phải truy vấn vào block:

(setq *blocks* (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))))

(setq blkdef (vla-item *blocks* (cdr (assoc 2 (entget (car (entsel)))) )))

(vlax-put blkdef 'BlockScaling 1); 1 là uniform, 0 là non-uniform

  • 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

Đúng như Cuongtk2, vấn đề là Ken Cooper cũng đang nhầm lẫn. Cái này phải set ở cấp độ Block Definition(Object) chứ không phải ở cấp độ Insert (Entity)

 

Bạn thử lisp sau đây, mình đã test chạy trên máy mình, set toàn bộ các block trong bản vẽ.

 

(defun c:SetUniform ( / obj )

  (vlax-for obj (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
    (vla-put-blockscaling obj acUniform)
  )
  (princ)
)
 
(defun c:SetAny ( / obj )
  (vlax-for obj (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
    (vla-put-blockscaling obj acAny)
  )
  (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

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  

×