⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parses57doc.cpp

📁 国际海图标准S-57格式数据读取源码VC
💻 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 + -