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 #include "intern/dwgbuffer.h"
18 
DRW_Header()19 DRW_Header::DRW_Header() {
20     linetypeCtrl = layerCtrl = styleCtrl = dimstyleCtrl = appidCtrl = 0;
21     blockCtrl = viewCtrl = ucsCtrl = vportCtrl = vpEntHeaderCtrl = 0;
22     version = DRW::AC1021;
23     curr = NULL;
24 }
25 
addComment(std::string c)26 void DRW_Header::addComment(std::string c){
27     if (!comments.empty())
28         comments += '\n';
29     comments += c;
30 }
31 
parseCode(int code,dxfReader * reader)32 void DRW_Header::parseCode(int code, dxfReader *reader){
33     if (NULL == curr && 9 != code) {
34         DRW_DBG("invalid header code: ");
35         DRW_DBG(code);
36         DRW_DBG("\n");
37         return;
38     }
39 
40     switch (code) {
41     case 9:
42         curr = new DRW_Variant();
43         name = reader->getString();
44         if (version < DRW::AC1015 && name == "$DIMUNIT")
45             name="$DIMLUNIT";
46         vars[name]=curr;
47         break;
48     case 1:
49         curr->addString(code, reader->getUtf8String());
50         if (name =="$ACADVER") {
51             reader->setVersion(curr->content.s, true);
52             version = reader->getVersion();
53         }
54         break;
55     case 2:
56         curr->addString(code, reader->getUtf8String());
57         break;
58     case 3:
59         curr->addString(code, reader->getUtf8String());
60         if (name =="$DWGCODEPAGE") {
61             reader->setCodePage(curr->content.s);
62             curr->addString(code, reader->getCodePage());
63         }
64         break;
65     case 6:
66         curr->addString(code, reader->getUtf8String());
67         break;
68     case 7:
69         curr->addString(code, reader->getUtf8String());
70         break;
71     case 8:
72         curr->addString(code, reader->getUtf8String());
73         break;
74     case 10:
75         curr->addCoord(code, DRW_Coord(reader->getDouble(), 0.0, 0.0));
76         break;
77     case 20:
78         curr->setCoordY(reader->getDouble());
79         break;
80     case 30:
81         curr->setCoordZ(reader->getDouble());
82         break;
83     case 40:
84         curr->addDouble(code, reader->getDouble());
85         break;
86     case 50:
87         curr->addDouble(code, reader->getDouble());
88         break;
89     case 62:
90         curr->addInt(code, reader->getInt32());
91         break;
92     case 70:
93         curr->addInt(code, reader->getInt32());
94         break;
95     case 280:
96         curr->addInt(code, reader->getInt32());
97         break;
98     case 290:
99         curr->addInt(code, reader->getInt32());
100         break;
101     case 370:
102         curr->addInt(code, reader->getInt32());
103         break;
104     case 380:
105         curr->addInt(code, reader->getInt32());
106         break;
107     case 390:
108         curr->addString(code, reader->getUtf8String());
109         break;
110     default:
111         break;
112     }
113 }
114 
write(dxfWriter * writer,DRW::Version ver)115 void DRW_Header::write(dxfWriter *writer, DRW::Version ver){
116 /*RLZ: TODO complete all vars to AC1024*/
117     double varDouble;
118     int varInt;
119     std::string varStr;
120     DRW_Coord varCoord;
121     writer->writeString(2, "HEADER");
122     writer->writeString(9, "$ACADVER");
123     switch (ver) {
124     case DRW::AC1006: //unsupported version acad 10
125     case DRW::AC1009: //acad 11 & 12
126         varStr = "AC1009";
127         break;
128     case DRW::AC1012: //unsupported version acad 13
129     case DRW::AC1014: //acad 14
130         varStr = "AC1014";
131         break;
132     case DRW::AC1015: //acad 2000
133         varStr = "AC1015";
134         break;
135     case DRW::AC1018: //acad 2004
136         varStr = "AC1018";
137         break;
138 /*    case DRW::AC1021: //acad 2007
139         varStr = "AC1021";
140         break;*/
141     case DRW::AC1024: //acad 2010
142         varStr = "AC1024";
143         break;
144     case DRW::AC1027: //acad 2013
145         varStr = "AC1027";
146         break;
147     default: //acad 2007 default version
148         varStr = "AC1021";
149         break;
150     }
151     writer->writeString(1, varStr);
152     writer->setVersion(&varStr, true);
153 
154     getStr("$ACADVER", &varStr);
155     getStr("$ACADMAINTVER", &varStr);
156 
157     if (!getStr("$DWGCODEPAGE", &varStr)) {
158         varStr = "ANSI_1252";
159     }
160     writer->writeString(9, "$DWGCODEPAGE");
161     writer->setCodePage(&varStr);
162     writer->writeString(3, writer->getCodePage() );
163     writer->writeString(9, "$INSBASE");
164     if (getCoord("$INSBASE", &varCoord)) {
165         writer->writeDouble(10, varCoord.x);
166         writer->writeDouble(20, varCoord.y);
167         writer->writeDouble(30, varCoord.z);
168     } else {
169         writer->writeDouble(10, 0.0);
170         writer->writeDouble(20, 0.0);
171         writer->writeDouble(30, 0.0);
172     }
173     writer->writeString(9, "$EXTMIN");
174     if (getCoord("$EXTMIN", &varCoord)) {
175         writer->writeDouble(10, varCoord.x);
176         writer->writeDouble(20, varCoord.y);
177         writer->writeDouble(30, varCoord.z);
178     } else {
179         writer->writeDouble(10, 1.0000000000000000E+020);
180         writer->writeDouble(20, 1.0000000000000000E+020);
181         writer->writeDouble(30, 1.0000000000000000E+020);
182     }
183     writer->writeString(9, "$EXTMAX");
184     if (getCoord("$EXTMAX", &varCoord)) {
185         writer->writeDouble(10, varCoord.x);
186         writer->writeDouble(20, varCoord.y);
187         writer->writeDouble(30, varCoord.z);
188     } else {
189         writer->writeDouble(10, -1.0000000000000000E+020);
190         writer->writeDouble(20, -1.0000000000000000E+020);
191         writer->writeDouble(30, -1.0000000000000000E+020);
192     }
193     writer->writeString(9, "$LIMMIN");
194     if (getCoord("$LIMMIN", &varCoord)) {
195         writer->writeDouble(10, varCoord.x);
196         writer->writeDouble(20, varCoord.y);
197     } else {
198         writer->writeDouble(10, 0.0);
199         writer->writeDouble(20, 0.0);
200     }
201     writer->writeString(9, "$LIMMAX");
202     if (getCoord("$LIMMAX", &varCoord)) {
203         writer->writeDouble(10, varCoord.x);
204         writer->writeDouble(20, varCoord.y);
205     } else {
206         writer->writeDouble(10, 420.0);
207         writer->writeDouble(20, 297.0);
208     }
209     writer->writeString(9, "$ORTHOMODE");
210     if (getInt("$ORTHOMODE", &varInt))
211         writer->writeInt16(70, varInt);
212     else
213         writer->writeInt16(70, 0);
214     writer->writeString(9, "$REGENMODE");
215     if (getInt("$REGENMODE", &varInt))
216         writer->writeInt16(70, varInt);
217     else
218         writer->writeInt16(70, 1);
219     writer->writeString(9, "$FILLMODE");
220     if (getInt("$FILLMODE", &varInt))
221         writer->writeInt16(70, varInt);
222     else
223         writer->writeInt16(70, 1);
224     writer->writeString(9, "$QTEXTMODE");
225     if (getInt("$QTEXTMODE", &varInt))
226         writer->writeInt16(70, varInt);
227     else
228         writer->writeInt16(70, 0);
229     writer->writeString(9, "$MIRRTEXT");
230     if (getInt("$MIRRTEXT", &varInt))
231         writer->writeInt16(70, varInt);
232     else
233         writer->writeInt16(70, 0);
234     if (ver == DRW::AC1009){
235         writer->writeString(9, "$DRAGMODE");
236         if (getInt("$DRAGMODE", &varInt))
237             writer->writeInt16(70, varInt);
238         else
239             writer->writeInt16(70, 2);
240     }
241     writer->writeString(9, "$LTSCALE");
242     if (getDouble("$LTSCALE", &varDouble))
243         writer->writeDouble(40, varDouble);
244     else
245         writer->writeDouble(40, 1.0);
246     if (ver == DRW::AC1009){
247         writer->writeString(9, "$OSMODE");
248         if (getInt("$OSMODE", &varInt))
249             writer->writeInt16(70, varInt);
250         else
251             writer->writeInt16(70, 0);
252     }
253     writer->writeString(9, "$ATTMODE");
254     if (getInt("$ATTMODE", &varInt))
255         writer->writeInt16(70, varInt);
256     else
257         writer->writeInt16(70, 0);
258     writer->writeString(9, "$TEXTSIZE");
259     if (getDouble("$TEXTSIZE", &varDouble))
260         writer->writeDouble(40, varDouble);
261     else
262         writer->writeDouble(40, 2.5);
263     writer->writeString(9, "$TRACEWID");
264     if (getDouble("$TRACEWID", &varDouble))
265         writer->writeDouble(40, varDouble);
266     else
267         writer->writeDouble(40, 15.68);
268     writer->writeString(9, "$TEXTSTYLE");
269     if (getStr("$TEXTSTYLE", &varStr))
270         if (ver == DRW::AC1009)
271             writer->writeUtf8Caps(7, varStr);
272         else
273             writer->writeUtf8String(7, varStr);
274     else
275         writer->writeString(7, "STANDARD");
276     writer->writeString(9, "$CLAYER");
277     if (getStr("$CLAYER", &varStr))
278         if (ver == DRW::AC1009)
279             writer->writeUtf8Caps(8, varStr);
280         else
281             writer->writeUtf8String(8, varStr);
282     else
283         writer->writeString(8, "0");
284     writer->writeString(9, "$CELTYPE");
285     if (getStr("$CELTYPE", &varStr))
286         if (ver == DRW::AC1009)
287             writer->writeUtf8Caps(6, varStr);
288         else
289             writer->writeUtf8String(6, varStr);
290     else
291         writer->writeString(6, "BYLAYER");
292     writer->writeString(9, "$CECOLOR");
293     if (getInt("$CECOLOR", &varInt))
294         writer->writeInt16(62, varInt);
295     else
296         writer->writeInt16(62, 256);
297     if (ver > DRW::AC1009){
298         writer->writeString(9, "$CELTSCALE");
299         if (getDouble("$CELTSCALE", &varDouble))
300             writer->writeDouble(40, varDouble);
301         else
302             writer->writeDouble(40, 1.0);
303         writer->writeString(9, "$DISPSILH");
304         if (getInt("$DISPSILH", &varInt))
305             writer->writeInt16(70, varInt);
306         else
307             writer->writeInt16(70, 0);
308     }
309 
310     writer->writeString(9, "$DIMSCALE");
311     if (getDouble("$DIMSCALE", &varDouble))
312         writer->writeDouble(40, varDouble);
313     else
314         writer->writeDouble(40, 2.5);
315     writer->writeString(9, "$DIMASZ");
316     if (getDouble("$DIMASZ", &varDouble))
317         writer->writeDouble(40, varDouble);
318     else
319         writer->writeDouble(40, 2.5);
320     writer->writeString(9, "$DIMEXO");
321     if (getDouble("$DIMEXO", &varDouble))
322         writer->writeDouble(40, varDouble);
323     else
324         writer->writeDouble(40, 0.625);
325     writer->writeString(9, "$DIMDLI");
326     if (getDouble("$DIMDLI", &varDouble))
327         writer->writeDouble(40, varDouble);
328     else
329         writer->writeDouble(40, 3.75);
330     writer->writeString(9, "$DIMRND");
331     if (getDouble("$DIMRND", &varDouble))
332         writer->writeDouble(40, varDouble);
333     else
334         writer->writeDouble(40, 0.0);
335     writer->writeString(9, "$DIMDLE");
336     if (getDouble("$DIMDLE", &varDouble))
337         writer->writeDouble(40, varDouble);
338     else
339         writer->writeDouble(40, 0.0);
340     writer->writeString(9, "$DIMEXE");
341     if (getDouble("$DIMEXE", &varDouble))
342         writer->writeDouble(40, varDouble);
343     else
344         writer->writeDouble(40, 1.25);
345     writer->writeString(9, "$DIMTP");
346     if (getDouble("$DIMTP", &varDouble))
347         writer->writeDouble(40, varDouble);
348     else
349         writer->writeDouble(40, 0.0);
350     writer->writeString(9, "$DIMTM");
351     if (getDouble("$DIMTM", &varDouble))
352         writer->writeDouble(40, varDouble);
353     else
354         writer->writeDouble(40, 0.0);
355     writer->writeString(9, "$DIMTXT");
356     if (getDouble("$DIMTXT", &varDouble))
357         writer->writeDouble(40, varDouble);
358     else
359         writer->writeDouble(40, 2.5);
360     writer->writeString(9, "$DIMCEN");
361     if (getDouble("$DIMCEN", &varDouble))
362         writer->writeDouble(40, varDouble);
363     else
364         writer->writeDouble(40, 2.5);
365     writer->writeString(9, "$DIMTSZ");
366     if (getDouble("$DIMTSZ", &varDouble))
367         writer->writeDouble(40, varDouble);
368     else
369         writer->writeDouble(40, 0.0);
370     writer->writeString(9, "$DIMTOL");
371     if (getInt("$DIMTOL", &varInt))
372         writer->writeInt16(70, varInt);
373     else
374         writer->writeInt16(70, 0);
375     writer->writeString(9, "$DIMLIM");
376     if (getInt("$DIMLIM", &varInt))
377         writer->writeInt16(70, varInt);
378     else
379         writer->writeInt16(70, 0);
380     writer->writeString(9, "$DIMTIH");
381     if (getInt("$DIMTIH", &varInt))
382         writer->writeInt16(70, varInt);
383     else
384         writer->writeInt16(70, 0);
385     writer->writeString(9, "$DIMTOH");
386     if (getInt("$DIMTOH", &varInt))
387         writer->writeInt16(70, varInt);
388     else
389         writer->writeInt16(70, 0);
390     writer->writeString(9, "$DIMSE1");
391     if (getInt("$DIMSE1", &varInt))
392         writer->writeInt16(70, varInt);
393     else
394         writer->writeInt16(70, 0);
395     writer->writeString(9, "$DIMSE2");
396     if (getInt("$DIMSE2", &varInt))
397         writer->writeInt16(70, varInt);
398     else
399         writer->writeInt16(70, 0);
400     writer->writeString(9, "$DIMTAD");
401     if (getInt("$DIMTAD", &varInt))
402         writer->writeInt16(70, varInt);
403     else
404         writer->writeInt16(70, 1);
405     writer->writeString(9, "$DIMZIN");
406     if (getInt("$DIMZIN", &varInt))
407         writer->writeInt16(70, varInt);
408     else
409         writer->writeInt16(70, 8);
410     writer->writeString(9, "$DIMBLK");
411     if (getStr("$DIMBLK", &varStr))
412         if (ver == DRW::AC1009)
413             writer->writeUtf8Caps(1, varStr);
414         else
415             writer->writeUtf8String(1, varStr);
416     else
417         writer->writeString(1, "");
418     writer->writeString(9, "$DIMASO");
419     if (getInt("$DIMASO", &varInt))
420         writer->writeInt16(70, varInt);
421     else
422         writer->writeInt16(70, 1);
423     writer->writeString(9, "$DIMSHO");
424     if (getInt("$DIMSHO", &varInt))
425         writer->writeInt16(70, varInt);
426     else
427         writer->writeInt16(70, 1);
428     writer->writeString(9, "$DIMPOST");
429     if (getStr("$DIMPOST", &varStr))
430         if (ver == DRW::AC1009)
431             writer->writeUtf8Caps(1, varStr);
432         else
433             writer->writeUtf8String(1, varStr);
434     else
435         writer->writeString(1, "");
436     writer->writeString(9, "$DIMAPOST");
437     if (getStr("$DIMAPOST", &varStr))
438         if (ver == DRW::AC1009)
439             writer->writeUtf8Caps(1, varStr);
440         else
441             writer->writeUtf8String(1, varStr);
442     else
443         writer->writeString(1, "");
444     writer->writeString(9, "$DIMALT");
445     if (getInt("$DIMALT", &varInt))
446         writer->writeInt16(70, varInt);
447     else
448         writer->writeInt16(70, 0);
449     writer->writeString(9, "$DIMALTD");
450     if (getInt("$DIMALTD", &varInt))
451         writer->writeInt16(70, varInt);
452     else
453         writer->writeInt16(70, 3);
454     writer->writeString(9, "$DIMALTF");
455     if (getDouble("$DIMALTF", &varDouble))
456         writer->writeDouble(40, varDouble);
457     else
458         writer->writeDouble(40, 0.03937);
459     writer->writeString(9, "$DIMLFAC");
460     if (getDouble("$DIMLFAC", &varDouble))
461         writer->writeDouble(40, varDouble);
462     else
463         writer->writeDouble(40, 1.0);
464     writer->writeString(9, "$DIMTOFL");
465     if (getInt("$DIMTOFL", &varInt))
466         writer->writeInt16(70, varInt);
467     else
468         writer->writeInt16(70, 1);
469     writer->writeString(9, "$DIMTVP");
470     if (getDouble("$DIMTVP", &varDouble))
471         writer->writeDouble(40, varDouble);
472     else
473         writer->writeDouble(40, 0.0);
474     writer->writeString(9, "$DIMTIX");
475     if (getInt("$DIMTIX", &varInt))
476         writer->writeInt16(70, varInt);
477     else
478         writer->writeInt16(70, 0);
479     writer->writeString(9, "$DIMSOXD");
480     if (getInt("$DIMSOXD", &varInt))
481         writer->writeInt16(70, varInt);
482     else
483         writer->writeInt16(70, 0);
484     writer->writeString(9, "$DIMSAH");
485     if (getInt("$DIMSAH", &varInt))
486         writer->writeInt16(70, varInt);
487     else
488         writer->writeInt16(70, 0);
489     writer->writeString(9, "$DIMBLK1");
490     if (getStr("$DIMBLK1", &varStr))
491         if (ver == DRW::AC1009)
492             writer->writeUtf8Caps(1, varStr);
493         else
494             writer->writeUtf8String(1, varStr);
495     else
496         writer->writeString(1, "");
497     writer->writeString(9, "$DIMBLK2");
498     if (getStr("$DIMBLK2", &varStr))
499         if (ver == DRW::AC1009)
500             writer->writeUtf8Caps(1, varStr);
501         else
502             writer->writeUtf8String(1, varStr);
503     else
504         writer->writeString(1, "");
505     writer->writeString(9, "$DIMSTYLE");
506     if (getStr("$DIMSTYLE", &varStr))
507         if (ver == DRW::AC1009)
508             writer->writeUtf8Caps(2, varStr);
509         else
510             writer->writeUtf8String(2, varStr);
511     else
512         writer->writeString(2, "STANDARD");
513     writer->writeString(9, "$DIMCLRD");
514     if (getInt("$DIMCLRD", &varInt))
515         writer->writeInt16(70, varInt);
516     else
517         writer->writeInt16(70, 0);
518     writer->writeString(9, "$DIMCLRE");
519     if (getInt("$DIMCLRE", &varInt))
520         writer->writeInt16(70, varInt);
521     else
522         writer->writeInt16(70, 0);
523     writer->writeString(9, "$DIMCLRT");
524     if (getInt("$DIMCLRT", &varInt))
525         writer->writeInt16(70, varInt);
526     else
527         writer->writeInt16(70, 0);
528     writer->writeString(9, "$DIMTFAC");
529     if (getDouble("$DIMTFAC", &varDouble))
530         writer->writeDouble(40, varDouble);
531     else
532         writer->writeDouble(40, 1.0);
533     writer->writeString(9, "$DIMGAP");
534     if (getDouble("$DIMGAP", &varDouble))
535         writer->writeDouble(40, varDouble);
536     else
537         writer->writeDouble(40, 0.625);
538     //post r12 dim vars
539     if (ver > DRW::AC1009) {
540         writer->writeString(9, "$DIMJUST");
541         if (getInt("$DIMJUST", &varInt))
542             writer->writeInt16(70, varInt);
543         else
544             writer->writeInt16(70, 0);
545         writer->writeString(9, "$DIMSD1");
546         if (getInt("$DIMSD1", &varInt))
547             writer->writeInt16(70, varInt);
548         else
549             writer->writeInt16(70, 0);
550         writer->writeString(9, "$DIMSD2");
551         if (getInt("$DIMSD2", &varInt))
552             writer->writeInt16(70, varInt);
553         else
554             writer->writeInt16(70, 0);
555         writer->writeString(9, "$DIMTOLJ");
556         if (getInt("$DIMTOLJ", &varInt))
557             writer->writeInt16(70, varInt);
558         else
559             writer->writeInt16(70, 0);
560         writer->writeString(9, "$DIMTZIN");
561         if (getInt("$DIMTZIN", &varInt))
562             writer->writeInt16(70, varInt);
563         else
564             writer->writeInt16(70, 8);
565         writer->writeString(9, "$DIMALTZ");
566         if (getInt("$DIMALTZ", &varInt))
567             writer->writeInt16(70, varInt);
568         else
569             writer->writeInt16(70, 0);
570         writer->writeString(9, "$DIMALTTZ");
571         if (getInt("$DIMALTTZ", &varInt))
572             writer->writeInt16(70, varInt);
573         else
574             writer->writeInt16(70, 0);
575         writer->writeString(9, "$DIMUPT");
576         if (getInt("$DIMUPT", &varInt))
577             writer->writeInt16(70, varInt);
578         else
579             writer->writeInt16(70, 0);
580         writer->writeString(9, "$DIMDEC");
581         if (getInt("$DIMDEC", &varInt))
582             writer->writeInt16(70, varInt);
583         else
584             writer->writeInt16(70, 2);
585         writer->writeString(9, "$DIMTDEC");
586         if (getInt("$DIMTDEC", &varInt))
587             writer->writeInt16(70, varInt);
588         else
589             writer->writeInt16(70, 2);
590         writer->writeString(9, "$DIMALTU");
591         if (getInt("$DIMALTU", &varInt))
592             writer->writeInt16(70, varInt);
593         else
594             writer->writeInt16(70, 2);
595         writer->writeString(9, "$DIMALTTD");
596         if (getInt("$DIMALTTD", &varInt))
597             writer->writeInt16(70, varInt);
598         else
599             writer->writeInt16(70, 3);
600         writer->writeString(9, "$DIMTXSTY");
601         if (getStr("$DIMTXSTY", &varStr))
602             if (ver == DRW::AC1009)
603                 writer->writeUtf8Caps(7, varStr);
604             else
605                 writer->writeUtf8String(7, varStr);
606         else
607             writer->writeString(7, "STANDARD");
608         writer->writeString(9, "$DIMAUNIT");
609         if (getInt("$DIMAUNIT", &varInt))
610             writer->writeInt16(70, varInt);
611         else
612             writer->writeInt16(70, 0);
613         writer->writeString(9, "$DIMADEC");
614         if (getInt("$DIMADEC", &varInt))
615             writer->writeInt16(70, varInt);
616         else
617             writer->writeInt16(70, 0);
618         writer->writeString(9, "$DIMALTRND");
619         if (getDouble("$DIMALTRND", &varDouble))
620             writer->writeDouble(40, varDouble);
621         else
622             writer->writeDouble(40, 0.0);
623         writer->writeString(9, "$DIMAZIN");
624         if (getInt("$DIMAZIN", &varInt))
625             writer->writeInt16(70, varInt);
626         else
627             writer->writeInt16(70, 0);
628         writer->writeString(9, "$DIMDSEP");
629         if (getInt("$DIMDSEP", &varInt))
630             writer->writeInt16(70, varInt);
631         else
632             writer->writeInt16(70, 44);
633         writer->writeString(9, "$DIMATFIT");
634         if (getInt("$DIMATFIT", &varInt))
635             writer->writeInt16(70, varInt);
636         else
637             writer->writeInt16(70, 3);
638         writer->writeString(9, "$DIMFRAC");
639         if (getInt("$DIMFRAC", &varInt))
640             writer->writeInt16(70, varInt);
641         else
642             writer->writeInt16(70, 0);
643         writer->writeString(9, "$DIMLDRBLK");
644         if (getStr("$DIMLDRBLK", &varStr))
645             if (ver == DRW::AC1009)
646                 writer->writeUtf8Caps(1, varStr);
647             else
648                 writer->writeUtf8String(1, varStr);
649         else
650             writer->writeString(1, "STANDARD");
651     //verify if exist "$DIMLUNIT" or obsolete "$DIMUNIT" (pre v2000)
652         if ( !getInt("$DIMLUNIT", &varInt) ){
653             if (!getInt("$DIMUNIT", &varInt))
654                 varInt = 2;
655         }
656         //verify valid values from 1 to 6
657         if (varInt<1 || varInt>6)
658             varInt = 2;
659         if (ver > DRW::AC1014) {
660             writer->writeString(9, "$DIMLUNIT");
661             writer->writeInt16(70, varInt);
662         } else {
663             writer->writeString(9, "$DIMUNIT");
664             writer->writeInt16(70, varInt);
665         }
666         writer->writeString(9, "$DIMLWD");
667         if (getInt("$DIMLWD", &varInt))
668             writer->writeInt16(70, varInt);
669         else
670             writer->writeInt16(70, -2);
671         writer->writeString(9, "$DIMLWE");
672         if (getInt("$DIMLWE", &varInt))
673             writer->writeInt16(70, varInt);
674         else
675             writer->writeInt16(70, -2);
676         writer->writeString(9, "$DIMTMOVE");
677         if (getInt("$DIMTMOVE", &varInt))
678             writer->writeInt16(70, varInt);
679         else
680             writer->writeInt16(70, 0);
681 
682         if (ver > DRW::AC1018) {// and post v2004 dim vars
683             writer->writeString(9, "$DIMFXL");
684             if (getDouble("$DIMFXL", &varDouble))
685                 writer->writeDouble(40, varDouble);
686             else
687                 writer->writeDouble(40, 1.0);
688             writer->writeString(9, "$DIMFXLON");
689             if (getInt("$DIMFXLON", &varInt))
690                 writer->writeInt16(70, varInt);
691             else
692                 writer->writeInt16(70, 0);
693             writer->writeString(9, "$DIMJOGANG");
694             if (getDouble("$DIMJOGANG", &varDouble))
695                 writer->writeDouble(40, varDouble);
696             else
697                 writer->writeDouble(40, 0.7854);
698             writer->writeString(9, "$DIMTFILL");
699             if (getInt("$DIMTFILL", &varInt))
700                 writer->writeInt16(70, varInt);
701             else
702                 writer->writeInt16(70, 0);
703             writer->writeString(9, "$DIMTFILLCLR");
704             if (getInt("$DIMTFILLCLR", &varInt))
705                 writer->writeInt16(70, varInt);
706             else
707                 writer->writeInt16(70, 0);
708             writer->writeString(9, "$DIMARCSYM");
709             if (getInt("$DIMARCSYM", &varInt))
710                 writer->writeInt16(70, varInt);
711             else
712                 writer->writeInt16(70, 0);
713             writer->writeString(9, "$DIMLTYPE");
714             if (getStr("$DIMLTYPE", &varStr))
715                 if (ver == DRW::AC1009)
716                     writer->writeUtf8Caps(6, varStr);
717                 else
718                     writer->writeUtf8String(6, varStr);
719             else
720                 writer->writeString(6, "");
721             writer->writeString(9, "$DIMLTEX1");
722             if (getStr("$DIMLTEX1", &varStr))
723                 if (ver == DRW::AC1009)
724                     writer->writeUtf8Caps(6, varStr);
725                 else
726                     writer->writeUtf8String(6, varStr);
727             else
728                 writer->writeString(6, "");
729             writer->writeString(9, "$DIMLTEX2");
730             if (getStr("$DIMLTEX2", &varStr))
731                 if (ver == DRW::AC1009)
732                     writer->writeUtf8Caps(6, varStr);
733                 else
734                     writer->writeUtf8String(6, varStr);
735             else
736                 writer->writeString(6, "");
737             if (ver > DRW::AC1021) {// and post v2007 dim vars
738                 writer->writeString(9, "$DIMTXTDIRECTION");
739                 if (getInt("$DIMTXTDIRECTION", &varInt))
740                     writer->writeInt16(70, varInt);
741                 else
742                     writer->writeInt16(70, 0);
743             }
744         }// end post v2004 dim vars
745     }//end post r12 dim vars
746 
747     writer->writeString(9, "$LUNITS");
748     if (getInt("$LUNITS", &varInt))
749         writer->writeInt16(70, varInt);
750     else
751         writer->writeInt16(70, 2);
752     writer->writeString(9, "$LUPREC");
753     if (getInt("$LUPREC", &varInt))
754         writer->writeInt16(70, varInt);
755     else
756         writer->writeInt16(70, 4);
757     writer->writeString(9, "$SKETCHINC");
758     if (getDouble("$SKETCHINC", &varDouble))
759         writer->writeDouble(40, varDouble);
760     else
761         writer->writeDouble(40, 1.0);
762     writer->writeString(9, "$FILLETRAD");
763     if (getDouble("$FILLETRAD", &varDouble))
764         writer->writeDouble(40, varDouble);
765     else
766         writer->writeDouble(40, 0.0);
767     writer->writeString(9, "$AUNITS");
768     if (getInt("$AUNITS", &varInt))
769         writer->writeInt16(70, varInt);
770     else
771         writer->writeInt16(70, 0);
772     writer->writeString(9, "$AUPREC");
773     if (getInt("$AUPREC", &varInt))
774         writer->writeInt16(70, varInt);
775     else
776         writer->writeInt16(70, 2);
777     writer->writeString(9, "$MENU");
778     if (getStr("$MENU", &varStr))
779         if (ver == DRW::AC1009)
780             writer->writeUtf8Caps(1, varStr);
781         else
782             writer->writeUtf8String(1, varStr);
783     else
784         writer->writeString(1, ".");
785     writer->writeString(9, "$ELEVATION");
786     if (getDouble("$ELEVATION", &varDouble))
787         writer->writeDouble(40, varDouble);
788     else
789         writer->writeDouble(40, 0.0);
790     writer->writeString(9, "$PELEVATION");
791     if (getDouble("$PELEVATION", &varDouble))
792         writer->writeDouble(40, varDouble);
793     else
794         writer->writeDouble(40, 0.0);
795     writer->writeString(9, "$THICKNESS");
796     if (getDouble("$THICKNESS", &varDouble))
797         writer->writeDouble(40, varDouble);
798     else
799         writer->writeDouble(40, 0.0);
800     writer->writeString(9, "$LIMCHECK");
801     if (getInt("$LIMCHECK", &varInt))
802         writer->writeInt16(70, varInt);
803     else
804         writer->writeInt16(70, 0);
805     if (ver < DRW::AC1015) {
806         writer->writeString(9, "$BLIPMODE");
807         if (getInt("$BLIPMODE", &varInt))
808             writer->writeInt16(70, varInt);
809         else
810             writer->writeInt16(70, 0);
811     }
812     writer->writeString(9, "$CHAMFERA");
813     if (getDouble("$CHAMFERA", &varDouble))
814         writer->writeDouble(40, varDouble);
815     else
816         writer->writeDouble(40, 0.0);
817     writer->writeString(9, "$CHAMFERB");
818     if (getDouble("$CHAMFERB", &varDouble))
819         writer->writeDouble(40, varDouble);
820     else
821         writer->writeDouble(40, 0.0);
822     if (ver > DRW::AC1009) {
823         writer->writeString(9, "$CHAMFERC");
824         if (getDouble("$CHAMFERC", &varDouble))
825             writer->writeDouble(40, varDouble);
826         else
827             writer->writeDouble(40, 0.0);
828         writer->writeString(9, "$CHAMFERD");
829         if (getDouble("$CHAMFERD", &varDouble))
830             writer->writeDouble(40, varDouble);
831         else
832             writer->writeDouble(40, 0.0);
833     }
834     writer->writeString(9, "$SKPOLY");
835     if (getInt("$SKPOLY", &varInt)) {
836         writer->writeInt16(70, varInt);
837     } else
838         writer->writeInt16(70, 0);
839     //rlz: todo, times
840     writer->writeString(9, "$USRTIMER");
841     if (getInt("$USRTIMER", &varInt)) {
842         writer->writeInt16(70, varInt);
843     } else
844         writer->writeInt16(70, 1);
845     writer->writeString(9, "$ANGBASE");
846     if (getDouble("$ANGBASE", &varDouble))
847         writer->writeDouble(50, varDouble);
848     else
849         writer->writeDouble(50, 0.0);
850     writer->writeString(9, "$ANGDIR");
851     if (getInt("$ANGDIR", &varInt)) {
852         writer->writeInt16(70, varInt);
853     } else
854         writer->writeInt16(70, 0);
855     writer->writeString(9, "$PDMODE");
856     if (getInt("$PDMODE", &varInt)) {
857         writer->writeInt16(70, varInt);
858     } else
859         writer->writeInt16(70, 34);
860     writer->writeString(9, "$PDSIZE");
861     if (getDouble("$PDSIZE", &varDouble))
862         writer->writeDouble(40, varDouble);
863     else
864         writer->writeDouble(40, 0.0);
865     writer->writeString(9, "$PLINEWID");
866     if (getDouble("$PLINEWID", &varDouble))
867         writer->writeDouble(40, varDouble);
868     else
869         writer->writeDouble(40, 0.0);
870     if (ver < DRW::AC1012) {
871         writer->writeString(9, "$COORDS");
872         if (getInt("$COORDS", &varInt)) {
873             writer->writeInt16(70, varInt);
874         } else
875             writer->writeInt16(70, 2);
876     }
877     writer->writeString(9, "$SPLFRAME");
878     if (getInt("$SPLFRAME", &varInt)) {
879         writer->writeInt16(70, varInt);
880     } else
881         writer->writeInt16(70, 0);
882     writer->writeString(9, "$SPLINETYPE");
883     if (getInt("$SPLINETYPE", &varInt)) {
884         writer->writeInt16(70, varInt);
885     } else
886         writer->writeInt16(70, 2);
887     writer->writeString(9, "$SPLINESEGS");
888     if (getInt("$SPLINESEGS", &varInt)) {
889         writer->writeInt16(70, varInt);
890     } else
891         writer->writeInt16(70, 8);
892     if (ver < DRW::AC1012) {
893         writer->writeString(9, "$ATTDIA");
894         if (getInt("$ATTDIA", &varInt)) {
895             writer->writeInt16(70, varInt);
896         } else
897             writer->writeInt16(70, 1);
898         writer->writeString(9, "$ATTREQ");
899         if (getInt("$ATTREQ", &varInt)) {
900             writer->writeInt16(70, varInt);
901         } else
902             writer->writeInt16(70, 1);
903         writer->writeString(9, "$HANDLING");
904         if (getInt("$HANDLING", &varInt)) {
905             writer->writeInt16(70, varInt);
906         } else
907             writer->writeInt16(70, 1);
908     }
909     writer->writeString(9, "$HANDSEED");
910     //RLZ        dxfHex(5, 0xFFFF);
911     writer->writeString(5, "20000");
912     writer->writeString(9, "$SURFTAB1");
913     if (getInt("$SURFTAB1", &varInt)) {
914         writer->writeInt16(70, varInt);
915     } else
916         writer->writeInt16(70, 6);
917     writer->writeString(9, "$SURFTAB2");
918     if (getInt("$SURFTAB2", &varInt)) {
919         writer->writeInt16(70, varInt);
920     } else
921         writer->writeInt16(70, 6);
922     writer->writeString(9, "$SURFTYPE");
923     if (getInt("$SURFTYPE", &varInt)) {
924         writer->writeInt16(70, varInt);
925     } else
926         writer->writeInt16(70, 6);
927     writer->writeString(9, "$SURFU");
928     if (getInt("$SURFU", &varInt)) {
929         writer->writeInt16(70, varInt);
930     } else
931         writer->writeInt16(70, 6);
932     writer->writeString(9, "$SURFV");
933     if (getInt("$SURFV", &varInt)) {
934         writer->writeInt16(70, varInt);
935     } else
936         writer->writeInt16(70, 6);
937     if (ver > DRW::AC1009) {
938     writer->writeString(9, "$UCSBASE");
939     if (getStr("$UCSBASE", &varStr))
940         if (ver == DRW::AC1009)
941             writer->writeUtf8Caps(2, varStr);
942         else
943             writer->writeUtf8String(2, varStr);
944     else
945         writer->writeString(2, "");
946 }
947     writer->writeString(9, "$UCSNAME");
948     if (getStr("$UCSNAME", &varStr))
949         if (ver == DRW::AC1009)
950             writer->writeUtf8Caps(2, varStr);
951         else
952             writer->writeUtf8String(2, varStr);
953     else
954         writer->writeString(2, "");
955     writer->writeString(9, "$UCSORG");
956     if (getCoord("$UCSORG", &varCoord)) {
957         writer->writeDouble(10, varCoord.x);
958         writer->writeDouble(20, varCoord.y);
959         writer->writeDouble(30, varCoord.z);
960     } else {
961         writer->writeDouble(10, 0.0);
962         writer->writeDouble(20, 0.0);
963         writer->writeDouble(30, 0.0);
964     }
965     writer->writeString(9, "$UCSXDIR");
966     if (getCoord("$UCSXDIR", &varCoord)) {
967         writer->writeDouble(10, varCoord.x);
968         writer->writeDouble(20, varCoord.y);
969         writer->writeDouble(30, varCoord.z);
970     } else {
971         writer->writeDouble(10, 1.0);
972         writer->writeDouble(20, 0.0);
973         writer->writeDouble(30, 0.0);
974     }
975     writer->writeString(9, "$UCSYDIR");
976     if (getCoord("$UCSYDIR", &varCoord)) {
977         writer->writeDouble(10, varCoord.x);
978         writer->writeDouble(20, varCoord.y);
979         writer->writeDouble(30, varCoord.z);
980     } else {
981         writer->writeDouble(10, 0.0);
982         writer->writeDouble(20, 1.0);
983         writer->writeDouble(30, 0.0);
984     }
985     if (ver > DRW::AC1009) { //begin post r12 UCS vars
986         writer->writeString(9, "$UCSORTHOREF");
987         if (getStr("$UCSORTHOREF", &varStr))
988             if (ver == DRW::AC1009)
989                 writer->writeUtf8Caps(2, varStr);
990             else
991                 writer->writeUtf8String(2, varStr);
992         else
993             writer->writeString(2, "");
994         writer->writeString(9, "$UCSORTHOVIEW");
995         if (getInt("$UCSORTHOVIEW", &varInt))
996             writer->writeInt16(70, varInt);
997         else
998             writer->writeInt16(70, 0);
999         writer->writeString(9, "$UCSORGTOP");
1000         if (getCoord("$UCSORGTOP", &varCoord)) {
1001             writer->writeDouble(10, varCoord.x);
1002             writer->writeDouble(20, varCoord.y);
1003             writer->writeDouble(30, varCoord.z);
1004         } else {
1005             writer->writeDouble(10, 0.0);
1006             writer->writeDouble(20, 0.0);
1007             writer->writeDouble(30, 0.0);
1008         }
1009         writer->writeString(9, "$UCSORGBOTTOM");
1010         if (getCoord("$UCSORGBOTTOM", &varCoord)) {
1011             writer->writeDouble(10, varCoord.x);
1012             writer->writeDouble(20, varCoord.y);
1013             writer->writeDouble(30, varCoord.z);
1014         } else {
1015             writer->writeDouble(10, 0.0);
1016             writer->writeDouble(20, 0.0);
1017             writer->writeDouble(30, 0.0);
1018         }
1019         writer->writeString(9, "$UCSORGLEFT");
1020         if (getCoord("$UCSORGLEFT", &varCoord)) {
1021             writer->writeDouble(10, varCoord.x);
1022             writer->writeDouble(20, varCoord.y);
1023             writer->writeDouble(30, varCoord.z);
1024         } else {
1025             writer->writeDouble(10, 0.0);
1026             writer->writeDouble(20, 0.0);
1027             writer->writeDouble(30, 0.0);
1028         }
1029         writer->writeString(9, "$UCSORGRIGHT");
1030         if (getCoord("$UCSORGRIGHT", &varCoord)) {
1031             writer->writeDouble(10, varCoord.x);
1032             writer->writeDouble(20, varCoord.y);
1033             writer->writeDouble(30, varCoord.z);
1034         } else {
1035             writer->writeDouble(10, 0.0);
1036             writer->writeDouble(20, 0.0);
1037             writer->writeDouble(30, 0.0);
1038         }
1039         writer->writeString(9, "$UCSORGFRONT");
1040         if (getCoord("$UCSORGFRONT", &varCoord)) {
1041             writer->writeDouble(10, varCoord.x);
1042             writer->writeDouble(20, varCoord.y);
1043             writer->writeDouble(30, varCoord.z);
1044         } else {
1045             writer->writeDouble(10, 0.0);
1046             writer->writeDouble(20, 0.0);
1047             writer->writeDouble(30, 0.0);
1048         }
1049         writer->writeString(9, "$UCSORGBACK");
1050         if (getCoord("$UCSORGBACK", &varCoord)) {
1051             writer->writeDouble(10, varCoord.x);
1052             writer->writeDouble(20, varCoord.y);
1053             writer->writeDouble(30, varCoord.z);
1054         } else {
1055             writer->writeDouble(10, 0.0);
1056             writer->writeDouble(20, 0.0);
1057             writer->writeDouble(30, 0.0);
1058         }
1059         writer->writeString(9, "$PUCSBASE");
1060         if (getStr("$PUCSBASE", &varStr))
1061             if (ver == DRW::AC1009)
1062                 writer->writeUtf8Caps(2, varStr);
1063             else
1064                 writer->writeUtf8String(2, varStr);
1065         else
1066             writer->writeString(2, "");
1067     } //end post r12 UCS vars
1068     writer->writeString(9, "$PUCSNAME");
1069     if (getStr("$PUCSNAME", &varStr))
1070         if (ver == DRW::AC1009)
1071             writer->writeUtf8Caps(2, varStr);
1072         else
1073             writer->writeUtf8String(2, varStr);
1074     else
1075         writer->writeString(2, "");
1076     writer->writeString(9, "$PUCSORG");
1077     if (getCoord("$PUCSORG", &varCoord)) {
1078         writer->writeDouble(10, varCoord.x);
1079         writer->writeDouble(20, varCoord.y);
1080         writer->writeDouble(30, varCoord.z);
1081     } else {
1082         writer->writeDouble(10, 0.0);
1083         writer->writeDouble(20, 0.0);
1084         writer->writeDouble(30, 0.0);
1085     }
1086     writer->writeString(9, "$PUCSXDIR");
1087     if (getCoord("$PUCSXDIR", &varCoord)) {
1088         writer->writeDouble(10, varCoord.x);
1089         writer->writeDouble(20, varCoord.y);
1090         writer->writeDouble(30, varCoord.z);
1091     } else {
1092         writer->writeDouble(10, 1.0);
1093         writer->writeDouble(20, 0.0);
1094         writer->writeDouble(30, 0.0);
1095     }
1096     writer->writeString(9, "$PUCSYDIR");
1097     if (getCoord("$PUCSYDIR", &varCoord)) {
1098         writer->writeDouble(10, varCoord.x);
1099         writer->writeDouble(20, varCoord.y);
1100         writer->writeDouble(30, varCoord.z);
1101     } else {
1102         writer->writeDouble(10, 0.0);
1103         writer->writeDouble(20, 1.0);
1104         writer->writeDouble(30, 0.0);
1105     }
1106     if (ver > DRW::AC1009) { //begin post r12 PUCS vars
1107         writer->writeString(9, "$PUCSORTHOREF");
1108         if (getStr("$PUCSORTHOREF", &varStr))
1109             if (ver == DRW::AC1009)
1110                 writer->writeUtf8Caps(2, varStr);
1111             else
1112                 writer->writeUtf8String(2, varStr);
1113         else
1114             writer->writeString(2, "");
1115         writer->writeString(9, "$PUCSORTHOVIEW");
1116         if (getInt("$PUCSORTHOVIEW", &varInt))
1117             writer->writeInt16(70, varInt);
1118         else
1119             writer->writeInt16(70, 0);
1120         writer->writeString(9, "$PUCSORGTOP");
1121         if (getCoord("$PUCSORGTOP", &varCoord)) {
1122             writer->writeDouble(10, varCoord.x);
1123             writer->writeDouble(20, varCoord.y);
1124             writer->writeDouble(30, varCoord.z);
1125         } else {
1126             writer->writeDouble(10, 0.0);
1127             writer->writeDouble(20, 0.0);
1128             writer->writeDouble(30, 0.0);
1129         }
1130         writer->writeString(9, "$PUCSORGBOTTOM");
1131         if (getCoord("$PUCSORGBOTTOM", &varCoord)) {
1132             writer->writeDouble(10, varCoord.x);
1133             writer->writeDouble(20, varCoord.y);
1134             writer->writeDouble(30, varCoord.z);
1135         } else {
1136             writer->writeDouble(10, 0.0);
1137             writer->writeDouble(20, 0.0);
1138             writer->writeDouble(30, 0.0);
1139         }
1140         writer->writeString(9, "$PUCSORGLEFT");
1141         if (getCoord("$PUCSORGLEFT", &varCoord)) {
1142             writer->writeDouble(10, varCoord.x);
1143             writer->writeDouble(20, varCoord.y);
1144             writer->writeDouble(30, varCoord.z);
1145         } else {
1146             writer->writeDouble(10, 0.0);
1147             writer->writeDouble(20, 0.0);
1148             writer->writeDouble(30, 0.0);
1149         }
1150         writer->writeString(9, "$PUCSORGRIGHT");
1151         if (getCoord("$PUCSORGRIGHT", &varCoord)) {
1152             writer->writeDouble(10, varCoord.x);
1153             writer->writeDouble(20, varCoord.y);
1154             writer->writeDouble(30, varCoord.z);
1155         } else {
1156             writer->writeDouble(10, 0.0);
1157             writer->writeDouble(20, 0.0);
1158             writer->writeDouble(30, 0.0);
1159         }
1160         writer->writeString(9, "$PUCSORGFRONT");
1161         if (getCoord("$PUCSORGFRONT", &varCoord)) {
1162             writer->writeDouble(10, varCoord.x);
1163             writer->writeDouble(20, varCoord.y);
1164             writer->writeDouble(30, varCoord.z);
1165         } else {
1166             writer->writeDouble(10, 0.0);
1167             writer->writeDouble(20, 0.0);
1168             writer->writeDouble(30, 0.0);
1169         }
1170         writer->writeString(9, "$PUCSORGBACK");
1171         if (getCoord("$PUCSORGBACK", &varCoord)) {
1172             writer->writeDouble(10, varCoord.x);
1173             writer->writeDouble(20, varCoord.y);
1174             writer->writeDouble(30, varCoord.z);
1175         } else {
1176             writer->writeDouble(10, 0.0);
1177             writer->writeDouble(20, 0.0);
1178             writer->writeDouble(30, 0.0);
1179         }
1180     } //end post r12 PUCS vars
1181 
1182     writer->writeString(9, "$USERI1");
1183     if (getInt("$USERI1", &varInt))
1184         writer->writeInt16(70, varInt);
1185     else
1186         writer->writeInt16(70, 0);
1187     writer->writeString(9, "$USERI2");
1188     if (getInt("$USERI2", &varInt))
1189         writer->writeInt16(70, varInt);
1190     else
1191         writer->writeInt16(70, 0);
1192     writer->writeString(9, "$USERI3");
1193     if (getInt("$USERI3", &varInt))
1194         writer->writeInt16(70, varInt);
1195     else
1196         writer->writeInt16(70, 0);
1197     writer->writeString(9, "$USERI4");
1198     if (getInt("$USERI4", &varInt))
1199         writer->writeInt16(70, varInt);
1200     else
1201         writer->writeInt16(70, 0);
1202     writer->writeString(9, "$USERI5");
1203     if (getInt("$USERI5", &varInt))
1204         writer->writeInt16(70, varInt);
1205     else
1206         writer->writeInt16(70, 0);
1207     writer->writeString(9, "$USERR1");
1208     if (getDouble("$USERR1", &varDouble))
1209         writer->writeDouble(40, varDouble);
1210     else
1211         writer->writeDouble(40, 0.0);
1212     writer->writeString(9, "$USERR2");
1213     if (getDouble("$USERR2", &varDouble))
1214         writer->writeDouble(40, varDouble);
1215     else
1216         writer->writeDouble(40, 0.0);
1217     writer->writeString(9, "$USERR3");
1218     if (getDouble("$USERR3", &varDouble))
1219         writer->writeDouble(40, varDouble);
1220     else
1221         writer->writeDouble(40, 0.0);
1222     writer->writeString(9, "$USERR4");
1223     if (getDouble("$USERR4", &varDouble))
1224         writer->writeDouble(40, varDouble);
1225     else
1226         writer->writeDouble(40, 0.0);
1227     writer->writeString(9, "$USERR5");
1228     if (getDouble("$USERR5", &varDouble))
1229         writer->writeDouble(40, varDouble);
1230     else
1231         writer->writeDouble(40, 0.0);
1232     writer->writeString(9, "$WORLDVIEW");
1233     if (getInt("$WORLDVIEW", &varInt))
1234         writer->writeInt16(70, varInt);
1235     else
1236         writer->writeInt16(70, 1);
1237     writer->writeString(9, "$SHADEDGE");
1238     if (getInt("$SHADEDGE", &varInt))
1239         writer->writeInt16(70, varInt);
1240     else
1241         writer->writeInt16(70, 3);
1242     writer->writeString(9, "$SHADEDIF");
1243     if (getInt("$SHADEDIF", &varInt))
1244         writer->writeInt16(70, varInt);
1245     else
1246         writer->writeInt16(70, 70);
1247     writer->writeString(9, "$TILEMODE");
1248     if (getInt("$TILEMODE", &varInt))
1249         writer->writeInt16(70, varInt);
1250     else
1251         writer->writeInt16(70, 1);
1252     writer->writeString(9, "$MAXACTVP");
1253     if (getInt("$MAXACTVP", &varInt))
1254         writer->writeInt16(70, varInt);
1255     else
1256         writer->writeInt16(70, 64);
1257     if (ver > DRW::AC1009) { //begin post r12 PUCS vars
1258         writer->writeString(9, "$PINSBASE");
1259         if (getCoord("$PINSBASE", &varCoord)) {
1260             writer->writeDouble(10, varCoord.x);
1261             writer->writeDouble(20, varCoord.y);
1262             writer->writeDouble(30, varCoord.z);
1263         } else {
1264             writer->writeDouble(10, 0.0);
1265             writer->writeDouble(20, 0.0);
1266             writer->writeDouble(30, 0.0);
1267         }
1268     }
1269     writer->writeString(9, "$PLIMCHECK");
1270     if (getInt("$PLIMCHECK", &varInt))
1271         writer->writeInt16(70, varInt);
1272     else
1273         writer->writeInt16(70, 0);
1274     writer->writeString(9, "$PEXTMIN");
1275     if (getCoord("$PEXTMIN", &varCoord)) {
1276         writer->writeDouble(10, varCoord.x);
1277         writer->writeDouble(20, varCoord.y);
1278         writer->writeDouble(30, varCoord.z);
1279     } else {
1280         writer->writeDouble(10, 0.0);
1281         writer->writeDouble(20, 0.0);
1282         writer->writeDouble(30, 0.0);
1283     }
1284     writer->writeString(9, "$PEXTMAX");
1285     if (getCoord("$PEXTMAX", &varCoord)) {
1286         writer->writeDouble(10, varCoord.x);
1287         writer->writeDouble(20, varCoord.y);
1288         writer->writeDouble(30, varCoord.z);
1289     } else {
1290         writer->writeDouble(10, 0.0);
1291         writer->writeDouble(20, 0.0);
1292         writer->writeDouble(30, 0.0);
1293     }
1294 
1295 /* RLZ: moved to active VPORT, but can write in header if present*/
1296     if (getInt("$GRIDMODE", &varInt)) {
1297         writer->writeString(9, "$GRIDMODE");
1298         writer->writeInt16(70, varInt);
1299     }
1300     if (getInt("$SNAPSTYLE", &varInt)) {
1301         writer->writeString(9, "$SNAPSTYLE");
1302         writer->writeInt16(70, varInt);
1303     }
1304     if (getCoord("$GRIDUNIT", &varCoord)) {
1305         writer->writeString(9, "$GRIDUNIT");
1306         writer->writeDouble(10, varCoord.x);
1307         writer->writeDouble(20, varCoord.y);
1308     }
1309     if (getCoord("$VIEWCTR", &varCoord)) {
1310         writer->writeString(9, "$VIEWCTR");
1311         writer->writeDouble(10, varCoord.x);
1312         writer->writeDouble(20, varCoord.y);
1313     }
1314 /* RLZ: moved to active VPORT, but can write in header if present*/
1315 
1316     writer->writeString(9, "$PLIMMIN");
1317     if (getCoord("$PLIMMIN", &varCoord)) {
1318         writer->writeDouble(10, varCoord.x);
1319         writer->writeDouble(20, varCoord.y);
1320     } else {
1321         writer->writeDouble(10, 0.0);
1322         writer->writeDouble(20, 0.0);
1323     }
1324     writer->writeString(9, "$PLIMMAX");
1325     if (getCoord("$PLIMMAX", &varCoord)) {
1326         writer->writeDouble(10, varCoord.x);
1327         writer->writeDouble(20, varCoord.y);
1328     } else {
1329         writer->writeDouble(10, 297.0);
1330         writer->writeDouble(20, 210.0);
1331     }
1332     writer->writeString(9, "$UNITMODE");
1333     if (getInt("$UNITMODE", &varInt))
1334         writer->writeInt16(70, varInt);
1335     else
1336         writer->writeInt16(70, 0);
1337     writer->writeString(9, "$VISRETAIN");
1338     if (getInt("$VISRETAIN", &varInt))
1339         writer->writeInt16(70, varInt);
1340     else
1341         writer->writeInt16(70, 1);
1342     writer->writeString(9, "$PLINEGEN");
1343     if (getInt("$PLINEGEN", &varInt))
1344         writer->writeInt16(70, varInt);
1345     else
1346         writer->writeInt16(70, 0);
1347     writer->writeString(9, "$PSLTSCALE");
1348     if (getInt("$PSLTSCALE", &varInt))
1349         writer->writeInt16(70, varInt);
1350     else
1351         writer->writeInt16(70, 1);
1352     if (ver > DRW::AC1009){//start port r12 vars
1353         writer->writeString(9, "$TREEDEPTH");
1354         if (getInt("$TREEDEPTH", &varInt))
1355             writer->writeInt16(70, varInt);
1356         else
1357             writer->writeInt16(70, 3020);
1358         writer->writeString(9, "$CMLSTYLE");
1359         if (getStr("$CMLSTYLE", &varStr))
1360             if (ver == DRW::AC1009)
1361                 writer->writeUtf8Caps(2, varStr);
1362             else
1363                 writer->writeUtf8String(2, varStr);
1364         else
1365             writer->writeString(2, "Standard");
1366         writer->writeString(9, "$CMLJUST");
1367         if (getInt("$CMLJUST", &varInt))
1368             writer->writeInt16(70, varInt);
1369         else
1370             writer->writeInt16(70, 0);
1371         writer->writeString(9, "$CMLSCALE");
1372         if (getDouble("$CMLSCALE", &varDouble))
1373             writer->writeDouble(40, varDouble);
1374         else
1375             writer->writeDouble(40, 20.0);
1376         writer->writeString(9, "$PROXYGRAPHICS");
1377         if (getInt("$PROXYGRAPHICS", &varInt))
1378             writer->writeInt16(70, varInt);
1379         else
1380             writer->writeInt16(70, 1);
1381         writer->writeString(9, "$MEASUREMENT");
1382         if (getInt("$MEASUREMENT", &varInt))
1383             writer->writeInt16(70, varInt);
1384         else
1385             writer->writeInt16(70, 1);
1386         writer->writeString(9, "$CELWEIGHT");
1387         if (getInt("$CELWEIGHT", &varInt))
1388             writer->writeInt16(370, varInt);
1389         else
1390             writer->writeInt16(370, -1);
1391         writer->writeString(9, "$ENDCAPS");
1392         if (getInt("$ENDCAPS", &varInt))
1393             writer->writeInt16(280, varInt);
1394         else
1395             writer->writeInt16(280, 0);
1396         writer->writeString(9, "$JOINSTYLE");
1397         if (getInt("$JOINSTYLE", &varInt))
1398             writer->writeInt16(280, varInt);
1399         else
1400             writer->writeInt16(280, 0);
1401         writer->writeString(9, "$LWDISPLAY"); //RLZ bool flag, verify in bin version
1402         if (getInt("$LWDISPLAY", &varInt))
1403             writer->writeInt16(290, varInt);
1404         else
1405             writer->writeInt16(290, 0);
1406         if (ver > DRW::AC1014) {
1407             writer->writeString(9, "$INSUNITS");
1408             if (getInt("$INSUNITS", &varInt))
1409                 writer->writeInt16(70, varInt);
1410             else
1411                 writer->writeInt16(70, 0);
1412         }
1413         writer->writeString(9, "$HYPERLINKBASE");
1414         if (getStr("$HYPERLINKBASE", &varStr))
1415             if (ver == DRW::AC1009)
1416                 writer->writeUtf8Caps(1, varStr);
1417             else
1418                 writer->writeUtf8String(1, varStr);
1419         else
1420             writer->writeString(1, "");
1421         writer->writeString(9, "$STYLESHEET");
1422         if (getStr("$STYLESHEET", &varStr))
1423             if (ver == DRW::AC1009)
1424                 writer->writeUtf8Caps(1, varStr);
1425             else
1426                 writer->writeUtf8String(1, varStr);
1427         else
1428             writer->writeString(1, "");
1429         writer->writeString(9, "$XEDIT"); //RLZ bool flag, verify in bin version
1430         if (getInt("$XEDIT", &varInt))
1431             writer->writeInt16(290, varInt);
1432         else
1433             writer->writeInt16(290, 1);
1434         writer->writeString(9, "$CEPSNTYPE");
1435         if (getInt("$CEPSNTYPE", &varInt))
1436             writer->writeInt16(380, varInt);
1437         else
1438             writer->writeInt16(380, 0);
1439         writer->writeString(9, "$PSTYLEMODE"); //RLZ bool flag, verify in bin version
1440         if (getInt("$PSTYLEMODE", &varInt))
1441             writer->writeInt16(290, varInt);
1442         else
1443             writer->writeInt16(290, 1);
1444 //RLZ: here $FINGERPRINTGUID and $VERSIONGUID, do not add?
1445         writer->writeString(9, "$EXTNAMES"); //RLZ bool flag, verify in bin version
1446         if (getInt("$EXTNAMES", &varInt))
1447             writer->writeInt16(290, varInt);
1448         else
1449             writer->writeInt16(290, 1);
1450         writer->writeString(9, "$PSVPSCALE");
1451         if (getDouble("$PSVPSCALE", &varDouble))
1452             writer->writeDouble(40, varDouble);
1453         else
1454             writer->writeDouble(40, 0.0);
1455         writer->writeString(9, "$OLESTARTUP"); //RLZ bool flag, verify in bin version
1456         if (getInt("$OLESTARTUP", &varInt))
1457             writer->writeInt16(290, varInt);
1458         else
1459             writer->writeInt16(290, 0);
1460     }
1461     if (ver > DRW::AC1015) {// and post v2004 vars
1462         writer->writeString(9, "$SORTENTS");
1463         if (getInt("$SORTENTS", &varInt))
1464             writer->writeInt16(280, varInt);
1465         else
1466             writer->writeInt16(280, 127);
1467         writer->writeString(9, "$INDEXCTL");
1468         if (getInt("$INDEXCTL", &varInt))
1469             writer->writeInt16(280, varInt);
1470         else
1471             writer->writeInt16(280, 0);
1472         writer->writeString(9, "$HIDETEXT");
1473         if (getInt("$HIDETEXT", &varInt))
1474             writer->writeInt16(280, varInt);
1475         else
1476             writer->writeInt16(280, 1);
1477         writer->writeString(9, "$XCLIPFRAME"); //RLZ bool flag, verify in bin version
1478         if (ver > DRW::AC1021) {
1479             if (getInt("$XCLIPFRAME", &varInt))
1480                 writer->writeInt16(280, varInt);
1481             else
1482                 writer->writeInt16(280, 0);
1483         } else {
1484             if (getInt("$XCLIPFRAME", &varInt))
1485                 writer->writeInt16(290, varInt);
1486             else
1487                 writer->writeInt16(290, 0);
1488         }
1489         writer->writeString(9, "$HALOGAP");
1490         if (getInt("$HALOGAP", &varInt))
1491             writer->writeInt16(280, varInt);
1492         else
1493             writer->writeInt16(280, 0);
1494         writer->writeString(9, "$OBSCOLOR");
1495         if (getInt("$OBSCOLOR", &varInt))
1496             writer->writeInt16(70, varInt);
1497         else
1498             writer->writeInt16(70, 257);
1499         writer->writeString(9, "$OBSLTYPE");
1500         if (getInt("$OBSLTYPE", &varInt))
1501             writer->writeInt16(280, varInt);
1502         else
1503             writer->writeInt16(280, 0);
1504         writer->writeString(9, "$INTERSECTIONDISPLAY");
1505         if (getInt("$INTERSECTIONDISPLAY", &varInt))
1506             writer->writeInt16(280, varInt);
1507         else
1508             writer->writeInt16(280, 0);
1509         writer->writeString(9, "$INTERSECTIONCOLOR");
1510         if (getInt("$INTERSECTIONCOLOR", &varInt))
1511             writer->writeInt16(70, varInt);
1512         else
1513             writer->writeInt16(70, 257);
1514         writer->writeString(9, "$DIMASSOC");
1515         if (getInt("$DIMASSOC", &varInt))
1516             writer->writeInt16(280, varInt);
1517         else
1518             writer->writeInt16(280, 1);
1519         writer->writeString(9, "$PROJECTNAME");
1520         if (getStr("$PROJECTNAME", &varStr))
1521             writer->writeUtf8String(1, varStr);
1522         else
1523             writer->writeString(1, "");
1524     }
1525     if (ver > DRW::AC1018) {// and post v2007 vars
1526         writer->writeString(9, "$CAMERADISPLAY"); //RLZ bool flag, verify in bin version
1527         if (getInt("$CAMERADISPLAY", &varInt))
1528             writer->writeInt16(290, varInt);
1529         else
1530             writer->writeInt16(290, 0);
1531         writer->writeString(9, "$LENSLENGTH");
1532         if (getDouble("$LENSLENGTH", &varDouble))
1533             writer->writeDouble(40, varDouble);
1534         else
1535             writer->writeDouble(40, 50.0);
1536         writer->writeString(9, "$CAMERAHEIGHT");
1537         if (getDouble("$CAMERAHEIGHT", &varDouble))
1538             writer->writeDouble(40, varDouble);
1539         else
1540             writer->writeDouble(40, 0.0);
1541         writer->writeString(9, "$STEPSPERSEC");
1542         if (getDouble("$STEPSPERSEC", &varDouble))
1543             writer->writeDouble(40, varDouble);
1544         else
1545             writer->writeDouble(40, 2.0);
1546         writer->writeString(9, "$STEPSIZE");
1547         if (getDouble("$STEPSIZE", &varDouble))
1548             writer->writeDouble(40, varDouble);
1549         else
1550             writer->writeDouble(40, 50.0);
1551         writer->writeString(9, "$3DDWFPREC");
1552         if (getDouble("$3DDWFPREC", &varDouble))
1553             writer->writeDouble(40, varDouble);
1554         else
1555             writer->writeDouble(40, 2.0);
1556         writer->writeString(9, "$PSOLWIDTH");
1557         if (getDouble("$PSOLWIDTH", &varDouble))
1558             writer->writeDouble(40, varDouble);
1559         else
1560             writer->writeDouble(40, 5.0);
1561         writer->writeString(9, "$PSOLHEIGHT");
1562         if (getDouble("$PSOLHEIGHT", &varDouble))
1563             writer->writeDouble(40, varDouble);
1564         else
1565             writer->writeDouble(40, 80.0);
1566         writer->writeString(9, "$LOFTANG1");
1567         if (getDouble("$LOFTANG1", &varDouble))
1568             writer->writeDouble(40, varDouble);
1569         else
1570             writer->writeDouble(40, M_PI_2);
1571         writer->writeString(9, "$LOFTANG2");
1572         if (getDouble("$LOFTANG2", &varDouble))
1573             writer->writeDouble(40, varDouble);
1574         else
1575             writer->writeDouble(40, M_PI_2);
1576         writer->writeString(9, "$LOFTMAG1");
1577         if (getDouble("$LOFTMAG1", &varDouble))
1578             writer->writeDouble(40, varDouble);
1579         else
1580             writer->writeDouble(40, 0.0);
1581         writer->writeString(9, "$LOFTMAG2");
1582         if (getDouble("$LOFTMAG2", &varDouble))
1583             writer->writeDouble(40, varDouble);
1584         else
1585             writer->writeDouble(40, 0.0);
1586         writer->writeString(9, "$LOFTPARAM");
1587         if (getInt("$LOFTPARAM", &varInt))
1588             writer->writeInt16(70, varInt);
1589         else
1590             writer->writeInt16(70, 7);
1591         writer->writeString(9, "$LOFTNORMALS");
1592         if (getInt("$LOFTNORMALS", &varInt))
1593             writer->writeInt16(280, varInt);
1594         else
1595             writer->writeInt16(280, 1);
1596         writer->writeString(9, "$LATITUDE");
1597         if (getDouble("$LATITUDE", &varDouble))
1598             writer->writeDouble(40, varDouble);
1599         else
1600             writer->writeDouble(40, 1.0);
1601         writer->writeString(9, "$LONGITUDE");
1602         if (getDouble("$LONGITUDE", &varDouble))
1603             writer->writeDouble(40, varDouble);
1604         else
1605             writer->writeDouble(40, 1.0);
1606         writer->writeString(9, "$NORTHDIRECTION");
1607         if (getDouble("$LONGITUDE", &varDouble))
1608             writer->writeDouble(40, varDouble);
1609         else
1610             writer->writeDouble(40, 0.0);
1611         writer->writeString(9, "$TIMEZONE");
1612         if (getInt("$TIMEZONE", &varInt))
1613             writer->writeInt16(70, varInt);
1614         else
1615             writer->writeInt16(70, -8000);
1616         writer->writeString(9, "$LIGHTGLYPHDISPLAY");
1617         if (getInt("$LIGHTGLYPHDISPLAY", &varInt))
1618             writer->writeInt16(280, varInt);
1619         else
1620             writer->writeInt16(280, 1);
1621         writer->writeString(9, "$TILEMODELIGHTSYNCH");
1622         if (getInt("$TILEMODELIGHTSYNCH", &varInt))
1623             writer->writeInt16(280, varInt);
1624         else
1625             writer->writeInt16(280, 1);
1626     //$CMATERIAL is a handle
1627         writer->writeString(9, "$SOLIDHIST");
1628         if (getInt("$SOLIDHIST", &varInt))
1629             writer->writeInt16(280, varInt);
1630         else
1631             writer->writeInt16(280, 1);
1632         writer->writeString(9, "$SHOWHIST");
1633         if (getInt("$SHOWHIST", &varInt))
1634             writer->writeInt16(280, varInt);
1635         else
1636             writer->writeInt16(280, 1);
1637         writer->writeString(9, "$DWFFRAME");
1638         if (getInt("$DWFFRAME", &varInt))
1639             writer->writeInt16(280, varInt);
1640         else
1641             writer->writeInt16(280, 2);
1642         writer->writeString(9, "$DGNFRAME");
1643         if (getInt("$DGNFRAME", &varInt))
1644             writer->writeInt16(280, varInt);
1645         else
1646             writer->writeInt16(280, 0);
1647         writer->writeString(9, "$REALWORLDSCALE"); //RLZ bool flag, verify in bin version
1648         if (getInt("$REALWORLDSCALE", &varInt))
1649             writer->writeInt16(290, varInt);
1650         else
1651             writer->writeInt16(290, 1);
1652         writer->writeString(9, "$INTERFERECOLOR");
1653         if (getInt("$INTERFERECOLOR", &varInt))
1654             writer->writeInt16(62, varInt);
1655         else
1656             writer->writeInt16(62, 1);
1657         //$INTERFEREOBJVS is a handle
1658         //$INTERFEREVPVS is a handle
1659         writer->writeString(9, "$CSHADOW");
1660         if (getInt("$CSHADOW", &varInt))
1661             writer->writeInt16(280, varInt);
1662         else
1663             writer->writeInt16(280, 0);
1664         writer->writeString(9, "$SHADOWPLANELOCATION");
1665         if (getDouble("$SHADOWPLANELOCATION", &varDouble))
1666             writer->writeDouble(40, varDouble);
1667         else
1668             writer->writeDouble(40, 0.0);
1669     }
1670 
1671 #ifdef DRW_DBG
1672     std::map<std::string,DRW_Variant *>::const_iterator it;
1673     for ( it=vars.begin() ; it != vars.end(); ++it ){
1674         DRW_DBG((*it).first); DRW_DBG("\n");
1675     }
1676 #endif
1677 }
1678 
addDouble(std::string key,double value,int code)1679 void DRW_Header::addDouble(std::string key, double value, int code){
1680     curr = new DRW_Variant(code, value);
1681     vars[key] =curr;
1682 }
1683 
addInt(std::string key,int value,int code)1684 void DRW_Header::addInt(std::string key, int value, int code){
1685     curr = new DRW_Variant(code, value);
1686     vars[key] =curr;
1687 }
1688 
addStr(std::string key,std::string value,int code)1689 void DRW_Header::addStr(std::string key, std::string value, int code){
1690     curr = new DRW_Variant(code, value);
1691     vars[key] =curr;
1692 }
1693 
addCoord(std::string key,DRW_Coord value,int code)1694 void DRW_Header::addCoord(std::string key, DRW_Coord value, int code){
1695     curr = new DRW_Variant(code, value);
1696     vars[key] =curr;
1697 }
1698 
getDouble(std::string key,double * varDouble)1699 bool DRW_Header::getDouble(std::string key, double *varDouble){
1700     bool result = false;
1701     std::map<std::string,DRW_Variant *>::iterator it;
1702     it=vars.find( key);
1703     if (it != vars.end()) {
1704         DRW_Variant *var = (*it).second;
1705         if (var->type() == DRW_Variant::DOUBLE) {
1706             *varDouble = var->content.d;
1707             result = true;
1708         }
1709         delete var;
1710         vars.erase (it);
1711     }
1712     return result;
1713 }
1714 
getInt(std::string key,int * varInt)1715 bool DRW_Header::getInt(std::string key, int *varInt){
1716     bool result = false;
1717     std::map<std::string,DRW_Variant *>::iterator it;
1718     it=vars.find( key);
1719     if (it != vars.end()) {
1720         DRW_Variant *var = (*it).second;
1721         if (var->type() == DRW_Variant::INTEGER) {
1722             *varInt = var->content.i;
1723             result = true;
1724         }
1725         delete var;
1726         vars.erase (it);
1727     }
1728     return result;
1729 }
1730 
getStr(std::string key,std::string * varStr)1731 bool DRW_Header::getStr(std::string key, std::string *varStr){
1732     bool result = false;
1733     std::map<std::string,DRW_Variant *>::iterator it;
1734     it=vars.find( key);
1735     if (it != vars.end()) {
1736         DRW_Variant *var = (*it).second;
1737         if (var->type() == DRW_Variant::STRING) {
1738             *varStr = *var->content.s;
1739             result = true;
1740         }
1741         delete var;
1742         vars.erase (it);
1743     }
1744     return result;
1745 }
1746 
getCoord(std::string key,DRW_Coord * varCoord)1747 bool DRW_Header::getCoord(std::string key, DRW_Coord *varCoord){
1748     bool result = false;
1749     std::map<std::string,DRW_Variant *>::iterator it;
1750     it=vars.find( key);
1751     if (it != vars.end()) {
1752         DRW_Variant *var = (*it).second;
1753         if (var->type() == DRW_Variant::COORD) {
1754             *varCoord = *var->content.v;
1755             result = true;
1756         }
1757         delete var;
1758         vars.erase (it);
1759     }
1760     return result;
1761 }
1762 
parseDwg(DRW::Version version,dwgBuffer * buf,dwgBuffer * hBbuf,duint8 mv)1763 bool DRW_Header::parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer *hBbuf, duint8 mv){
1764     bool result = true;
1765     duint32 size = buf->getRawLong32();
1766     duint32 bitSize = 0;
1767     duint32 endBitPos = 160; //start bit: 16 sentinel + 4 size
1768     DRW_DBG("\nbyte size of data: "); DRW_DBG(size);
1769     if (version > DRW::AC1021 && mv > 3) { //2010+
1770         duint32 hSize = buf->getRawLong32();
1771         endBitPos += 32; //start bit: + 4 hight size
1772         DRW_DBG("\n2010+ & MV> 3, higth 32b: "); DRW_DBG(hSize);
1773     }
1774 //RLZ TODO add $ACADVER var & $DWGCODEPAGE & $MEASUREMENT
1775 //RLZ TODO EN 2000 falta $CELWEIGHT, $ENDCAPS, $EXTNAMES $JOINSTYLE $LWDISPLAY $PSTYLEMODE $TDUCREATE  $TDUUPDATE $XEDIT
1776 
1777     //bit size of data needed to locate start of string stream in 2007+
1778     //and mark the start of handle stream
1779     //header is one object reads data and continue read strings ???
1780     if (version > DRW::AC1018) {//2007+
1781         bitSize = buf->getRawLong32();
1782         DRW_DBG("\nsize in bits: "); DRW_DBG(bitSize);
1783         endBitPos += bitSize;
1784         hBbuf->setPosition(endBitPos >>3);
1785         hBbuf->setBitPos(endBitPos&7);
1786     }
1787 
1788     if (version > DRW::AC1024) {//2013+
1789         duint64 requiredVersions = buf->getBitLongLong();
1790         DRW_DBG("\nREQUIREDVERSIONS var: "); DRW_DBG(requiredVersions);
1791     }
1792     DRW_DBG("\nUnknown1: "); DRW_DBG(buf->getBitDouble());
1793     DRW_DBG("\nUnknown2: "); DRW_DBG(buf->getBitDouble());
1794     DRW_DBG("\nUnknown3: "); DRW_DBG(buf->getBitDouble());
1795     DRW_DBG("\nUnknown4: "); DRW_DBG(buf->getBitDouble());
1796     if (version < DRW::AC1021) {//2007-
1797         DRW_DBG("\nUnknown text1: "); DRW_DBG(buf->getCP8Text());
1798         DRW_DBG("\nUnknown text2: "); DRW_DBG(buf->getCP8Text());
1799         DRW_DBG("\nUnknown text3: "); DRW_DBG(buf->getCP8Text());
1800         DRW_DBG("\nUnknown text4: "); DRW_DBG(buf->getCP8Text());
1801     }
1802     DRW_DBG("\nUnknown long1 (24L): "); DRW_DBG(buf->getBitLong());
1803     DRW_DBG("\nUnknown long2 (0L): "); DRW_DBG(buf->getBitLong());
1804     if (version < DRW::AC1015) {//pre 2000
1805         DRW_DBG("\nUnknown short (0): "); DRW_DBG(buf->getBitShort());
1806     }
1807     if (version < DRW::AC1018) {//pre 2004
1808         dwgHandle hcv = hBbuf->getHandle();
1809         DRW_DBG("\nhandle of current view: "); DRW_DBGHL(hcv.code, hcv.size, hcv.ref);
1810     }
1811     vars["DIMASO"]=new DRW_Variant(70, buf->getBit());
1812     vars["DIMSHO"]=new DRW_Variant(70, buf->getBit());
1813     if (version < DRW::AC1015) {//pre 2000
1814         vars["DIMSAV"]=new DRW_Variant(70, buf->getBit());
1815     }
1816     vars["PLINEGEN"]=new DRW_Variant(70, buf->getBit());
1817     vars["ORTHOMODE"]=new DRW_Variant(70, buf->getBit());
1818     vars["REGENMODE"]=new DRW_Variant(70, buf->getBit());
1819     vars["FILLMODE"]=new DRW_Variant(70, buf->getBit());
1820     vars["QTEXTMODE"]=new DRW_Variant(70, buf->getBit());
1821     vars["PSLTSCALE"]=new DRW_Variant(70, buf->getBit());
1822     vars["LIMCHECK"]=new DRW_Variant(70, buf->getBit());
1823     if (version < DRW::AC1015) {//pre 2000
1824         vars["BLIPMODE"]=new DRW_Variant(70, buf->getBit());
1825     }
1826     if (version > DRW::AC1015) {//2004+
1827          DRW_DBG("\nUndocumented: "); DRW_DBG(buf->getBit());
1828     }
1829     vars["USRTIMER"]=new DRW_Variant(70, buf->getBit());
1830     vars["SKPOLY"]=new DRW_Variant(70, buf->getBit());
1831     vars["ANGDIR"]=new DRW_Variant(70, buf->getBit());
1832     vars["SPLFRAME"]=new DRW_Variant(70, buf->getBit());
1833     if (version < DRW::AC1015) {//pre 2000
1834         vars["ATTREQ"]=new DRW_Variant(70, buf->getBit());
1835         vars["ATTDIA"]=new DRW_Variant(70, buf->getBit());
1836     }
1837     vars["MIRRTEXT"]=new DRW_Variant(70, buf->getBit());
1838     vars["WORLDVIEW"]=new DRW_Variant(70, buf->getBit());
1839     if (version < DRW::AC1015) {//pre 2000
1840         vars["WIREFRAME"]=new DRW_Variant(70, buf->getBit());
1841     }
1842     vars["TILEMODE"]=new DRW_Variant(70, buf->getBit());
1843     vars["PLIMCHECK"]=new DRW_Variant(70, buf->getBit());
1844     vars["VISRETAIN"]=new DRW_Variant(70, buf->getBit());
1845     if (version < DRW::AC1015) {//pre 2000
1846         vars["DELOBJ"]=new DRW_Variant(70, buf->getBit());
1847     }
1848     vars["DISPSILH"]=new DRW_Variant(70, buf->getBit());
1849     vars["PELLIPSE"]=new DRW_Variant(70, buf->getBit());
1850     vars["PROXIGRAPHICS"]=new DRW_Variant(70, buf->getBitShort());//RLZ short or bit??
1851     if (version < DRW::AC1015) {//pre 2000
1852         vars["DRAGMODE"]=new DRW_Variant(70, buf->getBitShort());//RLZ short or bit??
1853     }
1854     vars["TREEDEPTH"]=new DRW_Variant(70, buf->getBitShort());//RLZ short or bit??
1855     vars["LUNITS"]=new DRW_Variant(70, buf->getBitShort());
1856     vars["LUPREC"]=new DRW_Variant(70, buf->getBitShort());
1857     vars["AUNITS"]=new DRW_Variant(70, buf->getBitShort());
1858     vars["AUPREC"]=new DRW_Variant(70, buf->getBitShort());
1859     if (version < DRW::AC1015) {//pre 2000
1860         vars["OSMODE"]=new DRW_Variant(70, buf->getBitShort());
1861     }
1862     vars["ATTMODE"]=new DRW_Variant(70, buf->getBitShort());
1863     if (version < DRW::AC1015) {//pre 2000
1864         vars["COORDS"]=new DRW_Variant(70, buf->getBitShort());
1865     }
1866     vars["PDMODE"]=new DRW_Variant(70, buf->getBitShort());
1867     if (version < DRW::AC1015) {//pre 2000
1868         vars["PICKSTYLE"]=new DRW_Variant(70, buf->getBitShort());
1869     }
1870     if (version > DRW::AC1015) {//2004+
1871          DRW_DBG("\nUnknown long 1: "); DRW_DBG(buf->getBitLong());
1872          DRW_DBG("\nUnknown long 2: "); DRW_DBG(buf->getBitLong());
1873          DRW_DBG("\nUnknown long 3: "); DRW_DBG(buf->getBitLong());
1874     }
1875     vars["USERI1"]=new DRW_Variant(70, buf->getBitShort());
1876     vars["USERI2"]=new DRW_Variant(70, buf->getBitShort());
1877     vars["USERI3"]=new DRW_Variant(70, buf->getBitShort());
1878     vars["USERI4"]=new DRW_Variant(70, buf->getBitShort());
1879     vars["USERI5"]=new DRW_Variant(70, buf->getBitShort());
1880     vars["SPLINESEGS"]=new DRW_Variant(70, buf->getBitShort());
1881     vars["SURFU"]=new DRW_Variant(70, buf->getBitShort());
1882     vars["SURFV"]=new DRW_Variant(70, buf->getBitShort());
1883     vars["SURFTYPE"]=new DRW_Variant(70, buf->getBitShort());
1884     vars["SURFTAB1"]=new DRW_Variant(70, buf->getBitShort());
1885     vars["SURFTAB2"]=new DRW_Variant(70, buf->getBitShort());
1886     vars["SPLINETYPE"]=new DRW_Variant(70, buf->getBitShort());
1887     vars["SHADEDGE"]=new DRW_Variant(70, buf->getBitShort());
1888     vars["SHADEDIF"]=new DRW_Variant(70, buf->getBitShort());
1889     vars["UNITMODE"]=new DRW_Variant(70, buf->getBitShort());
1890     vars["MAXACTVP"]=new DRW_Variant(70, buf->getBitShort());
1891     vars["ISOLINES"]=new DRW_Variant(70, buf->getBitShort());//////////////////
1892     vars["CMLJUST"]=new DRW_Variant(70, buf->getBitShort());
1893     vars["TEXTQLTY"]=new DRW_Variant(70, buf->getBitShort());/////////////////////
1894     vars["LTSCALE"]=new DRW_Variant(40, buf->getBitDouble());
1895     vars["TEXTSIZE"]=new DRW_Variant(40, buf->getBitDouble());
1896     vars["TRACEWID"]=new DRW_Variant(40, buf->getBitDouble());
1897     vars["SKETCHINC"]=new DRW_Variant(40, buf->getBitDouble());
1898     vars["FILLETRAD"]=new DRW_Variant(40, buf->getBitDouble());
1899     vars["THICKNESS"]=new DRW_Variant(40, buf->getBitDouble());
1900     vars["ANGBASE"]=new DRW_Variant(50, buf->getBitDouble());
1901     vars["PDSIZE"]=new DRW_Variant(40, buf->getBitDouble());
1902     vars["PLINEWID"]=new DRW_Variant(40, buf->getBitDouble());
1903     vars["USERR1"]=new DRW_Variant(40, buf->getBitDouble());
1904     vars["USERR2"]=new DRW_Variant(40, buf->getBitDouble());
1905     vars["USERR3"]=new DRW_Variant(40, buf->getBitDouble());
1906     vars["USERR4"]=new DRW_Variant(40, buf->getBitDouble());
1907     vars["USERR5"]=new DRW_Variant(40, buf->getBitDouble());
1908     vars["CHAMFERA"]=new DRW_Variant(40, buf->getBitDouble());
1909     vars["CHAMFERB"]=new DRW_Variant(40, buf->getBitDouble());
1910     vars["CHAMFERC"]=new DRW_Variant(40, buf->getBitDouble());
1911     vars["CHAMFERD"]=new DRW_Variant(40, buf->getBitDouble());
1912     vars["FACETRES"]=new DRW_Variant(40, buf->getBitDouble());/////////////////////////
1913     vars["CMLSCALE"]=new DRW_Variant(40, buf->getBitDouble());
1914     vars["CELTSCALE"]=new DRW_Variant(40, buf->getBitDouble());
1915     if (version < DRW::AC1021) {//2004-
1916         vars["MENU"]=new DRW_Variant(1, buf->getCP8Text());
1917     }
1918     ddouble64 msec, day;
1919     day = buf->getBitLong();
1920     msec = buf->getBitLong();
1921     while (msec > 0)
1922         msec /=10;
1923     vars["TDCREATE"]=new DRW_Variant(40, day+msec);//RLZ: TODO convert to day.msec
1924 //    vars["TDCREATE"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
1925 //    vars["TDCREATE"]=new DRW_Variant(40, buf->getBitLong());
1926     day = buf->getBitLong();
1927     msec = buf->getBitLong();
1928     while (msec > 0)
1929         msec /=10;
1930     vars["TDUPDATE"]=new DRW_Variant(40, day+msec);//RLZ: TODO convert to day.msec
1931 //    vars["TDUPDATE"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
1932 //    vars["TDUPDATE"]=new DRW_Variant(40, buf->getBitLong());
1933     if (version > DRW::AC1015) {//2004+
1934          DRW_DBG("\nUnknown long 4: "); DRW_DBG(buf->getBitLong());
1935          DRW_DBG("\nUnknown long 5: "); DRW_DBG(buf->getBitLong());
1936          DRW_DBG("\nUnknown long 6: "); DRW_DBG(buf->getBitLong());
1937     }
1938     day = buf->getBitLong();
1939     msec = buf->getBitLong();
1940     while (msec > 0)
1941         msec /=10;
1942     vars["TDINDWG"]=new DRW_Variant(40, day+msec);//RLZ: TODO convert to day.msec
1943 //    vars["TDINDWG"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
1944 //    vars["TDINDWG"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
1945     day = buf->getBitLong();
1946     msec = buf->getBitLong();
1947     while (msec > 0)
1948         msec /=10;
1949     vars["TDUSRTIMER"]=new DRW_Variant(40, day+msec);//RLZ: TODO convert to day.msec
1950 //    vars["TDUSRTIMER"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
1951 //    vars["TDUSRTIMER"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
1952     vars["CECOLOR"]=new DRW_Variant(62, buf->getCmColor(version));//RLZ: TODO read CMC or EMC color
1953     dwgHandle HANDSEED = buf->getHandle();//allways present in data stream
1954     DRW_DBG("\nHANDSEED: "); DRW_DBGHL(HANDSEED.code, HANDSEED.size, HANDSEED.ref);
1955     dwgHandle CLAYER = hBbuf->getHandle();
1956     DRW_DBG("\nCLAYER: "); DRW_DBGHL(CLAYER.code, CLAYER.size, CLAYER.ref);
1957     dwgHandle TEXTSTYLE = hBbuf->getHandle();
1958     DRW_DBG("\nTEXTSTYLE: "); DRW_DBGHL(TEXTSTYLE.code, TEXTSTYLE.size, TEXTSTYLE.ref);
1959     dwgHandle CELTYPE = hBbuf->getHandle();
1960     DRW_DBG("\nCELTYPE: "); DRW_DBGHL(CELTYPE.code, CELTYPE.size, CELTYPE.ref);
1961     if (version > DRW::AC1018) {//2007+
1962         dwgHandle CMATERIAL = hBbuf->getHandle();
1963         DRW_DBG("\nCMATERIAL: "); DRW_DBGHL(CMATERIAL.code, CMATERIAL.size, CMATERIAL.ref);
1964     }
1965     dwgHandle DIMSTYLE = hBbuf->getHandle();
1966     DRW_DBG("\nDIMSTYLE: "); DRW_DBGHL(DIMSTYLE.code, DIMSTYLE.size, DIMSTYLE.ref);
1967     dwgHandle CMLSTYLE = hBbuf->getHandle();
1968     DRW_DBG("\nCMLSTYLE: "); DRW_DBGHL(CMLSTYLE.code, CMLSTYLE.size, CMLSTYLE.ref);
1969     if (version > DRW::AC1014) {//2000+
1970         vars["PSVPSCALE"]=new DRW_Variant(40, buf->getBitDouble());
1971     }
1972     vars["PINSBASE"]=new DRW_Variant(10, buf->get3BitDouble());
1973     vars["PEXTMIN"]=new DRW_Variant(10, buf->get3BitDouble());
1974     vars["PEXTMAX"]=new DRW_Variant(10, buf->get3BitDouble());
1975     vars["PLIMMIN"]=new DRW_Variant(10, buf->get2RawDouble());
1976     vars["PLIMMAX"]=new DRW_Variant(10, buf->get2RawDouble());
1977     vars["PELEVATION"]=new DRW_Variant(40, buf->getBitDouble());
1978     vars["PUCSORG"]=new DRW_Variant(10, buf->get3BitDouble());
1979     vars["PUCSXDIR"]=new DRW_Variant(10, buf->get3BitDouble());
1980     vars["PUCSYDIR"]=new DRW_Variant(10, buf->get3BitDouble());
1981     dwgHandle PUCSNAME = hBbuf->getHandle();
1982     DRW_DBG("\nPUCSNAME: "); DRW_DBGHL(PUCSNAME.code, PUCSNAME.size, PUCSNAME.ref);
1983     if (version > DRW::AC1014) {//2000+
1984         dwgHandle PUCSORTHOREF = hBbuf->getHandle();
1985         DRW_DBG("\nPUCSORTHOREF: "); DRW_DBGHL(PUCSORTHOREF.code, PUCSORTHOREF.size, PUCSORTHOREF.ref);
1986         vars["PUCSORTHOVIEW"]=new DRW_Variant(70, buf->getBitShort());
1987         dwgHandle PUCSBASE = hBbuf->getHandle();
1988         DRW_DBG("\nPUCSBASE: "); DRW_DBGHL(PUCSBASE.code, PUCSBASE.size, PUCSBASE.ref);
1989         vars["PUCSORGTOP"]=new DRW_Variant(10, buf->get3BitDouble());
1990         vars["PUCSORGBOTTOM"]=new DRW_Variant(10, buf->get3BitDouble());
1991         vars["PUCSORGLEFT"]=new DRW_Variant(10, buf->get3BitDouble());
1992         vars["PUCSORGRIGHT"]=new DRW_Variant(10, buf->get3BitDouble());
1993         vars["PUCSORGFRONT"]=new DRW_Variant(10, buf->get3BitDouble());
1994         vars["PUCSORGBACK"]=new DRW_Variant(10, buf->get3BitDouble());
1995     }
1996     vars["INSBASE"]=new DRW_Variant(10, buf->get3BitDouble());
1997     vars["EXTMIN"]=new DRW_Variant(10, buf->get3BitDouble());
1998     vars["EXTMAX"]=new DRW_Variant(10, buf->get3BitDouble());
1999     vars["LIMMIN"]=new DRW_Variant(10, buf->get2RawDouble());
2000     vars["LIMMAX"]=new DRW_Variant(10, buf->get2RawDouble());
2001     vars["ELEVATION"]=new DRW_Variant(40, buf->getBitDouble());
2002     vars["UCSORG"]=new DRW_Variant(10, buf->get3BitDouble());
2003     vars["UCSXDIR"]=new DRW_Variant(10, buf->get3BitDouble());
2004     vars["UCSYDIR"]=new DRW_Variant(10, buf->get3BitDouble());
2005     dwgHandle UCSNAME = hBbuf->getHandle();
2006     DRW_DBG("\nUCSNAME: "); DRW_DBGHL(UCSNAME.code, UCSNAME.size, UCSNAME.ref);
2007     if (version > DRW::AC1014) {//2000+
2008         dwgHandle UCSORTHOREF = hBbuf->getHandle();
2009         DRW_DBG("\nUCSORTHOREF: "); DRW_DBGHL(UCSORTHOREF.code, UCSORTHOREF.size, UCSORTHOREF.ref);
2010         vars["UCSORTHOVIEW"]=new DRW_Variant(70, buf->getBitShort());
2011         dwgHandle UCSBASE = hBbuf->getHandle();
2012         DRW_DBG("\nUCSBASE: "); DRW_DBGHL(UCSBASE.code, UCSBASE.size, UCSBASE.ref);
2013         vars["UCSORGTOP"]=new DRW_Variant(10, buf->get3BitDouble());
2014         vars["UCSORGBOTTOM"]=new DRW_Variant(10, buf->get3BitDouble());
2015         vars["UCSORGLEFT"]=new DRW_Variant(10, buf->get3BitDouble());
2016         vars["UCSORGRIGHT"]=new DRW_Variant(10, buf->get3BitDouble());
2017         vars["UCSORGFRONT"]=new DRW_Variant(10, buf->get3BitDouble());
2018         vars["UCSORGBACK"]=new DRW_Variant(10, buf->get3BitDouble());
2019         if (version < DRW::AC1021) {//2004-
2020             vars["DIMPOST"]=new DRW_Variant(1, buf->getCP8Text());
2021             vars["DIMAPOST"]=new DRW_Variant(1, buf->getCP8Text());
2022         }
2023     }
2024     if (version < DRW::AC1015) {//r14-
2025         vars["DIMTOL"]=new DRW_Variant(70, buf->getBit());
2026         vars["DIMLIM"]=new DRW_Variant(70, buf->getBit());
2027         vars["DIMTIH"]=new DRW_Variant(70, buf->getBit());
2028         vars["DIMTOH"]=new DRW_Variant(70, buf->getBit());
2029         vars["DIMSE1"]=new DRW_Variant(70, buf->getBit());
2030         vars["DIMSE2"]=new DRW_Variant(70, buf->getBit());
2031         vars["DIMALT"]=new DRW_Variant(70, buf->getBit());
2032         vars["DIMTOFL"]=new DRW_Variant(70, buf->getBit());
2033         vars["DIMSAH"]=new DRW_Variant(70, buf->getBit());
2034         vars["DIMTIX"]=new DRW_Variant(70, buf->getBit());
2035         vars["DIMSOXD"]=new DRW_Variant(70, buf->getBit());
2036         vars["DIMALTD"]=new DRW_Variant(70, buf->getRawChar8());
2037         vars["DIMZIN"]=new DRW_Variant(70, buf->getRawChar8());
2038         vars["DIMSD1"]=new DRW_Variant(70, buf->getBit());
2039         vars["DIMSD2"]=new DRW_Variant(70, buf->getBit());
2040         vars["DIMTOLJ"]=new DRW_Variant(70, buf->getRawChar8());
2041         vars["DIMJUST"]=new DRW_Variant(70, buf->getRawChar8());
2042         vars["DIMFIT"]=new DRW_Variant(70, buf->getRawChar8());///////////
2043         vars["DIMUPT"]=new DRW_Variant(70, buf->getBit());
2044         vars["DIMTZIN"]=new DRW_Variant(70, buf->getRawChar8());
2045         vars["DIMALTZ"]=new DRW_Variant(70, buf->getRawChar8());
2046         vars["DIMALTTZ"]=new DRW_Variant(70, buf->getRawChar8());
2047         vars["DIMTAD"]=new DRW_Variant(70, buf->getRawChar8());
2048         vars["DIMUNIT"]=new DRW_Variant(70, buf->getBitShort());///////////
2049         vars["DIMAUNIT"]=new DRW_Variant(70, buf->getBitShort());
2050         vars["DIMDEC"]=new DRW_Variant(70, buf->getBitShort());
2051         vars["DIMTDEC"]=new DRW_Variant(70, buf->getBitShort());
2052         vars["DIMALTU"]=new DRW_Variant(70, buf->getBitShort());
2053         vars["DIMALTTD"]=new DRW_Variant(70, buf->getBitShort());
2054         dwgHandle DIMTXSTY = hBbuf->getHandle();
2055         DRW_DBG("\nDIMTXSTY: "); DRW_DBGHL(DIMTXSTY.code, DIMTXSTY.size, DIMTXSTY.ref);
2056     }
2057     vars["DIMSCALE"]=new DRW_Variant(40, buf->getBitDouble());
2058     vars["DIMASZ"]=new DRW_Variant(40, buf->getBitDouble());
2059     vars["DIMEXO"]=new DRW_Variant(40, buf->getBitDouble());
2060     vars["DIMDLI"]=new DRW_Variant(40, buf->getBitDouble());
2061     vars["DIMEXE"]=new DRW_Variant(40, buf->getBitDouble());
2062     vars["DIMRND"]=new DRW_Variant(40, buf->getBitDouble());
2063     vars["DIMDLE"]=new DRW_Variant(40, buf->getBitDouble());
2064     vars["DIMTP"]=new DRW_Variant(40, buf->getBitDouble());
2065     vars["DIMTM"]=new DRW_Variant(40, buf->getBitDouble());
2066     if (version > DRW::AC1018) {//2007+
2067         vars["DIMFXL"]=new DRW_Variant(40, buf->getBitDouble());//////////////////
2068         vars["DIMJOGANG"]=new DRW_Variant(40, buf->getBitDouble());///////////////
2069         vars["DIMTFILL"]=new DRW_Variant(70, buf->getBitShort());
2070         vars["DIMTFILLCLR"]=new DRW_Variant(62, buf->getCmColor(version));
2071     }
2072     if (version > DRW::AC1014) {//2000+
2073         vars["DIMTOL"]=new DRW_Variant(70, buf->getBit());
2074         vars["DIMLIM"]=new DRW_Variant(70, buf->getBit());
2075         vars["DIMTIH"]=new DRW_Variant(70, buf->getBit());
2076         vars["DIMTOH"]=new DRW_Variant(70, buf->getBit());
2077         vars["DIMSE1"]=new DRW_Variant(70, buf->getBit());
2078         vars["DIMSE2"]=new DRW_Variant(70, buf->getBit());
2079         vars["DIMTAD"]=new DRW_Variant(70, buf->getBitShort());
2080         vars["DIMZIN"]=new DRW_Variant(70, buf->getBitShort());
2081         vars["DIMAZIN"]=new DRW_Variant(70, buf->getBitShort());
2082     }
2083     if (version > DRW::AC1018) {//2007+
2084         vars["DIMARCSYM"]=new DRW_Variant(70, buf->getBitShort());
2085     }
2086     vars["DIMTXT"]=new DRW_Variant(40, buf->getBitDouble());
2087     vars["DIMCEN"]=new DRW_Variant(40, buf->getBitDouble());
2088     vars["DIMTSZ"]=new DRW_Variant(40, buf->getBitDouble());
2089     vars["DIMALTF"]=new DRW_Variant(40, buf->getBitDouble());
2090     vars["DIMLFAC"]=new DRW_Variant(40, buf->getBitDouble());
2091     vars["DIMTVP"]=new DRW_Variant(40, buf->getBitDouble());
2092     vars["DIMTFAC"]=new DRW_Variant(40, buf->getBitDouble());
2093     vars["DIMGAP"]=new DRW_Variant(40, buf->getBitDouble());
2094     if (version < DRW::AC1015) {//r14-
2095         vars["DIMPOST"]=new DRW_Variant(1, buf->getCP8Text());
2096         vars["DIMAPOST"]=new DRW_Variant(1, buf->getCP8Text());
2097         vars["DIMBLK"]=new DRW_Variant(1, buf->getCP8Text());
2098         vars["DIMBLK1"]=new DRW_Variant(1, buf->getCP8Text());
2099         vars["DIMBLK2"]=new DRW_Variant(1, buf->getCP8Text());
2100     }
2101     if (version > DRW::AC1014) {//2000+
2102         vars["DIMALTRND"]=new DRW_Variant(40, buf->getBitDouble());
2103         vars["DIMALT"]=new DRW_Variant(70, buf->getBit());
2104         vars["DIMALTD"]=new DRW_Variant(70, buf->getBitShort());
2105         vars["DIMTOFL"]=new DRW_Variant(70, buf->getBit());
2106         vars["DIMSAH"]=new DRW_Variant(70, buf->getBit());
2107         vars["DIMTIX"]=new DRW_Variant(70, buf->getBit());
2108         vars["DIMSOXD"]=new DRW_Variant(70, buf->getBit());
2109     }
2110     vars["DIMCLRD"]=new DRW_Variant(70, buf->getCmColor(version));//RLZ: TODO read CMC or EMC color
2111     vars["DIMCLRE"]=new DRW_Variant(70, buf->getCmColor(version));//RLZ: TODO read CMC or EMC color
2112     vars["DIMCLRT"]=new DRW_Variant(70, buf->getCmColor(version));//RLZ: TODO read CMC or EMC color
2113     if (version > DRW::AC1014) {//2000+
2114         vars["DIAMDEC"]=new DRW_Variant(70, buf->getBitShort());
2115         vars["DIMDEC"]=new DRW_Variant(70, buf->getBitShort());
2116         vars["DIMTDEC"]=new DRW_Variant(70, buf->getBitShort());
2117         vars["DIMALTU"]=new DRW_Variant(70, buf->getBitShort());
2118         vars["DIMALTTD"]=new DRW_Variant(70, buf->getBitShort());
2119         vars["DIMAUNIT"]=new DRW_Variant(70, buf->getBitShort());
2120         vars["DIMFAC"]=new DRW_Variant(70, buf->getBitShort());///////////////// DIMFAC O DIMFRAC
2121         vars["DIMLUNIT"]=new DRW_Variant(70, buf->getBitShort());
2122         vars["DIMDSEP"]=new DRW_Variant(70, buf->getBitShort());
2123         vars["DIMTMOVE"]=new DRW_Variant(70, buf->getBitShort());
2124         vars["DIMJUST"]=new DRW_Variant(70, buf->getBitShort());
2125         vars["DIMSD1"]=new DRW_Variant(70, buf->getBit());
2126         vars["DIMSD2"]=new DRW_Variant(70, buf->getBit());
2127         vars["DIMTOLJ"]=new DRW_Variant(70, buf->getBitShort());
2128         vars["DIMTZIN"]=new DRW_Variant(70, buf->getBitShort());
2129         vars["DIMALTZ"]=new DRW_Variant(70, buf->getBitShort());
2130         vars["DIMALTTZ"]=new DRW_Variant(70, buf->getBitShort());
2131         vars["DIMUPT"]=new DRW_Variant(70, buf->getBit());
2132         vars["DIMATFIT"]=new DRW_Variant(70, buf->getBitShort());
2133     }
2134     if (version > DRW::AC1018) {//2007+
2135         vars["DIMFXLON"]=new DRW_Variant(70, buf->getBit());////////////////
2136     }
2137     if (version > DRW::AC1021) {//2010+
2138         vars["DIMTXTDIRECTION"]=new DRW_Variant(70, buf->getBit());////////////////
2139         vars["DIMALTMZF"]=new DRW_Variant(40, buf->getBitDouble());////////////////
2140         vars["DIMMZF"]=new DRW_Variant(40, buf->getBitDouble());////////////////
2141     }
2142     if (version > DRW::AC1014) {//2000+
2143         dwgHandle DIMTXSTY = hBbuf->getHandle();
2144         DRW_DBG("\nDIMTXSTY: "); DRW_DBGHL(DIMTXSTY.code, DIMTXSTY.size, DIMTXSTY.ref);
2145         dwgHandle DIMLDRBLK = hBbuf->getHandle();
2146         DRW_DBG("\nDIMLDRBLK: "); DRW_DBGHL(DIMLDRBLK.code, DIMLDRBLK.size, DIMLDRBLK.ref);
2147         dwgHandle DIMBLK = hBbuf->getHandle();
2148         DRW_DBG("\nDIMBLK: "); DRW_DBGHL(DIMBLK.code, DIMBLK.size, DIMBLK.ref);
2149         dwgHandle DIMBLK1 = hBbuf->getHandle();
2150         DRW_DBG("\nDIMBLK1: "); DRW_DBGHL(DIMBLK1.code, DIMBLK1.size, DIMBLK1.ref);
2151         dwgHandle DIMBLK2 = hBbuf->getHandle();
2152         DRW_DBG("\nDIMBLK2: "); DRW_DBGHL(DIMBLK2.code, DIMBLK2.size, DIMBLK2.ref);
2153     }
2154     if (version > DRW::AC1018) {//2007+
2155         dwgHandle DIMLTYPE = hBbuf->getHandle();
2156         DRW_DBG("\nDIMLTYPE: "); DRW_DBGHL(DIMLTYPE.code, DIMLTYPE.size, DIMLTYPE.ref);
2157         dwgHandle DIMLTEX1 = hBbuf->getHandle();
2158         DRW_DBG("\nDIMLTEX1: "); DRW_DBGHL(DIMLTEX1.code, DIMLTEX1.size, DIMLTEX1.ref);
2159         dwgHandle DIMLTEX2 = hBbuf->getHandle();
2160         DRW_DBG("\nDIMLTEX2: "); DRW_DBGHL(DIMLTEX2.code, DIMLTEX2.size, DIMLTEX2.ref);
2161     }
2162     if (version > DRW::AC1014) {//2000+
2163         vars["DIMLWD"]=new DRW_Variant(70, buf->getBitShort());
2164         vars["DIMLWE"]=new DRW_Variant(70, buf->getBitShort());
2165     }
2166     dwgHandle CONTROL = hBbuf->getHandle();
2167     DRW_DBG("\nBLOCK CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2168     blockCtrl = CONTROL.ref;
2169     CONTROL = hBbuf->getHandle();
2170     DRW_DBG("\nLAYER CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2171     layerCtrl = CONTROL.ref;
2172     CONTROL = hBbuf->getHandle();
2173     DRW_DBG("\nSTYLE CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2174     styleCtrl = CONTROL.ref;
2175     CONTROL = hBbuf->getHandle();
2176     DRW_DBG("\nLINETYPE CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2177     linetypeCtrl = CONTROL.ref;
2178     CONTROL = hBbuf->getHandle();
2179     DRW_DBG("\nVIEW CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2180     viewCtrl = CONTROL.ref;
2181     CONTROL = hBbuf->getHandle();
2182     DRW_DBG("\nUCS CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2183     ucsCtrl = CONTROL.ref;
2184     CONTROL = hBbuf->getHandle();
2185     DRW_DBG("\nVPORT CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2186     vportCtrl = CONTROL.ref;
2187     CONTROL = hBbuf->getHandle();
2188     DRW_DBG("\nAPPID CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2189     appidCtrl = CONTROL.ref;
2190     CONTROL = hBbuf->getHandle();
2191     DRW_DBG("\nDIMSTYLE CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2192     dimstyleCtrl = CONTROL.ref;
2193     if (version < DRW::AC1018) {//r2000-
2194         CONTROL = hBbuf->getHandle();
2195         DRW_DBG("\nVIEWPORT ENTITY HEADER CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2196         vpEntHeaderCtrl = CONTROL.ref; //RLZ: only in R13-R15 ????
2197     }
2198     CONTROL = hBbuf->getHandle();
2199     DRW_DBG("\nDICT ACAD_GROUP: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2200     CONTROL = hBbuf->getHandle();
2201     DRW_DBG("\nDICT ACAD_MLINESTYLE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2202     CONTROL = hBbuf->getHandle();
2203     DRW_DBG("\nDICT NAMED OBJS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2204 
2205     if (version > DRW::AC1014) {//2000+
2206         vars["TSTACKALIGN"]=new DRW_Variant(70, buf->getBitShort());
2207         vars["TSTACKSIZE"]=new DRW_Variant(70, buf->getBitShort());
2208         if (version < DRW::AC1021) {//2004-
2209             vars["HYPERLINKBASE"]=new DRW_Variant(1, buf->getCP8Text());
2210             vars["STYLESHEET"]=new DRW_Variant(1, buf->getCP8Text());
2211         }
2212         CONTROL = hBbuf->getHandle();
2213         DRW_DBG("\nDICT LAYOUTS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2214         CONTROL = hBbuf->getHandle();
2215         DRW_DBG("\nDICT PLOTSETTINGS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2216         CONTROL = hBbuf->getHandle();
2217         DRW_DBG("\nDICT PLOTSTYLES: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2218     }
2219     if (version > DRW::AC1015) {//2004+
2220         CONTROL = hBbuf->getHandle();
2221         DRW_DBG("\nDICT MATERIALS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2222         CONTROL = hBbuf->getHandle();
2223         DRW_DBG("\nDICT COLORS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2224     }
2225     if (version > DRW::AC1018) {//2007+
2226         CONTROL = hBbuf->getHandle();
2227         DRW_DBG("\nDICT VISUALSTYLE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2228     }
2229     if (version > DRW::AC1024) {//2013+
2230         CONTROL = hBbuf->getHandle();
2231         DRW_DBG("\nUNKNOWN HANDLE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2232     }
2233     if (version > DRW::AC1014) {//2000+
2234         DRW_DBG("\nFlags: "); DRW_DBGH(buf->getBitLong());//RLZ TODO change to 8 vars
2235         vars["INSUNITS"]=new DRW_Variant(70, buf->getBitShort());
2236         duint16 cepsntype = buf->getBitShort();
2237         vars["CEPSNTYPE"]=new DRW_Variant(70, cepsntype);
2238         if (cepsntype == 3){
2239             CONTROL = hBbuf->getHandle();
2240             DRW_DBG("\nCPSNID HANDLE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2241         }
2242         if (version < DRW::AC1021) {//2004-
2243             vars["FINGERPRINTGUID"]=new DRW_Variant(1, buf->getCP8Text());
2244             vars["VERSIONGUID"]=new DRW_Variant(1, buf->getCP8Text());
2245         }
2246     }
2247     if (version > DRW::AC1015) {//2004+
2248         vars["SORTENTS"]=new DRW_Variant(70, buf->getRawChar8());
2249         vars["INDEXCTL"]=new DRW_Variant(70, buf->getRawChar8());
2250         vars["HIDETEXT"]=new DRW_Variant(70, buf->getRawChar8());
2251         vars["XCLIPFRAME"]=new DRW_Variant(70, buf->getRawChar8());
2252         vars["DIMASSOC"]=new DRW_Variant(70, buf->getRawChar8());
2253         vars["HALOGAP"]=new DRW_Variant(70, buf->getRawChar8());
2254         vars["OBSCUREDCOLOR"]=new DRW_Variant(70, buf->getBitShort());
2255         vars["INTERSECTIONCOLOR"]=new DRW_Variant(70, buf->getBitShort());
2256         vars["OBSCUREDLTYPE"]=new DRW_Variant(70, buf->getRawChar8());
2257         vars["INTERSECTIONDISPLAY"]=new DRW_Variant(70, buf->getRawChar8());
2258         if (version < DRW::AC1021) {//2004-
2259             vars["PROJECTNAME"]=new DRW_Variant(1, buf->getCP8Text());
2260         }
2261     }
2262     CONTROL = hBbuf->getHandle();
2263     DRW_DBG("\nBLOCK PAPER_SPACE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2264     CONTROL = hBbuf->getHandle();
2265     DRW_DBG("\nBLOCK MODEL_SPACE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2266     CONTROL = hBbuf->getHandle();
2267     DRW_DBG("\nLTYPE BYLAYER: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2268     CONTROL = hBbuf->getHandle();
2269     DRW_DBG("\nLTYPE BYBLOCK: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2270     CONTROL = hBbuf->getHandle();
2271     DRW_DBG("\nLTYPE CONTINUOUS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2272     if (version > DRW::AC1018) {//2007+
2273         vars["CAMERADISPLAY"]=new DRW_Variant(70, buf->getBit());
2274         DRW_DBG("\nUnknown 2007+ long1: "); DRW_DBG(buf->getBitLong());
2275         DRW_DBG("\nUnknown 2007+ long2: "); DRW_DBG(buf->getBitLong());
2276         DRW_DBG("\nUnknown 2007+ double2: "); DRW_DBG(buf->getBitDouble());
2277         vars["STEPSPERSEC"]=new DRW_Variant(40, buf->getBitDouble());
2278         vars["STEPSIZE"]=new DRW_Variant(40, buf->getBitDouble());
2279         vars["3DDWFPREC"]=new DRW_Variant(40, buf->getBitDouble());
2280         vars["LENSLENGTH"]=new DRW_Variant(40, buf->getBitDouble());
2281         vars["CAMERAHEIGHT"]=new DRW_Variant(40, buf->getBitDouble());
2282         vars["SOLIDHIST"]=new DRW_Variant(70, buf->getRawChar8());
2283         vars["SHOWHIST"]=new DRW_Variant(70, buf->getRawChar8());
2284         vars["PSOLWIDTH"]=new DRW_Variant(40, buf->getBitDouble());
2285         vars["PSOLHEIGHT"]=new DRW_Variant(40, buf->getBitDouble());
2286         vars["LOFTANG1"]=new DRW_Variant(40, buf->getBitDouble());
2287         vars["LOFTANG2"]=new DRW_Variant(40, buf->getBitDouble());
2288         vars["LOFTMAG1"]=new DRW_Variant(40, buf->getBitDouble());
2289         vars["LOFTMAG2"]=new DRW_Variant(40, buf->getBitDouble());
2290         vars["LOFTPARAM"]=new DRW_Variant(70, buf->getBitShort());
2291         vars["LOFTNORMALS"]=new DRW_Variant(40, buf->getRawChar8());
2292         vars["LATITUDE"]=new DRW_Variant(40, buf->getBitDouble());
2293         vars["LONGITUDE"]=new DRW_Variant(40, buf->getBitDouble());
2294         vars["NORTHDIRECTION"]=new DRW_Variant(40, buf->getBitDouble());
2295         vars["TIMEZONE"]=new DRW_Variant(70, buf->getBitLong());
2296         vars["LIGHTGLYPHDISPLAY"]=new DRW_Variant(70, buf->getRawChar8());
2297         vars["TILEMODELIGHTSYNCH"]=new DRW_Variant(70, buf->getRawChar8());
2298         vars["DWFFRAME"]=new DRW_Variant(70, buf->getRawChar8());
2299         vars["DGNFRAME"]=new DRW_Variant(70, buf->getRawChar8());
2300         DRW_DBG("\nUnknown 2007+ BIT: "); DRW_DBG(buf->getBit());
2301         vars["INTERFERECOLOR"]=new DRW_Variant(70, buf->getCmColor(version));
2302         CONTROL = hBbuf->getHandle();
2303         DRW_DBG("\nINTERFEREOBJVS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2304         CONTROL = hBbuf->getHandle();
2305         DRW_DBG("\nINTERFEREVPVS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2306         CONTROL = hBbuf->getHandle();
2307         DRW_DBG("\nDRAGVS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2308         vars["CSHADOW"]=new DRW_Variant(70, buf->getRawChar8());
2309         DRW_DBG("\nUnknown 2007+ double2: "); DRW_DBG(buf->getBitDouble());
2310     }
2311     if (version > DRW::AC1012) {//R14+
2312         DRW_DBG("\nUnknown R14+ short1: "); DRW_DBG(buf->getBitShort());
2313         DRW_DBG("\nUnknown R14+ short2: "); DRW_DBG(buf->getBitShort());
2314         DRW_DBG("\nUnknown R14+ short3: "); DRW_DBG(buf->getBitShort());
2315         DRW_DBG("\nUnknown R14+ short4: "); DRW_DBG(buf->getBitShort());
2316     }
2317 
2318     DRW_DBG("\nbuf position: "); DRW_DBG(buf->getPosition());
2319     DRW_DBG("  buf bit position: "); DRW_DBG(buf->getBitPos());
2320 
2321 
2322     /**** RLZ: disabled, pending to read all data ***/
2323     //Start reading string stream for 2007 and further
2324     if (version > DRW::AC1018) {//2007+
2325         duint32 strStartPos = endBitPos -1;
2326         buf->setPosition(strStartPos >>3);
2327         buf->setBitPos(strStartPos&7);
2328         if (buf->getBit() == 1){
2329             strStartPos -= 16;
2330             buf->setPosition(strStartPos >>3);
2331             buf->setBitPos(strStartPos&7);
2332             duint32 strDataSize = buf->getRawShort16();
2333             if (strDataSize & 0x8000) {
2334                 strStartPos -= 16;//decrement 16 bits
2335                 strDataSize &= 0x7FFF; //strip 0x8000;
2336                 buf->setPosition(strStartPos >> 3);
2337                 buf->setBitPos(strStartPos & 7);
2338                 duint32 hiSize = buf->getRawShort16();
2339                 strDataSize |= (hiSize << 15);
2340             }
2341             strStartPos -= strDataSize;
2342             buf->setPosition(strStartPos >> 3);
2343             buf->setBitPos(strStartPos & 7);
2344 
2345             DRW_DBG("\nstring buf position: "); DRW_DBG(buf->getPosition());
2346             DRW_DBG("\nstring buf bit position: "); DRW_DBG(buf->getBitPos());
2347         }
2348         DRW_DBG("\nUnknown text1: "); DRW_DBG(buf->getUCSText(false));
2349         DRW_DBG("\nUnknown text2: "); DRW_DBG(buf->getUCSText(false));
2350         DRW_DBG("\nUnknown text3: "); DRW_DBG(buf->getUCSText(false));
2351         DRW_DBG("\nUnknown text4: "); DRW_DBG(buf->getUCSText(false));
2352         vars["MENU"]=new DRW_Variant(1, buf->getUCSText(false));
2353         vars["DIMPOST"]=new DRW_Variant(1, buf->getUCSText(false));
2354         vars["DIMAPOST"]=new DRW_Variant(1, buf->getUCSText(false));
2355         if (version > DRW::AC1021) {//2010+
2356             vars["DIMALTMZS"]=new DRW_Variant(70, buf->getUCSText(false));//RLZ: pending to verify//////////////
2357             vars["DIMMZS"]=new DRW_Variant(70, buf->getUCSText(false));//RLZ: pending to verify//////////////
2358         }
2359         vars["HYPERLINKBASE"]=new DRW_Variant(1, buf->getUCSText(false));
2360         vars["STYLESHEET"]=new DRW_Variant(1, buf->getUCSText(false));
2361         vars["FINGERPRINTGUID"]=new DRW_Variant(1, buf->getUCSText(false));
2362         DRW_DBG("\nstring buf position: "); DRW_DBG(buf->getPosition());
2363         DRW_DBG("  string buf bit position: "); DRW_DBG(buf->getBitPos());
2364         vars["VERSIONGUID"]=new DRW_Variant(1, buf->getUCSText(false));
2365         DRW_DBG("\nstring buf position: "); DRW_DBG(buf->getPosition());
2366         DRW_DBG("  string buf bit position: "); DRW_DBG(buf->getBitPos());
2367         vars["PROJECTNAME"]=new DRW_Variant(1, buf->getUCSText(false));
2368     }
2369 /***    ****/
2370     DRW_DBG("\nstring buf position: "); DRW_DBG(buf->getPosition());
2371     DRW_DBG("  string buf bit position: "); DRW_DBG(buf->getBitPos());
2372 
2373     if (DRW_DBGGL == DRW_dbg::DEBUG){
2374         for (std::map<std::string,DRW_Variant*>::iterator it=vars.begin(); it!=vars.end(); ++it){
2375             DRW_DBG("\n"); DRW_DBG(it->first); DRW_DBG(": ");
2376             switch (it->second->type()){
2377             case DRW_Variant::INTEGER:
2378                 DRW_DBG(it->second->content.i);
2379                 break;
2380             case DRW_Variant::DOUBLE:
2381                 DRW_DBG(it->second->content.d);
2382                 break;
2383             case DRW_Variant::STRING:
2384                 DRW_DBG(it->second->content.s->c_str());
2385                 break;
2386             case DRW_Variant::COORD:
2387                  DRW_DBG("x= "); DRW_DBG(it->second->content.v->x);
2388                  DRW_DBG(", y= "); DRW_DBG(it->second->content.v->y);
2389                  DRW_DBG(", z= "); DRW_DBG(it->second->content.v->z);
2390                 break;
2391             default:
2392                 break;
2393             }
2394              DRW_DBG(" code: ");DRW_DBG(it->second->code());
2395         }
2396     }
2397 
2398     buf->setPosition(size+16+4); //readed size +16 start sentinel + 4 size
2399     if (version > DRW::AC1021 && mv > 3) { //2010+
2400         buf->getRawLong32();//advance 4 bytes (hisize)
2401     }
2402     DRW_DBG("\nseting position to: "); DRW_DBG(buf->getPosition());
2403     DRW_DBG("\nHeader CRC: "); DRW_DBGH(buf->getRawShort16());
2404     DRW_DBG("\nbuf position: "); DRW_DBG(buf->getPosition());
2405     DRW_DBG("\ndwg header end sentinel= ");
2406     for (int i=0; i<16;i++) {
2407         DRW_DBGH(buf->getRawChar8()); DRW_DBG(" ");
2408     }
2409 
2410     //temporary code to show header end sentinel
2411 //    duint64 sz= buf->size()-1;
2412 	duint64 sz;
2413 	if (version < DRW::AC1018) {//pre 2004
2414         sz= buf->size()-16;
2415         buf->setPosition(sz);
2416         DRW_DBG("\nseting position to: "); DRW_DBG(buf->getPosition());
2417         DRW_DBG("\ndwg header end sentinel= ");
2418         for (int i=0; i<16;i++) {
2419             DRW_DBGH(buf->getRawChar8()); DRW_DBG(" ");
2420         }
2421     } else if (version == DRW::AC1018) {//2004
2422 //        sz= buf->size()-132;
2423 //        buf->setPosition(sz);
2424         buf->moveBitPos(-128);
2425         DRW_DBG("\nseting position to: "); DRW_DBG(buf->getPosition());
2426         DRW_DBG("\ndwg header end sentinel= ");
2427         for (int i=0; i<16;i++) {
2428             DRW_DBGH(buf->getRawChar8()); DRW_DBG(" ");
2429         }
2430     } else if (version == DRW::AC1021) {//2007
2431         sz= buf->size()-16;
2432         buf->setPosition(sz);
2433         DRW_DBG("\nseting position to: "); DRW_DBG(buf->getPosition());
2434         DRW_DBG("\ndwg header end sentinel= ");
2435         for (int i=0; i<16;i++) {
2436             DRW_DBGH(buf->getRawChar8()); DRW_DBG(" ");
2437         }
2438     } else if (version == DRW::AC1024) {//2010
2439 //        sz= buf->size()-93;
2440 //        buf->setPosition(sz);
2441         buf->moveBitPos(-128);
2442         DRW_DBG("\nseting position to: "); DRW_DBG(buf->getPosition());
2443         DRW_DBG("\ndwg header end sentinel= ");
2444         for (int i=0; i<16;i++) {
2445             DRW_DBGH(buf->getRawChar8()); DRW_DBG(" ");
2446         }
2447     } else if (version == DRW::AC1027) {//2013
2448 //        sz= buf->size()-76;
2449 //        buf->setPosition(sz);
2450         buf->moveBitPos(-128);
2451         DRW_DBG("\nseting position to: "); DRW_DBG(buf->getPosition());
2452         DRW_DBG("\ndwg header end sentinel= ");
2453         for (int i=0; i<16;i++) {
2454             DRW_DBGH(buf->getRawChar8()); DRW_DBG(" ");
2455         }
2456     }
2457 
2458     return result;
2459 }
2460 
2461