现在的位置: 首页 > 综合 > 正文

DXF图元文件提取与显示(三)-Circle

2014年08月29日 ⁄ 综合 ⁄ 共 3061字 ⁄ 字号 评论关闭
#pragma once
#include "dxfmeta.h"
class DXFCircle :
	public DXFMeta
{
public:
	explicit DXFCircle(UINT rCount,UINT seekBytes);
	~DXFCircle(void);

	virtual string OutputFormat();

	friend	ostream& operator<<(ostream& os,const DXFCircle& metaCircle);		//数据输出的友元函数
	friend	istream& operator>>(istream& is,DXFCircle& metaCircle);				//数据输入的友元函数

	virtual void Draw( HDC& dc );

private:
	Point center;
	double radius;
};
#include "StdAfx.h"
#include "DXFCircle.h"




//************************************
// 定义圆在DXF中的输出格式
// Method:    OutputFormat
// FullName:  DXFCircle::OutputFormat
// Access:    virtual public 
// Returns:   std::string
// Qualifier:
// Author:zhengzhe 2011-11-22
//************************************
std::string DXFCircle::OutputFormat()
{
	CString s;
	s.Format("10\r\n%f\r\n20\r\n%f\r\n30\r\n%f\r\n40\r\n%f\r\n0\r\n",center.x,center.y,center.z,radius);
	return s.GetString();
}

//************************************
// 根据DXF行号和偏移的字节数来生成圆对象
// Method:    DXFCircle
// FullName:  DXFCircle::DXFCircle
// Access:    public 
// Returns:   
// Qualifier: :DXFMeta(rCount,seekBytes)
// Parameter: UINT rCount
// Parameter: UINT seekBytes
// Author:zhengzhe 2011-11-22
//************************************
DXFCircle::DXFCircle( UINT rCount,UINT seekBytes ):DXFMeta(rCount,seekBytes)
{
	type=CIRCLE;
	center.x=center.y=center.z=0.0;
	radius = 1.0;
}

DXFCircle::~DXFCircle( void )
{

}

void DXFCircle::Draw( HDC& dc )
{
	throw std::exception("The method or operation is not implemented.");
}


//************************************
// 在DXF中读取圆信息的重载方法
// Method:    operator>>
// FullName:  operator>>
// Access:    public 
// Returns:   istream&
// Qualifier:
// Parameter: istream & is
// Parameter: DXFCircle & metaCircle
// Author:zhengzhe 2011-11-22
//************************************
istream& operator>>( istream& is,DXFCircle& metaCircle )
{
	char tmp[256];			//设定每行大小256
	
	//跳到指定文件位置
	is.seekg(metaCircle.m_memSeekStartPos,ios::beg); 

	//开始读取数据
	is.getline(tmp,256);
	metaCircle.IncrementCount(metaCircle, tmp);

	CString s(tmp);
	s = s.Trim();
	while(s!="10")
	{
		is.getline(tmp,256);
		metaCircle.IncrementCount(metaCircle,tmp);
		s = tmp;
		s = s.Trim();
	}
	while(s!="0")
	{
		if (s=="10")
		{
			is.getline(tmp,256);
			metaCircle.IncrementCount(metaCircle,tmp);
			metaCircle.center.x = atof(tmp);
		}
		if	(s=="20")
		{
			is.getline(tmp,256);
			metaCircle.IncrementCount(metaCircle,tmp);
			metaCircle.center.y = atof(tmp);
		}
		if	(s=="30")
		{
			is.getline(tmp,256);
			metaCircle.IncrementCount(metaCircle,tmp);
			metaCircle.center.z = atof(tmp);
		}
		if (s=="40")
		{
			is.getline(tmp,256);
			metaCircle.IncrementCount(metaCircle,tmp);
			metaCircle.radius = atof(tmp);
		}
		//在读取浮点数的时候,需要跳过后面的回车换行符
		/*while(is.get()!='\n')
			continue;*/
		is.getline(tmp,256);
		metaCircle.IncrementCount(metaCircle,tmp);
		s = tmp;
		s = s.Trim();
	}
	//计算
	metaCircle.CalCurByteSize();
	metaCircle.m_orgByteSize = metaCircle.GetCurByteSize();
	return is;
}


//************************************
// 输出显示圆信息
// Method:    operator<<
// FullName:  operator<<
// Access:    public 
// Returns:   ostream&
// Qualifier:
// Parameter: ostream & os
// Parameter: const DXFCircle & metaCircle
// Author:zhengzhe 2011-11-22
//************************************
ostream& operator<< (ostream& os,const DXFCircle& metaCircle )
{
	os <<(DXFMeta&)metaCircle <<endl;
	os<<"\nCenter[x=" <<metaCircle.center.x <<",y="<<metaCircle.center.y<<",z="<<metaCircle.center.z<<"]"
		<<"\nradius="<<metaCircle.radius<<"]";
	return os;
}

抱歉!评论已关闭.