Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
danhyks

[Yêu Cầu] Code Lấy Danh Sách Layout Theo Thứ Tự Có Sẵn

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

danhyks    0

Dear all.

 

Mình hiện đang tìm hiểu câu lệnh autolisp để lấy thông tin tên của layout theo thứ tự có từ trước. Sau đó mình lập danh sách để chuyển đổi tên lại theo ý muốn.

 

Mọi người giúp mình cách nào sắp xếp lại theo hình minh họa nhé.

 

VD: 1 file gồm tên 1 danh sách layout         a,  b,  1,  2,  20,  21

khi  chọn lệnh (setq list (layoutlist))  --> kết quả trả về là ("1" "2" "20" "21" "a" "b")

Trong khi mình muốn chuyển đổi thành danh sách (a,  b,  1,  2,  20,  21)  theo thứ tự trước đó.

 

Thank all.

 

  2233.png

 

 

http://www.cadviet.com/upfiles/7/110167_sort_layout_name.dwg

 

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
gia_bach    1.442

Dùng thử lisp này : 

(defun c:doit ( / vlayouts layouts)
  (vlax-map-collection
    (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object)))
    '(lambda (x) (setq vlayouts (cons x vlayouts)))    )
  (setq vlayouts (cdr (vl-sort vlayouts
			       '(lambda (x y)
				  (< (vla-get-taborder x) (vla-get-taborder y))  )  ) ) )
  (setq layouts (mapcar '(lambda (x) (vla-get-name x)) vlayouts))    )

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
danhyks    0

Thank bạn  gia_bach nhé. Mình đã sử dụng và kết quả được như mong muốn, có điều bạn có thể giải thích giúp mình từ chỗ (setq vlayouts được không?

Đặc biệt mình sử dụng nhiều nhưng mình vẫn không hiểu được cấu trúc của lambda và mapcar trong Autolisp nữa.

 

Nhân tiện đây gởi mọi người code thay đổi tên layout theo cách như sau:

1. Chọn số thứ tự layout cần đổi tên.

2. Thêm tiền tố cho layout

3. Thêm số sau layout.

 

Ví dụ: bạn có 10 layout tên từ 1->10 bạn muốn đổi tên layout thành A-11, A-12 ---> A-20 thì bạn nhập lệnh "cln" "1", "A", "11".

 

Mình thấy trên diễn đàn cũng có 1 số lisp tương tự nên không biết có bị trùng không. 

;------------Change layout name-------------------
(defun c:cln (/ lst)

;^^^^^^^sorten theo danh sach------------
  
  (vlax-map-collection
    (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object)))
    '(lambda (x) (setq lst (cons x lst))))
;;  sort in tab order
  (setq lst (vl-sort lst '(lambda (x y)
                            (< (vla-get-taborder x) (vla-get-taborder y)))))
;;  make list of names into strings  remove Model space
  (setq lst (vl-remove "Model" (mapcar '(lambda (x)(vla-get-name x))lst)))
  (setq lt lst)
(setq n (length lt)
      i (getint "\nSo thu tu layout can doi ten: ")
      tt (getstring "\nTien to: ")
      i (- i 1)
      num (getint "\nHau to:")
      )
  
  (repeat n
    (setq layname (nth i lt)
	  i (1+ i)
	  numstr (itoa num)
	  fin (strcase (strcat tt "-" numstr))
	  num (1+ num)
	  )       ;;;;end setq
    (command "-layout" "re" layname fin)
    )
  ;;;;;;end of repeat
  (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
Black Roses    1

Cách đây không lâu có 1 bác share file dùng VBA thực hiện được chức năng như bạn yêu cầu, thao tác nhanh gọn lắm, bác tìm lại đi

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


×