Lisp Xuất Text Từ Cad Sang Excel Theo Thứ Tự

Trong môi trường thiết kế kỹ thuật, AutoCAD đã trở thành một công cụ không thể thiếu cho các kỹ sư, nhà thiết kế, kiến trúc sư và các chuyên gia trong ngành xây dựng, cơ khí, điện tử, … Tuy nhiên, nhiều người trong cộng đồng CAD thường gặp khó khăn khi cần chuyển dữ liệu từ một bản vẽ sang một bảng tính Excel để phân tích, thống kê, báo cáo hoặc lưu trữ. Việc nhập dữ liệu thủ công luôn tốn thời gian, dễ dẫn đến sai sót. Bên cạnh đó, khi cần xuất dữ liệu theo một thứ tự മുമ്പ được xác định (ví dụ: theo thứ tự số ký hiệu, theo thứ tự xuất hiện trên bản vẽ, hoặc theo thứ tự kích thước) thì công việc trở nên phức tạp hơn nữa.

Để giải quyết những vấn đề này, AutoLISP – một ngôn ngữ lập trình nhúng trong AutoCAD – cung cấp một giải pháp mạnh mẽ và linh hoạt. Bài viết này sẽ hướng dẫn chi tiết cách viết một chương trình AutoLISP để trích xuất các chuỗi text từ bản vẽ CAD và ghi chúng vào một file Excel sao cho dữ liệu được sắp xếp theo thứ tự mong muốn. Ngoài ra, chúng ta cũng sẽ tìm hiểu những lưu ý quan trọng khi làm việc với dữ liệu xuất khẩu, cách bảo đảm tính chính xác và hiệu quả của quá trình, và một số mẹo tối ưu hoá mã nguồn.

1. Tổng quan về vấn đề và giải pháp

1.1 Tại sao cần xuất text từ CAD sang Excel?

  • Phân tích số liệu: Khi một bản vẽ chứa hàng ngàn ký hiệu, số liệu, hoặc thông tin vật liệu, người thiết kế thường muốn tính toán tổng trọng lượng, chi phí, hoặc thống kê phân phối.
  • Báo cáo: Trong các dự án côngWeiter, các báo cáo thường yêu cầu dữ liệu được trình bày dưới dạng bảng tính hoặc biểu đồ dựa trên Excel.
  • Lưu trữ và chia sẻ: Excel là một định dạng phổ biến, dễ dàng trao đổi giữa các phòng ban, khách hàng hay đối tác.

1.2 Thách thức khi trích xuất

  • Định dạng dữ liệu: Các đối tượng trong AutoCAD có thể có nhiều thuộc tính (độ dài, vị trí, kiểu font, màu, …). Việc chọn đúng thông tin cần lưu trữ là một bước quan trọng.
  • Thứ tự dữ liệu: AutoCAD không bắt buộc các đối tượng xuất hiện theo thứ tự logic. Nếu người dùng muốn dữ liệu được sắp xếp theo một tiêu chí nhất định (ví dụ: số ký hiệu tăng dần), cần phải viết mã cho phép sắp xếp trước khi xuất.
  • Hiệu suất: Đối với bản vẽ lớn (hàng nghìn đối tượng), thao tác đọc và ghi có thể tốn thời gian nếu không tối ưu.

1.3 Giải pháp AutoLISP + Excel

AutoLISP cho phép truy cập tới toàn bộ API của AutoCAD, bao gồm cả việc lặp qua các đối tượng, đọc thuộc tính, và ghi dữ liệu vào file. Để ghi dữ liệu vào Excel, ta có thể:

  1. Sử dụng COM Automation: Tạo một đối tượng Excel thông qua vlax-create-object "Excel.Application", sau đó tạo workbook, worksheet và ghi dữ liệu vào các ô.
  2. Ghi file CSV: Đơn giản hơn, ta có thể viết dữ liệu vào một file CSV mà Excel có thể mở ngay. Đây là cách nhẹ nhàng và tránh phụ thuộc vào COM.

Trong bài viết này, chúng ta sẽ triển khai cả hai phương pháp để bạn có thể chọn lựa phù hợp.

2. Chuẩn bị môi trường

2.1 Phiên bản AutoCAD

  • AutoCAD 2000 trở lên đều hỗ trợ AutoLISP. Tuy nhiên, phiên bản mới hơn (AutoCAD 2026, 2026, 2026…) thường có API mạnh hơn và hỗ trợ COM tốt hơn.
  • Kiểm tra tính năng “Automation” trong AutoCAD: Tools > Options > System > Application Options > Enable automation.

2.2 Cài đặt Excel và cấu hình

  • Đảm bảo rằng Microsoft Excel (bất kỳ phiên bản nào từ 2007 trở về sau) đã được cài đặt trong hệ thống. AutoLISP CULT COM sẽ cần một “COM component” của Excel.
  • Nếu bạn muốn xuất file CSV, không cần cài đặtliau.

2.3 Tạo một file lisp

  • Mở Notepad hoặc bất kỳ trình soạn thảo code nào.
  • Lưu file với phần mở rộng .lsp (ví dụ: export_text_to_excel.lsp).
  • Tải file này vào AutoCAD bằng lệnh APPLOAD.

3. Bước 1: Lập trình AutoLISP để lấy dữ liệu text

Trước khi xuất dữ liệu, chúng ta cần xác định những đối tượng nào sẽ được lấy. Trong AutoCAD, các đối tượng text có thể là:

  • TEXT: Đối tượng text đơn giản.
  • MTEXT: Đối tượng text đa dòng.
  • ATTRIB: Thuộc tính của block (thường chứa thông tin ký hiệu).
  • DIMENSION: Đối tượng kích thước (dimension), thường chứa chuỗi text hiển thị.

3.1 Hàm lấy tất cả đối tượng text

(defun c:GETALLTEXT (/ ss i ent txt) "Lấy toàn bộ chuỗi text từ bản vẽ và giữ trong một danh sách." (setq ss (ssget '((0 . "TEXT,MTEXT,ATTRIB,DIMENSION")))) (if ss (progn (setq i 0) (while (< i (sslength ss)) (setq ent (ssname ss i)) ( shutdown ) ; Đưa ra thông báo (setq txt (vla-get-textstring (vlax-ename->vla-object ent))) ; Nhận text (print txt) (setq i (1+ i))) (princ "\nTất cả text đã được lấy.") ) (princ "\nKhông tìm thấy text trong bản vẽ.") ) (princ)
)
  • ssget với filter (0 . "TEXT,MTEXT,ATTRIB,DIMENSION") sẽ chọn tất cả các loại text.
  • Hàm vla-get-textstring trả về chuỗi text cho đối tượng.
  • Hàm princ dùng để ghi ra màn hình trong AutoCAD.

3.2 molt: Lưu dữ liệu vào một danh sách

Để sắp xếp, chúng ta cần lưu dữ liệu vào một cấu trúc có thể sắp xếp. Một cách đơn giản là dùng danh sách פני (list) hoặc bảng (array). Dưới đây là ví dụ lưu vào một danh sách:

(defun c: Marketing () (setq textList '()) (setq ss (ssget '((0 . "TEXT,MTEXT,ATTRIB,DIMENSION")))) (if ss (progn (setq i 0) (while (< i (sslength ss)) (setq ent (ssname ss i)) (setq txt (vla-get-textstring (vlax-ename->vla-object ent))) (setq textList (cons txt textList)) ; Thêm vào danh sách (setq i (1+ i))) (princ "\nLưu xong danh sách text.") ) (princ "\nKhông có text.") ) (princ)
)

3.3 Lấy thông tin bổ sung

Lisp Xuất Text Từ Cad Sang Excel Theo Thứ Tự
Lisp Xuất Text Từ Cad Sang Excel Theo Thứ Tự

Nếu bạn muốn lấy thêm vị trí, màu sắc, kiểu font, bạn có thể mở rộng:

(setq txt (vla-get-textstring (vlax-ename->vla-object ent)))
(setq pos (vla-get-insertionpoint (vlax-ename->vla-object ent)))
(setq color (vla-get-color (vlax-ename->vla-object ent)))

Sắp xếp dữ liệu:

(setq textList (vl-sort textList '(lambda (a b) (< (atoi a) (atoi b)))))

Trong ví dụ trên, atoi là hàm chuyển chuỗi sang số. Nếu chuỗi là số, bạn có thể sắp xếp theo giá trị số.

4. Bước 2: Xuất dữ liệu sang Excel

4.1 Phương pháp 1: COM Automation

4.1.1 Khởi tạo Excel

(defun c:EXPORT_TO_EXCEL (/ xlApp xlBook xlSheet i txt pos color) (setq xlApp (vlax-create-object "Excel.Application")) (setq xlBook (vlax-invoke-method xlApp 'Workbooks 'Add)) (setq xlSheet (vlax-get-property xlBook 'Worksheets 1)) (setq i 1) ; Bắt đầu từ dòng đầu tiên (foreach txt textList (vlax-put-property xlSheet (list i 1) txt) ; Cột 1 (setq i (1+ i))) (vlax-invoke-method xlApp 'Visible true) ; Hiện Excel (princ "\nXuất dữ liệu sang Excel thành công.") (princ)
)
  • xlApp là đối tượng Excel.
  • xlBook là workbook mới.
  • xlSheet là worksheet đầu tiên.
  • vlax-put-property dùng để gán giá trị tới một ô ((row, column)).

4.1.2 Ghi dữ liệu chi tiết

Nếu bạn muốn ghi nhiều cột (ví dụ: text, vị trí, màu), hãy mở rộng:

(vlax-put-property xlSheet (list i 1) txt)
(vlax-put-property xlSheet (list i 2) (rtos pos 2 2))
(vlax-put-property xlSheet (list i 3) color)

4.1.3 Đóng Excel

Sau khi hoàn thành, bạn có thể lưu workbook:

(setq filePath "C:\\Users\\Public\\Documents\\output.xlsx")
(vlax-invoke-method xlBook 'SaveAs filePath)
(vlax ivory 'Quit xlApp)

4.2 Phương pháp 2: Ghi file CSV

4.2.1 Tạo file CSV

(defun c:EXPORT_TO_CSV (/ file csvLine i txt) (setq file (open "C:\\Users\\Public\\Documents\\output.csv" "w")) (setq i 0) (while (< i (length textList)) (setq txt (nth i textList)) (setq csvLine (strcat txt "," (itoa i))) ; Ví dụ: text và chỉ số (write-line csvLine file) (setq i (1+ i))) (close file) (princ "\nFile CSV đã được xuất.") (princ)
)
  • File CSV có thể mở trong Excel mà không cần chuyển đổi.

4.2.2 Định dạng phức tạp

Nếu cần nhiều cột, hãy nối chuỗi bằng dấu phẩy:

(setq csvLine (strcat txt "," (rtos pos 2 2) "," (itoa color)))

5. Bước 3: Sắp xếp dữ liệu theo thứ tự mong muốn

5.1 Sắp xếp theo thứ tự xuất hiện trên bản vẽ

Đối tượng ssget trong AutoCAD trả về danh sách theo thứ tự xuất hiện (trừ khi bạn thay đổi filter). Để giữ nguyên thứ tự, chỉ cần lấy dữ liệu từ ss mà chưa thực hiện sắp xếp.

5.2 Sắp xếp theo giá trị số trong text

Nếu text chứa số, bạn có thể sắp xếp:

(defun atoi (str) (read (vl-string-to-quote str))) ; Chuyển string thành số (setq textList (vl-sort textList '(lambda (a b) (< (atoi a) (atoi b)))))

5.3 Sắp xếp theo thuộc tính đặc biệt

Ví dụ: bạn muốn sắp xếp theo màu sắc:

(setq textList (vl-sort textList '(lambda (a b) (< (cdr (assoc 62 a)) (cdr (assoc 62 b))))))

Ở đây, assoc 62 lấy giá trị thuộc tính Fran color của đối tượng (màu trong AutoCAD).

6. Mẹo tối ưu hoá mã nguồn

  1. Đánh giá độ phức tạp: Đối với bản vẽ lớn, tránh lặp lại ssget nhiều lần. Lưu kết quả vào một biến.
  2. Sử dụng vlax-for: Thay vì vòng lặp while, vlax-for có thể dễ đọc hơn.
  3. Xử lý lỗi:අ always wrap COM calls trong vl-catch để tránh lỗi khi Excel không mở được.
  4. Giải phóng tài nguyên: vict or vlax-release-object để tránh rò rỉ bộ nhớ.
  5. Tùy biến: Bạn có thể thêm giao diện người dùng (dialog) để chọn file xuất, chọn cột dữ liệu, sắp xếp.

7. Kiểm thử và ví dụ thực tế

7.1 Kiểm thử

  • Mở AutoCAD và tải lệnh APPLOAD để import file export_text_to_excel.lsp.
  • Tạo một bản vẽ nhỏ với một vài đối tượng text, MTEXT, ATTRIB.
  • Gõ lệnh GETALLTEXT để kiểm tra xem dữ liệu có được lấy đúng không.
  • Gõ lệnh EXPORT_TO_EXCEL hoặc EXPORT_TO_CSV để xuất dữ liệu, sau đó mở file trong Excel để kiểm tra.

7.2 Trường hợp thực tế

Ký hiệu linh kiện trong bản vẽ điện: Mỗi linh kiện có một thuộc tính “Part No.” (text). Bạn muốn xuất danh sách linh kiện vào Excel, sắp xếp theo “Part No.” tăng dần. Lệnh ATTRIB sẽ trả về text. Sau khi sắp xếp, bạn có thể lưu file CSV và dùng Excel để tính tổng số lượng, so sánh với danh sách mua hàng.

8. Kết luận

Việc xuất dữ liệu text từ AutoCAD sang Excel theo thứ tự là một kỹ năng quan trọng giúp tăng năng suất và độ chính xác trong quy trình thiết kế. Bằng cách sử dụng AutoLISP kết hợp với COM Automation hoặc CSV, bạn có thể tự động hoá toàn bộ quy trình, giảm thiểu sai sót và tiết kiệm thời gian.

Các điểm chính của bài viết:

  • Trích xuất dữ liệu: Lọc các đối tượng text, MTEXT, ATTRIB, DIMENSION.
  • Sắp xếp dữ liệu: Dựa trên thứ tự xuất hiện, giá trị số, hoặc màu sắc.
  • Xuất ra Excel: COM Automation (đầy tính năng) hoặc CSV (đơn giản).
  • Tối ưu hoá: Tránh lặp lại ssget, xử lý lỗi, giải phóng tài nguyên.

Với những kiến thức này, bạn có thể tùy biến chương trình để phù hợp với bất kỳ yêu cầu nào trong dự án của mình. Hãy thử mở rộng các tính năng, ví dụ như:

  • Ghi dữ liệu vào nhiều worksheet khác nhau dựa trên nhóm đối tượng.
  • Tích hợp thêm tính năng lọc theo lớp (layer) hoặc thuộc tính đặc biệt.
  • Thêm giao diện người dùng để người dùng chọn tùy chọn xuất.

Chúc bạn thành công trong việc tự động hoá quá trình xuất dữ liệu từ CAD sang Excel!

⚠️
LƯU Ý QUAN TRỌNG: Miễn trừ trách nhiệm: Mặc dù chúng tôi luôn nỗ lực để đảm bảo tính chính xác và cập nhật của thông tin, nhưng các quy định về giáo dục và tuyển sinh có thể thay đổi theo thời gian. BigSchool không chịu trách nhiệm về bất kỳ sai sót nào hoặc kết quả phát sinh từ việc sử dụng thông tin trên trang này. Độc giả nên liên hệ trực tiếp với nhà trường hoặc cơ quan chức năng để có thông tin mới nhất. Ngoài ra, BigSchool tuyệt đối không bán sản phẩm, khóa học hay cung cấp dịch vụ được nhắc đến trong bài.

Viết một bình luận