Đến nội dung


Hình ảnh
- - - - -

Edit trực tiếp text Attribute trong block


  • Please log in to reply
35 replies to this topic

#1 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 08 October 2009 - 05:36 PM

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

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#2 master_worse

master_worse

    biết lệnh offset

  • Advance Member
  • PipPipPip
  • 170 Bài viết
Điểm đánh giá: 87 (tàm tạm)

Đã gửi 08 October 2009 - 06:06 PM

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ý
  • 1

Ngu dốt không đáng thẹn bằng thiếu ý chí học hỏi


Tri thức làm người ta khiêm tốn, ngu si làm người ta kiêu ngạo (Ngạn ngữ Anh)


#3 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 08 October 2009 - 06:22 PM

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

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#4 master_worse

master_worse

    biết lệnh offset

  • Advance Member
  • PipPipPip
  • 170 Bài viết
Điểm đánh giá: 87 (tàm tạm)

Đã gửi 08 October 2009 - 07:29 PM

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??
  • 1

Ngu dốt không đáng thẹn bằng thiếu ý chí học hỏi


Tri thức làm người ta khiêm tốn, ngu si làm người ta kiêu ngạo (Ngạn ngữ Anh)


#5 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 09 October 2009 - 12:45 PM

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

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#6 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 09 October 2009 - 01:52 PM

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)
  • 1

#7 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 09 October 2009 - 02:29 PM

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

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#8 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 09 October 2009 - 02:47 PM

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?
  • 0

#9 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 09 October 2009 - 02:56 PM

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

#10 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 09 October 2009 - 03:14 PM

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.c...eu_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é.
  • 1

#11 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 09 October 2009 - 03:30 PM

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.c...eu_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.
  • 0

#12 master_worse

master_worse

    biết lệnh offset

  • Advance Member
  • PipPipPip
  • 170 Bài viết
Điểm đánh giá: 87 (tàm tạm)

Đã gửi 09 October 2009 - 03:46 PM

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

Ngu dốt không đáng thẹn bằng thiếu ý chí học hỏi


Tri thức làm người ta khiêm tốn, ngu si làm người ta kiêu ngạo (Ngạn ngữ Anh)


#13 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 09 October 2009 - 03:51 PM

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

#14 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 10 October 2009 - 10:48 AM

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

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#15 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 10 October 2009 - 10:58 AM

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.c...eu_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é.
  • 0

#16 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 10 October 2009 - 11:18 AM

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.c...eu_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.
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#17 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 10 October 2009 - 11:26 AM

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

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#18 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 10 October 2009 - 01:24 PM

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,
  • 0

#19 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 10 October 2009 - 03:13 PM

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.c...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!!!
  • 1

#20 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 10 October 2009 - 03:22 PM

Đủ, 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?
  • 1