Đến nội dung


Hình ảnh
5 stars - based on 24598 reviews
- - - - -

Set Uniformly Scale To Block


  • Please log in to reply
3 replies to this topic

#1 colombus

colombus

    biết vẽ polygon

  • Members
  • PipPip
  • 71 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 22 May 2017 - 03:04 PM

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.


  • 0

#2 cuongtk2

cuongtk2

    biết lệnh copy

  • Members
  • PipPipPip
  • 116 Bài viết
Điểm đánh giá: 31 (tàm tạm)

Đã gửi 22 May 2017 - 04:19 PM

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


  • 1

#3 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4145 Bài viết
Điểm đánh giá: 4517 (đỉnh cao)

Đã gửi 22 May 2017 - 04:29 PM

Đú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)
)

  • 0

#4 colombus

colombus

    biết vẽ polygon

  • Members
  • PipPip
  • 71 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 22 May 2017 - 06:26 PM

Xin cảm ơn cuongtk2 và Nguyen Hoanh . Vấn đã trở nên rõ ràng sáng tỏ.
  • 0