本文主要介绍了装备保障方案生成系统的功能,给出了装备保障方案生成系统的模型,并讨论了在VC下编程实现的技术难点。
1.1 生成保障态势
保障态势在电子地图系统(包括海图)上生成。指挥人员可以在所需地图上进行图上作业,设置装备保障点、选择装备保障类型、设定装备保障力量、计划装备保障时间和标绘保障意图等等。因此,该功能的实现需要开发一套GIS系统(地理信息系统),包括矢量图形系统(包括军标标绘)、装备保障信息数据库管理系统、矢量图形系统和数据库管理系统之间的连接、信息查询功能、空间信息统计和分析功能等等。
1.2 生成保障方案
保障方案的项目可以由用户事先定制。这里提供了一个保障方案生成的向导,主要针对装备保障任务和装备保障部队为实现保障决心而采取的行动计划,基本上能满足用户需要。
装备保障方案的数据描述由下列要素构成:
l 保障对象
l 保障目标
l 保障环境
l 保障需求分析
l 现有保障能力分析
l 保障决心
l 指挥机构的组织与设置
l 保障任务区分(子任务)
l 保障力量编组
l 通信与警戒防卫需求
l 保障行动计划
l 保障协调计划
l 保障环境建设
l 请求支援的问题
l 对该方案的评估
1.3 生成保障文档
装备保障方案由二种形式表现:保存于数据库中的装备保障方案数据描述和保存于各类文件的保障文档。因此,在装备保障方案生成系统中我们集成了Office系统,以便能在本系统中生成Word、Excel、Rtf和PowerPoint类型的文档。
1.4 自动提交方案文档
当用户利用GIS系统生成保障态势,利用向导生成保障方案,利用集成的Office系统拟定保障文档后,自动提交方案系统可根据用户需求将数据库和文件中的本次保障任务的所有相关数据提取出来,生成一份完整的供审批或下发的规范的方案文档。
2 装备保障方案生成系统的模型
在装备保障指挥自动化平台的构件中,采用“主板+插件”的构造方式[2],解决了装备保障指挥自动化系统的分布性、灵活性和开放性问题,使系统能够根据不同的作战情况变化灵活地进行重组与扩充,并能够随着各种新技术的发展进行升级和增加新的子系统。新的子系统以“插件”的形式通过“镶嵌”的方式“挂入”平台,这样可以很好地解决联合保障中不同类型系统之间的互连、互通和互操作问题。装备保障方案生成系统就是作为“插件”嵌入到装备保障指挥自动化平台中
3 装备保障方案生成系统开发实例
装备保障方案生成系统在编程实现时,主要的技术难点有:电子地图的加载、矢量图形系统与数据库管理系统的连接、GIS系统中空间信息的统计和分析、保障方案的协同处理、Office系统的集成、自动提交方案文档和数据库的访问。这里主要结合VC简单介绍一些难点的实现方法(工程名为EADPMS)。
3.1 添加模板
根据本系统的需要,我们添加了保障态势图模板、Office类保障文档模板和保障方案向导模板。首先在EADPMS.h头文件定义相关的对象指针。
CTypedPtrList<CObList,CMultiDocTemplate*> m_myFileTypeList; //保障态势的文件模板的链表
CTypedPtrList<CObList,CMultiDocTemplate*> m_officeFileTypeList; //Office的文件模板的链表
CTypedPtrList<CObList,CWizardTemplate*> m_wizardList; //保障方案向导的链表
然后,在EADPMS.cpp文件中添加模板。
BOOL CEADPMSApp::InitInstance()
{
…
CMultiDocTemplate* pDocTemplate;
(1)增加保障态势模板
pDocTemplate = new CMultiDocTemplate(
IDR_TSTTYPE,
RUNTIME_CLASS(CTstDoc),
RUNTIME_CLASS(CTstMDIChildFrame), // custom MDI child frame
RUNTIME_CLASS(CTstView));
AddDocTemplate(pDocTemplate);
m_myFileTypeList.AddTail(pDocTemplate);
(2)增加Office文件模板
pDocTemplate = new CMultiDocTemplate(
IDR_MYWORDTYPE,
RUNTIME_CLASS(CMyWordDoc),
RUNTIME_CLASS(CRTFChildFrame), // custom MDI child frame
RUNTIME_CLASS(CMyOfficeView));
pDocTemplate->SetContainerInfo(IDR_OFFICETYPE_CNTR_IP);
AddDocTemplate(pDocTemplate);
m_officeFileTypeList.AddTail(pDocTemplate);
(3)增加保障方案向导模板
AddWizardTemplate(new CWizardTemplate(
IDR_SPECIALTYPLAN,
RUNTIME_CLASS(CSpecialtyPlan)));
…
}
3.2 Office的集成
本系统通过Ole来实现Office的嵌入。EADPMS工程中基于COleDocument类生成一个CMyOfficeDoc类,我们在这个类中激活相应的Office办公软件。有关Word、PowerPoint、Excel图表和Excel工作表的CLSID码分别为:
{0x00020906,0,0,{0xc0,0,0,0,0,0,0,0x46}、{0x64818d10,0x4f9b,0x11cf,{0x86,0xea,0,0xaa,0,0xb9,0x29,0xe8}}、{0x00020821,0,0,{0xc0,0,0,0,0,0,0,0x46}}和{0x0020820,0,0,{0xc0,0,0,0,0,0,0,0x46}}。
这样我们就可以在MyOfficeDoc.cpp中通过CLSID码来激活Office系统。
BOOL CMyOfficeDoc::OnNewDocument()
{
…
COfficeDocItem* pItem = new COfficeDocItem(this);
pItem->m_lpStorage = m_lpRootStg;
pItem->m_lpStorage->AddRef();
pItem->CreateNewItem(CLSID) //通过CLSID值激活Office应用程序
…
}
3.3 GIS系统中空间信息的统计和分析
空间信息统计和分析功能是GIS系统的一个基本功能,其本质就是利用图形元素的空间拓扑关系,通过图形元素来实现对信息数据的统计和分析。主要通过以下两个步骤来完成:
在矢量图形上,按照各种图形元素的拓扑关系得到需要统计和分析的矢量图形元素,涉及到图形元素的选择方法。主要有点选、区域选择、线类相交操作选择和区域相交操作选择。
对选择的图形元素的性质数据信息进行统计和分析。
GIS系统的空间信息统计和分析功能,并不是为了对矢量图形元素进行统计和分析,而是以矢量图形元素作为操作的中介,实现对性质数据的统计和分析功能。也就是说,要统计分析的是记录在数据库管理系统的数据表中的装备保障数据信息。
3.4 自动提交方案文档
自动提交方案文档的主要功能是将记录在数据库管理系统的数据表中的装备保障方案数据提取出来,在Office中以表或电子表格的形式保存。
装备保障方案数据提取是通过一系列数据视图来实现的,这些视图来源于装备保障方案的原始数据表中,依据方案文档的输出要求生成。
文档的自动生成通过2个函数来完成,函数CopyFromTable按需要的格式自动生成文档表格。
void CopyFromTable(CSession *pSession,_Document *pdoc,LPCTSTR strTableName)
{…
读取数据视图
pBind = new MYBIND[m_ulFields];
rs.CreateAccessor(m_ulFields, pBind, sizeof(MYBIND)*m_ulFields);
for (ULONG l=0; l<m_ulFields; l++)
rs.AddBindEntry(l+1, DBTYPE_STR, sizeof(TCHAR)*500, &pBind[l].szValue,
NULL, &pBind[l].dwStatus);
// Create a rowset containing data.
m_strQuery.Format("select * from %s", strTableName);
if (rs.Open(*pSession, m_strQuery) != S_OK);
…
依照数据视图生成空表
int nRecords=0;
while (((CRowset *)&rs)->MoveNext() == S_OK) nRecords++;
oTables.Add(oRange,nRecords+1,m_ulFields,COleVariant((short)1),COleVariant((short)1));
…
导入数据
if (((CRowset *)&rs)->MoveFirst() == S_OK);
do
{ nCol=1;
while (nCol<m_ulFields+1)
{ oCell = oTable.Cell(nRow+1,nCol);
oCellRange = oCell.GetRange();
oCellRange.InsertAfter(pBind[nCol-1].szValue);
nCol++;
}
nRow++;
}while (((CRowset *)&rs)->MoveNext() == S_OK);
…
}
函数OutPutFromTable从数据视图中依照需要的格式自动生成文档文本。
void OutPutFromTable(CSession *pSession,_Document *pdoc,LPCTSTR strTableName)
{
…读取数据视图
按固定格式生成文本
while (((CRowset *)&rs)->MoveNext() == S_OK)
{ nCol=1;
strtmp.Format("%d、",m_nRecords);
oSel.SetStyle(COleVariant((short)-31));
oSel.TypeText(strtmp);
if (pColumns->MoveFirst() == S_OK) ;
do
{ oSel.SetStyle(COleVariant((short)-31));
oSel.TypeText(pColumns->m_szColumnName);
oSel.TypeText(":");
oSel.TypeText(pBind[nCol-1].szValue);
oSel.TypeParagraph();
nCol++;
}while ((pColumns->MoveNext() == S_OK));
m_nRecords++;
}
}
作者简介
陈志刚 男,讲师,硕士研究生,1976年12月生,专业模式识别与智能控制