Chuyển chữ từ autocad sang excel dùng VBA

Liên hệ QC

lephuonganh

Thành viên mới
Tham gia
13/5/12
Bài viết
5
Được thích
1
Em muốn dùng VBA trong AutoCad để chuyển tất cả các chữ trong tập tin AutoCad đang mở sang Excel. Về mở Excel từ AutoCad và dán chữ vào các ô trong sheet thì em làm được. Nhưng em không biết làm sao moi được hết các chữ trong AutoCad (không phải chỉ đọc các chữ được chọn). Anh chị giúp em đoạn code đọc hết các chữ trong AutoCad với. Em cám ơn anh chị.
 
Đây nè(mình vào máy tính lục tìm mãi mới thấy file trước viết):
Bạn vào chạy code nếu thấy báo lỗi thì tìm tham chiếu tới bản Excel cho phù hợp nhé!
 

File đính kèm

  • ExcelLink.zip
    63.8 KB · Đọc: 233
QUên mất đây là code mình viết khá lâu rồi nên vừa kiểm tra lại thấy code chỉ làm việc khi Excel đang mở và khi xử dụng mình không đặt trong hàm ConnectExcel() biến ExcelServer để giải phóng bộ nhớ nên có khi sẽ tràn bộ nhớ. Mình đã sửa trong file đính kèm
giờ code có thể dùng để gọi khi Excel chưa mở
 

File đính kèm

  • ExcelLink.zip
    90.6 KB · Đọc: 203
Em muốn dùng VBA trong AutoCad để chuyển tất cả các chữ trong tập tin AutoCad đang mở sang Excel. Về mở Excel từ AutoCad và dán chữ vào các ô trong sheet thì em làm được. Nhưng em không biết làm sao moi được hết các chữ trong AutoCad (không phải chỉ đọc các chữ được chọn). Anh chị giúp em đoạn code đọc hết các chữ trong AutoCad với. Em cám ơn anh chị.

Việc đọc ra các chuỗi thực ra không khó và bạn phan ngoc lan đã chỉ ra.
Bản thân tôi thì kiểm tra "ObjectName". Vd.
Mã:
Sub DocText()
Dim count As Long, k As Long
Dim acadMS As AcadModelSpace
Dim acadE As AcadEntity
    Set acadMS = ThisDrawing.ModelSpace
    count = acadMS.count
    For k = 0 To count - 1
        Set acadE = acadMS.Item(k)
        If (acadE.ObjectName = "AcDbMText") Then    'or (acadE.ObjectName = "AcDbText") Then
            [COLOR=#ff0000]' làm gì đó với  acadE.textString[/COLOR]
        End If
    Next k
    Set acadE = Nothing
    Set acadMS = Nothing
End Sub
cũng có thể dùng
Mã:
Sub Test()
Dim SS As AcadSelectionSet
Dim objEnt As AcadEntity
Dim s As String, k As Long
    On Error Resume Next
    Set SS = ThisDrawing.SelectionSets.Add("SS_cua_rieng_toi")
    SS.Select acSelectionSetAll
     
    For i = 0 To SS.count - 1
        Set objEnt = SS(i)
        If (objEnt.ObjectName = "AcDbText") Or (objEnt.ObjectName = "AcDbMText") Then
            [COLOR=#ff0000]' làm gì đó với objEnt.textString[/COLOR]
        End If
    Next i
    
    Set objEnt = Nothing
    SS.Delete
    Set SS = Nothing
End Sub
Nhưng đấy mới chỉ là 1 / 3, 1 / 4 công việc. Ta phải lường được trường hợp (bản vẽ của bạn phan ngoc lan đơn giản nên không có th này) khi TextString trả về vd. 1 chuỗi như:
{\f.VnArial|b1|i0|c0|p34;\H1.2x;TBA - XC§ - Hîp khei trän bé\H0.83333x;\PCEp ®iÖn khu vuc x­ëng SC c¬ ®iÖn\PP® \fISOCPEUR|b1|i0|c0|p34;\H1.2x;?\H0.83333x; \f.VnArial|b1|i0|c0|p34;279 kW,\f.VnArial|b0|i0|c0|p34; \f.VnArial|b1|i0|c0|p34;Ptt \fISOCPEUR|b1|i0|c0|p34;\H1.2x;?\H0.83333x; \f.VnArial|b1|i0|c0|p34;132 kW}
bởi nhập cái này vào sheet thì cũng vô dụng thôi. Giá tri kiểu trên ngoài chữ ra còn chứa các thông tin khác. Như vậy còn 2 việc khó nữa là:
1. Lọc chữ từ dữ liệu TextString
2. Với mỗi chuỗi trả về phải đọc được nó dùng phông chữ gì. Chả nhẽ với hàng trăm giá trị trả về sau khi nhập vào sheet lại phải đoán phông chữ và thiết lập "bằng tay" phông chữ cho từng ô (trong bản vẽ các chữ này có thể dùng những phông chữ khác nhau)?
Ngoài ra nếu đọc được phông chữ thì ta cũng có thể (nếu cần) convert các chuỗi sang vd. unicode rồi mới nhập vào sheet.
 
Vấn đề anh siwtom đưa ra cũng thực tế. Trong AutoCad, một số kiểu hiển thị định dạng dữ liệu mang đặc thù. Do vậy, việc nhận dạng để chuyển đổi cho đúng kiểu không hề đơn giản.
 
Vấn đề anh siwtom đưa ra cũng thực tế. Trong AutoCad, một số kiểu hiển thị định dạng dữ liệu mang đặc thù. Do vậy, việc nhận dạng để chuyển đổi cho đúng kiểu không hề đơn giản.

Tôi tìm được code viết dùng lisp.
Mã:
;;;=======================[ Strip_Text.lsp ]=====================
;;; Author:  Charles Alan Butler Copyright© 2005-2007 
;;; Version: 2.3  Jan. 26, 2006
;;; Version: 3.0  Jun. 19, 2007
;;; Purpose: Strip format characters from text or mtext string
;;; Returns: A string  
;;; Sub Routines: -None
;;; Arguments: A string variable to remove formats from & Flag string of formats to remove
;;; Format Flag:
;;;   *    Remove All Formats found
;;;   A    Alignment
;;;   C    Color
;;;   F    Font
;;;   H    Height
;;;   L    Underscore
;;;   O    Overscore
;;;   P    Linefeed (Paragraph)  **** ??
;;;   Q    Obliquing
;;;   S    Spacing (Stacking)
;;;   t    Tabs
;;;   T    Tracking
;;;   W    Width
;;;   ~    Non-breaking Space
;;;   %    Plain Text Formatting
;;   
;;;======================================================================
(defun strip_text (str fmt / skipcnt ndx newlst char fmtcode lst_len
                   IS_MTEXT LST  NEXTCHR PT TMP)
  (if (or (/= (type fmt) 'Str) (= fmt "*") (= fmt ""))
   (setq fmt (vl-string->list "AaCcFfHhLlOoPpQqSsTtQqWw~%"))
   (setq fmt (vl-string->list fmt))
  )
  (setq ndx 0
        ;; "fmtcode" is a list of code flags that will end with ; 
        fmtcode
         (vl-string->list "CcFfHhTQqWwAa") ;("\C" "\F" "\H" "\T" "\Q" "\W" "\A")
  )
  (if (/= str "") ; skip if empty text ""
    (progn
      (setq lst      (vl-string->list str)
            lst_len  (length lst)
            newlst   '()
            is_mtext nil ; true if mtext
      )
      (while (< ndx lst_len)
        ;; step through text and find FORMAT CHARACTERS
        (setq char    (nth ndx lst) ; Get next character
              nextchr (nth (1+ ndx) lst)
              skipcnt 0
        )
        (cond
          ((and (= char 123) (= nextchr 92)) ; "{" mtext code
           (setq is_mtext t
                 skipcnt 1
           )
          )
          ((and (= char 125) is_mtext) ; "}"
           (setq skipcnt 1)
          )
          ((= char 37) ; code start with "%"
           (if (null nextchr) ; true if % is last char in text
             (setq skipcnt 1)
             ;;  Dtext codes
             (if (= nextchr 37) ; %% code found 
               (if (< 47 (nth (+ ndx 2) lst) 58) ; is a number
                 (if (vl-position 37 fmt)
                 ;;  number found so fmtcode %%nnn
                 ;;  convert the nnn to a character
                 (setq skipcnt 5
                       newlst  (append newlst (list (atoi (strcat (chr (nth (+ ndx 2) lst))
                                                                  (chr (nth (+ ndx 3) lst))
                                                                  (chr (nth (+ ndx 4) lst))
                 )))))
                   ;;  keep the code in the string
                   (setq skipcnt 5
                         newlst  (append newlst (list 37 37 (nth (+ ndx 2) lst)
                                                            (nth (+ ndx 3) lst)
                                                            (nth (+ ndx 4) lst)
                   )))
                 )              
                 ;; else letter code, so fmtcode %%p, %%d, %%c
                 ;;  CAB note - this code does not always exist in the string
                 ;;  it is used to create the character but the actual ascii code
                 ;;  is used in the string, not the case for %%c
                 (if (vl-position 37 fmt)
                 (setq skipcnt 3
                       newlst  (append newlst (list (cond ((= (nth (+ ndx 2) lst) "p") 177)
                                                          ((= (nth (+ ndx 2) lst) "d") 176)
                                                          ((= (nth (+ ndx 2) lst) "c") 216)
                                                          ((= (nth (+ ndx 2) lst) "%")  37)
                 ))))
                 (setq skipcnt 3
                       newlst  (append newlst (list 37 37 (nth (+ ndx 2) lst)
                 )))
                 )
               ) ; endif
             ) ; endif
           ) ; endif
          ) ; end cond (= char "%"))
          ((= char 92) ; code start with "" 
           ;;  This section processes mtext codes
           (cond
             ;; Process Coded information
             ((null nextchr) ; true if \ is last char in text
              (setq skipcnt 1)
             ) ; end cond 1
             ((member nextchr fmtcode) ; this code will end with ";"
              ;; fmtcode -> ("\C" "\F" "\H" "\T" "\Q" "\W" "\A"))
              (while (/= (setq char (nth (+ skipcnt ndx) lst)) 59)
                (setq skipcnt (1+ skipcnt))
              )
              (setq skipcnt (1+ skipcnt))
             ) ; end cond 
             ;; found \U then get 7 character group
             ((= nextchr 85) (setq skipcnt (+ skipcnt 7)))
             ;; found \M then get 8 character group
             ((= nextchr 77) (setq skipcnt (+ skipcnt 8)))
             ;; found \P then replace with CR LF 13 10
             ;;  debug do not add CR LF, just remobe \P
             ((= nextchr 80) ; "\P"
              (if (vl-position 80 fmt)
                (setq newlst  (append newlst '(32))
                      ;ndx     (+ ndx 1)
                      skipcnt 2
                )
              )
             ) ; end cond 
             ((= nextchr 123) ; "\{" normal brace
              (setq ndx (+ ndx 1))
             ) ; end cond 
             ((= nextchr 125) ; "\}" normal brace
              (setq ndx (+ ndx 1))
             ) ; end cond 
             ((= nextchr 126) ; "\~" non breaking space
              (if (vl-position 126 fmt)
                (setq newlst (append newlst '(32)) ; " "
                      skipcnt 2) ; end cond 9
              )
             )
             ;; 2 character group \L \l \O \o
            ((member nextchr '(76 108 79 111)) 
              (setq skipcnt 2)
             ) ; end cond 
             ;;  Stacked text format as "[ top_txt / bot_txt ]"
             ((= nextchr 83) ; "\S"
              (setq pt  (1+ ndx)
                    tmp '()
              )
              (while
                (not
                  (member
                    (setq tmp (nth (setq pt (1+ pt)) lst))
                    '(94 47 35) ; "^" "/" "#" seperator
                  )
                )
                 (setq newlst (append newlst (list tmp)))
              )
              (setq newlst (append newlst '(47))) ; "/"
              (while (/= (setq tmp (nth (setq pt (1+ pt)) lst)) 59) ; ";"
                (setq newlst (append newlst (list tmp)))
              )
              (setq ndx     pt
                    skipcnt (1+ skipcnt)
              )
             ) ; end cond 
           ) ; end cond stmt  Process Coded information
          ) ; end cond  (or (= char "\")
        ) ; end cond stmt
        ;;  Skip format code characters
        (if (zerop skipcnt) ; add char to string
          (setq newlst (append newlst (list char))
                ndx    (+ ndx 1)
          )
          ;;  else skip some charactersPLOTTABS
          (setq ndx (+ ndx skipcnt))
        )
      ) ; end while Loop
    ) ; end progn
  ) ; endif
  (vl-list->string newlst) ; return the stripped string
)
 
Lần chỉnh sửa cuối:
Web KT

Bài viết mới nhất

Back
Top Bottom