Thaistreetz 539 Báo cáo bài đăng Đã đăng Tháng 10 8, 2009 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
master_worse 88 Báo cáo bài đăng Đã đăng Tháng 10 8, 2009 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 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
Thaistreetz 539 Báo cáo bài đăng Đã đăng Tháng 10 8, 2009 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 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
master_worse 88 Báo cáo bài đăng Đã đăng Tháng 10 8, 2009 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 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
Thaistreetz 539 Báo cáo bài đăng Đã đăng Tháng 10 9, 2009 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
thiep 365 Báo cáo bài đăng Đã đăng Tháng 10 9, 2009 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 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
Thaistreetz 539 Báo cáo bài đăng Đã đăng Tháng 10 9, 2009 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
Tue_NV 3.912 Báo cáo bài đăng Đã đăng Tháng 10 9, 2009 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
nataca 554 Báo cáo bài đăng Đã đăng Tháng 10 9, 2009 - 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 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 365 Báo cáo bài đăng Đã đăng Tháng 10 9, 2009 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é. 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
nataca 554 Báo cáo bài đăng Đã đăng Tháng 10 9, 2009 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
master_worse 88 Báo cáo bài đăng Đã đăng Tháng 10 9, 2009 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
nataca 554 Báo cáo bài đăng Đã đăng Tháng 10 9, 2009 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
Thaistreetz 539 Báo cáo bài đăng Đã đăng Tháng 10 10, 2009 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 365 Báo cáo bài đăng Đã đăng Tháng 10 10, 2009 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
Thaistreetz 539 Báo cáo bài đăng Đã đăng Tháng 10 10, 2009 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
Thaistreetz 539 Báo cáo bài đăng Đã đăng Tháng 10 10, 2009 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
thiep 365 Báo cáo bài đăng Đã đăng Tháng 10 10, 2009 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
thiep 365 Báo cáo bài đăng Đã đăng Tháng 10 10, 2009 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!!! 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
Tue_NV 3.912 Báo cáo bài đăng Đã đăng Tháng 10 10, 2009 Đủ, 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 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
Phiphi- 176 Báo cáo bài đăng Đã đăng Tháng 10 14, 2009 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 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
Tue_NV 3.912 Báo cáo bài đăng Đã đăng Tháng 11 8, 2009 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: 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
phamthanhbinh 3.146 Báo cáo bài đăng Đã đăng Tháng 11 9, 2009 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
Tue_NV 3.912 Báo cáo bài đăng Đã đăng Tháng 11 26, 2009 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 MTextAttribute và EffectiveName đâ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 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
gia_bach 1.548 Báo cáo bài đăng Đã đăng Tháng 11 27, 2009 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 MTextAttribute và EffectiveName đâ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 và 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 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