Bug Summary

File:libraries/libdxfrw/src/drw_header.cpp
Warning:line 2529, 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-08-04-154929-5069-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 // DWG header time variables are stored as two 32-bit ints: julian day +
2046 // milliseconds since midnight UTC. DXF/DXF-API convention is the canonical
2047 // double `julianDay + msec/86_400_000.0`, so combine them with that ratio
2048 // (NOT the historic "divide by 10 until <1" loop, which produced lossy
2049 // and non-deterministic noise for any wall-clock time).
2050 // Keep kMsecPerDay inside the lambda: MSVC rejects uncaptured constexpr
2051 // locals in C++17 lambdas (error C3493).
2052 auto readJulianDate = [buf]() {
2053 constexpr double kMsecPerDay = 86400000.0;
2054 const std::int32_t day = buf->getBitLong();
2055 const std::int32_t msec = buf->getBitLong();
2056 return static_cast<double>(day) + static_cast<double>(msec) / kMsecPerDay;
2057 };
2058 vars["TDCREATE"] = new DRW_Variant(40, readJulianDate());
2059 vars["TDUPDATE"] = new DRW_Variant(40, readJulianDate());
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 vars["TDINDWG"] = new DRW_Variant(40, readJulianDate());
2066 vars["TDUSRTIMER"] = new DRW_Variant(40, readJulianDate());
2067 vars["CECOLOR"]=new DRW_Variant(62, buf->getCmColor(version));//RLZ: TODO read CMC or EMC color
2068 dwgHandle HANDSEED = buf->getHandle();//always present in data stream
2069 DRW_DBG("\nHANDSEED: ")DRW_dbg::dbg("\nHANDSEED: "); DRW_DBGHL(HANDSEED.code, HANDSEED.size, HANDSEED.ref)DRW_dbg::dbgHL(HANDSEED.code, HANDSEED.size, HANDSEED.ref);
2070 handSeed = HANDSEED.ref;
2071 dwgHandle CLAYER = hBbuf->getHandle();
2072 DRW_DBG("\nCLAYER: ")DRW_dbg::dbg("\nCLAYER: "); DRW_DBGHL(CLAYER.code, CLAYER.size, CLAYER.ref)DRW_dbg::dbgHL(CLAYER.code, CLAYER.size, CLAYER.ref);
2073 dwgHandle TEXTSTYLE = hBbuf->getHandle();
2074 DRW_DBG("\nTEXTSTYLE: ")DRW_dbg::dbg("\nTEXTSTYLE: "); DRW_DBGHL(TEXTSTYLE.code, TEXTSTYLE.size, TEXTSTYLE.ref)DRW_dbg::dbgHL(TEXTSTYLE.code, TEXTSTYLE.size, TEXTSTYLE.ref);
2075 dwgHandle CELTYPE = hBbuf->getHandle();
2076 DRW_DBG("\nCELTYPE: ")DRW_dbg::dbg("\nCELTYPE: "); DRW_DBGHL(CELTYPE.code, CELTYPE.size, CELTYPE.ref)DRW_dbg::dbgHL(CELTYPE.code, CELTYPE.size, CELTYPE.ref);
2077 if (version > DRW::AC1018) {//2007+
2078 dwgHandle CMATERIAL = hBbuf->getHandle();
2079 DRW_DBG("\nCMATERIAL: ")DRW_dbg::dbg("\nCMATERIAL: "); DRW_DBGHL(CMATERIAL.code, CMATERIAL.size, CMATERIAL.ref)DRW_dbg::dbgHL(CMATERIAL.code, CMATERIAL.size, CMATERIAL.ref);
2080 }
2081 dwgHandle DIMSTYLE = hBbuf->getHandle();
2082 DRW_DBG("\nDIMSTYLE: ")DRW_dbg::dbg("\nDIMSTYLE: "); DRW_DBGHL(DIMSTYLE.code, DIMSTYLE.size, DIMSTYLE.ref)DRW_dbg::dbgHL(DIMSTYLE.code, DIMSTYLE.size, DIMSTYLE.ref);
2083 dwgHandle CMLSTYLE = hBbuf->getHandle();
2084 DRW_DBG("\nCMLSTYLE: ")DRW_dbg::dbg("\nCMLSTYLE: "); DRW_DBGHL(CMLSTYLE.code, CMLSTYLE.size, CMLSTYLE.ref)DRW_dbg::dbgHL(CMLSTYLE.code, CMLSTYLE.size, CMLSTYLE.ref);
2085 if (version > DRW::AC1014) {//2000+
2086 vars["PSVPSCALE"]=new DRW_Variant(40, buf->getBitDouble());
2087 }
2088 vars["PINSBASE"]=new DRW_Variant(10, buf->get3BitDouble());
2089 vars["PEXTMIN"]=new DRW_Variant(10, buf->get3BitDouble());
2090 vars["PEXTMAX"]=new DRW_Variant(10, buf->get3BitDouble());
2091 vars["PLIMMIN"]=new DRW_Variant(10, buf->get2RawDouble());
2092 vars["PLIMMAX"]=new DRW_Variant(10, buf->get2RawDouble());
2093 vars["PELEVATION"]=new DRW_Variant(40, buf->getBitDouble());
2094 vars["PUCSORG"]=new DRW_Variant(10, buf->get3BitDouble());
2095 vars["PUCSXDIR"]=new DRW_Variant(10, buf->get3BitDouble());
2096 vars["PUCSYDIR"]=new DRW_Variant(10, buf->get3BitDouble());
2097 dwgHandle PUCSNAME = hBbuf->getHandle();
2098 DRW_DBG("\nPUCSNAME: ")DRW_dbg::dbg("\nPUCSNAME: "); DRW_DBGHL(PUCSNAME.code, PUCSNAME.size, PUCSNAME.ref)DRW_dbg::dbgHL(PUCSNAME.code, PUCSNAME.size, PUCSNAME.ref);
2099 if (version > DRW::AC1014) {//2000+
2100 dwgHandle PUCSORTHOREF = hBbuf->getHandle();
2101 DRW_DBG("\nPUCSORTHOREF: ")DRW_dbg::dbg("\nPUCSORTHOREF: "); DRW_DBGHL(PUCSORTHOREF.code, PUCSORTHOREF.size, PUCSORTHOREF.ref)DRW_dbg::dbgHL(PUCSORTHOREF.code, PUCSORTHOREF.size, PUCSORTHOREF
.ref)
;
2102 vars["PUCSORTHOVIEW"]=new DRW_Variant(70, buf->getBitShort());
2103 dwgHandle PUCSBASE = hBbuf->getHandle();
2104 DRW_DBG("\nPUCSBASE: ")DRW_dbg::dbg("\nPUCSBASE: "); DRW_DBGHL(PUCSBASE.code, PUCSBASE.size, PUCSBASE.ref)DRW_dbg::dbgHL(PUCSBASE.code, PUCSBASE.size, PUCSBASE.ref);
2105 vars["PUCSORGTOP"]=new DRW_Variant(10, buf->get3BitDouble());
2106 vars["PUCSORGBOTTOM"]=new DRW_Variant(10, buf->get3BitDouble());
2107 vars["PUCSORGLEFT"]=new DRW_Variant(10, buf->get3BitDouble());
2108 vars["PUCSORGRIGHT"]=new DRW_Variant(10, buf->get3BitDouble());
2109 vars["PUCSORGFRONT"]=new DRW_Variant(10, buf->get3BitDouble());
2110 vars["PUCSORGBACK"]=new DRW_Variant(10, buf->get3BitDouble());
2111 }
2112 vars["INSBASE"]=new DRW_Variant(10, buf->get3BitDouble());
2113 vars["EXTMIN"]=new DRW_Variant(10, buf->get3BitDouble());
2114 vars["EXTMAX"]=new DRW_Variant(10, buf->get3BitDouble());
2115
2116 vars["LIMMIN"]=new DRW_Variant(10, buf->get2RawDouble());
2117 vars["LIMMAX"]=new DRW_Variant(10, buf->get2RawDouble());
2118 vars["ELEVATION"]=new DRW_Variant(40, buf->getBitDouble());
2119 vars["UCSORG"]=new DRW_Variant(10, buf->get3BitDouble());
2120 vars["UCSXDIR"]=new DRW_Variant(10, buf->get3BitDouble());
2121 vars["UCSYDIR"]=new DRW_Variant(10, buf->get3BitDouble());
2122 dwgHandle UCSNAME = hBbuf->getHandle();
2123 DRW_DBG("\nUCSNAME: ")DRW_dbg::dbg("\nUCSNAME: "); DRW_DBGHL(UCSNAME.code, UCSNAME.size, UCSNAME.ref)DRW_dbg::dbgHL(UCSNAME.code, UCSNAME.size, UCSNAME.ref);
2124 if (version > DRW::AC1014) {//2000+
2125 dwgHandle UCSORTHOREF = hBbuf->getHandle();
2126 DRW_DBG("\nUCSORTHOREF: ")DRW_dbg::dbg("\nUCSORTHOREF: "); DRW_DBGHL(UCSORTHOREF.code, UCSORTHOREF.size, UCSORTHOREF.ref)DRW_dbg::dbgHL(UCSORTHOREF.code, UCSORTHOREF.size, UCSORTHOREF
.ref)
;
2127 vars["UCSORTHOVIEW"]=new DRW_Variant(70, buf->getBitShort());
2128 dwgHandle UCSBASE = hBbuf->getHandle();
2129 DRW_DBG("\nUCSBASE: ")DRW_dbg::dbg("\nUCSBASE: "); DRW_DBGHL(UCSBASE.code, UCSBASE.size, UCSBASE.ref)DRW_dbg::dbgHL(UCSBASE.code, UCSBASE.size, UCSBASE.ref);
2130 vars["UCSORGTOP"]=new DRW_Variant(10, buf->get3BitDouble());
2131 vars["UCSORGBOTTOM"]=new DRW_Variant(10, buf->get3BitDouble());
2132 vars["UCSORGLEFT"]=new DRW_Variant(10, buf->get3BitDouble());
2133 vars["UCSORGRIGHT"]=new DRW_Variant(10, buf->get3BitDouble());
2134 vars["UCSORGFRONT"]=new DRW_Variant(10, buf->get3BitDouble());
2135 vars["UCSORGBACK"]=new DRW_Variant(10, buf->get3BitDouble());
2136 if (version < DRW::AC1021) {//2004-
2137 vars["DIMPOST"]=new DRW_Variant(1, buf->getCP8Text());
2138 vars["DIMAPOST"]=new DRW_Variant(1, buf->getCP8Text());
2139 }
2140 }
2141 if (version < DRW::AC1015) {//r14-
2142 vars["DIMTOL"]=new DRW_Variant(70, buf->getBit());
2143 vars["DIMLIM"]=new DRW_Variant(70, buf->getBit());
2144 vars["DIMTIH"]=new DRW_Variant(70, buf->getBit());
2145 vars["DIMTOH"]=new DRW_Variant(70, buf->getBit());
2146 vars["DIMSE1"]=new DRW_Variant(70, buf->getBit());
2147 vars["DIMSE2"]=new DRW_Variant(70, buf->getBit());
2148 vars["DIMALT"]=new DRW_Variant(70, buf->getBit());
2149 vars["DIMTOFL"]=new DRW_Variant(70, buf->getBit());
2150 vars["DIMSAH"]=new DRW_Variant(70, buf->getBit());
2151 vars["DIMTIX"]=new DRW_Variant(70, buf->getBit());
2152 vars["DIMSOXD"]=new DRW_Variant(70, buf->getBit());
2153 vars["DIMALTD"]=new DRW_Variant(70, buf->getRawChar8());
2154 vars["DIMZIN"]=new DRW_Variant(70, buf->getRawChar8());
2155 vars["DIMSD1"]=new DRW_Variant(70, buf->getBit());
2156 vars["DIMSD2"]=new DRW_Variant(70, buf->getBit());
2157 vars["DIMTOLJ"]=new DRW_Variant(70, buf->getRawChar8());
2158 vars["DIMJUST"]=new DRW_Variant(70, buf->getRawChar8());
2159 vars["DIMFIT"]=new DRW_Variant(70, buf->getRawChar8());///////////
2160 vars["DIMUPT"]=new DRW_Variant(70, buf->getBit());
2161 vars["DIMTZIN"]=new DRW_Variant(70, buf->getRawChar8());
2162 vars["DIMALTZ"]=new DRW_Variant(70, buf->getRawChar8());
2163 vars["DIMALTTZ"]=new DRW_Variant(70, buf->getRawChar8());
2164 vars["DIMTAD"]=new DRW_Variant(70, buf->getRawChar8());
2165 vars["DIMUNIT"]=new DRW_Variant(70, buf->getBitShort());///////////
2166 vars["DIMAUNIT"]=new DRW_Variant(70, buf->getBitShort());
2167 vars["DIMDEC"]=new DRW_Variant(70, buf->getBitShort());
2168 vars["DIMTDEC"]=new DRW_Variant(70, buf->getBitShort());
2169 vars["DIMALTU"]=new DRW_Variant(70, buf->getBitShort());
2170 vars["DIMALTTD"]=new DRW_Variant(70, buf->getBitShort());
2171 dwgHandle DIMTXSTY = hBbuf->getHandle();
2172 DRW_DBG("\nDIMTXSTY: ")DRW_dbg::dbg("\nDIMTXSTY: "); DRW_DBGHL(DIMTXSTY.code, DIMTXSTY.size, DIMTXSTY.ref)DRW_dbg::dbgHL(DIMTXSTY.code, DIMTXSTY.size, DIMTXSTY.ref);
2173 }
2174 vars["DIMSCALE"]=new DRW_Variant(40, buf->getBitDouble());
2175 vars["DIMASZ"]=new DRW_Variant(40, buf->getBitDouble());
2176 vars["DIMEXO"]=new DRW_Variant(40, buf->getBitDouble());
2177 vars["DIMDLI"]=new DRW_Variant(40, buf->getBitDouble());
2178 vars["DIMEXE"]=new DRW_Variant(40, buf->getBitDouble());
2179 vars["DIMRND"]=new DRW_Variant(40, buf->getBitDouble());
2180 vars["DIMDLE"]=new DRW_Variant(40, buf->getBitDouble());
2181 vars["DIMTP"]=new DRW_Variant(40, buf->getBitDouble());
2182 vars["DIMTM"]=new DRW_Variant(40, buf->getBitDouble());
2183 if (version > DRW::AC1018) {//2007+
2184 vars["DIMFXL"]=new DRW_Variant(40, buf->getBitDouble());//////////////////
2185 vars["DIMJOGANG"]=new DRW_Variant(40, buf->getBitDouble());///////////////
2186 vars["DIMTFILL"]=new DRW_Variant(70, buf->getBitShort());
2187 vars["DIMTFILLCLR"]=new DRW_Variant(62, buf->getCmColor(version));
2188 }
2189 if (version > DRW::AC1014) {//2000+
2190 vars["DIMTOL"]=new DRW_Variant(70, buf->getBit());
2191 vars["DIMLIM"]=new DRW_Variant(70, buf->getBit());
2192 vars["DIMTIH"]=new DRW_Variant(70, buf->getBit());
2193 vars["DIMTOH"]=new DRW_Variant(70, buf->getBit());
2194 vars["DIMSE1"]=new DRW_Variant(70, buf->getBit());
2195 vars["DIMSE2"]=new DRW_Variant(70, buf->getBit());
2196 vars["DIMTAD"]=new DRW_Variant(70, buf->getBitShort());
2197 vars["DIMZIN"]=new DRW_Variant(70, buf->getBitShort());
2198 vars["DIMAZIN"]=new DRW_Variant(70, buf->getBitShort());
2199 }
2200 if (version > DRW::AC1018) {//2007+
2201 vars["DIMARCSYM"]=new DRW_Variant(70, buf->getBitShort());
2202 }
2203 vars["DIMTXT"]=new DRW_Variant(40, buf->getBitDouble());
2204 vars["DIMCEN"]=new DRW_Variant(40, buf->getBitDouble());
2205 vars["DIMTSZ"]=new DRW_Variant(40, buf->getBitDouble());
2206 vars["DIMALTF"]=new DRW_Variant(40, buf->getBitDouble());
2207 vars["DIMLFAC"]=new DRW_Variant(40, buf->getBitDouble());
2208 vars["DIMTVP"]=new DRW_Variant(40, buf->getBitDouble());
2209 vars["DIMTFAC"]=new DRW_Variant(40, buf->getBitDouble());
2210 vars["DIMGAP"]=new DRW_Variant(40, buf->getBitDouble());
2211 if (version < DRW::AC1015) {//r14-
2212 vars["DIMPOST"]=new DRW_Variant(1, buf->getCP8Text());
2213 vars["DIMAPOST"]=new DRW_Variant(1, buf->getCP8Text());
2214 vars["DIMBLK"]=new DRW_Variant(1, buf->getCP8Text());
2215 vars["DIMBLK1"]=new DRW_Variant(1, buf->getCP8Text());
2216 vars["DIMBLK2"]=new DRW_Variant(1, buf->getCP8Text());
2217 }
2218 if (version > DRW::AC1014) {//2000+
2219 vars["DIMALTRND"]=new DRW_Variant(40, buf->getBitDouble());
2220 vars["DIMALT"]=new DRW_Variant(70, buf->getBit());
2221 vars["DIMALTD"]=new DRW_Variant(70, buf->getBitShort());
2222 vars["DIMTOFL"]=new DRW_Variant(70, buf->getBit());
2223 vars["DIMSAH"]=new DRW_Variant(70, buf->getBit());
2224 vars["DIMTIX"]=new DRW_Variant(70, buf->getBit());
2225 vars["DIMSOXD"]=new DRW_Variant(70, buf->getBit());
2226 }
2227 vars["DIMCLRD"]=new DRW_Variant(70, buf->getCmColor(version));//RLZ: TODO read CMC or EMC color
2228 vars["DIMCLRE"]=new DRW_Variant(70, buf->getCmColor(version));//RLZ: TODO read CMC or EMC color
2229 vars["DIMCLRT"]=new DRW_Variant(70, buf->getCmColor(version));//RLZ: TODO read CMC or EMC color
2230 if (version > DRW::AC1014) {//2000+
2231 vars["DIMADEC"]=new DRW_Variant(70, buf->getBitShort());
2232 vars["DIMDEC"]=new DRW_Variant(70, buf->getBitShort());
2233 vars["DIMTDEC"]=new DRW_Variant(70, buf->getBitShort());
2234 vars["DIMALTU"]=new DRW_Variant(70, buf->getBitShort());
2235 vars["DIMALTTD"]=new DRW_Variant(70, buf->getBitShort());
2236 vars["DIMAUNIT"]=new DRW_Variant(70, buf->getBitShort());
2237 vars["DIMFRAC"]=new DRW_Variant(70, buf->getBitShort());// DIMFRAC (fraction format)
2238 vars["DIMLUNIT"]=new DRW_Variant(70, buf->getBitShort());
2239 vars["DIMDSEP"]=new DRW_Variant(70, buf->getBitShort());
2240 vars["DIMTMOVE"]=new DRW_Variant(70, buf->getBitShort());
2241 vars["DIMJUST"]=new DRW_Variant(70, buf->getBitShort());
2242 vars["DIMSD1"]=new DRW_Variant(70, buf->getBit());
2243 vars["DIMSD2"]=new DRW_Variant(70, buf->getBit());
2244 vars["DIMTOLJ"]=new DRW_Variant(70, buf->getBitShort());
2245 vars["DIMTZIN"]=new DRW_Variant(70, buf->getBitShort());
2246 vars["DIMALTZ"]=new DRW_Variant(70, buf->getBitShort());
2247 vars["DIMALTTZ"]=new DRW_Variant(70, buf->getBitShort());
2248 vars["DIMUPT"]=new DRW_Variant(70, buf->getBit());
2249 vars["DIMATFIT"]=new DRW_Variant(70, buf->getBitShort());
2250 }
2251 if (version > DRW::AC1018) {//2007+
2252 vars["DIMFXLON"]=new DRW_Variant(70, buf->getBit());////////////////
2253 }
2254 if (version > DRW::AC1021) {//2010+
2255 vars["DIMTXTDIRECTION"]=new DRW_Variant(70, buf->getBit());////////////////
2256 vars["DIMALTMZF"]=new DRW_Variant(40, buf->getBitDouble());////////////////
2257 vars["DIMMZF"]=new DRW_Variant(40, buf->getBitDouble());////////////////
2258 }
2259 if (version > DRW::AC1014) {//2000+
2260 dwgHandle DIMTXSTY = hBbuf->getHandle();
2261 DRW_DBG("\nDIMTXSTY: ")DRW_dbg::dbg("\nDIMTXSTY: "); DRW_DBGHL(DIMTXSTY.code, DIMTXSTY.size, DIMTXSTY.ref)DRW_dbg::dbgHL(DIMTXSTY.code, DIMTXSTY.size, DIMTXSTY.ref);
2262 dwgHandle DIMLDRBLK = hBbuf->getHandle();
2263 DRW_DBG("\nDIMLDRBLK: ")DRW_dbg::dbg("\nDIMLDRBLK: "); DRW_DBGHL(DIMLDRBLK.code, DIMLDRBLK.size, DIMLDRBLK.ref)DRW_dbg::dbgHL(DIMLDRBLK.code, DIMLDRBLK.size, DIMLDRBLK.ref);
2264 dwgHandle DIMBLK = hBbuf->getHandle();
2265 DRW_DBG("\nDIMBLK: ")DRW_dbg::dbg("\nDIMBLK: "); DRW_DBGHL(DIMBLK.code, DIMBLK.size, DIMBLK.ref)DRW_dbg::dbgHL(DIMBLK.code, DIMBLK.size, DIMBLK.ref);
2266 dwgHandle DIMBLK1 = hBbuf->getHandle();
2267 DRW_DBG("\nDIMBLK1: ")DRW_dbg::dbg("\nDIMBLK1: "); DRW_DBGHL(DIMBLK1.code, DIMBLK1.size, DIMBLK1.ref)DRW_dbg::dbgHL(DIMBLK1.code, DIMBLK1.size, DIMBLK1.ref);
2268 dwgHandle DIMBLK2 = hBbuf->getHandle();
2269 DRW_DBG("\nDIMBLK2: ")DRW_dbg::dbg("\nDIMBLK2: "); DRW_DBGHL(DIMBLK2.code, DIMBLK2.size, DIMBLK2.ref)DRW_dbg::dbgHL(DIMBLK2.code, DIMBLK2.size, DIMBLK2.ref);
2270 }
2271 if (version > DRW::AC1018) {//2007+
2272 dwgHandle DIMLTYPE = hBbuf->getHandle();
2273 DRW_DBG("\nDIMLTYPE: ")DRW_dbg::dbg("\nDIMLTYPE: "); DRW_DBGHL(DIMLTYPE.code, DIMLTYPE.size, DIMLTYPE.ref)DRW_dbg::dbgHL(DIMLTYPE.code, DIMLTYPE.size, DIMLTYPE.ref);
2274 dwgHandle DIMLTEX1 = hBbuf->getHandle();
2275 DRW_DBG("\nDIMLTEX1: ")DRW_dbg::dbg("\nDIMLTEX1: "); DRW_DBGHL(DIMLTEX1.code, DIMLTEX1.size, DIMLTEX1.ref)DRW_dbg::dbgHL(DIMLTEX1.code, DIMLTEX1.size, DIMLTEX1.ref);
2276 dwgHandle DIMLTEX2 = hBbuf->getHandle();
2277 DRW_DBG("\nDIMLTEX2: ")DRW_dbg::dbg("\nDIMLTEX2: "); DRW_DBGHL(DIMLTEX2.code, DIMLTEX2.size, DIMLTEX2.ref)DRW_dbg::dbgHL(DIMLTEX2.code, DIMLTEX2.size, DIMLTEX2.ref);
2278 }
2279 if (version > DRW::AC1014) {//2000+
2280 vars["DIMLWD"]=new DRW_Variant(70, buf->getBitShort());
2281 vars["DIMLWE"]=new DRW_Variant(70, buf->getBitShort());
2282 }
2283 dwgHandle CONTROL = hBbuf->getHandle();
2284 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);
2285 blockCtrl = CONTROL.ref;
2286 CONTROL = hBbuf->getHandle();
2287 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);
2288 layerCtrl = CONTROL.ref;
2289 CONTROL = hBbuf->getHandle();
2290 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);
2291 styleCtrl = CONTROL.ref;
2292 CONTROL = hBbuf->getHandle();
2293 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);
2294 linetypeCtrl = CONTROL.ref;
2295 CONTROL = hBbuf->getHandle();
2296 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);
2297 viewCtrl = CONTROL.ref;
2298 CONTROL = hBbuf->getHandle();
2299 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);
2300 ucsCtrl = CONTROL.ref;
2301 CONTROL = hBbuf->getHandle();
2302 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);
2303 vportCtrl = CONTROL.ref;
2304 CONTROL = hBbuf->getHandle();
2305 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);
2306 appidCtrl = CONTROL.ref;
2307 CONTROL = hBbuf->getHandle();
2308 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);
2309 dimstyleCtrl = CONTROL.ref;
2310 if (version < DRW::AC1018) {//r2000-
2311 CONTROL = hBbuf->getHandle();
2312 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);
2313 vpEntHeaderCtrl = CONTROL.ref; //RLZ: only in R13-R15 ????
2314 }
2315 CONTROL = hBbuf->getHandle();
2316 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);
2317 CONTROL = hBbuf->getHandle();
2318 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);
2319 CONTROL = hBbuf->getHandle();
2320 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);
2321
2322 if (version > DRW::AC1014) {//2000+
2323 vars["TSTACKALIGN"]=new DRW_Variant(70, buf->getBitShort());
2324 vars["TSTACKSIZE"]=new DRW_Variant(70, buf->getBitShort());
2325 if (version < DRW::AC1021) {//2004-
2326 vars["HYPERLINKBASE"]=new DRW_Variant(1, buf->getCP8Text());
2327 vars["STYLESHEET"]=new DRW_Variant(1, buf->getCP8Text());
2328 }
2329 CONTROL = hBbuf->getHandle();
2330 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);
2331 CONTROL = hBbuf->getHandle();
2332 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);
2333 CONTROL = hBbuf->getHandle();
2334 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);
2335 }
2336 if (version > DRW::AC1015) {//2004+
2337 CONTROL = hBbuf->getHandle();
2338 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);
2339 CONTROL = hBbuf->getHandle();
2340 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);
2341 }
2342 if (version > DRW::AC1018) {//2007+
2343 CONTROL = hBbuf->getHandle();
2344 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);
2345 }
2346 if (version > DRW::AC1024) {//2013+
2347 CONTROL = hBbuf->getHandle();
2348 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);
2349 }
2350 if (version > DRW::AC1014) {//2000+
2351 DRW_DBG("\nFlags: ")DRW_dbg::dbg("\nFlags: "); DRW_DBGH(buf->getBitLong())DRW_dbg::dbgH(buf->getBitLong());//RLZ TODO change to 8 vars
2352 vars["INSUNITS"]=new DRW_Variant(70, buf->getBitShort());
2353 std::uint16_t cepsntype = buf->getBitShort();
2354 vars["CEPSNTYPE"]=new DRW_Variant(70, cepsntype);
2355 if (cepsntype == 3){
2356 CONTROL = hBbuf->getHandle();
2357 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);
2358 }
2359 if (version < DRW::AC1021) {//2004-
2360 vars["FINGERPRINTGUID"]=new DRW_Variant(1, buf->getCP8Text());
2361 vars["VERSIONGUID"]=new DRW_Variant(1, buf->getCP8Text());
2362 }
2363 }
2364 if (version > DRW::AC1015) {//2004+
2365 vars["SORTENTS"]=new DRW_Variant(70, buf->getRawChar8());
2366 vars["INDEXCTL"]=new DRW_Variant(70, buf->getRawChar8());
2367 vars["HIDETEXT"]=new DRW_Variant(70, buf->getRawChar8());
2368 vars["XCLIPFRAME"]=new DRW_Variant(70, buf->getRawChar8());
2369 vars["DIMASSOC"]=new DRW_Variant(70, buf->getRawChar8());
2370 vars["HALOGAP"]=new DRW_Variant(70, buf->getRawChar8());
2371 vars["OBSCUREDCOLOR"]=new DRW_Variant(70, buf->getBitShort());
2372 vars["INTERSECTIONCOLOR"]=new DRW_Variant(70, buf->getBitShort());
2373 vars["OBSCUREDLTYPE"]=new DRW_Variant(70, buf->getRawChar8());
2374 vars["INTERSECTIONDISPLAY"]=new DRW_Variant(70, buf->getRawChar8());
2375 if (version < DRW::AC1021) {//2004-
2376 vars["PROJECTNAME"]=new DRW_Variant(1, buf->getCP8Text());
2377 }
2378 }
2379 CONTROL = hBbuf->getHandle();
2380 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);
2381 CONTROL = hBbuf->getHandle();
2382 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);
2383 CONTROL = hBbuf->getHandle();
2384 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);
2385 CONTROL = hBbuf->getHandle();
2386 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);
2387 CONTROL = hBbuf->getHandle();
2388 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);
2389 if (version > DRW::AC1018) {//2007+
2390 vars["CAMERADISPLAY"]=new DRW_Variant(70, buf->getBit());
2391 DRW_DBG("\nUnknown 2007+ long1: ")DRW_dbg::dbg("\nUnknown 2007+ long1: "); DRW_DBG(buf->getBitLong())DRW_dbg::dbg(buf->getBitLong());
2392 DRW_DBG("\nUnknown 2007+ long2: ")DRW_dbg::dbg("\nUnknown 2007+ long2: "); DRW_DBG(buf->getBitLong())DRW_dbg::dbg(buf->getBitLong());
2393 DRW_DBG("\nUnknown 2007+ double2: ")DRW_dbg::dbg("\nUnknown 2007+ double2: "); DRW_DBG(buf->getBitDouble())DRW_dbg::dbg(buf->getBitDouble());
2394 vars["STEPSPERSEC"]=new DRW_Variant(40, buf->getBitDouble());
2395 vars["STEPSIZE"]=new DRW_Variant(40, buf->getBitDouble());
2396 vars["3DDWFPREC"]=new DRW_Variant(40, buf->getBitDouble());
2397 vars["LENSLENGTH"]=new DRW_Variant(40, buf->getBitDouble());
2398 vars["CAMERAHEIGHT"]=new DRW_Variant(40, buf->getBitDouble());
2399 vars["SOLIDHIST"]=new DRW_Variant(70, buf->getRawChar8());
2400 vars["SHOWHIST"]=new DRW_Variant(70, buf->getRawChar8());
2401 vars["PSOLWIDTH"]=new DRW_Variant(40, buf->getBitDouble());
2402 vars["PSOLHEIGHT"]=new DRW_Variant(40, buf->getBitDouble());
2403 vars["LOFTANG1"]=new DRW_Variant(40, buf->getBitDouble());
2404 vars["LOFTANG2"]=new DRW_Variant(40, buf->getBitDouble());
2405 vars["LOFTMAG1"]=new DRW_Variant(40, buf->getBitDouble());
2406 vars["LOFTMAG2"]=new DRW_Variant(40, buf->getBitDouble());
2407 vars["LOFTPARAM"]=new DRW_Variant(70, buf->getBitShort());
2408 vars["LOFTNORMALS"]=new DRW_Variant(40, buf->getRawChar8());
2409 vars["LATITUDE"]=new DRW_Variant(40, buf->getBitDouble());
2410 vars["LONGITUDE"]=new DRW_Variant(40, buf->getBitDouble());
2411 vars["NORTHDIRECTION"]=new DRW_Variant(40, buf->getBitDouble());
2412 vars["TIMEZONE"]=new DRW_Variant(70, buf->getBitLong());
2413 vars["LIGHTGLYPHDISPLAY"]=new DRW_Variant(70, buf->getRawChar8());
2414 vars["TILEMODELIGHTSYNCH"]=new DRW_Variant(70, buf->getRawChar8());
2415 vars["DWFFRAME"]=new DRW_Variant(70, buf->getRawChar8());
2416 vars["DGNFRAME"]=new DRW_Variant(70, buf->getRawChar8());
2417 DRW_DBG("\nUnknown 2007+ BIT: ")DRW_dbg::dbg("\nUnknown 2007+ BIT: "); DRW_DBG(buf->getBit())DRW_dbg::dbg(buf->getBit());
2418 vars["INTERFERECOLOR"]=new DRW_Variant(70, buf->getCmColor(version));
2419 CONTROL = hBbuf->getHandle();
2420 DRW_DBG("\nINTERFEREOBJVS: ")DRW_dbg::dbg("\nINTERFEREOBJVS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2421 CONTROL = hBbuf->getHandle();
2422 DRW_DBG("\nINTERFEREVPVS: ")DRW_dbg::dbg("\nINTERFEREVPVS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2423 CONTROL = hBbuf->getHandle();
2424 DRW_DBG("\nDRAGVS: ")DRW_dbg::dbg("\nDRAGVS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref)DRW_dbg::dbgHL(CONTROL.code, CONTROL.size, CONTROL.ref);
2425 vars["CSHADOW"]=new DRW_Variant(70, buf->getRawChar8());
2426 DRW_DBG("\nUnknown 2007+ double2: ")DRW_dbg::dbg("\nUnknown 2007+ double2: "); DRW_DBG(buf->getBitDouble())DRW_dbg::dbg(buf->getBitDouble());
2427 }
2428 if (version > DRW::AC1012) {//R14+
2429 DRW_DBG("\nUnknown R14+ short1: ")DRW_dbg::dbg("\nUnknown R14+ short1: "); DRW_DBG(buf->getBitShort())DRW_dbg::dbg(buf->getBitShort());
2430 DRW_DBG("\nUnknown R14+ short2: ")DRW_dbg::dbg("\nUnknown R14+ short2: "); DRW_DBG(buf->getBitShort())DRW_dbg::dbg(buf->getBitShort());
2431 DRW_DBG("\nUnknown R14+ short3: ")DRW_dbg::dbg("\nUnknown R14+ short3: "); DRW_DBG(buf->getBitShort())DRW_dbg::dbg(buf->getBitShort());
2432 DRW_DBG("\nUnknown R14+ short4: ")DRW_dbg::dbg("\nUnknown R14+ short4: "); DRW_DBG(buf->getBitShort())DRW_dbg::dbg(buf->getBitShort());
2433 }
2434
2435 DRW_DBG("\nbuf position: ")DRW_dbg::dbg("\nbuf position: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2436 DRW_DBG(" buf bit position: ")DRW_dbg::dbg(" buf bit position: "); DRW_DBG(buf->getBitPos())DRW_dbg::dbg(buf->getBitPos());
2437
2438
2439 /**** RLZ: disabled, pending to read all data ***/
2440 //Start reading string stream for 2007 and further
2441 if (version > DRW::AC1018) {//2007+
2442 std::uint32_t strStartPos = endBitPos -1;
2443 buf->setPosition(strStartPos >>3);
2444 buf->setBitPos(strStartPos&7);
2445 if (buf->getBit() == 1){
2446 strStartPos -= 16;
2447 buf->setPosition(strStartPos >>3);
2448 buf->setBitPos(strStartPos&7);
2449 std::uint32_t strDataSize = buf->getRawShort16();
2450 if (strDataSize & 0x8000) {
2451 strStartPos -= 16;//decrement 16 bits
2452 strDataSize &= 0x7FFF; //strip 0x8000;
2453 buf->setPosition(strStartPos >> 3);
2454 buf->setBitPos(strStartPos & 7);
2455 std::uint32_t hiSize = buf->getRawShort16();
2456 strDataSize |= (hiSize << 15);
2457 }
2458 strStartPos -= strDataSize;
2459 buf->setPosition(strStartPos >> 3);
2460 buf->setBitPos(strStartPos & 7);
2461
2462 DRW_DBG("\nstring buf position: ")DRW_dbg::dbg("\nstring buf position: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2463 DRW_DBG("\nstring buf bit position: ")DRW_dbg::dbg("\nstring buf bit position: "); DRW_DBG(buf->getBitPos())DRW_dbg::dbg(buf->getBitPos());
2464 }
2465 DRW_DBG("\nUnknown text1: ")DRW_dbg::dbg("\nUnknown text1: "); DRW_DBG(buf->getUCSText(false))DRW_dbg::dbg(buf->getUCSText(false));
2466 DRW_DBG("\nUnknown text2: ")DRW_dbg::dbg("\nUnknown text2: "); DRW_DBG(buf->getUCSText(false))DRW_dbg::dbg(buf->getUCSText(false));
2467 DRW_DBG("\nUnknown text3: ")DRW_dbg::dbg("\nUnknown text3: "); DRW_DBG(buf->getUCSText(false))DRW_dbg::dbg(buf->getUCSText(false));
2468 DRW_DBG("\nUnknown text4: ")DRW_dbg::dbg("\nUnknown text4: "); DRW_DBG(buf->getUCSText(false))DRW_dbg::dbg(buf->getUCSText(false));
2469 vars["MENU"]=new DRW_Variant(1, buf->getUCSText(false));
2470 vars["DIMPOST"]=new DRW_Variant(1, buf->getUCSText(false));
2471 vars["DIMAPOST"]=new DRW_Variant(1, buf->getUCSText(false));
2472 if (version > DRW::AC1021) {//2010+
2473 vars["DIMALTMZS"]=new DRW_Variant(70, buf->getUCSText(false));//RLZ: pending to verify//////////////
2474 vars["DIMMZS"]=new DRW_Variant(70, buf->getUCSText(false));//RLZ: pending to verify//////////////
2475 }
2476 vars["HYPERLINKBASE"]=new DRW_Variant(1, buf->getUCSText(false));
2477 vars["STYLESHEET"]=new DRW_Variant(1, buf->getUCSText(false));
2478 vars["FINGERPRINTGUID"]=new DRW_Variant(1, buf->getUCSText(false));
2479 DRW_DBG("\nstring buf position: ")DRW_dbg::dbg("\nstring buf position: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2480 DRW_DBG(" string buf bit position: ")DRW_dbg::dbg(" string buf bit position: "); DRW_DBG(buf->getBitPos())DRW_dbg::dbg(buf->getBitPos());
2481 vars["VERSIONGUID"]=new DRW_Variant(1, buf->getUCSText(false));
2482 DRW_DBG("\nstring buf position: ")DRW_dbg::dbg("\nstring buf position: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2483 DRW_DBG(" string buf bit position: ")DRW_dbg::dbg(" string buf bit position: "); DRW_DBG(buf->getBitPos())DRW_dbg::dbg(buf->getBitPos());
2484 vars["PROJECTNAME"]=new DRW_Variant(1, buf->getUCSText(false));
2485 }
2486/*** ****/
2487 DRW_DBG("\nstring buf position: ")DRW_dbg::dbg("\nstring buf position: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2488 DRW_DBG(" string buf bit position: ")DRW_dbg::dbg(" string buf bit position: "); DRW_DBG(buf->getBitPos())DRW_dbg::dbg(buf->getBitPos());
2489
2490 if (DRW_DBGGLDRW_dbg::getInstance()->getLevel() == DRW_dbg::Level::Debug){
2491 for (auto it=vars.begin(); it!=vars.end(); ++it){
2492 DRW_DBG("\n")DRW_dbg::dbg("\n"); DRW_DBG(it->first)DRW_dbg::dbg(it->first); DRW_DBG(": ")DRW_dbg::dbg(": ");
2493 switch (it->second->type()){
2494 case DRW_Variant::INTEGER:
2495 DRW_DBG(it->second->content.i)DRW_dbg::dbg(it->second->content.i);
2496 break;
2497 case DRW_Variant::DOUBLE:
2498 DRW_DBG(it->second->content.d)DRW_dbg::dbg(it->second->content.d);
2499 break;
2500 case DRW_Variant::STRING:
2501 DRW_DBG(it->second->content.s->c_str())DRW_dbg::dbg(it->second->content.s->c_str());
2502 break;
2503 case DRW_Variant::COORD:
2504 DRW_DBG("x= ")DRW_dbg::dbg("x= "); DRW_DBG(it->second->content.v->x)DRW_dbg::dbg(it->second->content.v->x);
2505 DRW_DBG(", y= ")DRW_dbg::dbg(", y= "); DRW_DBG(it->second->content.v->y)DRW_dbg::dbg(it->second->content.v->y);
2506 DRW_DBG(", z= ")DRW_dbg::dbg(", z= "); DRW_DBG(it->second->content.v->z)DRW_dbg::dbg(it->second->content.v->z);
2507 break;
2508 default:
2509 break;
2510 }
2511 DRW_DBG(" code: ")DRW_dbg::dbg(" code: ");DRW_DBG(it->second->code())DRW_dbg::dbg(it->second->code());
2512 }
2513 }
2514
2515 buf->setPosition(size+16+4); //read size +16 start sentinel + 4 size
2516 if ((DRW::AC1024 <= version && 3 < maintenanceVersion)
2517 || DRW::AC1032 <= version) { //2010+ MV>3
2518 buf->getRawLong32();//advance 4 bytes (hisize)
2519 }
2520 DRW_DBG("\nsetting position to: ")DRW_dbg::dbg("\nsetting position to: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2521 DRW_DBG("\nHeader CRC: ")DRW_dbg::dbg("\nHeader CRC: "); DRW_DBGH(buf->getRawShort16())DRW_dbg::dbgH(buf->getRawShort16());
2522 DRW_DBG("\nbuf position: ")DRW_dbg::dbg("\nbuf position: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2523 DRW_DBG("\ndwg header end sentinel= ")DRW_dbg::dbg("\ndwg header end sentinel= ");
2524 for (int i=0; i<16;i++) {
2525 DRW_DBGH(buf->getRawChar8())DRW_dbg::dbgH(buf->getRawChar8()); DRW_DBG(" ")DRW_dbg::dbg(" ");
2526 }
2527
2528 //temporary code to show header end sentinel
2529 std::uint64_t sz= buf->size()-1;
Value stored to 'sz' during its initialization is never read
2530 if (version < DRW::AC1018) {//pre 2004
2531 sz= buf->size()-16;
2532 buf->setPosition(sz);
2533 DRW_DBG("\nsetting position to: ")DRW_dbg::dbg("\nsetting position to: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2534 DRW_DBG("\ndwg header end sentinel= ")DRW_dbg::dbg("\ndwg header end sentinel= ");
2535 for (int i=0; i<16;i++) {
2536 DRW_DBGH(buf->getRawChar8())DRW_dbg::dbgH(buf->getRawChar8()); DRW_DBG(" ")DRW_dbg::dbg(" ");
2537 }
2538 } else if (version == DRW::AC1018) {//2004
2539// sz= buf->size()-132;
2540// buf->setPosition(sz);
2541 buf->moveBitPos(-128);
2542 DRW_DBG("\nsetting position to: ")DRW_dbg::dbg("\nsetting position to: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2543 DRW_DBG("\ndwg header end sentinel= ")DRW_dbg::dbg("\ndwg header end sentinel= ");
2544 for (int i=0; i<16;i++) {
2545 DRW_DBGH(buf->getRawChar8())DRW_dbg::dbgH(buf->getRawChar8()); DRW_DBG(" ")DRW_dbg::dbg(" ");
2546 }
2547 } else if (version == DRW::AC1021) {//2007
2548 sz= buf->size()-16;
2549 buf->setPosition(sz);
2550 DRW_DBG("\nsetting position to: ")DRW_dbg::dbg("\nsetting position to: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2551 DRW_DBG("\ndwg header end sentinel= ")DRW_dbg::dbg("\ndwg header end sentinel= ");
2552 for (int i=0; i<16;i++) {
2553 DRW_DBGH(buf->getRawChar8())DRW_dbg::dbgH(buf->getRawChar8()); DRW_DBG(" ")DRW_dbg::dbg(" ");
2554 }
2555 } else if (version == DRW::AC1024) {//2010
2556// sz= buf->size()-93;
2557// buf->setPosition(sz);
2558 buf->moveBitPos(-128);
2559 DRW_DBG("\nsetting position to: ")DRW_dbg::dbg("\nsetting position to: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2560 DRW_DBG("\ndwg header end sentinel= ")DRW_dbg::dbg("\ndwg header end sentinel= ");
2561 for (int i=0; i<16;i++) {
2562 DRW_DBGH(buf->getRawChar8())DRW_dbg::dbgH(buf->getRawChar8()); DRW_DBG(" ")DRW_dbg::dbg(" ");
2563 }
2564 } else if (version == DRW::AC1027 || version == DRW::AC1032) {//2013+
2565// sz= buf->size()-76;
2566// buf->setPosition(sz);
2567 buf->moveBitPos(-128);
2568 DRW_DBG("\nsetting position to: ")DRW_dbg::dbg("\nsetting position to: "); DRW_DBG(buf->getPosition())DRW_dbg::dbg(buf->getPosition());
2569 DRW_DBG("\ndwg header end sentinel= ")DRW_dbg::dbg("\ndwg header end sentinel= ");
2570 for (int i=0; i<16;i++) {
2571 DRW_DBGH(buf->getRawChar8())DRW_dbg::dbgH(buf->getRawChar8()); DRW_DBG(" ")DRW_dbg::dbg(" ");
2572 }
2573 }
2574
2575 return result;
2576}
2577
2578// ---------------------------------------------------------------------------
2579// DRW_Header::encodeDwg — Phase 3a (drafted 2026-05-14)
2580// ---------------------------------------------------------------------------
2581// Inverse of parseDwg. Emits the bit-packed HEADER section body for R2000
2582// (AC1015). The caller (dwgWriter15::writeDwgHeader) has already emitted
2583// the 16-byte begin sentinel + 4-byte RL section-size placeholder; this
2584// function appends the variable stream starting right after them. The
2585// caller appends the 16-byte end sentinel + 2-byte CRC16 LE after we return
2586// and back-patches the size placeholder.
2587//
2588// For R2000 the handle stream is INLINE with the data stream — buf and
2589// hBbuf are the same accumulator. Future versions will diverge.
2590//
2591// Order of emission must match parseDwg EXACTLY. See deep-review notes
2592// in /Users/dli/.claude/plans/dwg-write-phase3-tables-objects.md for the
2593// 13-handle control-handle block and the conditional layout.
2594
2595namespace {
2596 /// Look up a header var tolerant of either naming convention.
2597 /// DWG-side parseDwg stores bare keys ("LUPREC"); DXF-side parseCode and
2598 /// the app's writeHeader push $-prefixed keys ("$LUPREC"). This helper
2599 /// tries the caller-supplied key first (preserving bare-on-both DWG
2600 /// round-trip semantics), then falls back to the alternate form so the
2601 /// DXF -> DWG export path (where vars were filled with $NAME keys) finds
2602 /// the values instead of emitting encoder defaults. Centralizing the
2603 /// fallback here keeps the DXF reader/writer surfaces untouched.
2604 auto findVar(const DRW_Header& hdr, const std::string& name) {
2605 auto it = hdr.vars.find(name);
2606 if (it != hdr.vars.end()) return it;
2607 if (!name.empty() && name.front() == '$') {
2608 return hdr.vars.find(name.substr(1));
2609 }
2610 return hdr.vars.find(std::string{"$"} + name);
2611 }
2612 /// Look up a 1-bit boolean var in DRW_Header::vars; default 0.
2613 std::uint8_t boolVar(const DRW_Header& hdr, const std::string& name) {
2614 auto it = findVar(hdr, name);
2615 if (it == hdr.vars.end() || !it->second) return 0;
2616 return static_cast<std::uint8_t>(it->second->i_val() & 1);
2617 }
2618 /// Look up a BS/BL int var; default 0 (or caller-supplied default).
2619 std::int32_t intVar(const DRW_Header& hdr, const std::string& name, std::int32_t def = 0) {
2620 auto it = findVar(hdr, name);
2621 if (it == hdr.vars.end() || !it->second) return def;
2622 return it->second->i_val();
2623 }
2624 /// Look up a BD float var; default 0.0 (or caller-supplied).
2625 double dblVar(const DRW_Header& hdr, const std::string& name, double def = 0.0) {
2626 auto it = findVar(hdr, name);
2627 if (it == hdr.vars.end() || !it->second) return def;
2628 return it->second->d_val();
2629 }
2630 /// Look up a 3BD coord var; default {0,0,0}.
2631 DRW_Coord coordVar(const DRW_Header& hdr, const std::string& name) {
2632 auto it = findVar(hdr, name);
2633 if (it == hdr.vars.end() || !it->second
2634 || it->second->type() != DRW_Variant::COORD
2635 || it->second->coord() == nullptr) {
2636 return {0.0, 0.0, 0.0};
2637 }
2638 return *it->second->coord();
2639 }
2640 /// Look up a TV string var; default empty.
2641 UTF8STRINGstd::string strVar(const DRW_Header& hdr, const std::string& name) {
2642 auto it = findVar(hdr, name);
2643 if (it == hdr.vars.end() || !it->second
2644 || it->second->type() != DRW_Variant::STRING) {
2645 return {};
2646 }
2647 return UTF8STRINGstd::string(it->second->c_str());
2648 }
2649 /// Build a hard-pointer handle (code 4) referring to `ref`. Returns
2650 /// the null handle when ref==0, which matches what parseDwg sees in
2651 /// an empty document.
2652 dwgHandle makeHardPtr(std::uint32_t ref) {
2653 dwgHandle h;
2654 h.code = (ref == 0) ? 0 : 4;
2655 h.ref = ref;
2656 h.size = 0;
2657 if (ref != 0) {
2658 std::uint32_t t = ref;
2659 while (t != 0) { t >>= 8; ++h.size; }
2660 }
2661 return h;
2662 }
2663 /// Build a soft-owner handle (code 3) — used for the XDic-style
2664 /// owner references in the HEADER's control-handle block.
2665 dwgHandle makeSoftOwner(std::uint32_t ref) {
2666 dwgHandle h;
2667 h.code = (ref == 0) ? 0 : 3;
2668 h.ref = ref;
2669 h.size = 0;
2670 if (ref != 0) {
2671 std::uint32_t t = ref;
2672 while (t != 0) { t >>= 8; ++h.size; }
2673 }
2674 return h;
2675 }
2676 /// Decompose a stored TDCREATE-style double `julianDay + msec/86_400_000`
2677 /// back into the two BLs encodeDwg writes. Inverse of:
2678 /// day = getBitLong(); msec = getBitLong();
2679 /// stored = day + msec/86_400_000.0;
2680 /// For an empty header (stored == 0.0) the result is (0, 0). Round to the
2681 /// nearest millisecond to absorb the FP error introduced by the division.
2682 void splitTimeVar(double stored, std::int32_t& day, std::int32_t& msecOut) {
2683 constexpr double kMsecPerDay = 86400000.0;
2684 const double dayFloor = std::floor(stored);
2685 day = static_cast<std::int32_t>(dayFloor);
2686 const double frac = stored - dayFloor;
2687 msecOut = static_cast<std::int32_t>(std::lround(frac * kMsecPerDay));
2688 // A msec of exactly 86_400_000 occurs if `frac` is essentially 1 due
2689 // to FP rounding; carry to the next day.
2690 if (msecOut >= static_cast<std::int32_t>(kMsecPerDay)) {
2691 day += 1;
2692 msecOut = 0;
2693 }
2694 }
2695} // namespace
2696
2697bool DRW_Header::encodeDwg(DRW::Version version, dwgBufferW *buf, dwgBufferW *hBbuf,
2698 dwgBufferW *strBuf) {
2699 if (version != DRW::AC1015 && version != DRW::AC1018 &&
2700 version != DRW::AC1024 && version != DRW::AC1027 &&
2701 version != DRW::AC1032) return false;
2702
2703 // -------- REQUIREDVERSIONS (parseDwg:1786-1789) -------------------------
2704 if (version > DRW::AC1024) {
2705 buf->putBitLongLong(0); // REQUIREDVERSIONS (AC1027+)
2706 }
2707
2708 // -------- Unknown 4 BDs (parseDwg:1789-1792) ----------------------------
2709 buf->putBitDouble(0.0);
2710 buf->putBitDouble(0.0);
2711 buf->putBitDouble(0.0);
2712 buf->putBitDouble(0.0);
2713
2714 // -------- 4 CP8 string unknowns (parseDwg:1793-1798) --------------------
2715 // Gated on `version < AC1021` (2007-). R2000/R2004 hits this branch.
2716 if (version < DRW::AC1021) {
2717 buf->putCP8Text(std::string());
2718 buf->putCP8Text(std::string());
2719 buf->putCP8Text(std::string());
2720 buf->putCP8Text(std::string());
2721 }
2722
2723 // -------- Unknown longs (parseDwg:1799-1800) ----------------------------
2724 // parseDwg comments call these "Unknown long1 (24L)" and "(0L)". Real
2725 // R2000 files have 24 and 0 respectively.
2726 buf->putBitLong(24);
2727 buf->putBitLong(0);
2728
2729 // -------- Current-view handle (parseDwg:1804-1807) ----------------------
2730 // R2000 and earlier only (parseDwg skips this for AC1018+).
2731 if (version < DRW::AC1018) {
2732 hBbuf->putHandle(makeHardPtr(0));
2733 }
2734
2735 // -------- 9 single-bit vars (parseDwg:1808-1819; R2000-relevant set) ----
2736 buf->putBit(boolVar(*this, "DIMASO"));
2737 buf->putBit(boolVar(*this, "DIMSHO"));
2738 buf->putBit(boolVar(*this, "PLINEGEN"));
2739 buf->putBit(boolVar(*this, "ORTHOMODE"));
2740 buf->putBit(boolVar(*this, "REGENMODE"));
2741 buf->putBit(boolVar(*this, "FILLMODE"));
2742 buf->putBit(boolVar(*this, "QTEXTMODE"));
2743 buf->putBit(boolVar(*this, "PSLTSCALE"));
2744 buf->putBit(boolVar(*this, "LIMCHECK"));
2745 if (version > DRW::AC1015) { // R2004+: undocumented bit (parseDwg:1824-1826)
2746 buf->putBit(0);
2747 }
2748
2749 // -------- 11 more single-bit vars (parseDwg:1827-1847) ------------------
2750 buf->putBit(boolVar(*this, "USRTIMER"));
2751 buf->putBit(boolVar(*this, "SKPOLY"));
2752 buf->putBit(boolVar(*this, "ANGDIR"));
2753 buf->putBit(boolVar(*this, "SPLFRAME"));
2754 buf->putBit(boolVar(*this, "MIRRTEXT"));
2755 buf->putBit(boolVar(*this, "WORLDVIEW"));
2756 buf->putBit(boolVar(*this, "TILEMODE"));
2757 buf->putBit(boolVar(*this, "PLIMCHECK"));
2758 buf->putBit(boolVar(*this, "VISRETAIN"));
2759 buf->putBit(boolVar(*this, "DISPSILH"));
2760 buf->putBit(boolVar(*this, "PELLIPSE"));
2761
2762 // -------- PROXIGRAPHICS through PDMODE (parseDwg:1845-1861) -------------
2763 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "PROXIGRAPHICS", 1)));
2764 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "TREEDEPTH", 3020)));
2765 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "LUNITS", 2)));
2766 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "LUPREC", 4)));
2767 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "AUNITS", 0)));
2768 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "AUPREC", 0)));
2769 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "ATTMODE", 1)));
2770 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "PDMODE", 0)));
2771 if (version > DRW::AC1015) { // R2004+: 3 unknown BLs (parseDwg:1868-1872)
2772 buf->putBitLong(0);
2773 buf->putBitLong(0);
2774 buf->putBitLong(0);
2775 }
2776
2777 // -------- USERI1..5 + spline/surface family (parseDwg:1873-1888) --------
2778 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "USERI1")));
2779 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "USERI2")));
2780 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "USERI3")));
2781 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "USERI4")));
2782 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "USERI5")));
2783 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "SPLINESEGS", 8)));
2784 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "SURFU", 6)));
2785 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "SURFV", 6)));
2786 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "SURFTYPE", 6)));
2787 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "SURFTAB1", 6)));
2788 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "SURFTAB2", 6)));
2789 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "SPLINETYPE", 6)));
2790 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "SHADEDGE", 3)));
2791 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "SHADEDIF", 70)));
2792 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "UNITMODE")));
2793 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "MAXACTVP", 64)));
2794 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "ISOLINES", 4)));
2795 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "CMLJUST")));
2796 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "TEXTQLTY", 50)));
2797
2798 // -------- LTSCALE through CELTSCALE (parseDwg:1889-1909) ----------------
2799 buf->putBitDouble(dblVar(*this, "LTSCALE", 1.0));
2800 buf->putBitDouble(dblVar(*this, "TEXTSIZE", 2.5));
2801 buf->putBitDouble(dblVar(*this, "TRACEWID", 1.0));
2802 buf->putBitDouble(dblVar(*this, "SKETCHINC", 1.0));
2803 buf->putBitDouble(dblVar(*this, "FILLETRAD", 0.0));
2804 buf->putBitDouble(dblVar(*this, "THICKNESS", 0.0));
2805 buf->putBitDouble(dblVar(*this, "ANGBASE", 0.0));
2806 buf->putBitDouble(dblVar(*this, "PDSIZE", 0.0));
2807 buf->putBitDouble(dblVar(*this, "PLINEWID", 0.0));
2808 buf->putBitDouble(dblVar(*this, "USERR1", 0.0));
2809 buf->putBitDouble(dblVar(*this, "USERR2", 0.0));
2810 buf->putBitDouble(dblVar(*this, "USERR3", 0.0));
2811 buf->putBitDouble(dblVar(*this, "USERR4", 0.0));
2812 buf->putBitDouble(dblVar(*this, "USERR5", 0.0));
2813 buf->putBitDouble(dblVar(*this, "CHAMFERA", 0.0));
2814 buf->putBitDouble(dblVar(*this, "CHAMFERB", 0.0));
2815 buf->putBitDouble(dblVar(*this, "CHAMFERC", 0.0));
2816 buf->putBitDouble(dblVar(*this, "CHAMFERD", 0.0));
2817 buf->putBitDouble(dblVar(*this, "FACETRES", 0.5));
2818 buf->putBitDouble(dblVar(*this, "CMLSCALE", 1.0));
2819 buf->putBitDouble(dblVar(*this, "CELTSCALE", 1.0));
2820
2821 // -------- MENU string (gated version < AC1021) --------------------------
2822 if (version < DRW::AC1021) {
2823 buf->putCP8Text(strVar(*this, "MENU"));
2824 }
2825
2826 // -------- TDCREATE / TDUPDATE / TDINDWG / TDUSRTIMER (4 pairs of BLs) ---
2827 {
2828 std::int32_t day, msec;
2829 splitTimeVar(dblVar(*this, "TDCREATE"), day, msec);
2830 buf->putBitLong(day);
2831 buf->putBitLong(msec);
2832 }
2833 {
2834 std::int32_t day, msec;
2835 splitTimeVar(dblVar(*this, "TDUPDATE"), day, msec);
2836 buf->putBitLong(day);
2837 buf->putBitLong(msec);
2838 }
2839 if (version > DRW::AC1015) { // R2004+: 3 unknown BLs (parseDwg:1931-1935)
2840 buf->putBitLong(0);
2841 buf->putBitLong(0);
2842 buf->putBitLong(0);
2843 }
2844 {
2845 std::int32_t day, msec;
2846 splitTimeVar(dblVar(*this, "TDINDWG"), day, msec);
2847 buf->putBitLong(day);
2848 buf->putBitLong(msec);
2849 }
2850 {
2851 std::int32_t day, msec;
2852 splitTimeVar(dblVar(*this, "TDUSRTIMER"), day, msec);
2853 buf->putBitLong(day);
2854 buf->putBitLong(msec);
2855 }
2856
2857 // -------- CECOLOR + first handle block (parseDwg:1947-1963) -------------
2858 buf->putCmColor(version, static_cast<std::uint16_t>(intVar(*this, "CECOLOR", 256)));
2859 // HANDSEED — emitted into the DATA stream (`buf`), not hBbuf.
2860 // Stored in DRW_Header::handSeed (set by parseDwg on read; settable
2861 // by the writer caller from the HandleAllocator's high-water mark
2862 // for fresh documents). A zero value emits as a null handle —
2863 // libdxfrw round-trip tolerates it, but AutoCAD will refresh
2864 // HANDSEED to `max(handle)+1` on first save and mark the file
2865 // modified. See Risk 4j.
2866 buf->putHandle(makeHardPtr(handSeed));
2867 // The following 5 handles emit to the HANDLE stream. For R2000 the
2868 // handle stream is inline (buf == hBbuf in our usage).
2869 hBbuf->putHandle(makeHardPtr(0)); // CLAYER
2870 hBbuf->putHandle(makeHardPtr(0)); // TEXTSTYLE
2871 hBbuf->putHandle(makeHardPtr(0)); // CELTYPE
2872 if (version > DRW::AC1018) { // 2007+: CMATERIAL (parseDwg:1960-1963)
2873 hBbuf->putHandle(makeHardPtr(0));
2874 }
2875 hBbuf->putHandle(makeHardPtr(0)); // DIMSTYLE
2876 hBbuf->putHandle(makeHardPtr(0)); // CMLSTYLE
2877
2878 // -------- Paper-space view block (parseDwg:1965-1989) -------------------
2879 buf->putBitDouble(dblVar(*this, "PSVPSCALE", 1.0));
2880 buf->put3BitDouble(coordVar(*this, "PINSBASE"));
2881 buf->put3BitDouble(coordVar(*this, "PEXTMIN"));
2882 buf->put3BitDouble(coordVar(*this, "PEXTMAX"));
2883 buf->put2RawDouble(coordVar(*this, "PLIMMIN"));
2884 buf->put2RawDouble(coordVar(*this, "PLIMMAX"));
2885 buf->putBitDouble(dblVar(*this, "PELEVATION"));
2886 buf->put3BitDouble(coordVar(*this, "PUCSORG"));
2887 buf->put3BitDouble(coordVar(*this, "PUCSXDIR"));
2888 buf->put3BitDouble(coordVar(*this, "PUCSYDIR"));
2889 hBbuf->putHandle(makeHardPtr(0)); // PUCSNAME
2890 hBbuf->putHandle(makeHardPtr(0)); // PUCSORTHOREF
2891 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "PUCSORTHOVIEW")));
2892 hBbuf->putHandle(makeHardPtr(0)); // PUCSBASE
2893 buf->put3BitDouble(coordVar(*this, "PUCSORGTOP"));
2894 buf->put3BitDouble(coordVar(*this, "PUCSORGBOTTOM"));
2895 buf->put3BitDouble(coordVar(*this, "PUCSORGLEFT"));
2896 buf->put3BitDouble(coordVar(*this, "PUCSORGRIGHT"));
2897 buf->put3BitDouble(coordVar(*this, "PUCSORGFRONT"));
2898 buf->put3BitDouble(coordVar(*this, "PUCSORGBACK"));
2899
2900 // -------- Model-space view block (parseDwg:1991-2018) -------------------
2901 buf->put3BitDouble(coordVar(*this, "INSBASE"));
2902 buf->put3BitDouble(coordVar(*this, "EXTMIN"));
2903 buf->put3BitDouble(coordVar(*this, "EXTMAX"));
2904 buf->put2RawDouble(coordVar(*this, "LIMMIN"));
2905 buf->put2RawDouble(coordVar(*this, "LIMMAX"));
2906 buf->putBitDouble(dblVar(*this, "ELEVATION"));
2907 buf->put3BitDouble(coordVar(*this, "UCSORG"));
2908 buf->put3BitDouble(coordVar(*this, "UCSXDIR"));
2909 buf->put3BitDouble(coordVar(*this, "UCSYDIR"));
2910 hBbuf->putHandle(makeHardPtr(0)); // UCSNAME
2911 hBbuf->putHandle(makeHardPtr(0)); // UCSORTHOREF
2912 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "UCSORTHOVIEW")));
2913 hBbuf->putHandle(makeHardPtr(0)); // UCSBASE
2914 buf->put3BitDouble(coordVar(*this, "UCSORGTOP"));
2915 buf->put3BitDouble(coordVar(*this, "UCSORGBOTTOM"));
2916 buf->put3BitDouble(coordVar(*this, "UCSORGLEFT"));
2917 buf->put3BitDouble(coordVar(*this, "UCSORGRIGHT"));
2918 buf->put3BitDouble(coordVar(*this, "UCSORGFRONT"));
2919 buf->put3BitDouble(coordVar(*this, "UCSORGBACK"));
2920 if (version < DRW::AC1021) { // gated: DIMPOST/DIMAPOST as CP8 strings (parseDwg:2019-2022)
2921 buf->putCP8Text(strVar(*this, "DIMPOST"));
2922 buf->putCP8Text(strVar(*this, "DIMAPOST"));
2923 }
2924
2925 // -------- DIM* values for R2000 (parseDwg:2053-2129; R14 branch dropped)
2926 buf->putBitDouble(dblVar(*this, "DIMSCALE", 1.0));
2927 buf->putBitDouble(dblVar(*this, "DIMASZ", 0.18));
2928 buf->putBitDouble(dblVar(*this, "DIMEXO", 0.0625));
2929 buf->putBitDouble(dblVar(*this, "DIMDLI", 0.38));
2930 buf->putBitDouble(dblVar(*this, "DIMEXE", 0.18));
2931 buf->putBitDouble(dblVar(*this, "DIMRND", 0.0));
2932 buf->putBitDouble(dblVar(*this, "DIMDLE", 0.0));
2933 buf->putBitDouble(dblVar(*this, "DIMTP", 0.0));
2934 buf->putBitDouble(dblVar(*this, "DIMTM", 0.0));
2935 if (version > DRW::AC1018) { // 2007+: DIMFXL, DIMJOGANG, DIMTFILL, DIMTFILLCLR (parseDwg:2066-2070)
2936 buf->putBitDouble(dblVar(*this, "DIMFXL", 1.0));
2937 buf->putBitDouble(dblVar(*this, "DIMJOGANG", 0.0));
2938 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMTFILL")));
2939 buf->putCmColor(version, static_cast<std::uint16_t>(intVar(*this, "DIMTFILLCLR")));
2940 }
2941 // R2000+: 6 bits then 3 BS
2942 buf->putBit(boolVar(*this, "DIMTOL"));
2943 buf->putBit(boolVar(*this, "DIMLIM"));
2944 buf->putBit(boolVar(*this, "DIMTIH"));
2945 buf->putBit(boolVar(*this, "DIMTOH"));
2946 buf->putBit(boolVar(*this, "DIMSE1"));
2947 buf->putBit(boolVar(*this, "DIMSE2"));
2948 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMTAD")));
2949 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMZIN")));
2950 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMAZIN")));
2951 if (version > DRW::AC1018) { // 2007+: DIMARCSYM (parseDwg:2083-2085)
2952 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMARCSYM")));
2953 }
2954 buf->putBitDouble(dblVar(*this, "DIMTXT", 0.18));
2955 buf->putBitDouble(dblVar(*this, "DIMCEN", 0.09));
2956 buf->putBitDouble(dblVar(*this, "DIMTSZ", 0.0));
2957 buf->putBitDouble(dblVar(*this, "DIMALTF", 25.4));
2958 buf->putBitDouble(dblVar(*this, "DIMLFAC", 1.0));
2959 buf->putBitDouble(dblVar(*this, "DIMTVP", 0.0));
2960 buf->putBitDouble(dblVar(*this, "DIMTFAC", 1.0));
2961 buf->putBitDouble(dblVar(*this, "DIMGAP", 0.09));
2962 // R2000+: DIMALTRND + 5 more DIM bits
2963 buf->putBitDouble(dblVar(*this, "DIMALTRND", 0.0));
2964 buf->putBit(boolVar(*this, "DIMALT"));
2965 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMALTD", 2)));
2966 buf->putBit(boolVar(*this, "DIMTOFL"));
2967 buf->putBit(boolVar(*this, "DIMSAH"));
2968 buf->putBit(boolVar(*this, "DIMTIX"));
2969 buf->putBit(boolVar(*this, "DIMSOXD"));
2970 // 3 CMC colors
2971 buf->putCmColor(version, static_cast<std::uint16_t>(intVar(*this, "DIMCLRD")));
2972 buf->putCmColor(version, static_cast<std::uint16_t>(intVar(*this, "DIMCLRE")));
2973 buf->putCmColor(version, static_cast<std::uint16_t>(intVar(*this, "DIMCLRT")));
2974 // R2000+ DIM BS family
2975 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMADEC")));
2976 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMDEC", 4)));
2977 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMTDEC", 4)));
2978 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMALTU", 2)));
2979 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMALTTD", 2)));
2980 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMAUNIT")));
2981 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMFRAC")));
2982 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMLUNIT", 2)));
2983 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMDSEP", '.')));
2984 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMTMOVE")));
2985 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMJUST")));
2986 buf->putBit(boolVar(*this, "DIMSD1"));
2987 buf->putBit(boolVar(*this, "DIMSD2"));
2988 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMTOLJ", 1)));
2989 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMTZIN")));
2990 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMALTZ")));
2991 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMALTTZ")));
2992 buf->putBit(boolVar(*this, "DIMUPT"));
2993 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMATFIT", 3)));
2994 if (version > DRW::AC1018) { // 2007+: DIMFXLON (parseDwg:2134-2136)
2995 buf->putBit(boolVar(*this, "DIMFXLON"));
2996 }
2997 if (version > DRW::AC1021) { // 2010+: DIMTXTDIRECTION, DIMALTMZF, DIMMZF (parseDwg:2137-2141)
2998 buf->putBit(boolVar(*this, "DIMTXTDIRECTION"));
2999 buf->putBitDouble(dblVar(*this, "DIMALTMZF", 1.0));
3000 buf->putBitDouble(dblVar(*this, "DIMMZF", 1.0));
3001 }
3002
3003 // -------- DIM handles (R2000+: 5 handles) (parseDwg:2139-2148) ----------
3004 hBbuf->putHandle(makeHardPtr(0)); // DIMTXSTY
3005 hBbuf->putHandle(makeHardPtr(0)); // DIMLDRBLK
3006 hBbuf->putHandle(makeHardPtr(0)); // DIMBLK
3007 hBbuf->putHandle(makeHardPtr(0)); // DIMBLK1
3008 hBbuf->putHandle(makeHardPtr(0)); // DIMBLK2
3009 if (version > DRW::AC1018) { // 2007+: DIMLTYPE, DIMLTEX1, DIMLTEX2 (parseDwg:2154-2160)
3010 hBbuf->putHandle(makeHardPtr(0)); // DIMLTYPE
3011 hBbuf->putHandle(makeHardPtr(0)); // DIMLTEX1
3012 hBbuf->putHandle(makeHardPtr(0)); // DIMLTEX2
3013 }
3014
3015 // -------- DIMLWD, DIMLWE (R2000+: 2 BS) (parseDwg:2159-2160) ------------
3016 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMLWD", -2)));
3017 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "DIMLWE", -2)));
3018
3019 // -------- Control-handle block (parseDwg:2162-2199, 12 or 13 handles) ---------
3020 // vpEntHeaderCtrl is R2000 and earlier only (parseDwg skips it for AC1018+).
3021 hBbuf->putHandle(makeHardPtr(blockCtrl)); // BLOCK_CONTROL (0x01)
3022 hBbuf->putHandle(makeHardPtr(layerCtrl)); // LAYER_CONTROL (0x02)
3023 hBbuf->putHandle(makeHardPtr(styleCtrl)); // STYLE_CONTROL (0x03)
3024 hBbuf->putHandle(makeHardPtr(linetypeCtrl)); // LTYPE_CONTROL (0x05)
3025 hBbuf->putHandle(makeHardPtr(viewCtrl)); // VIEW_CONTROL (0x06)
3026 hBbuf->putHandle(makeHardPtr(ucsCtrl)); // UCS_CONTROL (0x07)
3027 hBbuf->putHandle(makeHardPtr(vportCtrl)); // VPORT_CONTROL (0x08)
3028 hBbuf->putHandle(makeHardPtr(appidCtrl)); // APPID_CONTROL (0x09)
3029 hBbuf->putHandle(makeHardPtr(dimstyleCtrl)); // DIMSTYLE_CONTROL (0x0A)
3030 if (version < DRW::AC1018) { // R2000 and earlier only
3031 hBbuf->putHandle(makeHardPtr(vpEntHeaderCtrl)); // VPORT_ENTITY_HEADER_CONTROL (0x0B)
3032 }
3033 hBbuf->putHandle(makeSoftOwner(0)); // DICT ACAD_GROUP (Phase 3.5: 0x0D)
3034 hBbuf->putHandle(makeSoftOwner(0)); // DICT ACAD_MLINESTYLE (Phase 3.5: 0x0E)
3035 hBbuf->putHandle(makeSoftOwner(0)); // DICT NAMED OBJS (Phase 3.5: 0x0C)
3036
3037 // -------- Post-control TSTACKALIGN/TSTACKSIZE + 3 NOD-related dict handles
3038 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "TSTACKALIGN", 1)));
3039 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "TSTACKSIZE", 70)));
3040 if (version < DRW::AC1021) { // gated (parseDwg:2208-2211)
3041 buf->putCP8Text(strVar(*this, "HYPERLINKBASE"));
3042 buf->putCP8Text(strVar(*this, "STYLESHEET"));
3043 }
3044 hBbuf->putHandle(makeSoftOwner(0)); // DICT LAYOUTS (Phase 3.5)
3045 hBbuf->putHandle(makeSoftOwner(0)); // DICT PLOTSETTINGS (Phase 3.5)
3046 hBbuf->putHandle(makeSoftOwner(0)); // DICT PLOTSTYLES (Phase 3.5)
3047 if (version > DRW::AC1015) { // R2004+: 2 extra dict handles (parseDwg:2219-2223)
3048 hBbuf->putHandle(makeSoftOwner(0)); // DICT MATERIALS
3049 hBbuf->putHandle(makeSoftOwner(0)); // DICT COLORS
3050 }
3051 if (version > DRW::AC1018) { // 2007+: DICT VISUALSTYLE (parseDwg:2225-2228)
3052 hBbuf->putHandle(makeSoftOwner(0)); // DICT VISUALSTYLE
3053 }
3054 if (version > DRW::AC1024) { // 2013+: unknown handle (parseDwg:2229-2232)
3055 hBbuf->putHandle(makeSoftOwner(0));
3056 }
3057
3058 // -------- Flags (BL) + INSUNITS (BS) + CEPSNTYPE (BS) -------------------
3059 buf->putBitLong(0); // Flags — 8 sub-fields per parseDwg comment; defaults to 0
3060 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "INSUNITS")));
3061 std::uint16_t cepsntype = static_cast<std::uint16_t>(intVar(*this, "CEPSNTYPE"));
3062 buf->putBitShort(cepsntype);
3063 if (cepsntype == 3) {
3064 hBbuf->putHandle(makeHardPtr(0)); // CPSNID
3065 }
3066 if (version < DRW::AC1021) { // gated (parseDwg:2242-2245)
3067 buf->putCP8Text(strVar(*this, "FINGERPRINTGUID"));
3068 buf->putCP8Text(strVar(*this, "VERSIONGUID"));
3069 }
3070
3071 // -------- R2004+ RC/BS vars (parseDwg:2247-2261, version > AC1015) -------
3072 if (version > DRW::AC1015) {
3073 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "SORTENTS")));
3074 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "INDEXCTL")));
3075 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "HIDETEXT")));
3076 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "XCLIPFRAME")));
3077 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "DIMASSOC")));
3078 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "HALOGAP")));
3079 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "OBSCUREDCOLOR")));
3080 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "INTERSECTIONCOLOR")));
3081 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "OBSCUREDLTYPE")));
3082 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "INTERSECTIONDISPLAY")));
3083 if (version < DRW::AC1021) { // R2004 only (not R2007+)
3084 buf->putCP8Text(strVar(*this, "PROJECTNAME"));
3085 }
3086 }
3087
3088 // -------- 5 reserved-block handles (parseDwg:2262-2271) -----------------
3089 // PAPER_SPACE, MODEL_SPACE block headers + BYLAYER, BYBLOCK, CONTINUOUS
3090 // linetype records. Reserved handles 0x18, 0x17, 0x10, 0x0F, 0x11.
3091 hBbuf->putHandle(makeHardPtr(0x18)); // BLOCK PAPER_SPACE
3092 hBbuf->putHandle(makeHardPtr(0x17)); // BLOCK MODEL_SPACE
3093 hBbuf->putHandle(makeHardPtr(0x10)); // LTYPE BYLAYER
3094 hBbuf->putHandle(makeHardPtr(0x0F)); // LTYPE BYBLOCK
3095 hBbuf->putHandle(makeHardPtr(0x11)); // LTYPE CONTINUOUS
3096
3097 // -------- R2007+ extra vars (parseDwg:2272-2310, version > AC1018) -------
3098 if (version > DRW::AC1018) {
3099 buf->putBit(boolVar(*this, "CAMERADISPLAY"));
3100 buf->putBitLong(0); // unknown BL 1
3101 buf->putBitLong(0); // unknown BL 2
3102 buf->putBitDouble(0.0); // unknown BD
3103 buf->putBitDouble(dblVar(*this, "STEPSPERSEC", 2.0));
3104 buf->putBitDouble(dblVar(*this, "STEPSIZE", 6.0));
3105 buf->putBitDouble(dblVar(*this, "3DDWFPREC", 2.0));
3106 buf->putBitDouble(dblVar(*this, "LENSLENGTH", 50.0));
3107 buf->putBitDouble(dblVar(*this, "CAMERAHEIGHT", 0.0));
3108 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "SOLIDHIST", 1)));
3109 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "SHOWHIST", 1)));
3110 buf->putBitDouble(dblVar(*this, "PSOLWIDTH", 5.0));
3111 buf->putBitDouble(dblVar(*this, "PSOLHEIGHT", 80.0));
3112 buf->putBitDouble(dblVar(*this, "LOFTANG1", 1.5707963)); // pi/2
3113 buf->putBitDouble(dblVar(*this, "LOFTANG2", 1.5707963));
3114 buf->putBitDouble(dblVar(*this, "LOFTMAG1", 0.0));
3115 buf->putBitDouble(dblVar(*this, "LOFTMAG2", 0.0));
3116 buf->putBitShort(static_cast<std::uint16_t>(intVar(*this, "LOFTPARAM", 7)));
3117 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "LOFTNORMALS", 1)));
3118 buf->putBitDouble(dblVar(*this, "LATITUDE", 37.7950));
3119 buf->putBitDouble(dblVar(*this, "LONGITUDE", -122.394));
3120 buf->putBitDouble(dblVar(*this, "NORTHDIRECTION", 0.0));
3121 buf->putBitLong(static_cast<std::int32_t>(intVar(*this, "TIMEZONE", -8000)));
3122 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "LIGHTGLYPHDISPLAY", 1)));
3123 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "TILEMODELIGHTSYNCH", 1)));
3124 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "DWFFRAME")));
3125 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "DGNFRAME")));
3126 buf->putBit(0); // unknown B
3127 buf->putCmColor(version, static_cast<std::uint16_t>(intVar(*this, "INTERFERECOLOR", 1)));
3128 hBbuf->putHandle(makeHardPtr(0)); // INTERFEREOBJECT VS
3129 hBbuf->putHandle(makeHardPtr(0)); // INTERFEREVPVS
3130 hBbuf->putHandle(makeHardPtr(0)); // DRAGVS
3131 buf->putRawChar8(static_cast<std::uint8_t>(intVar(*this, "CSHADOW")));
3132 buf->putBitDouble(0.0); // unknown BD
3133 }
3134
3135 // -------- R14+ trailing 4 BS unknowns (parseDwg:2307-2312) --------------
3136 buf->putBitShort(0);
3137 buf->putBitShort(0);
3138 buf->putBitShort(0);
3139 buf->putBitShort(0);
3140
3141 // -------- R2007+ string stream (inverse of parseDwg:2329-2372) ----------
3142 // For R2007+ every header TV/TU string lives in a separate string stream,
3143 // read consecutively in field-schema order. Collect them here in that
3144 // exact order; dwgWriter assembles the [data][strings][footer] layout and
3145 // back-patches bitSize so the reader's backward scan finds them. Pre-2007
3146 // versions emit these inline above (gated version < AC1021).
3147 if (version > DRW::AC1018 && strBuf != nullptr) {
3148 strBuf->putUCSText(std::string()); // unknown text 1
3149 strBuf->putUCSText(std::string()); // unknown text 2
3150 strBuf->putUCSText(std::string()); // unknown text 3
3151 strBuf->putUCSText(std::string()); // unknown text 4
3152 strBuf->putUCSText(strVar(*this, "MENU"));
3153 strBuf->putUCSText(strVar(*this, "DIMPOST"));
3154 strBuf->putUCSText(strVar(*this, "DIMAPOST"));
3155 if (version > DRW::AC1021) { // 2010+
3156 strBuf->putUCSText(strVar(*this, "DIMALTMZS"));
3157 strBuf->putUCSText(strVar(*this, "DIMMZS"));
3158 }
3159 strBuf->putUCSText(strVar(*this, "HYPERLINKBASE"));
3160 strBuf->putUCSText(strVar(*this, "STYLESHEET"));
3161 strBuf->putUCSText(strVar(*this, "FINGERPRINTGUID"));
3162 strBuf->putUCSText(strVar(*this, "VERSIONGUID"));
3163 strBuf->putUCSText(strVar(*this, "PROJECTNAME"));
3164 }
3165
3166 return true;
3167}
3168
3169int DRW_Header::measurement(const int unit) {
3170 switch (unit) {
3171 case Units::Inch:
3172 case Units::Foot:
3173 case Units::Mile:
3174 case Units::Microinch:
3175 case Units::Mil:
3176 case Units::Yard:
3177 return Units::English;
3178
3179 default:
3180 break;
3181 }
3182
3183 return Units::Metric;
3184}