在優(yōu)化維護(hù)工作中,MapInfo是很常用的一個(gè)GIS軟件,MapInfo支持二次開發(fā),可以根據(jù)不同的需求在MapInfo中通過地理化的形式表達(dá)出很多的想法,實(shí)現(xiàn)很多實(shí)用的功能。
當(dāng)你看到一堆高大上的插件,總想把自己的想法變成實(shí)用的插件,但是絕大多數(shù)人的過程是從未入門直接就放棄了,少有能堅(jiān)持到可以寫出好用插件的那天。這其中的原因很多,最主要的一個(gè)原因是MB(Mapbasic)資料太少,多數(shù)資料只講了些語法、怎么建菜單,怎么建工具欄,很少能結(jié)合實(shí)例進(jìn)行講解的。等到感覺可以動(dòng)手開始寫MB程序時(shí),卻仍然云里霧里,無從下手。
想當(dāng)初受到前輩點(diǎn)撥,終于找到了MB的門,有幸入門一探究竟,才明白原來確實(shí)有柳暗花明;剡^頭來,才發(fā)現(xiàn),原來MB并不難,難的只是沒有深入了解TA! ∏岸螘r(shí)間想查個(gè)LTE頻點(diǎn)的EARFCN,沒有找到啥方便的工具可以直接換算,只能通過協(xié)議的表查數(shù)據(jù),然后計(jì)算,于是索性直接用MapBasic寫一個(gè),再也不用查表那么費(fèi)勁了,正好也可以為想要入門的兄弟提供一個(gè)MB實(shí)例及一些MB編程的想法。
廢話不多說,我假裝很懂的樣子大概梳理一下整個(gè)功能從無到有的過程,基本語法不細(xì)說。
-----分隔線-----
首先看看效果,可以支持3GPP R13協(xié)議列舉的所有頻段的EARFCN和頻點(diǎn)的轉(zhuǎn)換。然后再來說下是怎么在MB下實(shí)現(xiàn)的。
[attach]324421[/attach]
一、從3GPP官網(wǎng)(注1)下載一個(gè)最新的TS36.101協(xié)議文檔(注2),獲取EARFCN和頻點(diǎn)轉(zhuǎn)換方法,編寫時(shí),最新的是1/15號d21版本(即TS36.101 R13 v2.1)。
//注1:
http://www.3gpp.org/ftp/Specs/archive/36_series/36.101/
//注2:為啥是TS36.101,這個(gè)可以從TS21.201中各協(xié)議索引中看到,TS36.101是User Equipment (UE) radio transmission and reception
,不難想到頻點(diǎn)和頻點(diǎn)號、頻段間隔之類的可以在這個(gè)文檔中找到。
[attach]324422[/attach]
從目錄中可以看到5.7.3節(jié)即為頻點(diǎn)和EARFCN的關(guān)系,其中給出了轉(zhuǎn)換公式,及轉(zhuǎn)換公式中的所需數(shù)據(jù)的表。
[attach]324423[/attach]
[attach]324424[/attach]
5.7.4節(jié)列出了所有FDD-LTE的各頻段的上下行頻率間隔
[attach]324425[/attach]
二、分析協(xié)議中的表格數(shù)據(jù),確認(rèn)程序?qū)嶋H需要的數(shù)據(jù)格式,整理成相應(yīng)的數(shù)據(jù)。
頻段數(shù)較多,且存在很多重復(fù)的頻段,各個(gè)數(shù)據(jù)之前無明顯的聯(lián)系,所以最先想到了用數(shù)據(jù)庫的形式來存儲。
最終整理成的數(shù)據(jù)如下圖,其中包含各個(gè)需要的字段,計(jì)算時(shí)直接用SQL查表得到所需的數(shù)據(jù)內(nèi)容。
[attach]324426[/attach]
[attach]324427[/attach]
三、結(jié)合轉(zhuǎn)換公式,設(shè)計(jì)需要呈現(xiàn)和輸入輸出的內(nèi)容,完成轉(zhuǎn)換流程圖,以便為后續(xù)代碼編寫提供非常清晰的框架。
[attach]324428[/attach]
四、設(shè)計(jì)轉(zhuǎn)換窗體
從分析的數(shù)據(jù)中可以看出,上下行頻點(diǎn)、頻段、EARFCN都是可以輸入輸出的變量,其他字段是可以通過查表獲得的常量,因此將轉(zhuǎn)換的窗體設(shè)計(jì)成最上面的效果圖(窗體一般用MBbuilder繪制比較方便)。代碼見DlgConvertFreq.mb
五、參照流程圖,對轉(zhuǎn)換子過程用MB代碼實(shí)現(xiàn)。//代碼見DlgConvertFreq_H.mb,不重復(fù)粘貼
1、在轉(zhuǎn)換窗體開始前,先初始化變量,所有字段用alias類型變量進(jìn)行賦值,并創(chuàng)建轉(zhuǎn)換表,用SQL插入第二步整理的數(shù)據(jù)到表中,同時(shí)用數(shù)組為多頻段的頻點(diǎn)做準(zhǔn)備。
//注:MB編程中應(yīng)該避免將字段寫死,建議用常量或者變量統(tǒng)一賦值,引用時(shí),用alias類型變量,可以方便后續(xù)字段變化的情況,比如原先用的是中文字段,突然變成必須用英文字段,沒有用alias類型時(shí),代碼的維護(hù)將非常痛苦,而用alias類型,也可方便進(jìn)行自定義字段名。
2、從各輸入值獲取到相應(yīng)的數(shù)據(jù),代入到通用的計(jì)算過程中,進(jìn)行計(jì)算,計(jì)算的結(jié)果呈現(xiàn)到轉(zhuǎn)換窗體的各個(gè)字段上。
3、查詢結(jié)果為多頻段時(shí),再次用選擇的頻段進(jìn)行計(jì)算。
六、設(shè)計(jì)菜單、工具欄及其他可以調(diào)出轉(zhuǎn)換窗體的輸入方式。
//比較簡單,一般的資料上都會有,代碼中也有注釋。
最后,再假裝很懂的樣子提2個(gè)建議MB編程的建議
建議1:所有需要呈現(xiàn)的字段、提示等都用變量賦值,而不是直接用字符串代入,這樣可以方便后續(xù)多語言的實(shí)現(xiàn)。
建議2:避免單個(gè)MB文件開發(fā),盡量模塊化程序,如果插件的功能足夠多,幾十上百個(gè)文件也是很正常的。比如本實(shí)例其實(shí)是模塊化的插件中的一小部分,模塊化后,團(tuán)隊(duì)協(xié)作開發(fā)各功能會很高效,是的,MB可以是很多人的戰(zhàn)斗。
------
以上簡單描述了1個(gè)小功能用MB實(shí)現(xiàn)的步驟,僅供交流MB編程,希望對MB入門有所幫助。昨晚搞完,一直404,補(bǔ)發(fā)一下附件。
[
本帖最后由 adsn 于 2016-5-8 08:41 編輯 ]