设计类图如下所示:
定义代码为:
File: Entity.h
1
2 #ifndef _ENTITY_H_
3 #define _ENTITY_H_
4
5 #include <iostream>
6 #include <list>
7 #include <fstream>
8 #include <string>
9 using namespace std;
10
11 class CEntity
12 {
13 public:
14 CEntity(void);
15 ~CEntity(void);
16
17 // 显示数据
18 virtual void Show(void) = 0;
19
20 private:
21
22 };
23
24 #endif // _ENTITY_H_
File : Entity.cpp
1 #include "Entity.h"
2
3 CEntity::CEntity(void)
4 {
5 }
6
7 CEntity::~CEntity(void)
8 {
9 }
10
File : Line.h
1
2 #ifndef _LINE_H_
3 #define _LINE_H_
4
5 #include "Entity.h"
6
7 class CLine : public CEntity
8 {
9 public:
10 CLine(void);
11 ~CLine(void);
12
13 // 显示数据
14 void Show(void);
15
16 // 设值
17 void SetX1(double x);
18 void SetY1(double y);
19 void SetZ1(double z);
20 void SetX2(double x);
21 void SetY2(double y);
22 void SetZ2(double z);
23
24 private:
25 // 直线起点x: 10
26 double m_x1;
27 // 直线起点y: 20
28 double m_y1;
29 // 直线起点z: 30
30 double m_z1;
31 // 直线终点x: 11
32 double m_x2;
33 // 直线终点y: 21
34 double m_y2;
35 // 直线终点z: 31
36 double m_z2;
37
38 };
39
40 #endif // _LINE_H_
File: Line.cpp
1 #include "Line.h"
2
3 CLine::CLine(void)
4 {
5 m_x1 = m_x2 = m_y1 = m_y2 = m_z1 = m_z2 = 0;
6 }
7
8 CLine::~CLine(void)
9 {
10 }
11
12 void CLine::Show( void )
13 {
14 cout<<"-----------------LINE------------------"<<endl;
15 cout<<"Start : ("<<m_x1<<","<<m_y1<<","<<m_z1<<")"<<endl;
16 cout<<"End : ("<<m_x2<<","<<m_y2<<","<<m_z2<<")"<<endl;
17 cout<<"======================================="<<endl;
18 }
19
20 void CLine::SetX1( double x )
21 {
22 m_x1 = x;
23 }
24
25 void CLine::SetY1( double y )
26 {
27 m_y1 = y;
28 }
29
30 void CLine::SetZ1( double z )
31 {
32 m_z1 = z;
33 }
34
35 void CLine::SetX2( double x )
36 {
37 m_x2 = x;
38 }
39
40 void CLine::SetY2( double y )
41 {
42 m_y2 = y;
43 }
44
45 void CLine::SetZ2( double z )
46 {
47 m_z2 = z;
48 }
File : Circle.h
1
2 #ifndef _CIRCLE_H_
3 #define _CIRCLE_H_
4
5 #include "Entity.h"
6
7 class CCircle : public CEntity
8 {
9 public:
10 CCircle(void);
11 ~CCircle(void);
12
13 // 显示数据
14 void Show(void);
15
16 // 设值
17 void SetX(double x);
18 void SetY(double y);
19 void SetZ(double z);
20 void SetRadius(double r);
21
22 private:
23 // 圆心坐标x: 10
24 double m_x;
25 // 圆心坐标x: 20
26 double m_y;
27 // 圆心坐标x: 30
28 double m_z;
29 // 半径R: 40
30 double m_Radius;
31 };
32
33 #endif // _CIRCLE_H_
File : Circle.cpp
1 #include "Circle.h"
2
3 CCircle::CCircle(void)
4 {
5 m_x = m_y = m_z = m_Radius = 0;
6 }
7
8 CCircle::~CCircle(void)
9 {
10 }
11
12 void CCircle::Show( void )
13 {
14 cout<<"----------------CIRCLE-----------------"<<endl;
15 cout<<"Center : ("<<m_x<<","<<m_y<<","<<m_z<<")"<<endl;
16 cout<<"Radius : "<<m_Radius<<endl;
17 cout<<"======================================="<<endl;
18 }
19
20 void CCircle::SetX( double x )
21 {
22 m_x = x;
23 }
24
25 void CCircle::SetY( double y )
26 {
27 m_y = y;
28 }
29
30 void CCircle::SetZ( double z )
31 {
32 m_z = z;
33 }
34
35 void CCircle::SetRadius( double r )
36 {
37 m_Radius = r;
38 }
File. : Arc.h
1
2 #ifndef _ARC_H_
3 #define _ARC_H_
4
5 #include "Entity.h"
6
7 class CArc : public CEntity
8 {
9 public:
10 CArc(void);
11 ~CArc(void);
12
13 // 显示数据
14 void Show(void);
15
16 // 设值
17 void SetStartAngle(double s);
18 void SetEndAngle(double e);
19
20 private:
21 // 起点角度: 50
22 double m_StartAngle;
23 // 端点角度: 51
24 double m_EndAngle;
25 };
26
27 #endif // _ARC_H_
File : Arc.cpp
1 #include "Arc.h"
2
3 CArc::CArc(void)
4 {
5 m_StartAngle = 0;
6 m_EndAngle = 0;
7 }
8
9 CArc::~CArc(void)
10 {
11 }
12
13 void CArc::Show( void )
14 {
15 cout<<"-----------------ARC-------------------"<<endl;
16 cout<<"Start : "<<m_StartAngle<<endl;
17 cout<<"End : "<<m_EndAngle<<endl;
18 cout<<"======================================="<<endl;
19 }
20
21 void CArc::SetStartAngle( double s )
22 {
23 m_StartAngle = s;
24 }
25
26 void CArc::SetEndAngle( double e )
27 {
28 m_EndAngle = e;
29 }
Put it all together :
File : main.cpp
1
2 #include "Arc.h"
3 #include "Line.h"
4 #include "Circle.h"
5
6
7 int main(int argc, char* argv[])
8 {
9 char szFileName[_MAX_FNAME];
10 int iGroupCode = 0;
11 string strGroupValue;
12 string strBuffer;
13 list<CEntity*> EntitiesList;
14
15 cout<<"Input a DXF file name :";
16 cin>>szFileName;
17
18 CLine* pLine = NULL;
19 CCircle* pCircle = NULL;
20 CArc* pArc = NULL;
21
22 ifstream iDxfFile(szFileName);
23
24 if (!iDxfFile.is_open())
25 {
26 cout<<"Open DXF file "<<szFileName<<" failed!"<<endl;
27 return -1;
28 }
29
30 while ( !iDxfFile.eof())
31 {
32 getline(iDxfFile, strBuffer);
33 iGroupCode = atoi(strBuffer.c_str());
34 getline(iDxfFile, strGroupValue);
35
36 // Just Read Entities Section.
37 if (iGroupCode == 2 && strGroupValue.compare("ENTITIES") == 0)
38 {
39 getline(iDxfFile, strBuffer);
40 getline(iDxfFile, strGroupValue);
41 iGroupCode = atoi(strBuffer.c_str());
42
43 while (strGroupValue.compare("ENDSEC") != 0)
44 {
45 // Read Line Data
46 if (iGroupCode == 0 && strGroupValue.compare("LINE") == 0)
47 {
48 pLine = new CLine;
49 getline(iDxfFile, strBuffer);
50 getline(iDxfFile, strGroupValue);
51 iGroupCode = atoi(strBuffer.c_str());
52
53 while (iGroupCode)
54 {
55 //
56 getline(iDxfFile, strBuffer);
57 getline(iDxfFile, strGroupValue);
58 iGroupCode = atoi(strBuffer.c_str());
59 switch(iGroupCode)
60 {
61 case 10: pLine->SetX1(atof(strGroupValue.c_str())); break;
62 case 20: pLine->SetY1(atof(strGroupValue.c_str())); break;
63 case 30: pLine->SetZ1(atof(strGroupValue.c_str())); break;
64 case 11: pLine->SetX2(atof(strGroupValue.c_str())); break;
65 case 21: pLine->SetY2(atof(strGroupValue.c_str())); break;
66 case 31: pLine->SetZ2(atof(strGroupValue.c_str())); break;
67 }
68 }
69
70 EntitiesList.push_front(pLine);
71 }
72
73 // Read Circle Data
74 else if (iGroupCode == 0 && strGroupValue.compare("CIRCLE") == 0)
75 {
76 pCircle = new CCircle;
77 getline(iDxfFile, strBuffer);
78 getline(iDxfFile, strGroupValue);
79 iGroupCode = atoi(strBuffer.c_str());
80
81 while (iGroupCode)
82 {
83 //
84 getline(iDxfFile, strBuffer);
85 getline(iDxfFile, strGroupValue);
86 iGroupCode = atoi(strBuffer.c_str());
87 switch(iGroupCode)
88 {
89 case 10: pCircle->SetX(atof(strGroupValue.c_str())); break;
90 case 20: pCircle->SetY(atof(strGroupValue.c_str())); break;
91 case 30: pCircle->SetZ(atof(strGroupValue.c_str())); break;
92 case 40: pCircle->SetRadius(atof(strGroupValue.c_str())); break;
93 }
94 }
95
96 EntitiesList.push_front(pCircle);
97 }
98
99 // Read Arc Data
100 else if (iGroupCode == 0 && strGroupValue.compare("ARC") == 0)
101 {
102 pArc = new CArc;
103 getline(iDxfFile, strBuffer);
104 getline(iDxfFile, strGroupValue);
105 iGroupCode = atoi(strBuffer.c_str());
106
107 while (iGroupCode)
108 {
109 //
110 getline(iDxfFile, strBuffer);
111 getline(iDxfFile, strGroupValue);
112 iGroupCode = atoi(strBuffer.c_str());
113 switch(iGroupCode)
114 {
115 case 50: pArc->SetStartAngle(atof(strGroupValue.c_str())); break;
116 case 51: pArc->SetEndAngle(atof(strGroupValue.c_str())); break;
117 }
118 }
119
120 EntitiesList.push_front(pArc);
121 }
122
123 // Other entities
124 else
125 {
126 // Move to next two lines
127 getline(iDxfFile, strBuffer);
128 getline(iDxfFile, strGroupValue);
129 /*iGroupCode = atoi(strBuffer.c_str());*/
130 }
131 }
132 }
133
134 }
135
136 // Output Entities
137 for (list<CEntity*>::iterator iter = EntitiesList.begin();
138 iter != EntitiesList.end();
139 iter++)
140 {
141 (*iter)->Show();
142 }
143
144 return 0;
145 }