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

Thay đổi entity ?

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

h2c    1

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
ssg    1.088
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
h2c    1

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  

×