1 /******************************************************************************
2 **  libDXFrw - Library to read/write DXF files (ascii & binary)              **
3 **                                                                           **
4 **  Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com               **
5 **                                                                           **
6 **  This library is free software, licensed under the terms of the GNU       **
7 **  General Public License as published by the Free Software Foundation,     **
8 **  either version 2 of the License, or (at your option) any later version.  **
9 **  You should have received a copy of the GNU General Public License        **
10 **  along with this program.  If not, see <http://www.gnu.org/licenses/>.    **
11 ******************************************************************************/
12 
13 #include "drw_header.h"
14 #include "intern/dxfreader.h"
15 #include "intern/dxfwriter.h"
16 #include "intern/drw_dbg.h"
17 
DRW_Header()18 DRW_Header::DRW_Header()
19     : vars(),
20       comments(),
21       name(),
22       curr(),
23       version(DRW::AC1021),
24       linetypeCtrl(0),
25       layerCtrl(0),
26       styleCtrl(0),
27       dimstyleCtrl(0),
28       appidCtrl(0),
29       blockCtrl(0),
30       viewCtrl(0),
31       ucsCtrl(0),
32       vportCtrl(0),
33       vpEntHeaderCtrl(0)
34 {}
35 
addComment(const std::string & c)36 void DRW_Header::addComment(const std::string &c){
37     if (!comments.empty())
38         comments += '\n';
39     comments += c;
40 }
41 
parseCode(int code,dxfReader * reader)42 void DRW_Header::parseCode(int code, dxfReader *reader){
43     switch (code) {
44     case 9:
45         curr = new DRW_Variant();
46         name = reader->getString();
47         if (version < DRW::AC1015 && name == "$DIMUNIT")
48             name="$DIMLUNIT";
49         vars[name]=curr;
50         break;
51     case 1:
52         curr->addString(reader->getUtf8String());
53         if (name =="$ACADVER") {
54             reader->setVersion(curr->content.s, true);
55             version = reader->getVersion();
56         }
57         curr->code = code;
58         break;
59     case 2:
60     case 6:
61     case 7:
62     case 8:
63     case 390:
64         curr->addString(reader->getUtf8String());
65         curr->code = code;
66         break;
67     case 3:
68         curr->addString(reader->getUtf8String());
69         if (name =="$DWGCODEPAGE") {
70             reader->setCodePage(curr->content.s);
71             curr->addString(reader->getCodePage());
72         }
73         curr->code = code;
74         break;
75     case 10:
76         curr->addCoord();
77         curr->setCoordX(reader->getDouble());
78         curr->code = code;
79         break;
80     case 20:
81         curr->setCoordY(reader->getDouble());
82         break;
83     case 30:
84         curr->setCoordZ(reader->getDouble());
85         curr->code = code;
86         break;
87     case 40:
88     case 50:
89         curr->addDouble(reader->getDouble());
90         curr->code = code;
91         break;
92     case 62:
93     case 70:
94     case 280:
95     case 290:
96     case 370:
97     case 380:
98         curr->addInt(reader->getInt32());
99         curr->code = code;
100         break;
101     default:
102         break;
103     }
104 }
105 
write(dxfWriter * writer,DRW::Version ver)106 void DRW_Header::write(dxfWriter *writer, DRW::Version ver){
107 /*RLZ: TODO complete all vars to AC1024*/
108     double varDouble;
109     int varInt;
110     std::string varStr;
111     DRW_Coord varCoord;
112     writer->writeString(2, "HEADER");
113     writer->writeString(9, "$ACADVER");
114     switch (ver) {
115     case DRW::AC1006: //unsupported version acad 10
116     case DRW::AC1009: //acad 11 & 12
117         varStr = "AC1009";
118         break;
119     case DRW::AC1012: //unsupported version acad 13
120     case DRW::AC1014: //acad 14
121         varStr = "AC1014";
122         break;
123     case DRW::AC1015: //acad 2000
124         varStr = "AC1015";
125         break;
126     case DRW::AC1018: //acad 2004
127         varStr = "AC1018";
128         break;
129     case DRW::AC1024: //acad 2010
130         varStr = "AC1024";
131         break;
132     case DRW::AC1027: //acad 2013
133         varStr = "AC1027";
134         break;
135     case DRW::AC1021: //acad 2007
136     default: //acad 2007 default version
137         varStr = "AC1021";
138         break;
139     }
140     writer->writeString(1, varStr);
141     writer->setVersion(&varStr, true);
142 
143     getStr("$ACADVER", &varStr);
144     getStr("$ACADMAINTVER", &varStr);
145 
146     if (!getStr("$DWGCODEPAGE", &varStr)) {
147         varStr = "ANSI_1252";
148     }
149     writer->writeString(9, "$DWGCODEPAGE");
150     writer->setCodePage(&varStr);
151     writer->writeString(3, writer->getCodePage() );
152     writer->writeString(9, "$INSBASE");
153     if (getCoord("$INSBASE", &varCoord)) {
154         writer->writeDouble(10, varCoord.x);
155         writer->writeDouble(20, varCoord.y);
156         writer->writeDouble(30, varCoord.z);
157     } else {
158         writer->writeDouble(10, 0.0);
159         writer->writeDouble(20, 0.0);
160         writer->writeDouble(30, 0.0);
161     }
162     writer->writeString(9, "$EXTMIN");
163     if (getCoord("$EXTMIN", &varCoord)) {
164         writer->writeDouble(10, varCoord.x);
165         writer->writeDouble(20, varCoord.y);
166         writer->writeDouble(30, varCoord.z);
167     } else {
168         writer->writeDouble(10, 1.0000000000000000E+020);
169         writer->writeDouble(20, 1.0000000000000000E+020);
170         writer->writeDouble(30, 1.0000000000000000E+020);
171     }
172     writer->writeString(9, "$EXTMAX");
173     if (getCoord("$EXTMAX", &varCoord)) {
174         writer->writeDouble(10, varCoord.x);
175         writer->writeDouble(20, varCoord.y);
176         writer->writeDouble(30, varCoord.z);
177     } else {
178         writer->writeDouble(10, -1.0000000000000000E+020);
179         writer->writeDouble(20, -1.0000000000000000E+020);
180         writer->writeDouble(30, -1.0000000000000000E+020);
181     }
182     writer->writeString(9, "$LIMMIN");
183     if (getCoord("$LIMMIN", &varCoord)) {
184         writer->writeDouble(10, varCoord.x);
185         writer->writeDouble(20, varCoord.y);
186     } else {
187         writer->writeDouble(10, 0.0);
188         writer->writeDouble(20, 0.0);
189     }
190     writer->writeString(9, "$LIMMAX");
191     if (getCoord("$LIMMAX", &varCoord)) {
192         writer->writeDouble(10, varCoord.x);
193         writer->writeDouble(20, varCoord.y);
194     } else {
195         writer->writeDouble(10, 420.0);
196         writer->writeDouble(20, 297.0);
197     }
198     writer->writeString(9, "$ORTHOMODE");
199     if (getInt("$ORTHOMODE", &varInt))
200         writer->writeInt16(70, varInt);
201     else
202         writer->writeInt16(70, 0);
203     writer->writeString(9, "$REGENMODE");
204     if (getInt("$REGENMODE", &varInt))
205         writer->writeInt16(70, varInt);
206     else
207         writer->writeInt16(70, 1);
208     writer->writeString(9, "$FILLMODE");
209     if (getInt("$FILLMODE", &varInt))
210         writer->writeInt16(70, varInt);
211     else
212         writer->writeInt16(70, 1);
213     writer->writeString(9, "$QTEXTMODE");
214     if (getInt("$QTEXTMODE", &varInt))
215         writer->writeInt16(70, varInt);
216     else
217         writer->writeInt16(70, 0);
218     writer->writeString(9, "$MIRRTEXT");
219     if (getInt("$MIRRTEXT", &varInt))
220         writer->writeInt16(70, varInt);
221     else
222         writer->writeInt16(70, 0);
223     if (ver == DRW::AC1009){
224         writer->writeString(9, "$DRAGMODE");
225         if (getInt("$DRAGMODE", &varInt))
226             writer->writeInt16(70, varInt);
227         else
228             writer->writeInt16(70, 2);
229     }
230     writer->writeString(9, "$LTSCALE");
231     if (getDouble("$LTSCALE", &varDouble))
232         writer->writeDouble(40, varDouble);
233     else
234         writer->writeDouble(40, 1.0);
235     if (ver == DRW::AC1009){
236         writer->writeString(9, "$OSMODE");
237         if (getInt("$OSMODE", &varInt))
238             writer->writeInt16(70, varInt);
239         else
240             writer->writeInt16(70, 0);
241     }
242     writer->writeString(9, "$ATTMODE");
243     if (getInt("$ATTMODE", &varInt))
244         writer->writeInt16(70, varInt);
245     else
246         writer->writeInt16(70, 0);
247     writer->writeString(9, "$TEXTSIZE");
248     if (getDouble("$TEXTSIZE", &varDouble))
249         writer->writeDouble(40, varDouble);
250     else
251         writer->writeDouble(40, 2.5);
252     writer->writeString(9, "$TRACEWID");
253     if (getDouble("$TRACEWID", &varDouble))
254         writer->writeDouble(40, varDouble);
255     else
256         writer->writeDouble(40, 15.68);
257     writer->writeString(9, "$TEXTSTYLE");
258     if (getStr("$TEXTSTYLE", &varStr))
259         if (ver == DRW::AC1009)
260             writer->writeUtf8Caps(7, varStr);
261         else
262             writer->writeUtf8String(7, varStr);
263     else
264         writer->writeString(7, "STANDARD");
265     writer->writeString(9, "$CLAYER");
266     if (getStr("$CLAYER", &varStr))
267         if (ver == DRW::AC1009)
268             writer->writeUtf8Caps(8, varStr);
269         else
270             writer->writeUtf8String(8, varStr);
271     else
272         writer->writeString(8, "0");
273     writer->writeString(9, "$CELTYPE");
274     if (getStr("$CELTYPE", &varStr))
275         if (ver == DRW::AC1009)
276             writer->writeUtf8Caps(6, varStr);
277         else
278             writer->writeUtf8String(6, varStr);
279     else
280         writer->writeString(6, "BYLAYER");
281     writer->writeString(9, "$CECOLOR");
282     if (getInt("$CECOLOR", &varInt))
283         writer->writeInt16(62, varInt);
284     else
285         writer->writeInt16(62, 256);
286     if (ver > DRW::AC1009){
287         writer->writeString(9, "$CELTSCALE");
288         if (getDouble("$CELTSCALE", &varDouble))
289             writer->writeDouble(40, varDouble);
290         else
291             writer->writeDouble(40, 1.0);
292         writer->writeString(9, "$DISPSILH");
293         if (getInt("$DISPSILH", &varInt))
294             writer->writeInt16(70, varInt);
295         else
296             writer->writeInt16(70, 0);
297     }
298 
299     writer->writeString(9, "$DIMSCALE");
300     if (getDouble("$DIMSCALE", &varDouble))
301         writer->writeDouble(40, varDouble);
302     else
303         writer->writeDouble(40, 1.0);
304     writer->writeString(9, "$DIMASZ");
305     if (getDouble("$DIMASZ", &varDouble))
306         writer->writeDouble(40, varDouble);
307     else
308         writer->writeDouble(40, 2.5);
309     writer->writeString(9, "$DIMEXO");
310     if (getDouble("$DIMEXO", &varDouble))
311         writer->writeDouble(40, varDouble);
312     else
313         writer->writeDouble(40, 0.625);
314     writer->writeString(9, "$DIMDLI");
315     if (getDouble("$DIMDLI", &varDouble))
316         writer->writeDouble(40, varDouble);
317     else
318         writer->writeDouble(40, 3.75);
319     writer->writeString(9, "$DIMRND");
320     if (getDouble("$DIMRND", &varDouble))
321         writer->writeDouble(40, varDouble);
322     else
323         writer->writeDouble(40, 0.0);
324     writer->writeString(9, "$DIMDLE");
325     if (getDouble("$DIMDLE", &varDouble))
326         writer->writeDouble(40, varDouble);
327     else
328         writer->writeDouble(40, 0.0);
329     writer->writeString(9, "$DIMEXE");
330     if (getDouble("$DIMEXE", &varDouble))
331         writer->writeDouble(40, varDouble);
332     else
333         writer->writeDouble(40, 1.25);
334     writer->writeString(9, "$DIMTP");
335     if (getDouble("$DIMTP", &varDouble))
336         writer->writeDouble(40, varDouble);
337     else
338         writer->writeDouble(40, 0.0);
339     writer->writeString(9, "$DIMTM");
340     if (getDouble("$DIMTM", &varDouble))
341         writer->writeDouble(40, varDouble);
342     else
343         writer->writeDouble(40, 0.0);
344     writer->writeString(9, "$DIMTXT");
345     if (getDouble("$DIMTXT", &varDouble))
346         writer->writeDouble(40, varDouble);
347     else
348         writer->writeDouble(40, 2.5);
349     writer->writeString(9, "$DIMCEN");
350     if (getDouble("$DIMCEN", &varDouble))
351         writer->writeDouble(40, varDouble);
352     else
353         writer->writeDouble(40, 2.5);
354     writer->writeString(9, "$DIMTSZ");
355     if (getDouble("$DIMTSZ", &varDouble))
356         writer->writeDouble(40, varDouble);
357     else
358         writer->writeDouble(40, 0.0);
359     writer->writeString(9, "$DIMTOL");
360     if (getInt("$DIMTOL", &varInt))
361         writer->writeInt16(70, varInt);
362     else
363         writer->writeInt16(70, 0);
364     writer->writeString(9, "$DIMLIM");
365     if (getInt("$DIMLIM", &varInt))
366         writer->writeInt16(70, varInt);
367     else
368         writer->writeInt16(70, 0);
369     writer->writeString(9, "$DIMTIH");
370     if (getInt("$DIMTIH", &varInt))
371         writer->writeInt16(70, varInt);
372     else
373         writer->writeInt16(70, 0);
374     writer->writeString(9, "$DIMTOH");
375     if (getInt("$DIMTOH", &varInt))
376         writer->writeInt16(70, varInt);
377     else
378         writer->writeInt16(70, 0);
379     writer->writeString(9, "$DIMSE1");
380     if (getInt("$DIMSE1", &varInt))
381         writer->writeInt16(70, varInt);
382     else
383         writer->writeInt16(70, 0);
384     writer->writeString(9, "$DIMSE2");
385     if (getInt("$DIMSE2", &varInt))
386         writer->writeInt16(70, varInt);
387     else
388         writer->writeInt16(70, 0);
389     writer->writeString(9, "$DIMTAD");
390     if (getInt("$DIMTAD", &varInt))
391         writer->writeInt16(70, varInt);
392     else
393         writer->writeInt16(70, 1);
394     writer->writeString(9, "$DIMZIN");
395     if (getInt("$DIMZIN", &varInt))
396         writer->writeInt16(70, varInt);
397     else
398         writer->writeInt16(70, 8);
399     writer->writeString(9, "$DIMBLK");
400     if (getStr("$DIMBLK", &varStr))
401         if (ver == DRW::AC1009)
402             writer->writeUtf8Caps(1, varStr);
403         else
404             writer->writeUtf8String(1, varStr);
405     else
406         writer->writeString(1, "");
407     writer->writeString(9, "$DIMASO");
408     if (getInt("$DIMASO", &varInt))
409         writer->writeInt16(70, varInt);
410     else
411         writer->writeInt16(70, 1);
412     writer->writeString(9, "$DIMSHO");
413     if (getInt("$DIMSHO", &varInt))
414         writer->writeInt16(70, varInt);
415     else
416         writer->writeInt16(70, 1);
417     writer->writeString(9, "$DIMPOST");
418     if (getStr("$DIMPOST", &varStr))
419         if (ver == DRW::AC1009)
420             writer->writeUtf8Caps(1, varStr);
421         else
422             writer->writeUtf8String(1, varStr);
423     else
424         writer->writeString(1, "");
425     writer->writeString(9, "$DIMAPOST");
426     if (getStr("$DIMAPOST", &varStr))
427         if (ver == DRW::AC1009)
428             writer->writeUtf8Caps(1, varStr);
429         else
430             writer->writeUtf8String(1, varStr);
431     else
432         writer->writeString(1, "");
433     writer->writeString(9, "$DIMALT");
434     if (getInt("$DIMALT", &varInt))
435         writer->writeInt16(70, varInt);
436     else
437         writer->writeInt16(70, 0);
438     writer->writeString(9, "$DIMALTD");
439     if (getInt("$DIMALTD", &varInt))
440         writer->writeInt16(70, varInt);
441     else
442         writer->writeInt16(70, 3);
443     writer->writeString(9, "$DIMALTF");
444     if (getDouble("$DIMALTF", &varDouble))
445         writer->writeDouble(40, varDouble);
446     else
447         writer->writeDouble(40, 0.03937);
448     writer->writeString(9, "$DIMLFAC");
449     if (getDouble("$DIMLFAC", &varDouble))
450         writer->writeDouble(40, varDouble);
451     else
452         writer->writeDouble(40, 1.0);
453     writer->writeString(9, "$DIMTOFL");
454     if (getInt("$DIMTOFL", &varInt))
455         writer->writeInt16(70, varInt);
456     else
457         writer->writeInt16(70, 1);
458     writer->writeString(9, "$DIMTVP");
459     if (getDouble("$DIMTVP", &varDouble))
460         writer->writeDouble(40, varDouble);
461     else
462         writer->writeDouble(40, 0.0);
463     writer->writeString(9, "$DIMTIX");
464     if (getInt("$DIMTIX", &varInt))
465         writer->writeInt16(70, varInt);
466     else
467         writer->writeInt16(70, 0);
468     writer->writeString(9, "$DIMSOXD");
469     if (getInt("$DIMSOXD", &varInt))
470         writer->writeInt16(70, varInt);
471     else
472         writer->writeInt16(70, 0);
473     writer->writeString(9, "$DIMSAH");
474     if (getInt("$DIMSAH", &varInt))
475         writer->writeInt16(70, varInt);
476     else
477         writer->writeInt16(70, 0);
478     writer->writeString(9, "$DIMBLK1");
479     if (getStr("$DIMBLK1", &varStr))
480         if (ver == DRW::AC1009)
481             writer->writeUtf8Caps(1, varStr);
482         else
483             writer->writeUtf8String(1, varStr);
484     else
485         writer->writeString(1, "");
486     writer->writeString(9, "$DIMBLK2");
487     if (getStr("$DIMBLK2", &varStr))
488         if (ver == DRW::AC1009)
489             writer->writeUtf8Caps(1, varStr);
490         else
491             writer->writeUtf8String(1, varStr);
492     else
493         writer->writeString(1, "");
494     writer->writeString(9, "$DIMSTYLE");
495     if (getStr("$DIMSTYLE", &varStr))
496         if (ver == DRW::AC1009)
497             writer->writeUtf8Caps(2, varStr);
498         else
499             writer->writeUtf8String(2, varStr);
500     else
501         writer->writeString(2, "STANDARD");
502     writer->writeString(9, "$DIMCLRD");
503     if (getInt("$DIMCLRD", &varInt))
504         writer->writeInt16(70, varInt);
505     else
506         writer->writeInt16(70, 0);
507     writer->writeString(9, "$DIMCLRE");
508     if (getInt("$DIMCLRE", &varInt))
509         writer->writeInt16(70, varInt);
510     else
511         writer->writeInt16(70, 0);
512     writer->writeString(9, "$DIMCLRT");
513     if (getInt("$DIMCLRT", &varInt))
514         writer->writeInt16(70, varInt);
515     else
516         writer->writeInt16(70, 0);
517     writer->writeString(9, "$DIMTFAC");
518     if (getDouble("$DIMTFAC", &varDouble))
519         writer->writeDouble(40, varDouble);
520     else
521         writer->writeDouble(40, 1.0);
522     writer->writeString(9, "$DIMGAP");
523     if (getDouble("$DIMGAP", &varDouble))
524         writer->writeDouble(40, varDouble);
525     else
526         writer->writeDouble(40, 0.625);
527     //post r12 dim vars
528     if (ver > DRW::AC1009) {
529         writer->writeString(9, "$DIMJUST");
530         if (getInt("$DIMJUST", &varInt))
531             writer->writeInt16(70, varInt);
532         else
533             writer->writeInt16(70, 0);
534         writer->writeString(9, "$DIMSD1");
535         if (getInt("$DIMSD1", &varInt))
536             writer->writeInt16(70, varInt);
537         else
538             writer->writeInt16(70, 0);
539         writer->writeString(9, "$DIMSD2");
540         if (getInt("$DIMSD2", &varInt))
541             writer->writeInt16(70, varInt);
542         else
543             writer->writeInt16(70, 0);
544         writer->writeString(9, "$DIMTOLJ");
545         if (getInt("$DIMTOLJ", &varInt))
546             writer->writeInt16(70, varInt);
547         else
548             writer->writeInt16(70, 0);
549         writer->writeString(9, "$DIMTZIN");
550         if (getInt("$DIMTZIN", &varInt))
551             writer->writeInt16(70, varInt);
552         else
553             writer->writeInt16(70, 8);
554         writer->writeString(9, "$DIMALTZ");
555         if (getInt("$DIMALTZ", &varInt))
556             writer->writeInt16(70, varInt);
557         else
558             writer->writeInt16(70, 0);
559         writer->writeString(9, "$DIMALTTZ");
560         if (getInt("$DIMALTTZ", &varInt))
561             writer->writeInt16(70, varInt);
562         else
563             writer->writeInt16(70, 0);
564         writer->writeString(9, "$DIMUPT");
565         if (getInt("$DIMUPT", &varInt))
566             writer->writeInt16(70, varInt);
567         else
568             writer->writeInt16(70, 0);
569         writer->writeString(9, "$DIMDEC");
570         if (getInt("$DIMDEC", &varInt))
571             writer->writeInt16(70, varInt);
572         else
573             writer->writeInt16(70, 2);
574         writer->writeString(9, "$DIMTDEC");
575         if (getInt("$DIMTDEC", &varInt))
576             writer->writeInt16(70, varInt);
577         else
578             writer->writeInt16(70, 2);
579         writer->writeString(9, "$DIMALTU");
580         if (getInt("$DIMALTU", &varInt))
581             writer->writeInt16(70, varInt);
582         else
583             writer->writeInt16(70, 2);
584         writer->writeString(9, "$DIMALTTD");
585         if (getInt("$DIMALTTD", &varInt))
586             writer->writeInt16(70, varInt);
587         else
588             writer->writeInt16(70, 3);
589         writer->writeString(9, "$DIMTXSTY");
590         if (getStr("$DIMTXSTY", &varStr))
591             if (ver == DRW::AC1009)
592                 writer->writeUtf8Caps(7, varStr);
593             else
594                 writer->writeUtf8String(7, varStr);
595         else
596             writer->writeString(7, "STANDARD");
597         writer->writeString(9, "$DIMAUNIT");
598         if (getInt("$DIMAUNIT", &varInt))
599             writer->writeInt16(70, varInt);
600         else
601             writer->writeInt16(70, 0);
602         writer->writeString(9, "$DIMADEC");
603         if (getInt("$DIMADEC", &varInt))
604             writer->writeInt16(70, varInt);
605         else
606             writer->writeInt16(70, 0);
607         writer->writeString(9, "$DIMALTRND");
608         if (getDouble("$DIMALTRND", &varDouble))
609             writer->writeDouble(40, varDouble);
610         else
611             writer->writeDouble(40, 0.0);
612         writer->writeString(9, "$DIMAZIN");
613         if (getInt("$DIMAZIN", &varInt))
614             writer->writeInt16(70, varInt);
615         else
616             writer->writeInt16(70, 0);
617         writer->writeString(9, "$DIMDSEP");
618         if (getInt("$DIMDSEP", &varInt))
619             writer->writeInt16(70, varInt);
620         else
621             writer->writeInt16(70, 44);
622         writer->writeString(9, "$DIMATFIT");
623         if (getInt("$DIMATFIT", &varInt))
624             writer->writeInt16(70, varInt);
625         else
626             writer->writeInt16(70, 3);
627         writer->writeString(9, "$DIMFRAC");
628         if (getInt("$DIMFRAC", &varInt))
629             writer->writeInt16(70, varInt);
630         else
631             writer->writeInt16(70, 0);
632         writer->writeString(9, "$DIMLDRBLK");
633         if (getStr("$DIMLDRBLK", &varStr))
634             if (ver == DRW::AC1009)
635                 writer->writeUtf8Caps(1, varStr);
636             else
637                 writer->writeUtf8String(1, varStr);
638         else
639             writer->writeString(1, "STANDARD");
640     //verify if exist "$DIMLUNIT" or obsolete "$DIMUNIT" (pre v2000)
641         if ( !getInt("$DIMLUNIT", &varInt) ){
642             if (!getInt("$DIMUNIT", &varInt))
643                 varInt = 2;
644         }
645         //verify valid values from 1 to 6
646         if (varInt<1 || varInt>6)
647             varInt = 2;
648         if (ver > DRW::AC1014) {
649             writer->writeString(9, "$DIMLUNIT");
650             writer->writeInt16(70, varInt);
651         } else {
652             writer->writeString(9, "$DIMUNIT");
653             writer->writeInt16(70, varInt);
654         }
655         writer->writeString(9, "$DIMLWD");
656         if (getInt("$DIMLWD", &varInt))
657             writer->writeInt16(70, varInt);
658         else
659             writer->writeInt16(70, -2);
660         writer->writeString(9, "$DIMLWE");
661         if (getInt("$DIMLWE", &varInt))
662             writer->writeInt16(70, varInt);
663         else
664             writer->writeInt16(70, -2);
665         writer->writeString(9, "$DIMTMOVE");
666         if (getInt("$DIMTMOVE", &varInt))
667             writer->writeInt16(70, varInt);
668         else
669             writer->writeInt16(70, 0);
670 
671         if (ver > DRW::AC1018) {// and post v2004 dim vars
672             writer->writeString(9, "$DIMFXL");
673             if (getDouble("$DIMFXL", &varDouble))
674                 writer->writeDouble(40, varDouble);
675             else
676                 writer->writeDouble(40, 1.0);
677             writer->writeString(9, "$DIMFXLON");
678             if (getInt("$DIMFXLON", &varInt))
679                 writer->writeInt16(70, varInt);
680             else
681                 writer->writeInt16(70, 0);
682             writer->writeString(9, "$DIMJOGANG");
683             if (getDouble("$DIMJOGANG", &varDouble))
684                 writer->writeDouble(40, varDouble);
685             else
686                 writer->writeDouble(40, 0.7854);
687             writer->writeString(9, "$DIMTFILL");
688             if (getInt("$DIMTFILL", &varInt))
689                 writer->writeInt16(70, varInt);
690             else
691                 writer->writeInt16(70, 0);
692             writer->writeString(9, "$DIMTFILLCLR");
693             if (getInt("$DIMTFILLCLR", &varInt))
694                 writer->writeInt16(70, varInt);
695             else
696                 writer->writeInt16(70, 0);
697             writer->writeString(9, "$DIMARCSYM");
698             if (getInt("$DIMARCSYM", &varInt))
699                 writer->writeInt16(70, varInt);
700             else
701                 writer->writeInt16(70, 0);
702             writer->writeString(9, "$DIMLTYPE");
703             if (getStr("$DIMLTYPE", &varStr))
704                 if (ver == DRW::AC1009)
705                     writer->writeUtf8Caps(6, varStr);
706                 else
707                     writer->writeUtf8String(6, varStr);
708             else
709                 writer->writeString(6, "");
710             writer->writeString(9, "$DIMLTEX1");
711             if (getStr("$DIMLTEX1", &varStr))
712                 if (ver == DRW::AC1009)
713                     writer->writeUtf8Caps(6, varStr);
714                 else
715                     writer->writeUtf8String(6, varStr);
716             else
717                 writer->writeString(6, "");
718             writer->writeString(9, "$DIMLTEX2");
719             if (getStr("$DIMLTEX2", &varStr))
720                 if (ver == DRW::AC1009)
721                     writer->writeUtf8Caps(6, varStr);
722                 else
723                     writer->writeUtf8String(6, varStr);
724             else
725                 writer->writeString(6, "");
726             if (ver > DRW::AC1021) {// and post v2007 dim vars
727                 writer->writeString(9, "$DIMTXTDIRECTION");
728                 if (getInt("$DIMTXTDIRECTION", &varInt))
729                     writer->writeInt16(70, varInt);
730                 else
731                     writer->writeInt16(70, 0);
732             }
733         }// end post v2004 dim vars
734     }//end post r12 dim vars
735 
736     writer->writeString(9, "$LUNITS");
737     if (getInt("$LUNITS", &varInt))
738         writer->writeInt16(70, varInt);
739     else
740         writer->writeInt16(70, 2);
741     writer->writeString(9, "$LUPREC");
742     if (getInt("$LUPREC", &varInt))
743         writer->writeInt16(70, varInt);
744     else
745         writer->writeInt16(70, 4);
746     writer->writeString(9, "$SKETCHINC");
747     if (getDouble("$SKETCHINC", &varDouble))
748         writer->writeDouble(40, varDouble);
749     else
750         writer->writeDouble(40, 1.0);
751     writer->writeString(9, "$FILLETRAD");
752     if (getDouble("$FILLETRAD", &varDouble))
753         writer->writeDouble(40, varDouble);
754     else
755         writer->writeDouble(40, 0.0);
756     writer->writeString(9, "$AUNITS");
757     if (getInt("$AUNITS", &varInt))
758         writer->writeInt16(70, varInt);
759     else
760         writer->writeInt16(70, 0);
761     writer->writeString(9, "$AUPREC");
762     if (getInt("$AUPREC", &varInt))
763         writer->writeInt16(70, varInt);
764     else
765         writer->writeInt16(70, 2);
766     writer->writeString(9, "$MENU");
767     if (getStr("$MENU", &varStr))
768         if (ver == DRW::AC1009)
769             writer->writeUtf8Caps(1, varStr);
770         else
771             writer->writeUtf8String(1, varStr);
772     else
773         writer->writeString(1, ".");
774     writer->writeString(9, "$ELEVATION");
775     if (getDouble("$ELEVATION", &varDouble))
776         writer->writeDouble(40, varDouble);
777     else
778         writer->writeDouble(40, 0.0);
779     writer->writeString(9, "$PELEVATION");
780     if (getDouble("$PELEVATION", &varDouble))
781         writer->writeDouble(40, varDouble);
782     else
783         writer->writeDouble(40, 0.0);
784     writer->writeString(9, "$THICKNESS");
785     if (getDouble("$THICKNESS", &varDouble))
786         writer->writeDouble(40, varDouble);
787     else
788         writer->writeDouble(40, 0.0);
789     writer->writeString(9, "$LIMCHECK");
790     if (getInt("$LIMCHECK", &varInt))
791         writer->writeInt16(70, varInt);
792     else
793         writer->writeInt16(70, 0);
794     if (ver < DRW::AC1015) {
795         writer->writeString(9, "$BLIPMODE");
796         if (getInt("$BLIPMODE", &varInt))
797             writer->writeInt16(70, varInt);
798         else
799             writer->writeInt16(70, 0);
800     }
801     writer->writeString(9, "$CHAMFERA");
802     if (getDouble("$CHAMFERA", &varDouble))
803         writer->writeDouble(40, varDouble);
804     else
805         writer->writeDouble(40, 0.0);
806     writer->writeString(9, "$CHAMFERB");
807     if (getDouble("$CHAMFERB", &varDouble))
808         writer->writeDouble(40, varDouble);
809     else
810         writer->writeDouble(40, 0.0);
811     if (ver > DRW::AC1009) {
812         writer->writeString(9, "$CHAMFERC");
813         if (getDouble("$CHAMFERC", &varDouble))
814             writer->writeDouble(40, varDouble);
815         else
816             writer->writeDouble(40, 0.0);
817         writer->writeString(9, "$CHAMFERD");
818         if (getDouble("$CHAMFERD", &varDouble))
819             writer->writeDouble(40, varDouble);
820         else
821             writer->writeDouble(40, 0.0);
822     }
823     writer->writeString(9, "$SKPOLY");
824     if (getInt("$SKPOLY", &varInt)) {
825         writer->writeInt16(70, varInt);
826     } else
827         writer->writeInt16(70, 0);
828     //rlz: todo, times
829     writer->writeString(9, "$USRTIMER");
830     if (getInt("$USRTIMER", &varInt)) {
831         writer->writeInt16(70, varInt);
832     } else
833         writer->writeInt16(70, 1);
834     writer->writeString(9, "$ANGBASE");
835     if (getDouble("$ANGBASE", &varDouble))
836         writer->writeDouble(50, varDouble);
837     else
838         writer->writeDouble(50, 0.0);
839     writer->writeString(9, "$ANGDIR");
840     if (getInt("$ANGDIR", &varInt)) {
841         writer->writeInt16(70, varInt);
842     } else
843         writer->writeInt16(70, 0);
844     writer->writeString(9, "$PDMODE");
845     if (getInt("$PDMODE", &varInt)) {
846         writer->writeInt16(70, varInt);
847     } else
848         writer->writeInt16(70, 34);
849     writer->writeString(9, "$PDSIZE");
850     if (getDouble("$PDSIZE", &varDouble))
851         writer->writeDouble(40, varDouble);
852     else
853         writer->writeDouble(40, 0.0);
854     writer->writeString(9, "$PLINEWID");
855     if (getDouble("$PLINEWID", &varDouble))
856         writer->writeDouble(40, varDouble);
857     else
858         writer->writeDouble(40, 0.0);
859     if (ver < DRW::AC1012) {
860         writer->writeString(9, "$COORDS");
861         if (getInt("$COORDS", &varInt)) {
862             writer->writeInt16(70, varInt);
863         } else
864             writer->writeInt16(70, 2);
865     }
866     writer->writeString(9, "$SPLFRAME");
867     if (getInt("$SPLFRAME", &varInt)) {
868         writer->writeInt16(70, varInt);
869     } else
870         writer->writeInt16(70, 0);
871     writer->writeString(9, "$SPLINETYPE");
872     if (getInt("$SPLINETYPE", &varInt)) {
873         writer->writeInt16(70, varInt);
874     } else
875         writer->writeInt16(70, 2);
876     writer->writeString(9, "$SPLINESEGS");
877     if (getInt("$SPLINESEGS", &varInt)) {
878         writer->writeInt16(70, varInt);
879     } else
880         writer->writeInt16(70, 8);
881     if (ver < DRW::AC1012) {
882         writer->writeString(9, "$ATTDIA");
883         if (getInt("$ATTDIA", &varInt)) {
884             writer->writeInt16(70, varInt);
885         } else
886             writer->writeInt16(70, 1);
887         writer->writeString(9, "$ATTREQ");
888         if (getInt("$ATTREQ", &varInt)) {
889             writer->writeInt16(70, varInt);
890         } else
891             writer->writeInt16(70, 1);
892         writer->writeString(9, "$HANDLING");
893         if (getInt("$HANDLING", &varInt)) {
894             writer->writeInt16(70, varInt);
895         } else
896             writer->writeInt16(70, 1);
897     }
898     writer->writeString(9, "$HANDSEED");
899     //RLZ        dxfHex(5, 0xFFFF);
900     writer->writeString(5, "20000");
901     writer->writeString(9, "$SURFTAB1");
902     if (getInt("$SURFTAB1", &varInt)) {
903         writer->writeInt16(70, varInt);
904     } else
905         writer->writeInt16(70, 6);
906     writer->writeString(9, "$SURFTAB2");
907     if (getInt("$SURFTAB2", &varInt)) {
908         writer->writeInt16(70, varInt);
909     } else
910         writer->writeInt16(70, 6);
911     writer->writeString(9, "$SURFTYPE");
912     if (getInt("$SURFTYPE", &varInt)) {
913         writer->writeInt16(70, varInt);
914     } else
915         writer->writeInt16(70, 6);
916     writer->writeString(9, "$SURFU");
917     if (getInt("$SURFU", &varInt)) {
918         writer->writeInt16(70, varInt);
919     } else
920         writer->writeInt16(70, 6);
921     writer->writeString(9, "$SURFV");
922     if (getInt("$SURFV", &varInt)) {
923         writer->writeInt16(70, varInt);
924     } else
925         writer->writeInt16(70, 6);
926     if (getStr("$TDCREATE", &varStr)) {
927         writer->writeString(9, "$TDCREATE");
928         writer->writeString(40, varStr);
929     }
930     if (ver > DRW::AC1009) {
931     writer->writeString(9, "$UCSBASE");
932     if (getStr("$UCSBASE", &varStr))
933         if (ver == DRW::AC1009)
934             writer->writeUtf8Caps(2, varStr);
935         else
936             writer->writeUtf8String(2, varStr);
937     else
938         writer->writeString(2, "");
939 }
940     writer->writeString(9, "$UCSNAME");
941     if (getStr("$UCSNAME", &varStr))
942         if (ver == DRW::AC1009)
943             writer->writeUtf8Caps(2, varStr);
944         else
945             writer->writeUtf8String(2, varStr);
946     else
947         writer->writeString(2, "");
948     writer->writeString(9, "$UCSORG");
949     if (getCoord("$UCSORG", &varCoord)) {
950         writer->writeDouble(10, varCoord.x);
951         writer->writeDouble(20, varCoord.y);
952         writer->writeDouble(30, varCoord.z);
953     } else {
954         writer->writeDouble(10, 0.0);
955         writer->writeDouble(20, 0.0);
956         writer->writeDouble(30, 0.0);
957     }
958     writer->writeString(9, "$UCSXDIR");
959     if (getCoord("$UCSXDIR", &varCoord)) {
960         writer->writeDouble(10, varCoord.x);
961         writer->writeDouble(20, varCoord.y);
962         writer->writeDouble(30, varCoord.z);
963     } else {
964         writer->writeDouble(10, 1.0);
965         writer->writeDouble(20, 0.0);
966         writer->writeDouble(30, 0.0);
967     }
968     writer->writeString(9, "$UCSYDIR");
969     if (getCoord("$UCSYDIR", &varCoord)) {
970         writer->writeDouble(10, varCoord.x);
971         writer->writeDouble(20, varCoord.y);
972         writer->writeDouble(30, varCoord.z);
973     } else {
974         writer->writeDouble(10, 0.0);
975         writer->writeDouble(20, 1.0);
976         writer->writeDouble(30, 0.0);
977     }
978     if (ver > DRW::AC1009) { //begin post r12 UCS vars
979         writer->writeString(9, "$UCSORTHOREF");
980         if (getStr("$UCSORTHOREF", &varStr))
981             if (ver == DRW::AC1009)
982                 writer->writeUtf8Caps(2, varStr);
983             else
984                 writer->writeUtf8String(2, varStr);
985         else
986             writer->writeString(2, "");
987         writer->writeString(9, "$UCSORTHOVIEW");
988         if (getInt("$UCSORTHOVIEW", &varInt))
989             writer->writeInt16(70, varInt);
990         else
991             writer->writeInt16(70, 0);
992         writer->writeString(9, "$UCSORGTOP");
993         if (getCoord("$UCSORGTOP", &varCoord)) {
994             writer->writeDouble(10, varCoord.x);
995             writer->writeDouble(20, varCoord.y);
996             writer->writeDouble(30, varCoord.z);
997         } else {
998             writer->writeDouble(10, 0.0);
999             writer->writeDouble(20, 0.0);
1000             writer->writeDouble(30, 0.0);
1001         }
1002         writer->writeString(9, "$UCSORGBOTTOM");
1003         if (getCoord("$UCSORGBOTTOM", &varCoord)) {
1004             writer->writeDouble(10, varCoord.x);
1005             writer->writeDouble(20, varCoord.y);
1006             writer->writeDouble(30, varCoord.z);
1007         } else {
1008             writer->writeDouble(10, 0.0);
1009             writer->writeDouble(20, 0.0);
1010             writer->writeDouble(30, 0.0);
1011         }
1012         writer->writeString(9, "$UCSORGLEFT");
1013         if (getCoord("$UCSORGLEFT", &varCoord)) {
1014             writer->writeDouble(10, varCoord.x);
1015             writer->writeDouble(20, varCoord.y);
1016             writer->writeDouble(30, varCoord.z);
1017         } else {
1018             writer->writeDouble(10, 0.0);
1019             writer->writeDouble(20, 0.0);
1020             writer->writeDouble(30, 0.0);
1021         }
1022         writer->writeString(9, "$UCSORGRIGHT");
1023         if (getCoord("$UCSORGRIGHT", &varCoord)) {
1024             writer->writeDouble(10, varCoord.x);
1025             writer->writeDouble(20, varCoord.y);
1026             writer->writeDouble(30, varCoord.z);
1027         } else {
1028             writer->writeDouble(10, 0.0);
1029             writer->writeDouble(20, 0.0);
1030             writer->writeDouble(30, 0.0);
1031         }
1032         writer->writeString(9, "$UCSORGFRONT");
1033         if (getCoord("$UCSORGFRONT", &varCoord)) {
1034             writer->writeDouble(10, varCoord.x);
1035             writer->writeDouble(20, varCoord.y);
1036             writer->writeDouble(30, varCoord.z);
1037         } else {
1038             writer->writeDouble(10, 0.0);
1039             writer->writeDouble(20, 0.0);
1040             writer->writeDouble(30, 0.0);
1041         }
1042         writer->writeString(9, "$UCSORGBACK");
1043         if (getCoord("$UCSORGBACK", &varCoord)) {
1044             writer->writeDouble(10, varCoord.x);
1045             writer->writeDouble(20, varCoord.y);
1046             writer->writeDouble(30, varCoord.z);
1047         } else {
1048             writer->writeDouble(10, 0.0);
1049             writer->writeDouble(20, 0.0);
1050             writer->writeDouble(30, 0.0);
1051         }
1052         writer->writeString(9, "$PUCSBASE");
1053         if (getStr("$PUCSBASE", &varStr))
1054             if (ver == DRW::AC1009)
1055                 writer->writeUtf8Caps(2, varStr);
1056             else
1057                 writer->writeUtf8String(2, varStr);
1058         else
1059             writer->writeString(2, "");
1060     } //end post r12 UCS vars
1061     writer->writeString(9, "$PUCSNAME");
1062     if (getStr("$PUCSNAME", &varStr))
1063         if (ver == DRW::AC1009)
1064             writer->writeUtf8Caps(2, varStr);
1065         else
1066             writer->writeUtf8String(2, varStr);
1067     else
1068         writer->writeString(2, "");
1069     writer->writeString(9, "$PUCSORG");
1070     if (getCoord("$PUCSORG", &varCoord)) {
1071         writer->writeDouble(10, varCoord.x);
1072         writer->writeDouble(20, varCoord.y);
1073         writer->writeDouble(30, varCoord.z);
1074     } else {
1075         writer->writeDouble(10, 0.0);
1076         writer->writeDouble(20, 0.0);
1077         writer->writeDouble(30, 0.0);
1078     }
1079     writer->writeString(9, "$PUCSXDIR");
1080     if (getCoord("$PUCSXDIR", &varCoord)) {
1081         writer->writeDouble(10, varCoord.x);
1082         writer->writeDouble(20, varCoord.y);
1083         writer->writeDouble(30, varCoord.z);
1084     } else {
1085         writer->writeDouble(10, 1.0);
1086         writer->writeDouble(20, 0.0);
1087         writer->writeDouble(30, 0.0);
1088     }
1089     writer->writeString(9, "$PUCSYDIR");
1090     if (getCoord("$PUCSYDIR", &varCoord)) {
1091         writer->writeDouble(10, varCoord.x);
1092         writer->writeDouble(20, varCoord.y);
1093         writer->writeDouble(30, varCoord.z);
1094     } else {
1095         writer->writeDouble(10, 0.0);
1096         writer->writeDouble(20, 1.0);
1097         writer->writeDouble(30, 0.0);
1098     }
1099     if (ver > DRW::AC1009) { //begin post r12 PUCS vars
1100         writer->writeString(9, "$PUCSORTHOREF");
1101         if (getStr("$PUCSORTHOREF", &varStr))
1102             if (ver == DRW::AC1009)
1103                 writer->writeUtf8Caps(2, varStr);
1104             else
1105                 writer->writeUtf8String(2, varStr);
1106         else
1107             writer->writeString(2, "");
1108         writer->writeString(9, "$PUCSORTHOVIEW");
1109         if (getInt("$PUCSORTHOVIEW", &varInt))
1110             writer->writeInt16(70, varInt);
1111         else
1112             writer->writeInt16(70, 0);
1113         writer->writeString(9, "$PUCSORGTOP");
1114         if (getCoord("$PUCSORGTOP", &varCoord)) {
1115             writer->writeDouble(10, varCoord.x);
1116             writer->writeDouble(20, varCoord.y);
1117             writer->writeDouble(30, varCoord.z);
1118         } else {
1119             writer->writeDouble(10, 0.0);
1120             writer->writeDouble(20, 0.0);
1121             writer->writeDouble(30, 0.0);
1122         }
1123         writer->writeString(9, "$PUCSORGBOTTOM");
1124         if (getCoord("$PUCSORGBOTTOM", &varCoord)) {
1125             writer->writeDouble(10, varCoord.x);
1126             writer->writeDouble(20, varCoord.y);
1127             writer->writeDouble(30, varCoord.z);
1128         } else {
1129             writer->writeDouble(10, 0.0);
1130             writer->writeDouble(20, 0.0);
1131             writer->writeDouble(30, 0.0);
1132         }
1133         writer->writeString(9, "$PUCSORGLEFT");
1134         if (getCoord("$PUCSORGLEFT", &varCoord)) {
1135             writer->writeDouble(10, varCoord.x);
1136             writer->writeDouble(20, varCoord.y);
1137             writer->writeDouble(30, varCoord.z);
1138         } else {
1139             writer->writeDouble(10, 0.0);
1140             writer->writeDouble(20, 0.0);
1141             writer->writeDouble(30, 0.0);
1142         }
1143         writer->writeString(9, "$PUCSORGRIGHT");
1144         if (getCoord("$PUCSORGRIGHT", &varCoord)) {
1145             writer->writeDouble(10, varCoord.x);
1146             writer->writeDouble(20, varCoord.y);
1147             writer->writeDouble(30, varCoord.z);
1148         } else {
1149             writer->writeDouble(10, 0.0);
1150             writer->writeDouble(20, 0.0);
1151             writer->writeDouble(30, 0.0);
1152         }
1153         writer->writeString(9, "$PUCSORGFRONT");
1154         if (getCoord("$PUCSORGFRONT", &varCoord)) {
1155             writer->writeDouble(10, varCoord.x);
1156             writer->writeDouble(20, varCoord.y);
1157             writer->writeDouble(30, varCoord.z);
1158         } else {
1159             writer->writeDouble(10, 0.0);
1160             writer->writeDouble(20, 0.0);
1161             writer->writeDouble(30, 0.0);
1162         }
1163         writer->writeString(9, "$PUCSORGBACK");
1164         if (getCoord("$PUCSORGBACK", &varCoord)) {
1165             writer->writeDouble(10, varCoord.x);
1166             writer->writeDouble(20, varCoord.y);
1167             writer->writeDouble(30, varCoord.z);
1168         } else {
1169             writer->writeDouble(10, 0.0);
1170             writer->writeDouble(20, 0.0);
1171             writer->writeDouble(30, 0.0);
1172         }
1173     } //end post r12 PUCS vars
1174 
1175     writer->writeString(9, "$USERI1");
1176     if (getInt("$USERI1", &varInt))
1177         writer->writeInt16(70, varInt);
1178     else
1179         writer->writeInt16(70, 0);
1180     writer->writeString(9, "$USERI2");
1181     if (getInt("$USERI2", &varInt))
1182         writer->writeInt16(70, varInt);
1183     else
1184         writer->writeInt16(70, 0);
1185     writer->writeString(9, "$USERI3");
1186     if (getInt("$USERI3", &varInt))
1187         writer->writeInt16(70, varInt);
1188     else
1189         writer->writeInt16(70, 0);
1190     writer->writeString(9, "$USERI4");
1191     if (getInt("$USERI4", &varInt))
1192         writer->writeInt16(70, varInt);
1193     else
1194         writer->writeInt16(70, 0);
1195     writer->writeString(9, "$USERI5");
1196     if (getInt("$USERI5", &varInt))
1197         writer->writeInt16(70, varInt);
1198     else
1199         writer->writeInt16(70, 0);
1200     writer->writeString(9, "$USERR1");
1201     if (getDouble("$USERR1", &varDouble))
1202         writer->writeDouble(40, varDouble);
1203     else
1204         writer->writeDouble(40, 0.0);
1205     writer->writeString(9, "$USERR2");
1206     if (getDouble("$USERR2", &varDouble))
1207         writer->writeDouble(40, varDouble);
1208     else
1209         writer->writeDouble(40, 0.0);
1210     writer->writeString(9, "$USERR3");
1211     if (getDouble("$USERR3", &varDouble))
1212         writer->writeDouble(40, varDouble);
1213     else
1214         writer->writeDouble(40, 0.0);
1215     writer->writeString(9, "$USERR4");
1216     if (getDouble("$USERR4", &varDouble))
1217         writer->writeDouble(40, varDouble);
1218     else
1219         writer->writeDouble(40, 0.0);
1220     writer->writeString(9, "$USERR5");
1221     if (getDouble("$USERR5", &varDouble))
1222         writer->writeDouble(40, varDouble);
1223     else
1224         writer->writeDouble(40, 0.0);
1225     writer->writeString(9, "$WORLDVIEW");
1226     if (getInt("$WORLDVIEW", &varInt))
1227         writer->writeInt16(70, varInt);
1228     else
1229         writer->writeInt16(70, 1);
1230     writer->writeString(9, "$SHADEDGE");
1231     if (getInt("$SHADEDGE", &varInt))
1232         writer->writeInt16(70, varInt);
1233     else
1234         writer->writeInt16(70, 3);
1235     writer->writeString(9, "$SHADEDIF");
1236     if (getInt("$SHADEDIF", &varInt))
1237         writer->writeInt16(70, varInt);
1238     else
1239         writer->writeInt16(70, 70);
1240     writer->writeString(9, "$TILEMODE");
1241     if (getInt("$TILEMODE", &varInt))
1242         writer->writeInt16(70, varInt);
1243     else
1244         writer->writeInt16(70, 1);
1245     writer->writeString(9, "$MAXACTVP");
1246     if (getInt("$MAXACTVP", &varInt))
1247         writer->writeInt16(70, varInt);
1248     else
1249         writer->writeInt16(70, 64);
1250     if (ver > DRW::AC1009) { //begin post r12 PUCS vars
1251         writer->writeString(9, "$PINSBASE");
1252         if (getCoord("$PINSBASE", &varCoord)) {
1253             writer->writeDouble(10, varCoord.x);
1254             writer->writeDouble(20, varCoord.y);
1255             writer->writeDouble(30, varCoord.z);
1256         } else {
1257             writer->writeDouble(10, 0.0);
1258             writer->writeDouble(20, 0.0);
1259             writer->writeDouble(30, 0.0);
1260         }
1261     }
1262     writer->writeString(9, "$PLIMCHECK");
1263     if (getInt("$PLIMCHECK", &varInt))
1264         writer->writeInt16(70, varInt);
1265     else
1266         writer->writeInt16(70, 0);
1267     writer->writeString(9, "$PEXTMIN");
1268     if (getCoord("$PEXTMIN", &varCoord)) {
1269         writer->writeDouble(10, varCoord.x);
1270         writer->writeDouble(20, varCoord.y);
1271         writer->writeDouble(30, varCoord.z);
1272     } else {
1273         writer->writeDouble(10, 0.0);
1274         writer->writeDouble(20, 0.0);
1275         writer->writeDouble(30, 0.0);
1276     }
1277     writer->writeString(9, "$PEXTMAX");
1278     if (getCoord("$PEXTMAX", &varCoord)) {
1279         writer->writeDouble(10, varCoord.x);
1280         writer->writeDouble(20, varCoord.y);
1281         writer->writeDouble(30, varCoord.z);
1282     } else {
1283         writer->writeDouble(10, 0.0);
1284         writer->writeDouble(20, 0.0);
1285         writer->writeDouble(30, 0.0);
1286     }
1287 
1288 /* RLZ: moved to active VPORT, but can write in header if present*/
1289     if (getInt("$GRIDMODE", &varInt)) {
1290         writer->writeString(9, "$GRIDMODE");
1291         writer->writeInt16(70, varInt);
1292     }
1293     if (getInt("$SNAPSTYLE", &varInt)) {
1294         writer->writeString(9, "$SNAPSTYLE");
1295         writer->writeInt16(70, varInt);
1296     }
1297     if (getCoord("$GRIDUNIT", &varCoord)) {
1298         writer->writeString(9, "$GRIDUNIT");
1299         writer->writeDouble(10, varCoord.x);
1300         writer->writeDouble(20, varCoord.y);
1301     }
1302     if (getCoord("$VIEWCTR", &varCoord)) {
1303         writer->writeString(9, "$VIEWCTR");
1304         writer->writeDouble(10, varCoord.x);
1305         writer->writeDouble(20, varCoord.y);
1306     }
1307 /* RLZ: moved to active VPORT, but can write in header if present*/
1308 
1309     writer->writeString(9, "$PLIMMIN");
1310     if (getCoord("$PLIMMIN", &varCoord)) {
1311         writer->writeDouble(10, varCoord.x);
1312         writer->writeDouble(20, varCoord.y);
1313     } else {
1314         writer->writeDouble(10, 0.0);
1315         writer->writeDouble(20, 0.0);
1316     }
1317     writer->writeString(9, "$PLIMMAX");
1318     if (getCoord("$PLIMMAX", &varCoord)) {
1319         writer->writeDouble(10, varCoord.x);
1320         writer->writeDouble(20, varCoord.y);
1321     } else {
1322         writer->writeDouble(10, 297.0);
1323         writer->writeDouble(20, 210.0);
1324     }
1325     writer->writeString(9, "$UNITMODE");
1326     if (getInt("$UNITMODE", &varInt))
1327         writer->writeInt16(70, varInt);
1328     else
1329         writer->writeInt16(70, 0);
1330     writer->writeString(9, "$VISRETAIN");
1331     if (getInt("$VISRETAIN", &varInt))
1332         writer->writeInt16(70, varInt);
1333     else
1334         writer->writeInt16(70, 1);
1335     writer->writeString(9, "$PLINEGEN");
1336     if (getInt("$PLINEGEN", &varInt))
1337         writer->writeInt16(70, varInt);
1338     else
1339         writer->writeInt16(70, 0);
1340     writer->writeString(9, "$PSLTSCALE");
1341     if (getInt("$PSLTSCALE", &varInt))
1342         writer->writeInt16(70, varInt);
1343     else
1344         writer->writeInt16(70, 1);
1345     if (ver > DRW::AC1009){//start port r12 vars
1346         writer->writeString(9, "$TREEDEPTH");
1347         if (getInt("$TREEDEPTH", &varInt))
1348             writer->writeInt16(70, varInt);
1349         else
1350             writer->writeInt16(70, 3020);
1351         writer->writeString(9, "$CMLSTYLE");
1352         if (getStr("$CMLSTYLE", &varStr))
1353             if (ver == DRW::AC1009)
1354                 writer->writeUtf8Caps(2, varStr);
1355             else
1356                 writer->writeUtf8String(2, varStr);
1357         else
1358             writer->writeString(2, "Standard");
1359         writer->writeString(9, "$CMLJUST");
1360         if (getInt("$CMLJUST", &varInt))
1361             writer->writeInt16(70, varInt);
1362         else
1363             writer->writeInt16(70, 0);
1364         writer->writeString(9, "$CMLSCALE");
1365         if (getDouble("$CMLSCALE", &varDouble))
1366             writer->writeDouble(40, varDouble);
1367         else
1368             writer->writeDouble(40, 20.0);
1369         writer->writeString(9, "$PROXYGRAPHICS");
1370         if (getInt("$PROXYGRAPHICS", &varInt))
1371             writer->writeInt16(70, varInt);
1372         else
1373             writer->writeInt16(70, 1);
1374         writer->writeString(9, "$MEASUREMENT");
1375         if (getInt("$MEASUREMENT", &varInt))
1376             writer->writeInt16(70, varInt);
1377         else
1378             writer->writeInt16(70, 1);
1379         writer->writeString(9, "$CELWEIGHT");
1380         if (getInt("$CELWEIGHT", &varInt))
1381             writer->writeInt16(370, varInt);
1382         else
1383             writer->writeInt16(370, -1);
1384         writer->writeString(9, "$ENDCAPS");
1385         if (getInt("$ENDCAPS", &varInt))
1386             writer->writeInt16(280, varInt);
1387         else
1388             writer->writeInt16(280, 0);
1389         writer->writeString(9, "$JOINSTYLE");
1390         if (getInt("$JOINSTYLE", &varInt))
1391             writer->writeInt16(280, varInt);
1392         else
1393             writer->writeInt16(280, 0);
1394         writer->writeString(9, "$LWDISPLAY"); //RLZ bool flag, verify in bin version
1395         if (getInt("$LWDISPLAY", &varInt))
1396             writer->writeInt16(290, varInt);
1397         else
1398             writer->writeInt16(290, 0);
1399         if (ver > DRW::AC1014) {
1400             writer->writeString(9, "$INSUNITS");
1401             if (getInt("$INSUNITS", &varInt))
1402                 writer->writeInt16(70, varInt);
1403             else
1404                 writer->writeInt16(70, 0);
1405         }
1406         writer->writeString(9, "$HYPERLINKBASE");
1407         if (getStr("$HYPERLINKBASE", &varStr))
1408             if (ver == DRW::AC1009)
1409                 writer->writeUtf8Caps(1, varStr);
1410             else
1411                 writer->writeUtf8String(1, varStr);
1412         else
1413             writer->writeString(1, "");
1414         writer->writeString(9, "$STYLESHEET");
1415         if (getStr("$STYLESHEET", &varStr))
1416             if (ver == DRW::AC1009)
1417                 writer->writeUtf8Caps(1, varStr);
1418             else
1419                 writer->writeUtf8String(1, varStr);
1420         else
1421             writer->writeString(1, "");
1422         writer->writeString(9, "$XEDIT"); //RLZ bool flag, verify in bin version
1423         if (getInt("$XEDIT", &varInt))
1424             writer->writeInt16(290, varInt);
1425         else
1426             writer->writeInt16(290, 1);
1427         writer->writeString(9, "$CEPSNTYPE");
1428         if (getInt("$CEPSNTYPE", &varInt))
1429             writer->writeInt16(380, varInt);
1430         else
1431             writer->writeInt16(380, 0);
1432         writer->writeString(9, "$PSTYLEMODE"); //RLZ bool flag, verify in bin version
1433         if (getInt("$PSTYLEMODE", &varInt))
1434             writer->writeInt16(290, varInt);
1435         else
1436             writer->writeInt16(290, 1);
1437 //RLZ: here $FINGERPRINTGUID and $VERSIONGUID, do not add?
1438         writer->writeString(9, "$EXTNAMES"); //RLZ bool flag, verify in bin version
1439         if (getInt("$EXTNAMES", &varInt))
1440             writer->writeInt16(290, varInt);
1441         else
1442             writer->writeInt16(290, 1);
1443         writer->writeString(9, "$PSVPSCALE");
1444         if (getDouble("$PSVPSCALE", &varDouble))
1445             writer->writeDouble(40, varDouble);
1446         else
1447             writer->writeDouble(40, 0.0);
1448         writer->writeString(9, "$OLESTARTUP"); //RLZ bool flag, verify in bin version
1449         if (getInt("$OLESTARTUP", &varInt))
1450             writer->writeInt16(290, varInt);
1451         else
1452             writer->writeInt16(290, 0);
1453     }
1454     if (ver > DRW::AC1015) {// and post v2004 vars
1455         writer->writeString(9, "$SORTENTS");
1456         if (getInt("$SORTENTS", &varInt))
1457             writer->writeInt16(280, varInt);
1458         else
1459             writer->writeInt16(280, 127);
1460         writer->writeString(9, "$INDEXCTL");
1461         if (getInt("$INDEXCTL", &varInt))
1462             writer->writeInt16(280, varInt);
1463         else
1464             writer->writeInt16(280, 0);
1465         writer->writeString(9, "$HIDETEXT");
1466         if (getInt("$HIDETEXT", &varInt))
1467             writer->writeInt16(280, varInt);
1468         else
1469             writer->writeInt16(280, 1);
1470         writer->writeString(9, "$XCLIPFRAME"); //RLZ bool flag, verify in bin version
1471         if (ver > DRW::AC1021) {
1472             if (getInt("$XCLIPFRAME", &varInt))
1473                 writer->writeInt16(280, varInt);
1474             else
1475                 writer->writeInt16(280, 0);
1476         } else {
1477             if (getInt("$XCLIPFRAME", &varInt))
1478                 writer->writeInt16(290, varInt);
1479             else
1480                 writer->writeInt16(290, 0);
1481         }
1482         writer->writeString(9, "$HALOGAP");
1483         if (getInt("$HALOGAP", &varInt))
1484             writer->writeInt16(280, varInt);
1485         else
1486             writer->writeInt16(280, 0);
1487         writer->writeString(9, "$OBSCOLOR");
1488         if (getInt("$OBSCOLOR", &varInt))
1489             writer->writeInt16(70, varInt);
1490         else
1491             writer->writeInt16(70, 257);
1492         writer->writeString(9, "$OBSLTYPE");
1493         if (getInt("$OBSLTYPE", &varInt))
1494             writer->writeInt16(280, varInt);
1495         else
1496             writer->writeInt16(280, 0);
1497         writer->writeString(9, "$INTERSECTIONDISPLAY");
1498         if (getInt("$INTERSECTIONDISPLAY", &varInt))
1499             writer->writeInt16(280, varInt);
1500         else
1501             writer->writeInt16(280, 0);
1502         writer->writeString(9, "$INTERSECTIONCOLOR");
1503         if (getInt("$INTERSECTIONCOLOR", &varInt))
1504             writer->writeInt16(70, varInt);
1505         else
1506             writer->writeInt16(70, 257);
1507         writer->writeString(9, "$DIMASSOC");
1508         if (getInt("$DIMASSOC", &varInt))
1509             writer->writeInt16(280, varInt);
1510         else
1511             writer->writeInt16(280, 1);
1512         writer->writeString(9, "$PROJECTNAME");
1513         if (getStr("$PROJECTNAME", &varStr))
1514             writer->writeUtf8String(1, varStr);
1515         else
1516             writer->writeString(1, "");
1517     }
1518     if (ver > DRW::AC1018) {// and post v2007 vars
1519         writer->writeString(9, "$CAMERADISPLAY"); //RLZ bool flag, verify in bin version
1520         if (getInt("$CAMERADISPLAY", &varInt))
1521             writer->writeInt16(290, varInt);
1522         else
1523             writer->writeInt16(290, 0);
1524         writer->writeString(9, "$LENSLENGTH");
1525         if (getDouble("$LENSLENGTH", &varDouble))
1526             writer->writeDouble(40, varDouble);
1527         else
1528             writer->writeDouble(40, 50.0);
1529         writer->writeString(9, "$CAMERAHEIGHT");
1530         if (getDouble("$CAMERAHEIGTH", &varDouble))
1531             writer->writeDouble(40, varDouble);
1532         else
1533             writer->writeDouble(40, 0.0);
1534         writer->writeString(9, "$STEPSPERSEC");
1535         if (getDouble("$STEPSPERSEC", &varDouble))
1536             writer->writeDouble(40, varDouble);
1537         else
1538             writer->writeDouble(40, 2.0);
1539         writer->writeString(9, "$STEPSIZE");
1540         if (getDouble("$STEPSIZE", &varDouble))
1541             writer->writeDouble(40, varDouble);
1542         else
1543             writer->writeDouble(40, 50.0);
1544         writer->writeString(9, "$3DDWFPREC");
1545         if (getDouble("$3DDWFPREC", &varDouble))
1546             writer->writeDouble(40, varDouble);
1547         else
1548             writer->writeDouble(40, 2.0);
1549         writer->writeString(9, "$PSOLWIDTH");
1550         if (getDouble("$PSOLWIDTH", &varDouble))
1551             writer->writeDouble(40, varDouble);
1552         else
1553             writer->writeDouble(40, 5.0);
1554         writer->writeString(9, "$PSOLHEIGHT");
1555         if (getDouble("$PSOLHEIGHT", &varDouble))
1556             writer->writeDouble(40, varDouble);
1557         else
1558             writer->writeDouble(40, 80.0);
1559         writer->writeString(9, "$LOFTANG1");
1560         if (getDouble("$LOFTANG1", &varDouble))
1561             writer->writeDouble(40, varDouble);
1562         else
1563             writer->writeDouble(40, M_PI_2);
1564         writer->writeString(9, "$LOFTANG2");
1565         if (getDouble("$LOFTANG2", &varDouble))
1566             writer->writeDouble(40, varDouble);
1567         else
1568             writer->writeDouble(40, M_PI_2);
1569         writer->writeString(9, "$LOFTMAG1");
1570         if (getDouble("$LOFTMAG1", &varDouble))
1571             writer->writeDouble(40, varDouble);
1572         else
1573             writer->writeDouble(40, 0.0);
1574         writer->writeString(9, "$LOFTMAG2");
1575         if (getDouble("$LOFTMAG2", &varDouble))
1576             writer->writeDouble(40, varDouble);
1577         else
1578             writer->writeDouble(40, 0.0);
1579         writer->writeString(9, "$LOFTPARAM");
1580         if (getInt("$LOFTPARAM", &varInt))
1581             writer->writeInt16(70, varInt);
1582         else
1583             writer->writeInt16(70, 7);
1584         writer->writeString(9, "$LOFTNORMALS");
1585         if (getInt("$LOFTNORMALS", &varInt))
1586             writer->writeInt16(280, varInt);
1587         else
1588             writer->writeInt16(280, 1);
1589         writer->writeString(9, "$LATITUDE");
1590         if (getDouble("$LATITUDE", &varDouble))
1591             writer->writeDouble(40, varDouble);
1592         else
1593             writer->writeDouble(40, 1.0);
1594         writer->writeString(9, "$LONGITUDE");
1595         if (getDouble("$LONGITUDE", &varDouble))
1596             writer->writeDouble(40, varDouble);
1597         else
1598             writer->writeDouble(40, 1.0);
1599         writer->writeString(9, "$NORTHDIRECTION");
1600         if (getDouble("$LONGITUDE", &varDouble))
1601             writer->writeDouble(40, varDouble);
1602         else
1603             writer->writeDouble(40, 0.0);
1604         writer->writeString(9, "$TIMEZONE");
1605         if (getInt("$TIMEZONE", &varInt))
1606             writer->writeInt16(70, varInt);
1607         else
1608             writer->writeInt16(70, -8000);
1609         writer->writeString(9, "$LIGHTGLYPHDISPLAY");
1610         if (getInt("$LIGHTGLYPHDISPLAY", &varInt))
1611             writer->writeInt16(280, varInt);
1612         else
1613             writer->writeInt16(280, 1);
1614         writer->writeString(9, "$TILEMODELIGHTSYNCH");
1615         if (getInt("$TILEMODELIGHTSYNCH", &varInt))
1616             writer->writeInt16(280, varInt);
1617         else
1618             writer->writeInt16(280, 1);
1619     //$CMATERIAL is a handle
1620         writer->writeString(9, "$SOLIDHIST");
1621         if (getInt("$SOLIDHIST", &varInt))
1622             writer->writeInt16(280, varInt);
1623         else
1624             writer->writeInt16(280, 1);
1625         writer->writeString(9, "$SHOWHIST");
1626         if (getInt("$SHOWHIST", &varInt))
1627             writer->writeInt16(280, varInt);
1628         else
1629             writer->writeInt16(280, 1);
1630         writer->writeString(9, "$DWFFRAME");
1631         if (getInt("$DWFFRAME", &varInt))
1632             writer->writeInt16(280, varInt);
1633         else
1634             writer->writeInt16(280, 2);
1635         writer->writeString(9, "$DGNFRAME");
1636         if (getInt("$DGNFRAME", &varInt))
1637             writer->writeInt16(280, varInt);
1638         else
1639             writer->writeInt16(280, 0);
1640         writer->writeString(9, "$REALWORLDSCALE"); //RLZ bool flag, verify in bin version
1641         if (getInt("$REALWORLDSCALE", &varInt))
1642             writer->writeInt16(290, varInt);
1643         else
1644             writer->writeInt16(290, 1);
1645         writer->writeString(9, "$INTERFERECOLOR");
1646         if (getInt("$INTERFERECOLOR", &varInt))
1647             writer->writeInt16(62, varInt);
1648         else
1649             writer->writeInt16(62, 1);
1650         //$INTERFEREOBJVS is a handle
1651         //$INTERFEREVPVS is a handle
1652         writer->writeString(9, "$CSHADOW");
1653         if (getInt("$CSHADOW", &varInt))
1654             writer->writeInt16(280, varInt);
1655         else
1656             writer->writeInt16(280, 0);
1657         writer->writeString(9, "$SHADOWPLANELOCATION");
1658         if (getDouble("$SHADOWPLANELOCATION", &varDouble))
1659             writer->writeDouble(40, varDouble);
1660         else
1661             writer->writeDouble(40, 0.0);
1662     }
1663 
1664 #ifdef DRW_DBG
1665     std::map<std::string,DRW_Variant *>::const_iterator it;
1666     for ( it=vars.begin() ; it != vars.end(); ++it ){
1667         DRW_DBG((*it).first); DRW_DBG("\n");
1668     }
1669 #endif
1670 }
1671 
addDouble(std::string key,double value,int code)1672 void DRW_Header::addDouble(std::string key, double value, int code){
1673     // cppcheck-suppress publicAllocationError
1674     curr = new DRW_Variant();
1675     curr->addDouble( value );
1676     curr->code = code;
1677     vars[key] =curr;
1678 }
1679 
addInt(std::string key,int value,int code)1680 void DRW_Header::addInt(std::string key, int value, int code){
1681     // cppcheck-suppress publicAllocationError
1682     curr = new DRW_Variant();
1683     curr->addInt( value );
1684     curr->code = code;
1685     vars[key] =curr;
1686 }
1687 
addStr(std::string key,std::string value,int code)1688 void DRW_Header::addStr(std::string key, std::string value, int code){
1689     // cppcheck-suppress publicAllocationError
1690     curr = new DRW_Variant();
1691     curr->addString( value );
1692     curr->code = code;
1693     vars[key] =curr;
1694 }
1695 
addCoord(std::string key,DRW_Coord value,int code)1696 void DRW_Header::addCoord(std::string key, DRW_Coord value, int code){
1697     // cppcheck-suppress publicAllocationError
1698     curr = new DRW_Variant();
1699     curr->addCoord( value );
1700     curr->code = code;
1701     vars[key] =curr;
1702 }
1703 
getDouble(std::string key,double * varDouble)1704 bool DRW_Header::getDouble(std::string key, double *varDouble){
1705     bool result = false;
1706     std::map<std::string,DRW_Variant *>::iterator it;
1707     it=vars.find( key);
1708     if (it != vars.end()) {
1709         DRW_Variant *var = (*it).second;
1710         if (var->type == DRW_Variant::DOUBLE) {
1711             *varDouble = var->content.d;
1712             result = true;
1713         }
1714         delete var;
1715         vars.erase (it);
1716     }
1717     return result;
1718 }
1719 
getInt(std::string key,int * varInt)1720 bool DRW_Header::getInt(std::string key, int *varInt){
1721     bool result = false;
1722     std::map<std::string,DRW_Variant *>::iterator it;
1723     it=vars.find( key);
1724     if (it != vars.end()) {
1725         DRW_Variant *var = (*it).second;
1726         if (var->type == DRW_Variant::INTEGER) {
1727             *varInt = var->content.i;
1728             result = true;
1729         }
1730         delete var;
1731         vars.erase (it);
1732     }
1733     return result;
1734 }
1735 
getStr(std::string key,std::string * varStr)1736 bool DRW_Header::getStr(std::string key, std::string *varStr){
1737     bool result = false;
1738     std::map<std::string,DRW_Variant *>::iterator it;
1739     it=vars.find( key);
1740     if (it != vars.end()) {
1741         DRW_Variant *var = (*it).second;
1742         if (var->type == DRW_Variant::STRING) {
1743             *varStr = *var->content.s;
1744             result = true;
1745         }
1746         delete var;
1747         vars.erase (it);
1748     }
1749     return result;
1750 }
1751 
getCoord(std::string key,DRW_Coord * varCoord)1752 bool DRW_Header::getCoord(std::string key, DRW_Coord *varCoord){
1753     bool result = false;
1754     std::map<std::string,DRW_Variant *>::iterator it;
1755     it=vars.find( key);
1756     if (it != vars.end()) {
1757         DRW_Variant *var = (*it).second;
1758         if (var->type == DRW_Variant::COORD) {
1759             *varCoord = *var->content.v;
1760             result = true;
1761         }
1762         delete var;
1763         vars.erase (it);
1764     }
1765     return result;
1766 }
1767