【正文】
這里包括了可行性研究與需求分析。其軟件平臺(tái)采用的是Microsoft Windows 2000操作系統(tǒng)。l 操作可行性系統(tǒng)大量地采用了Windows下的繪圖操作概念,使得用戶(hù)容易上手,軟件簡(jiǎn)單易學(xué),大大提高了軟件使用的效率。l 上海富洋科技發(fā)展有限公司提供的內(nèi)部技術(shù)資料需求分析的任務(wù)是對(duì)目標(biāo)系統(tǒng)提出完整、準(zhǔn)確、清晰、具體的要求。為了方便AGV系統(tǒng)的處理,一個(gè)大的場(chǎng)景(場(chǎng)地)可以由一個(gè)個(gè)小的場(chǎng)地(子場(chǎng)景)組成。路徑是由一段一段的線段連接而組成的。 (以上數(shù)據(jù)的精度在以“米”為單位是小數(shù)點(diǎn)后1到7位)要保存一個(gè)完整的軌跡工程,就需要以上所有數(shù)據(jù)的支持。將輸入系統(tǒng)中的數(shù)據(jù)應(yīng)圖形的方式顯示出來(lái),并能夠根據(jù)用戶(hù)的要求或者窗口大縣的變化及時(shí)調(diào)整圖形,按照一定比例進(jìn)行縮放;同時(shí)繪制系統(tǒng)還要為輸入系統(tǒng)提供必要的坐標(biāo)轉(zhuǎn)換參數(shù)。第三章 系統(tǒng)設(shè)計(jì)本章將介紹軟件系統(tǒng)的總體設(shè)計(jì)階段。抽象原則1. 模塊化模塊是數(shù)據(jù)說(shuō)明、可執(zhí)行語(yǔ)句等程序的集合,它是單獨(dú)命名的而且可以通過(guò)名字來(lái)訪問(wèn),例如,過(guò)程、函數(shù)、子程序、宏等等都可以作為模塊。因?yàn)樽儎?dòng)往往只涉及少數(shù)幾個(gè)模塊,所以也可提高軟件的可修改性。在抽象的最高層次使用問(wèn)題環(huán)境的語(yǔ)言,以概括的方式敘述問(wèn)題的解法;在較低抽象層次采用更過(guò)程化的方法;在最低層次用可以直接實(shí)現(xiàn)的方式敘述問(wèn)題的解法。如果在測(cè)試期間和以后的軟件維護(hù)期間需要修改軟件,那么使用信息隱蔽原理可以帶來(lái)極大的好處。這是由于能夠分割功能而且接口可以簡(jiǎn)化;第二,獨(dú)立的模塊比較容易測(cè)試和維護(hù)。 采用面向?qū)ο蟮脑O(shè)計(jì)方法面向?qū)ο蟮某绦蛟O(shè)計(jì)方法學(xué)是建立在過(guò)程化、模塊化程序設(shè)計(jì)方法學(xué)之上的。對(duì)象則是類(lèi)的具體化、實(shí)例化。(2) 把所有對(duì)象都劃分為各種對(duì)象類(lèi),每個(gè)對(duì)象都定義了一組數(shù)據(jù)和一組方法。也就是說(shuō),一切局部與該對(duì)象的私有信息,都被封裝在對(duì)象類(lèi)的定義中,就好像裝在一個(gè)不透明的黑盒子中一樣,更不能直接使用。面向?qū)ο蟮脑O(shè)計(jì)方法的基本原則,是按照人們習(xí)慣的思維方式建立問(wèn)題域的模型,開(kāi)發(fā)出盡可能直觀、自然的表現(xiàn)求解方法的軟件系統(tǒng)。(3) 可重用性好對(duì)象所固有的封裝性和信息隱藏機(jī)理,使得對(duì)象內(nèi)部的實(shí)現(xiàn)與外界隔離,具有較強(qiáng)的獨(dú)立性。 結(jié)構(gòu)設(shè)計(jì)在本小結(jié)中,我們將根據(jù)需求分析中提出的要求定義本系統(tǒng)所用到的數(shù)據(jù)結(jié)構(gòu),以及本系統(tǒng)的軟件結(jié)構(gòu)。因此,設(shè)計(jì)一個(gè)工程文件來(lái)存放一個(gè)軌跡工程的場(chǎng)景、反射板、路徑數(shù)據(jù)文件的名稱(chēng),用打開(kāi)這個(gè)工程文件來(lái)讀取所有的數(shù)據(jù)變得非常必要。又如VC開(kāi)發(fā)源程序項(xiàng)目,也是通過(guò)工程文件dsw/、.h、.res構(gòu)成的。 工程名 sUserName As String 39。 保存反射板的文件名 sGDFName As String 39。專(zhuān)用類(lèi)有關(guān)于繪制系統(tǒng)的類(lèi),如場(chǎng)地類(lèi)、直線類(lèi)、圓弧類(lèi)、反射板類(lèi)。坐標(biāo)轉(zhuǎn)換,提供窗口坐標(biāo)和物理坐標(biāo)的互換。本章小結(jié)通過(guò)對(duì)軟件系統(tǒng)的結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)的分析,我們基本獲得了編寫(xiě)軟件的信息,為后面的詳細(xì)設(shè)計(jì)和系統(tǒng)地實(shí)現(xiàn)打下了良好的基礎(chǔ)。 系統(tǒng)的實(shí)現(xiàn)在VB開(kāi)發(fā)系統(tǒng)中,代碼可以處于三個(gè)部分:窗口,模塊,類(lèi)模塊。首先,VB并沒(méi)有完全支持類(lèi),它僅僅提供了對(duì)類(lèi)“封裝性”的支持,無(wú)法完成“繼承性”,因此在很多媒體中都將VB稱(chēng)作“基于對(duì)象”的程序開(kāi)發(fā)語(yǔ)言。2. 本系統(tǒng)使用到21個(gè)類(lèi),其中9個(gè)類(lèi)為本軟件專(zhuān)用,而其余的是通用類(lèi)模塊。l CCircle類(lèi)提供了關(guān)于圓弧的操作。(2)Public Function InWinRect(ByVal X As Single, ByVal Y As Single, ByVal Left As Single, ByVal Top As Single, ByVal Right As Single, ByVal Buttom As Single, Optional ByVal IsIncludeBound As Boolean = True) As Boolean 目的:判斷一個(gè)點(diǎn)是否在指定的矩形框內(nèi)(窗口坐標(biāo)系,即原點(diǎn)向下作為y軸正向);參數(shù):x,y一個(gè)點(diǎn)的坐標(biāo);Left,Top,Right,Buttom指定了一個(gè)矩形框;isIncludeBound是否將當(dāng)一個(gè)點(diǎn)在矩形邊框上時(shí)也作為在矩形內(nèi)。注:有關(guān)如何在中VB使用指針,將在后面介紹。(2)Public Sub Window2World(ByVal x1 As Integer, ByVal y1 As Integer, ByRef x2 As Single, ByRef y2 As Single, ByVal ox As Integer, ByVal oy As Integer, ByVal iGridWidth As Integer)目的:將一個(gè)窗口坐標(biāo)系的坐標(biāo)轉(zhuǎn)換為世界坐標(biāo)系;參數(shù):x1,y1窗口坐標(biāo)系中的坐標(biāo)值,x2,y2世界坐標(biāo)系的坐標(biāo)值,ox,oy同上,iGridWidth同上。一個(gè)INI文件的內(nèi)容類(lèi)似于:[Section]key=value…方法:(1) Public Function SaveSetting(ByVal Section As String, ByVal key As String, ByVal Value As String)目的:設(shè)置一個(gè)項(xiàng)目值;參數(shù):Section設(shè)置“Section”,key設(shè)置“key”,value設(shè)置“value”(2) Public Function GetSetting(ByVal Section As String, ByVal KeyName As String) As String目的:獲得一個(gè)項(xiàng)目值參數(shù):Section設(shè)置“Section”,key設(shè)置“key”;返回值:將[Section]下的key值返回(3) Public Function SetiniFileNameRelatedtoAPP(ByVal Ini_FileName As String) As String目的:設(shè)置應(yīng)用程序配置文件INI的文件名;參數(shù):Ini_FileName不帶路徑的文件名。l CFY_Lines類(lèi)與CFY_Circles類(lèi)這兩個(gè)類(lèi)模塊是組成本應(yīng)用程序的重要模塊之一,它們主要完成對(duì)直線/圓弧數(shù)據(jù)的保存,提取,計(jì)算,繪制等功能。這兩個(gè)類(lèi)共有的一些操作有:a. 添加b. 查找c. 編輯修改d. 刪除e. 枚舉所有的對(duì)象下面是這些操作的流程圖:添加一條數(shù)據(jù)尋找一個(gè)空閑的數(shù)組位置編號(hào)是否已經(jīng)使用線段/半徑長(zhǎng)度合法嗎否是將數(shù)據(jù)存放到指定的位置完成添加添加失敗流程圖:添加一條數(shù)據(jù):尋找一個(gè)空閑的數(shù)組位置準(zhǔn)備從數(shù)組元素0開(kāi)始查找檢查flags標(biāo)志找到了,返回其數(shù)組序號(hào)FT移到下一個(gè)元素下一個(gè)數(shù)組元素存在嗎返回其數(shù)組上限+1是否流程圖:如何尋找一個(gè)空閑的數(shù)組位置查找,已知線段號(hào)=1?返回:未找到線段號(hào)是否存在存在返回?cái)?shù)組序號(hào),反之,返回1由獲得的數(shù)組序號(hào)找到元素返回:找到是否流程圖:查找一條線段/圓弧編輯,已知線段號(hào)=1?線段號(hào)是否存在存在返回?cái)?shù)組序號(hào),反之,返回1由獲得的數(shù)組序號(hào)找到元素是否編輯失敗編輯的數(shù)據(jù)是否合法編輯成功否是流程圖:編輯一條線段/圓弧刪除,已知線段號(hào)=1?線段號(hào)是否存在存在返回?cái)?shù)組序號(hào),反之,返回1由獲得的數(shù)組序號(hào)找到元素否刪除成功流程圖:刪除一條線段/圓弧將其flag標(biāo)志置否刪除,已知線段號(hào)數(shù)組序號(hào)i表示的數(shù)據(jù)是否有效由數(shù)組序號(hào)找到元素否退出流程圖:枚舉所有的線段/圓弧(其中靜態(tài)變量i指向某個(gè)元素)i=i+1,函數(shù)返回TruebInit=True將靜態(tài)變量i =0是有效i=i+1數(shù)組序號(hào)i是否存在無(wú)效是函數(shù)返回False否類(lèi)似使用這些操作的還有類(lèi)模塊:CFY_DrawItemDatas類(lèi)、CFY_BaffleBoard類(lèi)、CFY_Ground類(lèi)、CPAutoConnect類(lèi)。將數(shù)組中flag為有效的元素將其坐標(biāo)轉(zhuǎn)換為窗口坐標(biāo)后,繪制在指定的PictureBox上。前面已經(jīng)講到了與CFY_Lines和CFY_Circles有相似操作的還有CFY_DrawItemDatas類(lèi)、CFY_BaffleBoard類(lèi)、CFY_Ground類(lèi),因此我們緊接著就介紹這三個(gè)類(lèi)。 這些操作的使用過(guò)程是:1. 添加向類(lèi)中添加一條記錄,函數(shù)一般以“Add”冠名,其參數(shù)格式為(唯一的序號(hào),這條數(shù)據(jù)的詳細(xì)信息); 一般,還有兩種添加方式。這個(gè)函數(shù)主要用于非“捕捉端點(diǎn)”時(shí)繪制圓弧的函數(shù)調(diào)用。如果找到這條記錄,其數(shù)據(jù)將在隨后的參數(shù)中傳遞。 可以進(jìn)行編號(hào)修改,即其數(shù)據(jù)的修改。5. 枚舉 將類(lèi)中的數(shù)據(jù)一一列出。以下是文件操作的流程:寫(xiě)文件(ByVal sFileName As String, ByVal blOverWrite As Boolean)其中sFileName指定的文件名,blOverWrite當(dāng)sFileName指定的文件存在時(shí),是否覆蓋。讀文件(ByVal sFileName As String)其中sFileName指定的文件名,則讀取成功,否則讀取失敗。例如:有窗口坐標(biāo)系坐標(biāo)(X1,Y1),世界坐標(biāo)系坐標(biāo)(X2,Y2)則若已知(X1,Y1),求(X2,Y2):X2=(X1 – 世界坐標(biāo)系原點(diǎn)在窗口中的坐標(biāo)X) / 網(wǎng)格寬度Y2= (世界坐標(biāo)系原點(diǎn)在窗口中的坐標(biāo)Y Y1) / 網(wǎng)格寬度若已知(X2,Y2),求(X1,Y1): X1 = X2 * 網(wǎng)格寬度 + 世界坐標(biāo)系原點(diǎn)在窗口中的坐標(biāo)X Y1 = Y2 * 網(wǎng)格寬度 + 世界坐標(biāo)系原點(diǎn)在窗口中的坐標(biāo)Y另外,由于“多場(chǎng)地”的關(guān)系,這里的世界坐標(biāo)系的“原點(diǎn)”是相對(duì)的,它只是本場(chǎng)地的原點(diǎn),即世界坐標(biāo)系的原點(diǎn)可能不是從(0,0)開(kāi)始,可能從比如(10,20)開(kāi)始,此時(shí)世界坐標(biāo)系真正的原點(diǎn)可能在窗口之外了。(2) Public Sub SetLW(ByVal nLength As Single, ByVal nWidth As Single, Optional ByVal boX As Single = 0, Optional ByVal boY As Single = 0)目的:設(shè)置場(chǎng)地長(zhǎng)寬;參數(shù):(box,boy)是世界坐標(biāo)系中相對(duì)原點(diǎn)的值,nLength,nWidth是場(chǎng)地的長(zhǎng)寬。(3) AutoZeroXY自動(dòng)調(diào)整世界坐標(biāo)系相對(duì)原點(diǎn)在窗口坐標(biāo)系的坐標(biāo)。一個(gè)工程將由4個(gè)文件組成,分別是:工程文件:用于保存工程信息,如工程名稱(chēng)、創(chuàng)建人、工程的描述等;以及相關(guān)的文件,如場(chǎng)地信息、線段數(shù)據(jù)和反射板數(shù)據(jù);場(chǎng)地信息文件:保存了場(chǎng)地的數(shù)據(jù);線段數(shù)據(jù)文件:保存了線段/圓弧的數(shù)據(jù);反射板數(shù)據(jù)文件:保存了反射板數(shù)據(jù)文件。工程名 sUserName As String 39。 sBBFName As String 39。l CCommandLine類(lèi)處理命令行參數(shù)。又如Dos中“format c:/q”表示格式化c盤(pán)并采用快速模式。但是需要注意的是由于Windows系統(tǒng)對(duì)長(zhǎng)文件名的支持,允許文件名路徑名中存在空格,如:“c:\my document\”,此時(shí)如果按照空格分割,就會(huì)產(chǎn)生錯(cuò)誤,獲得了“c:\my”這個(gè)參數(shù)。c. 重復(fù)b直到數(shù)組結(jié)束(2) Public Function Count() As Integer目的:獲得命令行中包含的參數(shù)個(gè)數(shù);(3) Public Function GetCmds() As String()目的:獲得分割好的命令參數(shù);返回:分割好的命令參數(shù)數(shù)組l CCommonDlgCtl類(lèi)這是一個(gè)使用Win API函數(shù)實(shí)現(xiàn)VB中“Microsoft Common Dialog Control ”控件的類(lèi),以此來(lái)減少對(duì)控件的使用,降低程序的復(fù)雜性。(2)“字體”對(duì)話框Public Function APIChooseFont(ByVal hWnd As Long, cFont As StdFont) As Boolean傳入窗口句柄hWnd和字體對(duì)象cFont,選擇的字體將返回到字體對(duì)象cFont中。(4)“打印”對(duì)話框Public Function APIPrintDlg(ByVal hWnd As Long, Optional nFromPage As Long, Optional nToPage As Long, Optional nMinPage As Long, Optional nMaxPage As Long, Optional nCopies As Long) As Boolean傳入窗口句柄hWnd、起始頁(yè)號(hào)nFromPage、終止頁(yè)號(hào)nToPage、最小頁(yè)號(hào)nMinPage、最大頁(yè)號(hào)nMaxPage、打印份數(shù)nCopies,在窗口中按“確定”函數(shù)返回True,否則返回False。圖的定義和術(shù)語(yǔ)圖是一種數(shù)據(jù)結(jié)構(gòu),它的形式化定義為Graph=(V,R)其中V={x|x∈dataobject}R={VR}VR={x,y|P(x,y)∧(x,y∈V)}在圖中的數(shù)據(jù)元素通常稱(chēng)作頂點(diǎn)(Vertex),V是頂點(diǎn)的有窮非空集合;VR是兩個(gè)頂點(diǎn)之間關(guān)