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

Giúp hoàn thiện lisp đổi tên layout.

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

Em mới tìm một đoạn code lisp, em muốn chỉnh sửa để theo ý nhưng không được kết quả, các bác giúp em với. Em bị vấp ở đoạn code bên dưới nên lisp không chạy ra kết quả là đổi tên layout bằng text được chọn ở vùng quét:

(setq ENT1 (ssget "_C" PE1 PE2))

(command "layout" "r" "" ENT1)


(DEFUN C:MRLayout (/ PE1 PE2 ENT1 OCM c LLOUT)

(SETQ OCM (GETVAR "CMDECHO"))(SETVAR "CMDECHO" 0)

(Prompt "Select Objects text: ")

(setq PE1 (GETPOINT "\nGoc tren ben trai :") PE2 (GETCORNER PE1 "\nGoc duoi ben phai :"))

(SETQ c (getint "\nThe number of layout to issued :"))

(SETQ LLOUT (LENGTH (LAYOUTLIST)))

(WHILE (< c LLOUT)

(COMMAND "LAYOUT" "SET" (NTH c (LAYOUTLIST)))

(setq ENT1 (ssget "_C" PE1 PE2))

(command "layout" "r" "" ENT1)

(COMMAND "_.ZOOM" "E" "_.ZOOM" "0.95X" )

(SETQ c(1+ c)))

(IF (= c LLOUT)(COMMAND "LAYOUT" "SET" (NTH 0 (LAYOUTLIST))))

(SETVAR "CMDECHO" OCM)(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

những dòng khác mình ko quan tâm :D :D :D

bạn đổi tên layout bằng một tập ss nên ko đc là đúng rồi

nếu

 

(setq ENT1 (cdr (assoc 1 (entget (car (entsel "\n Pick chon text: "))))))

thì đổi đc, nhưng mình thấy đoạn code khá lủng củng ...

Chúc bạn "nghiên cứu" tốt !

  • 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

những dòng khác mình ko quan tâm :D :D :D

bạn đổi tên layout bằng một tập ss nên ko đc là đúng rồi

nếu

 

(setq ENT1 (cdr (assoc 1 (entget (car (entsel "\n Pick chon text: "))))))

 

thì đổi đc, nhưng mình thấy đoạn code khá lủng củng ...

Chúc bạn "nghiên cứu" tốt !

Cảm ơn bác, đoạn code của bác em làm được ở 1 layout rồi. Nhưng ý em muốn làm tất các các layout có trong bản vẽ bắt đầu từ layout mình chọn, và ở các layout khác sẽ copy text nằm trong vùng em chọn 2 tọa độ PE1 và PE2. Em chọn một lần và đổi tên cho các layout còn lại theo text ở vị trí PE1 và PE2.

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

Cảm ơn bác, đoạn code của bác em làm được ở 1 layout rồi. Nhưng ý em muốn làm tất các các layout có trong bản vẽ bắt đầu từ layout mình chọn, và ở các layout khác sẽ copy text nằm trong vùng em chọn 2 tọa độ PE1 và PE2. Em chọn một lần và đổi tên cho các layout còn lại theo text ở vị trí PE1 và PE2.

Hề hề hề,

Nếu muốn vậy, bạn cần tạo một vòng lặp qua tất cả các text có trong vùng chọn của bạn để lấy ra một danh sách các giá trị text trong đó. Sắp xếp lại danh sách này tương ứng với danh sách các layout cần đổi tên. Sau đó thực hiện lệnh rename đối với từng cặp giá trị trong hai list này. bạn có thể dùng hàm mapcar để làm việc này với điều kiện hai list có số phần tử là bằng nhau.

Chúc thành công.

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

Cảm ơn bác, đoạn code của bác em làm được ở 1 layout rồi. Nhưng ý em muốn làm tất các các layout có trong bản vẽ bắt đầu từ layout mình chọn, và ở các layout khác sẽ copy text nằm trong vùng em chọn 2 tọa độ PE1 và PE2. Em chọn một lần và đổi tên cho các layout còn lại theo text ở vị trí PE1 và PE2.

@ "ông trùm" : Cho tới Cad2014 thì Lisp chưa có hàm nào trả về danh sách các Layout được chọn.

15454_layoutlst.jpg

VD trong hình : Lisp không có hàm nào để lấy danh sách các layout : Model, Layout2, Layout4

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

Em dốt lisp nên chỉ biết một vài hàm đơn giản thôi: Ý bác phamthanhbinh em hiểu nhưng không biết làm thế nào.

Còn với bác gia_bach thì em xin nêu ý đồ của em như vầy có thể bác giúp được em:

(SETQ LLOUT (LENGTH (LAYOUTLIST)));;;;Dùng để đếm số layout

(WHILE (< c LLOUT) ;;;; Nếu c nhỏ hơn số layout thì tiếp tục lặp (c là số thứ tự layout)

(COMMAND "LAYOUT" "SET" (NTH c (LAYOUTLIST))) ;;;; đưa layout c thành layout hiện hành

(setq ENT1 (ssget "_C" PE1 PE2)) ;;;chọn text nằm trong khung của hai điểm chọn trước PE1 và PE2

(command "layout" "r" "" ENT1) ;;;; Đổi tên layout bằng text nằm trong khung chọn

Em bị vướng ở dòng cuối cùng, bác giúp em chuyển cái đối tượng ENT1 thành text để dòng đổi tên layout hiểu được.

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

1969_nlay.gif

 

Cái này có phải cái bạn định làm?

Mình muốn làm nhiều layout chứ không phải 1. và chỉ một lần chọn vị trí text ô tên bản vẽ thôi. tất cả các layout còn lại cũng sẽ lấy text đúng vị trí đó để đặt tên cho layout.

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

Đại loại nó là thế này (???):

(defun c:mrlayout (/ i laylst pe1 pe2 ss txt)
  (setq pe1 (getpoint "\ngoc tren ben trai :")
	pe2 (getcorner pe1 "\ngoc duoi ben phai :")
	i 0 layLst (layoutlist) )
  (while (< i (length layLst))
    (command "layout" "set" (nth i layLst))
    (if (setq ss (ssget "_c" pe1 pe2 (list(cons 0 "text"))))
      (progn
	(setq txt (cdr (assoc 1 (entget (ssname ss 0)))))
	(if (snvalid txt)
	  (command "layout" "r" "" txt)  )) )
    (setq i(1+ i)))
  (princ))
  • 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

Đại loại nó là thế này (???):

(defun c:mrlayout (/ i laylst pe1 pe2 ss txt)
  (setq pe1 (getpoint "\ngoc tren ben trai :")
	pe2 (getcorner pe1 "\ngoc duoi ben phai :")
	i 0 layLst (layoutlist) )
  (while (< i (length layLst))
    (command "layout" "set" (nth i layLst))
    (if (setq ss (ssget "_c" pe1 pe2 (list(cons 0 "text"))))
      (progn
	(setq txt (cdr (assoc 1 (entget (ssname ss 0)))))
	(if (snvalid txt)
	  (command "layout" "r" "" txt)  )) )
    (setq i(1+ i)))
  (princ))

Cảm ơn bác, đúng ý em rồi. Thế này đổi tên vài chục bản vẽ sẽ nhanh hơn nhiều.

  • 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

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


×