#pragma once #include "dxfmeta.h" class DXFLine : public DXFMeta { public: explicit DXFLine(UINT rCount,UINT seekBytes); virtual ~DXFLine(void); virtual string OutputFormat(); void SetLine(Point& s,Point& e); friend ostream& operator<<(ostream& os,const DXFLine& metaLine); //数据输出的友元函数 friend istream& operator>>(istream& is,DXFLine& metaLine); //数据输入的友元函数 virtual void Draw( HDC& dc ); private: DXFMeta::Point start; //开始点坐标 DXFMeta::Point end; //结束点坐标 };
#include "StdAfx.h" #include "DXFLine.h" #include <stdlib.h> //************************************ // 根据DXF文件的读写的行号和偏移字符数,构建直线对象 // Method: DXFLine // FullName: DXFLine::DXFLine // Access: public // Returns: // Qualifier: :DXFMeta(rCount,seekBytes) // Parameter: UINT rCount // Parameter: UINT seekBytes // Author:zhengzhe 2011-11-21 //************************************ DXFLine::DXFLine(UINT rCount,UINT seekBytes):DXFMeta(rCount,seekBytes) { type = LINE; } DXFLine::~DXFLine(void) { } //************************************ // 直线的DXF输出格式 // Method: OutputFormat // FullName: DXFLine::OutputFormat // Access: virtual public // Returns: std::string // Qualifier: // Author:zhengzhe 2011-11-21 //************************************ std::string DXFLine::OutputFormat() { CString s; s.Format("10\r\n%f\r\n20\r\n%f\r\n30\r\n%f\r\n11\r\n%f\r\n21\r\n%f\r\n31\r\n%f\r\n0\r\n",start.x,start.y,start.z,end.x,end.y,end.z); return s.GetString(); } //************************************ // 设置线的起始点和终点 // Method: SetLine // FullName: DXFLine::SetLine // Access: public // Returns: void // Qualifier: // Parameter: Point & s // Parameter: Point & e // Author:zhengzhe 2011-11-21 //************************************ void DXFLine::SetLine( Point& s,Point& e ) { start = s; end = e; string output = OutputFormat(); m_memSeekEndPos = m_memSeekStartPos+ output.length()*sizeof(char); } void DXFLine::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: DXFLine & metaLine // Author:zhengzhe 2011-11-21 //************************************ istream& operator>>( istream& is,DXFLine& metaLine ) { char tmp[256]; //设定每行大小256 //跳到指定文件位置 is.seekg(metaLine.m_memSeekStartPos,ios::beg); //开始读取数据 is.getline(tmp,256); metaLine.IncrementCount(metaLine, tmp); CString s(tmp); s = s.Trim(); while(s!="10") { is.getline(tmp,256); metaLine.IncrementCount(metaLine,tmp); s = tmp; s = s.Trim(); } while(s!="0") { if (s=="10") { is.getline(tmp,256); metaLine.IncrementCount(metaLine,tmp); metaLine.start.x = atof(tmp); } if (s=="20") { is.getline(tmp,256); metaLine.IncrementCount(metaLine,tmp); metaLine.start.y = atof(tmp); } if (s=="30") { is.getline(tmp,256); metaLine.IncrementCount(metaLine,tmp); metaLine.start.z = atof(tmp); } if (s=="11") { is.getline(tmp,256); metaLine.IncrementCount(metaLine,tmp); metaLine.end.x = atof(tmp); } if(s=="21") { is.getline(tmp,256); metaLine.IncrementCount(metaLine,tmp); metaLine.end.y = atof(tmp); } if(s=="31") { is.getline(tmp,256); metaLine.IncrementCount(metaLine,tmp); metaLine.end.z = atof(tmp); } //在读取浮点数的时候,需要跳过后面的回车换行符 /*while(is.get()!='\n') continue;*/ is.getline(tmp,256); metaLine.IncrementCount(metaLine,tmp); s = tmp; s = s.Trim(); } //计算 metaLine.CalCurByteSize(); metaLine.m_orgByteSize = metaLine.GetCurByteSize(); return is; } //************************************ // Method: operator<< // FullName: operator<< // Access: public // Returns: friend ostream& // Qualifier: // Parameter: ostream & os // Parameter: const DXFLine & metaLine // Author: zhengzhe // CreateDate: 2011-11-21 //************************************ ostream& operator<< (ostream& os,const DXFLine& metaLine ) { os <<(DXFMeta&)metaLine <<endl; os<<"\nStart Point[x=" <<metaLine.start.x <<",y="<<metaLine.start.y<<",z="<<metaLine.start.z<<"]" <<"\nEnd Point[x=" <<metaLine.end.x <<",y="<<metaLine.end.y<<",z="<<metaLine.end.z<<"]"; return os; }