蒲朝旭,余代俊,朱逍賢
(成都理工大學現(xiàn)代工程測量技術及應用研究所,四川成都 610059)
隨著科學技術的飛速發(fā)展,計算機技術、衛(wèi)星定位系統(tǒng)以及地理信息系統(tǒng)的運用使得現(xiàn)代測繪技術在社會、經濟建設中的應用領域不斷擴大,現(xiàn)代數(shù)字測繪技術已成為測繪技術的主流。目前,我國社會管理和經濟建設的信息化水平不斷提高,使得社會各領域對數(shù)字化測繪產品的需求量也隨之增加,使用的測繪軟件也越來越多,特別是針對某具體工程、項目應用或測繪功能而開發(fā)的各類獨立的和二次開發(fā)的測繪小軟件更是種類繁多、各式各樣。若想很好地管理和使用這些小軟件,沒有一個好的方法或策略,將嚴重影響程序的使用、存儲和傳輸,從而降低工作效率。
本文針對上述提及的測繪小軟件種類繁多,管理、存儲、傳輸不便的問題,提出了一可行的解決方案,開發(fā)出一個測繪小軟件集錦平臺。利用該平臺可以將眾多小軟件集成在一管理軟件中,將每一個小軟件當作該平臺的一個功能菜單,該平臺能夠實現(xiàn)程序菜單的自動生成,各個應用程序的自動加載,能夠將諸多的程序進行分類管理、分類存儲,同時能夠方便快捷的運行所需應用程序,對于需要嵌入其他應用程序的動態(tài)鏈接庫文件(軟件),該平臺將自動把所需初始化信息等寫入相關注冊表,同時打開所需軟件并實現(xiàn)DLL文件的自動加載,省去了手工加載DLL文件的步驟,減少了錯誤率。
本集錦平臺程序主要用于將開發(fā)的眾多測繪小軟件進行一個歸類,并且對各類中的應用程序和DLL文件進行動態(tài)菜單的生成,便于存儲、傳輸、管理和使用。
主菜單是本程序的核心部分,用于動態(tài)生成主菜單的各項信息采用xml文件的形式進行保存,便于程序初始化時讀取相關信息以生成主程序菜單。
菜單信息xml文件存儲格式[1]介紹如下:
(1)設計一個文檔元素<Menulist></Menulist>作為文件中最外面的標簽,該標簽中能夠包含諸多的元素,以便于其他信息的存儲,所以這些信息都必須存儲到該文檔元素的起始標簽中。
(2)設計一個文檔元素 <MainMenu></Main-Menu>作為每一個主菜單項的信息存儲,同時設計一個屬性name用于存儲該菜單的名稱。每一個<Main-Menu>標簽均包含于<Menulist>標簽中。
(3)設計一個文檔元素<Menu/>用于存儲每一個子菜單項的相關信息,并且添加name屬性存儲該子菜單項的名稱,添加path屬性用于存儲該子菜單項所需運行程序的路徑。該路徑可以存放相對路徑或者絕對路徑。每一個<Menu/>標簽均位于一個<Main-Menu></MainMenu>標簽內。
(4)設計一個文檔元素<ApplicationTitle/>用于存儲主程序的名稱,該標簽也包含于<Menulist>標簽中。
具體的菜單文檔結構框圖如圖1所示。
圖1 菜單文檔存儲結構框圖
基于2.1節(jié)中提到的文檔信息的存儲結構,需要設計對諸多小程序軟件進行裝載添加、卸載刪除的功能。
程序裝載功能包括三部分:一是選擇待添加的下拉菜單(小軟件)所屬的主菜單。如果已有列表中不包含所欲添加的主菜單名,則可以自己輸入編輯新的主菜單名,此處也實現(xiàn)了主菜單的新增功能。二是選擇下拉菜單名。下拉菜單名默認情況下程序會自動根據(jù)所選擇的小軟件文件名生成一個下拉菜單名稱,若需要修改,則直接鍵入下拉菜單名即可。三是選擇裝載程序路徑。該路徑下可以選擇待裝載的可執(zhí)行的應用程序,也可以選擇動態(tài)鏈接庫文件,或者選擇系統(tǒng)中已經存在的快捷方式均可。
程序卸載功能包括選擇欲卸載小軟件所屬的主菜單和選擇下拉菜單(小軟件)。如果想刪除整個主菜單項,則在選擇下拉菜單時選擇DelMainMenu項即可。
應用程序的加載需要兩個步驟,一是點擊某個菜單項,二是能夠根據(jù)所點擊的菜單項運行相應的程序。
因各個菜單均是動態(tài)生成,每一個菜單和其運行的程序之間的對應關系,此處定義一個結構體以方便存儲,該結構體設計如下:
通過該結構體則可將所需信息進行對應存儲。同時,此處也可以設計為HashTable或者Dictionary進行存儲,同樣能夠達到相同的效果。
此處設計的動態(tài)鏈接庫文件的掛載主要是指利用.NET開發(fā)的基于各個版本的AutoCAD的DLL文件[2~4]。
DLL的命名規(guī)則遵循“CAD版本號_程序集名稱”,如可以命名為“AutoCAD2006_testdll.dll”。程序首先讀取注冊表中AutoCAD的安裝信息,如果安裝了對應的CAD,則能夠自動打開該版本的CAD,并且將該程序集進行加載。
加載.NET開發(fā)的DLL主要有兩種方式:一是在注冊表中添加信息,將DLL文件的路徑等信息寫入注冊表,以實現(xiàn)在程序啟動時進行自動加載;二是在acad.lsp文件中利用lsp語句將加載信息寫入,待程序啟動初始化時進行加載。此處采用第二種方式進行DLL文件的加載。
每一個程序均有其作者,為能夠找到其作者,在應用程序命名時要求將作者信息加到程序名中,并以下劃線進行分割,作者名統(tǒng)一以名稱縮寫形式加載應用程序名后。
角值度分秒的輸入形式多樣,為能夠適應各種不同形式的度分秒輸入,使用正則表達式進行輸入字符串的檢查,同時使用拆分技術對所輸入的字符串進行有效拆分,最終獲得有效的角值數(shù)據(jù)。
本平臺采用C#2008結合Linq查詢、正則表達式等新技術實現(xiàn)程序的開發(fā)。
軟件菜單的生成主要是利用Linq to Xml方法[5]對菜單信息文件(Xml文件)進行操作,包括打開文件、讀取內容、寫入內容、刪除內容,利用Windows Forms的MenuStrip和ToolStripMenuItem控件進行菜單的生成。
Xml文件的加載利用XDocument.Load()方法實現(xiàn),讀取使用XElement的Element()方法來獲取每一個元素的值,利用XElement的Add()方法來向Xml文件中添加信息,應用Linq方法先查詢出需要刪除的節(jié)點,使用Remove()方法進行刪除即可。在進行上述各個添加或者刪除操作后,均需要對文件進行保存。
利用上述方法進行動態(tài)生成的效果圖,如圖2所示。
圖2 動態(tài)菜單生成效果圖
程序裝卸主要是利用2.1節(jié)中提到的Linq to xml方法進行菜單列表文件的編輯和修改,從而生成新的菜單。每次修改完成后,主菜單的菜單項均會重新生成,以保證程序菜單的實時性。
程序裝卸窗體界面如圖3所示。通過該窗體,可以實現(xiàn)程序的裝載和卸載。
圖3 程序裝卸界面
EXE應用程序的加載非常簡單,首先檢查路徑是否合法,若合法則使用Process.Start()方法直接啟動該應用程序即可。
DLL文件的掛載需要操作注冊表和AutoCAD軟件[6]。首先,使用 RegistryKey讀取注冊表中的鍵值,比如讀取AutoCAD 2006的信息則語句為
然后使用GetValue("AcadLocation")得到CAD的安裝目錄,若不存在該CAD版本則在讀取信息時則會拋出“異?!?。
利用獲取的CAD路徑則可啟動CAD,同時動態(tài)生成一個Acad.lsp文件,該文件保存需要加載的DLL文件的相關信息,如加載test.dll則該文件內容為(command"netload""test")則可在程序啟動時自行加載該DLL文件。
測繪小軟件中角值(度分秒)的使用非常頻繁,如何快速高效的獲取用戶輸入的度分秒信息并且能夠在用戶輸入錯誤的度分秒信息時給出提示,是軟件友好性設計方面的一個重點。
在該系列軟件中,對于度分秒的處理均是采用正則表達式[7]進行數(shù)據(jù)的合法性檢查,使用拆分方法對獲取的度分秒信息進行拆分。
本例綜合考慮用戶的輸入方法,同樣的度分秒數(shù)據(jù)可以有如下一些輸入方式(以 120°14'23.334″為例),如表1所示。
角值表示形式 表1
同時還要可能分全角和半角的標點符號以及中文符號和英文符號混合使用的情況。要考慮上述多種形式并且能夠判斷合法性,具體的正則表達式的匹配字符串如下:
此處對匹配字符串進行簡單介紹如下:是轉義字符,u表示的是unicode字符編碼格式,其中的各個unicode字符均是表示的中文字符匹配,比如中文的度分秒等。
通過上述的字符匹配檢測輸入的字符是否符合要求后,還需要采用拆分方式對輸入的字符串進行度分秒的拆分。
具體用于拆分字符串的代碼如下:
通過上述兩種方法和手段則可以得到正確的度分秒的值,以便于后續(xù)使用。
目前,集錦平臺已集成了包括EXE應用程序軟件和DLL動態(tài)鏈接庫文件的五大類小軟件20余個[8~11]。
通過對測繪小軟件集錦平臺的設計與實現(xiàn),給測繪小軟件的開發(fā)設計以及管理提出了一種新的方法,該平臺具有較好的普適性,能夠將不同語言開發(fā)的程序和DLL文件進行自動的加載,能夠對測繪軟件的整理和使用起到一定的便利作用。
[1]David Hunter,Jeff Rafter,Joe Fawcett(著).吳文國(譯).XML入門經典(第4版)[M].北京;清華大學出版社,2009.
[2]曾洪飛,張帆,盧擇臨.AutoCAD VBA& VB.NET開發(fā)基礎與實例教程[M].北京:中國電力出版社,2009.
[3]ObjectARX Reference for.NET.
[4]AutoCAD幫助文件.
[5]王的強,張曉娜,周靜.LINQ入門及應用[M].北京:清華大學出版社,2009.
[6]James Foxall(著).張劼(譯).Visual C#2008入門經典[M].北京:人民郵電出版社,2009.
[7]Jan Goyvaerts,Steven Levitban(著),郭耀(譯).正則表達式經典實例[M].北京:人民郵電出版社,2010.
[8]李岳.坐標轉換系統(tǒng)的設計與實現(xiàn)[J].北京:中國地質大學,2010.
[9]蒲朝旭,余代俊.基于VB2008的電子水準測量數(shù)據(jù)處理程序的設計與實現(xiàn)[J].測繪,2011(4),171~174.
[10]白鐵勇,余代俊,付崇江.基于TGO軟件的GPS網同步環(huán)及異步環(huán)提?。跩].測繪科學,2010(3),102~113.
[11]賴鴻斌,馬德英.數(shù)字水準儀數(shù)據(jù)傳輸轉換和管理信息系統(tǒng)的建立[J].測繪科學,2009(5),186~187.