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

📄 breaksideproject.cpp

📁 工程测量数据处理
💻 CPP
字号:
// Curve.h: interface for the CCurve class.
//		Copyright	济南路通科技开发有限责任公司   
//		mailto:		lutong_jn@sina.com
//=====================================================================================
//		说明:曲线测设类
//		包括:
//			1. 曲线放样点结构类
//			2. 曲线基类
//			3. 圆曲线类 
//			4. 缓和曲线类
//			5. 副交点类
//			6. 曲线工程管理类
//
//			    将原定义的全局函数_CStringToFile(CFile *fp) 和 _CStringFromFile(CFile *fp)
//			删除。将曲线基类中的DmsToRad(...)和RadToDms(...)成员函数去掉。
//				修改了各类中的成员变量名。
//=====================================================================================
//		编写人:张玉生、秦涛
//		日期:	2002-10-15
//		版本:	1.0	
//=====================================================================================





#include "stdafx.h"

#include "BreakSideProject.h"

/********************************************************************************/
CBreakSideProject BSPrj;           //当前断面工程
short CurrentBreakside=-1;         //当前断面
short CurrentRecycleBreakside=-1;  //回收站当前断面
const int   BreakSideWidth=5000;	       //断面全长为5000分米,全长为500米长。
/********************************************************************************/
// CBreakSideProject 对象的方法

CBreakSideProject::CBreakSideProject()
{
	int i;

	FileName = _T("untitle.dmp");

	for (i=0;i<MAXBREAKSIDE;i++) {
		BS[i]=NULL;
	}
	BSCount = 0;

	for (i=0;i<MAXBREAKSIDE;i++) {
		BackBS[i]=NULL;
	}
	BackBSCount = 0;

	CurBS = -1;
}
CBreakSideProject::~CBreakSideProject()
{
	Clear();
}

//清除对象的所有数据
void CBreakSideProject::Clear()
{
	int i;

	for (i=0;i<BSCount;i++) {
		delete BS[i];
		BS[i]=NULL;
	}
	BSCount = 0;

	for (i=0;i<BackBSCount;i++) {
		delete BackBS[i];
		BackBS[i]=NULL;
	}
	BackBSCount = 0;

	CurBS = -1;
}

//增加断面
int CBreakSideProject::AddBreakSide(CBreakSide *p)
{
	ASSERT(p);
	if (BSCount>=MAXBREAKSIDE) return -1;
	BS[BSCount] = p;
	return ++BSCount;
}

//删除断面
int CBreakSideProject::DelBreakSide(int n)
{
	if ((n<0)||(n>=BSCount)) return -1;
	if (BackBSCount>=MAXBREAKSIDE) return -2;

	int i;

	//放入回收站
	BackBS[BackBSCount] = BS[n];
	BackBSCount++;

	//删除
	BSCount--;
	for (i=n;i<BSCount;i++) {
		BS[i] = BS[i+1];
	}
	BS[BSCount] = NULL;

	return 0;
}

//召回回收站中的某个断面
int CBreakSideProject::RecallBackBreakSide(int n)
{
	if ((n<0)||(n>=BackBSCount)) return -1;
	if (BSCount>=MAXBREAKSIDE) return -2;

	int i;

	//回收数据
	BS[BSCount] = BackBS[n];
	BSCount++;

	//删除
	BackBSCount--;
	for (i=n;i<BackBSCount;i++) {
		BackBS[i] = BackBS[i+1];
	}
	BackBS[BackBSCount] = NULL;

	return 0;	
}
//清空回收站
int CBreakSideProject::ClearBack()
{
	int i;
	
	for (i=0;i<BackBSCount;i++) {
		delete BackBS[i];
		BackBS[i]=NULL;
	}
	BackBSCount = 0;
	return 0;
}

//重新排序断面
int CBreakSideProject::Resort(int Mode)
{
	int i,j;
	CBreakSide *p;

	for (i=0;i<BSCount;i++) {
		BS[i]->MileageToValue();
	}

	if (Mode==0) {
		//升序排序
		for (i=BSCount-1;i>0;i--) {
			for (j=0;j<i;j++) {
				if (BS[j]->MileValue>BS[j+1]->MileValue) 
				{
					p = BS[j];
					BS[j] = BS[j+1];
					BS[j+1] = p;
				}
			}
		}
	}else{
		//降序排序
		for (i=BSCount-1;i>0;i--) {
			for (j=0;j<i;j++) {
				if (BS[j]->MileValue<BS[j+1]->MileValue) 
				{
					p = BS[j];
					BS[j] = BS[j+1];
					BS[j+1] = p;
				}
			}
		}
	}
	
	return 0;
}

//设置磁盘文件名
void CBreakSideProject::SetFileName(CString Name)
{
	FileName = Name;
}
//从文件调入断面工程数据
void CBreakSideProject::Load()
{
	//打开文件
	/*
	__try
	{
		File.Open(FileName,CFile::modeRead);
	}
	__except(CFileException *e)
	{
		CString sErrMsg;
		switch (e.m_cause) {
		case CFileException::fileNotFound :
			sErrMsg = TEXT("ERROR: The File not found!");
			break;
		case CFileException::accessDenied :
			sErrMsg = TEXT("ERROR: The file could not be accessed!");
			break;
		case  CFileException::invalidFile :
			sErrMsg = TEXT("ERROR: There was an attempt to use an invalid file handle!");
			break;
		case  CFileException::generic :
			sErrMsg = TEXT("ERROR: An unspecified error occurred!");
			break;
		case  CFileException::badPath :
			sErrMsg = TEXT("ERROR:All or part of the path is invalid!");
			break;
		case  CFileException::tooManyOpenFiles :
			sErrMsg = TEXT("ERROR:The permitted number of open files was exceeded!");
			break;
		case  default:
			sErrMsg = TEXT("Unknown error!");
		}
        AfxMessageBox(sErrMsg);
		return;
	}
	*/

	int i;
	CLTFile File;
	
	//打开文件
	File.Open(FileName,CFile::modeRead);

	Clear();

	//读取断面数据
	File.Read(&BSCount,sizeof(BSCount));
	for (i=0;i<BSCount;i++) {
		BS[i] = new CBreakSide;
		ASSERT(BS[i]);
		BS[i]->LoadFromFile(&File);
		BS [i]->Calculate ();//计算断面数据
	}

	//读取回收站数据
	File.Read(&BackBSCount,sizeof(BackBSCount));
	for	(i=0;i<BackBSCount;i++) {
		BackBS[i] = new CBreakSide;
		ASSERT(BackBS[i]);
		BackBS[i]->LoadFromFile(&File);
		BackBS [i]->Calculate ();//计算回收站内的断面数据
	}

	//关闭文件
	File.Close();

}

//向文件写入断面工程数据
void CBreakSideProject::Save()
{
	/*
	//打开文件
	try
	{
		File.Open(FileName,CFile::modeCreate|CFile::modeWrite);
	}
	catch(CFileException *e)
	{
		if( e->m_cause == CFileException::fileNotFound )
        AfxMessageBox(TEXT("ERROR: The File not found!"));
		return;
		if( e->m_cause == CFileException::accessDenied )
        AfxMessageBox(TEXT("ERROR: The file could not be accessed!"));
		return;
		if( e->m_cause == CFileException::invalidFile)
        AfxMessageBox(TEXT("ERROR: There was an attempt to use an invalid file handle!"));
		return;
		if( e->m_cause == CFileException::generic)
        AfxMessageBox(TEXT("ERROR: An unspecified error occurred!"));
		return;
		if( e->m_cause == CFileException::badPath)
        AfxMessageBox(TEXT("ERROR:All or part of the path is invalid!"));
		return;
		if( e->m_cause == CFileException::tooManyOpenFiles )
        AfxMessageBox(TEXT("ERROR:The permitted number of open files was exceeded!"));
		return;

	}
	*/

	int i;
	CLTFile File;
	
	//打开文件
	File.Open(FileName,CFile::modeCreate|CFile::modeWrite);

	//写入断面数据
	File.Write(&BSCount,sizeof(BSCount));
	for (i=0;i<BSCount;i++) {
		BS[i]->SaveToFile(&File);
	}

	//写入回收站数据
	File.Write(&BackBSCount,sizeof(BackBSCount));
	for (i=0;i<BackBSCount;i++) {
		BackBS[i]->SaveToFile(&File);
	}

	//关闭文件
	File.Close();
}

/********************************************************************************/
//用于比较两断面工程数据得的一致性
bool CBreakSideProject::Compare(CBreakSideProject *pBreakSide)
{
	int i=0,j=0;
	if(BSCount!=pBreakSide->BSCount )              return FALSE;
	if(BackBSCount!=pBreakSide->BackBSCount )      return FALSE;
	//开始比较断面数据
	for(i=0;i<BSCount;i++)
	{
		if(pBreakSide->BS [i]->PointCount !=BS [i]->PointCount )                return FALSE;
		if(pBreakSide->BS [i]->Mileage    !=BS [i]->Mileage  )                  return FALSE;
		if(pBreakSide->BS [i]->RailTopProperty  !=BS [i]->RailTopProperty )     return FALSE;
		if(pBreakSide->BS [i]->RailTopForesight !=BS [i]->RailTopForesight)     return FALSE;
		if(pBreakSide->BS [i]->KnownDotName   !=BS [i]->KnownDotName )          return FALSE;
		if(pBreakSide->BS [i]->KnownHeight    !=BS [i]->KnownHeight)            return FALSE;
		if(pBreakSide->BS [i]->KnownBacksight !=BS [i]->KnownBacksight  )       return FALSE;
		for(j=0;j<BS [i]->PointCount;j++)
		{
			if(pBreakSide->BS [i]->Points [j]->Distance!=BS [i]->Points [j]->Distance)             return FALSE;
			if(pBreakSide->BS [i]->Points [j]->Foresight!=BS [i]->Points [j]->Foresight )          return FALSE;
			if(pBreakSide->BS [i]->Points [j]->Height!=BS [i]->Points [j]->Height)                 return FALSE;
			if(pBreakSide->BS [i]->Points [j]->StationNumber!=BS [i]->Points [j]->StationNumber)   return FALSE;
			if(pBreakSide->BS [i]->Points [j]->Type!=BS [i]->Points [j]->Type)                     return FALSE;
		}		
	}
	//开始比较回收站内的断面数据
	for(i=0;i<BackBSCount;i++)
	{
		if(pBreakSide->BackBS [i]->PointCount !=BackBS [i]->PointCount )                                   return FALSE;
		if(pBreakSide->BackBS [i]->Mileage !=BackBS [i]->Mileage  )                                        return FALSE;
		if(pBreakSide->BackBS [i]->RailTopProperty !=BackBS [i]->RailTopProperty )                         return FALSE;
		if(pBreakSide->BackBS [i]->RailTopForesight !=BackBS [i]->RailTopForesight)                        return FALSE;
		if(pBreakSide->BackBS [i]->KnownDotName!=BackBS [i]->KnownDotName )                                return FALSE;
		if(pBreakSide->BackBS [i]->KnownHeight!=BackBS [i]->KnownHeight)                                   return FALSE;
		if(pBreakSide->BackBS [i]->KnownBacksight!=BackBS [i]->KnownBacksight  )                           return FALSE;
		for(j=0;j<BackBS [i]->PointCount;j++)
		{
			if(pBreakSide->BackBS [i]->Points [j]->Distance!=BackBS [i]->Points [j]->Distance)             return FALSE;
			if(pBreakSide->BackBS [i]->Points [j]->Foresight!=BackBS [i]->Points [j]->Foresight )          return FALSE;
			if(pBreakSide->BackBS [i]->Points [j]->Height!=BackBS [i]->Points [j]->Height)                 return FALSE;
			if(pBreakSide->BackBS [i]->Points [j]->StationNumber!=BackBS [i]->Points [j]->StationNumber)   return FALSE;
			if(pBreakSide->BackBS [i]->Points [j]->Type!=BackBS [i]->Points [j]->Type)                     return FALSE;
		}		
	}
	return TRUE;
}

// 生成断面摘要信息
CString CBreakSideProject::GenDigestString()
{
	CString s;
	s.Format(_T("断面测量  断面总数:%2d  "),BSCount);
	return s;
}



⌨️ 快捷键说明

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