GROW_BASE介绍培训.pdf
《GROW_BASE介绍培训.pdf》由会员分享,可在线阅读,更多相关《GROW_BASE介绍培训.pdf(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、GROW_BASE 开发介绍 GROW_BASE 的组成的组成 GROW_BASE 是 GROW_N 系列的核心,即 AM/FM/GIS 开发平台,在 GROW_BAS 上的基础上是各行业的版本:GROW_POWER、GROW_TELECOM、GROW_GAS 等。GROW_POWER GROW_GAS GROW_TELECOM GROW_BASE GROW_WEB GROW_PRINTGROW_TOOLS GROW_BASE 本身提供对基本设施对象的描述:它包括了对设施的空间数据、属性数据的管理、空间数据与属性数据的一致性管理、以及描述了一种最基础的路口、路段拓扑结构模型,以及此模型的有关基
2、本算法组成。基本拓扑算法 事务管理器属性数据管理 空间数据管理 GrowEdit GrowKernel GrowNet GrowConvertgendbdlg dbface 事务管理公共接口 图数管理 GROW_BASE 的新特性的新特性?把原来的 API 函数接口重新用类进行了封装,系统的扩展性大大加强。?从库中去掉主函数,提供从 CWnd 派生类 CGkGBaseWin,负责 GROW 图形数据的显示和操作,把主界面的编制完全交由应用程序完成,应用程序对程序编写的灵活性大大增加。?把实体对象抽象成结点类后,对实体对象的操作统一了;应用程序可以根据需要灵活派生出自己的实体对象,系统的扩充性和
3、可重用性大大加强。?对路网的支持进一步加强,取消了原来路口、路段、路名必须在同一块中,且路口、路段、路名必须是连续的三个图层的约束条件,仅保留了要求路段与路名在同一块中的约束条件;使对路网的使用更加灵活,可以描述各种设施对象组成的网;另外,在路口、路段上可以直接通过指针访问相连接的路口或路段,使搜索效率进一步提高。?提供对事务的支持,使图形与属性的一致性修改得以保证。可以很容易地支持增量编辑。?对数据配置、存储规范管理,内置 Client 的程序无须再进行编程,网络编程大大简化。GROW_BASE 中的几个重要对象中的几个重要对象 结点对象结点对象 CGkNode 1、1 GROW 的实体包括
4、点、线、多边形、文本、路口、路段、路名、实体集,为了描述它们,GROW 抽象出了一个结点类 CGkNode,并以 CGkNode 为基类派生了 CGkPoint,CGkPline,CGkPlgon,CGkText,CGkRNode(从 CGkPoint 派生),CGkREdge(从 CGkPline 派生),CGkRName 来分别描述以上实体。应用程序可以直接使用 GROW 提供的各种标准结点,还可以从上面进一步派生自己的结点对象 其派生关系如下:CGkNodeCGkPointCGkPlineCGkTextCGkPlgonCGkGroupCGkREdgeCGkRNodeCGkRNameIGk
5、NodeCGkPlgonContour 12、结点的创建、修改、查询、删除等操作 创建:long new_id;/Line 1 CGkPoint*pNode=(CGkPoint*)global-NodeNew(GK_ENTITY_POINT);/Line 2 CGkBlock*pBlock=global-GetBlock(BLOCK_DEMO_EXEC);/Line 3 pBlock-GetFreeID(1,1000,&new_id);/Line 4 pNode-Setup(new_id,LAYER_TEST,vtx,7,2.0f,0.0f);/Line 5 pBlock-InsertNode
6、(pNode);/Line 6 修改:pNode-SetSymbol();pNode-GetVtx(&vtx,GK_TRUE);vtx00=0.0;pNode-Update();查询:CgkNode*node=block-GetNode(100);删除:block-DropNode(node);13、自定义结点 1.3.1 关于 m_eType 的定义:最低一个字节由 Grow_Base 解释,表示基本图形结点类型,第 2、3 字节通常由应用平台解释,第 4 字节由应用层解释。装入数据或程序中需要 New 一个结点时,通过 CgkGlobal:NodeNew(long etype)创建结点对象
7、。GROW 装入和保存结点数据时,调用对象指针的 Load 和 Save 成员函数来实现:void CMyPoint:Load(IGkDIOBase*pDIOBase,Uchar cind)/Load 函数的实现 char buf256;/申请空间从文件中读取数据 CGkPoint:Load(pDIOBase,cind);/调用基类的 Load 函数读取点的数据 pDIOBase-LoadFloat(&dx,sizeof(float);/以下按照存入时的顺序读取文本数据 pDIOBase-LoadFloat(&dy,sizeof(float);pDIOBase-LoadFloat(&dz,si
8、zeof(float);pDIOBase-LoadString(buf);text=new char256;strcpy(text,buf);pDIOBase-LoadString(buf);font=new char256;strcpy(font,buf);void CMyPoint:Save(IGkDIOBase*pDIOBase)/Save 函数的实现 CGkPoint:Save(pDIOBase);/调用基类的 Save 完成点数据的保存 pDIOBase-SaveFloat(&dx,sizeof(float);/依次保存和文本有关的数据 pDIOBase-SaveFloat(&dy,
9、sizeof(float);pDIOBase-SaveFloat(&dz,sizeof(float);pDIOBase-SaveString(text);pDIOBase-SaveString(font);其他常用虚函数:virtual void Update();virtual int GetVtx(VTX*,GkBoolType for_update=GK_FALSE);virtual int GetOutline(VTX*,CGkGBaseWin*p=NULL);virtual long GetNodeType();virtual CGkNode *CloneNode(GkBoolTyp
10、e With_Data=GK_FALSE);virtual void Draw(CGkGBaseWin*win);virtual void OwnDraw(CGkGBaseWin*win);virtual void CopyData(CGkNode*);virtual void Load(IGkDIOBase*,Uchar cind);virtual void Save(IGkDIOBase*);virtual GkBoolType Pick(GkPickType*sort_pick,CGkGBaseWin*p,float aperture);virtual GkBoolType Trap(G
11、kTrapType*sort_pick,CGkGBaseWin*p,CGkClip*);virtual void Export(FILE*);virtual GkBoolType FreeRelated();virtual GkBoolType InsertToBlockCB();virtual void SetMinMax();virtual GkBoolType ReadyToDrop();virtual GkBoolType ReadyToUpdate();virtual GkBoolType ReadyToReference();virtual GkBoolType WithAttri
12、bute();/此类结点有属性 virtual GkBoolType HasAttribute();/本结点已经有属性相对应 virtual GkBoolType AddAttribute(CWnd*parent_wnd);/添加属性 virtual GkBoolType QueryAttribute(CWnd*parent_wnd);/查询属性 virtual GkBoolType DeleteAttribute(CWnd*parent_wnd);/删除属性 virtual GkBoolType ModifyAttribute(CWnd*parent_wnd);/修改属性 块对象块对象 CG
13、kBlock 21、块操作:创建、查询、删除、装入块数据、保存块数据、装入结点数据、保存结点数据、释放数据 创建:CgkBlock*block=new CgkBlock(global,1);Global-InsertBlock(block);查询:global-GetBlock(1);删除:global-DropBlock(block);/注意:表示连数据文件一起删除 装入块数据:global-LoadBlocks 保存块数据:global-SaveBlocks 装入结点数据:block-LoadNodes 保存结点数据:block-SaveNodes 释放数据:block-Free 22 块
14、与块组:块组是为了对块进行有效分配,方便预先统一设置块的属性 块组可以通过 grow,.ini 进行配置,并在 LoadGrowIni 函数中根据配置自动创建,并设置属性。块创建时根据其 ID 范围插入相应的块组,具有相应块组设置的属性。23 块与数据存储的关系 数据从存储文件形式分成两类:1 按块+图层方式存储,当块号=0 时,目录名 b%07ld.%03ld,bid 代表该块的数据目录,当块号=0 时,文件名 b%10ld.axf,bid 代表该块的数据文件,当块号Load()装入数据。对应用程序而言,只需设置 NetworkDeliver 为 Increment,则在事务提交的时候,GR
15、OW会负责传送变化数据包,并本地采用增量方式存盘(不直接修改源数据文件,而是在增量文件(c%10ld,bid)中记录数据变化,仅在系统退出或装入文件时合并到源文件中)。服务器的内置 Client 接收到此类数据包后负责数据修改保存。其它客户端接收到数据包后也采取增量方式存盘。注意:在接收端,即使没有装入此块的数据,也可以接收和保存数据。b、客户端修改的数据在事务提交时 GROW 会先根据数据的修改本地进行保存,然后通过PutFile 的方式放到服务器的相应目录上。在调用 block-Load 装入该块的数据时,grow 会先检查本地的文件与服务器上的文件的一致性,如果一致,直接使用本地数据,否
16、则从服务器上获取相应的文件到本地,更新本地文件,然后再装入数据。客户端的存储目录是:.datasysfiledata2,服务器端的目录是 sysfiledata2。对应用程序而言,只需设置 NetworkDeliver 为 Whole,则在事务提交的时候,GROW会负责本地保存数据,并把其存放到服务器的相应目录下。其它客户机当下次需要装入本块的数据时,检查发现服务器上的版本已经更新,会从服务器装入相应修改后的数据。适用范围:通常整体修改,其它客户端无须及时更新的数据。例如地理图、剖面图、平面图等。注意,此类数据的存放路径和文件必须符合数据存储规范。直接使用 block-Load()装入数据。c
17、、其他数据,不需要 GROW 负责对此类数据装入、保存、网络同步进行管理,应用程序必须自己完成相应工作。如:装入用 DataFileLoad、保存用 DataFileSave、发送到服务器用PutFile、从服务器获取用 GetFile(如果是 AXF 文件,本地有缓冲文件,可使用 GetAXFFile,能对数据版本进行判断)。客户端的存储目录是:.datauserfile,服务器端的目录是 userfile。适用范围:数据与装入哪一块没有确定的一一对应关系,文件存储路径随意性比较大,可能同时需要保存非 AXF 文件等。例如:专题图、二次图等。对应用程序而言,对此类块应在配置文件中设置 Net
18、workDeliver 为 No。2.5、对数据按区域部分装入数据的支持:只要设置 block-SetLoadBound,设置装入区域,则 Block-Load,DataFileLoad 函数只装入落在该范围中的数据。仅对完整落在区域中的数据进行编辑。例如:只装入了路段,没有装入路口,则该路段不允许删除,或修改与该路口的连接。同样地,如果只装入了路口,没有装入路段,则该路口不允许修改和删除。26、块的遍历 void RangeExec(long,long,IGkNodeRangeCB*);class IGkNodeRangeCB public:virtual GkBoolType NodeRa
19、ngeCB(IGkNode*)=0;class NodeSave:public IGkNodeRangeCB public:FILE*save_fp;GkBoolType NodeRangeCB(IGkNode*node1)CGkNode*node=(CGkNode*)node1;long lockid=0;gk_OutLong(save_fp,node-m_ID);.return GK_FALSE;SaveAllNode()NodeSave node_save;FILE*save_fp;if(save_fp=fopen(file,wb)=NULL)return GK_FALSE;node_s
20、ave.save_fp=save_fp;block-RangeExec(LONG_MIN,LONG_MAX,&node_save);图层对象图层对象 CGkLayer 即原来的 GkClassType,把 Class 改名成 Layer。1、创建:1 1 通过 grow.ini 的方式配置,在 LoadGrowInit 函数中根据配置建立图层。1 2 设置静态数组 GkLayerType app_layer=,调用 global-CreateLayerArray()建立图层。以下是 grow.ini 配置的例子:Layer_Info LayerNumber=12 Layer_0 name=房屋
21、 level=1 flag=PLGON|DETAIL|PLINE|TEXT|OWN_DRAW group=1 nstatus=0 Layer_1 name=草地 level=1 flag=PLGON group=1 nstatus=1 Layer_1_Status_1 name=S1.2、设置、读取参数设置:layer-SetLineWidth();layer-GetLineWidth();等等 图形窗口对象图形窗口对象 CGkGBaseWin、CGkGWin CGkGBaseWin 是图形基本窗口类,直接从 CWnd 派生,是 CGkGWin 的基类,原来的gk_sys_data 现在主要存
22、放在 CGkGBaseWin 的成员变量 m_SysData 中,与窗口相关。需要注意与之相关的两个类:CGkBlockSetting:设置块的可见性,CGkLayerSetting 设置类的可见性,CGkGBaseWin 就是通过应用 m_LayerSetting 和 m_BlockSetting 成员变量设置与窗口相关的可见性;如果把一类窗口的这两个变量指向同一类指针,可实现某一类窗口使用同一套图层设置参数。总之,每个图形窗口有独立的显示投影参数(m_SysData),有独立的显示对象集合,也可以有独立显示块和显示图层,使对各种显示的控制非常灵活,无须担心修改一个图形窗口的有关参数后影响其
23、他图形窗口。CGkGWin 在 CGkGBaseWin 的基础上,主要提供对鼠标、键盘事件进行处理,以及图形子窗口的支持。利用成员函数 virtual void CallTool(int mode)可以调用各种 GROW 定制的跟窗口有关的功能,如开窗、漫游、放大等。对于鼠标事件和 Popup 平面,原来都是使用回调函数实现,现在都类似于 BlockRangeExec 的方式进行了修改,具体见例子。1、创建 以下是在多文档窗口中建立图形窗口的例子:BOOL CTestmView:Create(LPCTSTR lpszClassName,LPCTSTR lpszWindowName,DWORD
24、dwStyle,const RECT&rect,CWnd*pParentWnd,UINT nID,CCreateContext*pContext)/TODO:Add your specialized code here and/or call the base class BOOL r=CWnd:Create(lpszClassName,lpszWindowName,dwStyle,rect,pParentWnd,nID,pContext);if(gwin=NULL)GkGWinParaType gwpara;RECT rect;gwpara.flag=GK_GFLAG_2BUF|GK_GFL
25、AG_DEPTH|GK_GFLAG_SYS_LAYER;gwpara.bgcolor=GK_SYS_LAYER_MAINBG;rect.left=0;rect.top=0;rect.right=100;rect.bottom=100;gwin=new CMyGWiin(global,&gwpara);gwin-Create(0,glwmain,0,rect,this,0);return r;void CTestmView:OnSize(UINT nType,int cx,int cy)CView:OnSize(nType,cx,cy);if(gwin&cx!=0&cy!=0)gwin-SetW
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GROW_BASE 介绍 培训
限制150内