Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
h2c

Thay đổi entity ?

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

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 .

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

  • 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

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 .

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
Đăng nhập để thực hiện theo  

×