自動(dòng)導(dǎo)入管網(wǎng)圖的燃?xì)夤芫W(wǎng)水力計(jì)算程序開(kāi)發(fā)

摘 要

摘要:介紹了AutoCAD的DXF文件(圖形交換文件)數(shù)據(jù)格式特點(diǎn),利用DXF文件作為數(shù)據(jù)接口,為燃?xì)夤芫W(wǎng)水力計(jì)算程序開(kāi)發(fā)了管網(wǎng)拓?fù)浣Y(jié)構(gòu)圖自動(dòng)導(dǎo)入功能。該方法可根據(jù)管道屬性導(dǎo)入管網(wǎng)

摘要:介紹了AutoCAD的DXF文件(圖形交換文件)數(shù)據(jù)格式特點(diǎn),利用DXF文件作為數(shù)據(jù)接口,為燃?xì)夤芫W(wǎng)水力計(jì)算程序開(kāi)發(fā)了管網(wǎng)拓?fù)浣Y(jié)構(gòu)圖自動(dòng)導(dǎo)入功能。該方法可根據(jù)管道屬性導(dǎo)入管網(wǎng)圖,簡(jiǎn)化管道數(shù)據(jù)輸入過(guò)程。通過(guò)實(shí)例進(jìn)行了驗(yàn)證。
關(guān)鍵詞:燃?xì)夤芫W(wǎng);水力計(jì)算;自動(dòng)繪圖;管網(wǎng)拓?fù)浣Y(jié)構(gòu)圖;圖形交換文件
Development of Gas Network Hydraulic Calculation Program with Automatic Import of Network Topology Map
ZHANG Ning,XIE Donglai
AbstractThe data format of AutoCAD drawing exchange file(DXF)is introduced.Using DXF file as data interface,the automatic import function of network topology map is developed for hydraulic calculation program of gas network.The program can import the network topology map according to the pipeline attribute and simplify the data input process.It is verified by a case.
Key wordsgas network;hydraulic calculation;automatic drawing;network topology map;drawing exchange file(DXF)
   隨著我國(guó)能源結(jié)構(gòu)的調(diào)整,越來(lái)越多的用戶開(kāi)始使用清潔、高效的管輸天然氣。燃?xì)夤芫W(wǎng)水力計(jì)算是進(jìn)行管網(wǎng)設(shè)計(jì)和運(yùn)行的理論基礎(chǔ),是順利完成輸配任務(wù)的保證。計(jì)算機(jī)應(yīng)用的普及促使水力計(jì)算程序替代了原始的手工平差計(jì)算[1]。目前,應(yīng)用比較直觀、方便的程序是通過(guò)面向?qū)ο蟮恼Z(yǔ)言(如VC)編寫(xiě),用戶可以在窗口利用鼠標(biāo)點(diǎn)擊繪制管段,輸入計(jì)算參數(shù),得到結(jié)果。但是,當(dāng)管網(wǎng)規(guī)模越來(lái)越龐大時(shí),這種輸入方法不僅費(fèi)時(shí)、費(fèi)力,還極易出錯(cuò),因此有必要在水力計(jì)算程序中開(kāi)發(fā)管網(wǎng)拓?fù)浣Y(jié)構(gòu)圖自動(dòng)導(dǎo)入功能。
1 水力計(jì)算程序功能
    目前已有利用Visual C++開(kāi)發(fā)的水力計(jì)算程序,可以在可視化界面中由用戶利用鼠標(biāo)點(diǎn)擊繪制管網(wǎng)計(jì)算圖。在管段和節(jié)點(diǎn)附近的空間范圍內(nèi)雙擊鼠標(biāo)左鍵,彈出相應(yīng)對(duì)話框,輸入管段和節(jié)點(diǎn)參數(shù),實(shí)現(xiàn)管網(wǎng)和數(shù)據(jù)的緊密結(jié)合。同時(shí)程序具有管段刪除、截?cái)?、改變顏色、流向等編輯功能,方便管網(wǎng)的新建和改建。并利用解節(jié)點(diǎn)方程組法對(duì)單氣源與多氣源、高中壓與低壓、環(huán)狀與枝狀管網(wǎng)進(jìn)行快速、準(zhǔn)確的水力計(jì)算,并可將結(jié)果自動(dòng)標(biāo)注在水力計(jì)算圖中[2]。本文在此程序基礎(chǔ)上開(kāi)發(fā)管網(wǎng)拓?fù)浣Y(jié)構(gòu)圖的自動(dòng)導(dǎo)入功能。
2 AutoCAD的DXF文件數(shù)據(jù)格式
2.1 DXF文件簡(jiǎn)介
    目前,燃?xì)夤艿缊D大多用AutoCAD軟件繪制,其儲(chǔ)存格式有DWG、DWS、DWT、DXF四種。其中前三種文件格式為二進(jìn)制形式,不便于數(shù)據(jù)內(nèi)容的查看,只適合于AutoCAD程序本身的儲(chǔ)存使用。DXF是一種ASCⅡ文本文件,它包含對(duì)應(yīng)的DWG文件的全部信息,可以利用文本編輯器來(lái)查看其數(shù)據(jù)內(nèi)容,通過(guò)它可以很方便與第三方軟件形成良好的數(shù)據(jù)互讀。
2.2 DXF文件的數(shù)據(jù)格式
    DXF文件的基本構(gòu)造形式是由代碼和關(guān)聯(lián)值組成的數(shù)據(jù)對(duì)。代碼(通常稱為組碼)表明數(shù)值的類型,關(guān)聯(lián)值則表明具體數(shù)值的大小。每個(gè)組碼和關(guān)聯(lián)值在DXF文件中都單獨(dú)成行。
    DXF文件由多個(gè)段組成,每個(gè)段以組碼“0”和字符串“SECTION”開(kāi)頭,其后是組碼“2”和表示段名的字符串(如ENTITIES),段中間用定義其元素的組碼和關(guān)聯(lián)值組成,段尾使用組碼“0”和字符串“ENDSECT”結(jié)束。
    DXF文件段完整結(jié)構(gòu)包括以下7部分:
    HEADER段:包含有關(guān)圖形的總體信息,它由AutoCAD數(shù)據(jù)庫(kù)版本號(hào)和一些系統(tǒng)變量組成。
    CLASSES段:包含應(yīng)用程序定義的類的信息,這些類的實(shí)例出現(xiàn)在數(shù)據(jù)庫(kù)的BLOCKS、ENTITLES和OBJECTS段中。
    TABLES段:包含應(yīng)用程序標(biāo)志表、塊參照表、標(biāo)注樣式表、圖層表、線型表、文字樣式表、用戶坐標(biāo)系表、視圖表、視口配置表的定義。
    BLOCKS段:包含構(gòu)成圖形中每個(gè)塊的塊定義。
    ENTITIES段:包含圖形中的繪圖實(shí)體。
    OBJECTS段:包含圖形中的非圖形對(duì)象。除圖元、符號(hào)表記錄以及符號(hào)表以外的所有對(duì)象都儲(chǔ)存在此段。
    THUMBNAILIMAGE段:包含圖形的預(yù)覽圖像數(shù)據(jù)[3~5]。
3 可自動(dòng)導(dǎo)入管網(wǎng)拓?fù)浣Y(jié)構(gòu)圖的計(jì)算程序
3.1 DXF文件中管道數(shù)據(jù)的儲(chǔ)存
    實(shí)現(xiàn)燃?xì)夤芫W(wǎng)拓?fù)浣Y(jié)構(gòu)圖的自動(dòng)導(dǎo)入,即通過(guò)線段的圖層、顏色、線型、線寬等屬性信息確定所選擇的管道,讀取它們的起點(diǎn)與終點(diǎn)坐標(biāo),然后在水力計(jì)算程序中繪制。其中最為關(guān)鍵的步驟是對(duì)管道的起點(diǎn)和終點(diǎn)坐標(biāo)的準(zhǔn)確查找。根據(jù)AutoCAD的繪圖原則,線段都是繪制于某一圖層上,當(dāng)圖層中線段的顏色、線型、線寬等屬性信息與圖層自身預(yù)定義的圖形屬性相同(通常稱為隨圖層)時(shí),線段的上述屬性數(shù)據(jù)沒(méi)有在用于儲(chǔ)存圖形對(duì)象信息的ENTITIES段的AcDbEntity子段中表達(dá),而是作為圖層的一般屬性數(shù)據(jù)儲(chǔ)存在圖層所在的TABLES段。這時(shí)如果根據(jù)線段屬性數(shù)據(jù)對(duì)管道進(jìn)行查找時(shí),就需要首先在TABLES段中找到圖層自身預(yù)定義的線段屬性的組碼和關(guān)聯(lián)值,如果所需查找的管段顏色、線型、線寬的數(shù)據(jù)和圖層自身預(yù)定義的圖形屬性相符合,再在AcDbEntity段中找到此線段的起點(diǎn)和終點(diǎn)坐標(biāo);當(dāng)圖層中線段的顏色、線型、線寬等屬性信息與圖層自身預(yù)定義的屬性信息不相同時(shí),線段屬性數(shù)據(jù)的組碼和關(guān)聯(lián)值就儲(chǔ)存在AcDbEntity段中,可直接在此段中查找。根據(jù)管道屬性查找坐標(biāo)時(shí),為防止有效數(shù)據(jù)的遺漏,需要逐行讀取儲(chǔ)存的數(shù)據(jù),根據(jù)線段屬性數(shù)據(jù)的儲(chǔ)存方式的不同,定位于TABLES或AcDbEntity段,再找到相應(yīng)管道的起點(diǎn)和終點(diǎn)坐標(biāo)。
3.2 自動(dòng)導(dǎo)入管網(wǎng)圖功能的實(shí)現(xiàn)方法
    在程序自動(dòng)導(dǎo)入之前,首先要對(duì)繪制管道的AutoCAD文件進(jìn)行前期處理。程序的查找范圍為圖1所示導(dǎo)入管網(wǎng)簡(jiǎn)圖命令對(duì)話框中的管段屬性下拉列表中列出的圖層的名稱(導(dǎo)入管網(wǎng)圖層1、導(dǎo)入管網(wǎng)圖層2)、線段的顏色(紅色、藍(lán)色、白色)、線型(直線、虛線、點(diǎn)劃線)、線寬(0.mm、0.6mm1、0.9mm)。如果需要導(dǎo)入管道的屬性信息不在上述可選范圍內(nèi),需要在AutoCAD中對(duì)管道屬性進(jìn)行前期修改,使得需要查找的管道屬性在上述可選范圍之內(nèi)。然后把通用的DWG文件另存為DXF文件。
 

    在燃?xì)馑芫W(wǎng)力計(jì)算程序中打開(kāi)導(dǎo)入管網(wǎng)簡(jiǎn)圖命令對(duì)話框,選擇導(dǎo)入線段的圖層、顏色、線型、線寬等屬性信息。其中圖層作為線段存在的基礎(chǔ),為必選項(xiàng);其他3項(xiàng)可以根據(jù)進(jìn)一步由管道屬性精確查找的需要選擇其中1項(xiàng)。
    圖2為管道的起點(diǎn)和終點(diǎn)坐標(biāo)的查詢流程圖。程序首先打開(kāi)儲(chǔ)存管網(wǎng)信息的DXF文件,調(diào)用VC的ReadString命令逐行讀取管網(wǎng)數(shù)據(jù)。當(dāng)查詢到儲(chǔ)存線段信息的AcDbEntity段,找到線段的圖層名組碼,如果組碼的關(guān)聯(lián)值與導(dǎo)入管網(wǎng)簡(jiǎn)圖命令對(duì)話框的選定值相同,接著判斷此圖層中線段是否全部導(dǎo)入,如果全部導(dǎo)入,定位于AcDbEntity段下的AcDbLine子段,讀取線段的起點(diǎn)和終點(diǎn)坐標(biāo);如果還需要根據(jù)圖層中線段的屬性信息進(jìn)一步進(jìn)行篩選,則首先需要判斷是根據(jù)線段的顏色、線型、線寬3個(gè)屬性中哪個(gè)屬性進(jìn)行選擇。例如選擇的是顏色屬性,首先判斷線段的顏色是否隨圖層設(shè)置,如果隨圖層設(shè)置,在TABLES段中,尋找圖層名的組碼,確定組碼的關(guān)聯(lián)值與選定值相同的圖層,接著尋找此圖層名下線段的顏色的組碼,如果組碼的關(guān)聯(lián)值與選定值相同,在AcDbLine段中找到此線段,然后讀取起點(diǎn)和終點(diǎn)坐標(biāo);如果線段的顏色不隨圖層設(shè)置,則直接在AcDbLine段中根據(jù)管道顏色找到該線段的起點(diǎn)和終點(diǎn)坐標(biāo)即可[6~7]
  所有查詢到的與導(dǎo)入管網(wǎng)簡(jiǎn)圖命令對(duì)話框相關(guān)的管道的起、終點(diǎn)坐標(biāo)儲(chǔ)存在一個(gè)文件中,燃?xì)夤芫W(wǎng)水力計(jì)算程序讀取此文件中數(shù)據(jù),利用VC的MoveTo( )函數(shù)定位于管道的起點(diǎn),LineTo( )函數(shù)繪制直線連接到端點(diǎn),同時(shí)在線段的中點(diǎn)繪制從起點(diǎn)指向終點(diǎn)的流向三角形。
3.3 管道長(zhǎng)度的測(cè)量
    如果管道在AutoCAD圖中按照實(shí)際長(zhǎng)度繪制,程序可以根據(jù)管道的起點(diǎn)和終點(diǎn)坐標(biāo)利用直角三角形的勾股定理自動(dòng)計(jì)算管道的長(zhǎng)度。當(dāng)實(shí)際管長(zhǎng)與繪制管長(zhǎng)的比例系數(shù)不為1時(shí),可在圖1所示對(duì)話框中輸入相應(yīng)的比例系數(shù)轉(zhuǎn)化得到,管長(zhǎng)作為計(jì)算參數(shù)自動(dòng)輸入程序中供水力計(jì)算使用。
3.4 節(jié)點(diǎn)自動(dòng)編號(hào)
由于水力計(jì)算節(jié)點(diǎn)方程組求解的需要,程序?qū)?jié)點(diǎn)自動(dòng)進(jìn)行編號(hào)。首先對(duì)第一條管段起點(diǎn)編號(hào)1,終點(diǎn)編號(hào)2。在進(jìn)行此后管段節(jié)點(diǎn)編號(hào)時(shí),計(jì)算當(dāng)前管段前所有節(jié)點(diǎn)的最大編號(hào),當(dāng)前管段與之前管段的節(jié)點(diǎn)坐標(biāo)依次進(jìn)行比較,如果兩者相同,說(shuō)明兩點(diǎn)重合,節(jié)點(diǎn)編號(hào)為坐標(biāo)相同點(diǎn)的編號(hào);如果不相同,節(jié)點(diǎn)編號(hào)為當(dāng)前節(jié)點(diǎn)編號(hào)的最大值加1[8]。
4 自動(dòng)導(dǎo)入管網(wǎng)圖實(shí)例
    圖3為AutoCAD的DWG格式燃?xì)夤芫W(wǎng)圖,實(shí)線為現(xiàn)有燃?xì)夤艿?,虛線為需要擴(kuò)建的管道。在導(dǎo)入管網(wǎng)圖之前,首先在AutoCAD程序中把管道所在的圖層名改為“導(dǎo)入管網(wǎng)圖層1”,然后用“Drawing”文件名把管網(wǎng)圖另存為DXF格式的文件,保存在電腦“桌面”。打開(kāi)水力計(jì)算應(yīng)用程序,點(diǎn)擊選單欄中的“導(dǎo)入管網(wǎng)”選項(xiàng),打開(kāi)如圖1所示對(duì)話框,在“選擇圖層”下拉選項(xiàng)中選取“導(dǎo)入管網(wǎng)圖層1”,然后點(diǎn)擊“確定”,則程序會(huì)按照電腦“桌面”上名為“Drawing”的DXF文件中“導(dǎo)入管網(wǎng)圖層1”圖層下的管道坐標(biāo)自動(dòng)繪制管網(wǎng)。全部管道導(dǎo)入計(jì)算程序并對(duì)管
    道節(jié)點(diǎn)自動(dòng)編號(hào)的示意圖見(jiàn)圖4。若只需要選擇性地導(dǎo)入圖3中實(shí)線管道,打開(kāi)圖1所示對(duì)話框,在選擇圖層“導(dǎo)入管網(wǎng)圖層1”時(shí),還需要選擇“線型”按鈕,并相應(yīng)選取“實(shí)線”選項(xiàng),管道選擇性導(dǎo)入計(jì)算程序并對(duì)管道節(jié)點(diǎn)自動(dòng)編號(hào)的示意圖見(jiàn)圖5。
 

5 結(jié)語(yǔ)
    利用AutoCAD的DXF數(shù)據(jù)格式為燃?xì)夤芫W(wǎng)水力計(jì)算程序開(kāi)發(fā)了管道的自動(dòng)導(dǎo)入功能,該方法能夠準(zhǔn)確、迅速地把管網(wǎng)拓?fù)浣Y(jié)構(gòu)圖移植到計(jì)算程序中,并自動(dòng)計(jì)算管段長(zhǎng)度,可以大大減輕輸入工作量,對(duì)于大型、特大型管網(wǎng),效果更加明顯。
參考文獻(xiàn):
[1] 姜東琪,杜建梅,崔建華,等.燃?xì)夤芫W(wǎng)水力計(jì)算及水力計(jì)算圖的繪制[J].煤氣與熱力,2001,21(5):453-455.
[2] 張寧,解東來(lái),田貫三,等.多氣源燃?xì)夤芫W(wǎng)水力計(jì)算程序的開(kāi)發(fā)[J].煤氣與熱力,2009,29(6):B05-B08.
[3] 梁雪春,宋德明.AutoCAD二次開(kāi)發(fā)技術(shù)指南[M].北京:清華大學(xué)出版社,2001.
[4] 余承飛,方勇.AutoCAD二次開(kāi)發(fā)技術(shù)[M].北京:人民郵電出版社,1999.
[5] 王子茹,任清波.基于VC++的DXF數(shù)據(jù)文件接口的研究[J].廈門(mén)理工學(xué)院學(xué)報(bào),2007,15(1):26-30.
[6] 劉天立.基于DXF實(shí)現(xiàn)C語(yǔ)言與AutoCAD接口[J].哈爾濱理工大學(xué)學(xué)報(bào),2001,6(4):60-62.
[7] 劉傳亮,陸建德.AutoCAD DXF文件格式與二次開(kāi)發(fā)圖形軟件編程[J].微機(jī)發(fā)展,2004,14(9):101-104.
[8] 左麗麗,吳長(zhǎng)春.燃?xì)夤芫W(wǎng)水力計(jì)算節(jié)點(diǎn)及管段編號(hào)的探討[J].煤氣與熱力,2005,25(3):36-39.
 
(本文作者:張寧 解東來(lái) 華南理工大學(xué) 化學(xué)與化工學(xué)院 廣東廣州 510641)