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