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

📄 breakside.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 "BreakSide.h"

//将字符串保存到文件
static int _CStringToFile(CString &s,CFile *fp)
{
	short l;
	TCHAR b[1024];

	l = s.GetLength();
	wcscpy(b,s);

	fp->Write(&l,sizeof(l));
	fp->Write(b,l*2);

	return l;
}
//从文件读取字符串
static int _CStringFromFile(CString &s,CFile *fp)
{
	short l;
	TCHAR b[1024];

	fp->Read(&l,sizeof(l));
	fp->Read(b,l*2);
	b[l]=0;
	s = b;

	return l;
}
//构造函数
CBreakSide::CBreakSide()
{
	int i;

    //里程      CString     
	Mileage = _T("");

    //轨顶属性  CString     
	RailTopProperty = _T("");

    //轨顶读数  float       
	RailTopForesight=0;

    //已知点号  CString     
	KnownDotName = _T("");

    //已知高程  float       
	KnownHeight = 0;

    //后视读数  float       
	KnownBacksight=0;

    //测量点数  short           
	PointCount = 0;
	for (i=0;i<MAXPOINTCOUNT;i++) {
		Points[i] = NULL;
	}

    //测站数目  short
	StationCount = 0;
	for (i=0;i<MAXSTATIONCOUNT;i++) {
		Stations[i] = NULL;
	}

}
//析构函数
CBreakSide::~CBreakSide()
{
	Clear();
}

//清空数据
void CBreakSide::Clear()
{
	int i;

    //轨顶属性  CString     
	RailTopProperty = _T("");

    //轨顶读数  float       
	RailTopForesight=0;

    //已知点号  CString     
	KnownDotName = _T("");

    //已知高程  float       
	KnownHeight = 0;

    //后视读数  float       
	KnownBacksight=0;

	for (i=0;i<PointCount;i++) {
		delete Points[i];
		Points[i] = NULL;
	}
	PointCount = 0;
	for (i=0;i<StationCount;i++) {
		delete Stations[i];
		Stations[i] = NULL;
	}
	StationCount = 0;
}

void CBreakSide::MileageToValue()
{
	CString s;
	double d;
	int i,k1,k2,k,l;
	unsigned short B1[40],B2[40],*p;

	s = Mileage;
	s.MakeUpper();
	l = s.GetLength();
	
	k1 = s.Find('K');
	k2 = s.Find('+',k1);
	
	k1++;
	k = k2 - k1 ;
	for (i=0;i<k;i++)
		B1[i] = s[k1+i];
	B1[i] = 0;

	k2++;
	k = l - k2;
	for (i=0;i<k;i++)
		B2[i] = s[k2+i];
	B2[i] = 0;

	d =  wcstod(B1,&p);

	d += wcstod(B2,&p)/1000.0;

	this->MileValue = d;
}

//设置断面基本信息,同时设置断面0点的数据
int CBreakSide::SetBaseData(CString &M,CString &Property,float &Foresight,CString &DotName,float &Height,float &Backsight)
{
	//Clear();

	Mileage          = M         ;  //里程
	RailTopProperty  = Property  ;  //轨顶属性
	RailTopForesight = Foresight ;  //轨顶读数
	KnownDotName     = DotName   ;  //已知点号
	KnownHeight      = Height    ;  //已知高程
	KnownBacksight   = Backsight ;  //后视读数

	//第一个测量点
	CBreakSidePoint *p1;
	p1 = new CBreakSidePoint;
	ASSERT(p1);
	p1->Type          = 2; //轨顶
	p1->Distance      = 0;
	p1->Height        = 0;
	p1->Foresight     = RailTopForesight;
	p1->StationNumber = 0;
	AddPoint(p1);

	//第一个测站
	CStationPoint *p2;
	p2 = new CStationPoint;
	ASSERT(p2);
	p2->Height      = KnownHeight + KnownBacksight;//获得测站仪器高
	p2->Backsight   = KnownBacksight;
	p2->PointNumber = -1;//说明是基准点
	AddStation(p2);

	return 0;
}

//获得断面基本信息,同时得到断面0点的信息
int CBreakSide::GetBaseData(CString &M,CString &Property,float &Foresight,CString &DotName,float &Height,float &Backsight)
{
	M          = Mileage         ;  //里程
	Property   = RailTopProperty ;  //轨顶属性
	Foresight  = RailTopForesight;  //轨顶读数
	DotName    = KnownDotName    ;  //已知点号
	Height     = KnownHeight     ;  //已知高程
	Backsight  = KnownBacksight  ;  //后视读数

	return 0;
}

//给断面增加测点,同时应将该测点对应的测站号保存到StationNumber,
int CBreakSide::AddPoint(CBreakSidePoint *p)
{
	ASSERT(p);
	if (PointCount>=MAXPOINTCOUNT) return -1;
	Points[PointCount] = p;
	return ++PointCount;
	
}

//删除断面测点,参数为点号的索引值
int CBreakSide::DelPoint(int n)
{
	if ((n<=0)||(n>=PointCount)) return -1;
	if (Points[n]->Type==5) return -2;
	if (Points[n]->Type==-1) return -3;

	Points[n]->Type = -1;
	return 0;
}

//增加测站,增加转点即为增加测站
int CBreakSide::AddStation(CStationPoint *p)
{
	ASSERT(p);
	if (StationCount>=MAXSTATIONCOUNT) return -1;
	Stations[StationCount] = p;
	return ++StationCount;
}

//计算各测点的高程值,将各测点循环遍历
int CBreakSide::Calculate()
{
	int i,j,k,t;

	if (StationCount<=0) return 1;
	if (PointCount<=0) return 2;

	j=0;//代表测站点号,并设置为第一测站,当前断面最大点号为PointCount-1
	Points[0]->Foresight   = RailTopForesight;
	Stations[0]->Backsight = KnownBacksight;
	Stations[0]->Height    = KnownHeight + KnownBacksight;
	
	/*
	  获取第i点的测站点号,开始时k=0,j=0故不会进入循环,当k>0时(如k=1时),
	  进入循环,同时j+1=1,计算出j=1时测站的仪器高,当k=2时,这时j=1,
	  所以进入循环,执行j+1=2,	接着算出j=2时的仪器高,从而可算出i点的高程
	*/
	for (i=0;i<PointCount;i++) {
		//if (Points[i]->Type<1) continue;
		k = Points[i]->StationNumber;
		// 测量点的测站号应该小于测站总数
		ASSERT(k<StationCount);
		while (k>j) {//实际为j=k时结束循环
			j++;
			t = Stations[j]->PointNumber;//获取j测站的后视点号
			// 测站的后视点号应该小于当前的测点号
			ASSERT(t<i);
			Stations[j]->Height = Points[t]->Height + Stations[j]->Backsight;//计算出j测站的仪器高,
		}
		Points[i]->Height = Stations[k]->Height - Points[i]->Foresight ;//计算出i点的高程,仪器高减去测点的前视读数便得到测点的高程
	}
	return 0;
}

//计算绘图数据
int CBreakSide::GenDrawPoint(CPoint *p)
{
	int i,j;
	int kx,ky;
	int Count;

	//计算
	Calculate();

	//生成数据
	Count=0;
	for (i=0;i<PointCount;i++) {
		if (Points[i]->Type<1) continue;
		if (Points[i]->Type==5) continue;

		//不是转点
	    p[Count].x = int(Points[i]->Distance*1.0);		
		p[Count].y = int(Points[i]->Height  *1.0);
		Count++;
	}

	//排序
	for (i=Count-1;i>0;i--) {
		for (j=0;j<i;j++) {
			if (p[j].x>p[j+1].x) {
				kx = p[j].x;
				ky = p[j].y;
				p[j].x = p[j+1].x;
				p[j].y = p[j+1].y;
				p[j+1].x = kx;
				p[j+1].y = ky;
			}
		}
	}

	return Count;
}

//从文件调入断面数据
void CBreakSide::LoadFromFile(CFile *fp)
{
	int i;

	Clear();
    
	//里程     CString     Mileage;
	_CStringFromFile(Mileage,fp);//调入断面里程

    //轨顶属性 CString     RailTopProperty;
	_CStringFromFile(RailTopProperty,fp);//调入断面0点属性,即轨顶属性数据
    //轨顶读数 float       RailTopForesight;
	fp->Read(&RailTopForesight,sizeof(RailTopForesight));//调入轨顶数据

    //已知点号 CString     KnownDotName;
	_CStringFromFile(KnownDotName,fp);//调入已知点点名
    //已知高程 float       KnownHeight;
	fp->Read(&KnownHeight,sizeof(KnownHeight));//调入已知点高程
    //后视读数 float       KnownBacksight;
	fp->Read(&KnownBacksight,sizeof(KnownBacksight));//调入第一测站点后视数据

    //测量点数 short            PointCount;
	fp->Read(&PointCount,sizeof(PointCount));//调入该断面总的测点数
    //测量点   CBreakSidePoint *Points[MAXPOINTCOUNT];
	for (i=0;i<PointCount;i++) {//循环调入各测点的数据
		Points[i] = new CBreakSidePoint;//新建断面点对象
		ASSERT(Points[i]);
		Points[i]->LoadFromFile(fp);
	}

    //测站数目 short            StationCount;
	fp->Read(&StationCount,sizeof(StationCount));///调入测站数目
    //测站     CStationPoint    *Stations[MAXSTATIONCOUNT];
	for (i=0;i<StationCount;i++) {//循环调入各测站数据
		Stations[i] = new CStationPoint;//新建测站对象
		ASSERT(Stations[i]);
		Stations[i]->LoadFromFile(fp);
	}
	
}
//将断面数据保存到文件
void CBreakSide::SaveToFile(CFile *fp)
{
	int i;

    //里程     CString     Mileage;
	_CStringToFile(Mileage,fp);//保存断面里程

    //轨顶属性 CString     RailTopProperty;
	_CStringToFile(RailTopProperty,fp);//保存轨顶属性
    //轨顶读数 float       RailTopForesight;
	fp->Write(&RailTopForesight,sizeof(RailTopForesight));//保存轨顶读数

    //已知点号 CString     KnownDotName;
	_CStringToFile(KnownDotName,fp);//保存已知点号
    //已知高程 float       KnownHeight;
	fp->Write(&KnownHeight,sizeof(KnownHeight));//保存已知高程
    //后视读数 float       KnownBacksight;
	fp->Write(&KnownBacksight,sizeof(KnownBacksight));//保存后视读数

    //测量点数 short            PointCount;
	fp->Write(&PointCount,sizeof(PointCount));//保存当前断面的测量点总数
    //测量点   CBreakSidePoint *Points[MAXPOINTCOUNT];
	for (i=0;i<PointCount;i++) {//循环保存各测点数据
		Points[i]->SaveToFile(fp);
	}

    //测站数目 short            StationCount;
	fp->Write(&StationCount,sizeof(StationCount));//保存测站数目
    //测站     CStationPoint    *Stations[MAXSTATIONCOUNT];
	for (i=0;i<StationCount;i++) {//循环保存各测站数据
		Stations[i]->SaveToFile(fp);
	}
}

⌨️ 快捷键说明

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