2013年1月30日 星期三

Autolisp 欄位轉成多行文字 Field to MText

寫這個程式的原因是之前寫了將標註尺寸對應到欄位的程式,在繪圖下料時使用,能減少許多錯誤 (尺寸變化文字就變化)。

問題是有些人使用免費的CAD 如 DraftSight,在讀取 AutoCAD 檔案時,附加的欄位屬性會變成文字公式......



網路上找了許多版本,好像都蠻失敗的,欄位轉成多行文字,這轉換上似乎有點困難。但是如果使用MText 做為加入資料自動計算的欄位,炸開就可以了很簡單的回復成一般的文字物件,而且很正常,缺點是會變成單行文字。

那需要做的事簡單的說就是

1. 在選取時僅選中欄位文字 ( FieldMText )
2. 炸開欄位文字 ( FieldMText ) 並取回被炸開的 ( Text ) 物件
3. 再將  ( Text ) 物件 轉回 MText



(defun c:exf ()
  (prompt
    "\n注意!!這程式會炸開所有欄位"
  )
  (setq ss (ssget))
  (setq ss (SSEntTyp ss 0 "MTEXT"))
  (setq ss (SSEntTyp ss 102 "{ACAD_XDICTIONARY")) ;;選取欄位文字物件
  (setvar "qaflags" 1)
  (if (and (/= nil ss) (/= 0 (sslength ss)))
    (setq ss (ExplodeAndGetExplodedObject ss)) ;;炸開並取回炸開物件
  )
  (SScvMtext ss) ;;將被炸開的物件轉回多行文字
  (setvar "qaflags" 0)
  (princ)
)


;;;*************************   只選取欄位文字物件    **********************
(defun SSEntTyp (SSrex index entype /  n endata enNamen ssExcluded result)
   (if (/= SSrex nil)
     (progn
       (setq ssExcluded (ssadd))
       (setq n 0)
       (repeat (sslength SSrex)
     (setq enNamen (ssname SSrex n))
     (setq endata (entget enNamen))
     (if (= (cdr (assoc index endata)) entype)
       (progn
        (print entype)
        (print (cdr (assoc index endata)))
            (setq ssExcluded (ssadd enNamen ssExcluded))
       )
     )
     (setq n (+ n 1))
       )
     )
   )
          (setq result ssExcluded)
)

;;;***********************  炸開並取回炸開物件 **************************
(defun ExplodeAndGetExplodedObject (SS          /         i
                   n          enNameI     enNameN
                   ssuni      ssuni2     ssExclude
                   ssexploded result
                  )
  (if (/= SS nil)
    (progn
      (setq ssuni (ssget "x"))
      (setq i 0)
      (repeat (sslength SS)
    (setq enNameI (ssname SS i))
    (setq ssExclude (ssdel enNameI ssuni))
    (setq i (+ 1 i))
      )
      (setvar "qaflags" 1)
      (command "explode" SS "")
      (setvar "qaflags" 2)
      (setq ssuni2 (ssget "x"))
      (setq n 0)
      (repeat (sslength ssExclude)
    (setq enNameN (ssname ssExclude n))
    (setq ssexploded (ssdel enNameN ssuni2))
    (setq n (+ 1 n))
      )
    )
    (exit)
  )
  (setq result ssexploded)
)


;; ********* 轉換成 Mtext 副程式 ************
(defun SScvMtext( SS / )
  (if (/= ss nil)
    (progn
      (setq len (sslength ss))
      (while (> len -1)
 (setq txtName (ssname ss len))
 (command "txt2mtxt" txtName "");; 呼叫 express 程式
 (setq len (- len 1))
      )
     )
   )
)


就是這樣間接的將欄位 ( Field-MText ) 轉成多行文字 ( MText )

相關文章

http://wildkidblog.blogspot.tw/2012/10/autocad.html
http://wildkidblog.blogspot.tw/2010/07/autocad.html
http://wildkidblog.blogspot.tw/2010/08/autolisp-exclude-entites-from-selection.html

沒有留言:

張貼留言