📄 parses57doc.cpp
字号:
// ParseS57Doc.cpp : CParseS57Doc 类的实现
//
#include "stdafx.h"
#include "ParseS57.h"
#include "ParseS57Doc.h"
#include ".\parses57doc.h"
#include "cplport.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CParseS57Doc
IMPLEMENT_DYNCREATE(CParseS57Doc, CDocument)
BEGIN_MESSAGE_MAP(CParseS57Doc, CDocument)
END_MESSAGE_MAP()
// CParseS57Doc 构造/析构
CParseS57Doc::CParseS57Doc()
{
// TODO: 在此添加一次性构造代码
}
CParseS57Doc::~CParseS57Doc()
{
}
BOOL CParseS57Doc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: 在此添加重新初始化代码
// (SDI 文档将重用该文档)
return TRUE;
}
// CParseS57Doc 序列化
void CParseS57Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 在此添加存储代码
}
else
{
// TODO: 在此添加加载代码
}
}
// CParseS57Doc 诊断
#ifdef _DEBUG
void CParseS57Doc::AssertValid() const
{
CDocument::AssertValid();
}
void CParseS57Doc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
// CParseS57Doc 命令
BOOL CParseS57Doc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
// TODO: 在此添加您专用的创建代码
DDFModule oModule;
if( !oModule.Open( lpszPathName ) ) { TRACE (_T("Is not a 8211 file !")); exit( 1 ); }
DDFRecord *poRecord; int nRecordCount = 0; int nFieldCount = 0; while( (poRecord = oModule.ReadRecord()) != NULL ) { /* ------------------------------------------------------------ */ /* Loop over each field in this particular record. */ /* ------------------------------------------------------------ */ for( int iField = 0; iField < poRecord->GetFieldCount(); iField++ ) { DDFField *poField = poRecord->GetField( iField ); ViewRecordField( poField ); nFieldCount++; } nRecordCount++; } CString str; str.Format("Read %d records, %d fields.\n", nRecordCount, nFieldCount ); AfxMessageBox ( str); oModule.Close();
return TRUE;
}
void CParseS57Doc::ViewRecordField(DDFField * poField)
{
int nBytesRemaining; const char *pachFieldData; DDFFieldDefn *poFieldDefn = poField->GetFieldDefn(); // Report general information about the field. printf( " Field %s: %s\n", poFieldDefn->GetName(), poFieldDefn->GetDescritpion() ); char str[255] ; strcpy (str,poFieldDefn->GetName()); AfxMessageBox(str); // Get pointer to this fields raw data. We will move through // it consuming data as we report subfield values. pachFieldData = poField->GetData(); nBytesRemaining = poField->GetDataSize(); /* -------------------------------------------------------- */ /* Loop over the repeat count for this fields */ /* subfields. The repeat count will almost */ /* always be one. */ /* -------------------------------------------------------- */ int iRepeat; for( iRepeat = 0; iRepeat < poField->GetRepeatCount(); iRepeat++ ) { /* -------------------------------------------------------- */ /* Loop over all the subfields of this field, advancing */ /* the data pointer as we consume data. */ /* -------------------------------------------------------- */ int iSF; for( iSF = 0; iSF < poFieldDefn->GetSubfieldCount(); iSF++ ) { DDFSubfieldDefn *poSFDefn = poFieldDefn->GetSubfield( iSF ); int nBytesConsumed; nBytesConsumed = ViewSubfield( poSFDefn, pachFieldData, nBytesRemaining ); nBytesRemaining -= nBytesConsumed; pachFieldData += nBytesConsumed; } }
}
int CParseS57Doc::ViewSubfield(DDFSubfieldDefn *poSFDefn, const char * pachFieldData, int nBytesRemaining)
{
int nBytesConsumed = 0; CString str ; switch( poSFDefn->GetType() ) { case DDFInt: if( poSFDefn->GetBinaryFormat() == DDFSubfieldDefn::UInt ) { printf( " %s = %u\n", poSFDefn->GetName(), poSFDefn->ExtractIntData( pachFieldData, nBytesRemaining, &nBytesConsumed ) ); str.Format(" %s = %u\n",poSFDefn->GetName(),poSFDefn->ExtractIntData(pachFieldData,nBytesRemaining,&nBytesConsumed)); AfxMessageBox(str);} else printf( " %s = %d\n", poSFDefn->GetName(), poSFDefn->ExtractIntData( pachFieldData, nBytesRemaining, &nBytesConsumed ) ); break; case DDFFloat: printf( " %s = %f\n", poSFDefn->GetName(), poSFDefn->ExtractFloatData( pachFieldData, nBytesRemaining, &nBytesConsumed ) ); break; case DDFString: printf( " %s = `%s'\n", poSFDefn->GetName(), poSFDefn->ExtractStringData( pachFieldData, nBytesRemaining, &nBytesConsumed ) ); break; case DDFBinaryString: { int i; //rjensen 19-Feb-2002 5 integer variables to decode NAME and LNAM int vrid_rcnm=0; int vrid_rcid=0; int foid_agen=0; int foid_find=0; int foid_fids=0; GByte *pabyBString = (GByte *) poSFDefn->ExtractStringData( pachFieldData, nBytesRemaining, &nBytesConsumed ); printf( " %s = 0x", poSFDefn->GetName() ); for( i = 0; i < MIN(nBytesConsumed,24); i++ ) printf( "%02X", pabyBString[i] ); if( nBytesConsumed > 24 ) printf( "%s", "..." ); // rjensen 19-Feb-2002 S57 quick hack. decode NAME and LNAM bitfields if ( EQUAL(poSFDefn->GetName(),"NAME") ) { vrid_rcnm=pabyBString[0]; vrid_rcid=pabyBString[1] + (pabyBString[2]*256)+ (pabyBString[3]*65536)+ (pabyBString[4]*16777216); printf("\tVRID RCNM = %d,RCID = %u",vrid_rcnm,vrid_rcid); } else if ( EQUAL(poSFDefn->GetName(),"LNAM") ) { foid_agen=pabyBString[0] + (pabyBString[1]*256); foid_find=pabyBString[2] + (pabyBString[3]*256)+ (pabyBString[4]*65536)+ (pabyBString[5]*16777216); foid_fids=pabyBString[6] + (pabyBString[7]*256); printf("\tFOID AGEN = %u,FIDN = %u,FIDS = %u", foid_agen,foid_find,foid_fids); } printf( "\n" ); } break; } return nBytesConsumed;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -