📄 breaksideproject.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 + -