Đến nội dung


Hình ảnh
- - - - -

Thay đổi entity ?


  • Please log in to reply
2 replies to this topic

#1 h2c

h2c

    biết vẽ ellipse

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

Đã gửi 26 March 2008 - 10:05 AM

Mình muốn đổi tên block bởi vì nếu chạy lệnh rename của cad thì khi chọn old name thì mình ko thể view được mặt mũi cái block mình cần đổi tên .
Mình viết lisp này để đổi tên nhưng sao nó lại không chạy , mong mọi người giúp đỡ

(defun c:CB()
(setq BL (entget (car (entsel "\nChon block :")))
ten (cdr(assoc 2 BL)))
(princ "\nTen block cu : ")(princ ten)
(setq
tenM (getstring "\nTen block moi :"))
(if (tblsearch "block" tenM) (alert "Ten nay da co trong danh sach block !")
(progn
(setq
BL (subst (cons 2 tenM) (assoc 2 BL) BL))
(entmod BL)
)
)
(princ)
)

Thanks mọi người .
  • 0

#2 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 26 March 2008 - 01:48 PM

Mình muốn đổi tên block bởi vì nếu chạy lệnh rename của cad thì khi chọn old name thì mình ko thể view được mặt mũi cái block mình cần đổi tên .
Mình viết lisp này để đổi tên nhưng sao nó lại không chạy , mong mọi người giúp đỡ

(defun c:CB()
(setq BL (entget (car (entsel "\nChon block :")))
ten (cdr(assoc 2 BL)))
(princ "\nTen block cu : ")(princ ten)
(setq
tenM (getstring "\nTen block moi :"))
(if (tblsearch "block" tenM) (alert "Ten nay da co trong danh sach block !")
(progn
(setq
BL (subst (cons 2 tenM) (assoc 2 BL) BL))
(entmod BL)

)
)
(princ)
)

Thanks mọi người .

Có 2 lỗi (đánh dấu đỏ):
1) Thiếu dấu cách
2) Không thể dùng entmod trong trường hợp này vì nó không phải là entity!
Bạn cần phân biệt rõ:
- Bản thân đối tượng mà bạn chọn (car (entsel)) là entity
- Cái mà bạn muốn thay đổi không phải entity mà thuộc Symbol Table Group
Diễn giải":
Khi bạn định nghĩa 1 block (Block Definition) có tên là "ABC", một Symbol Table "ABC" được tạo thành. Bạn có thể dùng lệnh Insert để tạo ra rất nhiều Entity (ví dụ E1, E2, E3, E4....) mang các đặc tính của "ABC". Xét về quan hệ, mỗi một "thằng" E vừa nói là con của "ABC" -> không thể đại diện cho "ABC" -> không thể dùng các function dạng ENTxxx để tác động đến "ABC" được.

Đơn giản bạn chỉ cần gọi command "Rename" là xong. Như đoạn dưới đây:


(defun c:CB( / BL ten OK tenM)
(setq
BL (entget (car (entsel "\nChon block :")))
ten (cdr (assoc 2 BL))
OK nil
)
(while (not OK)
(princ (strcat "\nTen block cu : " ten))
(setq tenM (getstring "\nTen block moi :"))
(if (tblsearch "block" tenM)
(alert "Ten block nay da co, yeu cau chon ten khac !")
(setq OK T)
)
)
(command "rename" "B" ten tenM)
(princ)
)


Đề nghị:
1) Thay vì if, bạn dùng while, buộc user nhập tenM đến khi thoả mãn yêu cầu. Đoạn trên dùng biến OK để kiểm tra, khi nào OK = T (true) mới cho phép chạy tiếp.
2) Thân thiện hơn, thay vì "đóng mặt lạnh", người ta đưa ra cái gì cũng lắc, nghiêm mặt phán "cái này không được", bạn hãy liệt kê toàn bộ BlockName đang có để người ta biết mà tránh. Cái này mình không làm, để dành lại cho bạn!
Gợi ý: tìm hiểu về hàm Tblnext
  • 1

#3 h2c

h2c

    biết vẽ ellipse

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

Đã gửi 26 March 2008 - 04:02 PM

Cám ơn ssg nhiều . Đặc thù cviệc của mình có đến hàng trăm block nên liệt kê ra cũng không cần thiết lắm , nếu có liệt kê ra thì người dùng cũng choáng , nhưng mình sẽ xem thêm theo gợi ý của ssg .
  • 0