设计类图如下所示:
定义代码为:
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
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_
1
#include
"
Entity.h
"
2
3 CEntity::CEntity( void )
4 {
5 }
6
7 CEntity:: ~ CEntity( void )
8 {
9 }
10
File : Line.h
2
3 CEntity::CEntity( void )
4 {
5 }
6
7 CEntity:: ~ CEntity( void )
8 {
9 }
10
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
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_
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
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 }
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
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_
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
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 }
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
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_
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 :
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 }
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 }
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 }