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