Bug Summary

File:libraries/libdxfrw/src/drw_header.cpp
Warning:line 2541, column 19
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-07-14-153100-5089-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 <cstdio>
18#include "intern/dxfreader.h"
19#include "intern/dxfwriter.h"
20#include "intern/drw_dbg.h"
21#include "intern/dwgbuffer.h"
22#include "intern/dwgbufferw.h"
23
24DRW_Header::DRW_Header() {
25 linetypeCtrl = layerCtrl = styleCtrl = dimstyleCtrl = appidCtrl = 0;
26 blockCtrl = viewCtrl = ucsCtrl = vportCtrl = vpEntHeaderCtrl = 0;
27 version = DRW::AC1021;
28}
29
30void DRW_Header::addComment(std::string c){
31 if (!comments.empty())
32 comments += '\n';
33 comments += c;
34}
35
36bool DRW_Header::parseCode(int code, const std::unique_ptr<dxfReader>& reader){
37 if (nullptr == curr && 9 != code) {
38 DRW_DBG("invalid header code: ")DRW_dbg::dbg("invalid header code: ");
39 DRW_DBG(code)DRW_dbg::dbg(code);
40 DRW_DBG("\n")DRW_dbg::dbg("\n");
41 return false;
42 }
43
44 switch (code) {
45 case 9:
46 name = reader->getString();
47 if (version < DRW::AC1015 && name == "$DIMUNIT")
48 name="$DIMLUNIT";
49 storeVar(name, new DRW_Variant());
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 case DRW::AC1032: //acad 2018
153 varStr = "AC1032";
154 break;
155 default: //acad 2007 default version
156 varStr = "AC1021";
157 break;
158 }
159 writer->writeString(1, varStr);
160 writer->setVersion(varStr, true);
161
162 getStr("$ACADVER", &varStr);
163 // $ACADMAINTVER (R2000+) was read then discarded. Emit it; the group code
164 // changed from 70 (Int16) to 90 (Int32) in R2018+ (ezdxf headervars.py).
165 if (ver > DRW::AC1014) {
166 writer->writeString(9, "$ACADMAINTVER");
167 int maintVer = 0;
168 getInt("$ACADMAINTVER", &maintVer);
169 if (ver >= DRW::AC1032)
170 writer->writeInt32(90, maintVer);
171 else
172 writer->writeInt16(70, maintVer);
173 }
174
175 if (!getStr("$DWGCODEPAGE", &varStr)) {
176 varStr = "ANSI_1252";
177 }
178 writer->writeString(9, "$DWGCODEPAGE");
179 writer->setCodePage(varStr);
180 writer->writeString(3, writer->getCodePage() );
181 writer->writeString(9, "$INSBASE");
182 if (getCoord("$INSBASE", &varCoord)) {
183 writer->writeDouble(10, varCoord.x);
184 writer->writeDouble(20, varCoord.y);
185 writer->writeDouble(30, varCoord.z);
186 } else {
187 writer->writeDouble(10, 0.0);
188 writer->writeDouble(20, 0.0);
189 writer->writeDouble(30, 0.0);
190 }
191 writer->writeString(9, "$EXTMIN");
192 if (getCoord("$EXTMIN", &varCoord)) {
193 writer->writeDouble(10, varCoord.x);
194 writer->writeDouble(20, varCoord.y);
195 writer->writeDouble(30, varCoord.z);
196 } else {
197 writer->writeDouble(10, 1.0000000000000000E+020);
198 writer->writeDouble(20, 1.0000000000000000E+020);
199 writer->writeDouble(30, 1.0000000000000000E+020);
200 }
201 writer->writeString(9, "$EXTMAX");
202 if (getCoord("$EXTMAX", &varCoord)) {
203 writer->writeDouble(10, varCoord.x);
204 writer->writeDouble(20, varCoord.y);
205 writer->writeDouble(30, varCoord.z);
206 } else {
207 writer->writeDouble(10, -1.0000000000000000E+020);
208 writer->writeDouble(20, -1.0000000000000000E+020);
209 writer->writeDouble(30, -1.0000000000000000E+020);
210 }
211 writer->writeString(9, "$LIMMIN");
212 if (getCoord("$LIMMIN", &varCoord)) {
213 writer->writeDouble(10, varCoord.x);
214 writer->writeDouble(20, varCoord.y);
215 } else {
216 writer->writeDouble(10, 0.0);
217 writer->writeDouble(20, 0.0);
218 }
219 writer->writeString(9, "$LIMMAX");
220 if (getCoord("$LIMMAX", &varCoord)) {
221 writer->writeDouble(10, varCoord.x);
222 writer->writeDouble(20, varCoord.y);
223 } else {
224 writer->writeDouble(10, 420.0);
225 writer->writeDouble(20, 297.0);
226 }
227 writer->writeString(9, "$ORTHOMODE");
228 if (getInt("$ORTHOMODE", &varInt))
229 writer->writeInt16(70, varInt);
230 else
231 writer->writeInt16(70, 0);
232 writer->writeString(9, "$REGENMODE");
233 if (getInt("$REGENMODE", &varInt))
234 writer->writeInt16(70, varInt);
235 else
236 writer->writeInt16(70, 1);
237 writer->writeString(9, "$FILLMODE");
238 if (getInt("$FILLMODE", &varInt))
239 writer->writeInt16(70, varInt);
240 else
241 writer->writeInt16(70, 1);
242 writer->writeString(9, "$QTEXTMODE");
243 if (getInt("$QTEXTMODE", &varInt))
244 writer->writeInt16(70, varInt);
245 else
246 writer->writeInt16(70, 0);
247 writer->writeString(9, "$MIRRTEXT");
248 if (getInt("$MIRRTEXT", &varInt))
249 writer->writeInt16(70, varInt);
250 else
251 writer->writeInt16(70, 0);
252 if (ver == DRW::AC1009){
253 writer->writeString(9, "$DRAGMODE");
254 if (getInt("$DRAGMODE", &varInt))
255 writer->writeInt16(70, varInt);
256 else
257 writer->writeInt16(70, 2);
258 }
259 writer->writeString(9, "$LTSCALE");
260 if (getDouble("$LTSCALE", &varDouble))
261 writer->writeDouble(40, varDouble);
262 else
263 writer->writeDouble(40, 1.0);
264 if (ver == DRW::AC1009){
265 writer->writeString(9, "$OSMODE");
266 if (getInt("$OSMODE", &varInt))
267 writer->writeInt16(70, varInt);
268 else
269 writer->writeInt16(70, 0);
270 }
271 writer->writeString(9, "$ATTMODE");
272 if (getInt("$ATTMODE", &varInt))
273 writer->writeInt16(70, varInt);
274 else
275 writer->writeInt16(70, 0);
276 writer->writeString(9, "$TEXTSIZE");
277 if (getDouble("$TEXTSIZE", &varDouble))
278 writer->writeDouble(40, varDouble);
279 else
280 writer->writeDouble(40, 2.5);
281 writer->writeString(9, "$TRACEWID");
282 if (getDouble("$TRACEWID", &varDouble))
283 writer->writeDouble(40, varDouble);
284 else
285 writer->writeDouble(40, 15.68);
286 writer->writeString(9, "$TEXTSTYLE");
287 if (getStr("$TEXTSTYLE", &varStr))
288 if (ver == DRW::AC1009)
289 writer->writeUtf8Caps(7, varStr);
290 else
291 writer->writeUtf8String(7, varStr);
292 else
293 writer->writeString(7, "STANDARD");
294 writer->writeString(9, "$CLAYER");
295 if (getStr("$CLAYER", &varStr))
296 if (ver == DRW::AC1009)
297 writer->writeUtf8Caps(8, varStr);
298 else
299 writer->writeUtf8String(8, varStr);
300 else
301 writer->writeString(8, "0");
302 writer->writeString(9, "$CELTYPE");
303 if (getStr("$CELTYPE", &varStr))
304 if (ver == DRW::AC1009)
305 writer->writeUtf8Caps(6, varStr);
306 else
307 writer->writeUtf8String(6, varStr);
308 else
309 writer->writeString(6, "BYLAYER");
310 writer->writeString(9, "$CECOLOR");
311 if (getInt("$CECOLOR", &varInt))
312 writer->writeInt16(62, varInt);
313 else
314 writer->writeInt16(62, 256);
315 if (ver > DRW::AC1009){
316 writer->writeString(9, "$CELTSCALE");
317 if (getDouble("$CELTSCALE", &varDouble))
318 writer->writeDouble(40, varDouble);
319 else
320 writer->writeDouble(40, 1.0);
321 writer->writeString(9, "$DISPSILH");
322 if (getInt("$DISPSILH", &varInt))
323 writer->writeInt16(70, varInt);
324 else
325 writer->writeInt16(70, 0);
326 writer->writeString(9, "$PELLIPSE");
327 if (getInt("$PELLIPSE", &varInt))
328 writer->writeInt16(70, varInt);
329 else
330 writer->writeInt16(70, 0);
331 }
332
333 writer->writeString(9, "$DIMSCALE");
334 if (getDouble("$DIMSCALE", &varDouble))
335 writer->writeDouble(40, varDouble);
336 else
337 writer->writeDouble(40, 2.5);
338 writer->writeString(9, "$DIMASZ");
339 if (getDouble("$DIMASZ", &varDouble))
340 writer->writeDouble(40, varDouble);
341 else
342 writer->writeDouble(40, 2.5);
343 writer->writeString(9, "$DIMEXO");
344 if (getDouble("$DIMEXO", &varDouble))
345 writer->writeDouble(40, varDouble);
346 else
347 writer->writeDouble(40, 0.625);
348 writer->writeString(9, "$DIMDLI");
349 if (getDouble("$DIMDLI", &varDouble))
350 writer->writeDouble(40, varDouble);
351 else
352 writer->writeDouble(40, 3.75);
353 writer->writeString(9, "$DIMRND");
354 if (getDouble("$DIMRND", &varDouble))
355 writer->writeDouble(40, varDouble);
356 else
357 writer->writeDouble(40, 0.0);
358 writer->writeString(9, "$DIMDLE");
359 if (getDouble("$DIMDLE", &varDouble))
360 writer->writeDouble(40, varDouble);
361 else
362 writer->writeDouble(40, 0.0);
363 writer->writeString(9, "$DIMEXE");
364 if (getDouble("$DIMEXE", &varDouble))
365 writer->writeDouble(40, varDouble);
366 else
367 writer->writeDouble(40, 1.25);
368 writer->writeString(9, "$DIMTP");
369 if (getDouble("$DIMTP", &varDouble))
370 writer->writeDouble(40, varDouble);
371 else
372 writer->writeDouble(40, 0.0);
373 writer->writeString(9, "$DIMTM");
374 if (getDouble("$DIMTM", &varDouble))
375 writer->writeDouble(40, varDouble);
376 else
377 writer->writeDouble(40, 0.0);
378 writer->writeString(9, "$DIMTXT");
379 if (getDouble("$DIMTXT", &varDouble))
380 writer->writeDouble(40, varDouble);
381 else
382 writer->writeDouble(40, 2.5);
383 writer->writeString(9, "$DIMCEN");
384 if (getDouble("$DIMCEN", &varDouble))
385 writer->writeDouble(40, varDouble);
386 else
387 writer->writeDouble(40, 2.5);
388 writer->writeString(9, "$DIMTSZ");
389 if (getDouble("$DIMTSZ", &varDouble))
390 writer->writeDouble(40, varDouble);
391 else
392 writer->writeDouble(40, 0.0);
393 writer->writeString(9, "$DIMTOL");
394 if (getInt("$DIMTOL", &varInt))
395 writer->writeInt16(70, varInt);
396 else
397 writer->writeInt16(70, 0);
398 writer->writeString(9, "$DIMLIM");
399 if (getInt("$DIMLIM", &varInt))
400 writer->writeInt16(70, varInt);
401 else
402 writer->writeInt16(70, 0);
403 writer->writeString(9, "$DIMTIH");
404 if (getInt("$DIMTIH", &varInt))
405 writer->writeInt16(70, varInt);
406 else
407 writer->writeInt16(70, 0);
408 writer->writeString(9, "$DIMTOH");
409 if (getInt("$DIMTOH", &varInt))
410 writer->writeInt16(70, varInt);
411 else
412 writer->writeInt16(70, 0);
413 writer->writeString(9, "$DIMSE1");
414 if (getInt("$DIMSE1", &varInt))
415 writer->writeInt16(70, varInt);
416 else
417 writer->writeInt16(70, 0);
418 writer->writeString(9, "$DIMSE2");
419 if (getInt("$DIMSE2", &varInt))
420 writer->writeInt16(70, varInt);
421 else
422 writer->writeInt16(70, 0);
423 writer->writeString(9, "$DIMTAD");
424 if (getInt("$DIMTAD", &varInt))
425 writer->writeInt16(70, varInt);
426 else
427 writer->writeInt16(70, 1);
428 writer->writeString(9, "$DIMZIN");
429 if (getInt("$DIMZIN", &varInt))
430 writer->writeInt16(70, varInt);
431 else
432 writer->writeInt16(70, 8);
433 writer->writeString(9, "$DIMBLK");
434 if (getStr("$DIMBLK", &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, "$DIMASO");
442 if (getInt("$DIMASO", &varInt))
443 writer->writeInt16(70, varInt);
444 else
445 writer->writeInt16(70, 1);
446 writer->writeString(9, "$DIMSHO");
447 if (getInt("$DIMSHO", &varInt))
448 writer->writeInt16(70, varInt);
449 else
450 writer->writeInt16(70, 1);
451 writer->writeString(9, "$DIMPOST");
452 if (getStr("$DIMPOST", &varStr))
453 if (ver == DRW::AC1009)
454 writer->writeUtf8Caps(1, varStr);
455 else
456 writer->writeUtf8String(1, varStr);
457 else
458 writer->writeString(1, "");
459 writer->writeString(9, "$DIMAPOST");
460 if (getStr("$DIMAPOST", &varStr))
461 if (ver == DRW::AC1009)
462 writer->writeUtf8Caps(1, varStr);
463 else
464 writer->writeUtf8String(1, varStr);
465 else
466 writer->writeString(1, "");
467 writer->writeString(9, "$DIMALT");
468 if (getInt("$DIMALT", &varInt))
469 writer->writeInt16(70, varInt);
470 else
471 writer->writeInt16(70, 0);
472 writer->writeString(9, "$DIMALTD");
473 if (getInt("$DIMALTD", &varInt))
474 writer->writeInt16(70, varInt);
475 else
476 writer->writeInt16(70, 3);
477 writer->writeString(9, "$DIMALTF");
478 if (getDouble("$DIMALTF", &varDouble))
479 writer->writeDouble(40, varDouble);
480 else
481 writer->writeDouble(40, 0.03937);
482 writer->writeString(9, "$DIMLFAC");
483 if (getDouble("$DIMLFAC", &varDouble))
484 writer->writeDouble(40, varDouble);
485 else
486 writer->writeDouble(40, 1.0);
487 writer->writeString(9, "$DIMTOFL");
488 if (getInt("$DIMTOFL", &varInt))
489 writer->writeInt16(70, varInt);
490 else
491 writer->writeInt16(70, 1);
492 writer->writeString(9, "$DIMTVP");
493 if (getDouble("$DIMTVP", &varDouble))
494 writer->writeDouble(40, varDouble);
495 else
496 writer->writeDouble(40, 0.0);
497 writer->writeString(9, "$DIMTIX");
498 if (getInt("$DIMTIX", &varInt))
499 writer->writeInt16(70, varInt);
500 else
501 writer->writeInt16(70, 0);
502 writer->writeString(9, "$DIMSOXD");
503 if (getInt("$DIMSOXD", &varInt))
504 writer->writeInt16(70, varInt);
505 else
506 writer->writeInt16(70, 0);
507 writer->writeString(9, "$DIMSAH");
508 if (getInt("$DIMSAH", &varInt))
509 writer->writeInt16(70, varInt);
510 else
511 writer->writeInt16(70, 0);
512 writer->writeString(9, "$DIMBLK1");
513 if (getStr("$DIMBLK1", &varStr))
514 if (ver == DRW::AC1009)
515 writer->writeUtf8Caps(1, varStr);
516 else
517 writer->writeUtf8String(1, varStr);
518 else
519 writer->writeString(1, "");
520 writer->writeString(9, "$DIMBLK2");
521 if (getStr("$DIMBLK2", &varStr))
522 if (ver == DRW::AC1009)
523 writer->writeUtf8Caps(1, varStr);
524 else
525 writer->writeUtf8String(1, varStr);
526 else
527 writer->writeString(1, "");
528 writer->writeString(9, "$DIMSTYLE");
529 if (getStr("$DIMSTYLE", &varStr))
530 if (ver == DRW::AC1009)
531 writer->writeUtf8Caps(2, varStr);
532 else
533 writer->writeUtf8String(2, varStr);
534 else
535 writer->writeString(2, "STANDARD");
536 writer->writeString(9, "$DIMCLRD");
537 if (getInt("$DIMCLRD", &varInt))
538 writer->writeInt16(70, varInt);
539 else
540 writer->writeInt16(70, 0);
541 writer->writeString(9, "$DIMCLRE");
542 if (getInt("$DIMCLRE", &varInt))
543 writer->writeInt16(70, varInt);
544 else
545 writer->writeInt16(70, 0);
546 writer->writeString(9, "$DIMCLRT");
547 if (getInt("$DIMCLRT", &varInt))
548 writer->writeInt16(70, varInt);
549 else
550 writer->writeInt16(70, 0);
551 writer->writeString(9, "$DIMTFAC");
552 if (getDouble("$DIMTFAC", &varDouble))
553 writer->writeDouble(40, varDouble);
554 else
555 writer->writeDouble(40, 1.0);
556 writer->writeString(9, "$DIMGAP");
557 if (getDouble("$DIMGAP", &varDouble))
558 writer->writeDouble(40, varDouble);
559 else
560 writer->writeDouble(40, 0.625);
561 //post r12 dim vars
562 if (ver > DRW::AC1009) {
563 writer->writeString(9, "$DIMJUST");
564 if (getInt("$DIMJUST", &varInt))
565 writer->writeInt16(70, varInt);
566 else
567 writer->writeInt16(70, 0);
568 writer->writeString(9, "$DIMSD1");
569 if (getInt("$DIMSD1", &varInt))
570 writer->writeInt16(70, varInt);
571 else
572 writer->writeInt16(70, 0);
573 writer->writeString(9, "$DIMSD2");
574 if (getInt("$DIMSD2", &varInt))
575 writer->writeInt16(70, varInt);
576 else
577 writer->writeInt16(70, 0);
578 writer->writeString(9, "$DIMTOLJ");
579 if (getInt("$DIMTOLJ", &varInt))
580 writer->writeInt16(70, varInt);
581 else
582 writer->writeInt16(70, 0);
583 writer->writeString(9, "$DIMTZIN");
584 if (getInt("$DIMTZIN", &varInt))
585 writer->writeInt16(70, varInt);
586 else
587 writer->writeInt16(70, 8);
588 writer->writeString(9, "$DIMALTZ");
589 if (getInt("$DIMALTZ", &varInt))
590 writer->writeInt16(70, varInt);
591 else
592 writer->writeInt16(70, 0);
593 writer->writeString(9, "$DIMALTTZ");
594 if (getInt("$DIMALTTZ", &varInt))
595 writer->writeInt16(70, varInt);
596 else
597 writer->writeInt16(70, 0);
598 writer->writeString(9, "$DIMUPT");
599 if (getInt("$DIMUPT", &varInt))
600 writer->writeInt16(70, varInt);
601 else
602 writer->writeInt16(70, 0);
603 writer->writeString(9, "$DIMDEC");
604 if (getInt("$DIMDEC", &varInt))
605 writer->writeInt16(70, varInt);
606 else
607 writer->writeInt16(70, 2);
608 writer->writeString(9, "$DIMTDEC");
609 if (getInt("$DIMTDEC", &varInt))
610 writer->writeInt16(70, varInt);
611 else
612 writer->writeInt16(70, 2);
613 writer->writeString(9, "$DIMALTU");
614 if (getInt("$DIMALTU", &varInt))
615 writer->writeInt16(70, varInt);
616 else
617 writer->writeInt16(70, 2);
618 writer->writeString(9, "$DIMALTTD");
619 if (getInt("$DIMALTTD", &varInt))
620 writer->writeInt16(70, varInt);
621 else
622 writer->writeInt16(70, 3);
623 writer->writeString(9, "$DIMTXSTY");
624 if (getStr("$DIMTXSTY", &varStr))
625 if (ver == DRW::AC1009)
626 writer->writeUtf8Caps(7, varStr);
627 else
628 writer->writeUtf8String(7, varStr);
629 else
630 writer->writeString(7, "STANDARD");
631 writer->writeString(9, "$DIMAUNIT");
632 if (getInt("$DIMAUNIT", &varInt))
633 writer->writeInt16(70, varInt);
634 else
635 writer->writeInt16(70, 0);
636 writer->writeString(9, "$DIMADEC");
637 if (getInt("$DIMADEC", &varInt))
638 writer->writeInt16(70, varInt);
639 else
640 writer->writeInt16(70, 0);
641 writer->writeString(9, "$DIMALTRND");
642 if (getDouble("$DIMALTRND", &varDouble))
643 writer->writeDouble(40, varDouble);
644 else
645 writer->writeDouble(40, 0.0);
646 writer->writeString(9, "$DIMAZIN");
647 if (getInt("$DIMAZIN", &varInt))
648 writer->writeInt16(70, varInt);
649 else
650 writer->writeInt16(70, 0);
651 writer->writeString(9, "$DIMDSEP");
652 if (getInt("$DIMDSEP", &varInt))
653 writer->writeInt16(70, varInt);
654 else
655 writer->writeInt16(70, 44);
656 writer->writeString(9, "$DIMATFIT");
657 if (getInt("$DIMATFIT", &varInt))
658 writer->writeInt16(70, varInt);
659 else
660 writer->writeInt16(70, 3);
661 writer->writeString(9, "$DIMFRAC");
662 if (getInt("$DIMFRAC", &varInt))
663 writer->writeInt16(70, varInt);
664 else
665 writer->writeInt16(70, 0);
666 writer->writeString(9, "$DIMLDRBLK");
667 if (getStr("$DIMLDRBLK", &varStr))
668 if (ver == DRW::AC1009)
669 writer->writeUtf8Caps(1, varStr);
670 else
671 writer->writeUtf8String(1, varStr);
672 else
673 writer->writeString(1, "STANDARD");
674 //verify if exist "$DIMLUNIT" or obsolete "$DIMUNIT" (pre v2000)
675 if ( !getInt("$DIMLUNIT", &varInt) ){
676 if (!getInt("$DIMUNIT", &varInt))
677 varInt = 2;
678 }
679 //verify valid values from 1 to 6
680 if (varInt<1 || varInt>6)
681 varInt = 2;
682 if (ver > DRW::AC1014) {
683 writer->writeString(9, "$DIMLUNIT");
684 writer->writeInt16(70, varInt);
685 } else {
686 writer->writeString(9, "$DIMUNIT");
687 writer->writeInt16(70, varInt);
688 }
689 writer->writeString(9, "$DIMLWD");
690 if (getInt("$DIMLWD", &varInt))
691 writer->writeInt16(70, varInt);
692 else
693 writer->writeInt16(70, -2);
694 writer->writeString(9, "$DIMLWE");
695 if (getInt("$DIMLWE", &varInt))
696 writer->writeInt16(70, varInt);
697 else
698 writer->writeInt16(70, -2);
699 writer->writeString(9, "$DIMTMOVE");
700 if (getInt("$DIMTMOVE", &varInt))
701 writer->writeInt16(70, varInt);
702 else
703 writer->writeInt16(70, 0);
704
705 if (ver > DRW::AC1018) {// and post v2004 dim vars
706 writer->writeString(9, "$DIMFXL");
707 if (getDouble("$DIMFXL", &varDouble))
708 writer->writeDouble(40, varDouble);
709 else
710 writer->writeDouble(40, 1.0);
711 writer->writeString(9, "$DIMFXLON");
712 if (getInt("$DIMFXLON", &varInt))
713 writer->writeInt16(70, varInt);
714 else
715 writer->writeInt16(70, 0);
716 writer->writeString(9, "$DIMJOGANG");
717 if (getDouble("$DIMJOGANG", &varDouble))
718 writer->writeDouble(40, varDouble);
719 else
720 writer->writeDouble(40, 0.7854);
721 writer->writeString(9, "$DIMTFILL");
722 if (getInt("$DIMTFILL", &varInt))
723 writer->writeInt16(70, varInt);
724 else
725 writer->writeInt16(70, 0);
726 writer->writeString(9, "$DIMTFILLCLR");
727 if (getInt("$DIMTFILLCLR", &varInt))
728 writer->writeInt16(70, varInt);
729 else
730 writer->writeInt16(70, 0);
731 writer->writeString(9, "$DIMARCSYM");
732 if (getInt("$DIMARCSYM", &varInt))
733 writer->writeInt16(70, varInt);
734 else
735 writer->writeInt16(70, 0);
736 writer->writeString(9, "$DIMLTYPE");
737 if (getStr("$DIMLTYPE", &varStr))
738 if (ver == DRW::AC1009)
739 writer->writeUtf8Caps(6, varStr);
740 else
741 writer->writeUtf8String(6, varStr);
742 else
743 writer->writeString(6, "");
744 writer->writeString(9, "$DIMLTEX1");
745 if (getStr("$DIMLTEX1", &varStr))
746 if (ver == DRW::AC1009)
747 writer->writeUtf8Caps(6, varStr);
748 else
749 writer->writeUtf8String(6, varStr);
750 else
751 writer->writeString(6, "");
752 writer->writeString(9, "$DIMLTEX2");
753 if (getStr("$DIMLTEX2", &varStr))
754 if (ver == DRW::AC1009)
755 writer->writeUtf8Caps(6, varStr);
756 else
757 writer->writeUtf8String(6, varStr);
758 else
759 writer->writeString(6, "");
760 if (ver > DRW::AC1021) {// and post v2007 dim vars
761 writer->writeString(9, "$DIMTXTDIRECTION");
762 if (getInt("$DIMTXTDIRECTION", &varInt))
763 writer->writeInt16(70, varInt);
764 else
765 writer->writeInt16(70, 0);
766 writer->writeString(9, "$DIMALTMZF");
767 if (getDouble("$DIMALTMZF", &varDouble))
768 writer->writeDouble(40, varDouble);
769 else
770 writer->writeDouble(40, 1.0);
771 writer->writeString(9, "$DIMALTMZS");
772 if (getStr("$DIMALTMZS", &varStr))
773 writer->writeUtf8String(1, varStr);
774 else
775 writer->writeString(1, "");
776 writer->writeString(9, "$DIMMZF");
777 if (getDouble("$DIMMZF", &varDouble))
778 writer->writeDouble(40, varDouble);
779 else
780 writer->writeDouble(40, 1.0);
781 writer->writeString(9, "$DIMMZS");
782 if (getStr("$DIMMZS", &varStr))
783 writer->writeUtf8String(1, varStr);
784 else
785 writer->writeString(1, "");
786 }
787 }// end post v2004 dim vars
788 }//end post r12 dim vars
789
790 writer->writeString(9, "$LUNITS");
791 if (getInt("$LUNITS", &varInt))
792 writer->writeInt16(70, varInt);
793 else
794 writer->writeInt16(70, 2);
795 writer->writeString(9, "$LUPREC");
796 if (getInt("$LUPREC", &varInt))
797 writer->writeInt16(70, varInt);
798 else
799 writer->writeInt16(70, 4);
800 writer->writeString(9, "$SKETCHINC");
801 if (getDouble("$SKETCHINC", &varDouble))
802 writer->writeDouble(40, varDouble);
803 else
804 writer->writeDouble(40, 1.0);
805 writer->writeString(9, "$FILLETRAD");
806 if (getDouble("$FILLETRAD", &varDouble))
807 writer->writeDouble(40, varDouble);
808 else
809 writer->writeDouble(40, 0.0);
810 writer->writeString(9, "$AUNITS");
811 if (getInt("$AUNITS", &varInt))
812 writer->writeInt16(70, varInt);
813 else
814 writer->writeInt16(70, 0);
815 writer->writeString(9, "$AUPREC");
816 if (getInt("$AUPREC", &varInt))
817 writer->writeInt16(70, varInt);
818 else
819 writer->writeInt16(70, 2);
820 writer->writeString(9, "$MENU");
821 if (getStr("$MENU", &varStr))
822 if (ver == DRW::AC1009)
823 writer->writeUtf8Caps(1, varStr);
824 else
825 writer->writeUtf8String(1, varStr);
826 else
827 writer->writeString(1, ".");
828 writer->writeString(9, "$TDCREATE");
829 if (getDouble("$TDCREATE", &varDouble))
830 writer->writeDouble(40, varDouble);
831 else
832 writer->writeDouble(40, 0.0);
833 writer->writeString(9, "$TDUPDATE");
834 if (getDouble("$TDUPDATE", &varDouble))
835 writer->writeDouble(40, varDouble);
836 else
837 writer->writeDouble(40, 0.0);
838 writer->writeString(9, "$TDINDWG");
839 if (getDouble("$TDINDWG", &varDouble))
840 writer->writeDouble(40, varDouble);
841 else
842 writer->writeDouble(40, 0.0);
843 writer->writeString(9, "$TDUSRTIMER");
844 if (getDouble("$TDUSRTIMER", &varDouble))
845 writer->writeDouble(40, varDouble);
846 else
847 writer->writeDouble(40, 0.0);
848 writer->writeString(9, "$ELEVATION");
849 if (getDouble("$ELEVATION", &varDouble))
850 writer->writeDouble(40, varDouble);
851 else
852 writer->writeDouble(40, 0.0);
853 writer->writeString(9, "$PELEVATION");
854 if (getDouble("$PELEVATION", &varDouble))
855 writer->writeDouble(40, varDouble);
856 else
857 writer->writeDouble(40, 0.0);
858 writer->writeString(9, "$THICKNESS");
859 if (getDouble("$THICKNESS", &varDouble))
860 writer->writeDouble(40, varDouble);
861 else
862 writer->writeDouble(40, 0.0);
863 writer->writeString(9, "$LIMCHECK");
864 if (getInt("$LIMCHECK", &varInt))
865 writer->writeInt16(70, varInt);
866 else
867 writer->writeInt16(70, 0);
868 if (ver < DRW::AC1015) {
869 writer->writeString(9, "$BLIPMODE");
870 if (getInt("$BLIPMODE", &varInt))
871 writer->writeInt16(70, varInt);
872 else
873 writer->writeInt16(70, 0);
874 }
875 writer->writeString(9, "$CHAMFERA");
876 if (getDouble("$CHAMFERA", &varDouble))
877 writer->writeDouble(40, varDouble);
878 else
879 writer->writeDouble(40, 0.0);
880 writer->writeString(9, "$CHAMFERB");
881 if (getDouble("$CHAMFERB", &varDouble))
882 writer->writeDouble(40, varDouble);
883 else
884 writer->writeDouble(40, 0.0);
885 if (ver > DRW::AC1009) {
886 writer->writeString(9, "$CHAMFERC");
887 if (getDouble("$CHAMFERC", &varDouble))
888 writer->writeDouble(40, varDouble);
889 else
890 writer->writeDouble(40, 0.0);
891 writer->writeString(9, "$CHAMFERD");
892 if (getDouble("$CHAMFERD", &varDouble))
893 writer->writeDouble(40, varDouble);
894 else
895 writer->writeDouble(40, 0.0);
896 }
897 writer->writeString(9, "$SKPOLY");
898 if (getInt("$SKPOLY", &varInt)) {
899 writer->writeInt16(70, varInt);
900 } else
901 writer->writeInt16(70, 0);
902 //rlz: todo, times
903 writer->writeString(9, "$USRTIMER");
904 if (getInt("$USRTIMER", &varInt)) {
905 writer->writeInt16(70, varInt);
906 } else
907 writer->writeInt16(70, 1);
908 writer->writeString(9, "$ANGBASE");
909 if (getDouble("$ANGBASE", &varDouble))
910 writer->writeDouble(50, varDouble);
911 else
912 writer->writeDouble(50, 0.0);
913 writer->writeString(9, "$ANGDIR");
914 if (getInt("$ANGDIR", &varInt)) {
915 writer->writeInt16(70, varInt);
916 } else
917 writer->writeInt16(70, 0);
918 writer->writeString(9, "$PDMODE");
919 if (getInt("$PDMODE", &varInt)) {
920 writer->writeInt16(70, varInt);
921 } else
922 writer->writeInt16(70, 34);
923 writer->writeString(9, "$PDSIZE");
924 if (getDouble("$PDSIZE", &varDouble))
925 writer->writeDouble(40, varDouble);
926 else
927 writer->writeDouble(40, 0.0);
928 writer->writeString(9, "$PLINEWID");
929 if (getDouble("$PLINEWID", &varDouble))
930 writer->writeDouble(40, varDouble);
931 else
932 writer->writeDouble(40, 0.0);
933 if (ver < DRW::AC1012) {
934 writer->writeString(9, "$COORDS");
935 if (getInt("$COORDS", &varInt)) {
936 writer->writeInt16(70, varInt);
937 } else
938 writer->writeInt16(70, 2);
939 }
940 writer->writeString(9, "$SPLFRAME");
941 if (getInt("$SPLFRAME", &varInt)) {
942 writer->writeInt16(70, varInt);
943 } else
944 writer->writeInt16(70, 0);
945 writer->writeString(9, "$SPLINETYPE");
946 if (getInt("$SPLINETYPE", &varInt)) {
947 writer->writeInt16(70, varInt);
948 } else
949 writer->writeInt16(70, 2);
950 writer->writeString(9, "$SPLINESEGS");
951 if (getInt("$SPLINESEGS", &varInt)) {
952 writer->writeInt16(70, varInt);
953 } else
954 writer->writeInt16(70, 8);
955 if (ver < DRW::AC1012) {
956 writer->writeString(9, "$ATTDIA");
957 if (getInt("$ATTDIA", &varInt)) {
958 writer->writeInt16(70, varInt);
959 } else
960 writer->writeInt16(70, 1);
961 writer->writeString(9, "$ATTREQ");
962 if (getInt("$ATTREQ", &varInt)) {
963 writer->writeInt16(70, varInt);
964 } else
965 writer->writeInt16(70, 1);
966 writer->writeString(9, "$HANDLING");
967 if (getInt("$HANDLING", &varInt)) {
968 writer->writeInt16(70, varInt);
969 } else
970 writer->writeInt16(70, 1);
971 }
972 writer->writeString(9, "$HANDSEED");
973 //RLZ dxfHex(5, 0xFFFF);
974 // Emit $HANDSEED as a fixed-width zero-padded hex placeholder and record the
975 // value-field offset so dxfRW can back-patch it with the final handle
976 // high-water mark after the OBJECTS section (the header streams first, so the
977 // true high-water is not yet known here). handSeed (if pre-set by a DWG-side
978 // round-trip) seeds the placeholder; otherwise the legacy 0x20000 ceiling is
979 // used and back-patched up if minted/raw handles exceed it.
980 {
981 std::uint32_t seed = (handSeed != 0) ? handSeed : 0x20000u;
982 char buf[kHandseedFieldWidth + 1];
983 snprintf(buf, sizeof(buf), "%0*X", kHandseedFieldWidth, seed);
984 std::ofstream *os = writer->stream();
985 std::streampos before = os ? os->tellp() : std::streampos(-1);
986 writer->writeString(5, std::string(buf));
987 if (os && before != std::streampos(-1)) {
988 std::streampos after = os->tellp();
989 // ASCII: " 5\n"+value+"\n"; binary: code(2)+value+'\0'. In both the
990 // value field is the kHandseedFieldWidth bytes ending one byte before
991 // `after`, so the field starts at after-(width+1).
992 m_handseedValueOffset =
993 after - static_cast<std::streamoff>(kHandseedFieldWidth + 1);
994 }
995 }
996 writer->writeString(9, "$SURFTAB1");
997 if (getInt("$SURFTAB1", &varInt)) {
998 writer->writeInt16(70, varInt);
999 } else
1000 writer->writeInt16(70, 6);
1001 writer->writeString(9, "$SURFTAB2");
1002 if (getInt("$SURFTAB2", &varInt)) {
1003 writer->writeInt16(70, varInt);
1004 } else
1005 writer->writeInt16(70, 6);
1006 writer->writeString(9, "$SURFTYPE");
1007 if (getInt("$SURFTYPE", &varInt)) {
1008 writer->writeInt16(70, varInt);
1009 } else
1010 writer->writeInt16(70, 6);
1011 writer->writeString(9, "$SURFU");
1012 if (getInt("$SURFU", &varInt)) {
1013 writer->writeInt16(70, varInt);
1014 } else
1015 writer->writeInt16(70, 6);
1016 writer->writeString(9, "$SURFV");
1017 if (getInt("$SURFV", &varInt)) {
1018 writer->writeInt16(70, varInt);
1019 } else
1020 writer->writeInt16(70, 6);
1021 if (ver > DRW::AC1009) {
1022 writer->writeString(9, "$UCSBASE");
1023 if (getStr("$UCSBASE", &varStr))
1024 if (ver == DRW::AC1009)
1025 writer->writeUtf8Caps(2, varStr);
1026 else
1027 writer->writeUtf8String(2, varStr);
1028 else
1029 writer->writeString(2, "");
1030}
1031 writer->writeString(9, "$UCSNAME");
1032 if (getStr("$UCSNAME", &varStr))
1033 if (ver == DRW::AC1009)
1034 writer->writeUtf8Caps(2, varStr);
1035 else
1036 writer->writeUtf8String(2, varStr);
1037 else
1038 writer->writeString(2, "");
1039 writer->writeString(9, "$UCSORG");
1040 if (getCoord("$UCSORG", &varCoord)) {
1041 writer->writeDouble(10, varCoord.x);
1042 writer->writeDouble(20, varCoord.y);
1043 writer->writeDouble(30, varCoord.z);
1044 } else {
1045 writer->writeDouble(10, 0.0);
1046 writer->writeDouble(20, 0.0);
1047 writer->writeDouble(30, 0.0);
1048 }
1049 writer->writeString(9, "$UCSXDIR");
1050 if (getCoord("$UCSXDIR", &varCoord)) {
1051 writer->writeDouble(10, varCoord.x);
1052 writer->writeDouble(20, varCoord.y);
1053 writer->writeDouble(30, varCoord.z);
1054 } else {
1055 writer->writeDouble(10, 1.0);
1056 writer->writeDouble(20, 0.0);
1057 writer->writeDouble(30, 0.0);
1058 }
1059 writer->writeString(9, "$UCSYDIR");
1060 if (getCoord("$UCSYDIR", &varCoord)) {
1061 writer->writeDouble(10, varCoord.x);
1062 writer->writeDouble(20, varCoord.y);
1063 writer->writeDouble(30, varCoord.z);
1064 } else {
1065 writer->writeDouble(10, 0.0);
1066 writer->writeDouble(20, 1.0);
1067 writer->writeDouble(30, 0.0);
1068 }
1069 if (ver > DRW::AC1009) { //begin post r12 UCS vars
1070 writer->writeString(9, "$UCSORTHOREF");
1071 if (getStr("$UCSORTHOREF", &varStr))
1072 if (ver == DRW::AC1009)
1073 writer->writeUtf8Caps(2, varStr);
1074 else
1075 writer->writeUtf8String(2, varStr);
1076 else
1077 writer->writeString(2, "");
1078 writer->writeString(9, "$UCSORTHOVIEW");
1079 if (getInt("$UCSORTHOVIEW", &varInt))
1080 writer->writeInt16(70, varInt);
1081 else
1082 writer->writeInt16(70, 0);
1083 writer->writeString(9, "$UCSORGTOP");
1084 if (getCoord("$UCSORGTOP", &varCoord)) {
1085 writer->writeDouble(10, varCoord.x);
1086 writer->writeDouble(20, varCoord.y);
1087 writer->writeDouble(30, varCoord.z);
1088 } else {
1089 writer->writeDouble(10, 0.0);
1090 writer->writeDouble(20, 0.0);
1091 writer->writeDouble(30, 0.0);
1092 }
1093 writer->writeString(9, "$UCSORGBOTTOM");
1094 if (getCoord("$UCSORGBOTTOM", &varCoord)) {
1095 writer->writeDouble(10, varCoord.x);
1096 writer->writeDouble(20, varCoord.y);
1097 writer->writeDouble(30, varCoord.z);
1098 } else {
1099 writer->writeDouble(10, 0.0);
1100 writer->writeDouble(20, 0.0);
1101 writer->writeDouble(30, 0.0);
1102 }
1103 writer->writeString(9, "$UCSORGLEFT");
1104 if (getCoord("$UCSORGLEFT", &varCoord)) {
1105 writer->writeDouble(10, varCoord.x);
1106 writer->writeDouble(20, varCoord.y);
1107 writer->writeDouble(30, varCoord.z);
1108 } else {
1109 writer->writeDouble(10, 0.0);
1110 writer->writeDouble(20, 0.0);
1111 writer->writeDouble(30, 0.0);
1112 }
1113 writer->writeString(9, "$UCSORGRIGHT");
1114 if (getCoord("$UCSORGRIGHT", &varCoord)) {
1115 writer->writeDouble(10, varCoord.x);
1116 writer->writeDouble(20, varCoord.y);
1117 writer->writeDouble(30, varCoord.z);
1118 } else {
1119 writer->writeDouble(10, 0.0);
1120 writer->writeDouble(20, 0.0);
1121 writer->writeDouble(30, 0.0);
1122 }
1123 writer->writeString(9, "$UCSORGFRONT");
1124 if (getCoord("$UCSORGFRONT", &varCoord)) {
1125 writer->writeDouble(10, varCoord.x);
1126 writer->writeDouble(20, varCoord.y);
1127 writer->writeDouble(30, varCoord.z);
1128 } else {
1129 writer->writeDouble(10, 0.0);
1130 writer->writeDouble(20, 0.0);
1131 writer->writeDouble(30, 0.0);
1132 }
1133 writer->writeString(9, "$UCSORGBACK");
1134 if (getCoord("$UCSORGBACK", &varCoord)) {
1135 writer->writeDouble(10, varCoord.x);
1136 writer->writeDouble(20, varCoord.y);
1137 writer->writeDouble(30, varCoord.z);
1138 } else {
1139 writer->writeDouble(10, 0.0);
1140 writer->writeDouble(20, 0.0);
1141 writer->writeDouble(30, 0.0);
1142 }
1143 writer->writeString(9, "$PUCSBASE");
1144 if (getStr("$PUCSBASE", &varStr))
1145 if (ver == DRW::AC1009)
1146 writer->writeUtf8Caps(2, varStr);
1147 else
1148 writer->writeUtf8String(2, varStr);
1149 else
1150 writer->writeString(2, "");
1151 } //end post r12 UCS vars
1152 writer->writeString(9, "$PUCSNAME");
1153 if (getStr("$PUCSNAME", &varStr))
1154 if (ver == DRW::AC1009)
1155 writer->writeUtf8Caps(2, varStr);
1156 else
1157 writer->writeUtf8String(2, varStr);
1158 else
1159 writer->writeString(2, "");
1160 writer->writeString(9, "$PUCSORG");
1161 if (getCoord("$PUCSORG", &varCoord)) {
1162 writer->writeDouble(10, varCoord.x);
1163 writer->writeDouble(20, varCoord.y);
1164 writer->writeDouble(30, varCoord.z);
1165 } else {
1166 writer->writeDouble(10, 0.0);
1167 writer->writeDouble(20, 0.0);
1168 writer->writeDouble(30, 0.0);
1169 }
1170 writer->writeString(9, "$PUCSXDIR");
1171 if (getCoord("$PUCSXDIR", &varCoord)) {
1172 writer->writeDouble(10, varCoord.x);
1173 writer->writeDouble(20, varCoord.y);
1174 writer->writeDouble(30, varCoord.z);
1175 } else {
1176 writer->writeDouble(10, 1.0);
1177 writer->writeDouble(20, 0.0);
1178 writer->writeDouble(30, 0.0);
1179 }
1180 writer->writeString(9, "$PUCSYDIR");
1181 if (getCoord("$PUCSYDIR", &varCoord)) {
1182 writer->writeDouble(10, varCoord.x);
1183 writer->writeDouble(20, varCoord.y);
1184 writer->writeDouble(30, varCoord.z);
1185 } else {
1186 writer->writeDouble(10, 0.0);
1187 writer->writeDouble(20, 1.0);
1188 writer->writeDouble(30, 0.0);
1189 }
1190 if (ver > DRW::AC1009) { //begin post r12 PUCS vars
1191 writer->writeString(9, "$PUCSORTHOREF");
1192 if (getStr("$PUCSORTHOREF", &varStr))
1193 if (ver == DRW::AC1009)
1194 writer->writeUtf8Caps(2, varStr);
1195 else
1196 writer->writeUtf8String(2, varStr);
1197 else
1198 writer->writeString(2, "");
1199 writer->writeString(9, "$PUCSORTHOVIEW");
1200 if (getInt("$PUCSORTHOVIEW", &varInt))
1201 writer->writeInt16(70, varInt);
1202 else
1203 writer->writeInt16(70, 0);
1204 writer->writeString(9, "$PUCSORGTOP");
1205 if (getCoord("$PUCSORGTOP", &varCoord)) {
1206 writer->writeDouble(10, varCoord.x);
1207 writer->writeDouble(20, varCoord.y);
1208 writer->writeDouble(30, varCoord.z);
1209 } else {
1210 writer->writeDouble(10, 0.0);
1211 writer->writeDouble(20, 0.0);
1212 writer->writeDouble(30, 0.0);
1213 }
1214 writer->writeString(9, "$PUCSORGBOTTOM");
1215 if (getCoord("$PUCSORGBOTTOM", &varCoord)) {
1216 writer->writeDouble(10, varCoord.x);
1217 writer->writeDouble(20, varCoord.y);
1218 writer->writeDouble(30, varCoord.z);
1219 } else {
1220 writer->writeDouble(10, 0.0);
1221 writer->writeDouble(20, 0.0);
1222 writer->writeDouble(30, 0.0);
1223 }
1224 writer->writeString(9, "$PUCSORGLEFT");
1225 if (getCoord("$PUCSORGLEFT", &varCoord)) {
1226 writer->writeDouble(10, varCoord.x);
1227 writer->writeDouble(20, varCoord.y);
1228 writer->writeDouble(30, varCoord.z);
1229 } else {
1230 writer->writeDouble(10, 0.0);
1231 writer->writeDouble(20, 0.0);
1232 writer->writeDouble(30, 0.0);
1233 }
1234 writer->writeString(9, "$PUCSORGRIGHT");
1235 if (getCoord("$PUCSORGRIGHT", &varCoord)) {
1236 writer->writeDouble(10, varCoord.x);
1237 writer->writeDouble(20, varCoord.y);
1238 writer->writeDouble(30, varCoord.z);
1239 } else {
1240 writer->writeDouble(10, 0.0);
1241 writer->writeDouble(20, 0.0);
1242 writer->writeDouble(30, 0.0);
1243 }
1244 writer->writeString(9, "$PUCSORGFRONT");
1245 if (getCoord("$PUCSORGFRONT", &varCoord)) {
1246 writer->writeDouble(10, varCoord.x);
1247 writer->writeDouble(20, varCoord.y);
1248 writer->writeDouble(30, varCoord.z);
1249 } else {
1250 writer->writeDouble(10, 0.0);
1251 writer->writeDouble(20, 0.0);
1252 writer->writeDouble(30, 0.0);
1253 }
1254 writer->writeString(9, "$PUCSORGBACK");
1255 if (getCoord("$PUCSORGBACK", &varCoord)) {
1256 writer->writeDouble(10, varCoord.x);
1257 writer->writeDouble(20, varCoord.y);
1258 writer->writeDouble(30, varCoord.z);
1259 } else {
1260 writer->writeDouble(10, 0.0);
1261 writer->writeDouble(20, 0.0);
1262 writer->writeDouble(30, 0.0);
1263 }
1264 } //end post r12 PUCS vars
1265
1266 writer->writeString(9, "$USERI1");
1267 if (getInt("$USERI1", &varInt))
1268 writer->writeInt16(70, varInt);
1269 else
1270 writer->writeInt16(70, 0);
1271 writer->writeString(9, "$USERI2");
1272 if (getInt("$USERI2", &varInt))
1273 writer->writeInt16(70, varInt);
1274 else
1275 writer->writeInt16(70, 0);
1276 writer->writeString(9, "$USERI3");
1277 if (getInt("$USERI3", &varInt))
1278 writer->writeInt16(70, varInt);
1279 else
1280 writer->writeInt16(70, 0);
1281 writer->writeString(9, "$USERI4");
1282 if (getInt("$USERI4", &varInt))
1283 writer->writeInt16(70, varInt);
1284 else
1285 writer->writeInt16(70, 0);
1286 writer->writeString(9, "$USERI5");
1287 if (getInt("$USERI5", &varInt))
1288 writer->writeInt16(70, varInt);
1289 else
1290 writer->writeInt16(70, 0);
1291 writer->writeString(9, "$USERR1");
1292 if (getDouble("$USERR1", &varDouble))
1293 writer->writeDouble(40, varDouble);
1294 else
1295 writer->writeDouble(40, 0.0);
1296 writer->writeString(9, "$USERR2");
1297 if (getDouble("$USERR2", &varDouble))
1298 writer->writeDouble(40, varDouble);
1299 else
1300 writer->writeDouble(40, 0.0);
1301 writer->writeString(9, "$USERR3");
1302 if (getDouble("$USERR3", &varDouble))
1303 writer->writeDouble(40, varDouble);
1304 else
1305 writer->writeDouble(40, 0.0);
1306 writer->writeString(9, "$USERR4");
1307 if (getDouble("$USERR4", &varDouble))
1308 writer->writeDouble(40, varDouble);
1309 else
1310 writer->writeDouble(40, 0.0);
1311 writer->writeString(9, "$USERR5");
1312 if (getDouble("$USERR5", &varDouble))
1313 writer->writeDouble(40, varDouble);
1314 else
1315 writer->writeDouble(40, 0.0);
1316 writer->writeString(9, "$WORLDVIEW");
1317 if (getInt("$WORLDVIEW", &varInt))
1318 writer->writeInt16(70, varInt);
1319 else
1320 writer->writeInt16(70, 1);
1321 writer->writeString(9, "$SHADEDGE");
1322 if (getInt("$SHADEDGE", &varInt))
1323 writer->writeInt16(70, varInt);
1324 else
1325 writer->writeInt16(70, 3);
1326 writer->writeString(9, "$SHADEDIF");
1327 if (getInt("$SHADEDIF", &varInt))
1328 writer->writeInt16(70, varInt);
1329 else
1330 writer->writeInt16(70, 70);
1331 writer->writeString(9, "$ISOLINES");
1332 if (getInt("$ISOLINES", &varInt))
1333 writer->writeInt16(70, varInt);
1334 else
1335 writer->writeInt16(70, 4);
1336 writer->writeString(9, "$FACETRES");
1337 if (getDouble("$FACETRES", &varDouble))
1338 writer->writeDouble(40, varDouble);
1339 else
1340 writer->writeDouble(40, 0.5);
1341 writer->writeString(9, "$TEXTQLTY");
1342 if (getInt("$TEXTQLTY", &varInt))
1343 writer->writeInt16(70, varInt);
1344 else
1345 writer->writeInt16(70, 50);
1346 writer->writeString(9, "$TILEMODE");
1347 if (getInt("$TILEMODE", &varInt))
1348 writer->writeInt16(70, varInt);
1349 else
1350 writer->writeInt16(70, 1);
1351 writer->writeString(9, "$MAXACTVP");
1352 if (getInt("$MAXACTVP", &varInt))
1353 writer->writeInt16(70, varInt);
1354 else
1355 writer->writeInt16(70, 64);
1356 if (ver > DRW::AC1009) { //begin post r12 PUCS vars
1357 writer->writeString(9, "$PINSBASE");
1358 if (getCoord("$PINSBASE", &varCoord)) {
1359 writer->writeDouble(10, varCoord.x);
1360 writer->writeDouble(20, varCoord.y);
1361 writer->writeDouble(30, varCoord.z);
1362 } else {
1363 writer->writeDouble(10, 0.0);
1364 writer->writeDouble(20, 0.0);
1365 writer->writeDouble(30, 0.0);
1366 }
1367 }
1368 writer->writeString(9, "$PLIMCHECK");
1369 if (getInt("$PLIMCHECK", &varInt))
1370 writer->writeInt16(70, varInt);
1371 else
1372 writer->writeInt16(70, 0);
1373 writer->writeString(9, "$PEXTMIN");
1374 if (getCoord("$PEXTMIN", &varCoord)) {
1375 writer->writeDouble(10, varCoord.x);
1376 writer->writeDouble(20, varCoord.y);
1377 writer->writeDouble(30, varCoord.z);
1378 } else {
1379 writer->writeDouble(10, 0.0);
1380 writer->writeDouble(20, 0.0);
1381 writer->writeDouble(30, 0.0);
1382 }
1383 writer->writeString(9, "$PEXTMAX");
1384 if (getCoord("$PEXTMAX", &varCoord)) {
1385 writer->writeDouble(10, varCoord.x);
1386 writer->writeDouble(20, varCoord.y);
1387 writer->writeDouble(30, varCoord.z);
1388 } else {
1389 writer->writeDouble(10, 0.0);
1390 writer->writeDouble(20, 0.0);
1391 writer->writeDouble(30, 0.0);
1392 }
1393
1394/* RLZ: moved to active VPORT, but can write in header if present*/
1395 if (getInt("$GRIDMODE", &varInt)) {
1396 writer->writeString(9, "$GRIDMODE");
1397 writer->writeInt16(70, varInt);
1398 }
1399 if (getInt("$SNAPSTYLE", &varInt)) {
1400 writer->writeString(9, "$SNAPSTYLE");
1401 writer->writeInt16(70, varInt);
1402 }
1403 if (getCoord("$GRIDUNIT", &varCoord)) {
1404 writer->writeString(9, "$GRIDUNIT");
1405 writer->writeDouble(10, varCoord.x);
1406 writer->writeDouble(20, varCoord.y);
1407 }
1408 if (getCoord("$VIEWCTR", &varCoord)) {
1409 writer->writeString(9, "$VIEWCTR");
1410 writer->writeDouble(10, varCoord.x);
1411 writer->writeDouble(20, varCoord.y);
1412 }
1413/* RLZ: moved to active VPORT, but can write in header if present*/
1414
1415 writer->writeString(9, "$PLIMMIN");
1416 if (getCoord("$PLIMMIN", &varCoord)) {
1417 writer->writeDouble(10, varCoord.x);
1418 writer->writeDouble(20, varCoord.y);
1419 } else {
1420 writer->writeDouble(10, 0.0);
1421 writer->writeDouble(20, 0.0);
1422 }
1423 writer->writeString(9, "$PLIMMAX");
1424 if (getCoord("$PLIMMAX", &varCoord)) {
1425 writer->writeDouble(10, varCoord.x);
1426 writer->writeDouble(20, varCoord.y);
1427 } else {
1428 writer->writeDouble(10, 297.0);
1429 writer->writeDouble(20, 210.0);
1430 }
1431 writer->writeString(9, "$UNITMODE");
1432 if (getInt("$UNITMODE", &varInt))
1433 writer->writeInt16(70, varInt);
1434 else
1435 writer->writeInt16(70, 0);
1436 writer->writeString(9, "$VISRETAIN");
1437 if (getInt("$VISRETAIN", &varInt))
1438 writer->writeInt16(70, varInt);
1439 else
1440 writer->writeInt16(70, 1);
1441 writer->writeString(9, "$PLINEGEN");
1442 if (getInt("$PLINEGEN", &varInt))
1443 writer->writeInt16(70, varInt);
1444 else
1445 writer->writeInt16(70, 0);
1446 writer->writeString(9, "$PSLTSCALE");
1447 if (getInt("$PSLTSCALE", &varInt))
1448 writer->writeInt16(70, varInt);
1449 else
1450 writer->writeInt16(70, 1);
1451 if (ver > DRW::AC1009){//start port r12 vars
1452 writer->writeString(9, "$TREEDEPTH");
1453 if (getInt("$TREEDEPTH", &varInt))
1454 writer->writeInt16(70, varInt);
1455 else
1456 writer->writeInt16(70, 3020);
1457 writer->writeString(9, "$CMLSTYLE");
1458 if (getStr("$CMLSTYLE", &varStr))
1459 if (ver == DRW::AC1009)
1460 writer->writeUtf8Caps(2, varStr);
1461 else
1462 writer->writeUtf8String(2, varStr);
1463 else
1464 writer->writeString(2, "Standard");
1465 writer->writeString(9, "$CMLJUST");
1466 if (getInt("$CMLJUST", &varInt))
1467 writer->writeInt16(70, varInt);
1468 else
1469 writer->writeInt16(70, 0);
1470 writer->writeString(9, "$CMLSCALE");
1471 if (getDouble("$CMLSCALE", &varDouble))
1472 writer->writeDouble(40, varDouble);
1473 else
1474 writer->writeDouble(40, 20.0);
1475 writer->writeString(9, "$PROXYGRAPHICS");
1476 if (getInt("$PROXYGRAPHICS", &varInt) || getInt("$PROXIGRAPHICS", &varInt))
1477 writer->writeInt16(70, varInt);
1478 else
1479 writer->writeInt16(70, 1);
1480 int insunits {Units::None};
1481 getInt("$INSUNITS", &insunits); // get $INSUNITS now to evaluate $MEASUREMENT
1482 int measurementValue = measurement(insunits);
1483 if (getInt("$MEASUREMENT", &varInt))
1484 measurementValue = varInt;
1485 writer->writeString(9, "$MEASUREMENT");
1486 writer->writeInt16(70, measurementValue);
1487 writer->writeString(9, "$CELWEIGHT");
1488 if (getInt("$CELWEIGHT", &varInt))
1489 writer->writeInt16(370, varInt);
1490 else
1491 writer->writeInt16(370, -1);
1492 writer->writeString(9, "$ENDCAPS");
1493 if (getInt("$ENDCAPS", &varInt))
1494 writer->writeInt16(280, varInt);
1495 else
1496 writer->writeInt16(280, 0);
1497 writer->writeString(9, "$JOINSTYLE");
1498 if (getInt("$JOINSTYLE", &varInt))
1499 writer->writeInt16(280, varInt);
1500 else
1501 writer->writeInt16(280, 0);
1502 writer->writeString(9, "$LWDISPLAY"); //RLZ bool flag, verify in bin version
1503 if (getInt("$LWDISPLAY", &varInt))
1504 writer->writeInt16(290, varInt);
1505 else
1506 writer->writeInt16(290, 0);
1507 if (ver > DRW::AC1014) {
1508 writer->writeString(9, "$INSUNITS");
1509 writer->writeInt16(70, insunits); // already fetched above for $MEASUREMENT
1510 }
1511 writer->writeString(9, "$HYPERLINKBASE");
1512 if (getStr("$HYPERLINKBASE", &varStr))
1513 if (ver == DRW::AC1009)
1514 writer->writeUtf8Caps(1, varStr);
1515 else
1516 writer->writeUtf8String(1, varStr);
1517 else
1518 writer->writeString(1, "");
1519 writer->writeString(9, "$STYLESHEET");
1520 if (getStr("$STYLESHEET", &varStr))
1521 if (ver == DRW::AC1009)
1522 writer->writeUtf8Caps(1, varStr);
1523 else
1524 writer->writeUtf8String(1, varStr);
1525 else
1526 writer->writeString(1, "");
1527 writer->writeString(9, "$XEDIT"); //RLZ bool flag, verify in bin version
1528 if (getInt("$XEDIT", &varInt))
1529 writer->writeInt16(290, varInt);
1530 else
1531 writer->writeInt16(290, 1);
1532 writer->writeString(9, "$CEPSNTYPE");
1533 if (getInt("$CEPSNTYPE", &varInt))
1534 writer->writeInt16(380, varInt);
1535 else
1536 writer->writeInt16(380, 0);
1537 writer->writeString(9, "$PSTYLEMODE"); //RLZ bool flag, verify in bin version
1538 if (getInt("$PSTYLEMODE", &varInt))
1539 writer->writeInt16(290, varInt);
1540 else
1541 writer->writeInt16(290, 1);
1542 if (ver > DRW::AC1014) {
1543 static const std::string nullGuid = "{00000000-0000-0000-0000-000000000000}";
1544 writer->writeString(9, "$FINGERPRINTGUID");
1545 if (getStr("$FINGERPRINTGUID", &varStr))
1546 writer->writeUtf8String(2, varStr);
1547 else
1548 writer->writeString(2, nullGuid);
1549 writer->writeString(9, "$VERSIONGUID");
1550 if (getStr("$VERSIONGUID", &varStr))
1551 writer->writeUtf8String(2, varStr);
1552 else
1553 writer->writeString(2, nullGuid);
1554 }
1555 writer->writeString(9, "$EXTNAMES"); //RLZ bool flag, verify in bin version
1556 if (getInt("$EXTNAMES", &varInt))
1557 writer->writeInt16(290, varInt);
1558 else
1559 writer->writeInt16(290, 1);
1560 writer->writeString(9, "$PSVPSCALE");
1561 if (getDouble("$PSVPSCALE", &varDouble))
1562 writer->writeDouble(40, varDouble);
1563 else
1564 writer->writeDouble(40, 0.0);
1565 writer->writeString(9, "$TSTACKALIGN");
1566 if (getInt("$TSTACKALIGN", &varInt))
1567 writer->writeInt16(70, varInt);
1568 else
1569 writer->writeInt16(70, 1);
1570 writer->writeString(9, "$TSTACKSIZE");
1571 if (getInt("$TSTACKSIZE", &varInt))
1572 writer->writeInt16(70, varInt);
1573 else
1574 writer->writeInt16(70, 70);
1575 writer->writeString(9, "$OLESTARTUP"); //RLZ bool flag, verify in bin version
1576 if (getInt("$OLESTARTUP", &varInt))
1577 writer->writeInt16(290, varInt);
1578 else
1579 writer->writeInt16(290, 0);
1580 }
1581 if (ver > DRW::AC1015) {// and post v2004 vars
1582 writer->writeString(9, "$SORTENTS");
1583 if (getInt("$SORTENTS", &varInt))
1584 writer->writeInt16(280, varInt);
1585 else
1586 writer->writeInt16(280, 127);
1587 writer->writeString(9, "$INDEXCTL");
1588 if (getInt("$INDEXCTL", &varInt))
1589 writer->writeInt16(280, varInt);
1590 else
1591 writer->writeInt16(280, 0);
1592 writer->writeString(9, "$HIDETEXT");
1593 if (getInt("$HIDETEXT", &varInt))
1594 writer->writeInt16(280, varInt);
1595 else
1596 writer->writeInt16(280, 1);
1597 writer->writeString(9, "$XCLIPFRAME"); //RLZ bool flag, verify in bin version
1598 if (ver > DRW::AC1021) {
1599 if (getInt("$XCLIPFRAME", &varInt))
1600 writer->writeInt16(280, varInt);
1601 else
1602 writer->writeInt16(280, 0);
1603 } else {
1604 if (getInt("$XCLIPFRAME", &varInt))
1605 writer->writeInt16(290, varInt);
1606 else
1607 writer->writeInt16(290, 0);
1608 }
1609 writer->writeString(9, "$HALOGAP");
1610 if (getInt("$HALOGAP", &varInt))
1611 writer->writeInt16(280, varInt);
1612 else
1613 writer->writeInt16(280, 0);
1614 writer->writeString(9, "$OBSCOLOR");
1615 if (getInt("$OBSCOLOR", &varInt) || getInt("$OBSCUREDCOLOR", &varInt))
1616 writer->writeInt16(70, varInt);
1617 else
1618 writer->writeInt16(70, 257);
1619 writer->writeString(9, "$OBSLTYPE");
1620 if (getInt("$OBSLTYPE", &varInt) || getInt("$OBSCUREDLTYPE", &varInt))
1621 writer->writeInt16(280, varInt);
1622 else
1623 writer->writeInt16(280, 0);
1624 writer->writeString(9, "$INTERSECTIONDISPLAY");
1625 if (getInt("$INTERSECTIONDISPLAY", &varInt))
1626 writer->writeInt16(280, varInt);
1627 else
1628 writer->writeInt16(280, 0);
1629 writer->writeString(9, "$INTERSECTIONCOLOR");
1630 if (getInt("$INTERSECTIONCOLOR", &varInt))
1631 writer->writeInt16(70, varInt);
1632 else
1633 writer->writeInt16(70, 257);
1634 writer->writeString(9, "$DIMASSOC");
1635 if (getInt("$DIMASSOC", &varInt))
1636 writer->writeInt16(280, varInt);
1637 else
1638 writer->writeInt16(280, 1);
1639 writer->writeString(9, "$PROJECTNAME");
1640 if (getStr("$PROJECTNAME", &varStr))
1641 writer->writeUtf8String(1, varStr);
1642 else
1643 writer->writeString(1, "");
1644 }
1645 if (ver > DRW::AC1018) {// and post v2007 vars
1646 writer->writeString(9, "$CAMERADISPLAY"); //RLZ bool flag, verify in bin version
1647 if (getInt("$CAMERADISPLAY", &varInt))
1648 writer->writeInt16(290, varInt);
1649 else
1650 writer->writeInt16(290, 0);
1651 writer->writeString(9, "$LENSLENGTH");
1652 if (getDouble("$LENSLENGTH", &varDouble))
1653 writer->writeDouble(40, varDouble);
1654 else
1655 writer->writeDouble(40, 50.0);
1656 writer->writeString(9, "$CAMERAHEIGHT");
1657 if (getDouble("$CAMERAHEIGHT", &varDouble))
1658 writer->writeDouble(40, varDouble);
1659 else
1660 writer->writeDouble(40, 0.0);
1661 writer->writeString(9, "$STEPSPERSEC");
1662 if (getDouble("$STEPSPERSEC", &varDouble))
1663 writer->writeDouble(40, varDouble);
1664 else
1665 writer->writeDouble(40, 2.0);
1666 writer->writeString(9, "$STEPSIZE");
1667 if (getDouble("$STEPSIZE", &varDouble))
1668 writer->writeDouble(40, varDouble);
1669 else
1670 writer->writeDouble(40, 50.0);
1671 writer->writeString(9, "$3DDWFPREC");
1672 if (getDouble("$3DDWFPREC", &varDouble))
1673 writer->writeDouble(40, varDouble);
1674 else
1675 writer->writeDouble(40, 2.0);
1676 writer->writeString(9, "$PSOLWIDTH");
1677 if (getDouble("$PSOLWIDTH", &varDouble))
1678 writer->writeDouble(40, varDouble);
1679 else
1680 writer->writeDouble(40, 5.0);
1681 writer->writeString(9, "$PSOLHEIGHT");
1682 if (getDouble("$PSOLHEIGHT", &varDouble))
1683 writer->writeDouble(40, varDouble);
1684 else
1685 writer->writeDouble(40, 80.0);
1686 writer->writeString(9, "$LOFTANG1");
1687 if (getDouble("$LOFTANG1", &varDouble))
1688 writer->writeDouble(40, varDouble);
1689 else
1690 writer->writeDouble(40, M_PI_21.57079632679489661923);
1691 writer->writeString(9, "$LOFTANG2");
1692 if (getDouble("$LOFTANG2", &varDouble))
1693 writer->writeDouble(40, varDouble);
1694 else
1695 writer->writeDouble(40, M_PI_21.57079632679489661923);
1696 writer->writeString(9, "$LOFTMAG1");
1697 if (getDouble("$LOFTMAG1", &varDouble))
1698 writer->writeDouble(40, varDouble);
1699 else
1700 writer->writeDouble(40, 0.0);
1701 writer->writeString(9, "$LOFTMAG2");
1702 if (getDouble("$LOFTMAG2", &varDouble))
1703 writer->writeDouble(40, varDouble);
1704 else
1705 writer->writeDouble(40, 0.0);
1706 writer->writeString(9, "$LOFTPARAM");
1707 if (getInt("$LOFTPARAM", &varInt))
1708 writer->writeInt16(70, varInt);
1709 else
1710 writer->writeInt16(70, 7);
1711 writer->writeString(9, "$LOFTNORMALS");
1712 if (getInt("$LOFTNORMALS", &varInt))
1713 writer->writeInt16(280, varInt);
1714 else
1715 writer->writeInt16(280, 1);
1716 writer->writeString(9, "$LATITUDE");
1717 if (getDouble("$LATITUDE", &varDouble))
1718 writer->writeDouble(40, varDouble);
1719 else
1720 writer->writeDouble(40, 1.0);
1721 writer->writeString(9, "$LONGITUDE");
1722 if (getDouble("$LONGITUDE", &varDouble))
1723 writer->writeDouble(40, varDouble);
1724 else
1725 writer->writeDouble(40, 1.0);
1726 writer->writeString(9, "$NORTHDIRECTION");
1727 if (getDouble("$NORTHDIRECTION", &varDouble))
1728 writer->writeDouble(40, varDouble);
1729 else
1730 writer->writeDouble(40, 0.0);
1731 writer->writeString(9, "$TIMEZONE");
1732 if (getInt("$TIMEZONE", &varInt))
1733 writer->writeInt16(70, varInt);
1734 else
1735 writer->writeInt16(70, -8000);
1736 writer->writeString(9, "$LIGHTGLYPHDISPLAY");
1737 if (getInt("$LIGHTGLYPHDISPLAY", &varInt))
1738 writer->writeInt16(280, varInt);
1739 else
1740 writer->writeInt16(280, 1);
1741 writer->writeString(9, "$TILEMODELIGHTSYNCH");
1742 if (getInt("$TILEMODELIGHTSYNCH", &varInt))
1743 writer->writeInt16(280, varInt);
1744 else
1745 writer->writeInt16(280, 1);
1746 //$CMATERIAL is a handle
1747 writer->writeString(9, "$SOLIDHIST");
1748 if (getInt("$SOLIDHIST", &varInt))
1749 writer->writeInt16(280, varInt);
1750 else
1751 writer->writeInt16(280, 1);
1752 writer->writeString(9, "$SHOWHIST");
1753 if (getInt("$SHOWHIST", &varInt))
1754 writer->writeInt16(280, varInt);
1755 else
1756 writer->writeInt16(280, 1);
1757 writer->writeString(9, "$DWFFRAME");
1758 if (getInt("$DWFFRAME", &varInt))
1759 writer->writeInt16(280, varInt);
1760 else
1761 writer->writeInt16(280, 2);
1762 writer->writeString(9, "$DGNFRAME");
1763 if (getInt("$DGNFRAME", &varInt))
1764 writer->writeInt16(280, varInt);
1765 else
1766 writer->writeInt16(280, 0);
1767 writer->writeString(9, "$REALWORLDSCALE"); //RLZ bool flag, verify in bin version
1768 if (getInt("$REALWORLDSCALE", &varInt))
1769 writer->writeInt16(290, varInt);
1770 else
1771 writer->writeInt16(290, 1);
1772 writer->writeString(9, "$INTERFERECOLOR");
1773 if (getInt("$INTERFERECOLOR", &varInt))
1774 writer->writeInt16(62, varInt);
1775 else
1776 writer->writeInt16(62, 1);
1777 //$INTERFEREOBJVS is a handle
1778 //$INTERFEREVPVS is a handle
1779 writer->writeString(9, "$CSHADOW");
1780 if (getInt("$CSHADOW", &varInt))
1781 writer->writeInt16(280, varInt);
1782 else
1783 writer->writeInt16(280, 0);
1784 writer->writeString(9, "$SHADOWPLANELOCATION");
1785 if (getDouble("$SHADOWPLANELOCATION", &varDouble))
1786 writer->writeDouble(40, varDouble);
1787 else
1788 writer->writeDouble(40, 0.0);
1789 }
1790
1791#ifdef DRW_DBG
1792 for ( auto it=vars.begin() ; it != vars.end(); ++it ){
1793 DRW_DBG((*it).first)DRW_dbg::dbg((*it).first); DRW_DBG("\n")DRW_dbg::dbg("\n");
1794 }
1795#endif
1796}
1797
1798void DRW_Header::addDouble(std::string key, double value, int code){
1799 storeVar(key, new DRW_Variant(code, value));
1800}
1801
1802void DRW_Header::addInt(std::string key, int value, int code){
1803 storeVar(key, new DRW_Variant(code, value));
1804}
1805
1806void DRW_Header::addStr(std::string key, std::string value, int code){
1807 storeVar(key, new DRW_Variant(code, value));
1808}
1809
1810void DRW_Header::addCoord(std::string key, DRW_Coord value, int code){
1811 storeVar(key, new DRW_Variant(code, value));
1812}
1813
1814// Mirror the DWG-encoder findVar() convention: DXF reader stores "$NAME" keys,
1815// DWG parser stores bare "NAME" keys. Try the queried form first; if not
1816// found, try the alternate ($-stripped or $-added) form so both read paths
1817// can feed the DXF writer without key-convention mismatches.
1818static auto varFindAlternate(std::unordered_map<std::string, DRW_Variant*>& vars,
1819 const std::string& key)
1820 -> std::unordered_map<std::string, DRW_Variant*>::iterator
1821{
1822 auto it = vars.find(key);
1823 if (it != vars.end())
1824 return it;
1825 std::string alt = (!key.empty() && key[0] == '$') ? key.substr(1) : ("$" + key);
1826 return vars.find(alt);
1827}
1828
1829bool DRW_Header::getDouble(std::string key, double *varDouble){
1830 bool result = false;
1831 auto it = varFindAlternate(vars, key);
1832 if (it != vars.end()) {
1833 DRW_Variant *var = (*it).second;
1834 if (var->type() == DRW_Variant::DOUBLE) {
1835 *varDouble = var->content.d;
1836 result = true;
1837 }
1838 delete var;
1839 vars.erase(it);
1840 }
1841 return result;
1842}
1843
1844bool DRW_Header::getInt(std::string key, int *varInt){
1845 bool result = false;
1846 auto it = varFindAlternate(vars, key);
1847 if (it != vars.end()) {
1848 DRW_Variant *var = (*it).second;
1849 if (var->type() == DRW_Variant::INTEGER) {
1850 *varInt = var->content.i;
1851 result = true;
1852 }
1853 delete var;
1854 vars.erase(it);
1855 }
1856 return result;
1857}
1858
1859bool DRW_Header::getStr(std::string key, std::string *varStr){
1860 bool result = false;
1861 auto it = varFindAlternate(vars, key);
1862 if (it != vars.end()) {
1863 DRW_Variant *var = (*it).second;
1864 if (var->type() == DRW_Variant::STRING) {
1865 *varStr = *var->content.s;
1866 result = true;
1867 }
1868 delete var;
1869 vars.erase(it);
1870 }
1871 return result;
1872}
1873
1874bool DRW_Header::getCoord(std::string key, DRW_Coord *varCoord){
1875 bool result = false;
1876 auto it = varFindAlternate(vars, key);
1877 if (it != vars.end()) {
1878 DRW_Variant *var = (*it).second;
1879 if (var->type() == DRW_Variant::COORD) {
1880 *varCoord = *var->content.v;
1881 result = true;
1882 }
1883 delete var;
1884 vars.erase(it);
1885 }
1886 return result;
1887}
1888
1889bool DRW_Header::parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer *hBbuf, std::uint8_t maintenanceVersion){
1890 bool result = true;
1891 std::uint32_t size = buf->getRawLong32();
1892 std::uint32_t bitSize = 0;
1893 std::uint32_t endBitPos = 160; //start bit: 16 sentinel + 4 size
1894 DRW_DBG("\nbyte size of data: ")DRW_dbg::dbg("\nbyte size of data: "); DRW_DBG(size)DRW_dbg::dbg(size);
1895 if ((DRW::AC1024 <= version && 3 < maintenanceVersion)
1896 || DRW::AC1032 <= version) { //2010+ MV>3
1897 std::uint32_t hSize = buf->getRawLong32();
1898 endBitPos += 32; //start bit: + 4 height size
1899 DRW_DBG("\n2010+ & MV> 3, height 32b: ")DRW_dbg::dbg("\n2010+ & MV> 3, height 32b: "); DRW_DBG(hSize)DRW_dbg::dbg(hSize);
1900 }
1901//RLZ TODO add $ACADVER var & $DWGCODEPAGE & $MEASUREMENT
1902//RLZ TODO EN 2000 falta $CELWEIGHT, $ENDCAPS, $EXTNAMES $JOINSTYLE $LWDISPLAY $PSTYLEMODE $TDUCREATE $TDUUPDATE $XEDIT
1903
1904 //bit size of data needed to locate start of string stream in 2007+
1905 //and mark the start of handle stream
1906 //header is one object reads data and continue read strings ???
1907 if (version > DRW::AC1018) {//2007+
1908 bitSize = buf->getRawLong32();
1909 DRW_DBG("\nsize in bits: ")DRW_dbg::dbg("\nsize in bits: "); DRW_DBG(bitSize)DRW_dbg::dbg(bitSize);
1910 endBitPos += bitSize;
1911 hBbuf->setPosition(endBitPos >>3);
1912 hBbuf->setBitPos(endBitPos&7);
1913 }
1914
1915 if (version > DRW::AC1024) {//2013+
1916 std::uint64_t requiredVersions = buf->getBitLongLong();
1917 DRW_DBG("\nREQUIREDVERSIONS var: ")DRW_dbg::dbg("\nREQUIREDVERSIONS var: "); DRW_DBG(requiredVersions)DRW_dbg::dbg(requiredVersions);
1918 }
1919 DRW_DBG("\nUnknown1: ")DRW_dbg::dbg("\nUnknown1: "); DRW_DBG(buf->getBitDouble())DRW_dbg::dbg(buf->getBitDouble());
1920 DRW_DBG("\nUnknown2: ")DRW_dbg::dbg("\nUnknown2: "); DRW_DBG(buf->getBitDouble())DRW_dbg::dbg(buf->getBitDouble());
1921 DRW_DBG("\nUnknown3: ")DRW_dbg::dbg("\nUnknown3: "); DRW_DBG(buf->getBitDouble())DRW_dbg::dbg(buf->getBitDouble());
1922 DRW_DBG("\nUnknown4: ")DRW_dbg::dbg("\nUnknown4: "); DRW_DBG(buf->getBitDouble())DRW_dbg::dbg(buf->getBitDouble());
1923 if (version < DRW::AC1021) {//2007-
1924 DRW_DBG("\nUnknown text1: ")DRW_dbg::dbg("\nUnknown text1: "); DRW_DBG(buf->getCP8Text())DRW_dbg::dbg(buf->getCP8Text());
1925 DRW_DBG("\nUnknown text2: ")DRW_dbg::dbg("\nUnknown text2: "); DRW_DBG(buf->getCP8Text())DRW_dbg::dbg(buf->getCP8Text());
1926 DRW_DBG("\nUnknown text3: ")DRW_dbg::dbg("\nUnknown text3: "); DRW_DBG(buf->getCP8Text())DRW_dbg::dbg(buf->getCP8Text());
1927 DRW_DBG("\nUnknown text4: ")DRW_dbg::dbg("\nUnknown text4: "); DRW_DBG(buf->getCP8Text())DRW_dbg::dbg(buf->getCP8Text());
1928 }
1929 DRW_DBG("\nUnknown long1 (24L): ")DRW_dbg::dbg("\nUnknown long1 (24L): "); DRW_DBG(buf->getBitLong())DRW_dbg::dbg(buf->getBitLong());
1930 DRW_DBG("\nUnknown long2 (0L): ")DRW_dbg::dbg("\nUnknown long2 (0L): "); DRW_DBG(buf->getBitLong())DRW_dbg::dbg(buf->getBitLong());
1931 if (version < DRW::AC1015) {//pre 2000
1932 DRW_DBG("\nUnknown short (0): ")DRW_dbg::dbg("\nUnknown short (0): "); DRW_DBG(buf->getBitShort())DRW_dbg::dbg(buf->getBitShort());
1933 }
1934 if (version < DRW::AC1018) {//pre 2004
1935 dwgHandle hcv = hBbuf->getHandle();
1936 DRW_DBG("\nhandle of current view: ")DRW_dbg::dbg("\nhandle of current view: "); DRW_DBGHL(hcv.code, hcv.size, hcv.ref)DRW_dbg::dbgHL(hcv.code, hcv.size, hcv.ref);
1937 }
1938 vars["DIMASO"]=new DRW_Variant(70, buf->getBit());
1939 vars["DIMSHO"]=new DRW_Variant(70, buf->getBit());
1940 if (version < DRW::AC1015) {//pre 2000
1941 vars["DIMSAV"]=new DRW_Variant(70, buf->getBit());
1942 }
1943 vars["PLINEGEN"]=new DRW_Variant(70, buf->getBit());
1944 vars["ORTHOMODE"]=new DRW_Variant(70, buf->getBit());
1945 vars["REGENMODE"]=new DRW_Variant(70, buf->getBit());
1946 vars["FILLMODE"]=new DRW_Variant(70, buf->getBit());
1947 vars["QTEXTMODE"]=new DRW_Variant(70, buf->getBit());
1948 vars["PSLTSCALE"]=new DRW_Variant(70, buf->getBit());
1949 vars["LIMCHECK"]=new DRW_Variant(70, buf->getBit());
1950 if (version < DRW::AC1015) {//pre 2000
1951 vars["BLIPMODE"]=new DRW_Variant(70, buf->getBit());
1952 }
1953 if (version > DRW::AC1015) {//2004+
1954 DRW_DBG("\nUndocumented: ")DRW_dbg::dbg("\nUndocumented: "); DRW_DBG(buf->getBit())DRW_dbg::dbg(buf->getBit());
1955 }
1956 vars["USRTIMER"]=new DRW_Variant(70, buf->getBit());
1957 vars["SKPOLY"]=new DRW_Variant(70, buf->getBit());
1958 vars["ANGDIR"]=new DRW_Variant(70, buf->getBit());
1959 vars["SPLFRAME"]=new DRW_Variant(70, buf->getBit());
1960 if (version < DRW::AC1015) {//pre 2000
1961 vars["ATTREQ"]=new DRW_Variant(70, buf->getBit());
1962 vars["ATTDIA"]=new DRW_Variant(70, buf->getBit());
1963 }
1964 vars["MIRRTEXT"]=new DRW_Variant(70, buf->getBit());
1965 vars["WORLDVIEW"]=new DRW_Variant(70, buf->getBit());
1966 if (version < DRW::AC1015) {//pre 2000
1967 vars["WIREFRAME"]=new DRW_Variant(70, buf->getBit());
1968 }
1969 vars["TILEMODE"]=new DRW_Variant(70, buf->getBit());
1970 vars["PLIMCHECK"]=new DRW_Variant(70, buf->getBit());
1971 vars["VISRETAIN"]=new DRW_Variant(70, buf->getBit());
1972 if (version < DRW::AC1015) {//pre 2000
1973 vars["DELOBJ"]=new DRW_Variant(70, buf->getBit());
1974 }
1975 vars["DISPSILH"]=new DRW_Variant(70, buf->getBit());
1976 vars["PELLIPSE"]=new DRW_Variant(70, buf->getBit());
1977 vars["PROXIGRAPHICS"]=new DRW_Variant(70, buf->getBitShort());//RLZ short or bit??
1978 if (version < DRW::AC1015) {//pre 2000
1979 vars["DRAGMODE"]=new DRW_Variant(70, buf->getBitShort());//RLZ short or bit??
1980 }
1981 vars["TREEDEPTH"]=new DRW_Variant(70, buf->getBitShort());//RLZ short or bit??
1982 vars["LUNITS"]=new DRW_Variant(70, buf->getBitShort());
1983 vars["LUPREC"]=new DRW_Variant(70, buf->getBitShort());
1984 vars["AUNITS"]=new DRW_Variant(70, buf->getBitShort());
1985 vars["AUPREC"]=new DRW_Variant(70, buf->getBitShort());
1986 if (version < DRW::AC1015) {//pre 2000
1987 vars["OSMODE"]=new DRW_Variant(70, buf->getBitShort());
1988 }
1989 vars["ATTMODE"]=new DRW_Variant(70, buf->getBitShort());
1990 if (version < DRW::AC1015) {//pre 2000
1991 vars["COORDS"]=new DRW_Variant(70, buf->getBitShort());
1992 }
1993 vars["PDMODE"]=new DRW_Variant(70, buf->getBitShort());
1994 if (version < DRW::AC1015) {//pre 2000
1995 vars["PICKSTYLE"]=new DRW_Variant(70, buf->getBitShort());
1996 }
1997 if (version > DRW::AC1015) {//2004+
1998 DRW_DBG("\nUnknown long 1: ")DRW_dbg::dbg("\nUnknown long 1: "); DRW_DBG(buf->getBitLong())DRW_dbg::dbg(buf->getBitLong());
1999 DRW_DBG("\nUnknown long 2: ")DRW_dbg::dbg("\nUnknown long 2: "); DRW_DBG(buf->getBitLong())DRW_dbg::dbg(buf->getBitLong());
2000 DRW_DBG("\nUnknown long 3: ")DRW_dbg::dbg("\nUnknown long 3: "); DRW_DBG(buf->getBitLong())DRW_dbg::dbg(buf->getBitLong());
2001 }
2002 vars["USERI1"]=new DRW_Variant(70, buf->getBitShort());
2003 vars["USERI2"]=new DRW_Variant(70, buf->getBitShort());
2004 vars["USERI3"]=new DRW_Variant(70, buf->getBitShort());
2005 vars["USERI4"]=new DRW_Variant(70, buf->getBitShort());
2006 vars["USERI5"]=new DRW_Variant(70, buf->getBitShort());
2007 vars["SPLINESEGS"]=new DRW_Variant(70, buf->getBitShort());
2008 vars["SURFU"]=new DRW_Variant(70, buf->getBitShort());
2009 vars["SURFV"]=new DRW_Variant(70, buf->getBitShort());
2010 vars["SURFTYPE"]=new DRW_Variant(70, buf->getBitShort());
2011 vars["SURFTAB1"]=new DRW_Variant(70, buf->getBitShort());
2012 vars["SURFTAB2"]=new DRW_Variant(70, buf->getBitShort());
2013 vars["SPLINETYPE"]=new DRW_Variant(70, buf->getBitShort());
2014 vars["SHADEDGE"]=new DRW_Variant(70, buf->getBitShort());
2015 vars["SHADEDIF"]=new DRW_Variant(70, buf->getBitShort());
2016 vars["UNITMODE"]=new DRW_Variant(70, buf->getBitShort());
2017 vars["MAXACTVP"]=new DRW_Variant(70, buf->getBitShort());
2018 vars["ISOLINES"]=new DRW_Variant(70, buf->getBitShort());//////////////////
2019 vars["CMLJUST"]=new DRW_Variant(70, buf->getBitShort());
2020 vars["TEXTQLTY"]=new DRW_Variant(70, buf->getBitShort());/////////////////////
2021 vars["LTSCALE"]=new DRW_Variant(40, buf->getBitDouble());
2022 vars["TEXTSIZE"]=new DRW_Variant(40, buf->getBitDouble());
2023 vars["TRACEWID"]=new DRW_Variant(40, buf->getBitDouble());
2024 vars["SKETCHINC"]=new DRW_Variant(40, buf->getBitDouble());
2025 vars["FILLETRAD"]=new DRW_Variant(40, buf->getBitDouble());
2026 vars["THICKNESS"]=new DRW_Variant(40, buf->getBitDouble());
2027 vars["ANGBASE"]=new DRW_Variant(50, buf->getBitDouble());
2028 vars["PDSIZE"]=new DRW_Variant(40, buf->getBitDouble());
2029 vars["PLINEWID"]=new DRW_Variant(40, buf->getBitDouble());
2030 vars["USERR1"]=new DRW_Variant(40, buf->getBitDouble());
2031 vars["USERR2"]=new DRW_Variant(40, buf->getBitDouble());
2032 vars["USERR3"]=new DRW_Variant(40, buf->getBitDouble());
2033 vars["USERR4"]=new DRW_Variant(40, buf->getBitDouble());
2034 vars["USERR5"]=new DRW_Variant(40, buf->getBitDouble());
2035 vars["CHAMFERA"]=new DRW_Variant(40, buf->getBitDouble());
2036 vars["CHAMFERB"]=new DRW_Variant(40, buf->getBitDouble());
2037 vars["CHAMFERC"]=new DRW_Variant(40, buf->getBitDouble());
2038 vars["CHAMFERD"]=new DRW_Variant(40, buf->getBitDouble());
2039 vars["FACETRES"]=new DRW_Variant(40, buf->getBitDouble());/////////////////////////
2040 vars["CMLSCALE"]=new DRW_Variant(40, buf->getBitDouble());
2041 vars["CELTSCALE"]=new DRW_Variant(40, buf->getBitDouble());
2042 if (version < DRW::AC1021) {//2004-
2043 vars["MENU"]=new DRW_Variant(1, buf->getCP8Text());
2044 }
2045 double msec, day;
2046 day = buf->getBitLong();
2047 msec = buf->getBitLong();
2048 while (msec >= 1)
2049 msec /=10;
2050 vars["TDCREATE"]=new DRW_Variant(40, day+msec);//RLZ: TODO convert to day.msec
2051// vars["TDCREATE"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
2052// vars["TDCREATE"]=new DRW_Variant(40, buf->getBitLong());
2053 day = buf->getBitLong();
2054 msec = buf->getBitLong();
2055 while (msec >= 1)
2056 msec /=10;
2057 vars["TDUPDATE"]=new DRW_Variant(40, day+msec);//RLZ: TODO convert to day.msec
2058// vars["TDUPDATE"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
2059// vars["TDUPDATE"]=new DRW_Variant(40, buf->getBitLong());
2060 if (version > DRW::AC1015) {//2004+
2061 DRW_DBG("\nUnknown long 4: ")DRW_dbg::dbg("\nUnknown long 4: "); DRW_DBG(buf->getBitLong())DRW_dbg::dbg(buf->getBitLong());
2062 DRW_DBG("\nUnknown long 5: ")DRW_dbg::dbg("\nUnknown long 5: "); DRW_DBG(buf->getBitLong())DRW_dbg::dbg(buf->getBitLong());
2063 DRW_DBG("\nUnknown long 6: ")DRW_dbg::dbg("\nUnknown long 6: "); DRW_DBG(buf->getBitLong())DRW_dbg::dbg(buf->getBitLong());
2064 }
2065 day = buf->getBitLong();
2066 msec = buf->getBitLong();
2067 while (msec >= 1)
2068 msec /=10;
2069 vars["TDINDWG"]=new DRW_Variant(40, day+msec);//RLZ: TODO convert to day.msec
2070// vars["TDINDWG"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
2071// vars["TDINDWG"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
2072 day = buf->getBitLong();
2073 msec = buf->getBitLong();
2074 while (msec >= 1)
2075 msec /=10;
2076 vars["TDUSRTIMER"]=new DRW_Variant(40, day+msec);//RLZ: TODO convert to day.msec
2077// vars["TDUSRTIMER"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
2078// vars["TDUSRTIMER"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec
2079 vars["CECOLOR"]=new DRW_Variant(62, buf->getCmColor(version));//RLZ: TODO read CMC or EMC color
2080 dwgHandle HANDSEED = buf->getHandle();//always present in data stream
2081 DRW_DBG("\nHANDSEED: ")DRW_dbg::dbg("\nHANDSEED: "); DRW_DBGHL(HANDSEED.code, HANDSEED.size, HANDSEED.ref)DRW_dbg::dbgHL(HANDSEED.code, HANDSEED.size, HANDSEED.ref);
2082 handSeed = HANDSEED.ref;
2083 dwgHandle CLAYER = hBbuf->getHandle();
2084 DRW_DBG("\nCLAYER: ")DRW_dbg::dbg("\nCLAYER: "); DRW_DBGHL(CLAYER.code, CLAYER.size, CLAYER.ref)DRW_dbg::dbgHL(CLAYER.code, CLAYER.size, CLAYER.ref);
2085 dwgHandle TEXTSTYLE = hBbuf->getHandle();
2086 DRW_DBG("\nTEXTSTYLE: ")DRW_dbg::dbg("\nTEXTSTYLE: "); DRW_DBGHL(TEXTSTYLE.code, TEXTSTYLE.size, TEXTSTYLE.ref)DRW_dbg::dbgHL(TEXTSTYLE.code, TEXTSTYLE.size, TEXTSTYLE.ref);
2087 dwgHandle CELTYPE = hBbuf->getHandle();
2088 DRW_DBG("\nCELTYPE: ")DRW_dbg::dbg("\nCELTYPE: "); DRW_DBGHL(CELTYPE.code, CELTYPE.size, CELTYPE.ref)DRW_dbg::dbgHL(CELTYPE.code, CELTYPE.size, CELTYPE.ref);
2089 if (version > DRW::AC1018) {//2007+
2090 dwgHandle CMATERIAL = hBbuf->getHandle();
2091 DRW_DBG("\nCMATERIAL: ")DRW_dbg::dbg("\nCMATERIAL: "); DRW_DBGHL(CMATERIAL.code, CMATERIAL.size, CMATERIAL.ref)DRW_dbg::dbgHL(CMATERIAL.code, CMATERIAL.size, CMATERIAL.ref);
2092 }
2093 dwgHandle DIMSTYLE = hBbuf->getHandle();
2094 DRW_DBG("\nDIMSTYLE: ")DRW_dbg::dbg("\nDIMSTYLE: "); DRW_DBGHL(DIMSTYLE.code, DIMSTYLE.size, DIMSTYLE.ref)DRW_dbg::dbgHL(DIMSTYLE.code, DIMSTYLE.size, DIMSTYLE.ref);
2095 dwgHandle CMLSTYLE = hBbuf->getHandle();
2096 DRW_DBG("\nCMLSTYLE: ")DRW_dbg::dbg("\nCMLSTYLE: "); DRW_DBGHL(CMLSTYLE.code, CMLSTYLE.size, CMLSTYLE.ref)DRW_dbg::dbgHL(CMLSTYLE.code, CMLSTYLE.size, CMLSTYLE.ref);
2097 if (version > DRW::AC1014) {//2000+
2098 vars["PSVPSCALE"]=new DRW_Variant(40, buf->getBitDouble());
2099 }
2100 vars["PINSBASE"]=new DRW_Variant(10, buf->get3BitDouble());
2101 vars["PEXTMIN"]=new DRW_Variant(10, buf->get3BitDouble());
2102 vars["PEXTMAX"]=new DRW_Variant(10, buf->get3BitDouble());
2103 vars["PLIMMIN"]=new DRW_Variant(10, buf->get2RawDouble());
2104 vars["PLIMMAX"]=new DRW_Variant(10, buf->get2RawDouble());
2105 vars["PELEVATION"]=new DRW_Variant(40, buf->getBitDouble());
2106 vars["PUCSORG"]=new DRW_Variant(10, buf->get3BitDouble());
2107 vars["PUCSXDIR"]=new DRW_Variant(10, buf->get3BitDouble());
2108 vars["PUCSYDIR"]=new DRW_Variant(10, buf->get3BitDouble());
2109 dwgHandle PUCSNAME = hBbuf->getHandle();
2110 DRW_DBG("\nPUCSNAME: ")DRW_dbg::dbg("\nPUCSNAME: "); DRW_DBGHL(PUCSNAME.code, PUCSNAME.size, PUCSNAME.ref)DRW_dbg::dbgHL(PUCSNAME.code, PUCSNAME.size, PUCSNAME.ref);
2111 if (version > DRW::AC1014) {//2000+
2112 dwgHandle PUCSORTHOREF = hBbuf->getHandle();
2113 DRW_DBG("\nPUCSORTHOREF: ")DRW_dbg::dbg("\nPUCSORTHOREF: "); DRW_DBGHL(PUCSORTHOREF.code, PUCSORTHOREF.size, PUCSORTHOREF.ref)DRW_dbg::dbgHL(PUCSORTHOREF.code, PUCSORTHOREF.size, PUCSORTHOREF
.ref)
;
2114 vars["PUCSORTHOVIEW"]=new DRW_Variant(70, buf->getBitShort());
2115 dwgHandle PUCSBASE = hBbuf->getHandle();
2116 DRW_DBG("\nPUCSBASE: ")DRW_dbg::dbg("\nPUCSBASE: "); DRW_DBGHL(PUCSBASE.code, PUCSBASE.size, PUCSBASE.ref)DRW_dbg::dbgHL(PUCSBASE.code, PUCSBASE.size, PUCSBASE.ref);
2117 vars["PUCSORGTOP"]=new DRW_Variant(10, buf->get3BitDouble());
2118 vars["PUCSORGBOTTOM"]=new DRW_Variant(10, buf->get3BitDouble());
2119 vars["PUCSORGLEFT"]=new DRW_Variant(10, buf->get3BitDouble());
2120 vars["PUCSORGRIGHT"]=new DRW_Variant(10, buf->get3BitDouble());
2121 vars["PUCSORGFRONT"]=new DRW_Variant(10, buf->get3BitDouble());
2122 vars["PUCSORGBACK"]=new DRW_Variant(10, buf->get3BitDouble());
2123 }
2124 vars["INSBASE"]=new DRW_Variant(10, buf->get3BitDouble());
2125 vars["EXTMIN"]=new DRW_Variant(10, buf->get3BitDouble());
2126 vars["EXTMAX"]=new DRW_Variant(10, buf->get3BitDouble());
2127
2128 vars["LIMMIN"]=new DRW_Variant(10, buf->get2RawDouble());
2129 vars["LIMMAX"]=new DRW_Variant(10, buf->get2RawDouble());
2130 vars["ELEVATION"]=new DRW_Variant(40, buf->getBitDouble());
2131 vars["UCSORG"]=new DRW_Variant(10, buf->get3BitDouble());
2132 vars["UCSXDIR"]=new DRW_Variant(10, buf->get3BitDouble());
2133 vars["UCSYDIR"]=new DRW_Variant(10, buf->get3BitDouble());
2134 dwgHandle UCSNAME = hBbuf->getHandle();
2135 DRW_DBG("\nUCSNAME: ")DRW_dbg::dbg("\nUCSNAME: "); DRW_DBGHL(UCSNAME.code, UCSNAME.size, UCSNAME.ref)DRW_dbg::dbgHL(UCSNAME.code, UCSNAME.size, UCSNAME.ref);
2136 if (version > DRW::AC1014) {//2000+
2137 dwgHandle UCSORTHOREF = hBbuf->getHandle();
2138 DRW_DBG("\nUCSORTHOREF: ")DRW_dbg::dbg("\nUCSORTHOREF: "); DRW_DBGHL(UCSORTHOREF.code, UCSORTHOREF.size, UCSORTHOREF.ref)DRW_dbg::dbgHL(UCSORTHOREF.code, UCSORTHOREF.size, UCSORTHOREF
.ref)
;
2139 vars["UCSORTHOVIEW"]=new DRW_Variant(70, buf->getBitShort());
2140 dwgHandle UCSBASE = hBbuf->getHandle();
2141 DRW_DBG("\nUCSBASE: ")DRW_dbg::dbg("\nUCSBASE: "); DRW_DBGHL(UCSBASE.code, UCSBASE.size, UCSBASE.ref)DRW_dbg::dbgHL(UCSBASE.code, UCSBASE.size, UCSBASE.ref);
2142 vars["UCSORGTOP"]=new DRW_Variant(10, buf->get3BitDouble());
2143 vars["UCSORGBOTTOM"]=new DRW_Variant(10, buf->get3BitDouble());
2144 vars["UCSORGLEFT"]=new DRW_Variant(10, buf->get3BitDouble());
2145 vars["UCSORGRIGHT"]=new DRW_Variant(10, buf->get3BitDouble());
2146 vars["UCSORGFRONT"]=new DRW_Variant(10, buf->get3BitDouble());
2147 vars["UCSORGBACK"]=new DRW_Variant(10, buf->get3BitDouble());
2148 if (version < DRW::AC1021) {//2004-
2149 vars["DIMPOST"]=new DRW_Variant(1, buf->getCP8Text());
2150 vars["DIMAPOST"]=new DRW_Variant(1, buf->getCP8Text());
2151 }
2152 }
2153 if (version < DRW::AC1015) {//r14-
2154 vars["DIMTOL"]=new DRW_Variant(70, buf->getBit());
2155 vars["DIMLIM"]=new DRW_Variant(70, buf->getBit());
2156 vars["DIMTIH"]=new DRW_Variant(70, buf->getBit());
2157 vars["DIMTOH"]=new DRW_Variant(70, buf->getBit());
2158 vars["DIMSE1"]=new DRW_Variant(70, buf->getBit());
2159 vars["DIMSE2"]=new DRW_Variant(70, buf->getBit());
2160 vars["DIMALT"]=new DRW_Variant(70, buf->getBit());
2161 vars["DIMTOFL"]=new DRW_Variant(70, buf->getBit());
2162 vars["DIMSAH"]=new DRW_Variant(70, buf->getBit());
2163 vars["DIMTIX"]=new DRW_Variant(70, buf->getBit());
2164 vars["DIMSOXD"]=new DRW_Variant(70, buf->getBit());
2165 vars["DIMALTD"]=new DRW_Variant(70, buf->getRawChar8());
2166 vars["DIMZIN"]=new DRW_Variant(70, buf->getRawChar8());
2167 vars["DIMSD1"]=new DRW_Variant(70, buf->getBit());
2168 vars["DIMSD2"]=new DRW_Variant(70, buf->getBit());
2169 vars["DIMTOLJ"]=new DRW_Variant(70, buf->getRawChar8());
2170 vars["DIMJUST"]=new DRW_Variant(70, buf->getRawChar8());
2171 vars["DIMFIT"]=new DRW_Variant(70, buf->getRawChar8());///////////
2172 vars["DIMUPT"]=new DRW_Variant(70, buf->getBit());
2173 vars["DIMTZIN"]=new DRW_Variant(70, buf->getRawChar8());
2174 vars["DIMALTZ"]=new DRW_Variant(70, buf->getRawChar8());
2175 vars["DIMALTTZ"]=new DRW_Variant(70, buf->getRawChar8());
2176 vars["DIMTAD"]=new DRW_Variant(70, buf->getRawChar8());
2177 vars["DIMUNIT"]=new DRW_Variant(70, buf->getBitShort());///////////
2178 vars["DIMAUNIT"]=new DRW_Variant(70, buf->getBitShort());
2179 vars["DIMDEC"]=new DRW_Variant(70, buf->getBitShort());
2180 vars["DIMTDEC"]=new DRW_Variant(70, buf->getBitShort());
2181 vars["DIMALTU"]=new DRW_Variant(70, buf->getBitShort());
2182 vars["DIMALTTD"]=new DRW_Variant(70, buf->getBitShort());
2183 dwgHandle DIMTXSTY = hBbuf->getHandle();
2184 DRW_DBG("\nDIMTXSTY: ")DRW_dbg::dbg("\nDIMTXSTY: "); DRW_DBGHL(DIMTXSTY.code, DIMTXSTY.size, DIMTXSTY.ref)DRW_dbg::dbgHL(DIMTXSTY.code, DIMTXSTY.size, DIMTXSTY.ref);
2185 }
2186 vars["DIMSCALE"]=new DRW_Variant(40, buf->getBitDouble());
2187 vars["DIMASZ"]=new DRW_Variant(40, buf->getBitDouble());
2188 vars["DIMEXO"]=new DRW_Variant(40, buf->getBitDouble());
2189 vars["DIMDLI"]=new DRW_Variant(40, buf->getBitDouble());
2190 vars["DIMEXE"]=new DRW_Variant(40, buf->getBitDouble());
2191 vars["DIMRND"]=new DRW_Variant(40, buf->getBitDouble());
2192 vars["DIMDLE"]=new DRW_Variant(40, buf->getBitDouble());
2193 vars["DIMTP"]=new DRW_Variant(40, buf->getBitDouble());
2194 vars["DIMTM"]=new DRW_Variant(40, buf->getBitDouble());
2195 if (version > DRW::AC1018) {//2007+
2196 vars["DIMFXL"]=new DRW_Variant(40, buf->getBitDouble());//////////////////
2197 vars["DIMJOGANG"]=new DRW_Variant(40, buf->getBitDouble());///////////////
2198 vars["DIMTFILL"]=new DRW_Variant(70, buf->getBitShort());
2199 vars["DIMTFILLCLR"]=new DRW_Variant(62, buf->getCmColor(version));
2200 }
2201 if (version > DRW::AC1014) {//2000+
2202 vars["DIMTOL"]=new DRW_Variant(70, buf->getBit());
2203 vars["DIMLIM"]=new DRW_Variant(70, buf->getBit());
2204 vars["DIMTIH"]=new DRW_Variant(70, buf->getBit());
2205 vars["DIMTOH"]=new DRW_Variant(70, buf->getBit());
2206 vars["DIMSE1"]=new DRW_Variant(70, buf->getBit());
2207 vars["DIMSE2"]=new DRW_Variant(70, buf->getBit());
2208 vars["DIMTAD"]=new DRW_Variant(70, buf->getBitShort());
2209 vars["DIMZIN"]=new DRW_Variant(70, buf->getBitShort());
2210 vars["DIMAZIN"]=new DRW_Variant(70, buf->getBitShort());
2211 }
2212 if (version > DRW::AC1018) {//2007+
2213 vars["DIMARCSYM"]=new DRW_Variant(70, buf->getBitShort());
2214 }
2215 vars["DIMTXT"]=new DRW_Variant(40, buf->getBitDouble());
2216 vars["DIMCEN"]=new DRW_Variant(40, buf->getBitDouble());
2217 vars["DIMTSZ"]=new DRW_Variant(40, buf->getBitDouble());
2218 vars["DIMALTF"]=new DRW_Variant(40, buf->getBitDouble());
2219 vars["DIMLFAC"]=new DRW_Variant(40, buf->getBitDouble());
2220 vars["DIMTVP"]=new DRW_Variant(40, buf->getBitDouble());
2221 vars["DIMTFAC"]=new DRW_Variant(40, buf->getBitDouble());
2222 vars["DIMGAP"]=new DRW_Variant(40, buf->getBitDouble());
2223 if (version < DRW::AC1015) {//r14-
2224 vars["DIMPOST"]=new DRW_Variant(1, buf->getCP8Text());
2225 vars["DIMAPOST"]=new DRW_Variant(1, buf->getCP8Text());
2226 vars["DIMBLK"]=new DRW_Variant(1, buf->getCP8Text());
2227 vars["DIMBLK1"]=new DRW_Variant(1, buf->getCP8Text());
2228 vars["DIMBLK2"]=new DRW_Variant(1, buf->getCP8Text());
2229 }
2230 if (version > DRW::AC1014) {//2000+
2231 vars["DIMALTRND"]=new DRW_Variant(40, buf->getBitDouble());
2232 vars["DIMALT"]=new DRW_Variant(70, buf->getBit());
2233 vars["DIMALTD"]=new DRW_Variant(70, buf->getBitShort());
2234 vars["DIMTOFL"]=new DRW_Variant(70, buf->getBit());
2235 vars["DIMSAH"]=new DRW_Variant(70, buf->getBit());
2236 vars["DIMTIX"]=new DRW_Variant(70, buf->getBit());
2237 vars["DIMSOXD"]=new DRW_Variant(70, buf->getBit());
2238 }
2239 vars["DIMCLRD"]=new DRW_Variant(70, buf->getCmColor(version));//RLZ: TODO read CMC or EMC color
2240 vars["DIMCLRE"]=new DRW_Variant(70, buf->getCmColor(version));//RLZ: TODO read CMC or EMC color
2241 vars["DIMCLRT"]=new DRW_Variant(70, buf->getCmColor(version));//RLZ: TODO read CMC or EMC color
2242 if (version > DRW::AC1014) {//2000+
2243 vars["DIMADEC"]=new DRW_Variant(70, buf->getBitShort());
2244 vars["DIMDEC"]=new DRW_Variant(70, buf->getBitShort());
2245 vars["DIMTDEC"]=new DRW_Variant(70, buf->getBitShort());
2246 vars["DIMALTU"]=new DRW_Variant(70, buf->getBitShort());
2247 vars["DIMALTTD"]=new DRW_Variant(70, buf->getBitShort());
2248 vars["DIMAUNIT"]=new DRW_Variant(70, buf->getBitShort());
2249 vars["DIMFRAC"]=new DRW_Variant(70, buf->getBitShort());// DIMFRAC (fraction format)
2250 vars["DIMLUNIT"]=new DRW_Variant(70, buf->getBitShort());
2251 vars["DIMDSEP"]=new DRW_Variant(70, buf->getBitShort());
2252 vars["DIMTMOVE"]=new DRW_Variant(70, buf->getBitShort());
2253 vars["DIMJUST"]=new DRW_Variant(70, buf->getBitShort());
2254 vars["DIMSD1"]=new DRW_Variant(70, buf->getBit());
2255 vars["DIMSD2"]=new DRW_Variant(70, buf->getBit());
2256 vars["DIMTOLJ"]=new DRW_Variant(70, buf->getBitShort());
2257 vars["DIMTZIN"]=new DRW_Variant(70, buf->getBitShort());
2258 vars["DIMALTZ"]=new DRW_Variant(70, buf->getBitShort());
2259 vars["DIMALTTZ"]=new DRW_Variant(70, buf->getBitShort());
2260 vars["DIMUPT"]=new DRW_Variant(70, buf->getBit());
2261 vars["DIMATFIT"]=new DRW_Variant(70, buf->getBitShort());
2262 }
2263 if (version > DRW::AC1018) {//2007+
2264 vars["DIMFXLON"]=new DRW_Variant(70, buf->getBit());////////////////
2265 }
2266 if (version > DRW::AC1021) {//2010+
2267 vars["DIMTXTDIRECTION"]=new DRW_Variant(70, buf->getBit());////////////////
2268 vars["DIMALTMZF"]=new DRW_Variant(40, buf->getBitDouble());////////////////
2269 vars["DIMMZF"]=new DRW_Variant(40, buf->getBitDouble());////////////////
2270 }
2271 if (version > DRW::AC1014) {//2000+
2272 dwgHandle DIMTXSTY = hBbuf->getHandle();
2273 DRW_DBG("\nDIMTXSTY: ")DRW_dbg::dbg("\nDIMTXSTY: "); DRW_DBGHL(DIMTXSTY.code, DIMTXSTY.size, DIMTXSTY.ref)DRW_dbg::dbgHL(DIMTXSTY.code, DIMTXSTY.size, DIMTXSTY.ref);
2274 dwgHandle DIMLDRBLK = hBbuf->getHandle();
2275 DRW_DBG("\nDIMLDRBLK: ")DRW_dbg::dbg("\nDIMLDRBLK: "); DRW_DBGHL(DIMLDRBLK.code, DIMLDRBLK.size, DIMLDRBLK.ref)DRW_dbg::dbgHL(DIMLDRBLK.code, DIMLDRBLK.size, DIMLDRBLK.ref);
2276 dwgHandle DIMBLK = hBbuf->getHandle();
2277 DRW_DBG("\nDIMBLK: ")DRW_dbg::dbg("\nDIMBLK: "); DRW_DBGHL(DIMBLK.code, DIMBLK.size, DIMBLK.ref)DRW_dbg::dbgHL(DIMBLK.code, DIMBLK.size, DIMBLK.ref);
2278 dwgHandle DIMBLK1 = hBbuf->getHandle();
2279 DRW_DBG("\nDIMBLK1: ")DRW_dbg::dbg("\nDIMBLK1: "); DRW_DBGHL(DIMBLK1.code, DIMBLK1.size, DIMBLK1.ref)DRW_dbg::dbgHL(DIMBLK1.code, DIMBLK1.size, DIMBLK1.ref);
2280 dwgHandle DIMBLK2 = hBbuf->getHandle();
2281 DRW_DBG("\nDIMBLK2: ")DRW_dbg::dbg("\nDIMBLK2: "); DRW_DBGHL(DIMBLK2.code, DIMBLK2.size, DIMBLK2.ref)DRW_dbg::dbgHL(DIMBLK2.code, DIMBLK2.size, DIMBLK2.ref);
2282 }
2283 if (version > DRW::AC1018) {//2007+
2284 dwgHandle DIMLTYPE = hBbuf->getHandle();
2285 DRW_DBG("\nDIMLTYPE: ")DRW_dbg::dbg("\nDIMLTYPE: "); DRW_DBGHL(DIMLTYPE.code, DIMLTYPE.size, DIMLTYPE.ref)DRW_dbg::dbgHL(DIMLTYPE.code, DIMLTYPE.size, DIMLTYPE.ref);
2286 dwgHandle DIMLTEX1 = hBbuf->getHandle();
2287 DRW_DBG("\nDIMLTEX1: ")DRW_dbg::dbg("\nDIMLTEX1: "); DRW_DBGHL(DIMLTEX1.code, DIMLTEX1.size, DIMLTEX1.ref)DRW_dbg::dbgHL(DIMLTEX1.code, DIMLTEX1.size, DIMLTEX1.ref);
2288 dwgHandle DIMLTEX2 = hBbuf->getHandle();
2289 DRW_DBG("\nDIMLTEX2: ")DRW_dbg::dbg("\nDIMLTEX2: "); DRW_DBGHL(DIMLTEX2.code, DIMLTEX2.size, DIMLTEX2.ref)DRW_dbg::dbgHL(DIMLTEX2.code, DIMLTEX2.size, DIMLTEX2.ref);
2290 }
2291 if (version > DRW::AC1014) {//2000+
2292 vars["DIMLWD"]=new DRW_Variant(70, buf->getBitShort());
2293 vars["DIMLWE"]=new DRW_Variant(70, buf->getBitShort());
2294 }
2295 dwgHandle CONTROL = hBbuf->getHandle();
2296 DRW_DBG("\nBLOCK CONTROL: ")DRW_dbg::dbg("\nBLOCK CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2297 blockCtrl = CONTROL.ref;
2298 CONTROL = hBbuf->getHandle();
2299 DRW_DBG("\nLAYER CONTROL: ")DRW_dbg::dbg("\nLAYER CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2300 layerCtrl = CONTROL.ref;
2301 CONTROL = hBbuf->getHandle();
2302 DRW_DBG("\nSTYLE CONTROL: ")DRW_dbg::dbg("\nSTYLE CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2303 styleCtrl = CONTROL.ref;
2304 CONTROL = hBbuf->getHandle();
2305 DRW_DBG("\nLINETYPE CONTROL: ")DRW_dbg::dbg("\nLINETYPE CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2306 linetypeCtrl = CONTROL.ref;
2307 CONTROL = hBbuf->getHandle();
2308 DRW_DBG("\nVIEW CONTROL: ")DRW_dbg::dbg("\nVIEW CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2309 viewCtrl = CONTROL.ref;
2310 CONTROL = hBbuf->getHandle();
2311 DRW_DBG("\nUCS CONTROL: ")DRW_dbg::dbg("\nUCS CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2312 ucsCtrl = CONTROL.ref;
2313 CONTROL = hBbuf->getHandle();
2314 DRW_DBG("\nVPORT CONTROL: ")DRW_dbg::dbg("\nVPORT CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2315 vportCtrl = CONTROL.ref;
2316 CONTROL = hBbuf->getHandle();
2317 DRW_DBG("\nAPPID CONTROL: ")DRW_dbg::dbg("\nAPPID CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2318 appidCtrl = CONTROL.ref;
2319 CONTROL = hBbuf->getHandle();
2320 DRW_DBG("\nDIMSTYLE CONTROL: ")DRW_dbg::dbg("\nDIMSTYLE CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2321 dimstyleCtrl = CONTROL.ref;
2322 if (version < DRW::AC1018) {//r2000-
2323 CONTROL = hBbuf->getHandle();
2324 DRW_DBG("\nVIEWPORT ENTITY HEADER CONTROL: ")DRW_dbg::dbg("\nVIEWPORT ENTITY HEADER CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2325 vpEntHeaderCtrl = CONTROL.ref; //RLZ: only in R13-R15 ????
2326 }
2327 CONTROL = hBbuf->getHandle();
2328 DRW_DBG("\nDICT ACAD_GROUP: ")DRW_dbg::dbg("\nDICT ACAD_GROUP: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2329 CONTROL = hBbuf->getHandle();
2330 DRW_DBG("\nDICT ACAD_MLINESTYLE: ")DRW_dbg::dbg("\nDICT ACAD_MLINESTYLE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2331 CONTROL = hBbuf->getHandle();
2332 DRW_DBG("\nDICT NAMED OBJS: ")DRW_dbg::dbg("\nDICT NAMED OBJS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2333
2334 if (version > DRW::AC1014) {//2000+
2335 vars["TSTACKALIGN"]=new DRW_Variant(70, buf->getBitShort());
2336 vars["TSTACKSIZE"]=new DRW_Variant(70, buf->getBitShort());
2337 if (version < DRW::AC1021) {//2004-
2338 vars["HYPERLINKBASE"]=new DRW_Variant(1, buf->getCP8Text());
2339 vars["STYLESHEET"]=new DRW_Variant(1, buf->getCP8Text());
2340 }
2341 CONTROL = hBbuf->getHandle();
2342 DRW_DBG("\nDICT LAYOUTS: ")DRW_dbg::dbg("\nDICT LAYOUTS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2343 CONTROL = hBbuf->getHandle();
2344 DRW_DBG("\nDICT PLOTSETTINGS: ")DRW_dbg::dbg("\nDICT PLOTSETTINGS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2345 CONTROL = hBbuf->getHandle();
2346 DRW_DBG("\nDICT PLOTSTYLES: ")DRW_dbg::dbg("\nDICT PLOTSTYLES: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2347 }
2348 if (version > DRW::AC1015) {//2004+
2349 CONTROL = hBbuf->getHandle();
2350 DRW_DBG("\nDICT MATERIALS: ")DRW_dbg::dbg("\nDICT MATERIALS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2351 CONTROL = hBbuf->getHandle();
2352 DRW_DBG("\nDICT COLORS: ")DRW_dbg::dbg("\nDICT COLORS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2353 }
2354 if (version > DRW::AC1018) {//2007+
2355 CONTROL = hBbuf->getHandle();
2356 DRW_DBG("\nDICT VISUALSTYLE: ")DRW_dbg::dbg("\nDICT VISUALSTYLE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2357 }
2358 if (version > DRW::AC1024) {//2013+
2359 CONTROL = hBbuf->getHandle();
2360 DRW_DBG("\nUNKNOWN HANDLE: ")DRW_dbg::dbg("\nUNKNOWN HANDLE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2361 }
2362 if (version > DRW::AC1014) {//2000+
2363 DRW_DBG("\nFlags: ")DRW_dbg::dbg("\nFlags: "); DRW_DBGH(buf->getBitLong())DRW_dbg::dbgH(buf->getBitLong());//RLZ TODO change to 8 vars
2364 vars["INSUNITS"]=new DRW_Variant(70, buf->getBitShort());
2365 std::uint16_t cepsntype = buf->getBitShort();
2366 vars["CEPSNTYPE"]=new DRW_Variant(70, cepsntype);
2367 if (cepsntype == 3){
2368 CONTROL = hBbuf->getHandle();
2369 DRW_DBG("\nCPSNID HANDLE: ")DRW_dbg::dbg("\nCPSNID HANDLE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2370 }
2371 if (version < DRW::AC1021) {//2004-
2372 vars["FINGERPRINTGUID"]=new DRW_Variant(1, buf->getCP8Text());
2373 vars["VERSIONGUID"]=new DRW_Variant(1, buf->getCP8Text());
2374 }
2375 }
2376 if (version > DRW::AC1015) {//2004+
2377 vars["SORTENTS"]=new DRW_Variant(70, buf->getRawChar8());
2378 vars["INDEXCTL"]=new DRW_Variant(70, buf->getRawChar8());
2379 vars["HIDETEXT"]=new DRW_Variant(70, buf->getRawChar8());
2380 vars["XCLIPFRAME"]=new DRW_Variant(70, buf->getRawChar8());
2381 vars["DIMASSOC"]=new DRW_Variant(70, buf->getRawChar8());
2382 vars["HALOGAP"]=new DRW_Variant(70, buf->getRawChar8());
2383 vars["OBSCUREDCOLOR"]=new DRW_Variant(70, buf->getBitShort());
2384 vars["INTERSECTIONCOLOR"]=new DRW_Variant(70, buf->getBitShort());
2385 vars["OBSCUREDLTYPE"]=new DRW_Variant(70, buf->getRawChar8());
2386 vars["INTERSECTIONDISPLAY"]=new DRW_Variant(70, buf->getRawChar8());
2387 if (version < DRW::AC1021) {//2004-
2388 vars["PROJECTNAME"]=new DRW_Variant(1, buf->getCP8Text());
2389 }
2390 }
2391 CONTROL = hBbuf->getHandle();
2392 DRW_DBG("\nBLOCK PAPER_SPACE: ")DRW_dbg::dbg("\nBLOCK PAPER_SPACE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2393 CONTROL = hBbuf->getHandle();
2394 DRW_DBG("\nBLOCK MODEL_SPACE: ")DRW_dbg::dbg("\nBLOCK MODEL_SPACE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2395 CONTROL = hBbuf->getHandle();
2396 DRW_DBG("\nLTYPE BYLAYER: ")DRW_dbg::dbg("\nLTYPE BYLAYER: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2397 CONTROL = hBbuf->getHandle();
2398 DRW_DBG("\nLTYPE BYBLOCK: ")DRW_dbg::dbg("\nLTYPE BYBLOCK: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2399 CONTROL = hBbuf->getHandle();
2400 DRW_DBG("\nLTYPE CONTINUOUS: ")DRW_dbg::dbg("\nLTYPE CONTINUOUS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2401 if (version > DRW::AC1018) {//2007+
2402 vars["CAMERADISPLAY"]=new DRW_Variant(70, buf->getBit());
2403 DRW_DBG("\nUnknown 2007+ long1: ")DRW_dbg::dbg("\nUnknown 2007+ long1: "); DRW_DBG(buf->getBitLong())DRW_dbg::dbg(buf->getBitLong());
2404 DRW_DBG("\nUnknown 2007+ long2: ")DRW_dbg::dbg("\nUnknown 2007+ long2: "); DRW_DBG(buf->getBitLong())DRW_dbg::dbg(buf->getBitLong());
2405 DRW_DBG("\nUnknown 2007+ double2: ")DRW_dbg::dbg("\nUnknown 2007+ double2: "); DRW_DBG(buf->getBitDouble())DRW_dbg::dbg(buf->getBitDouble());
2406 vars["STEPSPERSEC"]=new DRW_Variant(40, buf->getBitDouble());
2407 vars["STEPSIZE"]=new DRW_Variant(40, buf->getBitDouble());
2408 vars["3DDWFPREC"]=new DRW_Variant(40, buf->getBitDouble());
2409 vars["LENSLENGTH"]=new DRW_Variant(40, buf->getBitDouble());
2410 vars["CAMERAHEIGHT"]=new DRW_Variant(40, buf->getBitDouble());
2411 vars["SOLIDHIST"]=new DRW_Variant(70, buf->getRawChar8());
2412 vars["SHOWHIST"]=new DRW_Variant(70, buf->getRawChar8());
2413 vars["PSOLWIDTH"]=new DRW_Variant(40, buf->getBitDouble());
2414 vars["PSOLHEIGHT"]=new DRW_Variant(40, buf->getBitDouble());
2415 vars["LOFTANG1"]=new DRW_Variant(40, buf->getBitDouble());
2416 vars["LOFTANG2"]=new DRW_Variant(40, buf->getBitDouble());
2417 vars["LOFTMAG1"]=new DRW_Variant(40, buf->getBitDouble());
2418 vars["LOFTMAG2"]=new DRW_Variant(40, buf->getBitDouble());
2419 vars["LOFTPARAM"]=new DRW_Variant(70, buf->getBitShort());
2420 vars["LOFTNORMALS"]=new DRW_Variant(40, buf->getRawChar8());
2421 vars["LATITUDE"]=new DRW_Variant(40, buf->getBitDouble());
2422 vars["LONGITUDE"]=new DRW_Variant(40, buf->getBitDouble());
2423 vars["NORTHDIRECTION"]=new DRW_Variant(40, buf->getBitDouble());
2424 vars["TIMEZONE"]=new DRW_Variant(70, buf->getBitLong());
2425 vars["LIGHTGLYPHDISPLAY"]=new DRW_Variant(70, buf->getRawChar8());
2426 vars["TILEMODELIGHTSYNCH"]=new DRW_Variant(70, buf->getRawChar8());
2427 vars["DWFFRAME"]=new DRW_Variant(70, buf->getRawChar8());
2428 vars["DGNFRAME"]=new DRW_Variant(70, buf->getRawChar8());
2429 DRW_DBG("\nUnknown 2007+ BIT: ")DRW_dbg::dbg("\nUnknown 2007+ BIT: "); DRW_DBG(buf->getBit())DRW_dbg::dbg(buf->getBit());
2430 vars["INTERFERECOLOR"]=new DRW_Variant(70, buf->getCmColor(version));
2431 CONTROL = hBbuf->getHandle();
2432 DRW_DBG("\nINTERFEREOBJVS: ")DRW_dbg::dbg("\nINTERFEREOBJVS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2433 CONTROL = hBbuf->getHandle();
2434 DRW_DBG("\nINTERFEREVPVS: ")DRW_dbg::dbg("\nINTERFEREVPVS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2435 CONTROL = hBbuf->getHandle();
2436 DRW_DBG("\nDRAGVS: ")DRW_dbg::dbg("\nDRAGVS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2437 vars["CSHADOW"]=new DRW_Variant(70, buf->getRawChar8());
2438 DRW_DBG("\nUnknown 2007+ double2: ")DRW_dbg::dbg("\nUnknown 2007+ double2: "); DRW_DBG(buf->getBitDouble())DRW_dbg::dbg(buf->getBitDouble());
2439 }
2440 if (version > DRW::AC1012) {//R14+
2441 DRW_DBG("\nUnknown R14+ short1: ")DRW_dbg::dbg("\nUnknown R14+ short1: "); DRW_DBG(buf->getBitShort())DRW_dbg::dbg(buf->getBitShort());
2442 DRW_DBG("\nUnknown R14+ short2: ")DRW_dbg::dbg("\nUnknown R14+ short2: "); DRW_DBG(buf->getBitShort())DRW_dbg::dbg(buf->getBitShort());
2443 DRW_DBG("\nUnknown R14+ short3: ")DRW_dbg::dbg("\nUnknown R14+ short3: "); DRW_DBG(buf->getBitShort())DRW_dbg::dbg(buf->getBitShort());
2444 DRW_DBG("\nUnknown R14+ short4: ")DRW_dbg::dbg("\nUnknown R14+ short4: "); DRW_DBG(buf->getBitShort())DRW_dbg::dbg(buf->getBitShort());
2445 }
2446
2447 DRW_DBG("\nbuf position: ")DRW_dbg::dbg("\nbuf position: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2448 DRW_DBG(" buf bit position: ")DRW_dbg::dbg(" buf bit position: "); DRW_DBG(buf->getBitPos())DRW_dbg::dbg(buf->getBitPos());
2449
2450
2451 /**** RLZ: disabled, pending to read all data ***/
2452 //Start reading string stream for 2007 and further
2453 if (version > DRW::AC1018) {//2007+
2454 std::uint32_t strStartPos = endBitPos -1;
2455 buf->setPosition(strStartPos >>3);
2456 buf->setBitPos(strStartPos&7);
2457 if (buf->getBit() == 1){
2458 strStartPos -= 16;
2459 buf->setPosition(strStartPos >>3);
2460 buf->setBitPos(strStartPos&7);
2461 std::uint32_t strDataSize = buf->getRawShort16();
2462 if (strDataSize & 0x8000) {
2463 strStartPos -= 16;//decrement 16 bits
2464 strDataSize &= 0x7FFF; //strip 0x8000;
2465 buf->setPosition(strStartPos >> 3);
2466 buf->setBitPos(strStartPos & 7);
2467 std::uint32_t hiSize = buf->getRawShort16();
2468 strDataSize |= (hiSize << 15);
2469 }
2470 strStartPos -= strDataSize;
2471 buf->setPosition(strStartPos >> 3);
2472 buf->setBitPos(strStartPos & 7);
2473
2474 DRW_DBG("\nstring buf position: ")DRW_dbg::dbg("\nstring buf position: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2475 DRW_DBG("\nstring buf bit position: ")DRW_dbg::dbg("\nstring buf bit position: "); DRW_DBG(buf->getBitPos())DRW_dbg::dbg(buf->getBitPos());
2476 }
2477 DRW_DBG("\nUnknown text1: ")DRW_dbg::dbg("\nUnknown text1: "); DRW_DBG(buf->getUCSText(false))DRW_dbg::dbg(buf->getUCSText(false));
2478 DRW_DBG("\nUnknown text2: ")DRW_dbg::dbg("\nUnknown text2: "); DRW_DBG(buf->getUCSText(false))DRW_dbg::dbg(buf->getUCSText(false));
2479 DRW_DBG("\nUnknown text3: ")DRW_dbg::dbg("\nUnknown text3: "); DRW_DBG(buf->getUCSText(false))DRW_dbg::dbg(buf->getUCSText(false));
2480 DRW_DBG("\nUnknown text4: ")DRW_dbg::dbg("\nUnknown text4: "); DRW_DBG(buf->getUCSText(false))DRW_dbg::dbg(buf->getUCSText(false));
2481 vars["MENU"]=new DRW_Variant(1, buf->getUCSText(false));
2482 vars["DIMPOST"]=new DRW_Variant(1, buf->getUCSText(false));
2483 vars["DIMAPOST"]=new DRW_Variant(1, buf->getUCSText(false));
2484 if (version > DRW::AC1021) {//2010+
2485 vars["DIMALTMZS"]=new DRW_Variant(70, buf->getUCSText(false));//RLZ: pending to verify//////////////
2486 vars["DIMMZS"]=new DRW_Variant(70, buf->getUCSText(false));//RLZ: pending to verify//////////////
2487 }
2488 vars["HYPERLINKBASE"]=new DRW_Variant(1, buf->getUCSText(false));
2489 vars["STYLESHEET"]=new DRW_Variant(1, buf->getUCSText(false));
2490 vars["FINGERPRINTGUID"]=new DRW_Variant(1, buf->getUCSText(false));
2491 DRW_DBG("\nstring buf position: ")DRW_dbg::dbg("\nstring buf position: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2492 DRW_DBG(" string buf bit position: ")DRW_dbg::dbg(" string buf bit position: "); DRW_DBG(buf->getBitPos())DRW_dbg::dbg(buf->getBitPos());
2493 vars["VERSIONGUID"]=new DRW_Variant(1, buf->getUCSText(false));
2494 DRW_DBG("\nstring buf position: ")DRW_dbg::dbg("\nstring buf position: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2495 DRW_DBG(" string buf bit position: ")DRW_dbg::dbg(" string buf bit position: "); DRW_DBG(buf->getBitPos())DRW_dbg::dbg(buf->getBitPos());
2496 vars["PROJECTNAME"]=new DRW_Variant(1, buf->getUCSText(false));
2497 }
2498/*** ****/
2499 DRW_DBG("\nstring buf position: ")DRW_dbg::dbg("\nstring buf position: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2500 DRW_DBG(" string buf bit position: ")DRW_dbg::dbg(" string buf bit position: "); DRW_DBG(buf->getBitPos())DRW_dbg::dbg(buf->getBitPos());
2501
2502 if (DRW_DBGGLDRW_dbg::getInstance()->getLevel() == DRW_dbg::Level::Debug){
2503 for (auto it=vars.begin(); it!=vars.end(); ++it){
2504 DRW_DBG("\n")DRW_dbg::dbg("\n"); DRW_DBG(it->first)DRW_dbg::dbg(it->first); DRW_DBG(": ")DRW_dbg::dbg(": ");
2505 switch (it->second->type()){
2506 case DRW_Variant::INTEGER:
2507 DRW_DBG(it->second->content.i)DRW_dbg::dbg(it->second->content.i);
2508 break;
2509 case DRW_Variant::DOUBLE:
2510 DRW_DBG(it->second->content.d)DRW_dbg::dbg(it->second->content.d);
2511 break;
2512 case DRW_Variant::STRING:
2513 DRW_DBG(it->second->content.s->c_str())DRW_dbg::dbg(it->second->content.s->c_str());
2514 break;
2515 case DRW_Variant::COORD:
2516 DRW_DBG("x= ")DRW_dbg::dbg("x= "); DRW_DBG(it->second->content.v->x)DRW_dbg::dbg(it->second->content.v->x);
2517 DRW_DBG(", y= ")DRW_dbg::dbg(", y= "); DRW_DBG(it->second->content.v->y)DRW_dbg::dbg(it->second->content.v->y);
2518 DRW_DBG(", z= ")DRW_dbg::dbg(", z= "); DRW_DBG(it->second->content.v->z)DRW_dbg::dbg(it->second->content.v->z);
2519 break;
2520 default:
2521 break;
2522 }
2523 DRW_DBG(" code: ")DRW_dbg::dbg(" code: ");DRW_DBG(it->second->code())DRW_dbg::dbg(it->second->code());
2524 }
2525 }
2526
2527 buf->setPosition(size+16+4); //read size +16 start sentinel + 4 size
2528 if ((DRW::AC1024 <= version && 3 < maintenanceVersion)
2529 || DRW::AC1032 <= version) { //2010+ MV>3
2530 buf->getRawLong32();//advance 4 bytes (hisize)
2531 }
2532 DRW_DBG("\nsetting position to: ")DRW_dbg::dbg("\nsetting position to: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2533 DRW_DBG("\nHeader CRC: ")DRW_dbg::dbg("\nHeader CRC: "); DRW_DBGH(buf->getRawShort16())DRW_dbg::dbgH(buf->getRawShort16());
2534 DRW_DBG("\nbuf position: ")DRW_dbg::dbg("\nbuf position: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2535 DRW_DBG("\ndwg header end sentinel= ")DRW_dbg::dbg("\ndwg header end sentinel= ");
2536 for (int i=0; i<16;i++) {
2537 DRW_DBGH(buf->getRawChar8())DRW_dbg::dbgH(buf->getRawChar8()); DRW_DBG(" ")DRW_dbg::dbg(" ");
2538 }
2539
2540 //temporary code to show header end sentinel
2541 std::uint64_t sz= buf->size()-1;
Value stored to 'sz' during its initialization is never read
2542 if (version < DRW::AC1018) {//pre 2004
2543 sz= buf->size()-16;
2544 buf->setPosition(sz);
2545 DRW_DBG("\nsetting position to: ")DRW_dbg::dbg("\nsetting position to: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2546 DRW_DBG("\ndwg header end sentinel= ")DRW_dbg::dbg("\ndwg header end sentinel= ");
2547 for (int i=0; i<16;i++) {
2548 DRW_DBGH(buf->getRawChar8())DRW_dbg::dbgH(buf->getRawChar8()); DRW_DBG(" ")DRW_dbg::dbg(" ");
2549 }
2550 } else if (version == DRW::AC1018) {//2004
2551// sz= buf->size()-132;
2552// buf->setPosition(sz);
2553 buf->moveBitPos(-128);
2554 DRW_DBG("\nsetting position to: ")DRW_dbg::dbg("\nsetting position to: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2555 DRW_DBG("\ndwg header end sentinel= ")DRW_dbg::dbg("\ndwg header end sentinel= ");
2556 for (int i=0; i<16;i++) {
2557 DRW_DBGH(buf->getRawChar8())DRW_dbg::dbgH(buf->getRawChar8()); DRW_DBG(" ")DRW_dbg::dbg(" ");
2558 }
2559 } else if (version == DRW::AC1021) {//2007
2560 sz= buf->size()-16;
2561 buf->setPosition(sz);
2562 DRW_DBG("\nsetting position to: ")DRW_dbg::dbg("\nsetting position to: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2563 DRW_DBG("\ndwg header end sentinel= ")DRW_dbg::dbg("\ndwg header end sentinel= ");
2564 for (int i=0; i<16;i++) {
2565 DRW_DBGH(buf->getRawChar8())DRW_dbg::dbgH(buf->getRawChar8()); DRW_DBG(" ")DRW_dbg::dbg(" ");
2566 }
2567 } else if (version == DRW::AC1024) {//2010
2568// sz= buf->size()-93;
2569// buf->setPosition(sz);
2570 buf->moveBitPos(-128);
2571 DRW_DBG("\nsetting position to: ")DRW_dbg::dbg("\nsetting position to: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2572 DRW_DBG("\ndwg header end sentinel= ")DRW_dbg::dbg("\ndwg header end sentinel= ");
2573 for (int i=0; i<16;i++) {
2574 DRW_DBGH(buf->getRawChar8())DRW_dbg::dbgH(buf->getRawChar8()); DRW_DBG(" ")DRW_dbg::dbg(" ");
2575 }
2576 } else if (version == DRW::AC1027 || version == DRW::AC1032) {//2013+
2577// sz= buf->size()-76;
2578// buf->setPosition(sz);
2579 buf->moveBitPos(-128);
2580 DRW_DBG("\nsetting position to: ")DRW_dbg::dbg("\nsetting position to: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2581 DRW_DBG("\ndwg header end sentinel= ")DRW_dbg::dbg("\ndwg header end sentinel= ");
2582 for (int i=0; i<16;i++) {
2583 DRW_DBGH(buf->getRawChar8())DRW_dbg::dbgH(buf->getRawChar8()); DRW_DBG(" ")DRW_dbg::dbg(" ");
2584 }
2585 }
2586
2587 return result;
2588}
2589
2590// ---------------------------------------------------------------------------
2591// DRW_Header::encodeDwg — Phase 3a (drafted 2026-05-14)
2592// ---------------------------------------------------------------------------
2593// Inverse of parseDwg. Emits the bit-packed HEADER section body for R2000
2594// (AC1015). The caller (dwgWriter15::writeDwgHeader) has already emitted
2595// the 16-byte begin sentinel + 4-byte RL section-size placeholder; this
2596// function appends the variable stream starting right after them. The
2597// caller appends the 16-byte end sentinel + 2-byte CRC16 LE after we return
2598// and back-patches the size placeholder.
2599//
2600// For R2000 the handle stream is INLINE with the data stream — buf and
2601// hBbuf are the same accumulator. Future versions will diverge.
2602//
2603// Order of emission must match parseDwg EXACTLY. See deep-review notes
2604// in /Users/dli/.claude/plans/dwg-write-phase3-tables-objects.md for the
2605// 13-handle control-handle block and the conditional layout.
2606
2607namespace {
2608 /// Look up a header var tolerant of either naming convention.
2609 /// DWG-side parseDwg stores bare keys ("LUPREC"); DXF-side parseCode and
2610 /// the app's writeHeader push $-prefixed keys ("$LUPREC"). This helper
2611 /// tries the caller-supplied key first (preserving bare-on-both DWG
2612 /// round-trip semantics), then falls back to the alternate form so the
2613 /// DXF -> DWG export path (where vars were filled with $NAME keys) finds
2614 /// the values instead of emitting encoder defaults. Centralizing the
2615 /// fallback here keeps the DXF reader/writer surfaces untouched.
2616 auto findVar(const DRW_Header& hdr, const std::string& name) {
2617 auto it = hdr.vars.find(name);
2618 if (it != hdr.vars.end()) return it;
2619 if (!name.empty() && name.front() == '$') {
2620 return hdr.vars.find(name.substr(1));
2621 }
2622 return hdr.vars.find(std::string{"$"} + name);
2623 }
2624 /// Look up a 1-bit boolean var in DRW_Header::vars; default 0.
2625 std::uint8_t boolVar(const DRW_Header& hdr, const std::string& name) {
2626 auto it = findVar(hdr, name);
2627 if (it == hdr.vars.end() || !it->second) return 0;
2628 return static_cast<std::uint8_t>(it->second->i_val() & 1);
2629 }
2630 /// Look up a BS/BL int var; default 0 (or caller-supplied default).
2631 std::int32_t intVar(const DRW_Header& hdr, const std::string& name, std::int32_t def = 0) {
2632 auto it = findVar(hdr, name);
2633 if (it == hdr.vars.end() || !it->second) return def;
2634 return it->second->i_val();
2635 }
2636 /// Look up a BD float var; default 0.0 (or caller-supplied).
2637 double dblVar(const DRW_Header& hdr, const std::string& name, double def = 0.0) {
2638 auto it = findVar(hdr, name);
2639 if (it == hdr.vars.end() || !it->second) return def;
2640 return it->second->d_val();
2641 }
2642 /// Look up a 3BD coord var; default {0,0,0}.
2643 DRW_Coord coordVar(const DRW_Header& hdr, const std::string& name) {
2644 auto it = findVar(hdr, name);
2645 if (it == hdr.vars.end() || !it->second
2646 || it->second->type() != DRW_Variant::COORD
2647 || it->second->coord() == nullptr) {
2648 return {0.0, 0.0, 0.0};
2649 }
2650 return *it->second->coord();
2651 }
2652 /// Look up a TV string var; default empty.
2653 UTF8STRINGstd::string strVar(const DRW_Header& hdr, const std::string& name) {
2654 auto it = findVar(hdr, name);
2655 if (it == hdr.vars.end() || !it->second
2656 || it->second->type() != DRW_Variant::STRING) {
2657 return {};
2658 }
2659 return UTF8STRINGstd::string(it->second->c_str());
2660 }
2661 /// Build a hard-pointer handle (code 4) referring to `ref`. Returns
2662 /// the null handle when ref==0, which matches what parseDwg sees in
2663 /// an empty document.
2664 dwgHandle makeHardPtr(std::uint32_t ref) {
2665 dwgHandle h;
2666 h.code = (ref == 0) ? 0 : 4;
2667 h.ref = ref;
2668 h.size = 0;
2669 if (ref != 0) {
2670 std::uint32_t t = ref;
2671 while (t != 0) { t >>= 8; ++h.size; }
2672 }
2673 return h;
2674 }
2675 /// Build a soft-owner handle (code 3) — used for the XDic-style
2676 /// owner references in the HEADER's control-handle block.
2677 dwgHandle makeSoftOwner(std::uint32_t ref) {
2678 dwgHandle h;
2679 h.code = (ref == 0) ? 0 : 3;
2680 h.ref = ref;
2681 h.size = 0;
2682 if (ref != 0) {
2683 std::uint32_t t = ref;
2684 while (t != 0) { t >>= 8; ++h.size; }
2685 }
2686 return h;
2687 }
2688 /// Decompose a stored double (TDCREATE-style "day.msec_fraction") back
2689 /// into the two BLs parseDwg reads. Inverse of:
2690 /// day = getBitLong(); msec = getBitLong();
2691 /// while (msec >= 1) msec /= 10;
2692 /// stored = day + msec;
2693 /// For an empty header (stored == 0.0) the result is (0, 0). Real
2694 /// fixture defaults still round-trip exactly because msec is always
2695 /// represented as fractional part * 10^k for some k.
2696 void splitTimeVar(double stored, std::int32_t& day, std::int32_t& msecOut) {
2697 day = static_cast<std::int32_t>(stored);
2698 double frac = stored - static_cast<double>(day);
2699 if (frac == 0.0) { msecOut = 0; return; }
2700 // Reverse the divide-by-10 loop: multiply by 10 until the result
2701 // is integer (the original msec value). Cap at 10 iterations to
2702 // avoid pathological FP cases.
2703 for (int i = 0; i < 10; ++i) {
2704 frac *= 10.0;
2705 double rounded = std::round(frac);
2706 if (std::abs(frac - rounded) < 1e-9 && rounded != 0.0) {
2707 msecOut = static_cast<std::int32_t>(rounded);
2708 return;
2709 }
2710 }
2711 msecOut = static_cast<std::int32_t>(std::round(frac));
2712 }
2713} // namespace
2714
2715bool DRW_Header::encodeDwg(DRW::Version version, dwgBufferW *buf, dwgBufferW *hBbuf,
2716 dwgBufferW *strBuf) {
2717 if (version != DRW::AC1015 && version != DRW::AC1018 &&
2718 version != DRW::AC1024 && version != DRW::AC1027 &&
2719 version != DRW::AC1032) return false;
2720
2721 // -------- REQUIREDVERSIONS (parseDwg:1786-1789) -------------------------
2722 if (version > DRW::AC1024) {
2723 buf->putBitLongLong(0); // REQUIREDVERSIONS (AC1027+)
2724 }
2725
2726 // -------- Unknown 4 BDs (parseDwg:1789-1792) ----------------------------
2727 buf->putBitDouble(0.0);
2728 buf->putBitDouble(0.0);
2729 buf->putBitDouble(0.0);
2730 buf->putBitDouble(0.0);
2731
2732 // -------- 4 CP8 string unknowns (parseDwg:1793-1798) --------------------
2733 // Gated on `version < AC1021` (2007-). R2000/R2004 hits this branch.
2734 if (version < DRW::AC1021) {
2735 buf->putCP8Text(std::string());
2736 buf->putCP8Text(std::string());
2737 buf->putCP8Text(std::string());
2738 buf->putCP8Text(std::string());
2739 }
2740
2741 // -------- Unknown longs (parseDwg:1799-1800) ----------------------------
2742 // parseDwg comments call these "Unknown long1 (24L)" and "(0L)". Real
2743 // R2000 files have 24 and 0 respectively.
2744 buf->putBitLong(24);
2745 buf->putBitLong(0);
2746
2747 // -------- Current-view handle (parseDwg:1804-1807) ----------------------
2748 // R2000 and earlier only (parseDwg skips this for AC1018+).
2749 if (version < DRW::AC1018) {
2750 hBbuf->putHandle(makeHardPtr(0));
2751 }
2752
2753 // -------- 9 single-bit vars (parseDwg:1808-1819; R2000-relevant set) ----
2754 buf->putBit(boolVar(*this, "DIMASO"));
2755 buf->putBit(boolVar(*this, "DIMSHO"));
2756 buf->putBit(boolVar(*this, "PLINEGEN"));
2757 buf->putBit(boolVar(*this, "ORTHOMODE"));
2758 buf->putBit(boolVar(*this, "REGENMODE"));
2759 buf->putBit(boolVar(*this, "FILLMODE"));
2760 buf->putBit(boolVar(*this, "QTEXTMODE"));
2761 buf->putBit(boolVar(*this, "PSLTSCALE"));
2762 buf->putBit(boolVar(*this, "LIMCHECK"));
2763 if (version > DRW::AC1015) { // R2004+: undocumented bit (parseDwg:1824-1826)
2764 buf->putBit(0);
2765 }
2766
2767 // -------- 11 more single-bit vars (parseDwg:1827-1847) ------------------
2768 buf->putBit(boolVar(*this, "USRTIMER"));
2769 buf->putBit(boolVar(*this, "SKPOLY"));
2770 buf->putBit(boolVar(*this, "ANGDIR"));
2771 buf->putBit(boolVar(*this, "SPLFRAME"));
2772 buf->putBit(boolVar(*this, "MIRRTEXT"));
2773 buf->putBit(boolVar(*this, "WORLDVIEW"));
2774 buf->putBit(boolVar(*this, "TILEMODE"));
2775 buf->putBit(boolVar(*this, "PLIMCHECK"));
2776 buf->putBit(boolVar(*this, "VISRETAIN"));
2777 buf->putBit(boolVar(*this, "DISPSILH"));
2778 buf->putBit(boolVar(*this, "PELLIPSE"));
2779
2780 // -------- PROXIGRAPHICS through PDMODE (parseDwg:1845-1861) -------------
2781 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "PROXIGRAPHICS", 1)));
2782 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "TREEDEPTH", 3020)));
2783 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "LUNITS", 2)));
2784 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "LUPREC", 4)));
2785 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "AUNITS", 0)));
2786 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "AUPREC", 0)));
2787 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "ATTMODE", 1)));
2788 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "PDMODE", 0)));
2789 if (version > DRW::AC1015) { // R2004+: 3 unknown BLs (parseDwg:1868-1872)
2790 buf->putBitLong(0);
2791 buf->putBitLong(0);
2792 buf->putBitLong(0);
2793 }
2794
2795 // -------- USERI1..5 + spline/surface family (parseDwg:1873-1888) --------
2796 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "USERI1")));
2797 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "USERI2")));
2798 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "USERI3")));
2799 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "USERI4")));
2800 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "USERI5")));
2801 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "SPLINESEGS", 8)));
2802 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "SURFU", 6)));
2803 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "SURFV", 6)));
2804 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "SURFTYPE", 6)));
2805 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "SURFTAB1", 6)));
2806 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "SURFTAB2", 6)));
2807 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "SPLINETYPE", 6)));
2808 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "SHADEDGE", 3)));
2809 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "SHADEDIF", 70)));
2810 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "UNITMODE")));
2811 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "MAXACTVP", 64)));
2812 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "ISOLINES", 4)));
2813 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "CMLJUST")));
2814 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "TEXTQLTY", 50)));
2815
2816 // -------- LTSCALE through CELTSCALE (parseDwg:1889-1909) ----------------
2817 buf->putBitDouble(dblVar(*this, "LTSCALE", 1.0));
2818 buf->putBitDouble(dblVar(*this, "TEXTSIZE", 2.5));
2819 buf->putBitDouble(dblVar(*this, "TRACEWID", 1.0));
2820 buf->putBitDouble(dblVar(*this, "SKETCHINC", 1.0));
2821 buf->putBitDouble(dblVar(*this, "FILLETRAD", 0.0));
2822 buf->putBitDouble(dblVar(*this, "THICKNESS", 0.0));
2823 buf->putBitDouble(dblVar(*this, "ANGBASE", 0.0));
2824 buf->putBitDouble(dblVar(*this, "PDSIZE", 0.0));
2825 buf->putBitDouble(dblVar(*this, "PLINEWID", 0.0));
2826 buf->putBitDouble(dblVar(*this, "USERR1", 0.0));
2827 buf->putBitDouble(dblVar(*this, "USERR2", 0.0));
2828 buf->putBitDouble(dblVar(*this, "USERR3", 0.0));
2829 buf->putBitDouble(dblVar(*this, "USERR4", 0.0));
2830 buf->putBitDouble(dblVar(*this, "USERR5", 0.0));
2831 buf->putBitDouble(dblVar(*this, "CHAMFERA", 0.0));
2832 buf->putBitDouble(dblVar(*this, "CHAMFERB", 0.0));
2833 buf->putBitDouble(dblVar(*this, "CHAMFERC", 0.0));
2834 buf->putBitDouble(dblVar(*this, "CHAMFERD", 0.0));
2835 buf->putBitDouble(dblVar(*this, "FACETRES", 0.5));
2836 buf->putBitDouble(dblVar(*this, "CMLSCALE", 1.0));
2837 buf->putBitDouble(dblVar(*this, "CELTSCALE", 1.0));
2838
2839 // -------- MENU string (gated version < AC1021) --------------------------
2840 if (version < DRW::AC1021) {
2841 buf->putCP8Text(strVar(*this, "MENU"));
2842 }
2843
2844 // -------- TDCREATE / TDUPDATE / TDINDWG / TDUSRTIMER (4 pairs of BLs) ---
2845 {
2846 std::int32_t day, msec;
2847 splitTimeVar(dblVar(*this, "TDCREATE"), day, msec);
2848 buf->putBitLong(day);
2849 buf->putBitLong(msec);
2850 }
2851 {
2852 std::int32_t day, msec;
2853 splitTimeVar(dblVar(*this, "TDUPDATE"), day, msec);
2854 buf->putBitLong(day);
2855 buf->putBitLong(msec);
2856 }
2857 if (version > DRW::AC1015) { // R2004+: 3 unknown BLs (parseDwg:1931-1935)
2858 buf->putBitLong(0);
2859 buf->putBitLong(0);
2860 buf->putBitLong(0);
2861 }
2862 {
2863 std::int32_t day, msec;
2864 splitTimeVar(dblVar(*this, "TDINDWG"), day, msec);
2865 buf->putBitLong(day);
2866 buf->putBitLong(msec);
2867 }
2868 {
2869 std::int32_t day, msec;
2870 splitTimeVar(dblVar(*this, "TDUSRTIMER"), day, msec);
2871 buf->putBitLong(day);
2872 buf->putBitLong(msec);
2873 }
2874
2875 // -------- CECOLOR + first handle block (parseDwg:1947-1963) -------------
2876 buf->putCmColor(version, static_cast<std::uint16_t>(intVar(*this, "CECOLOR", 256)));
2877 // HANDSEED — emitted into the DATA stream (`buf`), not hBbuf.
2878 // Stored in DRW_Header::handSeed (set by parseDwg on read; settable
2879 // by the writer caller from the HandleAllocator's high-water mark
2880 // for fresh documents). A zero value emits as a null handle —
2881 // libdxfrw round-trip tolerates it, but AutoCAD will refresh
2882 // HANDSEED to `max(handle)+1` on first save and mark the file
2883 // modified. See Risk 4j.
2884 buf->putHandle(makeHardPtr(handSeed));
2885 // The following 5 handles emit to the HANDLE stream. For R2000 the
2886 // handle stream is inline (buf == hBbuf in our usage).
2887 hBbuf->putHandle(makeHardPtr(0)); // CLAYER
2888 hBbuf->putHandle(makeHardPtr(0)); // TEXTSTYLE
2889 hBbuf->putHandle(makeHardPtr(0)); // CELTYPE
2890 if (version > DRW::AC1018) { // 2007+: CMATERIAL (parseDwg:1960-1963)
2891 hBbuf->putHandle(makeHardPtr(0));
2892 }
2893 hBbuf->putHandle(makeHardPtr(0)); // DIMSTYLE
2894 hBbuf->putHandle(makeHardPtr(0)); // CMLSTYLE
2895
2896 // -------- Paper-space view block (parseDwg:1965-1989) -------------------
2897 buf->putBitDouble(dblVar(*this, "PSVPSCALE", 1.0));
2898 buf->put3BitDouble(coordVar(*this, "PINSBASE"));
2899 buf->put3BitDouble(coordVar(*this, "PEXTMIN"));
2900 buf->put3BitDouble(coordVar(*this, "PEXTMAX"));
2901 buf->put2RawDouble(coordVar(*this, "PLIMMIN"));
2902 buf->put2RawDouble(coordVar(*this, "PLIMMAX"));
2903 buf->putBitDouble(dblVar(*this, "PELEVATION"));
2904 buf->put3BitDouble(coordVar(*this, "PUCSORG"));
2905 buf->put3BitDouble(coordVar(*this, "PUCSXDIR"));
2906 buf->put3BitDouble(coordVar(*this, "PUCSYDIR"));
2907 hBbuf->putHandle(makeHardPtr(0)); // PUCSNAME
2908 hBbuf->putHandle(makeHardPtr(0)); // PUCSORTHOREF
2909 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "PUCSORTHOVIEW")));
2910 hBbuf->putHandle(makeHardPtr(0)); // PUCSBASE
2911 buf->put3BitDouble(coordVar(*this, "PUCSORGTOP"));
2912 buf->put3BitDouble(coordVar(*this, "PUCSORGBOTTOM"));
2913 buf->put3BitDouble(coordVar(*this, "PUCSORGLEFT"));
2914 buf->put3BitDouble(coordVar(*this, "PUCSORGRIGHT"));
2915 buf->put3BitDouble(coordVar(*this, "PUCSORGFRONT"));
2916 buf->put3BitDouble(coordVar(*this, "PUCSORGBACK"));
2917
2918 // -------- Model-space view block (parseDwg:1991-2018) -------------------
2919 buf->put3BitDouble(coordVar(*this, "INSBASE"));
2920 buf->put3BitDouble(coordVar(*this, "EXTMIN"));
2921 buf->put3BitDouble(coordVar(*this, "EXTMAX"));
2922 buf->put2RawDouble(coordVar(*this, "LIMMIN"));
2923 buf->put2RawDouble(coordVar(*this, "LIMMAX"));
2924 buf->putBitDouble(dblVar(*this, "ELEVATION"));
2925 buf->put3BitDouble(coordVar(*this, "UCSORG"));
2926 buf->put3BitDouble(coordVar(*this, "UCSXDIR"));
2927 buf->put3BitDouble(coordVar(*this, "UCSYDIR"));
2928 hBbuf->putHandle(makeHardPtr(0)); // UCSNAME
2929 hBbuf->putHandle(makeHardPtr(0)); // UCSORTHOREF
2930 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "UCSORTHOVIEW")));
2931 hBbuf->putHandle(makeHardPtr(0)); // UCSBASE
2932 buf->put3BitDouble(coordVar(*this, "UCSORGTOP"));
2933 buf->put3BitDouble(coordVar(*this, "UCSORGBOTTOM"));
2934 buf->put3BitDouble(coordVar(*this, "UCSORGLEFT"));
2935 buf->put3BitDouble(coordVar(*this, "UCSORGRIGHT"));
2936 buf->put3BitDouble(coordVar(*this, "UCSORGFRONT"));
2937 buf->put3BitDouble(coordVar(*this, "UCSORGBACK"));
2938 if (version < DRW::AC1021) { // gated: DIMPOST/DIMAPOST as CP8 strings (parseDwg:2019-2022)
2939 buf->putCP8Text(strVar(*this, "DIMPOST"));
2940 buf->putCP8Text(strVar(*this, "DIMAPOST"));
2941 }
2942
2943 // -------- DIM* values for R2000 (parseDwg:2053-2129; R14 branch dropped)
2944 buf->putBitDouble(dblVar(*this, "DIMSCALE", 1.0));
2945 buf->putBitDouble(dblVar(*this, "DIMASZ", 0.18));
2946 buf->putBitDouble(dblVar(*this, "DIMEXO", 0.0625));
2947 buf->putBitDouble(dblVar(*this, "DIMDLI", 0.38));
2948 buf->putBitDouble(dblVar(*this, "DIMEXE", 0.18));
2949 buf->putBitDouble(dblVar(*this, "DIMRND", 0.0));
2950 buf->putBitDouble(dblVar(*this, "DIMDLE", 0.0));
2951 buf->putBitDouble(dblVar(*this, "DIMTP", 0.0));
2952 buf->putBitDouble(dblVar(*this, "DIMTM", 0.0));
2953 if (version > DRW::AC1018) { // 2007+: DIMFXL, DIMJOGANG, DIMTFILL, DIMTFILLCLR (parseDwg:2066-2070)
2954 buf->putBitDouble(dblVar(*this, "DIMFXL", 1.0));
2955 buf->putBitDouble(dblVar(*this, "DIMJOGANG", 0.0));
2956 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMTFILL")));
2957 buf->putCmColor(version, static_cast<std::uint16_t>(intVar(*this, "DIMTFILLCLR")));
2958 }
2959 // R2000+: 6 bits then 3 BS
2960 buf->putBit(boolVar(*this, "DIMTOL"));
2961 buf->putBit(boolVar(*this, "DIMLIM"));
2962 buf->putBit(boolVar(*this, "DIMTIH"));
2963 buf->putBit(boolVar(*this, "DIMTOH"));
2964 buf->putBit(boolVar(*this, "DIMSE1"));
2965 buf->putBit(boolVar(*this, "DIMSE2"));
2966 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMTAD")));
2967 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMZIN")));
2968 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMAZIN")));
2969 if (version > DRW::AC1018) { // 2007+: DIMARCSYM (parseDwg:2083-2085)
2970 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMARCSYM")));
2971 }
2972 buf->putBitDouble(dblVar(*this, "DIMTXT", 0.18));
2973 buf->putBitDouble(dblVar(*this, "DIMCEN", 0.09));
2974 buf->putBitDouble(dblVar(*this, "DIMTSZ", 0.0));
2975 buf->putBitDouble(dblVar(*this, "DIMALTF", 25.4));
2976 buf->putBitDouble(dblVar(*this, "DIMLFAC", 1.0));
2977 buf->putBitDouble(dblVar(*this, "DIMTVP", 0.0));
2978 buf->putBitDouble(dblVar(*this, "DIMTFAC", 1.0));
2979 buf->putBitDouble(dblVar(*this, "DIMGAP", 0.09));
2980 // R2000+: DIMALTRND + 5 more DIM bits
2981 buf->putBitDouble(dblVar(*this, "DIMALTRND", 0.0));
2982 buf->putBit(boolVar(*this, "DIMALT"));
2983 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMALTD", 2)));
2984 buf->putBit(boolVar(*this, "DIMTOFL"));
2985 buf->putBit(boolVar(*this, "DIMSAH"));
2986 buf->putBit(boolVar(*this, "DIMTIX"));
2987 buf->putBit(boolVar(*this, "DIMSOXD"));
2988 // 3 CMC colors
2989 buf->putCmColor(version, static_cast<std::uint16_t>(intVar(*this, "DIMCLRD")));
2990 buf->putCmColor(version, static_cast<std::uint16_t>(intVar(*this, "DIMCLRE")));
2991 buf->putCmColor(version, static_cast<std::uint16_t>(intVar(*this, "DIMCLRT")));
2992 // R2000+ DIM BS family
2993 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMADEC")));
2994 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMDEC", 4)));
2995 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMTDEC", 4)));
2996 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMALTU", 2)));
2997 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMALTTD", 2)));
2998 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMAUNIT")));
2999 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMFRAC")));
3000 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMLUNIT", 2)));
3001 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMDSEP", '.')));
3002 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMTMOVE")));
3003 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMJUST")));
3004 buf->putBit(boolVar(*this, "DIMSD1"));
3005 buf->putBit(boolVar(*this, "DIMSD2"));
3006 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMTOLJ", 1)));
3007 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMTZIN")));
3008 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMALTZ")));
3009 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMALTTZ")));
3010 buf->putBit(boolVar(*this, "DIMUPT"));
3011 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMATFIT", 3)));
3012 if (version > DRW::AC1018) { // 2007+: DIMFXLON (parseDwg:2134-2136)
3013 buf->putBit(boolVar(*this, "DIMFXLON"));
3014 }
3015 if (version > DRW::AC1021) { // 2010+: DIMTXTDIRECTION, DIMALTMZF, DIMMZF (parseDwg:2137-2141)
3016 buf->putBit(boolVar(*this, "DIMTXTDIRECTION"));
3017 buf->putBitDouble(dblVar(*this, "DIMALTMZF", 1.0));
3018 buf->putBitDouble(dblVar(*this, "DIMMZF", 1.0));
3019 }
3020
3021 // -------- DIM handles (R2000+: 5 handles) (parseDwg:2139-2148) ----------
3022 hBbuf->putHandle(makeHardPtr(0)); // DIMTXSTY
3023 hBbuf->putHandle(makeHardPtr(0)); // DIMLDRBLK
3024 hBbuf->putHandle(makeHardPtr(0)); // DIMBLK
3025 hBbuf->putHandle(makeHardPtr(0)); // DIMBLK1
3026 hBbuf->putHandle(makeHardPtr(0)); // DIMBLK2
3027 if (version > DRW::AC1018) { // 2007+: DIMLTYPE, DIMLTEX1, DIMLTEX2 (parseDwg:2154-2160)
3028 hBbuf->putHandle(makeHardPtr(0)); // DIMLTYPE
3029 hBbuf->putHandle(makeHardPtr(0)); // DIMLTEX1
3030 hBbuf->putHandle(makeHardPtr(0)); // DIMLTEX2
3031 }
3032
3033 // -------- DIMLWD, DIMLWE (R2000+: 2 BS) (parseDwg:2159-2160) ------------
3034 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMLWD", -2)));
3035 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMLWE", -2)));
3036
3037 // -------- Control-handle block (parseDwg:2162-2199, 12 or 13 handles) ---------
3038 // vpEntHeaderCtrl is R2000 and earlier only (parseDwg skips it for AC1018+).
3039 hBbuf->putHandle(makeHardPtr(blockCtrl)); // BLOCK_CONTROL (0x01)
3040 hBbuf->putHandle(makeHardPtr(layerCtrl)); // LAYER_CONTROL (0x02)
3041 hBbuf->putHandle(makeHardPtr(styleCtrl)); // STYLE_CONTROL (0x03)
3042 hBbuf->putHandle(makeHardPtr(linetypeCtrl)); // LTYPE_CONTROL (0x05)
3043 hBbuf->putHandle(makeHardPtr(viewCtrl)); // VIEW_CONTROL (0x06)
3044 hBbuf->putHandle(makeHardPtr(ucsCtrl)); // UCS_CONTROL (0x07)
3045 hBbuf->putHandle(makeHardPtr(vportCtrl)); // VPORT_CONTROL (0x08)
3046 hBbuf->putHandle(makeHardPtr(appidCtrl)); // APPID_CONTROL (0x09)
3047 hBbuf->putHandle(makeHardPtr(dimstyleCtrl)); // DIMSTYLE_CONTROL (0x0A)
3048 if (version < DRW::AC1018) { // R2000 and earlier only
3049 hBbuf->putHandle(makeHardPtr(vpEntHeaderCtrl)); // VPORT_ENTITY_HEADER_CONTROL (0x0B)
3050 }
3051 hBbuf->putHandle(makeSoftOwner(0)); // DICT ACAD_GROUP (Phase 3.5: 0x0D)
3052 hBbuf->putHandle(makeSoftOwner(0)); // DICT ACAD_MLINESTYLE (Phase 3.5: 0x0E)
3053 hBbuf->putHandle(makeSoftOwner(0)); // DICT NAMED OBJS (Phase 3.5: 0x0C)
3054
3055 // -------- Post-control TSTACKALIGN/TSTACKSIZE + 3 NOD-related dict handles
3056 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "TSTACKALIGN", 1)));
3057 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "TSTACKSIZE", 70)));
3058 if (version < DRW::AC1021) { // gated (parseDwg:2208-2211)
3059 buf->putCP8Text(strVar(*this, "HYPERLINKBASE"));
3060 buf->putCP8Text(strVar(*this, "STYLESHEET"));
3061 }
3062 hBbuf->putHandle(makeSoftOwner(0)); // DICT LAYOUTS (Phase 3.5)
3063 hBbuf->putHandle(makeSoftOwner(0)); // DICT PLOTSETTINGS (Phase 3.5)
3064 hBbuf->putHandle(makeSoftOwner(0)); // DICT PLOTSTYLES (Phase 3.5)
3065 if (version > DRW::AC1015) { // R2004+: 2 extra dict handles (parseDwg:2219-2223)
3066 hBbuf->putHandle(makeSoftOwner(0)); // DICT MATERIALS
3067 hBbuf->putHandle(makeSoftOwner(0)); // DICT COLORS
3068 }
3069 if (version > DRW::AC1018) { // 2007+: DICT VISUALSTYLE (parseDwg:2225-2228)
3070 hBbuf->putHandle(makeSoftOwner(0)); // DICT VISUALSTYLE
3071 }
3072 if (version > DRW::AC1024) { // 2013+: unknown handle (parseDwg:2229-2232)
3073 hBbuf->putHandle(makeSoftOwner(0));
3074 }
3075
3076 // -------- Flags (BL) + INSUNITS (BS) + CEPSNTYPE (BS) -------------------
3077 buf->putBitLong(0); // Flags — 8 sub-fields per parseDwg comment; defaults to 0
3078 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "INSUNITS")));
3079 std::uint16_t cepsntype = static_cast<std::uint16_t>(intVar(*this, "CEPSNTYPE"));
3080 buf->putBitShort(cepsntype);
3081 if (cepsntype == 3) {
3082 hBbuf->putHandle(makeHardPtr(0)); // CPSNID
3083 }
3084 if (version < DRW::AC1021) { // gated (parseDwg:2242-2245)
3085 buf->putCP8Text(strVar(*this, "FINGERPRINTGUID"));
3086 buf->putCP8Text(strVar(*this, "VERSIONGUID"));
3087 }
3088
3089 // -------- R2004+ RC/BS vars (parseDwg:2247-2261, version > AC1015) -------
3090 if (version > DRW::AC1015) {
3091 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "SORTENTS")));
3092 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "INDEXCTL")));
3093 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "HIDETEXT")));
3094 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "XCLIPFRAME")));
3095 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "DIMASSOC")));
3096 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "HALOGAP")));
3097 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "OBSCUREDCOLOR")));
3098 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "INTERSECTIONCOLOR")));
3099 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "OBSCUREDLTYPE")));
3100 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "INTERSECTIONDISPLAY")));
3101 if (version < DRW::AC1021) { // R2004 only (not R2007+)
3102 buf->putCP8Text(strVar(*this, "PROJECTNAME"));
3103 }
3104 }
3105
3106 // -------- 5 reserved-block handles (parseDwg:2262-2271) -----------------
3107 // PAPER_SPACE, MODEL_SPACE block headers + BYLAYER, BYBLOCK, CONTINUOUS
3108 // linetype records. Reserved handles 0x18, 0x17, 0x10, 0x0F, 0x11.
3109 hBbuf->putHandle(makeHardPtr(0x18)); // BLOCK PAPER_SPACE
3110 hBbuf->putHandle(makeHardPtr(0x17)); // BLOCK MODEL_SPACE
3111 hBbuf->putHandle(makeHardPtr(0x10)); // LTYPE BYLAYER
3112 hBbuf->putHandle(makeHardPtr(0x0F)); // LTYPE BYBLOCK
3113 hBbuf->putHandle(makeHardPtr(0x11)); // LTYPE CONTINUOUS
3114
3115 // -------- R2007+ extra vars (parseDwg:2272-2310, version > AC1018) -------
3116 if (version > DRW::AC1018) {
3117 buf->putBit(boolVar(*this, "CAMERADISPLAY"));
3118 buf->putBitLong(0); // unknown BL 1
3119 buf->putBitLong(0); // unknown BL 2
3120 buf->putBitDouble(0.0); // unknown BD
3121 buf->putBitDouble(dblVar(*this, "STEPSPERSEC", 2.0));
3122 buf->putBitDouble(dblVar(*this, "STEPSIZE", 6.0));
3123 buf->putBitDouble(dblVar(*this, "3DDWFPREC", 2.0));
3124 buf->putBitDouble(dblVar(*this, "LENSLENGTH", 50.0));
3125 buf->putBitDouble(dblVar(*this, "CAMERAHEIGHT", 0.0));
3126 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "SOLIDHIST", 1)));
3127 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "SHOWHIST", 1)));
3128 buf->putBitDouble(dblVar(*this, "PSOLWIDTH", 5.0));
3129 buf->putBitDouble(dblVar(*this, "PSOLHEIGHT", 80.0));
3130 buf->putBitDouble(dblVar(*this, "LOFTANG1", 1.5707963)); // pi/2
3131 buf->putBitDouble(dblVar(*this, "LOFTANG2", 1.5707963));
3132 buf->putBitDouble(dblVar(*this, "LOFTMAG1", 0.0));
3133 buf->putBitDouble(dblVar(*this, "LOFTMAG2", 0.0));
3134 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "LOFTPARAM", 7)));
3135 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "LOFTNORMALS", 1)));
3136 buf->putBitDouble(dblVar(*this, "LATITUDE", 37.7950));
3137 buf->putBitDouble(dblVar(*this, "LONGITUDE", -122.394));
3138 buf->putBitDouble(dblVar(*this, "NORTHDIRECTION", 0.0));
3139 buf->putBitLong(static_cast<std::int32_t>(intVar(*this, "TIMEZONE", -8000)));
3140 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "LIGHTGLYPHDISPLAY", 1)));
3141 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "TILEMODELIGHTSYNCH", 1)));
3142 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "DWFFRAME")));
3143 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "DGNFRAME")));
3144 buf->putBit(0); // unknown B
3145 buf->putCmColor(version, static_cast<std::uint16_t>(intVar(*this, "INTERFERECOLOR", 1)));
3146 hBbuf->putHandle(makeHardPtr(0)); // INTERFEREOBJECT VS
3147 hBbuf->putHandle(makeHardPtr(0)); // INTERFEREVPVS
3148 hBbuf->putHandle(makeHardPtr(0)); // DRAGVS
3149 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "CSHADOW")));
3150 buf->putBitDouble(0.0); // unknown BD
3151 }
3152
3153 // -------- R14+ trailing 4 BS unknowns (parseDwg:2307-2312) --------------
3154 buf->putBitShort(0);
3155 buf->putBitShort(0);
3156 buf->putBitShort(0);
3157 buf->putBitShort(0);
3158
3159 // -------- R2007+ string stream (inverse of parseDwg:2329-2372) ----------
3160 // For R2007+ every header TV/TU string lives in a separate string stream,
3161 // read consecutively in field-schema order. Collect them here in that
3162 // exact order; dwgWriter assembles the [data][strings][footer] layout and
3163 // back-patches bitSize so the reader's backward scan finds them. Pre-2007
3164 // versions emit these inline above (gated version < AC1021).
3165 if (version > DRW::AC1018 && strBuf != nullptr) {
3166 strBuf->putUCSText(std::string()); // unknown text 1
3167 strBuf->putUCSText(std::string()); // unknown text 2
3168 strBuf->putUCSText(std::string()); // unknown text 3
3169 strBuf->putUCSText(std::string()); // unknown text 4
3170 strBuf->putUCSText(strVar(*this, "MENU"));
3171 strBuf->putUCSText(strVar(*this, "DIMPOST"));
3172 strBuf->putUCSText(strVar(*this, "DIMAPOST"));
3173 if (version > DRW::AC1021) { // 2010+
3174 strBuf->putUCSText(strVar(*this, "DIMALTMZS"));
3175 strBuf->putUCSText(strVar(*this, "DIMMZS"));
3176 }
3177 strBuf->putUCSText(strVar(*this, "HYPERLINKBASE"));
3178 strBuf->putUCSText(strVar(*this, "STYLESHEET"));
3179 strBuf->putUCSText(strVar(*this, "FINGERPRINTGUID"));
3180 strBuf->putUCSText(strVar(*this, "VERSIONGUID"));
3181 strBuf->putUCSText(strVar(*this, "PROJECTNAME"));
3182 }
3183
3184 return true;
3185}
3186
3187int DRW_Header::measurement(const int unit) {
3188 switch (unit) {
3189 case Units::Inch:
3190 case Units::Foot:
3191 case Units::Mile:
3192 case Units::Microinch:
3193 case Units::Mil:
3194 case Units::Yard:
3195 return Units::English;
3196
3197 default:
3198 break;
3199 }
3200
3201 return Units::Metric;
3202}