你當(dāng)前的位置>>主頁(yè)>>AutoCAD>>AutoCAD二次開(kāi)發(fā)
 
                        AutoCAD普通表格轉(zhuǎn)換為表格對(duì)象的方法
 

               吳偉中, 賈長(zhǎng)學(xué)
       ( 河南工業(yè)大學(xué)機(jī)電工程學(xué)院, 鄭州450007)
    
摘要: 表格是A utoC A D 新引入的對(duì)象類型, 使繪制和編輯表格變得相當(dāng)簡(jiǎn)單。文中介紹了把用直線和文字制成的
“表格”轉(zhuǎn)換成表格對(duì)象的原理和方法, 并給出了轉(zhuǎn)換的流程。
    
關(guān)鍵詞: 表格對(duì)象; A utoC A D ; 二次開(kāi)發(fā); A ctiveX 技術(shù)
    表格( Table) 是AutoCAD 自2005 版開(kāi)始新引入的對(duì)象, 給工程圖樣中各類表格的繪制和編輯帶來(lái)了極大的方便, 同時(shí)表格對(duì)象與Excel 工作表的相互轉(zhuǎn)換也相當(dāng)簡(jiǎn)單。早期用一般方式繪制的“表格”僅在外觀上和表格對(duì)象類似, 但不具備表格對(duì)象的特性, 不能用相關(guān)的表格命令修改, 也不能直接輸出到Excel, 而在實(shí)際設(shè)計(jì)中, 經(jīng)常要在已有圖紙基礎(chǔ)上修改,  由此想到, 若能把普通的“表格”轉(zhuǎn)換為表格對(duì)象將給以后的設(shè)計(jì)帶來(lái)許多便利。
    本文利用AutoCAD 的ActiveX 技術(shù), 用Visual LISP 編程, 實(shí)現(xiàn)了將普通"表格"轉(zhuǎn)換為表格對(duì)象。
    1. 普通“表格”繪制的方法
    工程圖中m×n 行列型的“表格”較為常見(jiàn), 如明細(xì)欄、材料匯總表等, 這類表格的特點(diǎn)是行、列關(guān)系比較單一,文字的規(guī)律性強(qiáng)。AutoCAD 2005 版之前, 繪制“表格”一般采用以下幾種方法:
  ( 1) 用LINE 或PLINE 繪制表格線框, 然后在線框的單元格內(nèi)填寫單行或多行文字( TEXT 或MTEXT) 形成“表格”;
  ( 2) 用第三方制作的表格專用工具繪制表格;
  ( 3) 在Excel 中處理表格, 再用專門工具轉(zhuǎn)換或直接粘貼到AutoCAD 中。
   以上( 2) 、( 3) 兩種方式因?yàn)槎家玫綄iT開(kāi)發(fā)的表格工具, 繪制的"表格"格式和特性是程序制訂的。第( 1) 種方法較為常用, 為多數(shù)用戶采用, 故此是本文討論的重點(diǎn)。
    2. “表格”轉(zhuǎn)換為表格對(duì)象的方法
    在單行( 多行) 文字和線條組成的“表格”中, 文字是組成表格的主要角色, 表格線條屬于輔助性的元素, 在轉(zhuǎn)換過(guò)程中可以忽略。因此, 表格轉(zhuǎn)換的實(shí)質(zhì)就是將原“表格”中的文字轉(zhuǎn)換到新創(chuàng)建的表格對(duì)象中, 并放置在對(duì)應(yīng)的單元格內(nèi)。文字的樣式、對(duì)齊方式、顏色、圖層、高度以及表格樣式等可保留原有設(shè)置, 或者采用當(dāng)前的圖形設(shè)置。
    2.1 文字插入點(diǎn)坐標(biāo)的獲取
在Visual LISP 中, 可用ENTGET 方法通過(guò)圖元名取得文字的構(gòu)造參數(shù)表, 例如:
  ( ( - 1.<圖元名: 7e60fdd0>)( 0.TEXT)( 330.<圖元名:7efd8cc0>)( 5.2904A)( 100.AcDbEntity)( 67.0)( 410. Model)( 8.TXT)( 100.AcDbText)( 10 15 20 0.0)( 40. 14.0)( 1.進(jìn)汽包)( 50.0.0)( 41.1.0)( 51.0.0)( 7.GBCBIG)( 71.0)( 72.0)( 110.0 0.0 0.0)( 210 0.0 0.0 1.0)( 100.AcDbText) ( 73.0) )
  其中,( 0. TEXT) 表示這是一TEXT 對(duì)象,( 8.TXT)表示所在圖層為“TXT”,( 10 15 20 0) 表示文本的插入點(diǎn)坐標(biāo)為( 15, 20, 0) ,( 1.進(jìn)汽包) 表示文字內(nèi)容。由此可見(jiàn),只要抽取文字的有關(guān)信息( 插入點(diǎn)坐標(biāo)、文本內(nèi)容、圖層、文字樣式等) 建立原始數(shù)據(jù)表( LISP 表) , 再以插入點(diǎn)坐標(biāo)為關(guān)鍵元素, 對(duì)表中的信息進(jìn)行分析、篩選, 即可將該表重構(gòu)為包含行數(shù)、列數(shù)、文字內(nèi)容及對(duì)應(yīng)行列信息的表格對(duì)象所需的新表。
    2.2 表格轉(zhuǎn)換的方法
如上所述, 取得文字信息數(shù)據(jù)后, 即可根據(jù)文字插入點(diǎn)的坐標(biāo)來(lái)判定表格的行數(shù)和列數(shù)以及文字的歸屬, 即判定文字位于哪個(gè)單元格。
    2.2.1 總行數(shù)和列數(shù)的判定
   表格的行數(shù)、列數(shù)可以由用戶輸入, 但從方便用戶操作的角度看, 由程序自動(dòng)判斷行數(shù)和列數(shù)顯然更人性化。對(duì)不存在空白單元格的“表格”, 判斷方法比較簡(jiǎn)單, 只要多個(gè)文字具有相同的y 坐標(biāo)則判定為同屬一行, 具有相同的x 坐標(biāo)則判定為同屬一列。但是實(shí)際的表格中往往存在空白單元格, 不能簡(jiǎn)單的采用以上辦法, 需加以改進(jìn)。
   假設(shè)抽取文字的插入點(diǎn)x, y 坐標(biāo)和內(nèi)容text 三要素作為子表, 構(gòu)建如下形式的數(shù)據(jù)模型表tb_list:
( ( x1 y1 text1)( x2 y2 text2)( x3 y3 text3) ?( xn yn textn) )
   根據(jù)表格文字的每一行具有相同的y 坐標(biāo)、每一列具有相同的x 坐標(biāo)這一特點(diǎn), 遍歷tb_list 表, 統(tǒng)計(jì)表中每個(gè)y 坐標(biāo)、x 坐標(biāo)出現(xiàn)的次數(shù)m、n, 即為表格的總行數(shù)m和總列數(shù)n。判定流程參見(jiàn)圖1。
    由于繪圖的不規(guī)范性, 表格內(nèi)同一行文字的y 坐標(biāo)或同一列行文字的x 坐標(biāo)可能存在一定的偏差, 故此需設(shè)置容差機(jī)制, 比如以字高的一半作為閾值, 只要文字插入點(diǎn)的x、y 坐標(biāo)在允許誤差范圍以內(nèi), 則可以認(rèn)定其同屬一行或同屬一列。

     
     在排序后的tb_list 中, 每一個(gè)子表( xi yj textij) 均與單元格( i j) 相對(duì)應(yīng)。據(jù)此, 先用object.AddTable 方法創(chuàng)建新的表格對(duì)象, 再?gòu)膖b_list 表中分離得到按單元格列順序排列的文字, 將其填充到對(duì)應(yīng)的單元格中即完成了表格對(duì)象的轉(zhuǎn)換。原始表格根據(jù)需要可以刪除或保留。
    圖2 為轉(zhuǎn)換流程圖。為簡(jiǎn)潔計(jì), 省去了出錯(cuò)檢查、特殊情況分析判斷等輔助流程。
      

     2.3 “表格”的預(yù)處理
   有些普通“表格”在繪制時(shí)可能不是很規(guī)范, 為了降低表格轉(zhuǎn)換的難度, 提高轉(zhuǎn)換的效率和準(zhǔn)確性, 在表格轉(zhuǎn)換之前可對(duì)原始普通表格進(jìn)行預(yù)處理, 處理措施包括文字的行對(duì)齊、列對(duì)齊、文字樣式和對(duì)正方式的統(tǒng)一、同一單元格內(nèi)的多個(gè)文字對(duì)象合并成一個(gè)對(duì)象等。如果有必要, 也可將所有的文字全部轉(zhuǎn)換成MEXT 或TEXT 一種類型, 這是因?yàn)閱涡形淖趾投嘈形淖钟胁顒e, 混合處理有可能產(chǎn)生誤判。文字預(yù)處理可以通過(guò)對(duì)象特性對(duì)話框, 結(jié)合FILTER、特性匹配等工具手動(dòng)進(jìn)行, 也可以編制程序自動(dòng)處理, 具體算法從略。
    當(dāng)然, 如果不對(duì)“表格”進(jìn)行規(guī)范化預(yù)處理也是可以的, 但是需要修改以上表格轉(zhuǎn)換的算法, 由于要考慮如何處理可能出現(xiàn)的各種不規(guī)范情況, 程序的算法將變得更加復(fù)雜。由此可見(jiàn), 制圖越規(guī)范, 后期對(duì)圖形數(shù)據(jù)的處理和再利用就越簡(jiǎn)單, 效率越高, 因此規(guī)范化的設(shè)計(jì)是應(yīng)予高度重視的一項(xiàng)重要措施。
     3. 結(jié)語(yǔ)
    利用ActiveX 技術(shù)進(jìn)行二次開(kāi)發(fā), 實(shí)現(xiàn)了把用LINE( 或PLINE) 和TEXT( 或MTEXT) 命令繪制的普通“表格”轉(zhuǎn)換為AutoCAD 的表格對(duì)象, 為以后高效、快捷地進(jìn)行表格操作創(chuàng)造了條件, 因此具有較高的實(shí)用價(jià)值。本文只針對(duì)常見(jiàn)的表格形式給出了轉(zhuǎn)換的算法, 在此基礎(chǔ)上修改、完善, 可實(shí)現(xiàn)將其它形式的"表格"轉(zhuǎn)換為表格對(duì)象。

   [ 參考文獻(xiàn)]
[ 1] 朱玉.用VBA 實(shí)現(xiàn)Excel 電子表格到AutoCAD 表格的轉(zhuǎn)換[ J] .機(jī)床與液壓, 2004( 12) : 176- 178.
[ 2] 陳伯雄, 馮偉.Visual LISP 程序設(shè)計(jì)技巧與范例[ M] .北京.人民郵電出版社, 2003.
[ 3] 杜平安.AutoCAD 明細(xì)表自動(dòng)導(dǎo)入Excel 的實(shí)現(xiàn)方法[ J] .工程圖學(xué)學(xué)報(bào), 2003( 1) : 50- 56. ( 編輯明濤)

民眾工作室.制作      版權(quán)所有