Đến nội dung


Hình ảnh
- - - - -

[yêu cầu] lisp scale dynamic block để áp dụng cho chuyển tỉ lệ bản vẽ


  • Please log in to reply
20 replies to this topic

#1 proconeng86

proconeng86

    biết lệnh break

  • Members
  • PipPipPipPip
  • 221 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 16 May 2014 - 10:18 AM

Công việc của mình đa phần vẽ trên model, khi phải chuyển 1 bản vẽ sang 1 tỉ lệ mới hay chuyển sang khung mới mất rất nhiều thời gian.

với các đối tượng là text hoặc dim thì chuyển rất nhanh rồi, không có vấn đề gì hết, riêng thằng dynamic block thì rất vất vả, nếu chọn tất cả và scale thì nó chạy lung tung mất, mình toàn phải scale từng thằng một nên mất khá nhiều thời gian

Do đó mình nhờ các bạn viết hộ mình 1 lisp để có thể scale dynamic block theo điểm gốc của từng cái, cụ thể lisp như sau:

 - đưa ra lựa chọn các dynamic block cần scale

 - tự động scale tất cả các dynamic block đã chọn heo điểm gốc của chúng

 - kết thúc lệnh

Mình xin chân thành cám ơn

 

 


  • 0

#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 16 May 2014 - 10:59 AM

Chắc là vậy?

; Doan Van Ha - CadViet.com - ngay 16/5/2014
; Chuc nang: Scale Dynamic Blocks at Center.
(defun C:HA (/ ss ent obj i)
 (vl-load-com)
 (if (not *tl*) (setq *tl* 1.0))
 (initget 6)
 (setq tl (getreal (strcat "\nHe so Scale <" (rtos *tl* 2) ">: ")))
 (if (not tl) (setq tl *tl*) (setq *tl* tl))
 (princ "\nChon cac Block can Scale...")
 (setq ss (ssget '((0 . "INSERT"))) i -1)
 (while (< (setq i (1+ i)) (sslength ss))
  (setq ent (ssname ss i))
  (if (and (eq (vla-get-IsDynamicBlock (vlax-ename->vla-object ent)) :vlax-true) (/= tl 1))
   (command "scale" ent "" (cdr (assoc 10 (entget ent))) tl))))
 


  • 3

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#3 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 16 May 2014 - 11:00 AM

Công việc của mình đa phần vẽ trên model, khi phải chuyển 1 bản vẽ sang 1 tỉ lệ mới hay chuyển sang khung mới mất rất nhiều thời gian.

với các đối tượng là text hoặc dim thì chuyển rất nhanh rồi, không có vấn đề gì hết, riêng thằng dynamic block thì rất vất vả, nếu chọn tất cả và scale thì nó chạy lung tung mất, mình toàn phải scale từng thằng một nên mất khá nhiều thời gian

Do đó mình nhờ các bạn viết hộ mình 1 lisp để có thể scale dynamic block theo điểm gốc của từng cái, cụ thể lisp như sau:

 - đưa ra lựa chọn các dynamic block cần scale

 - tự động scale tất cả các dynamic block đã chọn heo điểm gốc của chúng

 - kết thúc lệnh

Mình xin chân thành cám ơn

Hề hề hề,

Hãy gửi bản vẽ chứa các dynamic block cần scale lên và một bản vẽ thể hiện ví dụ kết quả bạn cần có.


  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#4 proconeng86

proconeng86

    biết lệnh break

  • Members
  • PipPipPipPip
  • 221 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 16 May 2014 - 11:35 AM

Chắc là vậy?

; Doan Van Ha - CadViet.com - ngay 16/5/2014
; Chuc nang: Scale Dynamic Blocks at Center.
(defun C:HA (/ ss ent obj i)
 (vl-load-com)
 (if (not *tl*) (setq *tl* 1.0))
 (initget 6)
 (setq tl (getreal (strcat "\nHe so Scale <" (rtos *tl* 2) ">: ")))
 (if (not tl) (setq tl *tl*) (setq *tl* tl))
 (princ "\nChon cac Block can Scale...")
 (setq ss (ssget '((0 . "INSERT"))) i -1)
 (while (< (setq i (1+ i)) (sslength ss))
  (setq ent (ssname ss i))
  (if (and (eq (vla-get-IsDynamicBlock (vlax-ename->vla-object ent)) :vlax-true) (/= tl 1))
   (command "scale" ent "" (cdr (assoc 10 (entget ent))) tl))))
 

 

Cám ơn bạn Ha nhiều lắm, lisp của bạn đúng ý mình rồi nhưng bạn xem lại hộ mình chút là điểm gốc lúc nó đổi lúc nó không đổi vị trí. mình muốn điểm gốc của nó không thay đổi vị trí

block của mình trong file đính kèm

http://www.cadviet.c...scale_khung.dwg


  • 0

#5 proconeng86

proconeng86

    biết lệnh break

  • Members
  • PipPipPipPip
  • 221 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 16 May 2014 - 11:37 AM

Hề hề hề,

Hãy gửi bản vẽ chứa các dynamic block cần scale lên và một bản vẽ thể hiện ví dụ kết quả bạn cần có.

 

mình gửi file ở comment trên rồi đó


  • 0

#6 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 16 May 2014 - 11:48 AM

Cám ơn bạn Ha nhiều lắm, lisp của bạn đúng ý mình rồi nhưng bạn xem lại hộ mình chút là điểm gốc lúc nó đổi lúc nó không đổi vị trí. mình muốn điểm gốc của nó không thay đổi vị trí

block của mình trong file đính kèm

http://www.cadviet.c...scale_khung.dwg

 

Sao bạn không tạo thêm action Scale cho block dynamic?


  • 1

#7 proconeng86

proconeng86

    biết lệnh break

  • Members
  • PipPipPipPip
  • 221 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 16 May 2014 - 12:08 PM

Sao bạn không tạo thêm action Scale cho block dynamic?

 

Tức ý bạn là khilaaop dynamic block thì cho thêm lựa chọn scale vào ah, như thế khi chuyển khung còn lâu hơn cả gõ lệnh scale bình thường đó.

Giả sử bản vẽ có 100 dynamic block, dùng lệnh scale thông thường làm đến 100 lần đã mệt rồi, chứ dùng lựa chọn scale trong dynamic block ,click chọn cho 100 dynamic block thì còn mệt hơn.

Do đó mới cần lisp scale theo điểm gốc của từng dynamic block

Lisp của bạn Ha mình thấy là tương đối ổn rồi, chỉ có chút lỗi là thi thoảng điểm gốc cứ bị chạy đi khỏi vị trí ban đầu, nếu là block tên dầm thì có thể châm trước được chứ block cốt cao độ thì lại phải move lại. Lisp đó chỉ cần sửa lại chút đó thôi là OK


Bài viết đã được chỉnh sửa nội dung bởi proconeng86: 16 May 2014 - 12:08 PM

  • 0

#8 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 16 May 2014 - 12:14 PM

Sorry bạn vì mình quên tắt osnap.

Bạn sửa dòng này:

(command "scale" ent "" (cdr (assoc 10 (entget ent))) tl))))

Thành:

(command "scale" ent "" "non" (cdr (assoc 10 (entget ent))) tl))))


  • 2

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#9 proconeng86

proconeng86

    biết lệnh break

  • Members
  • PipPipPipPip
  • 221 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 16 May 2014 - 02:09 PM

Sorry bạn vì mình quên tắt osnap.

Bạn sửa dòng này:

(command "scale" ent "" (cdr (assoc 10 (entget ent))) tl))))

Thành:

(command "scale" ent "" "non" (cdr (assoc 10 (entget ent))) tl))))

 

OK, lisp ngon rồi. có cái này khi chuyển khung sẽ nhẹ nhàng hơn nhiều rồi. cám ơn bạn Doan Van Ha nhiều nhé


  • 0

#10 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 16 May 2014 - 02:45 PM

- Với việc gán action scale vào thì : Dùng quickselect để chọn

Còn việc scale nó thì chỉ có 1 lần thôi. Đó và vào lệnh MO -> chỉnh mục custom 

 

- Có 1 điểm nữa, có thể bạn chưa biết đó là sử dụng lệnh scaletext để hiệu chỉnh chiều cao chữ của Attribute, Text, Mtext hàng loạt 


  • 0

#11 proconeng86

proconeng86

    biết lệnh break

  • Members
  • PipPipPipPip
  • 221 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 16 May 2014 - 03:20 PM

- Với việc gán action scale vào thì : Dùng quickselect để chọn

Còn việc scale nó thì chỉ có 1 lần thôi. Đó và vào lệnh MO -> chỉnh mục custom 

 

- Có 1 điểm nữa, có thể bạn chưa biết đó là sử dụng lệnh scaletext để hiệu chỉnh chiều cao chữ của Attribute, Text, Mtext hàng loạt 

 

lệnh scale text có thể chỉnh được hết chiều cao attribute nhưng block thì gồm nhiều hình nữa chứ có phải có mỗi attribbbute đâu, đơn cử như cái block cốt cao độ của mình, attribute đổi được chiều cao nhưng hình có đổi tỉ lệ được đâu, như vậy không đúng nữa

còn ý 1 của bạn, bạn nói cụ thể hơn được không, mình vẫn chưa biết gán scale 1 lần là sao


  • 0

#12 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 16 May 2014 - 03:32 PM

lệnh scale text có thể chỉnh được hết chiều cao attribute nhưng block thì gồm nhiều hình nữa chứ có phải có mỗi attribbbute đâu, đơn cử như cái block cốt cao độ của mình, attribute đổi được chiều cao nhưng hình có đổi tỉ lệ được đâu, như vậy không đúng nữa

còn ý 1 của bạn, bạn nói cụ thể hơn được không, mình vẫn chưa biết gán scale 1 lần là sao

 

1. Mình chỉ góp ý có lệnh Scaletext  để hiệu chỉnh hàng loạt chiều cao ATT, text, mtext

2.  Gửi bạn file này

- Bạn chọn block dynamic (có thể dùng Quick select chọn theo tên

- Bấm Ctrol+1 -> Vào Custom -> Chỉnh thông số SCALE

File : https://www.mediafir...2xoc9zkyod63jod


  • 1

#13 proconeng86

proconeng86

    biết lệnh break

  • Members
  • PipPipPipPip
  • 221 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 16 May 2014 - 04:19 PM

1. Mình chỉ góp ý có lệnh Scaletext  để hiệu chỉnh hàng loạt chiều cao ATT, text, mtext

2.  Gửi bạn file này

- Bạn chọn block dynamic (có thể dùng Quick select chọn theo tên

- Bấm Ctrol+1 -> Vào Custom -> Chỉnh thông số SCALE

File : https://www.mediafir...2xoc9zkyod63jod

 

Mình hiểu rồi, cách của bạn rất hay, giờ mình mới biết có cách đó, tuy có thể giải quyết tốt vấn đề của mình nhưng vẫn chậm hơn là dùng lisp

Nay mình học hỏi được rất nhiều. Cám ơn bạn nhiều nhé


  • 0

#14 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 17 May 2014 - 05:37 AM

Mình hiểu rồi, cách của bạn rất hay, giờ mình mới biết có cách đó, tuy có thể giải quyết tốt vấn đề của mình nhưng vẫn chậm hơn là dùng lisp

Nay mình học hỏi được rất nhiều. Cám ơn bạn nhiều nhé

 

Có thể chậm hơn trong cách chọn so với Lisp. Và nó cũng có tác dụng là scale 1 số thứ trong block, một số giữ nguyên (không scale) chẳng hạn...... Và cũng đừng quá lạm dụng vào Lisp!


  • 0

#15 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 17 May 2014 - 07:49 AM

Dù mình đã viết lisp này cho bạn và trong trường hợp của bạn thì dùng lisp có thể nhanh hơn. Tuy nhiên, mình vẫn đồng quan điểm với bác Tue_NV: cái gì có thể dùng cad thì nên dùng cad, đừng quá cậy vào lisp. Bởi lisp đôi khi là con dao 2 lưỡi, nó phụ thuộc vào người viết và người sử dụng nên rất có thể bị sai, trong khi cad thì chuẩn mực hơn nhiều.


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#16 proconeng86

proconeng86

    biết lệnh break

  • Members
  • PipPipPipPip
  • 221 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 17 May 2014 - 09:43 AM

Cám ơn các bạn đã góp ý, mỗi cái có ưu nhược điểm riêng, trong quá trình sử dụng thấy cái nào ưu việt hơn, áp dụng tốt hơn trong trường hợp nào thì mình dùng thôi,


  • 0

#17 proconeng86

proconeng86

    biết lệnh break

  • Members
  • PipPipPipPip
  • 221 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 13 August 2014 - 07:33 PM

Chắc là vậy?

; Doan Van Ha - CadViet.com - ngay 16/5/2014
; Chuc nang: Scale Dynamic Blocks at Center.
(defun C:HA (/ ss ent obj i)
 (vl-load-com)
 (if (not *tl*) (setq *tl* 1.0))
 (initget 6)
 (setq tl (getreal (strcat "\nHe so Scale <" (rtos *tl* 2) ">: ")))
 (if (not tl) (setq tl *tl*) (setq *tl* tl))
 (princ "\nChon cac Block can Scale...")
 (setq ss (ssget '((0 . "INSERT"))) i -1)
 (while (< (setq i (1+ i)) (sslength ss))
  (setq ent (ssname ss i))
  (if (and (eq (vla-get-IsDynamicBlock (vlax-ename->vla-object ent)) :vlax-true) (/= tl 1))
   (command "scale" ent "" (cdr (assoc 10 (entget ent))) tl))))
 

 

Bạn Ha ơi, bạn sửa cho mình lisp này chút được không, lisp này áp dụng được cho dynamic block là tốt rồi nhưng mình quên có vài block không phải là dynamic block mà chỉ là block thuộc tính thôi, nên không dùng được lisp này của bạn. bạn sửa giúp mình chút nhé

Mình cám ơn nhiều


  • 0

#18 proconeng86

proconeng86

    biết lệnh break

  • Members
  • PipPipPipPip
  • 221 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 15 August 2014 - 08:51 AM

Bạn Ha ơi, bạn sửa cho mình lisp này chút được không, lisp này áp dụng được cho dynamic block là tốt rồi nhưng mình quên có vài block không phải là dynamic block mà chỉ là block thuộc tính thôi, nên không dùng được lisp này của bạn. bạn sửa giúp mình chút nhé

Mình cám ơn nhiều

 

Chắc bạn Ha đang bận j rồi, có bạn nào giúp mình cái,Mình cám ơn nhiều


  • 0

#19 proconeng86

proconeng86

    biết lệnh break

  • Members
  • PipPipPipPip
  • 221 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 16 August 2014 - 10:28 PM

Chắc bạn Ha đang bận j rồi, có bạn nào giúp mình cái,Mình cám ơn nhiều

 

Không bạn nào giúp mình chút ah hic


  • 0

#20 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 16 August 2014 - 10:36 PM

Bạn sửa 2 dòng này:

(if (and (eq (vla-get-IsDynamicBlock (vlax-ename->vla-object ent)) :vlax-true) (/= tl 1))

(command "scale" ent "" (cdr (assoc 10 (entget ent))) tl))))

 

Thành 2 dòng này:

(if (/= tl 1)

(command "scale" ent "" "non" (cdr (assoc 10 (entget ent))) tl))))


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.