Chuyển đến nội dung
Diễn đàn CADViet
vuhoach

Nhờ viết lisp move block tới point

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

Chào các bác, bài toán của mình như này: Mình cần xuất tọa độ của các block đèn kèm tên của nó. Như hình bên dưới là các cột đèn kèm tên của nó (tên đèn là block attribute), mình đã có lisp chuyển các đèn kia thành point, và lisp move text tới point (đính kèm bên dưới cho anh em nào cần). Nhưng do block tên đèn của mình bên trong gồm cả text lẫn attribute, dùng lệnh burst của cad có thể chuyển các attribute trong block thành text nhưng sau khi thực hiện lệnh này thì bị lẫn cả text cần lấy tọa độ lẫn text rác. Mình có thể xử lý, lọc được để lấy tọa độ text mong muốn nhưng rất mất công. Vì vậy mình muốn có một lisp có thể move thẳng block tới point để thao tác nhanh gọn hơn. Khi đó bài toàn xuất tọa độ đối tượng kèm tên sẽ đơn giản hơn rất nhiều: dùng 1 lisp chuyển block đèn kia thành point (mình đã có) -> dùng lisp đang nhờ các bạn viết move block tên đèn vào các point vừa tạo(hoặc chỉnh sửa lisp mình đính kèm) -> xuất tọa độ các block atrribute tên đèn (lisp này cũng đã có).

 

PS: lisp move text to point đính kèm là của Lee-Mac

image.png.d4e36775500bc9cd82c7447c15b3346e.png

txt2pt MOVE TEXT TO POINT.LSP

  • Vote giảm 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
8 giờ trước, vuhoach đã nói:

Chào các bác, bài toán của mình như này: Mình cần xuất tọa độ của các block đèn kèm tên của nó. Như hình bên dưới là các cột đèn kèm tên của nó (tên đèn là block attribute), mình đã có lisp chuyển các đèn kia thành point, và lisp move text tới point (đính kèm bên dưới cho anh em nào cần). Nhưng do block tên đèn của mình bên trong gồm cả text lẫn attribute, dùng lệnh burst của cad có thể chuyển các attribute trong block thành text nhưng sau khi thực hiện lệnh này thì bị lẫn cả text cần lấy tọa độ lẫn text rác. Mình có thể xử lý, lọc được để lấy tọa độ text mong muốn nhưng rất mất công. Vì vậy mình muốn có một lisp có thể move thẳng block tới point để thao tác nhanh gọn hơn. Khi đó bài toàn xuất tọa độ đối tượng kèm tên sẽ đơn giản hơn rất nhiều: dùng 1 lisp chuyển block đèn kia thành point (mình đã có) -> dùng lisp đang nhờ các bạn viết move block tên đèn vào các point vừa tạo(hoặc chỉnh sửa lisp mình đính kèm) -> xuất tọa độ các block atrribute tên đèn (lisp này cũng đã có).

 

PS: lisp move text to point đính kèm là của Lee-Mac

image.png.d4e36775500bc9cd82c7447c15b3346e.png

txt2pt MOVE TEXT TO POINT.LSP

Vẫn không hiểu ý cụ lắm. Có phải cụ muốn xuất tọa độ (base point) của block kèm text nằm gần block ra bảng excel 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
9 giờ trước, vuhoach đã nói:

Chào các bác, bài toán của mình như này: Mình cần xuất tọa độ của các block đèn kèm tên của nó. Như hình bên dưới là các cột đèn kèm tên của nó (tên đèn là block attribute), mình đã có lisp chuyển các đèn kia thành point, và lisp move text tới point (đính kèm bên dưới cho anh em nào cần). Nhưng do block tên đèn của mình bên trong gồm cả text lẫn attribute, dùng lệnh burst của cad có thể chuyển các attribute trong block thành text nhưng sau khi thực hiện lệnh này thì bị lẫn cả text cần lấy tọa độ lẫn text rác. Mình có thể xử lý, lọc được để lấy tọa độ text mong muốn nhưng rất mất công. Vì vậy mình muốn có một lisp có thể move thẳng block tới point để thao tác nhanh gọn hơn. Khi đó bài toàn xuất tọa độ đối tượng kèm tên sẽ đơn giản hơn rất nhiều: dùng 1 lisp chuyển block đèn kia thành point (mình đã có) -> dùng lisp đang nhờ các bạn viết move block tên đèn vào các point vừa tạo(hoặc chỉnh sửa lisp mình đính kèm) -> xuất tọa độ các block atrribute tên đèn (lisp này cũng đã có).

 

PS: lisp move text to point đính kèm là của Lee-Mac

image.png.d4e36775500bc9cd82c7447c15b3346e.png

txt2pt MOVE TEXT TO POINT.LSP

Mình nghĩ bài toán này không khó với mẫu file như hì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
1 giờ} trướ}c, mdchuyen đã nói:

Vẫn không hiểu ý cụ lắm. Có phải cụ muốn xuất tọa độ (base point) của block kèm text nằm gần block ra bảng excel không?

Đúng rồi bác, nhưng lisp xuất tọa độ thông thường phải ghi tên điểm thủ công, hoặc đánh stt tự động nhưng stt này không khớp với tên điểm đã có. Vì vậy mà em muốn trên để công việc tự động cao hơ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
2 phút trước, vuhoach đã nói:

Đúng rồi bác, nhưng lisp xuất tọa độ thông thường phải ghi tên điểm thủ công, hoặc đánh stt tự động nhưng stt này không khớp với tên điểm đã có. Vì vậy mà em muốn trên để công việc tự động cao hơn 

Bạn phải gửi file cad của bạn lên để có cơ sở mới làm được:

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
9 phút trước, vuhoach đã nói:

Đúng rồi bác, nhưng lisp xuất tọa độ thông thường phải ghi tên điểm thủ công, hoặc đánh stt tự động nhưng stt này không khớp với tên điểm đã có. Vì vậy mà em muốn trên để công việc tự động cao hơn 

Vậy thì bản thân lisp bác đang có là thực hiện được rồi. bác move text về tâm block (chính là point ) sau đó bác xuất tọa độ block và xuất tọa độ text: sau đó bác xử lý trên excel là được 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
31 phút trước, mdchuyen đã nói:

Vậy thì bản thân lisp bác đang có là thực hiện được rồi. bác move text về tâm block (chính là point ) sau đó bác xuất tọa độ block và xuất tọa độ text: sau đó bác xử lý trên excel là được mà

Vâng, nhưng đa số công việc mà em thực hiện em dùng block attribute để ghi tên chứ không dùng text (vì attribute xử lý số liệu trên excel dễ dàng 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
1 giờ} trướ}c, vuhoach đã nói:

Vâng, nhưng đa số công việc mà em thực hiện em dùng block attribute để ghi tên chứ không dùng text (vì attribute xử lý số liệu trên excel dễ dàng hơn nhiều)

Tóm lại vẫn chưa hiểu bác muốn gì? block att thì cad có " Data extraction " rồ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
4 giờ trước, huunhantvxdts đã nói:

Bạn phải gửi file cad của bạn lên để có cơ sở mới làm được:

 

2 giờ trước, mdchuyen đã nói:

Tóm lại vẫn chưa hiểu bác muốn gì? block att thì cad có " Data extraction " rồi

 

Các bác xem file bên dưới để rõ ý hơn. Như đã nói ở trên, hiện em thấy các lisp xuất tọa độ chưa giải quyết được bài toàn xuất tọa độ đối tượng (thường là block) kèm tên của nó.

 

Vậy nên em chia nhỏ bài toán trên thành các bước như sau:

 

+ Bước 1: dùng lisp chuyển các block muốn xuất tọa độ thành các point (đã có lisp rồi)

+ Bước 2: Move tên điểm có thể dạng text vào các point đã thực hiện ở bước 1 (nếu tên điểm dạng text thì em đã có lisp đính kèm đầu topic) nhưng đa số tên điểm dưới dạng block attribute (block thuộc tính) vào các point nói trên (tương tự ảnh động bên dưới, thay vì move text, em muốn lisp mới có thể move được block vào point)

+ Xuất tọa độ text hoặc block attribute tên điểm ra excel (chính là tọa độ block ban đầu)

 

Bước 1 và bước 3 là em đã giải quyết được, thực ra bước 2 hoàn toàn có thể convert các attribute sang text thì bài toàn cũng đượcc giải quyết, nhưng nhiều khi bất tiện vì nếu block đó chỉ có 01 attribute thì khá dễ, nhưng nếu nó có nhiều hơn 01 attribute thì sẽ bị loạn phải mất công xử lý. Bước 2 nếu giải quyết được thì sẽ rất nhiều người sử dụng vì hiện em thấy dân thiết kế ngoài nhà thì dùng block attribute rất nhiều.

 

PS: nếu các bác có thể giải quyết vấn đề xuất tọa độ đối tượng kèm tên đối tượng (nằm gần) trong 1 lisp thì tốt quá, không cần phải chia nhỏ như em

 

1.MB chieu sang giao thong.DWG

txt2pt.gif.dde8a647aa40785811e4e74a17a48830.gif.29a584d97c73b135633f80af36c4b689.gif

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
20 phút trước, vuhoach đã nói:

 

 

Các bác xem file bên dưới để rõ ý hơn. Như đã nói ở trên, hiện em thấy các lisp xuất tọa độ chưa giải quyết được bài toàn xuất tọa độ đối tượng (thường là block) kèm tên của nó.

 

Vậy nên em chia nhỏ bài toán trên thành các bước như sau:

 

+ Bước 1: dùng lisp chuyển các block muốn xuất tọa độ thành các point (đã có lisp rồi)

+ Bước 2: Move tên điểm có thể dạng text vào các point đã thực hiện ở bước 1 (nếu tên điểm dạng text thì em đã có lisp đính kèm đầu topic) nhưng đa số tên điểm dưới dạng block attribute (block thuộc tính) vào các point nói trên (tương tự ảnh động bên dưới, thay vì move text, em muốn lisp mới có thể move được block vào point)

+ Xuất tọa độ text hoặc block attribute tên điểm ra excel (chính là tọa độ block ban đầu)

 

Bước 1 và bước 3 là em đã giải quyết được, thực ra bước 2 hoàn toàn có thể convert các attribute sang text thì bài toàn cũng đượcc giải quyết, nhưng nhiều khi bất tiện vì nếu block đó chỉ có 01 attribute thì khá dễ, nhưng nếu nó có nhiều hơn 01 attribute thì sẽ bị loạn phải mất công xử lý. Bước 2 nếu giải quyết được thì sẽ rất nhiều người sử dụng vì hiện em thấy dân thiết kế ngoài nhà thì dùng block attribute rất nhiều.

 

PS: nếu các bác có thể giải quyết vấn đề xuất tọa độ đối tượng kèm tên đối tượng (nằm gần) trong 1 lisp thì tốt quá, không cần phải chia nhỏ như em

 

1.MB chieu sang giao thong.DWG

txt2pt.gif.dde8a647aa40785811e4e74a17a48830.gif.29a584d97c73b135633f80af36c4b689.gif

Cái này bạn đừng quan tâm lips bạn đã có làm gì, nó là ảnh hưởng đến giải thuật người viết. cái này thì như bản vẽ của bạn quét 1 cái là nó ra kết quả bạn mong muốn luôn chứ không phải chuyển tới chuyển lui chi cả.

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
53 phút trước, huunhantvxdts đã nói:

Cái này bạn đừng quan tâm lips bạn đã có làm gì, nó là ảnh hưởng đến giải thuật người viết. cái này thì như bản vẽ của bạn quét 1 cái là nó ra kết quả bạn mong muốn luôn chứ không phải chuyển tới chuyển lui chi cả.

vâng, lần đầu đăng bài em còn sơ sót.

  • Vote giảm 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

Đến lần thứ 5 thì cũng chưa rõ yêu cầu thế nào vì tọa độ XY trong bảng cũng không đúng với thực tế mà đánh bậy chứng tỏ chưa nghiêm túc. Do đối với bv giao thông X, Y hay hoán đổi cho nhau 

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
1 giờ} trướ}c, anti lazy đã nói:

Đến lần thứ 5 thì cũng chưa rõ yêu cầu thế nào vì tọa độ XY trong bảng cũng không đúng với thực tế mà đánh bậy chứng tỏ chưa nghiêm túc. Do đối với bv giao thông X, Y hay hoán đổi cho nhau 

Mình cố hiểu được là bản vẽ có 2 loại block ( block tĩnh và block thuộc tính ) tại mỗi vị trí bạn ấy cần lấy tọa độ điểm base point của block tĩnh và kèm tên của block att là ghi chú cho mỗi block tĩnh gần 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

Mình nhận thấy thuật toán này cũng không khó lắm. 

1.  Chọn block và BLOCKATT

2. chọn att để lấy tagstring (dùng nentsel hoặc getword đều được)

3. Lọc Block và text thành 2 list (điều kiện cần: độ dài 2 list này bằng nhau)

4. Tạo danh sách điểm Block

5. ứng với mỗi điểm Lấy 1 BLOCKATT ở gần nhất (so sánh tagstring  att trong block để lấy text tring.)

done!

 

(defun c:QT (/ ss tag file_name lstbkatt lstpt file_write item ent lstatt pair str)
  (setq 
    ss (acet-ss-to-list (ssget '((0 . "INSERT"))))
    tag (nentsel "\nSelect Att:")
    file_name (getfiled "Xuat du lieu" "Thong ke Toa do" "txt" 1)
  )
  (mapcar
    '(lambda (x) 
      (if (assoc 66 (entget x))
        (setq lstbkatt (cons x lstbkatt))
        (setq lstpt (cons (cdr (assoc 10 (entget x)))))
      )
     )
    ss
  )
  (if (and tag file_name (= (length lstbkatt) (length lstpt)))
    (setq file_write (open file_name "W"))
    (exit)
  )
  (setq tag (strcase (cdr (assoc 2 (entget (car tag))))))
  (foreach item lstpt
    (setq 
      str (strcat (rtos (Car item) 2 4) "\t" (rtos (Cadr item) 2 4))
      ent (car (vl-sort lstbkatt '(lambda (a b) (< (distance item (cdr (assoc 10 (ENTGET a)))) (distance item (cdr (assoc 10 (ENTGET b))))))))
      lstatt (vlax-invoke (vlax-ename->vla-object ent) 'getattributes)
    )
    (foreach pair lstatt
      (if (= tag (strcase (vla-get-tagstring pair)))
       (setq str (strcat str "\t" (vla-get-textstring pair)))
      )
    )
    (write-line str file_write)
  )
  (close file_write)
  (princ)
)

 

 

 

 

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
7 giờ trước, mdchuyen đã nói:

Mình cố hiểu được là bản vẽ có 2 loại block ( block tĩnh và block thuộc tính ) tại mỗi vị trí bạn ấy cần lấy tọa độ điểm base point của block tĩnh và kèm tên của block att là ghi chú cho mỗi block tĩnh gần nó.  

Đúng là yêu cầu như này đó bác

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
10 giờ trước, tannguyen291 đã nói:

Mình nhận thấy thuật toán này cũng không khó lắm. 

1.  Chọn block và BLOCKATT

2. chọn att để lấy tagstring (dùng nentsel hoặc getword đều được)

3. Lọc Block và text thành 2 list (điều kiện cần: độ dài 2 list này bằng nhau)

4. Tạo danh sách điểm Block

5. ứng với mỗi điểm Lấy 1 BLOCKATT ở gần nhất (so sánh tagstring  att trong block để lấy text tring.)

done!

 


(defun c:QT (/ ss tag file_name lstbkatt lstpt file_write item ent lstatt pair str)
  (setq 
    ss (acet-ss-to-list (ssget '((0 . "INSERT"))))
    tag (nentsel "\nSelect Att:")
    file_name (getfiled "Xuat du lieu" "Thong ke Toa do" "txt" 1)
  )
  (mapcar
    '(lambda (x) 
      (if (assoc 66 (entget x))
        (setq lstbkatt (cons x lstbkatt))
        (setq lstpt (cons (cdr (assoc 10 (entget x)))))
      )
     )
    ss
  )
  (if (and tag file_name (= (length lstbkatt) (length lstpt)))
    (setq file_write (open file_name "W"))
    (exit)
  )
  (setq tag (strcase (cdr (assoc 2 (entget (car tag))))))
  (foreach item lstpt
    (setq 
      str (strcat (rtos (Car item) 2 4) "\t" (rtos (Cadr item) 2 4))
      ent (car (vl-sort lstbkatt '(lambda (a b) (< (distance item (cdr (assoc 10 (ENTGET a)))) (distance item (cdr (assoc 10 (ENTGET b))))))))
      lstatt (vlax-invoke (vlax-ename->vla-object ent) 'getattributes)
    )
    (foreach pair lstatt
      (if (= tag (strcase (vla-get-tagstring pair)))
       (setq str (strcat str "\t" (vla-get-textstring pair)))
      )
    )
    (write-line str file_write)
  )
  (close file_write)
  (princ)
)

 

 

 

 

Em dùng thử nhưng toàn báo lỗi thôi bác. Hay như đầu topic bác có thể chỉnh sửa lisp để có thể move block thuộc tính về các point (các point này thì được tạo ra bằng cách dùng 1 lisp khác (đã có) convert các block tĩnh kia mà thà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
14 giờ trước, anti lazy đã nói:

Đến lần thứ 5 thì cũng chưa rõ yêu cầu thế nào vì tọa độ XY trong bảng cũng không đúng với thực tế mà đánh bậy chứng tỏ chưa nghiêm túc. Do đối với bv giao thông X, Y hay hoán đổi cho nhau 

Tọa độ XY em đánh ví dụ thôi bác. Còn yêu cầu có thể như bác mdchuyen đã nói. Xin lỗi vì topic em viết chưa được rõ ý. 

 

Bài toán em cần giải quyết xin được trích dẫn lời bác mdchuyen "bản vẽ có 2 loại block ( block tĩnh và block thuộc tính ) tại mỗi vị trí bạn ấy cần lấy tọa độ điểm base point của block tĩnh và kèm tên của block att là ghi chú cho mỗi block tĩnh gần nó"

 

Để giải quyết bài toán đó nếu có 1 lisp mà trực tiếp giải quyết được bài toán thì tuyệt vời.

 

Còn nếu không thể giải quyết như trên thì như tiêu đề topic em xin nhờ các bác viết 1 lisp có thể move các block thuộc tính đến các point nằm gần đó (các point này thì được tạo ra bằng cách dùng 1 lisp khác (đã có) convert các block tĩnh kia mà thà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
9 giờ trước, vuhoach đã nói:

Tọa độ XY em đánh ví dụ thôi bác. Còn yêu cầu có thể như bác mdchuyen đã nói. Xin lỗi vì topic em viết chưa được rõ ý. 

 

Bài toán em cần giải quyết xin được trích dẫn lời bác mdchuyen "bản vẽ có 2 loại block ( block tĩnh và block thuộc tính ) tại mỗi vị trí bạn ấy cần lấy tọa độ điểm base point của block tĩnh và kèm tên của block att là ghi chú cho mỗi block tĩnh gần nó"

 

Để giải quyết bài toán đó nếu có 1 lisp mà trực tiếp giải quyết được bài toán thì tuyệt vời.

 

Còn nếu không thể giải quyết như trên thì như tiêu đề topic em xin nhờ các bác viết 1 lisp có thể move các block thuộc tính đến các point nằm gần đó (các point này thì được tạo ra bằng cách dùng 1 lisp khác (đã có) convert các block tĩnh kia mà thành)

 

 

 

 

 

Mình đã hiểu và biết hướng giải quyết đối với bản vẽ bạn gửi từ lisp bạn có đã gửi tin nhắn riêng cho bạn nhưng không thấy bạn trả lời

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

Minh viết hơi vội nên không để ý lỗi cú pháp bạn chạy lại cái này hoặc gửi file cad mình chạy thử xem sao

(defun c:QT (/ ss tag file_name lstbkatt lstpt file_write item ent lstatt pair str)
  (setq 
    ss (acet-ss-to-list (ssget '((0 . "INSERT"))))
    tag (nentsel "\nSelect Att:")
    file_name (getfiled "Xuat du lieu" "Thong ke Toa do" "txt" 1)
  )
  (mapcar
    '(lambda (x) 
      (if (assoc 66 (entget x))
        (setq lstbkatt (cons x lstbkatt))
        (setq lstpt (cons (cdr (assoc 10 (entget x))) lstpt)) ;<===== sai chỗ này nè. :))
      )
     )
    ss
  )
  (if (and tag file_name (= (length lstbkatt) (length lstpt)))
    (setq file_write (open file_name "W"))
    (exit)
  )
  (setq tag (strcase (cdr (assoc 2 (entget (car tag))))))
  (foreach item lstpt
    (setq 
      str (strcat (rtos (Car item) 2 4) "\t" (rtos (Cadr item) 2 4))
      ent (car (vl-sort lstbkatt '(lambda (a b) (< (distance item (cdr (assoc 10 (ENTGET a)))) (distance item (cdr (assoc 10 (ENTGET b))))))))
      lstatt (vlax-invoke (vlax-ename->vla-object ent) 'getattributes)
    )
    (foreach pair lstatt
      (if (= tag (strcase (vla-get-tagstring pair)))
       (setq str (strcat str "\t" (vla-get-textstring pair)))
      )
    )
    (write-line str file_write)
  )
  (close file_write)
  (princ)
)

 

  • Like 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 đã mất công đánh tên = block thuộc tính rồi sao bạn không làm luôn cho nó 1 điểm gốc, text di chuyển được, điểm đặt block chính là tọa độ đèn, đỡ phải lisp move về point các thứ.

Mình nghĩ là 1 block động + thuộc tính như thế này có thể giải quyết được tất cả các vấn đề, cần thiết có thể gộp luôn cái đèn vào (thay cái point = đèn).

Xuất tạo độ + att thì trên forum cũng có khá nhiều lisp sẵn.

image.png

Block1.dwg

  • Like 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
6 giờ trước, tannguyen291 đã nói:

Minh viết hơi vội nên không để ý lỗi cú pháp bạn chạy lại cái này hoặc gửi file cad mình chạy thử xem sao


(defun c:QT (/ ss tag file_name lstbkatt lstpt file_write item ent lstatt pair str)
  (setq 
    ss (acet-ss-to-list (ssget '((0 . "INSERT"))))
    tag (nentsel "\nSelect Att:")
    file_name (getfiled "Xuat du lieu" "Thong ke Toa do" "txt" 1)
  )
  (mapcar
    '(lambda (x) 
      (if (assoc 66 (entget x))
        (setq lstbkatt (cons x lstbkatt))
        (setq lstpt (cons (cdr (assoc 10 (entget x))) lstpt)) ;<===== sai chỗ này nè. :))
      )
     )
    ss
  )
  (if (and tag file_name (= (length lstbkatt) (length lstpt)))
    (setq file_write (open file_name "W"))
    (exit)
  )
  (setq tag (strcase (cdr (assoc 2 (entget (car tag))))))
  (foreach item lstpt
    (setq 
      str (strcat (rtos (Car item) 2 4) "\t" (rtos (Cadr item) 2 4))
      ent (car (vl-sort lstbkatt '(lambda (a b) (< (distance item (cdr (assoc 10 (ENTGET a)))) (distance item (cdr (assoc 10 (ENTGET b))))))))
      lstatt (vlax-invoke (vlax-ename->vla-object ent) 'getattributes)
    )
    (foreach pair lstatt
      (if (= tag (strcase (vla-get-tagstring pair)))
       (setq str (strcat str "\t" (vla-get-textstring pair)))
      )
    )
    (write-line str file_write)
  )
  (close file_write)
  (princ)
)

 

Tuyệt vời bác ạ, bảng kết quả xuất ra bác có thể insert thêm 1 cột tên của block thuộc tính nữa không (như ảnh dưới em chụp)  . Cảm ơn bác nhiều.

 

image.png

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
38 phút trước, huunhantvxdts đã nói:

Thử lisp này xem có đúng yêu cầu không nhé:

Clip hướng dân dùng nhé:

https://www.youtube.com/watch?v=mXam0l7Ozew

Xuat toa do BLock (XTDCD).rar

Nhìn trên video thì cũng rất tuyệt vời, nhưng máy em cad 2018 chạy báo lỗi. Ngoài ra kết quả xuất ra em muốn dưới dạng txt, csv để em có thể xử lý thêm dữ liệu. Thanks bác.

 

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ủa bạn đây nhé!

Vì bạn dùng nhiều loại BLOCK att nên mình bỏ chức năng chọn att. mọi att đều xuất ra. 

 

(defun c:QT (/ ss tag file_name lstbkatt lstpt file_write item ent lstatt pair str)
  (setq 
    ss (acet-ss-to-list (ssget '((0 . "INSERT"))))
    file_name (getfiled "Xuat du lieu" "Thong ke Toa do" "txt" 1)
  )
  (mapcar
    '(lambda (x) 
      (if (assoc 66 (entget x))
        (setq lstbkatt (cons x lstbkatt))
        (setq lstpt (cons (cdr (assoc 10 (entget x))) lstpt))
      )
     )
    ss
  )
  (if (and file_name (= (length lstbkatt) (length lstpt)))
    (progn
      (setq file_write (open file_name "W"))
      (foreach item lstpt
        (setq 
          ent (car (vl-sort lstbkatt '(lambda (a b) (< (distance item (cdr (assoc 10 (ENTGET a)))) (distance item (cdr (assoc 10 (ENTGET b))))))))
          str (strcat (cdr (assoc 2 (entget ent))) "\t" (rtos (Car item) 2 4) "\t" (rtos (Cadr item) 2 4))
          lstatt (vlax-invoke (vlax-ename->vla-object ent) 'getattributes)
        )
        (foreach pair lstatt
          (setq str (strcat str "\t" (vla-get-textstring pair)))
        )
        (write-line str file_write)
      )
      (close file_write)
    )
    (alert "\nNot match data!")
  )
  (princ)
)

 

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

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

×