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

Edit trực tiếp text Attribute trong block

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

Mình đọc diễn đàn thấy file này rất hay (theo đường dẫn) nhưng không tải được. Bạn nào có thì up lên lại để cho mình xin, rất cám ơn.

http://www.cadviet.com/upfiles/2/attribute...on_suite_v6.lsp

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
http://www.cadviet.com/sub/hupload.php?fok...n_suite_v10.lsp

đây mình mới dl và up lên cadviet cho mọi người dùng!

Cám ơn bạn rất nhiều. Nhưng vì sao hàm VLA-GET-MTEXTATTRIBUTE không có nhỉ? dù đã (vl-load-com)?

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

Lisp này của tác giả Lee McDonnell gồm 3 lệnh chính :

1 . Mvatt : Move ATT có cùng Tagname

 

2 . Roatt : Rotate ATT có cùng Tagname

 

3. Edatt : Edit ATT có cùng Tagname

Cái này hay quá bác ơi ! :)

Cho mình hỏi thêm tí, có cách nào để chỉnh chiều cao chữ hàng loạt mà không ảnh hưởng đến Content ATT của các Block không ? Vì khi dùng lệnh EdATT thì nó buộc phải thay đổi tất cả Content ATT của các Block về cùng 1 giá trị !?

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

Mong các bác chỉ giáo, mình dùng lisp của bác Tue (tác giả McDonnell), có bản vẽ mình chọn attribute của block thì thấy có cái dialog "attribute modification suite" hiện lên, nhưng có bản vẽ mình cũng chọn tương tự lại không hiện cái dialog đó ???

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

 

Trong block có sử dụng nhiều text attribute thì việc gõ ed để sửa nội dung hơi vất vả một chút.

Đây là đoạn code để edit trực tiếp vào các text attribute do ta chọn bằng cách pick chuột.

(defun c:edt () (while (setq att (car(nentsel "\nChon text Attribute :")))(if (= (dxf 0 att) "ATTRIB")(progn     (setq 	TagName (dxf 2 att)	TagVal (dxf 1 att)	BlName (dxf 330 att))     (if 	(setq NewVal (getstring 5 (strcat "\nNhap gia tri moi cho " TagName " <" TagVal "> : ")) )	(putAtt BlName TagName NewVal));if);progn);if);while(princ) );end;------------------------------------------------------------------------------------------(defun dxf(id ent) (cdr (assoc id (entget ent))));------------------------------------------------------------------------------------------(defun putAtt (BlName TagName NewVal / AttName EntDxf dk)(setq AttName (entnext BlName ) dk 1)  (while (and AttName dk)    (if (equal (assoc 0 (entget AttName )) '(0 . "SEQEND"))        (setq AttName nil )        (if (= (cdr (assoc 2 (entget AttName ))) TagName ) ; <-- Your Attribute name            (progn              (setq EntDxf (entget AttName ) dk nil)              (setq EntDxf (subst (cons 1 NewVal ) (assoc 1 (entget AttName )) EntDxf ) )              (entmod EntDxf )              (entupd BlName )              (setq AttName (entnext AttName ))            );progn        (setq AttName (entnext AttName ))        );if    );if          );while      );end
Tuy nhiên lisp này phải gõ nội dung cần thay đổi ở dòng command.

Giờ em muốn thực hiện việc này thông qua một hộp thoại. hộp thoại đó có 2 nút Cancel và OK.

Xin nhờ các huynh viết hộ cái này, em không có rành khoản này lắm.

Lisp sử dụng rất đơn giản và tiện. Nhưng có một điều là nếu như ta cùng sửa text ở >1 block khác nhau thì ta lại phải chọn từng cái một. Anh có thể sửa thêm chức năng nữa là cho chọn những text (định sửa có cùng giá trị) sau đó nhập vào khô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

Lisp sử dụng rất đơn giản và tiện. Nhưng có một điều là nếu như ta cùng sửa text ở >1 block khác nhau thì ta lại phải chọn từng cái một. Anh có thể sửa thêm chức năng nữa là cho chọn những text (định sửa có cùng giá trị) sau đó nhập vào không ạ? 

 

Chào bạn minhphuonghung!

Ý bạn là : Nếu định sửa text ATT 1 lần cùng giá trị thì cũng phải pick chọn từng cái rồi nhập giá trị thì các text ATT được pick đó thay đổi pk?

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

Chào bạn minhphuonghung!

Ý bạn là : Nếu định sửa text ATT 1 lần cùng giá trị thì cũng phải pick chọn từng cái rồi nhập giá trị thì các text ATT được pick đó thay đổi pk?

Chào bác Tue_NV!

Đúng ý em là như thế đấy ạ. Trong lisp edt thì chỉ cho chọn 1 text rồi sửa trực tiếp luôn. Thật ra, nó giống như cái lệnh EdATT trong attribute_modification_suite_v6.lsp ấy ạ. Nhưng EDATT lại có nhược điểm là chọn được các text cùng một lúc để đưa về cùng một giá trị, thay vì chuột phải thì chúng ta lại phải nhấn Enter, làm như vậy thành ra em thấy đang dùng chuột để Select thì lại phải dùng tay Enter một cái.

Nói chung, nhu cầu của em không phức tạp như lệnh EDATT chỉ cần như cái lệnh edt rồi thêm chức năng là select nhiều text để chuyển về cùng một giá trị thôi ạ.

Cảm ơn bác nhiều.

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
Vào lúc 8/10/2009 tại 18:06, master_worse đã nói:

 

bạn sử dụng thử lisp này xem

 


(defun C:EDITTEXT (/ DCLEDITTEXT CURCMD ATT OLDVAL TEXT EDITEXT.DCL FILE_DCL LL)
(setq *ERROR* (defun MY-ERR (MSG)
	(cond ((= MSG "Function cancelled") (princ "\t\tUser abort"))
	      (t (progn (princ MSG) (princ)))
	) ;_ end cond
	(setq *ERROR* NIL)
	(princ)
       ) ;_ defun
) ;_ end setq
(defun GET-GC (GROUP ENTITY) (cdr (assoc GROUP (entget ENTITY))))
(defun	PUT-GC (VALUE GROUP ENTITY / PROPERTIES)
 (setq PROPERTIES (entget ENTITY))
 (setq PROPERTIES (subst (cons GROUP VALUE) (assoc GROUP PROPERTIES) PROPERTIES))
 (entmod PROPERTIES)
) ;_ end defun
(vl-load-com)
(setq DCLEDITTEXT
      (list "EDIT: dialog {label = \"Edit text\";initial_focus = \"text\";"
     ":edit_box {label = \"Text:\"; allow_accept = true; edit_width = 60; key = \"text\";}"
     "spacer_1;"
     "ok_cancel;}"
      ) ;_ end list
) ;_ end setq
(setq CURCMD (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(while	(/= (setq ATT (car (nentselp "\nSelect Attribute for edit: "))) NIL)
 (if (or (= (GET-GC 0 ATT) "ATTRIB")
  (= (GET-GC 0 ATT) "TEXT")
  (= (GET-GC 0 ATT) "MTEXT")
  (= (GET-GC 0 ATT) "DIMENSION")
     ) ;_ end or
  (progn
   (setq OLDVAL (GET-GC 1 ATT))
   (setq EDITEXT.DCL (vl-filename-mktemp "EditText.dcl")
  FILE_DCL    (open EDITEXT.DCL "w")
   ) ;_ end setq
   (foreach LL DCLEDITTEXT (write-line LL FILE_DCL))
   (close FILE_DCL)
   (if	(> 0 (setq DCL_ID (load_dialog EDITEXT.DCL)))
    (progn (alert "not found file EditText.DCL") (exit))
   ) ;_ if
   (if	(not (new_dialog "EDIT" DCL_ID))
    (progn (alert "not found EDIT dialog") (exit))
   ) ;_ if
   (set_tile "text" OLDVAL)
   (action_tile "accept" "(setq TEXT (get_tile \"text\"))(done_dialog)")
   (action_tile "cancel" "(setq TEXT OLDVAL)")
   (start_dialog)
   (unload_dialog DCL_ID)
   (PUT-GC TEXT 1 ATT)
  ) ;_ end progn
  (princ "Select ATTRIB/TEXT/MTEXT/DIMENSION")
 ) ;_ end if
) ;_ end while
(setvar "CMDECHO" CURCMD)
(vl-file-delete EDITEXT.DCL)
(setq *ERROR* NIL)
(princ)
) ;_ end defun
 

 

 

sữa đựơc ATTRIB/TEXT/MTEXT/DIMENSION

 

-------------------

P/S:

Cái vụ tạo hộp thoại này em học trong file lisp vẽ đồ thị của tiều bối Nguyen Hoanh

Ai xem giúp em cái chữ ký

dạ anh ơi cho em hỏi tý ạ

lisp này mà muốn không hiện bảng

chỉnh trực tiếp như ed cho text thì đc không ạ

em cảm ơn anh

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
Vào lúc 8/11/2009 tại 21:35, Tue_NV đã nói:

Lang thang trên mạng, Tue_NV tìm được cái này rất hay, xin được chia sẻ và Lisp này cũng viết theo ý của Thaistreetz : (lệnh là edatt)

Lisp đây : http://www.cadviet.com/upfiles/2/attribute...on_suite_v6.lsp

Lisp này của tác giả Lee McDonnell gồm 3 lệnh chính :

1 . Mvatt : Move ATT có cùng Tagname

Ví dụ :

Command: mvatt

Select Attribute: Pick chọn ATT

Select Blocks or : -> chọn Block -> Các ATT cùng Tagname được chọn sẽ move. Nếu dòng này nhấn enter thì toàn bộ ATT cùng Tagname của toàn bộ Block chọn sẽ được move

Select Base Point: Điểm gốc Move

Specify Distance or Move Attributes... : -> có thể nhập Direct Distance hoặc pick điểm đích Move

 

2 . Roatt : Rotate ATT có cùng Tagname

 

3. Edatt : Edit ATT có cùng Tagname

Command: EDATT

Select Attribute: Pick chọn ATT

Select Blocks or : -> chọn Block -> Các ATT cùng Tagname được chọn sẽ edit. Nếu dòng này nhấn enter thì toàn bộ ATT cùng Tagname của toàn bộ Block chọn sẽ được edit -> sẽ hiện lên hộp thoại Edit Attribute -> để sửa. Hộp thoại này có 3 nút OK; Cancel và Advanced rất tiện dụng. Đặc biết là nút Advanced -> các bạn thử nhé

 

Quả thật anh em CADVIET mình còn phải học hỏi rất nhiều, rất nhiều các bạn ạ. Mình thấy code rất hay. :tongue2:

e nhờ các bác chỉnh giúp em cái Code MVATT cho ngắn gọn lại được không ạ. em chỉ cần move một ATT được chọn thôi. xin cảm ơn

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  

×