1 /* write_dxf.c is a file to facilitate the transfer of information to the dxf
2 * format. It attempts to be input nuetral (so when digit gets replaced ten
3 * years from now it will still be good...).
4 *
5 * This file supports Version 10 of dxf.
6 *
7 * written by: Chuck Ehlschlaeger
8 */
9
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <grass/gis.h>
13 #include "global.h"
14
dxf_open(char * filename)15 int dxf_open(char *filename)
16 {
17 if ((dxf_fp = fopen(filename, "r")) != NULL) {
18 fclose(dxf_fp);
19
20 if (!overwrite)
21 G_fatal_error(_("The file '%s' already exists."), filename);
22
23 G_warning(_("The file '%s' already exists and will be overwritten."),
24 filename);
25 }
26 if ((dxf_fp = fopen(filename, "w")) == NULL)
27 G_fatal_error(_("%s: Cannot write dxf file."), filename);
28
29 return 0;
30 }
31
dxf_header(void)32 int dxf_header(void)
33 {
34 fprintf(dxf_fp, " 0\nSECTION\n 2\nHEADER\n");
35
36 return 0;
37 }
38
dxf_tables(void)39 int dxf_tables(void)
40 {
41 fprintf(dxf_fp, " 0\nSECTION\n 2\nTABLES\n");
42
43 return 0;
44 }
45
dxf_blocks(void)46 int dxf_blocks(void)
47 {
48 fprintf(dxf_fp, " 0\nSECTION\n 2\nBLOCKS\n");
49
50 return 0;
51 }
52
dxf_entities(void)53 int dxf_entities(void)
54 {
55 fprintf(dxf_fp, " 0\nSECTION\n 2\nENTITIES\n");
56
57 return 0;
58 }
59
dxf_endsec(void)60 int dxf_endsec(void)
61 {
62 fprintf(dxf_fp, " 0\nENDSEC\n");
63
64 return 0;
65 }
66
dxf_eof(void)67 int dxf_eof(void)
68 {
69 fprintf(dxf_fp, " 0\nEOF\n");
70 fclose(dxf_fp);
71
72 return 0;
73 }
74
75 /* header stuff */
76
dxf_limits(double top,double bottom,double right,double left)77 int dxf_limits(double top, double bottom, double right, double left)
78 {
79 fprintf(dxf_fp, " 9\n$LIMMIN\n 10\n%f\n 20\n%f\n", left, bottom);
80 fprintf(dxf_fp, " 9\n$LIMMAX\n 10\n%f\n 20\n%f\n", right, top);
81
82 return 0;
83 }
84
85 /* tables stuff */
86
dxf_linetype_table(int numlines)87 int dxf_linetype_table(int numlines)
88 {
89 fprintf(dxf_fp, " 0\nTABLE\n 2\nLTYPE\n 70\n%6d\n", numlines);
90
91 return 0;
92 }
93
dxf_layer_table(int numlayers)94 int dxf_layer_table(int numlayers)
95 {
96 fprintf(dxf_fp, " 0\nTABLE\n 2\nLAYER\n 70\n%6d\n", numlayers);
97
98 return 0;
99 }
100
dxf_endtable(void)101 int dxf_endtable(void)
102 {
103 fprintf(dxf_fp, " 0\nENDTAB\n");
104
105 return 0;
106 }
107
dxf_solidline(void)108 int dxf_solidline(void)
109 {
110 fprintf(dxf_fp, " 0\nLTYPE\n 2\nCONTINUOUS\n 70\n");
111 fprintf(dxf_fp, " 64\n 3\nSolid line\n 72\n 65\n");
112 fprintf(dxf_fp, " 73\n 0\n 40\n0.0\n");
113
114 return 0;
115 }
116
dxf_layer0(void)117 int dxf_layer0(void)
118 {
119 fprintf(dxf_fp, " 0\nLAYER\n 2\n0\n 70\n 0\n");
120 fprintf(dxf_fp, " 62\n 7\n 6\nCONTINUOUS\n");
121
122 return 0;
123 }
124
dxf_layer(char * name,int color,char * linetype,int frozen)125 int dxf_layer(char *name, int color, char *linetype, int frozen)
126 {
127 int is_frozen;
128
129 if (frozen)
130 is_frozen = 1;
131 else
132 is_frozen = 64;
133 fprintf(dxf_fp, " 0\nLAYER\n 2\n%s\n 70\n", name);
134 fprintf(dxf_fp, "%6d\n 62\n%6d\n 6\n%s\n", is_frozen, color, linetype);
135
136 return 0;
137 }
138
139 /* entities */
140
dxf_point(char * layer,double x,double y,double z)141 int dxf_point(char *layer, double x, double y, double z)
142 {
143 fprintf(dxf_fp, "0\nPOINT\n");
144 fprintf(dxf_fp, "8\n%s\n", (layer));
145 fprintf(dxf_fp, "10\n%f\n20\n%f\n30\n%f\n", x, y, z);
146
147 return 0;
148 }
149
dxf_polyline(char * layer)150 int dxf_polyline(char *layer)
151 {
152 fprintf(dxf_fp, "0\nPOLYLINE\n");
153 fprintf(dxf_fp, "8\n%s\n", (layer));
154 fprintf(dxf_fp, "66\n1\n");
155 /* fprintf(dxf_fp,"10\n0.0\n 20\n0.0\n 30\n0.0\n"); *//* ? */
156
157 return 0;
158 }
159
dxf_vertex(char * layer,double x,double y,double z)160 int dxf_vertex(char *layer, double x, double y, double z)
161 {
162 fprintf(dxf_fp, "0\nVERTEX\n");
163 fprintf(dxf_fp, "8\n%s\n", layer);
164 fprintf(dxf_fp, "10\n%f\n20\n%f\n 30\n%f\n", x, y, z);
165
166 return 0;
167 }
168
dxf_text(char * layer,double x,double y,double z,double size,int just,char * text)169 int dxf_text(char *layer, double x, double y, double z, double size, int just,
170 char *text)
171 {
172 fprintf(dxf_fp, " 0\nTEXT\n 8\n%s\n 10\n%f\n 20\n", layer, x);
173 fprintf(dxf_fp, "%f\n 30\n%f\n 40\n%f\n 1\n%s\n", y, z, size, text);
174 if (just)
175 fprintf(dxf_fp, " 72\n%6d\n 11\n%f\n 21\n%f\n 31\n%f\n", just, x, y,
176 z);
177
178 return 0;
179 }
180
dxf_poly_end(char * layer)181 int dxf_poly_end(char *layer)
182 {
183 fprintf(dxf_fp, " 0\nSEQEND\n 8\n%s\n", layer);
184
185 return 0;
186 }
187