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