Bug Summary

File:drw_header.cpp
Warning:line 2412, column 13
Value stored to 'sz' during its initialization is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name drw_header.cpp -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/home/runner/work/LibreCAD/LibreCAD/libraries/libdxfrw -fcoverage-compilation-dir=/home/runner/work/LibreCAD/LibreCAD/libraries/libdxfrw -resource-dir /usr/lib/llvm-18/lib/clang/18 -D _REENTRANT -D MUPARSER_STATIC -D QT_NO_DEBUG -I . -I ../../../Qt/6.9.0/gcc_64/mkspecs/linux-g++ -internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14 -internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/x86_64-linux-gnu/c++/14 -internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/backward -internal-isystem /usr/lib/llvm-18/lib/clang/18/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -std=gnu++1z -fdeprecated-macro -ferror-limit 19 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fcxx-exceptions -fexceptions -vectorize-loops -vectorize-slp -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /home/runner/work/LibreCAD/LibreCAD/out/2026-06-02-163325-5106-1 -x c++ src/drw_header.cpp
1/******************************************************************************
2** libDXFrw - Library to read/write DXF files (ascii & binary) **
3** **
4** Copyright (C) 2016-2022 A. Stebich (librecad@mail.lordofbikes.de) **
5** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com **
6** Copyright (C) 2026 LibreCAD (librecad.org) **
7** **
8** This library is free software, licensed under the terms of the GNU **
9** General Public License as published by the Free Software Foundation, **
10** either version 2 of the License, or (at your option) any later version. **
11** You should have received a copy of the GNU General Public License **
12** along with this program. If not, see <http://www.gnu.org/licenses/>. **
13******************************************************************************/
14
15#include "drw_header.h"
16#include <cmath>
17#include "intern/dxfreader.h"
18#include "intern/dxfwriter.h"
19#include "intern/drw_dbg.h"
20#include "intern/dwgbuffer.h"
21#include "intern/dwgbufferw.h"
22
23DRW_Header::DRW_Header() {
24 linetypeCtrl = layerCtrl = styleCtrl = dimstyleCtrl = appidCtrl = 0;
25 blockCtrl = viewCtrl = ucsCtrl = vportCtrl = vpEntHeaderCtrl = 0;
26 version = DRW::AC1021;
27}
28
29void DRW_Header::addComment(std::string c){
30 if (!comments.empty())
31 comments += '\n';
32 comments += c;
33}
34
35bool DRW_Header::parseCode(int code, const std::unique_ptr<dxfReader>& reader){
36 if (nullptr == curr && 9 != code) {
37 DRW_DBG("invalid header code: ")DRW_dbg::getInstance()->print("invalid header code: ");
38 DRW_DBG(code)DRW_dbg::getInstance()->print(code);
39 DRW_DBG("\n")DRW_dbg::getInstance()->print("\n");
40 return false;
41 }
42
43 switch (code) {
44 case 9:
45 curr = new DRW_Variant();
46 name = reader->getString();
47 if (version < DRW::AC1015 && name == "$DIMUNIT")
48 name="$DIMLUNIT";
49 vars[name]=curr;
50 break;
51 case 1:
52 curr->addString(code, reader->getUtf8String());
53 if (name =="$ACADVER") {
54 reader->setVersion(*curr->content.s, true);
55 version = reader->getVersion();
56 }
57 break;
58 case 2:
59 curr->addString(code, reader->getUtf8String());
60 break;
61 case 3:
62 curr->addString(code, reader->getUtf8String());
63 if (name =="$DWGCODEPAGE") {
64 reader->setCodePage(*curr->content.s);
65 curr->addString(code, reader->getCodePage());
66 }
67 break;
68 case 6:
69 curr->addString(code, reader->getUtf8String());
70 break;
71 case 7:
72 curr->addString(code, reader->getUtf8String());
73 break;
74 case 8:
75 curr->addString(code, reader->getUtf8String());
76 break;
77 case 10:
78 curr->addCoord(code, DRW_Coord(reader->getDouble(), 0.0, 0.0));
79 break;
80 case 20:
81 curr->setCoordY(reader->getDouble());
82 break;
83 case 30:
84 curr->setCoordZ(reader->getDouble());
85 break;
86 case 40:
87 curr->addDouble(code, reader->getDouble());
88 break;
89 case 50:
90 curr->addDouble(code, reader->getDouble());
91 break;
92 case 62:
93 curr->addInt(code, reader->getInt32());
94 break;
95 case 70:
96 curr->addInt(code, reader->getInt32());
97 break;
98 case 280:
99 curr->addInt(code, reader->getInt32());
100 break;
101 case 290:
102 curr->addInt(code, reader->getInt32());
103 break;
104 case 370:
105 curr->addInt(code, reader->getInt32());
106 break;
107 case 380:
108 curr->addInt(code, reader->getInt32());
109 break;
110 case 390:
111 curr->addString(code, reader->getUtf8String());
112 break;
113 default:
114 break;
115 }
116
117 return true;
118}
119
120void DRW_Header::write(const std::unique_ptr<dxfWriter>& writer, DRW::Version ver){
121/*RLZ: TODO complete all vars to AC1024*/
122 double varDouble;
123 int varInt;
124 std::string varStr;
125 DRW_Coord varCoord;
126 writer->writeString(2, "HEADER");
127 writer->writeString(9, "$ACADVER");
128 switch (ver) {
129 case DRW::AC1006: //unsupported version acad 10
130 case DRW::AC1009: //acad 11 & 12
131 varStr = "AC1009";
132 break;
133 case DRW::AC1012: //unsupported version acad 13
134 case DRW::AC1014: //acad 14
135 varStr = "AC1014";
136 break;
137 case DRW::AC1015: //acad 2000
138 varStr = "AC1015";
139 break;
140 case DRW::AC1018: //acad 2004
141 varStr = "AC1018";
142 break;
143/* case DRW::AC1021: //acad 2007
144 varStr = "AC1021";
145 break;*/
146 case DRW::AC1024: //acad 2010
147 varStr = "AC1024";
148 break;
149 case DRW::AC1027: //acad 2013
150 varStr = "AC1027";
151 break;
152 default: //acad 2007 default version
153 varStr = "AC1021";
154 break;
155 }
156 writer->writeString(1, varStr);
157 writer->setVersion(varStr, true);
158
159 getStr("$ACADVER", &varStr);
160 getStr("$ACADMAINTVER", &varStr);
161
162 if (!getStr("$DWGCODEPAGE", &varStr)) {
163 varStr = "ANSI_1252";
164 }
165 writer->writeString(9, "$DWGCODEPAGE");
166 writer->setCodePage(varStr);
167 writer->writeString(3, writer->getCodePage() );
168 writer->writeString(9, "$INSBASE");
169 if (getCoord("$INSBASE", &varCoord)) {
170 writer->writeDouble(10, varCoord.x);
171 writer->writeDouble(20, varCoord.y);
172 writer->writeDouble(30, varCoord.z);
173 } else {
174 writer->writeDouble(10, 0.0);
175 writer->writeDouble(20, 0.0);
176 writer->writeDouble(30, 0.0);
177 }
178 writer->writeString(9, "$EXTMIN");
179 if (getCoord("$EXTMIN", &varCoord)) {
180 writer->writeDouble(10, varCoord.x);
181 writer->writeDouble(20, varCoord.y);
182 writer->writeDouble(30, varCoord.z);
183 } else {
184 writer->writeDouble(10, 1.0000000000000000E+020);
185 writer->writeDouble(20, 1.0000000000000000E+020);
186 writer->writeDouble(30, 1.0000000000000000E+020);
187 }
188 writer->writeString(9, "$EXTMAX");
189 if (getCoord("$EXTMAX", &varCoord)) {
190 writer->writeDouble(10, varCoord.x);
191 writer->writeDouble(20, varCoord.y);
192 writer->writeDouble(30, varCoord.z);
193 } else {
194 writer->writeDouble(10, -1.0000000000000000E+020);
195 writer->writeDouble(20, -1.0000000000000000E+020);
196 writer->writeDouble(30, -1.0000000000000000E+020);
197 }
198 writer->writeString(9, "$LIMMIN");
199 if (getCoord("$LIMMIN", &varCoord)) {
200 writer->writeDouble(10, varCoord.x);
201 writer->writeDouble(20, varCoord.y);
202 } else {
203 writer->writeDouble(10, 0.0);
204 writer->writeDouble(20, 0.0);
205 }
206 writer->writeString(9, "$LIMMAX");
207 if (getCoord("$LIMMAX", &varCoord)) {
208 writer->writeDouble(10, varCoord.x);
209 writer->writeDouble(20, varCoord.y);
210 } else {
211 writer->writeDouble(10, 420.0);
212 writer->writeDouble(20, 297.0);
213 }
214 writer->writeString(9, "$ORTHOMODE");
215 if (getInt("$ORTHOMODE", &varInt))
216 writer->writeInt16(70, varInt);
217 else
218 writer->writeInt16(70, 0);
219 writer->writeString(9, "$REGENMODE");
220 if (getInt("$REGENMODE", &varInt))
221 writer->writeInt16(70, varInt);
222 else
223 writer->writeInt16(70, 1);
224 writer->writeString(9, "$FILLMODE");
225 if (getInt("$FILLMODE", &varInt))
226 writer->writeInt16(70, varInt);
227 else
228 writer->writeInt16(70, 1);
229 writer->writeString(9, "$QTEXTMODE");
230 if (getInt("$QTEXTMODE", &varInt))
231 writer->writeInt16(70, varInt);
232 else
233 writer->writeInt16(70, 0);
234 writer->writeString(9, "$MIRRTEXT");
235 if (getInt("$MIRRTEXT", &varInt))
236 writer->writeInt16(70, varInt);
237 else
238 writer->writeInt16(70, 0);
239 if (ver == DRW::AC1009){
240 writer->writeString(9, "$DRAGMODE");
241 if (getInt("$DRAGMODE", &varInt))
242 writer->writeInt16(70, varInt);
243 else
244 writer->writeInt16(70, 2);
245 }
246 writer->writeString(9, "$LTSCALE");
247 if (getDouble("$LTSCALE", &varDouble))
248 writer->writeDouble(40, varDouble);
249 else
250 writer->writeDouble(40, 1.0);
251 if (ver == DRW::AC1009){
252 writer->writeString(9, "$OSMODE");
253 if (getInt("$OSMODE", &varInt))
254 writer->writeInt16(70, varInt);
255 else
256 writer->writeInt16(70, 0);
257 }
258 writer->writeString(9, "$ATTMODE");
259 if (getInt("$ATTMODE", &varInt))
260 writer->writeInt16(70, varInt);
261 else
262 writer->writeInt16(70, 0);
263 writer->writeString(9, "$TEXTSIZE");
264 if (getDouble("$TEXTSIZE", &varDouble))
265 writer->writeDouble(40, varDouble);
266 else
267 writer->writeDouble(40, 2.5);
268 writer->writeString(9, "$TRACEWID");
269 if (getDouble("$TRACEWID", &varDouble))
270 writer->writeDouble(40, varDouble);
271 else
272 writer->writeDouble(40, 15.68);
273 writer->writeString(9, "$TEXTSTYLE");
274 if (getStr("$TEXTSTYLE", &varStr))
275 if (ver == DRW::AC1009)
276 writer->writeUtf8Caps(7, varStr);
277 else
278 writer->writeUtf8String(7, varStr);
279 else
280 writer->writeString(7, "STANDARD");
281 writer->writeString(9, "$CLAYER");
282 if (getStr("$CLAYER", &varStr))
283 if (ver == DRW::AC1009)
284 writer->writeUtf8Caps(8, varStr);
285 else
286 writer->writeUtf8String(8, varStr);
287 else
288 writer->writeString(8, "0");
289 writer->writeString(9, "$CELTYPE");
290 if (getStr("$CELTYPE", &varStr))
291 if (ver == DRW::AC1009)
292 writer->writeUtf8Caps(6, varStr);
293 else
294 writer->writeUtf8String(6, varStr);
295 else
296 writer->writeString(6, "BYLAYER");
297 writer->writeString(9, "$CECOLOR");
298 if (getInt("$CECOLOR", &varInt))
299 writer->writeInt16(62, varInt);
300 else
301 writer->writeInt16(62, 256);
302 if (ver > DRW::AC1009){
303 writer->writeString(9, "$CELTSCALE");
304 if (getDouble("$CELTSCALE", &varDouble))
305 writer->writeDouble(40, varDouble);
306 else
307 writer->writeDouble(40, 1.0);
308 writer->writeString(9, "$DISPSILH");
309 if (getInt("$DISPSILH", &varInt))
310 writer->writeInt16(70, varInt);
311 else
312 writer->writeInt16(70, 0);
313 }
314
315 writer->writeString(9, "$DIMSCALE");
316 if (getDouble("$DIMSCALE", &varDouble))
317 writer->writeDouble(40, varDouble);
318 else
319 writer->writeDouble(40, 2.5);
320 writer->writeString(9, "$DIMASZ");
321 if (getDouble("$DIMASZ", &varDouble))
322 writer->writeDouble(40, varDouble);
323 else
324 writer->writeDouble(40, 2.5);
325 writer->writeString(9, "$DIMEXO");
326 if (getDouble("$DIMEXO", &varDouble))
327 writer->writeDouble(40, varDouble);
328 else
329 writer->writeDouble(40, 0.625);
330 writer->writeString(9, "$DIMDLI");
331 if (getDouble("$DIMDLI", &varDouble))
332 writer->writeDouble(40, varDouble);
333 else
334 writer->writeDouble(40, 3.75);
335 writer->writeString(9, "$DIMRND");
336 if (getDouble("$DIMRND", &varDouble))
337 writer->writeDouble(40, varDouble);
338 else
339 writer->writeDouble(40, 0.0);
340 writer->writeString(9, "$DIMDLE");
341 if (getDouble("$DIMDLE", &varDouble))
342 writer->writeDouble(40, varDouble);
343 else
344 writer->writeDouble(40, 0.0);
345 writer->writeString(9, "$DIMEXE");
346 if (getDouble("$DIMEXE", &varDouble))
347 writer->writeDouble(40, varDouble);
348 else
349 writer->writeDouble(40, 1.25);
350 writer->writeString(9, "$DIMTP");
351 if (getDouble("$DIMTP", &varDouble))
352 writer->writeDouble(40, varDouble);
353 else
354 writer->writeDouble(40, 0.0);
355 writer->writeString(9, "$DIMTM");
356 if (getDouble("$DIMTM", &varDouble))
357 writer->writeDouble(40, varDouble);
358 else
359 writer->writeDouble(40, 0.0);
360 writer->writeString(9, "$DIMTXT");
361 if (getDouble("$DIMTXT", &varDouble))
362 writer->writeDouble(40, varDouble);
363 else
364 writer->writeDouble(40, 2.5);
365 writer->writeString(9, "$DIMCEN");
366 if (getDouble("$DIMCEN", &varDouble))
367 writer->writeDouble(40, varDouble);
368 else
369 writer->writeDouble(40, 2.5);
370 writer->writeString(9, "$DIMTSZ");
371 if (getDouble("$DIMTSZ", &varDouble))
372 writer->writeDouble(40, varDouble);
373 else
374 writer->writeDouble(40, 0.0);
375 writer->writeString(9, "$DIMTOL");
376 if (getInt("$DIMTOL", &varInt))
377 writer->writeInt16(70, varInt);
378 else
379 writer->writeInt16(70, 0);
380 writer->writeString(9, "$DIMLIM");
381 if (getInt("$DIMLIM", &varInt))
382 writer->writeInt16(70, varInt);
383 else
384 writer->writeInt16(70, 0);
385 writer->writeString(9, "$DIMTIH");
386 if (getInt("$DIMTIH", &varInt))
387 writer->writeInt16(70, varInt);
388 else
389 writer->writeInt16(70, 0);
390 writer->writeString(9, "$DIMTOH");
391 if (getInt("$DIMTOH", &varInt))
392 writer->writeInt16(70, varInt);
393 else
394 writer->writeInt16(70, 0);
395 writer->writeString(9, "$DIMSE1");
396 if (getInt("$DIMSE1", &varInt))
397 writer->writeInt16(70, varInt);
398 else
399 writer->writeInt16(70, 0);
400 writer->writeString(9, "$DIMSE2");
401 if (getInt("$DIMSE2", &varInt))
402 writer->writeInt16(70, varInt);
403 else
404 writer->writeInt16(70, 0);
405 writer->writeString(9, "$DIMTAD");
406 if (getInt("$DIMTAD", &varInt))
407 writer->writeInt16(70, varInt);
408 else
409 writer->writeInt16(70, 1);
410 writer->writeString(9, "$DIMZIN");
411 if (getInt("$DIMZIN", &varInt))
412 writer->writeInt16(70, varInt);
413 else
414 writer->writeInt16(70, 8);
415 writer->writeString(9, "$DIMBLK");
416 if (getStr("$DIMBLK", &varStr))
417 if (ver == DRW::AC1009)
418 writer->writeUtf8Caps(1, varStr);
419 else
420 writer->writeUtf8String(1, varStr);
421 else
422 writer->writeString(1, "");
423 writer->writeString(9, "$DIMASO");
424 if (getInt("$DIMASO", &varInt))
425 writer->writeInt16(70, varInt);
426 else
427 writer->writeInt16(70, 1);
428 writer->writeString(9, "$DIMSHO");
429 if (getInt("$DIMSHO", &varInt))
430 writer->writeInt16(70, varInt);
431 else
432 writer->writeInt16(70, 1);
433 writer->writeString(9, "$DIMPOST");
434 if (getStr("$DIMPOST", &varStr))
435 if (ver == DRW::AC1009)
436 writer->writeUtf8Caps(1, varStr);
437 else
438 writer->writeUtf8String(1, varStr);
439 else
440 writer->writeString(1, "");
441 writer->writeString(9, "$DIMAPOST");
442 if (getStr("$DIMAPOST", &varStr))
443 if (ver == DRW::AC1009)
444 writer->writeUtf8Caps(1, varStr);
445 else
446 writer->writeUtf8String(1, varStr);
447 else
448 writer->writeString(1, "");
449 writer->writeString(9, "$DIMALT");
450 if (getInt("$DIMALT", &varInt))
451 writer->writeInt16(70, varInt);
452 else
453 writer->writeInt16(70, 0);
454 writer->writeString(9, "$DIMALTD");
455 if (getInt("$DIMALTD", &varInt))
456 writer->writeInt16(70, varInt);
457 else
458 writer->writeInt16(70, 3);
459 writer->writeString(9, "$DIMALTF");
460 if (getDouble("$DIMALTF", &varDouble))
461 writer->writeDouble(40, varDouble);
462 else
463 writer->writeDouble(40, 0.03937);
464 writer->writeString(9, "$DIMLFAC");
465 if (getDouble("$DIMLFAC", &varDouble))
466 writer->writeDouble(40, varDouble);
467 else
468 writer->writeDouble(40, 1.0);
469 writer->writeString(9, "$DIMTOFL");
470 if (getInt("$DIMTOFL", &varInt))
471 writer->writeInt16(70, varInt);
472 else
473 writer->writeInt16(70, 1);
474 writer->writeString(9, "$DIMTVP");
475 if (getDouble("$DIMTVP", &varDouble))
476 writer->writeDouble(40, varDouble);
477 else
478 writer->writeDouble(40, 0.0);
479 writer->writeString(9, "$DIMTIX");
480 if (getInt("$DIMTIX", &varInt))
481 writer->writeInt16(70, varInt);
482 else
483 writer->writeInt16(70, 0);
484 writer->writeString(9, "$DIMSOXD");
485 if (getInt("$DIMSOXD", &varInt))
486 writer->writeInt16(70, varInt);
487 else
488 writer->writeInt16(70, 0);
489 writer->writeString(9, "$DIMSAH");
490 if (getInt("$DIMSAH", &varInt))
491 writer->writeInt16(70, varInt);
492 else
493 writer->writeInt16(70, 0);
494 writer->writeString(9, "$DIMBLK1");
495 if (getStr("$DIMBLK1", &varStr))
496 if (ver == DRW::AC1009)
497 writer->writeUtf8Caps(1, varStr);
498 else
499 writer->writeUtf8String(1, varStr);
500 else
501 writer->writeString(1, "");
502 writer->writeString(9, "$DIMBLK2");
503 if (getStr("$DIMBLK2", &varStr))
504 if (ver == DRW::AC1009)
505 writer->writeUtf8Caps(1, varStr);
506 else
507 writer->writeUtf8String(1, varStr);
508 else
509 writer->writeString(1, "");
510 writer->writeString(9, "$DIMSTYLE");
511 if (getStr("$DIMSTYLE", &varStr))
512 if (ver == DRW::AC1009)
513 writer->writeUtf8Caps(2, varStr);
514 else
515 writer->writeUtf8String(2, varStr);
516 else
517 writer->writeString(2, "STANDARD");
518 writer->writeString(9, "$DIMCLRD");
519 if (getInt("$DIMCLRD", &varInt))
520 writer->writeInt16(70, varInt);
521 else
522 writer->writeInt16(70, 0);
523 writer->writeString(9, "$DIMCLRE");
524 if (getInt("$DIMCLRE", &varInt))
525 writer->writeInt16(70, varInt);
526 else
527 writer->writeInt16(70, 0);
528 writer->writeString(9, "$DIMCLRT");
529 if (getInt("$DIMCLRT", &varInt))
530 writer->writeInt16(70, varInt);
531 else
532 writer->writeInt16(70, 0);
533 writer->writeString(9, "$DIMTFAC");
534 if (getDouble("$DIMTFAC", &varDouble))
535 writer->writeDouble(40, varDouble);
536 else
537 writer->writeDouble(40, 1.0);
538 writer->writeString(9, "$DIMGAP");
539 if (getDouble("$DIMGAP", &varDouble))
540 writer->writeDouble(40, varDouble);
541 else
542 writer->writeDouble(40, 0.625);
543 //post r12 dim vars
544 if (ver > DRW::AC1009) {
545 writer->writeString(9, "$DIMJUST");
546 if (getInt("$DIMJUST", &varInt))
547 writer->writeInt16(70, varInt);
548 else
549 writer->writeInt16(70, 0);
550 writer->writeString(9, "$DIMSD1");
551 if (getInt("$DIMSD1", &varInt))
552 writer->writeInt16(70, varInt);
553 else
554 writer->writeInt16(70, 0);
555 writer->writeString(9, "$DIMSD2");
556 if (getInt("$DIMSD2", &varInt))
557 writer->writeInt16(70, varInt);
558 else
559 writer->writeInt16(70, 0);
560 writer->writeString(9, "$DIMTOLJ");
561 if (getInt("$DIMTOLJ", &varInt))
562 writer->writeInt16(70, varInt);
563 else
564 writer->writeInt16(70, 0);
565 writer->writeString(9, "$DIMTZIN");
566 if (getInt("$DIMTZIN", &varInt))
567 writer->writeInt16(70, varInt);
568 else
569 writer->writeInt16(70, 8);
570 writer->writeString(9, "$DIMALTZ");
571 if (getInt("$DIMALTZ", &varInt))
572 writer->writeInt16(70, varInt);
573 else
574 writer->writeInt16(70, 0);
575 writer->writeString(9, "$DIMALTTZ");
576 if (getInt("$DIMALTTZ", &varInt))
577 writer->writeInt16(70, varInt);
578 else
579 writer->writeInt16(70, 0);
580 writer->writeString(9, "$DIMUPT");
581 if (getInt("$DIMUPT", &varInt))
582 writer->writeInt16(70, varInt);
583 else
584 writer->writeInt16(70, 0);
585 writer->writeString(9, "$DIMDEC");
586 if (getInt("$DIMDEC", &varInt))
587 writer->writeInt16(70, varInt);
588 else
589 writer->writeInt16(70, 2);
590 writer->writeString(9, "$DIMTDEC");
591 if (getInt("$DIMTDEC", &varInt))
592 writer->writeInt16(70, varInt);
593 else
594 writer->writeInt16(70, 2);
595 writer->writeString(9, "$DIMALTU");
596 if (getInt("$DIMALTU", &varInt))
597 writer->writeInt16(70, varInt);
598 else
599 writer->writeInt16(70, 2);
600 writer->writeString(9, "$DIMALTTD");
601 if (getInt("$DIMALTTD", &varInt))
602 writer->writeInt16(70, varInt);
603 else
604 writer->writeInt16(70, 3);
605 writer->writeString(9, "$DIMTXSTY");
606 if (getStr("$DIMTXSTY", &varStr))
607 if (ver == DRW::AC1009)
608 writer->writeUtf8Caps(7, varStr);
609 else
610 writer->writeUtf8String(7, varStr);
611 else
612 writer->writeString(7, "STANDARD");
613 writer->writeString(9, "$DIMAUNIT");
614 if (getInt("$DIMAUNIT", &varInt))
615 writer->writeInt16(70, varInt);
616 else
617 writer->writeInt16(70, 0);
618 writer->writeString(9, "$DIMADEC");
619 if (getInt("$DIMADEC", &varInt))
620 writer->writeInt16(70, varInt);
621 else
622 writer->writeInt16(70, 0);
623 writer->writeString(9, "$DIMALTRND");
624 if (getDouble("$DIMALTRND", &varDouble))
625 writer->writeDouble(40, varDouble);
626 else
627 writer->writeDouble(40, 0.0);
628 writer->writeString(9, "$DIMAZIN");
629 if (getInt("$DIMAZIN", &varInt))
630 writer->writeInt16(70, varInt);
631 else
632 writer->writeInt16(70, 0);
633 writer->writeString(9, "$DIMDSEP");
634 if (getInt("$DIMDSEP", &varInt))
635 writer->writeInt16(70, varInt);
636 else
637 writer->writeInt16(70, 44);
638 writer->writeString(9, "$DIMATFIT");
639 if (getInt("$DIMATFIT", &varInt))
640 writer->writeInt16(70, varInt);
641 else
642 writer->writeInt16(70, 3);
643 writer->writeString(9, "$DIMFRAC");
644 if (getInt("$DIMFRAC", &varInt))
645 writer->writeInt16(70, varInt);
646 else
647 writer->writeInt16(70, 0);
648 writer->writeString(9, "$DIMLDRBLK");
649 if (getStr("$DIMLDRBLK", &varStr))
650 if (ver == DRW::AC1009)
651 writer->writeUtf8Caps(1, varStr);
652 else
653 writer->writeUtf8String(1, varStr);
654 else
655 writer->writeString(1, "STANDARD");
656 //verify if exist "$DIMLUNIT" or obsolete "$DIMUNIT" (pre v2000)
657 if ( !getInt("$DIMLUNIT", &varInt) ){
658 if (!getInt("$DIMUNIT", &varInt))
659 varInt = 2;
660 }
661 //verify valid values from 1 to 6
662 if (varInt<1 || varInt>6)
663 varInt = 2;
664 if (ver > DRW::AC1014) {
665 writer->writeString(9, "$DIMLUNIT");
666 writer->writeInt16(70, varInt);
667 } else {
668 writer->writeString(9, "$DIMUNIT");
669 writer->writeInt16(70, varInt);
670 }
671 writer->writeString(9, "$DIMLWD");
672 if (getInt("$DIMLWD", &varInt))
673 writer->writeInt16(70, varInt);
674 else
675 writer->writeInt16(70, -2);
676 writer->writeString(9, "$DIMLWE");
677 if (getInt("$DIMLWE", &varInt))
678 writer->writeInt16(70, varInt);
679 else
680 writer->writeInt16(70, -2);
681 writer->writeString(9, "$DIMTMOVE");
682 if (getInt("$DIMTMOVE", &varInt))
683 writer->writeInt16(70, varInt);
684 else
685 writer->writeInt16(70, 0);
686
687 if (ver > DRW::AC1018) {// and post v2004 dim vars
688 writer->writeString(9, "$DIMFXL");
689 if (getDouble("$DIMFXL", &varDouble))
690 writer->writeDouble(40, varDouble);
691 else
692 writer->writeDouble(40, 1.0);
693 writer->writeString(9, "$DIMFXLON");
694 if (getInt("$DIMFXLON", &varInt))
695 writer->writeInt16(70, varInt);
696 else
697 writer->writeInt16(70, 0);
698 writer->writeString(9, "$DIMJOGANG");
699 if (getDouble("$DIMJOGANG", &varDouble))
700 writer->writeDouble(40, varDouble);
701 else
702 writer->writeDouble(40, 0.7854);
703 writer->writeString(9, "$DIMTFILL");
704 if (getInt("$DIMTFILL", &varInt))
705 writer->writeInt16(70, varInt);
706 else
707 writer->writeInt16(70, 0);
708 writer->writeString(9, "$DIMTFILLCLR");
709 if (getInt("$DIMTFILLCLR", &varInt))
710 writer->writeInt16(70, varInt);
711 else
712 writer->writeInt16(70, 0);
713 writer->writeString(9, "$DIMARCSYM");
714 if (getInt("$DIMARCSYM", &varInt))
715 writer->writeInt16(70, varInt);
716 else
717 writer->writeInt16(70, 0);
718 writer->writeString(9, "$DIMLTYPE");
719 if (getStr("$DIMLTYPE", &varStr))
720 if (ver == DRW::AC1009)
721 writer->writeUtf8Caps(6, varStr);
722 else
723 writer->writeUtf8String(6, varStr);
724 else
725 writer->writeString(6, "");
726 writer->writeString(9, "$DIMLTEX1");
727 if (getStr("$DIMLTEX1", &varStr))
728 if (ver == DRW::AC1009)
729 writer->writeUtf8Caps(6, varStr);
730 else
731 writer->writeUtf8String(6, varStr);
732 else
733 writer->writeString(6, "");
734 writer->writeString(9, "$DIMLTEX2");
735 if (getStr("$DIMLTEX2", &varStr))
736 if (ver == DRW::AC1009)
737 writer->writeUtf8Caps(6, varStr);
738 else
739 writer->writeUtf8String(6, varStr);
740 else
741 writer->writeString(6, "");
742 if (ver > DRW::AC1021) {// and post v2007 dim vars
743 writer->writeString(9, "$DIMTXTDIRECTION");
744 if (getInt("$DIMTXTDIRECTION", &varInt))
745 writer->writeInt16(70, varInt);
746 else
747 writer->writeInt16(70, 0);
748 }
749 }// end post v2004 dim vars
750 }//end post r12 dim vars
751
752 writer->writeString(9, "$LUNITS");
753 if (getInt("$LUNITS", &varInt))
754 writer->writeInt16(70, varInt);
755 else
756 writer->writeInt16(70, 2);
757 writer->writeString(9, "$LUPREC");
758 if (getInt("$LUPREC", &varInt))
759 writer->writeInt16(70, varInt);
760 else
761 writer->writeInt16(70, 4);
762 writer->writeString(9, "$SKETCHINC");
763 if (getDouble("$SKETCHINC", &varDouble))
764 writer->writeDouble(40, varDouble);
765 else
766 writer->writeDouble(40, 1.0);
767 writer->writeString(9, "$FILLETRAD");
768 if (getDouble("$FILLETRAD", &varDouble))
769 writer->writeDouble(40, varDouble);
770 else
771 writer->writeDouble(40, 0.0);
772 writer->writeString(9, "$AUNITS");
773 if (getInt("$AUNITS", &varInt))
774 writer->writeInt16(70, varInt);
775 else
776 writer->writeInt16(70, 0);
777 writer->writeString(9, "$AUPREC");
778 if (getInt("$AUPREC", &varInt))
779 writer->writeInt16(70, varInt);
780 else
781 writer->writeInt16(70, 2);
782 writer->writeString(9, "$MENU");
783 if (getStr("$MENU", &varStr))
784 if (ver == DRW::AC1009)
785 writer->writeUtf8Caps(1, varStr);
786 else
787 writer->writeUtf8String(1, varStr);
788 else
789 writer->writeString(1, ".");
790 writer->writeString(9, "$ELEVATION");
791 if (getDouble("$ELEVATION", &varDouble))
792 writer->writeDouble(40, varDouble);
793 else
794 writer->writeDouble(40, 0.0);
795 writer->writeString(9, "$PELEVATION");
796 if (getDouble("$PELEVATION", &varDouble))
797 writer->writeDouble(40, varDouble);
798 else
799 writer->writeDouble(40, 0.0);
800 writer->writeString(9, "$THICKNESS");
801 if (getDouble("$THICKNESS", &varDouble))
802 writer->writeDouble(40, varDouble);
803 else
804 writer->writeDouble(40, 0.0);
805 writer->writeString(9, "$LIMCHECK");
806 if (getInt("$LIMCHECK", &varInt))
807 writer->writeInt16(70, varInt);
808 else
809 writer->writeInt16(70, 0);
810 if (ver < DRW::AC1015) {
811 writer->writeString(9, "$BLIPMODE");
812 if (getInt("$BLIPMODE", &varInt))
813 writer->writeInt16(70, varInt);
814 else
815 writer->writeInt16(70, 0);
816 }
817 writer->writeString(9, "$CHAMFERA");
818 if (getDouble("$CHAMFERA", &varDouble))
819 writer->writeDouble(40, varDouble);
820 else
821 writer->writeDouble(40, 0.0);
822 writer->writeString(9, "$CHAMFERB");
823 if (getDouble("$CHAMFERB", &varDouble))
824 writer->writeDouble(40, varDouble);
825 else
826 writer->writeDouble(40, 0.0);
827 if (ver > DRW::AC1009) {
828 writer->writeString(9, "$CHAMFERC");
829 if (getDouble("$CHAMFERC", &varDouble))
830 writer->writeDouble(40, varDouble);
831 else
832 writer->writeDouble(40, 0.0);
833 writer->writeString(9, "$CHAMFERD");
834 if (getDouble("$CHAMFERD", &varDouble))
835 writer->writeDouble(40, varDouble);
836 else
837 writer->writeDouble(40, 0.0);
838 }
839 writer->writeString(9, "$SKPOLY");
840 if (getInt("$SKPOLY", &varInt)) {
841 writer->writeInt16(70, varInt);
842 } else
843 writer->writeInt16(70, 0);
844 //rlz: todo, times
845 writer->writeString(9, "$USRTIMER");
846 if (getInt("$USRTIMER", &varInt)) {
847 writer->writeInt16(70, varInt);
848 } else
849 writer->writeInt16(70, 1);
850 writer->writeString(9, "$ANGBASE");
851 if (getDouble("$ANGBASE", &varDouble))
852 writer->writeDouble(50, varDouble);
853 else
854 writer->writeDouble(50, 0.0);
855 writer->writeString(9, "$ANGDIR");
856 if (getInt("$ANGDIR", &varInt)) {
857 writer->writeInt16(70, varInt);
858 } else
859 writer->writeInt16(70, 0);
860 writer->writeString(9, "$PDMODE");
861 if (getInt("$PDMODE", &varInt)) {
862 writer->writeInt16(70, varInt);
863 } else
864 writer->writeInt16(70, 34);
865 writer->writeString(9, "$PDSIZE");
866 if (getDouble("$PDSIZE", &varDouble))
867 writer->writeDouble(40, varDouble);
868 else
869 writer->writeDouble(40, 0.0);
870 writer->writeString(9, "$PLINEWID");
871 if (getDouble("$PLINEWID", &varDouble))
872 writer->writeDouble(40, varDouble);
873 else
874 writer->writeDouble(40, 0.0);
875 if (ver < DRW::AC1012) {
876 writer->writeString(9, "$COORDS");
877 if (getInt("$COORDS", &varInt)) {
878 writer->writeInt16(70, varInt);
879 } else
880 writer->writeInt16(70, 2);
881 }
882 writer->writeString(9, "$SPLFRAME");
883 if (getInt("$SPLFRAME", &varInt)) {
884 writer->writeInt16(70, varInt);
885 } else
886 writer->writeInt16(70, 0);
887 writer->writeString(9, "$SPLINETYPE");
888 if (getInt("$SPLINETYPE", &varInt)) {
889 writer->writeInt16(70, varInt);
890 } else
891 writer->writeInt16(70, 2);
892 writer->writeString(9, "$SPLINESEGS");
893 if (getInt("$SPLINESEGS", &varInt)) {
894 writer->writeInt16(70, varInt);
895 } else
896 writer->writeInt16(70, 8);
897 if (ver < DRW::AC1012) {
898 writer->writeString(9, "$ATTDIA");
899 if (getInt("$ATTDIA", &varInt)) {
900 writer->writeInt16(70, varInt);
901 } else
902 writer->writeInt16(70, 1);
903 writer->writeString(9, "$ATTREQ");
904 if (getInt("$ATTREQ", &varInt)) {
905 writer->writeInt16(70, varInt);
906 } else
907 writer->writeInt16(70, 1);
908 writer->writeString(9, "$HANDLING");
909 if (getInt("$HANDLING", &varInt)) {
910 writer->writeInt16(70, varInt);
911 } else
912 writer->writeInt16(70, 1);
913 }
914 writer->writeString(9, "$HANDSEED");
915 //RLZ dxfHex(5, 0xFFFF);
916 writer->writeString(5, "20000");
917 writer->writeString(9, "$SURFTAB1");
918 if (getInt("$SURFTAB1", &varInt)) {
919 writer->writeInt16(70, varInt);
920 } else
921 writer->writeInt16(70, 6);
922 writer->writeString(9, "$SURFTAB2");
923 if (getInt("$SURFTAB2", &varInt)) {
924 writer->writeInt16(70, varInt);
925 } else
926 writer->writeInt16(70, 6);
927 writer->writeString(9, "$SURFTYPE");
928 if (getInt("$SURFTYPE", &varInt)) {
929 writer->writeInt16(70, varInt);
930 } else
931 writer->writeInt16(70, 6);
932 writer->writeString(9, "$SURFU");
933 if (getInt("$SURFU", &varInt)) {
934 writer->writeInt16(70, varInt);
935 } else
936 writer->writeInt16(70, 6);
937 writer->writeString(9, "$SURFV");
938 if (getInt("$SURFV", &varInt)) {
939 writer->writeInt16(70, varInt);
940 } else
941 writer->writeInt16(70, 6);
942 if (ver > DRW::AC1009) {
943 writer->writeString(9, "$UCSBASE");
944 if (getStr("$UCSBASE", &varStr))
945 if (ver == DRW::AC1009)
946 writer->writeUtf8Caps(2, varStr);
947 else
948 writer->writeUtf8String(2, varStr);
949 else
950 writer->writeString(2, "");
951}
952 writer->writeString(9, "$UCSNAME");
953 if (getStr("$UCSNAME", &varStr))
954 if (ver == DRW::AC1009)
955 writer->writeUtf8Caps(2, varStr);
956 else
957 writer->writeUtf8String(2, varStr);
958 else
959 writer->writeString(2, "");
960 writer->writeString(9, "$UCSORG");
961 if (getCoord("$UCSORG", &varCoord)) {
962 writer->writeDouble(10, varCoord.x);
963 writer->writeDouble(20, varCoord.y);
964 writer->writeDouble(30, varCoord.z);
965 } else {
966 writer->writeDouble(10, 0.0);
967 writer->writeDouble(20, 0.0);
968 writer->writeDouble(30, 0.0);
969 }
970 writer->writeString(9, "$UCSXDIR");
971 if (getCoord("$UCSXDIR", &varCoord)) {
972 writer->writeDouble(10, varCoord.x);
973 writer->writeDouble(20, varCoord.y);
974 writer->writeDouble(30, varCoord.z);
975 } else {
976 writer->writeDouble(10, 1.0);
977 writer->writeDouble(20, 0.0);
978 writer->writeDouble(30, 0.0);
979 }
980 writer->writeString(9, "$UCSYDIR");
981 if (getCoord("$UCSYDIR", &varCoord)) {
982 writer->writeDouble(10, varCoord.x);
983 writer->writeDouble(20, varCoord.y);
984 writer->writeDouble(30, varCoord.z);
985 } else {
986 writer->writeDouble(10, 0.0);
987 writer->writeDouble(20, 1.0);
988 writer->writeDouble(30, 0.0);
989 }
990 if (ver > DRW::AC1009) { //begin post r12 UCS vars
991 writer->writeString(9, "$UCSORTHOREF");
992 if (getStr("$UCSORTHOREF", &varStr))
993 if (ver == DRW::AC1009)
994 writer->writeUtf8Caps(2, varStr);
995 else
996 writer->writeUtf8String(2, varStr);
997 else
998 writer->writeString(2, "");
999 writer->writeString(9, "$UCSORTHOVIEW");
1000 if (getInt("$UCSORTHOVIEW", &varInt))
1001 writer->writeInt16(70, varInt);
1002 else
1003 writer->writeInt16(70, 0);
1004 writer->writeString(9, "$UCSORGTOP");
1005 if (getCoord("$UCSORGTOP", &varCoord)) {
1006 writer->writeDouble(10, varCoord.x);
1007 writer->writeDouble(20, varCoord.y);
1008 writer->writeDouble(30, varCoord.z);
1009 } else {
1010 writer->writeDouble(10, 0.0);
1011 writer->writeDouble(20, 0.0);
1012 writer->writeDouble(30, 0.0);
1013 }
1014 writer->writeString(9, "$UCSORGBOTTOM");
1015 if (getCoord("$UCSORGBOTTOM", &varCoord)) {
1016 writer->writeDouble(10, varCoord.x);
1017 writer->writeDouble(20, varCoord.y);
1018 writer->writeDouble(30, varCoord.z);
1019 } else {
1020 writer->writeDouble(10, 0.0);
1021 writer->writeDouble(20, 0.0);
1022 writer->writeDouble(30, 0.0);
1023 }
1024 writer->writeString(9, "$UCSORGLEFT");
1025 if (getCoord("$UCSORGLEFT", &varCoord)) {
1026 writer->writeDouble(10, varCoord.x);
1027 writer->writeDouble(20, varCoord.y);
1028 writer->writeDouble(30, varCoord.z);
1029 } else {
1030 writer->writeDouble(10, 0.0);
1031 writer->writeDouble(20, 0.0);
1032 writer->writeDouble(30, 0.0);
1033 }
1034 writer->writeString(9, "$UCSORGRIGHT");
1035 if (getCoord("$UCSORGRIGHT", &varCoord)) {
1036 writer->writeDouble(10, varCoord.x);
1037 writer->writeDouble(20, varCoord.y);
1038 writer->writeDouble(30, varCoord.z);
1039 } else {
1040 writer->writeDouble(10, 0.0);
1041 writer->writeDouble(20, 0.0);
1042 writer->writeDouble(30, 0.0);
1043 }
1044 writer->writeString(9, "$UCSORGFRONT");
1045 if (getCoord("$UCSORGFRONT", &varCoord)) {
1046 writer->writeDouble(10, varCoord.x);
1047 writer->writeDouble(20, varCoord.y);
1048 writer->writeDouble(30, varCoord.z);
1049 } else {
1050 writer->writeDouble(10, 0.0);
1051 writer->writeDouble(20, 0.0);
1052 writer->writeDouble(30, 0.0);
1053 }
1054 writer->writeString(9, "$UCSORGBACK");
1055 if (getCoord("$UCSORGBACK", &varCoord)) {
1056 writer->writeDouble(10, varCoord.x);
1057 writer->writeDouble(20, varCoord.y);
1058 writer->writeDouble(30, varCoord.z);
1059 } else {
1060 writer->writeDouble(10, 0.0);
1061 writer->writeDouble(20, 0.0);
1062 writer->writeDouble(30, 0.0);
1063 }
1064 writer->writeString(9, "$PUCSBASE");
1065 if (getStr("$PUCSBASE", &varStr))
1066 if (ver == DRW::AC1009)
1067 writer->writeUtf8Caps(2, varStr);
1068 else
1069 writer->writeUtf8String(2, varStr);
1070 else
1071 writer->writeString(2, "");
1072 } //end post r12 UCS vars
1073 writer->writeString(9, "$PUCSNAME");
1074 if (getStr("$PUCSNAME", &varStr))
1075 if (ver == DRW::AC1009)
1076 writer->writeUtf8Caps(2, varStr);
1077 else
1078 writer->writeUtf8String(2, varStr);
1079 else
1080 writer->writeString(2, "");
1081 writer->writeString(9, "$PUCSORG");
1082 if (getCoord("$PUCSORG", &varCoord)) {
1083 writer->writeDouble(10, varCoord.x);
1084 writer->writeDouble(20, varCoord.y);
1085 writer->writeDouble(30, varCoord.z);
1086 } else {
1087 writer->writeDouble(10, 0.0);
1088 writer->writeDouble(20, 0.0);
1089 writer->writeDouble(30, 0.0);
1090 }
1091 writer->writeString(9, "$PUCSXDIR");
1092 if (getCoord("$PUCSXDIR", &varCoord)) {
1093 writer->writeDouble(10, varCoord.x);
1094 writer->writeDouble(20, varCoord.y);
1095 writer->writeDouble(30, varCoord.z);
1096 } else {
1097 writer->writeDouble(10, 1.0);
1098 writer->writeDouble(20, 0.0);
1099 writer->writeDouble(30, 0.0);
1100 }
1101 writer->writeString(9, "$PUCSYDIR");
1102 if (getCoord("$PUCSYDIR", &varCoord)) {
1103 writer->writeDouble(10, varCoord.x);
1104 writer->writeDouble(20, varCoord.y);
1105 writer->writeDouble(30, varCoord.z);
1106 } else {
1107 writer->writeDouble(10, 0.0);
1108 writer->writeDouble(20, 1.0);
1109 writer->writeDouble(30, 0.0);
1110 }
1111 if (ver > DRW::AC1009) { //begin post r12 PUCS vars
1112 writer->writeString(9, "$PUCSORTHOREF");
1113 if (getStr("$PUCSORTHOREF", &varStr))
1114 if (ver == DRW::AC1009)
1115 writer->writeUtf8Caps(2, varStr);
1116 else
1117 writer->writeUtf8String(2, varStr);
1118 else
1119 writer->writeString(2, "");
1120 writer->writeString(9, "$PUCSORTHOVIEW");
1121 if (getInt("$PUCSORTHOVIEW", &varInt))
1122 writer->writeInt16(70, varInt);
1123 else
1124 writer->writeInt16(70, 0);
1125 writer->writeString(9, "$PUCSORGTOP");
1126 if (getCoord("$PUCSORGTOP", &varCoord)) {
1127 writer->writeDouble(10, varCoord.x);
1128 writer->writeDouble(20, varCoord.y);
1129 writer->writeDouble(30, varCoord.z);
1130 } else {
1131 writer->writeDouble(10, 0.0);
1132 writer->writeDouble(20, 0.0);
1133 writer->writeDouble(30, 0.0);
1134 }
1135 writer->writeString(9, "$PUCSORGBOTTOM");
1136 if (getCoord("$PUCSORGBOTTOM", &varCoord)) {
1137 writer->writeDouble(10, varCoord.x);
1138 writer->writeDouble(20, varCoord.y);
1139 writer->writeDouble(30, varCoord.z);
1140 } else {
1141 writer->writeDouble(10, 0.0);
1142 writer->writeDouble(20, 0.0);
1143 writer->writeDouble(30, 0.0);
1144 }
1145 writer->writeString(9, "$PUCSORGLEFT");
1146 if (getCoord("$PUCSORGLEFT", &varCoord)) {
1147 writer->writeDouble(10, varCoord.x);
1148 writer->writeDouble(20, varCoord.y);
1149 writer->writeDouble(30, varCoord.z);
1150 } else {
1151 writer->writeDouble(10, 0.0);
1152 writer->writeDouble(20, 0.0);
1153 writer->writeDouble(30, 0.0);
1154 }
1155 writer->writeString(9, "$PUCSORGRIGHT");
1156 if (getCoord("$PUCSORGRIGHT", &varCoord)) {
1157 writer->writeDouble(10, varCoord.x);
1158 writer->writeDouble(20, varCoord.y);
1159 writer->writeDouble(30, varCoord.z);
1160 } else {
1161 writer->writeDouble(10, 0.0);
1162 writer->writeDouble(20, 0.0);
1163 writer->writeDouble(30, 0.0);
1164 }
1165 writer->writeString(9, "$PUCSORGFRONT");
1166 if (getCoord("$PUCSORGFRONT", &varCoord)) {
1167 writer->writeDouble(10, varCoord.x);
1168 writer->writeDouble(20, varCoord.y);
1169 writer->writeDouble(30, varCoord.z);
1170 } else {
1171 writer->writeDouble(10, 0.0);
1172 writer->writeDouble(20, 0.0);
1173 writer->writeDouble(30, 0.0);
1174 }
1175 writer->writeString(9, "$PUCSORGBACK");
1176 if (getCoord("$PUCSORGBACK", &varCoord)) {
1177 writer->writeDouble(10, varCoord.x);
1178 writer->writeDouble(20, varCoord.y);
1179 writer->writeDouble(30, varCoord.z);
1180 } else {
1181 writer->writeDouble(10, 0.0);
1182 writer->writeDouble(20, 0.0);
1183 writer->writeDouble(30, 0.0);
1184 }
1185 } //end post r12 PUCS vars
1186
1187 writer->writeString(9, "$USERI1");
1188 if (getInt("$USERI1", &varInt))
1189 writer->writeInt16(70, varInt);
1190 else
1191 writer->writeInt16(70, 0);
1192 writer->writeString(9, "$USERI2");
1193 if (getInt("$USERI2", &varInt))
1194 writer->writeInt16(70, varInt);
1195 else
1196 writer->writeInt16(70, 0);
1197 writer->writeString(9, "$USERI3");
1198 if (getInt("$USERI3", &varInt))
1199 writer->writeInt16(70, varInt);
1200 else
1201 writer->writeInt16(70, 0);
1202 writer->writeString(9, "$USERI4");
1203 if (getInt("$USERI4", &varInt))
1204 writer->writeInt16(70, varInt);
1205 else
1206 writer->writeInt16(70, 0);
1207 writer->writeString(9, "$USERI5");
1208 if (getInt("$USERI5", &varInt))
1209 writer->writeInt16(70, varInt);
1210 else
1211 writer->writeInt16(70, 0);
1212 writer->writeString(9, "$USERR1");
1213 if (getDouble("$USERR1", &varDouble))
1214 writer->writeDouble(40, varDouble);
1215 else
1216 writer->writeDouble(40, 0.0);
1217 writer->writeString(9, "$USERR2");
1218 if (getDouble("$USERR2", &varDouble))
1219 writer->writeDouble(40, varDouble);
1220 else
1221 writer->writeDouble(40, 0.0);
1222 writer->writeString(9, "$USERR3");
1223 if (getDouble("$USERR3", &varDouble))
1224 writer->writeDouble(40, varDouble);
1225 else
1226 writer->writeDouble(40, 0.0);
1227 writer->writeString(9, "$USERR4");
1228 if (getDouble("$USERR4", &varDouble))
1229 writer->writeDouble(40, varDouble);
1230 else
1231 writer->writeDouble(40, 0.0);
1232 writer->writeString(9, "$USERR5");
1233 if (getDouble("$USERR5", &varDouble))
1234 writer->writeDouble(40, varDouble);
1235 else
1236 writer->writeDouble(40, 0.0);
1237 writer->writeString(9, "$WORLDVIEW");
1238 if (getInt("$WORLDVIEW", &varInt))
1239 writer->writeInt16(70, varInt);
1240 else
1241 writer->writeInt16(70, 1);
1242 writer->writeString(9, "$SHADEDGE");
1243 if (getInt("$SHADEDGE", &varInt))
1244 writer->writeInt16(70, varInt);
1245 else
1246 writer->writeInt16(70, 3);
1247 writer->writeString(9, "$SHADEDIF");
1248 if (getInt("$SHADEDIF", &varInt))
1249 writer->writeInt16(70, varInt);
1250 else
1251 writer->writeInt16(70, 70);
1252 writer->writeString(9, "$TILEMODE");
1253 if (getInt("$TILEMODE", &varInt))
1254 writer->writeInt16(70, varInt);
1255 else
1256 writer->writeInt16(70, 1);
1257 writer->writeString(9, "$MAXACTVP");
1258 if (getInt("$MAXACTVP", &varInt))
1259 writer->writeInt16(70, varInt);
1260 else
1261 writer->writeInt16(70, 64);
1262 if (ver > DRW::AC1009) { //begin post r12 PUCS vars
1263 writer->writeString(9, "$PINSBASE");
1264 if (getCoord("$PINSBASE", &varCoord)) {
1265 writer->writeDouble(10, varCoord.x);
1266 writer->writeDouble(20, varCoord.y);
1267 writer->writeDouble(30, varCoord.z);
1268 } else {
1269 writer->writeDouble(10, 0.0);
1270 writer->writeDouble(20, 0.0);
1271 writer->writeDouble(30, 0.0);
1272 }
1273 }
1274 writer->writeString(9, "$PLIMCHECK");
1275 if (getInt("$PLIMCHECK", &varInt))
1276 writer->writeInt16(70, varInt);
1277 else
1278 writer->writeInt16(70, 0);
1279 writer->writeString(9, "$PEXTMIN");
1280 if (getCoord("$PEXTMIN", &varCoord)) {
1281 writer->writeDouble(10, varCoord.x);
1282 writer->writeDouble(20, varCoord.y);
1283 writer->writeDouble(30, varCoord.z);
1284 } else {
1285 writer->writeDouble(10, 0.0);
1286 writer->writeDouble(20, 0.0);
1287 writer->writeDouble(30, 0.0);
1288 }
1289 writer->writeString(9, "$PEXTMAX");
1290 if (getCoord("$PEXTMAX", &varCoord)) {
1291 writer->writeDouble(10, varCoord.x);
1292 writer->writeDouble(20, varCoord.y);
1293 writer->writeDouble(30, varCoord.z);
1294 } else {
1295 writer->writeDouble(10, 0.0);
1296 writer->writeDouble(20, 0.0);
1297 writer->writeDouble(30, 0.0);
1298 }
1299
1300/* RLZ: moved to active VPORT, but can write in header if present*/
1301 if (getInt("$GRIDMODE", &varInt)) {
1302 writer->writeString(9, "$GRIDMODE");
1303 writer->writeInt16(70, varInt);
1304 }
1305 if (getInt("$SNAPSTYLE", &varInt)) {
1306 writer->writeString(9, "$SNAPSTYLE");
1307 writer->writeInt16(70, varInt);
1308 }
1309 if (getCoord("$GRIDUNIT", &varCoord)) {
1310 writer->writeString(9, "$GRIDUNIT");
1311 writer->writeDouble(10, varCoord.x);
1312 writer->writeDouble(20, varCoord.y);
1313 }
1314 if (getCoord("$VIEWCTR", &varCoord)) {
1315 writer->writeString(9, "$VIEWCTR");
1316 writer->writeDouble(10, varCoord.x);
1317 writer->writeDouble(20, varCoord.y);
1318 }
1319/* RLZ: moved to active VPORT, but can write in header if present*/
1320
1321 writer->writeString(9, "$PLIMMIN");
1322 if (getCoord("$PLIMMIN", &varCoord)) {
1323 writer->writeDouble(10, varCoord.x);
1324 writer->writeDouble(20, varCoord.y);
1325 } else {
1326 writer->writeDouble(10, 0.0);
1327 writer->writeDouble(20, 0.0);
1328 }
1329 writer->writeString(9, "$PLIMMAX");
1330 if (getCoord("$PLIMMAX", &varCoord)) {
1331 writer->writeDouble(10, varCoord.x);
1332 writer->writeDouble(20, varCoord.y);
1333 } else {
1334 writer->writeDouble(10, 297.0);
1335 writer->writeDouble(20, 210.0);
1336 }
1337 writer->writeString(9, "$UNITMODE");
1338 if (getInt("$UNITMODE", &varInt))
1339 writer->writeInt16(70, varInt);
1340 else
1341 writer->writeInt16(70, 0);
1342 writer->writeString(9, "$VISRETAIN");
1343 if (getInt("$VISRETAIN", &varInt))
1344 writer->writeInt16(70, varInt);
1345 else
1346 writer->writeInt16(70, 1);
1347 writer->writeString(9, "$PLINEGEN");
1348 if (getInt("$PLINEGEN", &varInt))
1349 writer->writeInt16(70, varInt);
1350 else
1351 writer->writeInt16(70, 0);
1352 writer->writeString(9, "$PSLTSCALE");
1353 if (getInt("$PSLTSCALE", &varInt))
1354 writer->writeInt16(70, varInt);
1355 else
1356 writer->writeInt16(70, 1);
1357 if (ver > DRW::AC1009){//start port r12 vars
1358 writer->writeString(9, "$TREEDEPTH");
1359 if (getInt("$TREEDEPTH", &varInt))
1360 writer->writeInt16(70, varInt);
1361 else
1362 writer->writeInt16(70, 3020);
1363 writer->writeString(9, "$CMLSTYLE");
1364 if (getStr("$CMLSTYLE", &varStr))
1365 if (ver == DRW::AC1009)
1366 writer->writeUtf8Caps(2, varStr);
1367 else
1368 writer->writeUtf8String(2, varStr);
1369 else
1370 writer->writeString(2, "Standard");
1371 writer->writeString(9, "$CMLJUST");
1372 if (getInt("$CMLJUST", &varInt))
1373 writer->writeInt16(70, varInt);
1374 else
1375 writer->writeInt16(70, 0);
1376 writer->writeString(9, "$CMLSCALE");
1377 if (getDouble("$CMLSCALE", &varDouble))
1378 writer->writeDouble(40, varDouble);
1379 else
1380 writer->writeDouble(40, 20.0);
1381 writer->writeString(9, "$PROXYGRAPHICS");
1382 if (getInt("$PROXYGRAPHICS", &varInt))
1383 writer->writeInt16(70, varInt);
1384 else
1385 writer->writeInt16(70, 1);
1386 int insunits {Units::None};
1387 getInt("$INSUNITS", &insunits); // get $INSUNITS now to evaluate $MEASUREMENT
1388 getInt("$MEASUREMENT", &varInt); // just remove the variable from list
1389 writer->writeString(9, "$MEASUREMENT");
1390 writer->writeInt16(70, measurement( insunits));
1391 writer->writeString(9, "$CELWEIGHT");
1392 if (getInt("$CELWEIGHT", &varInt))
1393 writer->writeInt16(370, varInt);
1394 else
1395 writer->writeInt16(370, -1);
1396 writer->writeString(9, "$ENDCAPS");
1397 if (getInt("$ENDCAPS", &varInt))
1398 writer->writeInt16(280, varInt);
1399 else
1400 writer->writeInt16(280, 0);
1401 writer->writeString(9, "$JOINSTYLE");
1402 if (getInt("$JOINSTYLE", &varInt))
1403 writer->writeInt16(280, varInt);
1404 else
1405 writer->writeInt16(280, 0);
1406 writer->writeString(9, "$LWDISPLAY"); //RLZ bool flag, verify in bin version
1407 if (getInt("$LWDISPLAY", &varInt))
1408 writer->writeInt16(290, varInt);
1409 else
1410 writer->writeInt16(290, 0);
1411 if (ver > DRW::AC1014) {
1412 writer->writeString(9, "$INSUNITS");
1413 writer->writeInt16(70, insunits); // already fetched above for $MEASUREMENT
1414 }
1415 writer->writeString(9, "$HYPERLINKBASE");
1416 if (getStr("$HYPERLINKBASE", &varStr))
1417 if (ver == DRW::AC1009)
1418 writer->writeUtf8Caps(1, varStr);
1419 else
1420 writer->writeUtf8String(1, varStr);
1421 else
1422 writer->writeString(1, "");
1423 writer->writeString(9, "$STYLESHEET");
1424 if (getStr("$STYLESHEET", &varStr))
1425 if (ver == DRW::AC1009)
1426 writer->writeUtf8Caps(1, varStr);
1427 else
1428 writer->writeUtf8String(1, varStr);
1429 else
1430 writer->writeString(1, "");
1431 writer->writeString(9, "$XEDIT"); //RLZ bool flag, verify in bin version
1432 if (getInt("$XEDIT", &varInt))
1433 writer->writeInt16(290, varInt);
1434 else
1435 writer->writeInt16(290, 1);
1436 writer->writeString(9, "$CEPSNTYPE");
1437 if (getInt("$CEPSNTYPE", &varInt))
1438 writer->writeInt16(380, varInt);
1439 else
1440 writer->writeInt16(380, 0);
1441 writer->writeString(9, "$PSTYLEMODE"); //RLZ bool flag, verify in bin version
1442 if (getInt("$PSTYLEMODE", &varInt))
1443 writer->writeInt16(290, varInt);
1444 else
1445 writer->writeInt16(290, 1);
1446//RLZ: here $FINGERPRINTGUID and $VERSIONGUID, do not add?
1447 writer->writeString(9, "$EXTNAMES"); //RLZ bool flag, verify in bin version
1448 if (getInt("$EXTNAMES", &varInt))
1449 writer->writeInt16(290, varInt);
1450 else
1451 writer->writeInt16(290, 1);
1452 writer->writeString(9, "$PSVPSCALE");
1453 if (getDouble("$PSVPSCALE", &varDouble))
1454 writer->writeDouble(40, varDouble);
1455 else
1456 writer->writeDouble(40, 0.0);
1457 writer->writeString(9, "$OLESTARTUP"); //RLZ bool flag, verify in bin version
1458 if (getInt("$OLESTARTUP", &varInt))
1459 writer->writeInt16(290, varInt);
1460 else
1461 writer->writeInt16(290, 0);
1462 }
1463 if (ver > DRW::AC1015) {// and post v2004 vars
1464 writer->writeString(9, "$SORTENTS");
1465 if (getInt("$SORTENTS", &varInt))
1466 writer->writeInt16(280, varInt);
1467 else
1468 writer->writeInt16(280, 127);
1469 writer->writeString(9, "$INDEXCTL");
1470 if (getInt("$INDEXCTL", &varInt))
1471 writer->writeInt16(280, varInt);
1472 else
1473 writer->writeInt16(280, 0);
1474 writer->writeString(9, "$HIDETEXT");
1475 if (getInt("$HIDETEXT", &varInt))
1476 writer->writeInt16(280, varInt);
1477 else
1478 writer->writeInt16(280, 1);
1479 writer->writeString(9, "$XCLIPFRAME"); //RLZ bool flag, verify in bin version
1480 if (ver > DRW::AC1021) {
1481 if (getInt("$XCLIPFRAME", &varInt))
1482 writer->writeInt16(280, varInt);
1483 else
1484 writer->writeInt16(280, 0);
1485 } else {
1486 if (getInt("$XCLIPFRAME", &varInt))
1487 writer->writeInt16(290, varInt);
1488 else
1489 writer->writeInt16(290, 0);
1490 }
1491 writer->writeString(9, "$HALOGAP");
1492 if (getInt("$HALOGAP", &varInt))
1493 writer->writeInt16(280, varInt);
1494 else
1495 writer->writeInt16(280, 0);
1496 writer->writeString(9, "$OBSCOLOR");
1497 if (getInt("$OBSCOLOR", &varInt))
1498 writer->writeInt16(70, varInt);
1499 else
1500 writer->writeInt16(70, 257);
1501 writer->writeString(9, "$OBSLTYPE");
1502 if (getInt("$OBSLTYPE", &varInt))
1503 writer->writeInt16(280, varInt);
1504 else
1505 writer->writeInt16(280, 0);
1506 writer->writeString(9, "$INTERSECTIONDISPLAY");
1507 if (getInt("$INTERSECTIONDISPLAY", &varInt))
1508 writer->writeInt16(280, varInt);
1509 else
1510 writer->writeInt16(280, 0);
1511 writer->writeString(9, "$INTERSECTIONCOLOR");
1512 if (getInt("$INTERSECTIONCOLOR", &varInt))
1513 writer->writeInt16(70, varInt);
1514 else
1515 writer->writeInt16(70, 257);
1516 writer->writeString(9, "$DIMASSOC");
1517 if (getInt("$DIMASSOC", &varInt))
1518 writer->writeInt16(280, varInt);
1519 else
1520 writer->writeInt16(280, 1);
1521 writer->writeString(9, "$PROJECTNAME");
1522 if (getStr("$PROJECTNAME", &varStr))
1523 writer->writeUtf8String(1, varStr);
1524 else
1525 writer->writeString(1, "");
1526 }
1527 if (ver > DRW::AC1018) {// and post v2007 vars
1528 writer->writeString(9, "$CAMERADISPLAY"); //RLZ bool flag, verify in bin version
1529 if (getInt("$CAMERADISPLAY", &varInt))
1530 writer->writeInt16(290, varInt);
1531 else
1532 writer->writeInt16(290, 0);
1533 writer->writeString(9, "$LENSLENGTH");
1534 if (getDouble("$LENSLENGTH", &varDouble))
1535 writer->writeDouble(40, varDouble);
1536 else
1537 writer->writeDouble(40, 50.0);
1538 writer->writeString(9, "$CAMERAHEIGHT");
1539 if (getDouble("$CAMERAHEIGHT", &varDouble))
1540 writer->writeDouble(40, varDouble);
1541 else
1542 writer->writeDouble(40, 0.0);
1543 writer->writeString(9, "$STEPSPERSEC");
1544 if (getDouble("$STEPSPERSEC", &varDouble))
1545 writer->writeDouble(40, varDouble);
1546 else
1547 writer->writeDouble(40, 2.0);
1548 writer->writeString(9, "$STEPSIZE");
1549 if (getDouble("$STEPSIZE", &varDouble))
1550 writer->writeDouble(40, varDouble);
1551 else
1552 writer->writeDouble(40, 50.0);
1553 writer->writeString(9, "$3DDWFPREC");
1554 if (getDouble("$3DDWFPREC", &varDouble))
1555 writer->writeDouble(40, varDouble);
1556 else
1557 writer->writeDouble(40, 2.0);
1558 writer->writeString(9, "$PSOLWIDTH");
1559 if (getDouble("$PSOLWIDTH", &varDouble))
1560 writer->writeDouble(40, varDouble);
1561 else
1562 writer->writeDouble(40, 5.0);
1563 writer->writeString(9, "$PSOLHEIGHT");
1564 if (getDouble("$PSOLHEIGHT", &varDouble))
1565 writer->writeDouble(40, varDouble);
1566 else
1567 writer->writeDouble(40, 80.0);
1568 writer->writeString(9, "$LOFTANG1");
1569 if (getDouble("$LOFTANG1", &varDouble))
1570 writer->writeDouble(40, varDouble);
1571 else
1572 writer->writeDouble(40, M_PI_21.57079632679489661923);
1573 writer->writeString(9, "$LOFTANG2");
1574 if (getDouble("$LOFTANG2", &varDouble))
1575 writer->writeDouble(40, varDouble);
1576 else
1577 writer->writeDouble(40, M_PI_21.57079632679489661923);
1578 writer->writeString(9, "$LOFTMAG1");
1579 if (getDouble("$LOFTMAG1", &varDouble))
1580 writer->writeDouble(40, varDouble);
1581 else
1582 writer->writeDouble(40, 0.0);
1583 writer->writeString(9, "$LOFTMAG2");
1584 if (getDouble("$LOFTMAG2", &varDouble))
1585 writer->writeDouble(40, varDouble);
1586 else
1587 writer->writeDouble(40, 0.0);
1588 writer->writeString(9, "$LOFTPARAM");
1589 if (getInt("$LOFTPARAM", &varInt))
1590 writer->writeInt16(70, varInt);
1591 else
1592 writer->writeInt16(70, 7);
1593 writer->writeString(9, "$LOFTNORMALS");
1594 if (getInt("$LOFTNORMALS", &varInt))
1595 writer->writeInt16(280, varInt);
1596 else
1597 writer->writeInt16(280, 1);
1598 writer->writeString(9, "$LATITUDE");
1599 if (getDouble("$LATITUDE", &varDouble))
1600 writer->writeDouble(40, varDouble);
1601 else
1602 writer->writeDouble(40, 1.0);
1603 writer->writeString(9, "$LONGITUDE");
1604 if (getDouble("$LONGITUDE", &varDouble))
1605 writer->writeDouble(40, varDouble);
1606 else
1607 writer->writeDouble(40, 1.0);
1608 writer->writeString(9, "$NORTHDIRECTION");
1609 if (getDouble("$LONGITUDE", &varDouble))
1610 writer->writeDouble(40, varDouble);
1611 else
1612 writer->writeDouble(40, 0.0);
1613 writer->writeString(9, "$TIMEZONE");
1614 if (getInt("$TIMEZONE", &varInt))
1615 writer->writeInt16(70, varInt);
1616 else
1617 writer->writeInt16(70, -8000);
1618 writer->writeString(9, "$LIGHTGLYPHDISPLAY");
1619 if (getInt("$LIGHTGLYPHDISPLAY", &varInt))
1620 writer->writeInt16(280, varInt);
1621 else
1622 writer->writeInt16(280, 1);
1623 writer->writeString(9, "$TILEMODELIGHTSYNCH");
1624 if (getInt("$TILEMODELIGHTSYNCH", &varInt))
1625 writer->writeInt16(280, varInt);
1626 else
1627 writer->writeInt16(280, 1);
1628 //$CMATERIAL is a handle
1629 writer->writeString(9, "$SOLIDHIST");
1630 if (getInt("$SOLIDHIST", &varInt))
1631 writer->writeInt16(280, varInt);
1632 else
1633 writer->writeInt16(280, 1);
1634 writer->writeString(9, "$SHOWHIST");
1635 if (getInt("$SHOWHIST", &varInt))
1636 writer->writeInt16(280, varInt);
1637 else
1638 writer->writeInt16(280, 1);
1639 writer->writeString(9, "$DWFFRAME");
1640 if (getInt("$DWFFRAME", &varInt))
1641 writer->writeInt16(280, varInt);
1642 else
1643 writer->writeInt16(280, 2);
1644 writer->writeString(9, "$DGNFRAME");
1645 if (getInt("$DGNFRAME", &varInt))
1646 writer->writeInt16(280, varInt);
1647 else
1648 writer->writeInt16(280, 0);
1649 writer->writeString(9, "$REALWORLDSCALE"); //RLZ bool flag, verify in bin version
1650 if (getInt("$REALWORLDSCALE", &varInt))
1651 writer->writeInt16(290, varInt);
1652 else
1653 writer->writeInt16(290, 1);
1654 writer->writeString(9, "$INTERFERECOLOR");
1655 if (getInt("$INTERFERECOLOR", &varInt))
1656 writer->writeInt16(62, varInt);
1657 else
1658 writer->writeInt16(62, 1);
1659 //$INTERFEREOBJVS is a handle
1660 //$INTERFEREVPVS is a handle
1661 writer->writeString(9, "$CSHADOW");
1662 if (getInt("$CSHADOW", &varInt))
1663 writer->writeInt16(280, varInt);
1664 else
1665 writer->writeInt16(280, 0);
1666 writer->writeString(9, "$SHADOWPLANELOCATION");
1667 if (getDouble("$SHADOWPLANELOCATION", &varDouble))
1668 writer->writeDouble(40, varDouble);
1669 else
1670 writer->writeDouble(40, 0.0);
1671 }
1672
1673#ifdef DRW_DBG
1674 for ( auto it=vars.begin() ; it != vars.end(); ++it ){
1675 DRW_DBG((*it).first)DRW_dbg::getInstance()->print((*it).first); DRW_DBG("\n")DRW_dbg::getInstance()->print("\n");
1676 }
1677#endif
1678}
1679
1680void DRW_Header::addDouble(std::string key, double value, int code){
1681 curr = new DRW_Variant(code, value);
1682 vars[key] =curr;
1683}
1684
1685void DRW_Header::addInt(std::string key, int value, int code){
1686 curr = new DRW_Variant(code, value);
1687 vars[key] =curr;
1688}
1689
1690void DRW_Header::addStr(std::string key, std::string value, int code){
1691 curr = new DRW_Variant(code, value);
1692 vars[key] =curr;
1693}
1694
1695void DRW_Header::addCoord(std::string key, DRW_Coord value, int code){
1696 curr = new DRW_Variant(code, value);
1697 vars[key] =curr;
1698}
1699
1700bool DRW_Header::getDouble(std::string key, double *varDouble){
1701 bool result = false;
1702 auto 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
1715bool DRW_Header::getInt(std::string key, int *varInt){
1716 bool result = false;
1717 auto it=vars.find( key);
1718 if (it != vars.end()) {
1719 DRW_Variant *var = (*it).second;
1720 if (var->type() == DRW_Variant::INTEGER) {
1721 *varInt = var->content.i;
1722 result = true;
1723 }
1724 delete var;
1725 vars.erase (it);
1726 }
1727 return result;
1728}
1729
1730bool DRW_Header::getStr(std::string key, std::string *varStr){
1731 bool result = false;
1732 auto it=vars.find( key);
1733 if (it != vars.end()) {
1734 DRW_Variant *var = (*it).second;
1735 if (var->type() == DRW_Variant::STRING) {
1736 *varStr = *var->content.s;
1737 result = true;
1738 }
1739 delete var;
1740 vars.erase (it);
1741 }
1742 return result;
1743}
1744
1745bool DRW_Header::getCoord(std::string key, DRW_Coord *varCoord){
1746 bool result = false;
1747 auto it=vars.find( key);
1748 if (it != vars.end()) {
1749 DRW_Variant *var = (*it).second;
1750 if (var->type() == DRW_Variant::COORD) {
1751 *varCoord = *var->content.v;
1752 result = true;
1753 }
1754 delete var;
1755 vars.erase (it);
1756 }
1757 return result;
1758}
1759
1760bool DRW_Header::parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer *hBbuf, duint8 maintenanceVersion){
1761 bool result = true;
1762 duint32 size = buf->getRawLong32();
1763 duint32 bitSize = 0;
1764 duint32 endBitPos = 160; //start bit: 16 sentinel + 4 size
1765 DRW_DBG("\nbyte size of data: ")DRW_dbg::getInstance()->print("\nbyte size of data: "); DRW_DBG(size)DRW_dbg::getInstance()->print(size);
1766 if ((DRW::AC1024 <= version && 3 < maintenanceVersion)
1767 || DRW::AC1032 <= version) { //2010+ MV>3
1768 duint32 hSize = buf->getRawLong32();
1769 endBitPos += 32; //start bit: + 4 height size
1770 DRW_DBG("\n2010+ & MV> 3, height 32b: ")DRW_dbg::getInstance()->print("\n2010+ & MV> 3, height 32b: "
)
; DRW_DBG(hSize)DRW_dbg::getInstance()->print(hSize);
1771 }
1772//RLZ TODO add $ACADVER var & $DWGCODEPAGE & $MEASUREMENT
1773//RLZ TODO EN 2000 falta $CELWEIGHT, $ENDCAPS, $EXTNAMES $JOINSTYLE $LWDISPLAY $PSTYLEMODE $TDUCREATE $TDUUPDATE $XEDIT
1774
1775 //bit size of data needed to locate start of string stream in 2007+
1776 //and mark the start of handle stream
1777 //header is one object reads data and continue read strings ???
1778 if (version > DRW::AC1018) {//2007+
1779 bitSize = buf->getRawLong32();
1780 DRW_DBG("\nsize in bits: ")DRW_dbg::getInstance()->print("\nsize in bits: "); DRW_DBG(bitSize)DRW_dbg::getInstance()->print(bitSize);
1781 endBitPos += bitSize;
1782 hBbuf->setPosition(endBitPos >>3);
1783 hBbuf->setBitPos(endBitPos&7);
1784 }
1785
1786 if (version > DRW::AC1024) {//2013+
1787 duint64 requiredVersions = buf->getBitLongLong();
1788 DRW_DBG("\nREQUIREDVERSIONS var: ")DRW_dbg::getInstance()->print("\nREQUIREDVERSIONS var: "); DRW_DBG(requiredVersions)DRW_dbg::getInstance()->print(requiredVersions);
1789 }
1790 DRW_DBG("\nUnknown1: ")DRW_dbg::getInstance()->print("\nUnknown1: "); DRW_DBG(buf->getBitDouble())DRW_dbg::getInstance()->print(buf->getBitDouble());
1791 DRW_DBG("\nUnknown2: ")DRW_dbg::getInstance()->print("\nUnknown2: "); DRW_DBG(buf->getBitDouble())DRW_dbg::getInstance()->print(buf->getBitDouble());
1792 DRW_DBG("\nUnknown3: ")DRW_dbg::getInstance()->print("\nUnknown3: "); DRW_DBG(buf->getBitDouble())DRW_dbg::getInstance()->print(buf->getBitDouble());
1793 DRW_DBG("\nUnknown4: ")DRW_dbg::getInstance()->print("\nUnknown4: "); DRW_DBG(buf->getBitDouble())DRW_dbg::getInstance()->print(buf->getBitDouble());
1794 if (version < DRW::AC1021) {//2007-
1795 DRW_DBG("\nUnknown text1: ")DRW_dbg::getInstance()->print("\nUnknown text1: "); DRW_DBG(buf->getCP8Text())DRW_dbg::getInstance()->print(buf->getCP8Text());
1796 DRW_DBG("\nUnknown text2: ")DRW_dbg::getInstance()->print("\nUnknown text2: "); DRW_DBG(buf->getCP8Text())DRW_dbg::getInstance()->print(buf->getCP8Text());
1797 DRW_DBG("\nUnknown text3: ")DRW_dbg::getInstance()->print("\nUnknown text3: "); DRW_DBG(buf->getCP8Text())DRW_dbg::getInstance()->print(buf->getCP8Text());
1798 DRW_DBG("\nUnknown text4: ")DRW_dbg::getInstance()->print("\nUnknown text4: "); DRW_DBG(buf->getCP8Text())DRW_dbg::getInstance()->print(buf->getCP8Text());
1799 }
1800 DRW_DBG("\nUnknown long1 (24L): ")DRW_dbg::getInstance()->print("\nUnknown long1 (24L): "); DRW_DBG(buf->getBitLong())DRW_dbg::getInstance()->print(buf->getBitLong());
1801 DRW_DBG("\nUnknown long2 (0L): ")DRW_dbg::getInstance()->print("\nUnknown long2 (0L): "); DRW_DBG(buf->getBitLong())DRW_dbg::getInstance()->print(buf->getBitLong());
1802 if (version < DRW::AC1015) {//pre 2000
1803 DRW_DBG("\nUnknown short (0): ")DRW_dbg::getInstance()->print("\nUnknown short (0): "); DRW_DBG(buf->getBitShort())DRW_dbg::getInstance()->print(buf->getBitShort());
1804 }
1805 if (version < DRW::AC1018) {//pre 2004
1806 dwgHandle hcv = hBbuf->getHandle();
1807 DRW_DBG("\nhandle of current view: ")DRW_dbg::getInstance()->print("\nhandle of current view: "
)
; DRW_DBGHL(hcv.code, hcv.size, hcv.ref)DRW_dbg::getInstance()->printHL(hcv.code, hcv.size ,hcv.ref
)
;
1808 }
1809 vars["DIMASO"]=new DRW_Variant(70, buf->getBit());
1810 vars["DIMSHO"]=new DRW_Variant(70, buf->getBit());
1811 if (version < DRW::AC1015) {//pre 2000
1812 vars["DIMSAV"]=new DRW_Variant(70, buf->getBit());
1813 }
1814 vars["PLINEGEN"]=new DRW_Variant(70, buf->getBit());
1815 vars["ORTHOMODE"]=new DRW_Variant(70, buf->getBit());
1816 vars["REGENMODE"]=new DRW_Variant(70, buf->getBit());
1817 vars["FILLMODE"]=new DRW_Variant(70, buf->getBit());
1818 vars["QTEXTMODE"]=new DRW_Variant(70, buf->getBit());
1819 vars["PSLTSCALE"]=new DRW_Variant(70, buf->getBit());
1820 vars["LIMCHECK"]=new DRW_Variant(70, buf->getBit());
1821 if (version < DRW::AC1015) {//pre 2000
1822 vars["BLIPMODE"]=new DRW_Variant(70, buf->getBit());
1823 }
1824 if (version > DRW::AC1015) {//2004+
1825 DRW_DBG("\nUndocumented: ")DRW_dbg::getInstance()->print("\nUndocumented: "); DRW_DBG(buf->getBit())DRW_dbg::getInstance()->print(buf->getBit());
1826 }
1827 vars["USRTIMER"]=new DRW_Variant(70, buf->getBit());
1828 vars["SKPOLY"]=new DRW_Variant(70, buf->getBit());
1829 vars["ANGDIR"]=new DRW_Variant(70, buf->getBit());
1830 vars["SPLFRAME"]=new DRW_Variant(70, buf->getBit());
1831 if (version < DRW::AC1015) {//pre 2000
1832 vars["ATTREQ"]=new DRW_Variant(70, buf->getBit());
1833 vars["ATTDIA"]=new DRW_Variant(70, buf->getBit());
1834 }
1835 vars["MIRRTEXT"]=new DRW_Variant(70, buf->getBit());
1836 vars["WORLDVIEW"]=new DRW_Variant(70, buf->getBit());
1837 if (version < DRW::AC1015) {//pre 2000
1838 vars["WIREFRAME"]=new DRW_Variant(70, buf->getBit());
1839 }
1840 vars["TILEMODE"]=new DRW_Variant(70, buf->getBit());
1841 vars["PLIMCHECK"]=new DRW_Variant(70, buf->getBit());
1842 vars["VISRETAIN"]=new DRW_Variant(70, buf->getBit());
1843 if (version < DRW::AC1015) {//pre 2000
1844 vars["DELOBJ"]=new DRW_Variant(70, buf->getBit());
1845 }
1846 vars["DISPSILH"]=new DRW_Variant(70, buf->getBit());
1847 vars["PELLIPSE"]=new DRW_Variant(70, buf->getBit());
1848 vars["PROXIGRAPHICS"]=new DRW_Variant(70, buf->getBitShort());//RLZ short or bit??
1849 if (version < DRW::AC1015) {//pre 2000
1850 vars["DRAGMODE"]=new DRW_Variant(70, buf->getBitShort());//RLZ short or bit??
1851 }
1852 vars["TREEDEPTH"]=new DRW_Variant(70, buf->getBitShort());//RLZ short or bit??
1853 vars["LUNITS"]=new DRW_Variant(70, buf->getBitShort());
1854 vars["LUPREC"]=new DRW_Variant(70, buf->getBitShort());
1855 vars["AUNITS"]=new DRW_Variant(70, buf->getBitShort());
1856 vars["AUPREC"]=new DRW_Variant(70, buf->getBitShort());
1857 if (version < DRW::AC1015) {//pre 2000
1858 vars["OSMODE"]=new DRW_Variant(70, buf->getBitShort());
1859 }
1860 vars["ATTMODE"]=new DRW_Variant(70, buf->getBitShort());
1861 if (version < DRW::AC1015) {//pre 2000
1862 vars["COORDS"]=new DRW_Variant(70, buf->getBitShort());
1863 }
1864 vars["PDMODE"]=new DRW_Variant(70, buf->getBitShort());
1865 if (version < DRW::AC1015) {//pre 2000
1866 vars["PICKSTYLE"]=new DRW_Variant(70, buf->getBitShort());
1867 }
1868 if (version > DRW::AC1015) {//2004+
1869 DRW_DBG("\nUnknown long 1: ")DRW_dbg::getInstance()->print("\nUnknown long 1: "); DRW_DBG(buf->getBitLong())DRW_dbg::getInstance()->print(buf->getBitLong());
1870 DRW_DBG("\nUnknown long 2: ")DRW_dbg::getInstance()->print("\nUnknown long 2: "); DRW_DBG(buf->getBitLong())DRW_dbg::getInstance()->print(buf->getBitLong());
1871 DRW_DBG("\nUnknown long 3: ")DRW_dbg::getInstance()->print("\nUnknown long 3: "); DRW_DBG(buf->getBitLong())DRW_dbg::getInstance()->print(buf->getBitLong());
1872 }
1873 vars["USERI1"]=new DRW_Variant(70, buf->getBitShort());
1874 vars["USERI2"]=new DRW_Variant(70, buf->getBitShort());
1875 vars["USERI3"]=new DRW_Variant(70, buf->getBitShort());
1876 vars["USERI4"]=new DRW_Variant(70, buf->getBitShort());
1877 vars["USERI5"]=new DRW_Variant(70, buf->getBitShort());
1878 vars["SPLINESEGS"]=new DRW_Variant(70, buf->getBitShort());
1879 vars["SURFU"]=new DRW_Variant(70, buf->getBitShort());
1880 vars["SURFV"]=new DRW_Variant(70, buf->getBitShort());
1881 vars["SURFTYPE"]=new DRW_Variant(70, buf->getBitShort());
1882 vars["SURFTAB1"]=new DRW_Variant(70, buf->getBitShort());
1883 vars["SURFTAB2"]=new DRW_Variant(70, buf->getBitShort());
1884 vars["SPLINETYPE"]=new DRW_Variant(70, buf->getBitShort());
1885 vars["SHADEDGE"]=new DRW_Variant(70, buf->getBitShort());
1886 vars["SHADEDIF"]=new DRW_Variant(70, buf->getBitShort());
1887 vars["UNITMODE"]=new DRW_Variant(70, buf->getBitShort());
1888 vars["MAXACTVP"]=new DRW_Variant(70, buf->getBitShort());
1889 vars["ISOLINES"]=new DRW_Variant(70, buf->getBitShort());//////////////////
1890 vars["CMLJUST"]=new DRW_Variant(70, buf->getBitShort());
1891 vars["TEXTQLTY"]=new DRW_Variant(70, buf->getBitShort());/////////////////////
1892 vars["LTSCALE"]=new DRW_Variant(40, buf->getBitDouble());
1893 vars["TEXTSIZE"]=new DRW_Variant(40, buf->getBitDouble());
1894 vars["TRACEWID"]=new DRW_Variant(40, buf->getBitDouble());
1895 vars["SKETCHINC"]=new DRW_Variant(40, buf->getBitDouble());
1896 vars["FILLETRAD"]=new DRW_Variant(40, buf->getBitDouble());
1897 vars["THICKNESS"]=new DRW_Variant(40, buf->getBitDouble());
1898 vars["ANGBASE"]=new DRW_Variant(50, buf->getBitDouble());
1899 vars["PDSIZE"]=new DRW_Variant(40, buf->getBitDouble());
1900 vars["PLINEWID"]=new DRW_Variant(40, buf->getBitDouble());
1901 vars["USERR1"]=new DRW_Variant(40, buf->getBitDouble());
1902 vars["USERR2"]=new DRW_Variant(40, buf->getBitDouble());
1903 vars["USERR3"]=new DRW_Variant(40, buf->getBitDouble());
1904 vars["USERR4"]=new DRW_Variant(40, buf->getBitDouble());
1905 vars["USERR5"]=new DRW_Variant(40, buf->getBitDouble());
1906 vars["CHAMFERA"]=new DRW_Variant(40, buf->getBitDouble());
1907 vars["CHAMFERB"]=new DRW_Variant(40, buf->getBitDouble());
1908 vars["CHAMFERC"]=new DRW_Variant(40, buf->getBitDouble());
1909 vars["CHAMFERD"]=new DRW_Variant(40, buf->getBitDouble());
1910 vars["FACETRES"]=new DRW_Variant(40, buf->getBitDouble());/////////////////////////
1911 vars["CMLSCALE"]=new DRW_Variant(40, buf->getBitDouble());
1912 vars["CELTSCALE"]=new DRW_Variant(40, buf->getBitDouble());
1913 if (version < DRW::AC1021) {//2004-
1914 vars["MENU"]=new DRW_Variant(1, buf->getCP8Text());
1915 }
1916 ddouble64 msec, day;
1917 day = buf->getBitLong();
1918 msec = buf->getBitLong();
1919 while (msec >= 1)
1920 msec /=10;
1921 vars["TDCREATE"]=new DRW_Variant(40, day+msec);//RLZ: TODO convert to day.msec
1922// vars["TDCREATE"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
1923// vars["TDCREATE"]=new DRW_Variant(40, buf->getBitLong());
1924 day = buf->getBitLong();
1925 msec = buf->getBitLong();
1926 while (msec >= 1)
1927 msec /=10;
1928 vars["TDUPDATE"]=new DRW_Variant(40, day+msec);//RLZ: TODO convert to day.msec
1929// vars["TDUPDATE"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
1930// vars["TDUPDATE"]=new DRW_Variant(40, buf->getBitLong());
1931 if (version > DRW::AC1015) {//2004+
1932 DRW_DBG("\nUnknown long 4: ")DRW_dbg::getInstance()->print("\nUnknown long 4: "); DRW_DBG(buf->getBitLong())DRW_dbg::getInstance()->print(buf->getBitLong());
1933 DRW_DBG("\nUnknown long 5: ")DRW_dbg::getInstance()->print("\nUnknown long 5: "); DRW_DBG(buf->getBitLong())DRW_dbg::getInstance()->print(buf->getBitLong());
1934 DRW_DBG("\nUnknown long 6: ")DRW_dbg::getInstance()->print("\nUnknown long 6: "); DRW_DBG(buf->getBitLong())DRW_dbg::getInstance()->print(buf->getBitLong());
1935 }
1936 day = buf->getBitLong();
1937 msec = buf->getBitLong();
1938 while (msec >= 1)
1939 msec /=10;
1940 vars["TDINDWG"]=new DRW_Variant(40, day+msec);//RLZ: TODO convert to day.msec
1941// vars["TDINDWG"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
1942// vars["TDINDWG"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
1943 day = buf->getBitLong();
1944 msec = buf->getBitLong();
1945 while (msec >= 1)
1946 msec /=10;
1947 vars["TDUSRTIMER"]=new DRW_Variant(40, day+msec);//RLZ: TODO convert to day.msec
1948// vars["TDUSRTIMER"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
1949// vars["TDUSRTIMER"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
1950 vars["CECOLOR"]=new DRW_Variant(62, buf->getCmColor(version));//RLZ: TODO read CMC or EMC color
1951 dwgHandle HANDSEED = buf->getHandle();//always present in data stream
1952 DRW_DBG("\nHANDSEED: ")DRW_dbg::getInstance()->print("\nHANDSEED: "); DRW_DBGHL(HANDSEED.code, HANDSEED.size, HANDSEED.ref)DRW_dbg::getInstance()->printHL(HANDSEED.code, HANDSEED.size
,HANDSEED.ref)
;
1953 handSeed = HANDSEED.ref;
1954 dwgHandle CLAYER = hBbuf->getHandle();
1955 DRW_DBG("\nCLAYER: ")DRW_dbg::getInstance()->print("\nCLAYER: "); DRW_DBGHL(CLAYER.code, CLAYER.size, CLAYER.ref)DRW_dbg::getInstance()->printHL(CLAYER.code, CLAYER.size ,
CLAYER.ref)
;
1956 dwgHandle TEXTSTYLE = hBbuf->getHandle();
1957 DRW_DBG("\nTEXTSTYLE: ")DRW_dbg::getInstance()->print("\nTEXTSTYLE: "); DRW_DBGHL(TEXTSTYLE.code, TEXTSTYLE.size, TEXTSTYLE.ref)DRW_dbg::getInstance()->printHL(TEXTSTYLE.code, TEXTSTYLE.
size ,TEXTSTYLE.ref)
;
1958 dwgHandle CELTYPE = hBbuf->getHandle();
1959 DRW_DBG("\nCELTYPE: ")DRW_dbg::getInstance()->print("\nCELTYPE: "); DRW_DBGHL(CELTYPE.code, CELTYPE.size, CELTYPE.ref)DRW_dbg::getInstance()->printHL(CELTYPE.code, CELTYPE.size
,CELTYPE.ref)
;
1960 if (version > DRW::AC1018) {//2007+
1961 dwgHandle CMATERIAL = hBbuf->getHandle();
1962 DRW_DBG("\nCMATERIAL: ")DRW_dbg::getInstance()->print("\nCMATERIAL: "); DRW_DBGHL(CMATERIAL.code, CMATERIAL.size, CMATERIAL.ref)DRW_dbg::getInstance()->printHL(CMATERIAL.code, CMATERIAL.
size ,CMATERIAL.ref)
;
1963 }
1964 dwgHandle DIMSTYLE = hBbuf->getHandle();
1965 DRW_DBG("\nDIMSTYLE: ")DRW_dbg::getInstance()->print("\nDIMSTYLE: "); DRW_DBGHL(DIMSTYLE.code, DIMSTYLE.size, DIMSTYLE.ref)DRW_dbg::getInstance()->printHL(DIMSTYLE.code, DIMSTYLE.size
,DIMSTYLE.ref)
;
1966 dwgHandle CMLSTYLE = hBbuf->getHandle();
1967 DRW_DBG("\nCMLSTYLE: ")DRW_dbg::getInstance()->print("\nCMLSTYLE: "); DRW_DBGHL(CMLSTYLE.code, CMLSTYLE.size, CMLSTYLE.ref)DRW_dbg::getInstance()->printHL(CMLSTYLE.code, CMLSTYLE.size
,CMLSTYLE.ref)
;
1968 if (version > DRW::AC1014) {//2000+
1969 vars["PSVPSCALE"]=new DRW_Variant(40, buf->getBitDouble());
1970 }
1971 vars["PINSBASE"]=new DRW_Variant(10, buf->get3BitDouble());
1972 vars["PEXTMIN"]=new DRW_Variant(10, buf->get3BitDouble());
1973 vars["PEXTMAX"]=new DRW_Variant(10, buf->get3BitDouble());
1974 vars["PLIMMIN"]=new DRW_Variant(10, buf->get2RawDouble());
1975 vars["PLIMMAX"]=new DRW_Variant(10, buf->get2RawDouble());
1976 vars["PELEVATION"]=new DRW_Variant(40, buf->getBitDouble());
1977 vars["PUCSORG"]=new DRW_Variant(10, buf->get3BitDouble());
1978 vars["PUCSXDIR"]=new DRW_Variant(10, buf->get3BitDouble());
1979 vars["PUCSYDIR"]=new DRW_Variant(10, buf->get3BitDouble());
1980 dwgHandle PUCSNAME = hBbuf->getHandle();
1981 DRW_DBG("\nPUCSNAME: ")DRW_dbg::getInstance()->print("\nPUCSNAME: "); DRW_DBGHL(PUCSNAME.code, PUCSNAME.size, PUCSNAME.ref)DRW_dbg::getInstance()->printHL(PUCSNAME.code, PUCSNAME.size
,PUCSNAME.ref)
;
1982 if (version > DRW::AC1014) {//2000+
1983 dwgHandle PUCSORTHOREF = hBbuf->getHandle();
1984 DRW_DBG("\nPUCSORTHOREF: ")DRW_dbg::getInstance()->print("\nPUCSORTHOREF: "); DRW_DBGHL(PUCSORTHOREF.code, PUCSORTHOREF.size, PUCSORTHOREF.ref)DRW_dbg::getInstance()->printHL(PUCSORTHOREF.code, PUCSORTHOREF
.size ,PUCSORTHOREF.ref)
;
1985 vars["PUCSORTHOVIEW"]=new DRW_Variant(70, buf->getBitShort());
1986 dwgHandle PUCSBASE = hBbuf->getHandle();
1987 DRW_DBG("\nPUCSBASE: ")DRW_dbg::getInstance()->print("\nPUCSBASE: "); DRW_DBGHL(PUCSBASE.code, PUCSBASE.size, PUCSBASE.ref)DRW_dbg::getInstance()->printHL(PUCSBASE.code, PUCSBASE.size
,PUCSBASE.ref)
;
1988 vars["PUCSORGTOP"]=new DRW_Variant(10, buf->get3BitDouble());
1989 vars["PUCSORGBOTTOM"]=new DRW_Variant(10, buf->get3BitDouble());
1990 vars["PUCSORGLEFT"]=new DRW_Variant(10, buf->get3BitDouble());
1991 vars["PUCSORGRIGHT"]=new DRW_Variant(10, buf->get3BitDouble());
1992 vars["PUCSORGFRONT"]=new DRW_Variant(10, buf->get3BitDouble());
1993 vars["PUCSORGBACK"]=new DRW_Variant(10, buf->get3BitDouble());
1994 }
1995 vars["INSBASE"]=new DRW_Variant(10, buf->get3BitDouble());
1996 vars["EXTMIN"]=new DRW_Variant(10, buf->get3BitDouble());
1997 vars["EXTMAX"]=new DRW_Variant(10, buf->get3BitDouble());
1998
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_dbg::getInstance()->print("\nUCSNAME: "); DRW_DBGHL(UCSNAME.code, UCSNAME.size, UCSNAME.ref)DRW_dbg::getInstance()->printHL(UCSNAME.code, UCSNAME.size
,UCSNAME.ref)
;
2007 if (version > DRW::AC1014) {//2000+
2008 dwgHandle UCSORTHOREF = hBbuf->getHandle();
2009 DRW_DBG("\nUCSORTHOREF: ")DRW_dbg::getInstance()->print("\nUCSORTHOREF: "); DRW_DBGHL(UCSORTHOREF.code, UCSORTHOREF.size, UCSORTHOREF.ref)DRW_dbg::getInstance()->printHL(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_dbg::getInstance()->print("\nUCSBASE: "); DRW_DBGHL(UCSBASE.code, UCSBASE.size, UCSBASE.ref)DRW_dbg::getInstance()->printHL(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_dbg::getInstance()->print("\nDIMTXSTY: "); DRW_DBGHL(DIMTXSTY.code, DIMTXSTY.size, DIMTXSTY.ref)DRW_dbg::getInstance()->printHL(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_dbg::getInstance()->print("\nDIMTXSTY: "); DRW_DBGHL(DIMTXSTY.code, DIMTXSTY.size, DIMTXSTY.ref)DRW_dbg::getInstance()->printHL(DIMTXSTY.code, DIMTXSTY.size
,DIMTXSTY.ref)
;
2145 dwgHandle DIMLDRBLK = hBbuf->getHandle();
2146 DRW_DBG("\nDIMLDRBLK: ")DRW_dbg::getInstance()->print("\nDIMLDRBLK: "); DRW_DBGHL(DIMLDRBLK.code, DIMLDRBLK.size, DIMLDRBLK.ref)DRW_dbg::getInstance()->printHL(DIMLDRBLK.code, DIMLDRBLK.
size ,DIMLDRBLK.ref)
;
2147 dwgHandle DIMBLK = hBbuf->getHandle();
2148 DRW_DBG("\nDIMBLK: ")DRW_dbg::getInstance()->print("\nDIMBLK: "); DRW_DBGHL(DIMBLK.code, DIMBLK.size, DIMBLK.ref)DRW_dbg::getInstance()->printHL(DIMBLK.code, DIMBLK.size ,
DIMBLK.ref)
;
2149 dwgHandle DIMBLK1 = hBbuf->getHandle();
2150 DRW_DBG("\nDIMBLK1: ")DRW_dbg::getInstance()->print("\nDIMBLK1: "); DRW_DBGHL(DIMBLK1.code, DIMBLK1.size, DIMBLK1.ref)DRW_dbg::getInstance()->printHL(DIMBLK1.code, DIMBLK1.size
,DIMBLK1.ref)
;
2151 dwgHandle DIMBLK2 = hBbuf->getHandle();
2152 DRW_DBG("\nDIMBLK2: ")DRW_dbg::getInstance()->print("\nDIMBLK2: "); DRW_DBGHL(DIMBLK2.code, DIMBLK2.size, DIMBLK2.ref)DRW_dbg::getInstance()->printHL(DIMBLK2.code, DIMBLK2.size
,DIMBLK2.ref)
;
2153 }
2154 if (version > DRW::AC1018) {//2007+
2155 dwgHandle DIMLTYPE = hBbuf->getHandle();
2156 DRW_DBG("\nDIMLTYPE: ")DRW_dbg::getInstance()->print("\nDIMLTYPE: "); DRW_DBGHL(DIMLTYPE.code, DIMLTYPE.size, DIMLTYPE.ref)DRW_dbg::getInstance()->printHL(DIMLTYPE.code, DIMLTYPE.size
,DIMLTYPE.ref)
;
2157 dwgHandle DIMLTEX1 = hBbuf->getHandle();
2158 DRW_DBG("\nDIMLTEX1: ")DRW_dbg::getInstance()->print("\nDIMLTEX1: "); DRW_DBGHL(DIMLTEX1.code, DIMLTEX1.size, DIMLTEX1.ref)DRW_dbg::getInstance()->printHL(DIMLTEX1.code, DIMLTEX1.size
,DIMLTEX1.ref)
;
2159 dwgHandle DIMLTEX2 = hBbuf->getHandle();
2160 DRW_DBG("\nDIMLTEX2: ")DRW_dbg::getInstance()->print("\nDIMLTEX2: "); DRW_DBGHL(DIMLTEX2.code, DIMLTEX2.size, DIMLTEX2.ref)DRW_dbg::getInstance()->printHL(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_dbg::getInstance()->print("\nBLOCK CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2168 blockCtrl = CONTROL.ref;
2169 CONTROL = hBbuf->getHandle();
2170 DRW_DBG("\nLAYER CONTROL: ")DRW_dbg::getInstance()->print("\nLAYER CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2171 layerCtrl = CONTROL.ref;
2172 CONTROL = hBbuf->getHandle();
2173 DRW_DBG("\nSTYLE CONTROL: ")DRW_dbg::getInstance()->print("\nSTYLE CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2174 styleCtrl = CONTROL.ref;
2175 CONTROL = hBbuf->getHandle();
2176 DRW_DBG("\nLINETYPE CONTROL: ")DRW_dbg::getInstance()->print("\nLINETYPE CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2177 linetypeCtrl = CONTROL.ref;
2178 CONTROL = hBbuf->getHandle();
2179 DRW_DBG("\nVIEW CONTROL: ")DRW_dbg::getInstance()->print("\nVIEW CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2180 viewCtrl = CONTROL.ref;
2181 CONTROL = hBbuf->getHandle();
2182 DRW_DBG("\nUCS CONTROL: ")DRW_dbg::getInstance()->print("\nUCS CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2183 ucsCtrl = CONTROL.ref;
2184 CONTROL = hBbuf->getHandle();
2185 DRW_DBG("\nVPORT CONTROL: ")DRW_dbg::getInstance()->print("\nVPORT CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2186 vportCtrl = CONTROL.ref;
2187 CONTROL = hBbuf->getHandle();
2188 DRW_DBG("\nAPPID CONTROL: ")DRW_dbg::getInstance()->print("\nAPPID CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2189 appidCtrl = CONTROL.ref;
2190 CONTROL = hBbuf->getHandle();
2191 DRW_DBG("\nDIMSTYLE CONTROL: ")DRW_dbg::getInstance()->print("\nDIMSTYLE CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(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_dbg::getInstance()->print("\nVIEWPORT ENTITY HEADER CONTROL: "
)
; DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(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_dbg::getInstance()->print("\nDICT ACAD_GROUP: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2200 CONTROL = hBbuf->getHandle();
2201 DRW_DBG("\nDICT ACAD_MLINESTYLE: ")DRW_dbg::getInstance()->print("\nDICT ACAD_MLINESTYLE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2202 CONTROL = hBbuf->getHandle();
2203 DRW_DBG("\nDICT NAMED OBJS: ")DRW_dbg::getInstance()->print("\nDICT NAMED OBJS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(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_dbg::getInstance()->print("\nDICT LAYOUTS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2214 CONTROL = hBbuf->getHandle();
2215 DRW_DBG("\nDICT PLOTSETTINGS: ")DRW_dbg::getInstance()->print("\nDICT PLOTSETTINGS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2216 CONTROL = hBbuf->getHandle();
2217 DRW_DBG("\nDICT PLOTSTYLES: ")DRW_dbg::getInstance()->print("\nDICT PLOTSTYLES: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2218 }
2219 if (version > DRW::AC1015) {//2004+
2220 CONTROL = hBbuf->getHandle();
2221 DRW_DBG("\nDICT MATERIALS: ")DRW_dbg::getInstance()->print("\nDICT MATERIALS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2222 CONTROL = hBbuf->getHandle();
2223 DRW_DBG("\nDICT COLORS: ")DRW_dbg::getInstance()->print("\nDICT COLORS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2224 }
2225 if (version > DRW::AC1018) {//2007+
2226 CONTROL = hBbuf->getHandle();
2227 DRW_DBG("\nDICT VISUALSTYLE: ")DRW_dbg::getInstance()->print("\nDICT VISUALSTYLE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2228 }
2229 if (version > DRW::AC1024) {//2013+
2230 CONTROL = hBbuf->getHandle();
2231 DRW_DBG("\nUNKNOWN HANDLE: ")DRW_dbg::getInstance()->print("\nUNKNOWN HANDLE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2232 }
2233 if (version > DRW::AC1014) {//2000+
2234 DRW_DBG("\nFlags: ")DRW_dbg::getInstance()->print("\nFlags: "); DRW_DBGH(buf->getBitLong())DRW_dbg::getInstance()->printH(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_dbg::getInstance()->print("\nCPSNID HANDLE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(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_dbg::getInstance()->print("\nBLOCK PAPER_SPACE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2264 CONTROL = hBbuf->getHandle();
2265 DRW_DBG("\nBLOCK MODEL_SPACE: ")DRW_dbg::getInstance()->print("\nBLOCK MODEL_SPACE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2266 CONTROL = hBbuf->getHandle();
2267 DRW_DBG("\nLTYPE BYLAYER: ")DRW_dbg::getInstance()->print("\nLTYPE BYLAYER: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2268 CONTROL = hBbuf->getHandle();
2269 DRW_DBG("\nLTYPE BYBLOCK: ")DRW_dbg::getInstance()->print("\nLTYPE BYBLOCK: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2270 CONTROL = hBbuf->getHandle();
2271 DRW_DBG("\nLTYPE CONTINUOUS: ")DRW_dbg::getInstance()->print("\nLTYPE CONTINUOUS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(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::getInstance()->print("\nUnknown 2007+ long1: "); DRW_DBG(buf->getBitLong())DRW_dbg::getInstance()->print(buf->getBitLong());
2275 DRW_DBG("\nUnknown 2007+ long2: ")DRW_dbg::getInstance()->print("\nUnknown 2007+ long2: "); DRW_DBG(buf->getBitLong())DRW_dbg::getInstance()->print(buf->getBitLong());
2276 DRW_DBG("\nUnknown 2007+ double2: ")DRW_dbg::getInstance()->print("\nUnknown 2007+ double2: "); DRW_DBG(buf->getBitDouble())DRW_dbg::getInstance()->print(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::getInstance()->print("\nUnknown 2007+ BIT: "); DRW_DBG(buf->getBit())DRW_dbg::getInstance()->print(buf->getBit());
2301 vars["INTERFERECOLOR"]=new DRW_Variant(70, buf->getCmColor(version));
2302 CONTROL = hBbuf->getHandle();
2303 DRW_DBG("\nINTERFEREOBJVS: ")DRW_dbg::getInstance()->print("\nINTERFEREOBJVS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2304 CONTROL = hBbuf->getHandle();
2305 DRW_DBG("\nINTERFEREVPVS: ")DRW_dbg::getInstance()->print("\nINTERFEREVPVS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2306 CONTROL = hBbuf->getHandle();
2307 DRW_DBG("\nDRAGVS: ")DRW_dbg::getInstance()->print("\nDRAGVS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::getInstance()->printHL(CONTROL.code, CONTROL.size
,CONTROL.ref)
;
2308 vars["CSHADOW"]=new DRW_Variant(70, buf->getRawChar8());
2309 DRW_DBG("\nUnknown 2007+ double2: ")DRW_dbg::getInstance()->print("\nUnknown 2007+ double2: "); DRW_DBG(buf->getBitDouble())DRW_dbg::getInstance()->print(buf->getBitDouble());
2310 }
2311 if (version > DRW::AC1012) {//R14+
2312 DRW_DBG("\nUnknown R14+ short1: ")DRW_dbg::getInstance()->print("\nUnknown R14+ short1: "); DRW_DBG(buf->getBitShort())DRW_dbg::getInstance()->print(buf->getBitShort());
2313 DRW_DBG("\nUnknown R14+ short2: ")DRW_dbg::getInstance()->print("\nUnknown R14+ short2: "); DRW_DBG(buf->getBitShort())DRW_dbg::getInstance()->print(buf->getBitShort());
2314 DRW_DBG("\nUnknown R14+ short3: ")DRW_dbg::getInstance()->print("\nUnknown R14+ short3: "); DRW_DBG(buf->getBitShort())DRW_dbg::getInstance()->print(buf->getBitShort());
2315 DRW_DBG("\nUnknown R14+ short4: ")DRW_dbg::getInstance()->print("\nUnknown R14+ short4: "); DRW_DBG(buf->getBitShort())DRW_dbg::getInstance()->print(buf->getBitShort());
2316 }
2317
2318 DRW_DBG("\nbuf position: ")DRW_dbg::getInstance()->print("\nbuf position: "); DRW_DBG(buf->getPosition())DRW_dbg::getInstance()->print(buf->getPosition());
2319 DRW_DBG(" buf bit position: ")DRW_dbg::getInstance()->print(" buf bit position: "); DRW_DBG(buf->getBitPos())DRW_dbg::getInstance()->print(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::getInstance()->print("\nstring buf position: "); DRW_DBG(buf->getPosition())DRW_dbg::getInstance()->print(buf->getPosition());
2346 DRW_DBG("\nstring buf bit position: ")DRW_dbg::getInstance()->print("\nstring buf bit position: "
)
; DRW_DBG(buf->getBitPos())DRW_dbg::getInstance()->print(buf->getBitPos());
2347 }
2348 DRW_DBG("\nUnknown text1: ")DRW_dbg::getInstance()->print("\nUnknown text1: "); DRW_DBG(buf->getUCSText(false))DRW_dbg::getInstance()->print(buf->getUCSText(false));
2349 DRW_DBG("\nUnknown text2: ")DRW_dbg::getInstance()->print("\nUnknown text2: "); DRW_DBG(buf->getUCSText(false))DRW_dbg::getInstance()->print(buf->getUCSText(false));
2350 DRW_DBG("\nUnknown text3: ")DRW_dbg::getInstance()->print("\nUnknown text3: "); DRW_DBG(buf->getUCSText(false))DRW_dbg::getInstance()->print(buf->getUCSText(false));
2351 DRW_DBG("\nUnknown text4: ")DRW_dbg::getInstance()->print("\nUnknown text4: "); DRW_DBG(buf->getUCSText(false))DRW_dbg::getInstance()->print(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::getInstance()->print("\nstring buf position: "); DRW_DBG(buf->getPosition())DRW_dbg::getInstance()->print(buf->getPosition());
2363 DRW_DBG(" string buf bit position: ")DRW_dbg::getInstance()->print(" string buf bit position: "
)
; DRW_DBG(buf->getBitPos())DRW_dbg::getInstance()->print(buf->getBitPos());
2364 vars["VERSIONGUID"]=new DRW_Variant(1, buf->getUCSText(false));
2365 DRW_DBG("\nstring buf position: ")DRW_dbg::getInstance()->print("\nstring buf position: "); DRW_DBG(buf->getPosition())DRW_dbg::getInstance()->print(buf->getPosition());
2366 DRW_DBG(" string buf bit position: ")DRW_dbg::getInstance()->print(" string buf bit position: "
)
; DRW_DBG(buf->getBitPos())DRW_dbg::getInstance()->print(buf->getBitPos());
2367 vars["PROJECTNAME"]=new DRW_Variant(1, buf->getUCSText(false));
2368 }
2369/*** ****/
2370 DRW_DBG("\nstring buf position: ")DRW_dbg::getInstance()->print("\nstring buf position: "); DRW_DBG(buf->getPosition())DRW_dbg::getInstance()->print(buf->getPosition());
2371 DRW_DBG(" string buf bit position: ")DRW_dbg::getInstance()->print(" string buf bit position: "
)
; DRW_DBG(buf->getBitPos())DRW_dbg::getInstance()->print(buf->getBitPos());
2372
2373 if (DRW_DBGGLDRW_dbg::getInstance()->getLevel() == DRW_dbg::Level::Debug){
2374 for (auto it=vars.begin(); it!=vars.end(); ++it){
2375 DRW_DBG("\n")DRW_dbg::getInstance()->print("\n"); DRW_DBG(it->first)DRW_dbg::getInstance()->print(it->first); DRW_DBG(": ")DRW_dbg::getInstance()->print(": ");
2376 switch (it->second->type()){
2377 case DRW_Variant::INTEGER:
2378 DRW_DBG(it->second->content.i)DRW_dbg::getInstance()->print(it->second->content.i);
2379 break;
2380 case DRW_Variant::DOUBLE:
2381 DRW_DBG(it->second->content.d)DRW_dbg::getInstance()->print(it->second->content.d);
2382 break;
2383 case DRW_Variant::STRING:
2384 DRW_DBG(it->second->content.s->c_str())DRW_dbg::getInstance()->print(it->second->content.s->
c_str())
;
2385 break;
2386 case DRW_Variant::COORD:
2387 DRW_DBG("x= ")DRW_dbg::getInstance()->print("x= "); DRW_DBG(it->second->content.v->x)DRW_dbg::getInstance()->print(it->second->content.v->
x)
;
2388 DRW_DBG(", y= ")DRW_dbg::getInstance()->print(", y= "); DRW_DBG(it->second->content.v->y)DRW_dbg::getInstance()->print(it->second->content.v->
y)
;
2389 DRW_DBG(", z= ")DRW_dbg::getInstance()->print(", z= "); DRW_DBG(it->second->content.v->z)DRW_dbg::getInstance()->print(it->second->content.v->
z)
;
2390 break;
2391 default:
2392 break;
2393 }
2394 DRW_DBG(" code: ")DRW_dbg::getInstance()->print(" code: ");DRW_DBG(it->second->code())DRW_dbg::getInstance()->print(it->second->code());
2395 }
2396 }
2397
2398 buf->setPosition(size+16+4); //read size +16 start sentinel + 4 size
2399 if ((DRW::AC1024 <= version && 3 < maintenanceVersion)
2400 || DRW::AC1032 <= version) { //2010+ MV>3
2401 buf->getRawLong32();//advance 4 bytes (hisize)
2402 }
2403 DRW_DBG("\nsetting position to: ")DRW_dbg::getInstance()->print("\nsetting position to: "); DRW_DBG(buf->getPosition())DRW_dbg::getInstance()->print(buf->getPosition());
2404 DRW_DBG("\nHeader CRC: ")DRW_dbg::getInstance()->print("\nHeader CRC: "); DRW_DBGH(buf->getRawShort16())DRW_dbg::getInstance()->printH(buf->getRawShort16());
2405 DRW_DBG("\nbuf position: ")DRW_dbg::getInstance()->print("\nbuf position: "); DRW_DBG(buf->getPosition())DRW_dbg::getInstance()->print(buf->getPosition());
2406 DRW_DBG("\ndwg header end sentinel= ")DRW_dbg::getInstance()->print("\ndwg header end sentinel= "
)
;
2407 for (int i=0; i<16;i++) {
2408 DRW_DBGH(buf->getRawChar8())DRW_dbg::getInstance()->printH(buf->getRawChar8()); DRW_DBG(" ")DRW_dbg::getInstance()->print(" ");
2409 }
2410
2411 //temporary code to show header end sentinel
2412 duint64 sz= buf->size()-1;
Value stored to 'sz' during its initialization is never read
2413 if (version < DRW::AC1018) {//pre 2004
2414 sz= buf->size()-16;
2415 buf->setPosition(sz);
2416 DRW_DBG("\nsetting position to: ")DRW_dbg::getInstance()->print("\nsetting position to: "); DRW_DBG(buf->getPosition())DRW_dbg::getInstance()->print(buf->getPosition());
2417 DRW_DBG("\ndwg header end sentinel= ")DRW_dbg::getInstance()->print("\ndwg header end sentinel= "
)
;
2418 for (int i=0; i<16;i++) {
2419 DRW_DBGH(buf->getRawChar8())DRW_dbg::getInstance()->printH(buf->getRawChar8()); DRW_DBG(" ")DRW_dbg::getInstance()->print(" ");
2420 }
2421 } else if (version == DRW::AC1018) {//2004
2422// sz= buf->size()-132;
2423// buf->setPosition(sz);
2424 buf->moveBitPos(-128);
2425 DRW_DBG("\nsetting position to: ")DRW_dbg::getInstance()->print("\nsetting position to: "); DRW_DBG(buf->getPosition())DRW_dbg::getInstance()->print(buf->getPosition());
2426 DRW_DBG("\ndwg header end sentinel= ")DRW_dbg::getInstance()->print("\ndwg header end sentinel= "
)
;
2427 for (int i=0; i<16;i++) {
2428 DRW_DBGH(buf->getRawChar8())DRW_dbg::getInstance()->printH(buf->getRawChar8()); DRW_DBG(" ")DRW_dbg::getInstance()->print(" ");
2429 }
2430 } else if (version == DRW::AC1021) {//2007
2431 sz= buf->size()-16;
2432 buf->setPosition(sz);
2433 DRW_DBG("\nsetting position to: ")DRW_dbg::getInstance()->print("\nsetting position to: "); DRW_DBG(buf->getPosition())DRW_dbg::getInstance()->print(buf->getPosition());
2434 DRW_DBG("\ndwg header end sentinel= ")DRW_dbg::getInstance()->print("\ndwg header end sentinel= "
)
;
2435 for (int i=0; i<16;i++) {
2436 DRW_DBGH(buf->getRawChar8())DRW_dbg::getInstance()->printH(buf->getRawChar8()); DRW_DBG(" ")DRW_dbg::getInstance()->print(" ");
2437 }
2438 } else if (version == DRW::AC1024) {//2010
2439// sz= buf->size()-93;
2440// buf->setPosition(sz);
2441 buf->moveBitPos(-128);
2442 DRW_DBG("\nsetting position to: ")DRW_dbg::getInstance()->print("\nsetting position to: "); DRW_DBG(buf->getPosition())DRW_dbg::getInstance()->print(buf->getPosition());
2443 DRW_DBG("\ndwg header end sentinel= ")DRW_dbg::getInstance()->print("\ndwg header end sentinel= "
)
;
2444 for (int i=0; i<16;i++) {
2445 DRW_DBGH(buf->getRawChar8())DRW_dbg::getInstance()->printH(buf->getRawChar8()); DRW_DBG(" ")DRW_dbg::getInstance()->print(" ");
2446 }
2447 } else if (version == DRW::AC1027) {//2013
2448// sz= buf->size()-76;
2449// buf->setPosition(sz);
2450 buf->moveBitPos(-128);
2451 DRW_DBG("\nsetting position to: ")DRW_dbg::getInstance()->print("\nsetting position to: "); DRW_DBG(buf->getPosition())DRW_dbg::getInstance()->print(buf->getPosition());
2452 DRW_DBG("\ndwg header end sentinel= ")DRW_dbg::getInstance()->print("\ndwg header end sentinel= "
)
;
2453 for (int i=0; i<16;i++) {
2454 DRW_DBGH(buf->getRawChar8())DRW_dbg::getInstance()->printH(buf->getRawChar8()); DRW_DBG(" ")DRW_dbg::getInstance()->print(" ");
2455 }
2456 }
2457
2458 return result;
2459}
2460
2461// ---------------------------------------------------------------------------
2462// DRW_Header::encodeDwg — Phase 3a (drafted 2026-05-14)
2463// ---------------------------------------------------------------------------
2464// Inverse of parseDwg. Emits the bit-packed HEADER section body for R2000
2465// (AC1015). The caller (dwgWriter15::writeDwgHeader) has already emitted
2466// the 16-byte begin sentinel + 4-byte RL section-size placeholder; this
2467// function appends the variable stream starting right after them. The
2468// caller appends the 16-byte end sentinel + 2-byte CRC16 LE after we return
2469// and back-patches the size placeholder.
2470//
2471// For R2000 the handle stream is INLINE with the data stream — buf and
2472// hBbuf are the same accumulator. Future versions will diverge.
2473//
2474// Order of emission must match parseDwg EXACTLY. See deep-review notes
2475// in /Users/dli/.claude/plans/dwg-write-phase3-tables-objects.md for the
2476// 13-handle control-handle block and the conditional layout.
2477
2478namespace {
2479 /// Look up a 1-bit boolean var in DRW_Header::vars; default 0.
2480 duint8 boolVar(const DRW_Header& hdr, const std::string& name) {
2481 auto it = hdr.vars.find(name);
2482 if (it == hdr.vars.end() || !it->second) return 0;
2483 return static_cast<duint8>(it->second->i_val() & 1);
2484 }
2485 /// Look up a BS/BL int var; default 0 (or caller-supplied default).
2486 dint32 intVar(const DRW_Header& hdr, const std::string& name, dint32 def = 0) {
2487 auto it = hdr.vars.find(name);
2488 if (it == hdr.vars.end() || !it->second) return def;
2489 return it->second->i_val();
2490 }
2491 /// Look up a BD float var; default 0.0 (or caller-supplied).
2492 double dblVar(const DRW_Header& hdr, const std::string& name, double def = 0.0) {
2493 auto it = hdr.vars.find(name);
2494 if (it == hdr.vars.end() || !it->second) return def;
2495 return it->second->d_val();
2496 }
2497 /// Look up a 3BD coord var; default {0,0,0}.
2498 DRW_Coord coordVar(const DRW_Header& hdr, const std::string& name) {
2499 auto it = hdr.vars.find(name);
2500 if (it == hdr.vars.end() || !it->second
2501 || it->second->type() != DRW_Variant::COORD
2502 || it->second->coord() == nullptr) {
2503 return {0.0, 0.0, 0.0};
2504 }
2505 return *it->second->coord();
2506 }
2507 /// Look up a TV string var; default empty.
2508 UTF8STRINGstd::string strVar(const DRW_Header& hdr, const std::string& name) {
2509 auto it = hdr.vars.find(name);
2510 if (it == hdr.vars.end() || !it->second
2511 || it->second->type() != DRW_Variant::STRING) {
2512 return {};
2513 }
2514 return UTF8STRINGstd::string(it->second->c_str());
2515 }
2516 /// Build a hard-pointer handle (code 4) referring to `ref`. Returns
2517 /// the null handle when ref==0, which matches what parseDwg sees in
2518 /// an empty document.
2519 dwgHandle makeHardPtr(duint32 ref) {
2520 dwgHandle h;
2521 h.code = (ref == 0) ? 0 : 4;
2522 h.ref = ref;
2523 h.size = 0;
2524 if (ref != 0) {
2525 duint32 t = ref;
2526 while (t != 0) { t >>= 8; ++h.size; }
2527 }
2528 return h;
2529 }
2530 /// Build a soft-owner handle (code 3) — used for the XDic-style
2531 /// owner references in the HEADER's control-handle block.
2532 dwgHandle makeSoftOwner(duint32 ref) {
2533 dwgHandle h;
2534 h.code = (ref == 0) ? 0 : 3;
2535 h.ref = ref;
2536 h.size = 0;
2537 if (ref != 0) {
2538 duint32 t = ref;
2539 while (t != 0) { t >>= 8; ++h.size; }
2540 }
2541 return h;
2542 }
2543 /// Decompose a stored double (TDCREATE-style "day.msec_fraction") back
2544 /// into the two BLs parseDwg reads. Inverse of:
2545 /// day = getBitLong(); msec = getBitLong();
2546 /// while (msec >= 1) msec /= 10;
2547 /// stored = day + msec;
2548 /// For an empty header (stored == 0.0) the result is (0, 0). Real
2549 /// fixture defaults still round-trip exactly because msec is always
2550 /// represented as fractional part * 10^k for some k.
2551 void splitTimeVar(double stored, dint32& day, dint32& msecOut) {
2552 day = static_cast<dint32>(stored);
2553 double frac = stored - static_cast<double>(day);
2554 if (frac == 0.0) { msecOut = 0; return; }
2555 // Reverse the divide-by-10 loop: multiply by 10 until the result
2556 // is integer (the original msec value). Cap at 10 iterations to
2557 // avoid pathological FP cases.
2558 for (int i = 0; i < 10; ++i) {
2559 frac *= 10.0;
2560 double rounded = std::round(frac);
2561 if (std::abs(frac - rounded) < 1e-9 && rounded != 0.0) {
2562 msecOut = static_cast<dint32>(rounded);
2563 return;
2564 }
2565 }
2566 msecOut = static_cast<dint32>(std::round(frac));
2567 }
2568} // namespace
2569
2570bool DRW_Header::encodeDwg(DRW::Version version, dwgBufferW *buf, dwgBufferW *hBbuf) {
2571 if (version != DRW::AC1015) return false; // R2000 only for v1
2572
2573 // -------- Unknown 4 BDs (parseDwg:1789-1792) ----------------------------
2574 buf->putBitDouble(0.0);
2575 buf->putBitDouble(0.0);
2576 buf->putBitDouble(0.0);
2577 buf->putBitDouble(0.0);
2578
2579 // -------- 4 CP8 string unknowns (parseDwg:1793-1798) --------------------
2580 // Gated on `version < AC1021` (2007-). R2000 hits this branch — emit
2581 // four empty CP8 strings (BS length=0).
2582 buf->putCP8Text(std::string());
2583 buf->putCP8Text(std::string());
2584 buf->putCP8Text(std::string());
2585 buf->putCP8Text(std::string());
2586
2587 // -------- Unknown longs (parseDwg:1799-1800) ----------------------------
2588 // parseDwg comments call these "Unknown long1 (24L)" and "(0L)". Real
2589 // R2000 files have 24 and 0 respectively.
2590 buf->putBitLong(24);
2591 buf->putBitLong(0);
2592
2593 // -------- Current-view handle (parseDwg:1804-1807) ----------------------
2594 // Gated on `version < AC1018` (pre-R2004). R2000 hits this branch —
2595 // emit a null handle. Reads from the handle stream (== buf for R2000).
2596 hBbuf->putHandle(makeHardPtr(0));
2597
2598 // -------- 9 single-bit vars (parseDwg:1808-1819; R2000-relevant set) ----
2599 buf->putBit(boolVar(*this, "DIMASO"));
2600 buf->putBit(boolVar(*this, "DIMSHO"));
2601 buf->putBit(boolVar(*this, "PLINEGEN"));
2602 buf->putBit(boolVar(*this, "ORTHOMODE"));
2603 buf->putBit(boolVar(*this, "REGENMODE"));
2604 buf->putBit(boolVar(*this, "FILLMODE"));
2605 buf->putBit(boolVar(*this, "QTEXTMODE"));
2606 buf->putBit(boolVar(*this, "PSLTSCALE"));
2607 buf->putBit(boolVar(*this, "LIMCHECK"));
2608
2609 // -------- 11 more single-bit vars (parseDwg:1824-1844) ------------------
2610 buf->putBit(boolVar(*this, "USRTIMER"));
2611 buf->putBit(boolVar(*this, "SKPOLY"));
2612 buf->putBit(boolVar(*this, "ANGDIR"));
2613 buf->putBit(boolVar(*this, "SPLFRAME"));
2614 buf->putBit(boolVar(*this, "MIRRTEXT"));
2615 buf->putBit(boolVar(*this, "WORLDVIEW"));
2616 buf->putBit(boolVar(*this, "TILEMODE"));
2617 buf->putBit(boolVar(*this, "PLIMCHECK"));
2618 buf->putBit(boolVar(*this, "VISRETAIN"));
2619 buf->putBit(boolVar(*this, "DISPSILH"));
2620 buf->putBit(boolVar(*this, "PELLIPSE"));
2621
2622 // -------- PROXIGRAPHICS through PDMODE (parseDwg:1845-1861) -------------
2623 buf->putBitShort(static_cast<duint16>(intVar(*this, "PROXIGRAPHICS", 1)));
2624 buf->putBitShort(static_cast<duint16>(intVar(*this, "TREEDEPTH", 3020)));
2625 buf->putBitShort(static_cast<duint16>(intVar(*this, "LUNITS", 2)));
2626 buf->putBitShort(static_cast<duint16>(intVar(*this, "LUPREC", 4)));
2627 buf->putBitShort(static_cast<duint16>(intVar(*this, "AUNITS", 0)));
2628 buf->putBitShort(static_cast<duint16>(intVar(*this, "AUPREC", 0)));
2629 buf->putBitShort(static_cast<duint16>(intVar(*this, "ATTMODE", 1)));
2630 buf->putBitShort(static_cast<duint16>(intVar(*this, "PDMODE", 0)));
2631
2632 // -------- USERI1..5 + spline/surface family (parseDwg:1870-1888) --------
2633 buf->putBitShort(static_cast<duint16>(intVar(*this, "USERI1")));
2634 buf->putBitShort(static_cast<duint16>(intVar(*this, "USERI2")));
2635 buf->putBitShort(static_cast<duint16>(intVar(*this, "USERI3")));
2636 buf->putBitShort(static_cast<duint16>(intVar(*this, "USERI4")));
2637 buf->putBitShort(static_cast<duint16>(intVar(*this, "USERI5")));
2638 buf->putBitShort(static_cast<duint16>(intVar(*this, "SPLINESEGS", 8)));
2639 buf->putBitShort(static_cast<duint16>(intVar(*this, "SURFU", 6)));
2640 buf->putBitShort(static_cast<duint16>(intVar(*this, "SURFV", 6)));
2641 buf->putBitShort(static_cast<duint16>(intVar(*this, "SURFTYPE", 6)));
2642 buf->putBitShort(static_cast<duint16>(intVar(*this, "SURFTAB1", 6)));
2643 buf->putBitShort(static_cast<duint16>(intVar(*this, "SURFTAB2", 6)));
2644 buf->putBitShort(static_cast<duint16>(intVar(*this, "SPLINETYPE", 6)));
2645 buf->putBitShort(static_cast<duint16>(intVar(*this, "SHADEDGE", 3)));
2646 buf->putBitShort(static_cast<duint16>(intVar(*this, "SHADEDIF", 70)));
2647 buf->putBitShort(static_cast<duint16>(intVar(*this, "UNITMODE")));
2648 buf->putBitShort(static_cast<duint16>(intVar(*this, "MAXACTVP", 64)));
2649 buf->putBitShort(static_cast<duint16>(intVar(*this, "ISOLINES", 4)));
2650 buf->putBitShort(static_cast<duint16>(intVar(*this, "CMLJUST")));
2651 buf->putBitShort(static_cast<duint16>(intVar(*this, "TEXTQLTY", 50)));
2652
2653 // -------- LTSCALE through CELTSCALE (parseDwg:1889-1909) ----------------
2654 buf->putBitDouble(dblVar(*this, "LTSCALE", 1.0));
2655 buf->putBitDouble(dblVar(*this, "TEXTSIZE", 2.5));
2656 buf->putBitDouble(dblVar(*this, "TRACEWID", 1.0));
2657 buf->putBitDouble(dblVar(*this, "SKETCHINC", 1.0));
2658 buf->putBitDouble(dblVar(*this, "FILLETRAD", 0.0));
2659 buf->putBitDouble(dblVar(*this, "THICKNESS", 0.0));
2660 buf->putBitDouble(dblVar(*this, "ANGBASE", 0.0));
2661 buf->putBitDouble(dblVar(*this, "PDSIZE", 0.0));
2662 buf->putBitDouble(dblVar(*this, "PLINEWID", 0.0));
2663 buf->putBitDouble(dblVar(*this, "USERR1", 0.0));
2664 buf->putBitDouble(dblVar(*this, "USERR2", 0.0));
2665 buf->putBitDouble(dblVar(*this, "USERR3", 0.0));
2666 buf->putBitDouble(dblVar(*this, "USERR4", 0.0));
2667 buf->putBitDouble(dblVar(*this, "USERR5", 0.0));
2668 buf->putBitDouble(dblVar(*this, "CHAMFERA", 0.0));
2669 buf->putBitDouble(dblVar(*this, "CHAMFERB", 0.0));
2670 buf->putBitDouble(dblVar(*this, "CHAMFERC", 0.0));
2671 buf->putBitDouble(dblVar(*this, "CHAMFERD", 0.0));
2672 buf->putBitDouble(dblVar(*this, "FACETRES", 0.5));
2673 buf->putBitDouble(dblVar(*this, "CMLSCALE", 1.0));
2674 buf->putBitDouble(dblVar(*this, "CELTSCALE", 1.0));
2675
2676 // -------- MENU string (R2004-, including R2000) -------------------------
2677 buf->putCP8Text(strVar(*this, "MENU"));
2678
2679 // -------- TDCREATE / TDUPDATE / TDINDWG / TDUSRTIMER (4 pairs of BLs) ---
2680 {
2681 dint32 day, msec;
2682 splitTimeVar(dblVar(*this, "TDCREATE"), day, msec);
2683 buf->putBitLong(day);
2684 buf->putBitLong(msec);
2685 }
2686 {
2687 dint32 day, msec;
2688 splitTimeVar(dblVar(*this, "TDUPDATE"), day, msec);
2689 buf->putBitLong(day);
2690 buf->putBitLong(msec);
2691 }
2692 {
2693 dint32 day, msec;
2694 splitTimeVar(dblVar(*this, "TDINDWG"), day, msec);
2695 buf->putBitLong(day);
2696 buf->putBitLong(msec);
2697 }
2698 {
2699 dint32 day, msec;
2700 splitTimeVar(dblVar(*this, "TDUSRTIMER"), day, msec);
2701 buf->putBitLong(day);
2702 buf->putBitLong(msec);
2703 }
2704
2705 // -------- CECOLOR + first handle block (parseDwg:1947-1963) -------------
2706 buf->putCmColor(version, static_cast<duint16>(intVar(*this, "CECOLOR", 256)));
2707 // HANDSEED — emitted into the DATA stream (`buf`), not hBbuf.
2708 // Stored in DRW_Header::handSeed (set by parseDwg on read; settable
2709 // by the writer caller from the HandleAllocator's high-water mark
2710 // for fresh documents). A zero value emits as a null handle —
2711 // libdxfrw round-trip tolerates it, but AutoCAD will refresh
2712 // HANDSEED to `max(handle)+1` on first save and mark the file
2713 // modified. See Risk 4j.
2714 buf->putHandle(makeHardPtr(handSeed));
2715 // The following 5 handles emit to the HANDLE stream. For R2000 the
2716 // handle stream is inline (buf == hBbuf in our usage).
2717 hBbuf->putHandle(makeHardPtr(0)); // CLAYER
2718 hBbuf->putHandle(makeHardPtr(0)); // TEXTSTYLE
2719 hBbuf->putHandle(makeHardPtr(0)); // CELTYPE
2720 hBbuf->putHandle(makeHardPtr(0)); // DIMSTYLE
2721 hBbuf->putHandle(makeHardPtr(0)); // CMLSTYLE
2722
2723 // -------- Paper-space view block (parseDwg:1965-1989) -------------------
2724 buf->putBitDouble(dblVar(*this, "PSVPSCALE", 1.0));
2725 buf->put3BitDouble(coordVar(*this, "PINSBASE"));
2726 buf->put3BitDouble(coordVar(*this, "PEXTMIN"));
2727 buf->put3BitDouble(coordVar(*this, "PEXTMAX"));
2728 buf->put2RawDouble(coordVar(*this, "PLIMMIN"));
2729 buf->put2RawDouble(coordVar(*this, "PLIMMAX"));
2730 buf->putBitDouble(dblVar(*this, "PELEVATION"));
2731 buf->put3BitDouble(coordVar(*this, "PUCSORG"));
2732 buf->put3BitDouble(coordVar(*this, "PUCSXDIR"));
2733 buf->put3BitDouble(coordVar(*this, "PUCSYDIR"));
2734 hBbuf->putHandle(makeHardPtr(0)); // PUCSNAME
2735 hBbuf->putHandle(makeHardPtr(0)); // PUCSORTHOREF
2736 buf->putBitShort(static_cast<duint16>(intVar(*this, "PUCSORTHOVIEW")));
2737 hBbuf->putHandle(makeHardPtr(0)); // PUCSBASE
2738 buf->put3BitDouble(coordVar(*this, "PUCSORGTOP"));
2739 buf->put3BitDouble(coordVar(*this, "PUCSORGBOTTOM"));
2740 buf->put3BitDouble(coordVar(*this, "PUCSORGLEFT"));
2741 buf->put3BitDouble(coordVar(*this, "PUCSORGRIGHT"));
2742 buf->put3BitDouble(coordVar(*this, "PUCSORGFRONT"));
2743 buf->put3BitDouble(coordVar(*this, "PUCSORGBACK"));
2744
2745 // -------- Model-space view block (parseDwg:1991-2018) -------------------
2746 buf->put3BitDouble(coordVar(*this, "INSBASE"));
2747 buf->put3BitDouble(coordVar(*this, "EXTMIN"));
2748 buf->put3BitDouble(coordVar(*this, "EXTMAX"));
2749 buf->put2RawDouble(coordVar(*this, "LIMMIN"));
2750 buf->put2RawDouble(coordVar(*this, "LIMMAX"));
2751 buf->putBitDouble(dblVar(*this, "ELEVATION"));
2752 buf->put3BitDouble(coordVar(*this, "UCSORG"));
2753 buf->put3BitDouble(coordVar(*this, "UCSXDIR"));
2754 buf->put3BitDouble(coordVar(*this, "UCSYDIR"));
2755 hBbuf->putHandle(makeHardPtr(0)); // UCSNAME
2756 hBbuf->putHandle(makeHardPtr(0)); // UCSORTHOREF
2757 buf->putBitShort(static_cast<duint16>(intVar(*this, "UCSORTHOVIEW")));
2758 hBbuf->putHandle(makeHardPtr(0)); // UCSBASE
2759 buf->put3BitDouble(coordVar(*this, "UCSORGTOP"));
2760 buf->put3BitDouble(coordVar(*this, "UCSORGBOTTOM"));
2761 buf->put3BitDouble(coordVar(*this, "UCSORGLEFT"));
2762 buf->put3BitDouble(coordVar(*this, "UCSORGRIGHT"));
2763 buf->put3BitDouble(coordVar(*this, "UCSORGFRONT"));
2764 buf->put3BitDouble(coordVar(*this, "UCSORGBACK"));
2765 buf->putCP8Text(strVar(*this, "DIMPOST"));
2766 buf->putCP8Text(strVar(*this, "DIMAPOST"));
2767
2768 // -------- DIM* values for R2000 (parseDwg:2053-2129; R14 branch dropped)
2769 buf->putBitDouble(dblVar(*this, "DIMSCALE", 1.0));
2770 buf->putBitDouble(dblVar(*this, "DIMASZ", 0.18));
2771 buf->putBitDouble(dblVar(*this, "DIMEXO", 0.0625));
2772 buf->putBitDouble(dblVar(*this, "DIMDLI", 0.38));
2773 buf->putBitDouble(dblVar(*this, "DIMEXE", 0.18));
2774 buf->putBitDouble(dblVar(*this, "DIMRND", 0.0));
2775 buf->putBitDouble(dblVar(*this, "DIMDLE", 0.0));
2776 buf->putBitDouble(dblVar(*this, "DIMTP", 0.0));
2777 buf->putBitDouble(dblVar(*this, "DIMTM", 0.0));
2778 // R2000+: 6 bits then 3 BS
2779 buf->putBit(boolVar(*this, "DIMTOL"));
2780 buf->putBit(boolVar(*this, "DIMLIM"));
2781 buf->putBit(boolVar(*this, "DIMTIH"));
2782 buf->putBit(boolVar(*this, "DIMTOH"));
2783 buf->putBit(boolVar(*this, "DIMSE1"));
2784 buf->putBit(boolVar(*this, "DIMSE2"));
2785 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIMTAD")));
2786 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIMZIN")));
2787 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIMAZIN")));
2788 buf->putBitDouble(dblVar(*this, "DIMTXT", 0.18));
2789 buf->putBitDouble(dblVar(*this, "DIMCEN", 0.09));
2790 buf->putBitDouble(dblVar(*this, "DIMTSZ", 0.0));
2791 buf->putBitDouble(dblVar(*this, "DIMALTF", 25.4));
2792 buf->putBitDouble(dblVar(*this, "DIMLFAC", 1.0));
2793 buf->putBitDouble(dblVar(*this, "DIMTVP", 0.0));
2794 buf->putBitDouble(dblVar(*this, "DIMTFAC", 1.0));
2795 buf->putBitDouble(dblVar(*this, "DIMGAP", 0.09));
2796 // R2000+: DIMALTRND + 5 more DIM bits
2797 buf->putBitDouble(dblVar(*this, "DIMALTRND", 0.0));
2798 buf->putBit(boolVar(*this, "DIMALT"));
2799 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIMALTD", 2)));
2800 buf->putBit(boolVar(*this, "DIMTOFL"));
2801 buf->putBit(boolVar(*this, "DIMSAH"));
2802 buf->putBit(boolVar(*this, "DIMTIX"));
2803 buf->putBit(boolVar(*this, "DIMSOXD"));
2804 // 3 CMC colors
2805 buf->putCmColor(version, static_cast<duint16>(intVar(*this, "DIMCLRD")));
2806 buf->putCmColor(version, static_cast<duint16>(intVar(*this, "DIMCLRE")));
2807 buf->putCmColor(version, static_cast<duint16>(intVar(*this, "DIMCLRT")));
2808 // R2000+ DIM BS family
2809 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIAMDEC")));
2810 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIMDEC", 4)));
2811 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIMTDEC", 4)));
2812 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIMALTU", 2)));
2813 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIMALTTD", 2)));
2814 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIMAUNIT")));
2815 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIMFAC")));
2816 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIMLUNIT", 2)));
2817 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIMDSEP", '.')));
2818 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIMTMOVE")));
2819 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIMJUST")));
2820 buf->putBit(boolVar(*this, "DIMSD1"));
2821 buf->putBit(boolVar(*this, "DIMSD2"));
2822 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIMTOLJ", 1)));
2823 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIMTZIN")));
2824 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIMALTZ")));
2825 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIMALTTZ")));
2826 buf->putBit(boolVar(*this, "DIMUPT"));
2827 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIMATFIT", 3)));
2828
2829 // -------- DIM handles (R2000+: 5 handles) (parseDwg:2139-2148) ----------
2830 hBbuf->putHandle(makeHardPtr(0)); // DIMTXSTY
2831 hBbuf->putHandle(makeHardPtr(0)); // DIMLDRBLK
2832 hBbuf->putHandle(makeHardPtr(0)); // DIMBLK
2833 hBbuf->putHandle(makeHardPtr(0)); // DIMBLK1
2834 hBbuf->putHandle(makeHardPtr(0)); // DIMBLK2
2835
2836 // -------- DIMLWD, DIMLWE (R2000+: 2 BS) (parseDwg:2159-2160) ------------
2837 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIMLWD", -2)));
2838 buf->putBitShort(static_cast<duint16>(intVar(*this, "DIMLWE", -2)));
2839
2840 // -------- Control-handle block (parseDwg:2162-2199, 13 handles) ---------
2841 // For R2000, version < AC1018 is true so vpEntHeaderCtrl IS emitted.
2842 // The trailing 3 NOD dict handles are emitted as null per Phase 3 sub-plan.
2843 hBbuf->putHandle(makeHardPtr(blockCtrl)); // BLOCK_CONTROL (0x01)
2844 hBbuf->putHandle(makeHardPtr(layerCtrl)); // LAYER_CONTROL (0x02)
2845 hBbuf->putHandle(makeHardPtr(styleCtrl)); // STYLE_CONTROL (0x03)
2846 hBbuf->putHandle(makeHardPtr(linetypeCtrl)); // LTYPE_CONTROL (0x05)
2847 hBbuf->putHandle(makeHardPtr(viewCtrl)); // VIEW_CONTROL (0x06)
2848 hBbuf->putHandle(makeHardPtr(ucsCtrl)); // UCS_CONTROL (0x07)
2849 hBbuf->putHandle(makeHardPtr(vportCtrl)); // VPORT_CONTROL (0x08)
2850 hBbuf->putHandle(makeHardPtr(appidCtrl)); // APPID_CONTROL (0x09)
2851 hBbuf->putHandle(makeHardPtr(dimstyleCtrl)); // DIMSTYLE_CONTROL (0x0A)
2852 hBbuf->putHandle(makeHardPtr(vpEntHeaderCtrl)); // VPORT_ENTITY_HEADER_CONTROL (R2000 only, 0x0B)
2853 hBbuf->putHandle(makeSoftOwner(0)); // DICT ACAD_GROUP (Phase 3.5: 0x0D)
2854 hBbuf->putHandle(makeSoftOwner(0)); // DICT ACAD_MLINESTYLE (Phase 3.5: 0x0E)
2855 hBbuf->putHandle(makeSoftOwner(0)); // DICT NAMED OBJS (Phase 3.5: 0x0C)
2856
2857 // -------- Post-control TSTACKALIGN/TSTACKSIZE + 3 NOD-related dict handles
2858 buf->putBitShort(static_cast<duint16>(intVar(*this, "TSTACKALIGN", 1)));
2859 buf->putBitShort(static_cast<duint16>(intVar(*this, "TSTACKSIZE", 70)));
2860 buf->putCP8Text(strVar(*this, "HYPERLINKBASE"));
2861 buf->putCP8Text(strVar(*this, "STYLESHEET"));
2862 hBbuf->putHandle(makeSoftOwner(0)); // DICT LAYOUTS (Phase 3.5)
2863 hBbuf->putHandle(makeSoftOwner(0)); // DICT PLOTSETTINGS (Phase 3.5)
2864 hBbuf->putHandle(makeSoftOwner(0)); // DICT PLOTSTYLES (Phase 3.5)
2865
2866 // -------- Flags (BL) + INSUNITS (BS) + CEPSNTYPE (BS) -------------------
2867 buf->putBitLong(0); // Flags — 8 sub-fields per parseDwg comment; defaults to 0
2868 buf->putBitShort(static_cast<duint16>(intVar(*this, "INSUNITS")));
2869 duint16 cepsntype = static_cast<duint16>(intVar(*this, "CEPSNTYPE"));
2870 buf->putBitShort(cepsntype);
2871 if (cepsntype == 3) {
2872 hBbuf->putHandle(makeHardPtr(0)); // CPSNID
2873 }
2874 buf->putCP8Text(strVar(*this, "FINGERPRINTGUID"));
2875 buf->putCP8Text(strVar(*this, "VERSIONGUID"));
2876
2877 // -------- 5 reserved-block handles (parseDwg:2258-2267) -----------------
2878 // PAPER_SPACE, MODEL_SPACE block headers + BYLAYER, BYBLOCK, CONTINUOUS
2879 // linetype records. Reserved handles 0x18, 0x17, 0x10, 0x0F, 0x11.
2880 hBbuf->putHandle(makeHardPtr(0x18)); // BLOCK PAPER_SPACE
2881 hBbuf->putHandle(makeHardPtr(0x17)); // BLOCK MODEL_SPACE
2882 hBbuf->putHandle(makeHardPtr(0x10)); // LTYPE BYLAYER
2883 hBbuf->putHandle(makeHardPtr(0x0F)); // LTYPE BYBLOCK
2884 hBbuf->putHandle(makeHardPtr(0x11)); // LTYPE CONTINUOUS
2885
2886 // -------- R14+ trailing 4 BS unknowns (parseDwg:2307-2312) --------------
2887 buf->putBitShort(0);
2888 buf->putBitShort(0);
2889 buf->putBitShort(0);
2890 buf->putBitShort(0);
2891
2892 return true;
2893}
2894
2895int DRW_Header::measurement(const int unit) {
2896 switch (unit) {
2897 case Units::Inch:
2898 case Units::Foot:
2899 case Units::Mile:
2900 case Units::Microinch:
2901 case Units::Mil:
2902 case Units::Yard:
2903 return Units::English;
2904
2905 default:
2906 break;
2907 }
2908
2909 return Units::Metric;
2910}