1 // TextPath.cpp
2 
3 // copyright Dan Heeks, September 3rd 2009, license: GPL version 3 http://www.gnu.org/licenses/gpl-3.0.txt
4 
5 #include "stdafx.h"
6 #include "TextPath.h"
7 #include <cmath>
8 
CTextPath(const _TCHAR * txt_file,int format_style)9 CTextPath::CTextPath(const _TCHAR* txt_file, int format_style)
10 {
11 	m_ofs = new ofstream(Ttc(txt_file));
12 	m_number_format = format_style;
13 }
14 
~CTextPath()15 CTextPath::~CTextPath()
16 {
17 	delete m_ofs;
18 }
19 
Failed()20 bool CTextPath::Failed()
21 {
22 	return !(*m_ofs);
23 }
24 
25 static char str_for_num[1024];
26 
num1(double v)27 static const char* num1(double v)
28 {
29 	int i = 0;
30 	if(v<0)str_for_num[i] = '-';
31 	else str_for_num[i] = '+';
32 	i++;
33 
34 	double value = v;
35 	value = fabs(value);
36 	if(value > 99999)value = 99999;
37 
38 	double f = 10000.0;
39 	for(int j = 0; j<8; j++)
40 	{
41 		double temp_v = value / f;
42 		if(j == 7)temp_v += 0.5; // round up last one
43 		int d = (int)temp_v;
44 		sprintf(&str_for_num[i], "%d", d);
45 		i++;
46 		value -= d*f;
47 		f *= 0.1;
48 		if(j == 4){
49 			str_for_num[i] = '.';
50 			i++;
51 		}
52 	}
53 
54 	// end string
55 	str_for_num[i] = 0;
56 
57 	return str_for_num;
58 }
59 
num(double v)60 const char* CTextPath::num(double v)
61 {
62 	switch(m_number_format)
63 	{
64 	case 1:
65 		num1(v);
66 		break;
67 
68 	default:
69 		sprintf(str_for_num, "%g", v);
70 		break;
71 	}
72 
73 	return str_for_num;
74 }
75 
OnRapidZ(double z)76 void CTextPath::OnRapidZ(double z)
77 {
78 	(*m_ofs)<<"G0Z"<<num(z)<<"\n";
79 }
80 
OnRapidXY(double x,double y)81 void CTextPath::OnRapidXY(double x, double y)
82 {
83 	(*m_ofs)<<"G0X"<<num(x);
84 	(*m_ofs)<<"Y"<<num(y)<<"\n";
85 }
86 
OnFeedZ(double z)87 void CTextPath::OnFeedZ(double z)
88 {
89 	(*m_ofs)<<"G1Z"<<num(z)<<"\n";
90 }
91 
OnFeedXY(double x,double y)92 void CTextPath::OnFeedXY(double x, double y)
93 {
94 	(*m_ofs)<<"G1X"<<num(x);
95 	(*m_ofs)<<"Y"<<num(y)<<"\n";
96 }
97 
OnArcCCW(double x,double y,double i,double j)98 void CTextPath::OnArcCCW(double x, double y, double i, double j)
99 {
100 	(*m_ofs)<<"G3X"<<num(x);
101 	(*m_ofs)<<"Y"<<num(y);
102 	(*m_ofs)<<"I"<<num(i);
103 	(*m_ofs)<<"J"<<num(j)<<"\n";
104 }
105 
OnArcCW(double x,double y,double i,double j)106 void CTextPath::OnArcCW(double x, double y, double i, double j)
107 {
108 	(*m_ofs)<<"G2X"<<num(x);
109 	(*m_ofs)<<"Y"<<num(y);
110 	(*m_ofs)<<"I"<<num(i);
111 	(*m_ofs)<<"J"<<num(j)<<"\n";
112 }
113 
114