Đến nội dung


Hình ảnh
- - - - -

[yêu cầu] Lisp đổi tên hàng loạt Layouts!


  • Please log in to reply
7 replies to this topic

#1 cangua172

cangua172

    biết vẽ line

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

Đã gửi 25 May 2013 - 09:55 AM

Mình xin mọi người chỉ cách nào để đổi tên hàng loạt các Layouts trong bản vẽ cad. Các Layouts sẽ được đổi tên thành 1,2,3,4,5.... Chứ ngồi rename từng Layout thì tốn thời gian quá. (không phân biệt Layout cũ hay layout mới tạo, tên các Layout trước đó là gì không quan tâm, các Layout sẽ được đổi tên thành 1,2,3... từ trái qua phải).. Hy vọng nhận ý kiến của mọi người!. :)


  • 0

#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 25 May 2013 - 10:30 AM

Lisp đổi tên tất cả layout thành các số nguyên từ 1 đến n.

 

;Doan Van Ha - CADViet.com - Ngay 25/5/2013
;Chuc nang: Thay doi ten tat ca layout, tu 1->2->3...n
(defun C:HA ( / i)
 (setq i 0)
 (vlax-for obj (vla-get-layouts (vla-get-ActiveDocument (vlax-get-acad-object)))
  (if (not (eq (vla-get-name obj) "Model")) (vla-put-name obj (itoa (setq i (1+ i)))))
  (vlax-release-object obj))
 (princ))

  • 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.


#3 cangua172

cangua172

    biết vẽ line

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

Đã gửi 25 May 2013 - 10:58 AM

Cảm ơn Anh Hà... nhưng em thấy vẫn còn có lỗi như sau:

1. Nếu như bản vẽ đã đổi tên layout thành 1,2,3,4... mà sau đó nếu xoá 1 layout bất kỳ ( ví dụ xoá Layout 3) sử dụng lisp thì báo lỗi "Layout Already exists" không thể đổi tên lại từ đầu.

2. Nếu mở một bản vẽ mới có 2 layout: Layout1, Layout2. Sau đó Copy 2 cái này thành Layout1, Layout2, Layout1(1), Layout2(1) thì sau khi đổi tên nó thành như thế này 1,3,2,4... không theo thứ tự từ trái qua phải.

Mong Anh xem lại. ( KHÔNG PHÂN BIỆT TÊN TRƯỚC ĐÓ LÀ GÌ, TÊN ĐƯỢC ĐỔI THEO THỨ TỰ TỪ TRÁI QUA PHẢI)... :(


  • 0

#4 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 25 May 2013 - 11:55 AM

Sửa lại 2 lỗi trên đây!

 

(defun C:HA(/ acdoc aclay actab i)
 (vl-load-com)
 (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object))
       actab (strcase (getvar 'CTAB)))
 (vlax-for l (vla-get-layouts acdoc)
  (if (not (eq actab (strcase (vla-get-name l))))
   (setq aclay (cons (cons (vla-get-name l) l) aclay))))
 (setq aclay (vl-sort aclay (function (lambda(a b) (< (vla-get-taborder (cdr a)) (vla-get-taborder (cdr b)))))))
 (setq i 100000000)
 (foreach n aclay
  (vla-put-name (cdr n) (itoa (setq i (1+ i))))
  (vlax-release-object (cdr n)))
 (setq aclay nil)
 (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object))
       actab (strcase (getvar 'CTAB)))
 (vlax-for l (vla-get-layouts acdoc)
  (if (not (eq actab (strcase (vla-get-name l))))
   (setq aclay (cons (cons (vla-get-name l) l) aclay))))
 (setq aclay (vl-sort aclay (function (lambda(a b) (< (vla-get-taborder (cdr a)) (vla-get-taborder (cdr b)))))))
 (setq i 0)
 (foreach n aclay
  (vla-put-name (cdr n) (itoa (setq i (1+ i))))
  (vlax-release-object (cdr n))))

  • 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.


#5 cangua172

cangua172

    biết vẽ line

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

Đã gửi 27 May 2013 - 08:05 AM

:) Cảm ơn Anh Hà!... chúc anh sức khoẻ. :)


  • 0

#6 duytrung12

duytrung12

    Chưa sử dụng CAD

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

Đã gửi 04 December 2014 - 12:51 AM

 cám ơn anh vi líp a da viet . vấn đề e dang vuong là sau khi  e doi ten lai toàn bộ bv  tren layout nhu líp a viet, e muon nhờ a phat trien thêm  , tao them tiền tố mới  cho layout , ví du nhu hình e đính kèm : laypout 1 , 2 , 3 , 4.... e muốn them ma code  bv hoang loat tren layout vi dụ  gen-01 , gen-02 , gen-03... theo cap so tiến thi e phai lam sao..!? nhờ a chỉ giup với em dang cần, cam ơn anh nhieui nhieu  


  • 0

#7 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 04 December 2014 - 08:39 AM

Lisp đổi tên tất cả layout thành các số nguyên từ 1 đến n và thêm tiền tố chung.

;Doan Van Ha - CADViet.com - Ngay 04/12/2014
;Chuc nang: Thay doi ten tat ca layouts va them tien to, tu: HA-1->HA--2->HA-3...HA-n
(defun C:HA2(/ acdoc aclay actab i)
 (vl-load-com)
 (setq tto (getstring "\nTien to chung cua cac layouts: ")) 
 (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object))
       actab (strcase (getvar 'CTAB)))
 (vlax-for l (vla-get-layouts acdoc)
  (if (not (eq actab (strcase (vla-get-name l))))
   (setq aclay (cons (cons (vla-get-name l) l) aclay))))
 (setq aclay (vl-sort aclay '(lambda(a b) (< (vla-get-taborder (cdr a)) (vla-get-taborder (cdr b))))))
 (setq i 100000000)
 (foreach n aclay
  (vla-put-name (cdr n) (itoa (setq i (1+ i))))
  (vlax-release-object (cdr n)))
 (setq aclay nil)
 (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object))
       actab (strcase (getvar 'CTAB)))
 (vlax-for l (vla-get-layouts acdoc)
  (if (not (eq actab (strcase (vla-get-name l))))
   (setq aclay (cons (cons (vla-get-name l) l) aclay))))
 (setq aclay (vl-sort aclay '(lambda(a b) (< (vla-get-taborder (cdr a)) (vla-get-taborder (cdr b))))))
 (setq i 0)
 (foreach n aclay
  (vla-put-name (cdr n) (strcat tto (itoa (setq i (1+ i)))))
  (vlax-release-object (cdr n)))
 (princ))
 
 

  • 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.


#8 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 04 December 2014 - 10:42 AM

Lisp đổi tên tất cả layout thành các số nguyên từ 1 đến n và thêm tiền tố chung.

 

;Doan Van Ha - CADViet.com - Ngay 04/12/2014
;Chuc nang: Thay doi ten tat ca layouts va them tien to, tu: HA-1->HA--2->HA-3...HA-n
(defun C:HA2(/ acdoc aclay actab i)
 (vl-load-com)
 (setq tto (getstring "\nTien to chung cua cac layouts: ")) 
 (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object))
       actab (strcase (getvar 'CTAB)))
 (vlax-for l (vla-get-layouts acdoc)
  (if (not (eq actab (strcase (vla-get-name l))))
   (setq aclay (cons (cons (vla-get-name l) l) aclay))))
 (setq aclay (vl-sort aclay '(lambda(a b) (< (vla-get-taborder (cdr a)) (vla-get-taborder (cdr b))))))
 (setq i 100000000)
 (foreach n aclay
  (vla-put-name (cdr n) (itoa (setq i (1+ i))))
  (vlax-release-object (cdr n)))
 (setq aclay nil)
 (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object))
       actab (strcase (getvar 'CTAB)))
 (vlax-for l (vla-get-layouts acdoc)
  (if (not (eq actab (strcase (vla-get-name l))))
   (setq aclay (cons (cons (vla-get-name l) l) aclay))))
 (setq aclay (vl-sort aclay '(lambda(a b) (< (vla-get-taborder (cdr a)) (vla-get-taborder (cdr b))))))
 (setq i 0)
 (foreach n aclay
  (vla-put-name (cdr n) (strcat tto (itoa (setq i (1+ i)))))
  (vlax-release-object (cdr n)))
 (princ))
 
 

Bác bổ sung thêm 1 số ràng buộc để Lisp chạy ngon hơn.

 1. Nhắc user chuyển qua Model trước khi gọi Lisp (bị lỗi khi đang ở Layout)

 2. Kiểm tra Tiền tố hợp lệ với SnValid (tránh t/h user nhập các kí tự đặc biệt )

 3. Hiếm có, nhưng vẫn có thể xảy ra t/hợp tồn tại 1 Layout có tên là số 1 trăm triệu lẻ ....


  • 0