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

📄 segyviewview.cpp

📁 自己编写的读取并显示segy格式文件的程序
💻 CPP
字号:
// SegyViewView.cpp : implementation of the CSegyViewView class
//

#include "stdafx.h"
#include "SegyView.h"

#include "SegyViewDoc.h"
#include "SegyViewView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSegyViewView

IMPLEMENT_DYNCREATE(CSegyViewView, CView)

BEGIN_MESSAGE_MAP(CSegyViewView, CView)
	//{{AFX_MSG_MAP(CSegyViewView)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSegyViewView construction/destruction

CSegyViewView::CSegyViewView()
{
	// TODO: add construction code here

}

CSegyViewView::~CSegyViewView()
{
}

BOOL CSegyViewView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CSegyViewView drawing

void CSegyViewView::OnDraw(CDC* pDC)
{
	CSegyViewDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	if (GetDocument()->m_bOpenfile)
	{
		DrawTracePicture(pDC);
	}
}

/////////////////////////////////////////////////////////////////////////////
// CSegyViewView printing

BOOL CSegyViewView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

/////////////////////////////////////////////////////////////////////////////
// CSegyViewView diagnostics

#ifdef _DEBUG
void CSegyViewView::AssertValid() const
{
	CView::AssertValid();
}

CSegyViewDoc* CSegyViewView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSegyViewDoc)));
	return (CSegyViewDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CSegyViewView message handlers

BOOL CSegyViewView::DrawTracePicture(CDC *pDC)
{
	CFile tagFile = GetDocument()->m_tagFile;
	int nTotalTrace = GetDocument()->m_nEndTrace - GetDocument()->m_nBeginTrace + 1;
	int nCode = GetDocument()->m_nCode;
	int nFrequency = GetDocument()->m_nFrequency;
	
	short* pSData = new short[nFrequency];
	int* pNData = new int[nFrequency];
	float* pFData = new float[nFrequency];
	long* pLData = new long[nFrequency];

	// 先画160道作为测试
	nTotalTrace = 160;
	tagFile.Seek(3600, CFile::begin);
	for (int i = 1; i <= nTotalTrace; ++i)
	{
		tagFile.Seek(240, CFile::current);
		if (nCode == 3)
		{
			tagFile.ReadHuge(pSData, sizeof(short) * nFrequency);
			TwoByteIntegerChange(pSData, nFrequency);
			DrawDataLine(pSData, nFrequency, pDC, i);
		}
		else if (nCode == 2)
		{
			tagFile.ReadHuge(pNData, sizeof(int) * nFrequency);
			FourByteIntegerChange(pNData, nFrequency);
			DrawDataLine(pNData, nFrequency, pDC, i);
		}
		else if (nCode == 1)
		{
			tagFile.ReadHuge(pLData, sizeof(long) * nFrequency);
			IBM32toIEEE(pLData, nFrequency);
			DrawDataLine((float*)pLData, nFrequency, pDC, i);
		}
		else if (nCode == 5)
		{
			tagFile.ReadHuge(pFData, sizeof(float) * nFrequency);
			DrawDataLine(pFData, nFrequency, pDC, i);
		}
	}
	
	delete [] pSData;
	delete [] pLData;
	delete [] pNData;
	delete [] pFData;
	return TRUE;
}

BOOL CSegyViewView::TwoByteIntegerChange(short* pDataParam, int nTotal)
{
	unsigned char *cpTemp;
	unsigned char ch;
	cpTemp = (unsigned char*)pDataParam;
	for (int i = 0; i < nTotal; ++i)
	{
		ch = cpTemp[0]; 
		cpTemp[0] = cpTemp[1];
		cpTemp[1] = ch;
		cpTemp += 2;
	}

	return TRUE;
}

BOOL CSegyViewView::FourByteIntegerChange(int* pDataParam, int nTotal)
{
	unsigned char *cpTemp;
	unsigned char ch;
	cpTemp = (unsigned char*)pDataParam;

	for (int i = 0; i < nTotal; ++i)
	{
		ch = cpTemp[0]; cpTemp[0] = cpTemp[3]; cpTemp[3] = ch;
		ch = cpTemp[1]; cpTemp[1] = cpTemp[2]; cpTemp[2] = ch;
		cpTemp += 4;
	}

	return TRUE;
}

BOOL CSegyViewView::IBM32toIEEE(long* pDataParam, int nTotal)
{
	register int fconv, fmant, i, t;
	for (i = 0; i < nTotal; ++i)
	{
		fconv = ((int *)pDataParam)[i];
		fconv = (fconv << 24) | ((fconv >> 24) & 0xff) 
			| ((fconv & 0xff00) << 8) | ((fconv & 0xff0000) >> 8);

		if (fconv)
		{
			fmant = 0x00ffffff & fconv;
			t = (int)( (0x7f000000 & fconv) >> 22 ) - 130;
			while (!(fmant & 0x00800000))
			{
				--t;
				fmant <<= 1;
			}
			if (t > 254)
				fconv = (0x80000000 & fconv) | 0x7f7fffff;
			else if (t <= 0)
				fconv = 0;
			else
				fconv = (0x80000000 & fconv) | (t << 23) | (0x007fffff & fmant);
		}

		pDataParam[i] = fconv;	
	}
	return TRUE;
}

BOOL CSegyViewView::DrawDataLine(short* pshortParam, int nTotal, CDC* pDC, int nTraceNum)
{
	CPen blackPen(PS_SOLID, 1, RGB(0, 0, 0));
	CPen* pOldPen = pDC->SelectObject(&blackPen);

	int blankX, blankY;
	blankX = 5;
	blankY = 1;

	POINT ptBegin, point;
	ptBegin.x = 20 + blankX * nTraceNum;
	ptBegin.y = 20 + blankY;
	pDC->MoveTo(ptBegin);
	
	for (int i = 0; i < nTotal; ++i)
	{
		point.x = ptBegin.x + pshortParam[i] * blankX / 8500;
		point.y = ptBegin.y + blankY * i;
		pDC->LineTo(point);
	}

	pDC->SelectObject(pOldPen);
	return TRUE;
}

BOOL CSegyViewView::DrawDataLine(int *pintParam, int nTotal, CDC *pDC, int nTraceNum)
{
	CPen blackPen(PS_SOLID, 1, RGB(0, 0, 0));
	CPen* pOldPen = pDC->SelectObject(&blackPen);
	
	int blankX, blankY;
	blankX = 5;
	blankY = 1;
	
	POINT ptBegin, point;
	ptBegin.x = 20 + blankX * nTraceNum;
	ptBegin.y = 20 + blankY;
	pDC->MoveTo(ptBegin);
	
	for (int i = 1; i <= nTotal; ++i)
	{
		point.x = ptBegin.x + pintParam[i] * blankX / 9000;
		point.y = ptBegin.y + blankY * i;
		pDC->LineTo(point);
	}
	
	pDC->SelectObject(pOldPen);
	return TRUE;	
}

BOOL CSegyViewView::DrawDataLine(float *pfloatParam, int nTotal, CDC *pDC, int nTraceNum)
{
	CPen blackPen(PS_SOLID, 1, RGB(0, 0, 0));
	CPen* pOldPen = pDC->SelectObject(&blackPen);
	
	int blankX, blankY;
	blankX = 5;
	blankY = 1;
	
	POINT ptBegin, point;
	ptBegin.x = 20 + blankX * nTraceNum;
	ptBegin.y = 20 + blankY;
	pDC->MoveTo(ptBegin);
	
	for (int i = 1; i <= nTotal / 10; ++i)
	{
		point.x = ptBegin.x + (int)( (float)pfloatParam[i] / 200);
		point.y = ptBegin.y + blankY * (i - 1);
		pDC->LineTo(point);
	}
	
	pDC->SelectObject(pOldPen);
	return TRUE;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -