摘要:PKPM是結(jié)構(gòu)設(shè)計(jì)中最為常用的軟件。對(duì)PKPM的深層次研究在幫助我們理解軟件意圖的同時(shí),也可以為我們的設(shè)計(jì)工作帶來很大的便利。本文通過對(duì)PKPM軟件中通用的*.t文件格式圖形的原始數(shù)據(jù)進(jìn)行研究,初步掌握了T文件的二進(jìn)制數(shù)據(jù)結(jié)構(gòu)。以此,我們可以直接對(duì)T文件進(jìn)行編輯和打印輸出而不借助PKPM軟件平臺(tái)。進(jìn)一步作為應(yīng)用舉例,本文介紹了如何利用以上二進(jìn)制數(shù)據(jù)進(jìn)行打印的思想原理,并編寫了T文件的通用批量打印程序,大大簡(jiǎn)化了打印結(jié)構(gòu)計(jì)算書時(shí)原本繁復(fù)的操作流程。
關(guān)鍵字:PKPM,T文件,數(shù)據(jù)格式,打印
中圖分類號(hào):C37文獻(xiàn)標(biāo)識(shí)碼:A
0概述
在PKPM中,二維模型與結(jié)果圖形默認(rèn)以*.t格式的文件保存(下稱T文件)。該文件為二進(jìn)制格式,只可以通過PKPM軟件中本身集成的程序進(jìn)行編輯和打印輸出操作。T文件缺乏廣泛的第三方支持。同時(shí),官方的*.t、*.dwg格式圖形的單向轉(zhuǎn)換程序功能單一,并不滿足大批量打印的操作需求。PKPM曾提供Modify模塊的二次開發(fā)接口[1],然而由于軟件強(qiáng)制,市面上以此開發(fā)的應(yīng)用難覓蹤跡,現(xiàn)在PKPM技術(shù)熱線也基本停止了對(duì)二次開發(fā)的支持。
結(jié)構(gòu)設(shè)計(jì)中,生成計(jì)算書需要對(duì)T文件的圖形結(jié)果進(jìn)行打印輸出。對(duì)此,常規(guī)操作是在PMCAD、SATWE模塊中依次打開各層結(jié)果逐一進(jìn)行打印。網(wǎng)上另有兩種批量打印計(jì)算書的方法:1)用PKPM自帶功能將T文件逐一轉(zhuǎn)換成*.dwg文件,經(jīng)過統(tǒng)一設(shè)置后,尋求非專用的批量打印DWG圖形的軟件進(jìn)行打印。這種方法要求本機(jī)必須安裝PKPM,該功能會(huì)由于調(diào)用庫(kù)和第三方控件的問題無法做到綠色化,故而無法在移植的計(jì)算機(jī)上使用;2)采用基于AutoCAD環(huán)境的ARX程序,轉(zhuǎn)化成DWG圖形后進(jìn)行打印。這些ARX程序可能是探索者等基于CAD開發(fā)的的軟件抽取出來的,因此采用這種方法就要求安裝指定版本的AutoCAD環(huán)境,也比較麻煩。
本文旨在直接對(duì)T文件的二進(jìn)制數(shù)據(jù)進(jìn)行識(shí)別,分析出其中暗含的圖元對(duì)象和相關(guān)屬性,以便于后續(xù)直接進(jìn)行編輯和打印輸出。這種思路的優(yōu)點(diǎn)是,可以省去轉(zhuǎn)化為DWG圖形的中間步驟,避免中間轉(zhuǎn)化過程中不同格式圖形所預(yù)定義的語義偏差造成的誤差;同時(shí),可以完全不依賴PKPM軟件和AutoCAD環(huán)境,即可以在沒有PKPM授權(quán)和AutoCAD的電腦上直接對(duì)*.t文件進(jìn)行編輯和打印輸出。通過這種思路,我們可以編寫第三方打印程序和可視化編輯器,并提供T圖轉(zhuǎn)化為任意可行的圖形格式的接口函數(shù)。由于PKPM集成自帶的編輯器足以夠用,而且編寫第三方編輯器較為復(fù)雜,實(shí)用性可行性不強(qiáng)。本文僅示例編寫T文件的直接打印程序。
1數(shù)據(jù)結(jié)構(gòu)分析
1.1文件結(jié)構(gòu)
T文件是基于二進(jìn)制格式存儲(chǔ)的數(shù)據(jù)文件。通過WinHex初步分析所有數(shù)據(jù)都是明文存儲(chǔ),并未采用算法進(jìn)行加密,否則對(duì)T文件的分析將會(huì)極其困難。文件不存在文件頭,并未指定文件格式版本、打開所需的應(yīng)用程序最低版本、哈希校驗(yàn)等信息。文件是大量記錄的順序堆放,即:
............
經(jīng)過完整分析并沒有一個(gè)集中數(shù)據(jù)區(qū)塊是供跳轉(zhuǎn)查詢用的堆棧。每一條記錄代表一個(gè)圖元或者一條設(shè)置指令,都依循著固定的格式。順序堆放的指令記錄只對(duì)后續(xù)的其他指令和圖元有效,同時(shí),文件中存在相當(dāng)數(shù)量的已然失效的指令記錄,這兩點(diǎn)類似命令流語句。依據(jù)這種數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),T文件圖形實(shí)現(xiàn)撤銷(UNDO)操作不難。
1.2版本控制
前一節(jié)指出,T文件中并不存在文件頭以定義版本信息。進(jìn)一步分析發(fā)現(xiàn),T文件的版本是通過各記錄本身格式實(shí)現(xiàn)定義的。通用的單個(gè)記錄結(jié)構(gòu)為:
{[結(jié)構(gòu)標(biāo)識(shí)][數(shù)據(jù)實(shí)體][結(jié)構(gòu)標(biāo)識(shí)]}
PKPM2010中,SATWE模塊生成的T文件中,所有記錄的結(jié)構(gòu)標(biāo)識(shí)均為{xxxxFCFF},其中xxxx字段標(biāo)示了該記錄的類型編號(hào),部分記錄類型編號(hào)如表1所示。TCAD中生成的記錄均為{xxxx34FF},PMCAD模塊中生成的兩種版本的記錄均有。在更老版本的PKPM中,結(jié)構(gòu)標(biāo)識(shí)均為{xxxx}。
表1部分類型編號(hào)定義
不同版本的記錄后續(xù)數(shù)據(jù)實(shí)體的格式有所不同,但是有共性的屬性和字段定義。對(duì)于常用的以{xxxx34FF}和{xxxxFCFF}標(biāo)示的記錄,后續(xù)的數(shù)據(jù)實(shí)體主要包含如下幾部分定義:1)全局索引;2)分組;3)標(biāo)識(shí)碼;4)保留位;5)數(shù)據(jù)區(qū)。下文將舉例介紹部分圖元與指令實(shí)體的詳細(xì)數(shù)據(jù)結(jié)構(gòu)。
1.3圖元詳細(xì)結(jié)構(gòu)解析
下面簡(jiǎn)單舉例介紹不同類型的圖元對(duì)象的詳細(xì)數(shù)據(jù)結(jié)構(gòu)
1.直線(0x0002)
2.字符(0x0008,0x0009)
1.4指令詳細(xì)結(jié)構(gòu)解析
2打印原理
打印的基本思想就是指示打印機(jī)如何正確地把所有可視化對(duì)象繪制到打印紙的合理位置。本文利用C#語言編寫程序?qū)η耙还?jié)獲取的圖元進(jìn)行打印。我們利用打印類封裝的System.Drawing.Printing.PrintPageEventArgs
類型的參數(shù)進(jìn)行配置,可獲取以及指定打印紙張、頁面布局等基本信息。此處需要注意的是,默認(rèn)的紙張尺寸單位是1/100英寸,圖元的繪制時(shí)繪圖空間須進(jìn)行比例換算。隨后利用封裝參數(shù)獲取Graphics對(duì)象,匹配合理的畫筆、圖刷、線型等信息進(jìn)行繪圖。
打印繪圖中需要注意的主要過程:
1)讀取二進(jìn)制的t圖,進(jìn)行數(shù)據(jù)識(shí)別,對(duì)圖元進(jìn)行定位,界定最大邊界范圍。
2)根據(jù)紙張尺寸,對(duì)t圖中所有的對(duì)象的定位和尺寸大小確定縮放比例。幾何圖形按實(shí)際比例縮放確定,對(duì)于文字,有兩種思路,方法一,同幾何圖形按照實(shí)際定義的大小進(jìn)行繪制,方法二,模仿CAD中設(shè)置有繪圖和打印兩種比例以保證真實(shí)紙張上的字體不會(huì)顯得太小。由于計(jì)算書為A3或A4白圖,本文采用第一種方法。對(duì)于宋體等非等寬字體,須在內(nèi)存中預(yù)先繪制文字以測(cè)量其實(shí)際尺寸,同時(shí)須修改最大邊界;而等寬字體如CourierNew等不需要進(jìn)行預(yù)先繪制。如此,就建立了從圖紙到實(shí)際白紙上的單位換算問題。
3)坐標(biāo)換算。這個(gè)問題需要考慮如下幾個(gè)部分:
a)基于紙張橫版豎版自適應(yīng)的思想,若紙張長(zhǎng)寬方向與圖形不一致,則應(yīng)當(dāng)旋轉(zhuǎn)該圖形以獲得更加美觀的打印布局。由于原理上豎向打印需要通過分解成橫向常規(guī)打印進(jìn)行,所以我們不建議對(duì)可視圖元進(jìn)行90度旋轉(zhuǎn)。所以需要對(duì)圖紙本身進(jìn)行旋轉(zhuǎn),當(dāng)打印完成后再歸位。
b)圖形坐標(biāo)系和打印空間坐標(biāo)系不同,如圖1所示。對(duì)前文已經(jīng)配置好縮放比例的圖紙空間與打印空間進(jìn)行映射,需要對(duì)坐標(biāo)進(jìn)行轉(zhuǎn)換。
c)旋轉(zhuǎn)文字的繪制。繪制非常規(guī)文字唯一的思路是,以文字插入點(diǎn)為局部坐標(biāo)系原點(diǎn),旋轉(zhuǎn)圖紙空間,繪制文字,然后旋轉(zhuǎn)歸位。此處需要注意文字水平對(duì)齊和豎向?qū)R方式,否則插入原點(diǎn)位置不正確會(huì)導(dǎo)致文字飄失。
d)文字的拉伸。SATWE結(jié)果中在狹窄處經(jīng)常有壓縮變形的文字。對(duì)于這部分文字,同樣不存在對(duì)扭曲的文字的直接繪制方法,只可以通過對(duì)圖紙空間的扭曲、復(fù)位達(dá)到此類效果。
以上具體問題的處理均可以轉(zhuǎn)化為對(duì)圖紙空間的二維變換,通過適時(shí)建立平移、旋轉(zhuǎn)、拉伸矩陣進(jìn)一步轉(zhuǎn)化為數(shù)學(xué)問題。
平移矩陣變形矩陣二維旋轉(zhuǎn)矩陣
解決了最為復(fù)雜的圖形繪制問題,剩余的打印頁數(shù)控制、目錄、頁眉頁腳以及打印整本計(jì)算書所需的文字計(jì)算書部分都較為容易解決,相關(guān)資料也較多,此處不再贅述。
3打印結(jié)果
依據(jù)上文方法,利用C#編程直接讀取某任意T文件二進(jìn)制數(shù)據(jù),選擇AdobePDF虛擬打印機(jī)進(jìn)行打印,打印效果如圖3所示。與PKPM自帶的打印功能相比較,本文程序打印效果無論圖形真實(shí)度還是顏色筆刷均毫不遜色。
圖3實(shí)際打印效果以及細(xì)部效果
4結(jié)論
通過本文中對(duì)PKPM軟件T文件數(shù)據(jù)格式的研究和簡(jiǎn)單應(yīng)用,我們不借助于PKPM、AutoCAD運(yùn)行環(huán)境,對(duì)T文件直接編程打印進(jìn)行了實(shí)踐。由于打印圖形結(jié)果是整個(gè)打印計(jì)算書過程中的核心和難點(diǎn),文本計(jì)算書部分的編程打印難度很小,于是,進(jìn)一步我們即可輕松實(shí)現(xiàn)對(duì)整本計(jì)算書的一鍵打印,由此打印PKPM計(jì)算書的工作量將大大減輕。另外,基于本文對(duì)T文件數(shù)據(jù)結(jié)構(gòu)的研究,可以編寫T文件轉(zhuǎn)任何其他可行圖形格式(例如DXF,DWG)的接口程序。未來BIM是主流,而PKPM仍然是結(jié)構(gòu)計(jì)算的基礎(chǔ)工具。本文的研究思路對(duì)于如何實(shí)現(xiàn)Revit軟件和PKPM實(shí)現(xiàn)數(shù)據(jù)交互的可能性將會(huì)有一定的啟示作用。
參考文獻(xiàn)
[1]中國(guó)建筑科學(xué)研究院建筑工程軟件研究所,面向工程應(yīng)用的圖形平臺(tái)TCAD-PKPM建筑工程軟件系統(tǒng)的通用圖形平臺(tái)[M].中國(guó)建筑工業(yè)出版社,200