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ị

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.

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 em viết để edit trực tiếp vào các text attribute do ta chọn bằng cách pick chuột.

 

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ý

  • Like 1
  • 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
bạn sử dụng thử lisp này xem

....

 

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ý

Tuyệt quá, lisp của bạn còn hơn cả những gì mình mong đợi. cái này dùng để sửa khung tên block thì tuyệt vời. Cảm ơn bạn rất nhiều.

PS: mình edit xong thì nội dung text chưa đổi ngay mà fải Regen bản vẽ một lần. master_worse nên thêm lệnh này vào lisp thì sẽ trực quan hơn.

  • 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
PS: mình edit xong thì nội dung text chưa đổi ngay mà fải Regen bản vẽ một lần. master_worse nên thêm lệnh này vào lisp thì sẽ trực quan hơn.

cái này mình cũng bị vậy nhưng hình như chỉ bị với các font không phải .shx thôi hay sao ấy.

mình đã sử dụng hàm entupd nhưng không được.

Còn nếu thêm lệnh regen mỗi lần ok màn hình lại chớp một cái.

bạn có cách nào không??

  • 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ái này mình cũng bị vậy nhưng hình như chỉ bị với các font không phải .shx thôi hay sao ấy.

mình đã sử dụng hàm entupd nhưng không được.

Còn nếu thêm lệnh regen mỗi lần ok màn hình lại chớp một cái.

bạn có cách nào không??

Mình mò mẫm cả tối qua mà cũng chưa có cách nào khắc phục được. Dù sao thì hiện tượng này cũng chỉ sảy ra với text - là đối tượng rất ít khi phải edit trong block. Còn với Attribute - đối tượng thường xuyên phải edit thì không vấn đề gì cả. Bạn nói đúng, không nên đưa lệnh regen vào, bản vẽ nặng một chút là chờ cổ dài bằng hươu luôn :bigsmile:

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 mò mẫm cả tối qua mà cũng chưa có cách nào khắc phục được. Dù sao thì hiện tượng này cũng chỉ sảy ra với text - là đối tượng rất ít khi phải edit trong block. Còn với Attribute - đối tượng thường xuyên phải edit thì không vấn đề gì cả. Bạn nói đúng, không nên đưa lệnh regen vào, bản vẽ nặng một chút là chờ cổ dài bằng hươu luôn :bigsmile:

Các bạn thêm 1 đoạn mã này ở sau dòng (PUT-GC TEXT 1 ATT) xem:

(vla-Regen (vla-get-ActiveDocument (vlax-get-acad-object)) acActiveViewport)

  • 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

Vẫn thế anh Thiệp ạ. dòng lệnh trên vẫn phải thực hiện một bước Regen bản vẽ. Việc Regen bản vẽ, nếu bản vẽ nhẹ một chút thì không cảm thấy khó chịu vì thời gian chờ đợi, tuy nhiên bản vẽ nặng thì đó là cả một vấn đề,

Em đang dùng lisp này để điền tên bản vẽ vào khung tên (Khung tên bản vẽ của em là block). khi số lượng bản vẽ lên đến vài chục bản thì thời gian chờ này thực sự là mệt mỏi.

Với lisp của bạn master_worse em nghĩ thế cũng ổn rồi, vì các text trong block khung tên là cố định cho tất cả bản vẽ, ta chỉ cần sửa 1 lần. chỉ có các attribute (tên bản vẽ, ty lệ, ký hiệu...) là khác nhau với mỗi một bản vẽ. đối tượng này thì không bị hiện tượng trên, nên việc Regen sau mỗi lần edit attribute là không cần thiết.

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.

 

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.

 

Cái này chỉ cần dùng 1 lệnh eattedit (hoặc kích double vào block) là đủ? Sao lại phải dùng Lisp?

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
- Bản vẽ A có một Text (gọi là nguồn)

- Bản vẽ B, C ... có rất nhiều text (gọi là đích) có các nội dung không giống nhau

- Sau khi thực hiện lệnh [chọn đối tượng nguồn >enter> chọn các đối tựong đích >enter> ]thì các đối tượng đích sẽ có nội dung của đối tượng nguồn.

(giống lệnh lisp match text trên diễn đàn nhưng cho dùng tổ hợp phím CTRL+Tab để chọn đối tượng trên bản vẽ khác)

Các tiền bối giúp em được không

Có một cách cho bạn. Đó là Bạn mở file cần sửa đổi text. Sau đó Xattach file có text nguồn vào bản vẽ đó. Bạn dùng hàm entsel thì nó sẽ nhận cho bạn cả text ở trong bản vẽ tham khảo ngoài. Mình hay làm cách này trong các công trình quy hoạch hạ tầng. Không biết như thế có đỡ cho bạn tý nào không

  • 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
Vẫn thế anh Thiệp ạ. dòng lệnh trên vẫn phải thực hiện một bước Regen bản vẽ. Việc Regen bản vẽ, nếu bản vẽ nhẹ một chút thì không cảm thấy khó chịu vì thời gian chờ đợi, tuy nhiên bản vẽ nặng thì đó là cả một vấn đề,

Em đang dùng lisp này để điền tên bản vẽ vào khung tên (Khung tên bản vẽ của em là block). khi số lượng bản vẽ lên đến vài chục bản thì thời gian chờ này thực sự là mệt mỏi.

Với lisp của bạn master_worse em nghĩ thế cũng ổn rồi, vì các text trong block khung tên là cố định cho tất cả bản vẽ, ta chỉ cần sửa 1 lần. chỉ có các attribute (tên bản vẽ, ty lệ, ký hiệu...) là khác nhau với mỗi một bản vẽ. đối tượng này thì không bị hiện tượng trên, nên việc Regen sau mỗi lần edit attribute là không cần thiết.

Thiep có 1 ý tưởng như thế này: Bản vẽ chèn block có nhiều thuộc tính: ví dụ: TENBANVE, NGUOIVE, NGUOIKIEMTRA, GIAMDOC, SOBANVE,... Các số liệu thuộc tính này của từng bản vẽ được lưu và đã hoàn thịện trước ở trong 1 file excel chuyển qua đuôi *.csv; các cột thuộc tính được sắp xếp đúng trình tự trước sau của các thuộc tính có trong block. ví dụ như sau:

http://www.cadviet.com/upfiles/2/dulieu_khungten.rar

Tạo lisp để tải file dữ liệu *.csv, pick lần lượt từng block 1, các dữ liệu từng hàng 1 từ trên xuống dưới trong file *.csv sẽ nhảy vào các thuộc tính trong block và tự động update ngay không cần phải regen.

.... không biết ý tưởng này có hay không? mời các bạn cùng Thiep tham gia viết lisp nhé.

  • 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
Thiep có 1 ý tưởng như thế này: Bản vẽ chèn block có nhiều thuộc tính: ví dụ: TENBANVE, NGUOIVE, NGUOIKIEMTRA, GIAMDOC, SOBANVE,... Các số liệu thuộc tính này của từng bản vẽ được lưu và đã hoàn thịện trước ở trong 1 file excel chuyển qua đuôi *.csv; các cột thuộc tính được sắp xếp đúng trình tự trước sau của các thuộc tính có trong block. ví dụ như sau:

http://www.cadviet.com/upfiles/2/dulieu_khungten.rar

Tạo lisp để tải file dữ liệu *.csv, pick lần lượt từng block 1, các dữ liệu từng hàng 1 từ trên xuống dưới trong file *.csv sẽ nhảy vào các thuộc tính trong block và tự động update ngay không cần phải regen.

.... không biết ý tưởng này có hay không? mời các bạn cùng Thiep tham gia viết lisp nhé.

Tiện đây cho mình hỏi luôn. Đối với Insert một Block khung tên có chứa thuộc tính thì không có gì bàn nhiều, mình vẫn băn khoăn không hiểu tại sao khi mình tham khảo ngoài 1 bản vẽ khung tên thì nếu khung tên đó có chứa các thuộc tính thì những thuộc tính đó không còn sử dụng được nữa nhỉ. Mình muốn làm tham khảo ngoài bởi lẽ một công trình (gồm nhiều bản vẽ) nhưng chỉ cần dùng 1 khung tên. Nếu Insert Block thì không thể ưu việt bằng tham khảo ngoài. Tuy nhiên cái cần thay đổi ở mỗi bản vẽ: tên bản vẽ, số thứ tự, ký hiệu, tỷ lệ... thì tham khảo ngoài bó tay. Ai biết khắc phục cái này giúp mình vớ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
Tiện đây cho mình hỏi luôn. Đối với Insert một Block khung tên có chứa thuộc tính thì không có gì bàn nhiều, mình vẫn băn khoăn không hiểu tại sao khi mình tham khảo ngoài 1 bản vẽ khung tên thì nếu khung tên đó có chứa các thuộc tính thì những thuộc tính đó không còn sử dụng được nữa nhỉ. Mình muốn làm tham khảo ngoài bởi lẽ một công trình (gồm nhiều bản vẽ) nhưng chỉ cần dùng 1 khung tên. Nếu Insert Block thì không thể ưu việt bằng tham khảo ngoài. Tuy nhiên cái cần thay đổi ở mỗi bản vẽ: tên bản vẽ, số thứ tự, ký hiệu, tỷ lệ... thì tham khảo ngoài bó tay. Ai biết khắc phục cái này giúp mình với.

Nếu vậy thì những gì thay đổi (tên bản vẽ, số thứ tự, ký hiệu, tỷ lệ...) đừng cho vào Block khung tên, chỉ là text bình thường thô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
Nếu vậy thì những gì thay đổi (tên bản vẽ, số thứ tự, ký hiệu, tỷ lệ...) đừng cho vào Block khung tên, chỉ là text bình thường thôi

Như thế không hay vì nó làm cho khung tên phức tạp. Mình thường dùng biện pháp chữa cháy là cho các text đấy vào 1 block thuộc tính rồi insert cùng với khung tên. Nhưng vẫn chưa thấy hài lòng lắm. Nếu gói gọn nó vào 1 thì tốt hơn 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
Cái này chỉ cần dùng 1 lệnh eattedit (hoặc kích double vào block) là đủ? Sao lại phải dùng Lisp?

Đủ, nhưng không tối ưu. Chắc chắn là nó fải có nhược điểm nên bọn em mới phải dùng lisp anh Tuệ ạ.

Nếu một block có chứa nhiều attribute như khung bản vẽ thì khi dùng eatedit anh sẽ phải dò atttibute cần sửa trong danh sách attribute của block đó, việc này sẽ mất thời gian và dễ gây nhầm lẫ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
Thiep có 1 ý tưởng như thế này: Bản vẽ chèn block có nhiều thuộc tính: ví dụ: TENBANVE, NGUOIVE, NGUOIKIEMTRA, GIAMDOC, SOBANVE,... Các số liệu thuộc tính này của từng bản vẽ được lưu và đã hoàn thịện trước ở trong 1 file excel chuyển qua đuôi *.csv; các cột thuộc tính được sắp xếp đúng trình tự trước sau của các thuộc tính có trong block. ví dụ như sau:

http://www.cadviet.com/upfiles/2/dulieu_khungten.rar

Tạo lisp để tải file dữ liệu *.csv, pick lần lượt từng block 1, các dữ liệu từng hàng 1 từ trên xuống dưới trong file *.csv sẽ nhảy vào các thuộc tính trong block và tự động update ngay không cần phải regen.

.... không biết ý tưởng này có hay không? mời các bạn cùng Thiep tham gia viết lisp nhé.

Không ai có khen chê, bình luận ý tưởng này gì à?, Thiep đã có mã rồi, chỉ còn chờ các bạn hưởng ứng thôi. Nếu bạn nào hưởng ứng với ý tưởng này thì up cho mình file dwg và cả file *.csv để mình test lisp nhé.

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
Thiep có 1 ý tưởng như thế này: Bản vẽ chèn block có nhiều thuộc tính: ví dụ: TENBANVE, NGUOIVE, NGUOIKIEMTRA, GIAMDOC, SOBANVE,... Các số liệu thuộc tính này của từng bản vẽ được lưu và đã hoàn thịện trước ở trong 1 file excel chuyển qua đuôi *.csv; các cột thuộc tính được sắp xếp đúng trình tự trước sau của các thuộc tính có trong block. ví dụ như sau:

http://www.cadviet.com/upfiles/2/dulieu_khungten.rar

Tạo lisp để tải file dữ liệu *.csv, pick lần lượt từng block 1, các dữ liệu từng hàng 1 từ trên xuống dưới trong file *.csv sẽ nhảy vào các thuộc tính trong block và tự động update ngay không cần phải regen.

.... không biết ý tưởng này có hay không? mời các bạn cùng Thiep tham gia viết lisp nhé.

^^ ý tưởng này của anh khá hay, có nhiều ưu điểm. Tuy nhiên cách này theo như em hình dung thì ta chỉ áp dụng lisp với một kiểu định dạng khung bản vẽ duy nhất trong khi với mỗi một cty lại sử dụng một loại khung khác nhau nên áp dụng được cũng hơi khó.

Hiện em vẫn đang sử dụng khung tên là một block. trong đó các text như luôn cố định với tất cả bản vẽ như tên cty, tên công trình, Giám đốc... thì sử dụng text bình thường, đóng chết luôn vào block. Nếu vì một lý do nào đó cần thay đổi thì edit block là ta có thể thay đổi hàng loạt cho tất cả bản vẽ. Còn các text có nội dung thay đổi với từng bản vẽ như tên bản vẽ, số hiệu bản vẽ, tỷ lệ.. thì dùng attribute. hiện tại thì em cũng tương đối hài lòng với cách này.

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
Không ai có khen chê, bình luận ý tưởng này gì à?, Thiep đã có mã rồi, chỉ còn chờ các bạn hưởng ứng thôi. Nếu bạn nào hưởng ứng với ý tưởng này thì up cho mình file dwg và cả file *.csv để mình test lisp nhé.

Anh thử với cái khung tên của em xem thế nào nhé :bigsmile:

Những chỗ em khoanh tròn là các Attribute

 

edit: hic! em viết nhầm :bigsmile:

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
Em tthử với cái khung tên của em xem thế nào nhé :bigsmile:

Những chỗ em khoanh tròn là các Attribute

Vâng Eem sẽ thử, nhưng mà anh cho Eem thêm cái file dữ liệu *.csv nữa, nhớ thiết kế cho N hàng ứng với N khung tên nhé, với trình tự tiêu đề cột trong file *.csv như sau: TENBANVE; TENTUYEN; BANVESO; KYHIEU; TYLE; TENBANVE,

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âng Eem sẽ thử, nhưng mà anh cho Eem thêm cái file dữ liệu *.csv nữa, nhớ thiết kế cho N hàng ứng với N khung tên nhé, với trình tự tiêu đề cột trong file *.csv như sau: TENBANVE; TENTUYEN; BANVESO; KYHIEU; TYLE; TENBANVE,

Trong khi chờ đợi Thaistreet, các bạn dùng ví dụ về file *.csv này thử:

http://www.cadviet.com/upfiles/2/ttattribute.zip

trong file *.csv này có 6 hàng dữ liệu tương ứng với 6 blockref, các bạn copy block khungten thêm 5 nữa,

Khi lisp yêu cầu: Select objects, các bạn dùng chế độ chọn là fence "f", làm như vậy để đối tượng nào dính fence trước sẽ được lisp xử lý trước,

Còn đây là file lisp:

;| Lisp thay doi gia tri thuoc tinh cua cac block reference
            CHANGE-ATTRIB.LSP V1:  10-2009                
---------------------------------------------------------|;
(defun serapate	(row sym /  st1 row)
 (setq L nil)
 (while (setq vitri (vl-string-search sym row 1))
   (setq st1 (substr row 1 vitri))
   (setq L (append L (list st1)))
   (setq row (vl-string-left-trim st1 row))
   (setq row (vl-string-left-trim sym row))
 )
 (append L (list row))
)
(defun SS-enlst	(ss / c L)
 (setq c -1)
 (repeat (sslength ss)
   (setq L (cons (ssname ss (setq c (1+ c))) L))
 )
 (reverse L)
)
(defun getatt (itm)
 (vlax-safearray->list
   (vlax-variant-value
     (vla-GetAttributes itm)
   )
 )
)

;;;-----------------------------------------------------------
(vl-load-com)
;;;------- Main Program -----------
(defun c:chattCSV (/ fn f L blSet objbl attLst i n m)
 (setq fn (getfiled "Select data file" "c:/" "csv" 0))
 (setq f (open fn "r"))
 (read-line f)
 (princ "<<< Select blocks to change attributes >>>")
 (if (setq blSet (ssget '((0 . "INSERT") (66 . 1))))
   (setq blSet (mapcar 'vlax-ename->vla-object (SS-enlst blSet)))
 )
 (setq	n 0
m (length blSet))
 (while (and (setq S (read-line f)) (< n m))
   (setq L	 (serapate S ",")
  objbl	 (nth n blSet)
  attLst (getatt objbl)
  i	 0
   )
   (foreach att attLst
     (vla-put-textstring att (nth i L))
     (setq i (1+ i))
   )
   (setq n (1+ n))
 )
 (cond ((and (< n m) (not (read-line f)))
 (alert "\nThe Numbers of blocksrefs more than the numbers of data rows.
	\n                   Finish input data from file. ")
 )
((read-line f)
  (alert
    "\nThe Numbers of data rows more than the numbers of blocksrefs.
    \n                    Finish input data from file. "
  )
)
(t (alert "\n             Lisp's mission accomplished !
	  \n              Finish input data from file.
	  \nTHANK YOU FOR USE LISP CHANGE ATTRIBUTES FOR BLOCKS. THIEP"))
 )
 (close f)
 (princ)
)

Chúc các bạn thành công!!!

  • 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
Đủ, nhưng không tối ưu. Chắc chắn là nó fải có nhược điểm nên bọn em mới phải dùng lisp anh Tuệ ạ.

Nếu một block có chứa nhiều attribute như khung bản vẽ thì khi dùng eatedit anh sẽ phải dò atttibute cần sửa trong danh sách attribute của block đó, việc này sẽ mất thời gian và dễ gây nhầm lẫn.

Với một block có chứa nhiều attribute thì chẳng cần phải dò atttibute như lời bạn nói chi cả.

 

Bạn thử nhé :

Đấnh lệnh eatedit hoặc kích double vào 1 Block bất kì

 

-> Hiện lên hộp thoại Enhanced Attribute Editor

 

-> Ngay ở nút trên góc trên, bên phải của hộp thoại này có nút Select Block

 

-> nhấn nút này -> Pick chọn Att muốn sửa

 

-> hộp thoại Enhanced Attribute Editor lại xuất hiện -> lập tức giá trị Value ngay chổ bạn chọn sẽ được kích hoạt

 

-> Bạn sửa vào mục value

 

-> nếu chấp nhận sửa thì apply còn nếu không chấp nhận sửa thì nhấn nút Select Block để chọn Att tiếp theo muốn sửa -> cứ như vậy....

 

Nó tương tự như ddedit phải không bạn?

  • 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
Thiep có 1 ý tưởng như thế này: Bản vẽ chèn block có nhiều thuộc tính: ví dụ: TENBANVE, NGUOIVE, NGUOIKIEMTRA, GIAMDOC, SOBANVE,... Các số liệu thuộc tính này của từng bản vẽ được lưu và đã hoàn thịện trước ở trong 1 file excel chuyển qua đuôi *.csv; các cột thuộc tính được sắp xếp đúng trình tự trước sau của các thuộc tính có trong block. ví dụ như sau:

http://www.cadviet.com/upfiles/2/dulieu_khungten.rar

Tạo lisp để tải file dữ liệu *.csv, pick lần lượt từng block 1, các dữ liệu từng hàng 1 từ trên xuống dưới trong file *.csv sẽ nhảy vào các thuộc tính trong block và tự động update ngay không cần phải regen.

.... không biết ý tưởng này có hay không? mời các bạn cùng Thiep tham gia viết lisp nhé.

Mời Thiệp tham khảo ở topic này: http://www.cadviet.com/forum/index.php?sho...c=7056&st=0 bài #11

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

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.

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:

  • Vote tăng 6

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

Rất cám ơn bác Tue_NV đã chia xẻ.

Nhưng mà:

" Rằng hay thì thật là hay

Để hiểu được nó có ngày long răng"

Hề hề, khó gặm quá, nhiều xơ quá. Đúng như bác Tue_NV nói, còn phải mót dài dài mới mong hiểu và làm được như họ. Hề hề hề.....

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

Chào anh gia bach và mọi người

 

Tue_NV có 1 thắc mắc trong đoạn Code trên nhưng tìm mãi trong Help nhưng chẳng thấy đâu.

Dưới đây là trích dẫn 1 đoạn Code trong Lisp trên :

 

(setq ent

(car (nentsel "\nSelect Attribute: ")))

(cond

((eq 'ENAME (type ent))

(if (eq "ATTRIB" (cdr (assoc 0 (entget ent))))

(if (and (vlax-property-available-p

(setq Obj (vlax-ename->vla-object ent)) 'MTextAttribute)

(eq :vlax-true (vla-get-MtextAttribute Obj)))

(princ "\n** Incompatible with MText Attributes **") nil)

(princ "\n** Object is not an Attribute **")))

(t (princ "\n** Nothing Selected **")))))

 

(setq Blk

(vla-ObjectIdtoObject

(vla-get-ActiveDocument

(vlax-get-acad-object))

(vla-get-OwnerId Obj)))

 

(setq bNme

(strcase

(if (vlax-property-available-p Blk 'EffectiveName)

(vla-get-EffectiveName Blk)

(vla-get-Name Blk))))

 

Tue_NV đã đọc trong cuốn Help Developer và sử dụng cả chức năng Search trong Help Developer mà chẳng thấy property MTextAttributeEffectiveName đâu cả.

Tue_NV không biết tìm hiểu và đọc 2 thuộc tính của Block này ở đâu. Mong mọi người chỉ giúp

Xin cảm ơn rất nhiều

  • 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
Chào anh gia bach và mọi người

 

.....................

 

Tue_NV đã đọc trong cuốn Help Developer và sử dụng cả chức năng Search trong Help Developer mà chẳng thấy property MTextAttributeEffectiveName đâu cả.

Tue_NV không biết tìm hiểu và đọc 2 thuộc tính của Block này ở đâu. Mong mọi người chỉ giúp

Xin cảm ơn rất nhiều

Chào Tue_NV

MTextAttribute EffectiveName là các thuộc tính (Property) của đối tuợng (Vla-Obj) trong môi truờng ActiveX and VBA.

Bạn xem trong Help Developer Documentation -> ActiveX and VBA Reference -> Properties :

- MTextAttribute Property

- EffectiveName Property

  • Vote tăng 2

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  

×