Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
11 replies to this topic

#1 trumlenmang

trumlenmang

    biết lệnh trim

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

Đã gửi 25 March 2014 - 09:56 AM

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

  • 0

#2 hiepttr

hiepttr

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1298 Bài viết
Điểm đánh giá: 518 (tốt)

Đã gửi 25 March 2014 - 10:23 AM

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 !


  • 1

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#3 trumlenmang

trumlenmang

    biết lệnh trim

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

Đã gửi 25 March 2014 - 10:38 AM

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.


  • 0

#4 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 25 March 2014 - 10:52 AM

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.


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

#5 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 25 March 2014 - 11:14 AM

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


  • 0

#6 trumlenmang

trumlenmang

    biết lệnh trim

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

Đã gửi 25 March 2014 - 11:58 AM

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.


  • 0

#7 conghoa

conghoa

    biết lệnh attdef

  • Members
  • PipPipPipPipPipPip
  • 411 Bài viết
Điểm đánh giá: 88 (tàm tạm)

Đã gửi 25 March 2014 - 12:08 PM

1969_nlay.gif

 

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


  • 1

#8 trumlenmang

trumlenmang

    biết lệnh trim

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

Đã gửi 25 March 2014 - 12:31 PM

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.


  • 0

#9 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 25 March 2014 - 01:03 PM

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

  • 1

#10 trumlenmang

trumlenmang

    biết lệnh trim

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

Đã gửi 25 March 2014 - 01:40 PM

Đạ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.


  • 1

#11 tân sinh viên năm nhất

tân sinh viên năm nhất

    Chưa sử dụng CAD

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

Đã gửi 24 December 2015 - 12:11 PM

1969_nlay.gif

 

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

cho em xin cái này với ạ


  • 0

#12 quangtb

quangtb

    biết zoom

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

Đã gửi 09 October 2016 - 02:13 AM

1969_nlay.gif

 

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

bác ơi ! cho e xin cái lisp này với 


  • 0