QGIS API Documentation  2.11.0-Master
qgsdxfexport.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsdxfexport.cpp
3  ----------------
4  begin : September 2013
5  copyright : (C) 2013 by Marco Hugentobler
6  email : marco at sourcepole dot ch
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 // Specs:
19 // AutoCAD 2000: http://www.autodesk.com/techpubs/autocad/acad2000/dxf/
20 // AutoCAD 2002: http://www.autodesk.com/techpubs/autocad/dxf/dxf2002.pdf
21 // AutoCAD 2004: http://atrey.karlin.mff.cuni.cz/projekty/vrr/doc/dxf14.pdf
22 // AutoCAD 2006: http://images.autodesk.com/adsk/files/dxf_format.pdf
23 // AutoCAD 2008: http://images.autodesk.com/adsk/files/acad_dxf0.pdf
24 // AutoCAD 2009: http://images.autodesk.com/adsk/files/acad_dxf.pdf
25 // AutoCAD 2011: http://images.autodesk.com/adsk/files/acad_dxf2.pdf
26 // AutoCAD 2012: http://images.autodesk.com/adsk/files/autocad_2012_pdf_dxf-reference_enu.pdf
27 // AutoCAD 2014: http://images.autodesk.com/adsk/files/autocad_2014_pdf_dxf_reference_enu.pdf
28 
29 #include "qgsdxfexport.h"
30 #include "qgsdxfpallabeling.h"
31 #include "qgsvectordataprovider.h"
32 #include "qgspoint.h"
33 #include "qgsrendererv2.h"
34 #include "qgssymbollayerv2.h"
35 #include "qgsfillsymbollayerv2.h"
36 #include "qgslinesymbollayerv2.h"
37 #include "qgsvectorlayer.h"
38 #include "qgsmaplayerregistry.h"
39 
40 #include <QIODevice>
41 
42 #define DXF_HANDSEED 100
43 #define DXF_HANDMAX 9999999
44 #define DXF_HANDPLOTSTYLE 0xf
45 
46 // dxf color palette
47 int QgsDxfExport::mDxfColors[][3] =
48 {
49  { 255, 255, 255 },
50  { 255, 0, 0 },
51  { 255, 255, 0 },
52  { 0, 255, 0 },
53  { 0, 255, 255 },
54  { 0, 0, 255 },
55  { 255, 0, 255 },
56  { 0, 0, 0 },
57  { 128, 128, 128 },
58  { 192, 192, 192 },
59  { 255, 0, 0 },
60  { 255, 127, 127 },
61  { 204, 0, 0 },
62  { 204, 102, 102 },
63  { 153, 0, 0 },
64  { 153, 76, 76 },
65  { 127, 0, 0 },
66  { 127, 63, 63 },
67  { 76, 0, 0 },
68  { 76, 38, 38 },
69  { 255, 63, 0 },
70  { 255, 159, 127 },
71  { 204, 51, 0 },
72  { 204, 127, 102 },
73  { 153, 38, 0 },
74  { 153, 95, 76 },
75  { 127, 31, 0 },
76  { 127, 79, 63 },
77  { 76, 19, 0 },
78  { 76, 47, 38 },
79  { 255, 127, 0 },
80  { 255, 191, 127 },
81  { 204, 102, 0 },
82  { 204, 153, 102 },
83  { 153, 76, 0 },
84  { 153, 114, 76 },
85  { 127, 63, 0 },
86  { 127, 95, 63 },
87  { 76, 38, 0 },
88  { 76, 57, 38 },
89  { 255, 191, 0 },
90  { 255, 223, 127 },
91  { 204, 153, 0 },
92  { 204, 178, 102 },
93  { 153, 114, 0 },
94  { 153, 133, 76 },
95  { 127, 95, 0 },
96  { 127, 111, 63 },
97  { 76, 57, 0 },
98  { 76, 66, 38 },
99  { 255, 255, 0 },
100  { 255, 255, 127 },
101  { 204, 204, 0 },
102  { 204, 204, 102 },
103  { 153, 153, 0 },
104  { 153, 153, 76 },
105  { 127, 127, 0 },
106  { 127, 127, 63 },
107  { 76, 76, 0 },
108  { 76, 76, 38 },
109  { 191, 255, 0 },
110  { 223, 255, 127 },
111  { 153, 204, 0 },
112  { 178, 204, 102 },
113  { 114, 153, 0 },
114  { 133, 153, 76 },
115  { 95, 127, 0 },
116  { 111, 127, 63 },
117  { 57, 76, 0 },
118  { 66, 76, 38 },
119  { 127, 255, 0 },
120  { 191, 255, 127 },
121  { 102, 204, 0 },
122  { 153, 204, 102 },
123  { 76, 153, 0 },
124  { 114, 153, 76 },
125  { 63, 127, 0 },
126  { 95, 127, 63 },
127  { 38, 76, 0 },
128  { 57, 76, 38 },
129  { 63, 255, 0 },
130  { 159, 255, 127 },
131  { 51, 204, 0 },
132  { 127, 204, 102 },
133  { 38, 153, 0 },
134  { 95, 153, 76 },
135  { 31, 127, 0 },
136  { 79, 127, 63 },
137  { 19, 76, 0 },
138  { 47, 76, 38 },
139  { 0, 255, 0 },
140  { 127, 255, 127 },
141  { 0, 204, 0 },
142  { 102, 204, 102 },
143  { 0, 153, 0 },
144  { 76, 153, 76 },
145  { 0, 127, 0 },
146  { 63, 127, 63 },
147  { 0, 76, 0 },
148  { 38, 76, 38 },
149  { 0, 255, 63 },
150  { 127, 255, 159 },
151  { 0, 204, 51 },
152  { 102, 204, 127 },
153  { 0, 153, 38 },
154  { 76, 153, 95 },
155  { 0, 127, 31 },
156  { 63, 127, 79 },
157  { 0, 76, 19 },
158  { 38, 76, 47 },
159  { 0, 255, 127 },
160  { 127, 255, 191 },
161  { 0, 204, 102 },
162  { 102, 204, 153 },
163  { 0, 153, 76 },
164  { 76, 153, 114 },
165  { 0, 127, 63 },
166  { 63, 127, 95 },
167  { 0, 76, 38 },
168  { 38, 76, 57 },
169  { 0, 255, 191 },
170  { 127, 255, 223 },
171  { 0, 204, 153 },
172  { 102, 204, 178 },
173  { 0, 153, 114 },
174  { 76, 153, 133 },
175  { 0, 127, 95 },
176  { 63, 127, 111 },
177  { 0, 76, 57 },
178  { 38, 76, 66 },
179  { 0, 255, 255 },
180  { 127, 255, 255 },
181  { 0, 204, 204 },
182  { 102, 204, 204 },
183  { 0, 153, 153 },
184  { 76, 153, 153 },
185  { 0, 127, 127 },
186  { 63, 127, 127 },
187  { 0, 76, 76 },
188  { 38, 76, 76 },
189  { 0, 191, 255 },
190  { 127, 223, 255 },
191  { 0, 153, 204 },
192  { 102, 178, 204 },
193  { 0, 114, 153 },
194  { 76, 133, 153 },
195  { 0, 95, 127 },
196  { 63, 111, 127 },
197  { 0, 57, 76 },
198  { 38, 66, 76 },
199  { 0, 127, 255 },
200  { 127, 191, 255 },
201  { 0, 102, 204 },
202  { 102, 153, 204 },
203  { 0, 76, 153 },
204  { 76, 114, 153 },
205  { 0, 63, 127 },
206  { 63, 95, 127 },
207  { 0, 38, 76 },
208  { 38, 57, 76 },
209  { 0, 63, 255 },
210  { 127, 159, 255 },
211  { 0, 51, 204 },
212  { 102, 127, 204 },
213  { 0, 38, 153 },
214  { 76, 95, 153 },
215  { 0, 31, 127 },
216  { 63, 79, 127 },
217  { 0, 19, 76 },
218  { 38, 47, 76 },
219  { 0, 0, 255 },
220  { 127, 127, 255 },
221  { 0, 0, 204 },
222  { 102, 102, 204 },
223  { 0, 0, 153 },
224  { 76, 76, 153 },
225  { 0, 0, 127 },
226  { 63, 63, 127 },
227  { 0, 0, 76 },
228  { 38, 38, 76 },
229  { 63, 0, 255 },
230  { 159, 127, 255 },
231  { 51, 0, 204 },
232  { 127, 102, 204 },
233  { 38, 0, 153 },
234  { 95, 76, 153 },
235  { 31, 0, 127 },
236  { 79, 63, 127 },
237  { 19, 0, 76 },
238  { 47, 38, 76 },
239  { 127, 0, 255 },
240  { 191, 127, 255 },
241  { 102, 0, 204 },
242  { 153, 102, 204 },
243  { 76, 0, 153 },
244  { 114, 76, 153 },
245  { 63, 0, 127 },
246  { 95, 63, 127 },
247  { 38, 0, 76 },
248  { 57, 38, 76 },
249  { 191, 0, 255 },
250  { 223, 127, 255 },
251  { 153, 0, 204 },
252  { 178, 102, 204 },
253  { 114, 0, 153 },
254  { 133, 76, 153 },
255  { 95, 0, 127 },
256  { 111, 63, 127 },
257  { 57, 0, 76 },
258  { 66, 38, 76 },
259  { 255, 0, 255 },
260  { 255, 127, 255 },
261  { 204, 0, 204 },
262  { 204, 102, 204 },
263  { 153, 0, 153 },
264  { 153, 76, 153 },
265  { 127, 0, 127 },
266  { 127, 63, 127 },
267  { 76, 0, 76 },
268  { 76, 38, 76 },
269  { 255, 0, 191 },
270  { 255, 127, 223 },
271  { 204, 0, 153 },
272  { 204, 102, 178 },
273  { 153, 0, 114 },
274  { 153, 76, 133 },
275  { 127, 0, 95 },
276  { 127, 63, 111 },
277  { 76, 0, 57 },
278  { 76, 38, 66 },
279  { 255, 0, 127 },
280  { 255, 127, 191 },
281  { 204, 0, 102 },
282  { 204, 102, 153 },
283  { 153, 0, 76 },
284  { 153, 76, 114 },
285  { 127, 0, 63 },
286  { 127, 63, 95 },
287  { 76, 0, 38 },
288  { 76, 38, 57 },
289  { 255, 0, 63 },
290  { 255, 127, 159 },
291  { 204, 0, 51 },
292  { 204, 102, 127 },
293  { 153, 0, 38 },
294  { 153, 76, 95 },
295  { 127, 0, 31 },
296  { 127, 63, 79 },
297  { 76, 0, 19 },
298  { 76, 38, 47 },
299  { 51, 51, 51 },
300  { 91, 91, 91 },
301  { 132, 132, 132 },
302  { 173, 173, 173 },
303  { 214, 214, 214 },
304  { 255, 255, 255 },
305 };
306 
307 const char *QgsDxfExport::mDxfEncodings[][2] =
308 {
309  { "ASCII", "" },
310  { "8859_1", "ISO-8859-1" },
311  { "8859_2", "ISO-8859-2" },
312  { "8859_3", "ISO-8859-3" },
313  { "8859_4", "ISO-8859-4" },
314  { "8859_5", "ISO-8859-5" },
315  { "8859_6", "ISO-8859-6" },
316  { "8859_7", "ISO-8859-7" },
317  { "8859_8", "ISO-8859-8" },
318  { "8859_9", "ISO-8859-9" },
319 // { "DOS437", "" },
320  { "DOS850", "CP850" },
321 // { "DOS852", "" },
322 // { "DOS855", "" },
323 // { "DOS857", "" },
324 // { "DOS860", "" },
325 // { "DOS861", "" },
326 // { "DOS863", "" },
327 // { "DOS864", "" },
328 // { "DOS865", "" },
329 // { "DOS869", "" },
330 // { "DOS932", "" },
331  { "MACINTOSH", "MacRoman" },
332  { "BIG5", "Big5" },
333  { "KSC5601", "ksc5601.1987-0" },
334 // { "JOHAB", "" },
335  { "DOS866", "CP866" },
336  { "ANSI_1250", "CP1250" },
337  { "ANSI_1251", "CP1251" },
338  { "ANSI_1252", "CP1252" },
339  { "GB2312", "GB2312" },
340  { "ANSI_1253", "CP1253" },
341  { "ANSI_1254", "CP1254" },
342  { "ANSI_1255", "CP1255" },
343  { "ANSI_1256", "CP1256" },
344  { "ANSI_1257", "CP1257" },
345  { "ANSI_874", "CP874" },
346  { "ANSI_932", "Shift_JIS" },
347  { "ANSI_936", "CP936" },
348  { "ANSI_949", "cp949" },
349  { "ANSI_950", "CP950" },
350 // { "ANSI_1361", "" },
351 // { "ANSI_1200", "" },
352  { "ANSI_1258", "CP1258" },
353 };
354 
356  : mSymbologyScaleDenominator( 1.0 )
357  , mSymbologyExport( NoSymbology )
358  , mMapUnits( QGis::Meters )
359  , mSymbolLayerCounter( 0 )
360  , mNextHandleId( DXF_HANDSEED )
361  , mBlockCounter( 0 )
362 {
363 }
364 
366 {
367  *this = dxfExport;
368 }
369 
371 {
372  mLayers = dxfExport.mLayers;
373  mSymbologyScaleDenominator = dxfExport.mSymbologyScaleDenominator;
374  mSymbologyExport = dxfExport.mSymbologyExport;
375  mMapUnits = dxfExport.mMapUnits;
376  mSymbolLayerCounter = 0; // internal counter
377  mNextHandleId = 0;
378  mBlockCounter = 0;
379  return *this;
380 }
381 
383 {
384 }
385 
387 {
388  mLayers = layers;
389 }
390 
391 void QgsDxfExport::writeGroup( int code, int i )
392 {
393  writeGroupCode( code );
394  writeInt( i );
395 }
396 
397 void QgsDxfExport::writeGroup( int code, double d )
398 {
399  writeGroupCode( code );
400  writeDouble( d );
401 }
402 
403 void QgsDxfExport::writeGroup( int code, const QString& s )
404 {
405  writeGroupCode( code );
406  writeString( s );
407 }
408 
409 void QgsDxfExport::writeGroup( int code, const QgsPoint &p, double z, bool skipz )
410 {
411  writeGroup( code + 10, p.x() );
412  writeGroup( code + 20, p.y() );
413  if ( !skipz )
414  writeGroup( code + 30, z );
415 }
416 
417 void QgsDxfExport::writeGroup( QColor color, int exactMatchCode, int rgbCode, int transparencyCode )
418 {
419  int minDistAt = -1;
420  int minDist = INT_MAX;
421 
422  for ( int i = 1; i < ( int )( sizeof( mDxfColors ) / sizeof( *mDxfColors ) ) && minDist > 0; ++i )
423  {
424  int dist = color_distance( color.rgba(), i );
425  if ( dist >= minDist )
426  continue;
427 
428  minDistAt = i;
429  minDist = dist;
430  }
431 
432  if ( minDist == 0 && color.alpha() == 255 && minDistAt != 7 )
433  {
434  // exact full opaque match, not black/white
435  writeGroup( exactMatchCode, minDistAt );
436  return;
437  }
438 
439  int c = ( color.red() & 0xff ) * 0x10000 + ( color.green() & 0xff ) * 0x100 + ( color.blue() & 0xff );
440  writeGroup( rgbCode, c );
441  if ( transparencyCode != -1 && color.alpha() < 255 )
442  writeGroup( transparencyCode, 0x2000000 | color.alpha() );
443 }
444 
446 {
447  mTextStream << QString( "%1\n" ).arg( code, 3, 10, QChar( ' ' ) );
448 }
449 
451 {
452  mTextStream << QString( "%1\n" ).arg( i, 6, 10, QChar( ' ' ) );
453 }
454 
456 {
457  QString s( qgsDoubleToString( d ) );
458  if ( !s.contains( "." ) )
459  s += ".0";
460  mTextStream << s << "\n";
461 }
462 
464 {
465  mTextStream << s << "\n";
466 }
467 
469 {
470  if ( !d )
471  {
472  return 1;
473  }
474 
475  if ( !d->isOpen() && !d->open( QIODevice::WriteOnly ) )
476  {
477  return 2;
478  }
479 
480  mTextStream.setDevice( d );
481  mTextStream.setCodec( encoding.toLocal8Bit() );
482 
483  writeHeader( dxfEncoding( encoding ) );
484  writeTables();
485  writeBlocks();
486  writeEntities();
487  writeEndFile();
488 
489  return 0;
490 }
491 
492 void QgsDxfExport::writeHeader( QString codepage )
493 {
494  writeGroup( 999, "DXF created from QGIS" );
495 
496  startSection();
497  writeGroup( 2, "HEADER" );
498 
499  // ACADVER
500  writeGroup( 9, "$ACADVER" );
501  writeGroup( 1, "AC1015" );
502 
503  QgsRectangle ext( mExtent.isEmpty() ? dxfExtent() : mExtent );
504  if ( !ext.isEmpty() )
505  {
506  // EXTMIN
507  writeGroup( 9, "$EXTMIN" );
508  writeGroup( 0, QgsPoint( ext.xMinimum(), ext.yMinimum() ) );
509 
510  // EXTMAX
511  writeGroup( 9, "$EXTMAX" );
512  writeGroup( 0, QgsPoint( ext.xMaximum(), ext.yMaximum() ) );
513  }
514 
515  // Global linetype scale
516  writeGroup( 9, "$LTSCALE" );
517  writeGroup( 40, 1.0 );
518 
519  // Point display mode (33 = circle)
520  writeGroup( 9, "$PDMODE" );
521  writeGroup( 70, 33 );
522 
523  // Point display size
524  writeGroup( 9, "$PDSIZE" );
525  writeGroup( 40, 1 );
526 
527  // Controls paper space linetype scaling (1 = No special linetype scaling, 0 = Viewport scaling governs linetype scaling)
528  writeGroup( 9, "$PSLTSCALE" );
529  writeGroup( 70, 0 );
530 
531  writeGroup( 9, "$HANDSEED" );
532  writeGroup( 5, DXF_HANDMAX );
533 
534  writeGroup( 9, "$DWGCODEPAGE" );
535  writeGroup( 3, codepage );
536 
537  endSection();
538 }
539 
540 int QgsDxfExport::writeHandle( int code, int handle )
541 {
542  if ( handle == 0 )
543  handle = mNextHandleId++;
544 
545  Q_ASSERT_X( handle < DXF_HANDMAX, "QgsDxfExport::writeHandle(int, int)", "DXF handle too large" );
546 
547  writeGroup( code, QString( "%1" ).arg( handle, 0, 16 ) );
548  return handle;
549 }
550 
551 void QgsDxfExport::writeTables()
552 {
553  startSection();
554  writeGroup( 2, "TABLES" );
555 
556  // Iterate through all layers and get symbol layer pointers
557  QgsRenderContext context = renderContext();
559  if ( mSymbologyExport != NoSymbology )
560  {
561  slList = symbolLayers( context );
562  }
563 
564  // Line types
565  mLineStyles.clear();
566  writeGroup( 0, "TABLE" );
567  writeGroup( 2, "LTYPE" );
568  writeHandle();
569  writeGroup( 100, "AcDbSymbolTable" );
570  writeGroup( 70, nLineTypes( slList ) + 5 );
571 
572  writeDefaultLinetypes();
573 
574  // Add custom linestyles
575  QList< QPair< QgsSymbolLayerV2*, QgsSymbolV2*> >::const_iterator slIt = slList.constBegin();
576  for ( ; slIt != slList.constEnd(); ++slIt )
577  {
578  writeSymbolLayerLinetype( slIt->first );
579  }
580 
581  writeGroup( 0, "ENDTAB" );
582 
583  // BLOCK_RECORD
584  writeGroup( 0, "TABLE" );
585  writeGroup( 2, "BLOCK_RECORD" );
586  writeHandle();
587 
588  writeGroup( 100, "AcDbSymbolTable" );
589  writeGroup( 70, 0 );
590 
591  foreach ( QString block, QStringList() << "*Model_Space" << "*Paper_Space" << "*Paper_Space0" )
592  {
593  writeGroup( 0, "BLOCK_RECORD" );
594  mBlockHandles.insert( block, writeHandle() );
595  writeGroup( 100, "AcDbSymbolTableRecord" );
596  writeGroup( 100, "AcDbBlockTableRecord" );
597  writeGroup( 2, block );
598  }
599 
600  int i = 0;
601  slIt = slList.constBegin();
602  for ( ; slIt != slList.constEnd(); ++slIt )
603  {
604  QgsMarkerSymbolLayerV2 *ml = dynamic_cast< QgsMarkerSymbolLayerV2*>( slIt->first );
605  if ( !ml )
606  continue;
607 
608  if ( hasDataDefinedProperties( ml, slIt->second ) )
609  continue;
610 
611  QString name = QString( "symbolLayer%1" ).arg( i++ );
612  writeGroup( 0, "BLOCK_RECORD" );
613  mBlockHandles.insert( name, writeHandle() );
614  writeGroup( 100, "AcDbSymbolTableRecord" );
615  writeGroup( 100, "AcDbBlockTableRecord" );
616  writeGroup( 2, name );
617  }
618 
619  writeGroup( 0, "ENDTAB" );
620 
621  // APPID
622  writeGroup( 0, "TABLE" );
623  writeGroup( 2, "APPID" );
624  writeHandle();
625  writeGroup( 100, "AcDbSymbolTable" );
626  writeGroup( 70, 1 );
627  writeGroup( 0, "APPID" );
628  writeHandle();
629  writeGroup( 100, "AcDbSymbolTableRecord" );
630  writeGroup( 100, "AcDbRegAppTableRecord" );
631  writeGroup( 2, "ACAD" );
632  writeGroup( 70, 0 );
633  writeGroup( 0, "ENDTAB" );
634 
635  // VIEW
636  writeGroup( 0, "TABLE" );
637  writeGroup( 2, "VIEW" );
638  writeHandle();
639  writeGroup( 100, "AcDbSymbolTable" );
640  writeGroup( 70, 0 );
641  writeGroup( 0, "ENDTAB" );
642 
643  // UCS
644  writeGroup( 0, "TABLE" );
645  writeGroup( 2, "UCS" );
646  writeHandle();
647  writeGroup( 100, "AcDbSymbolTable" );
648  writeGroup( 70, 0 );
649  writeGroup( 0, "ENDTAB" );
650 
651  // VPORT
652  writeGroup( 0, "TABLE" );
653  writeGroup( 2, "VPORT" );
654  writeHandle();
655  writeGroup( 100, "AcDbSymbolTable" );
656 
657  QgsRectangle ext( mExtent.isEmpty() ? dxfExtent() : mExtent );
658 
659  writeGroup( 0, "VPORT" );
660  writeHandle();
661  writeGroup( 100, "AcDbSymbolTableRecord" );
662  writeGroup( 100, "AcDbViewportTableRecord" );
663  writeGroup( 2, "*ACTIVE" );
664  writeGroup( 70, 0 ); // flags
665  writeGroup( 0, QgsPoint( 0.0, 0.0 ), 0.0, true ); // lower left
666  writeGroup( 1, QgsPoint( 1.0, 1.0 ), 0.0, true ); // upper right
667  writeGroup( 2, QgsPoint( 0.0, 0.0 ), 0.0, true ); // view center point
668  writeGroup( 3, QgsPoint( 0.0, 0.0 ), 0.0, true ); // snap base point
669  writeGroup( 4, QgsPoint( 1.0, 1.0 ), 0.0, true ); // snap spacing
670  writeGroup( 5, QgsPoint( 1.0, 1.0 ), 0.0, true ); // grid spacing
671  writeGroup( 6, QgsPoint( 0.0, 0.0 ), 1.0 ); // view direction from target point
672  writeGroup( 7, ext.center(), 0.0, true ); // view target point
673  writeGroup( 40, ext.height() ); // view height
674  writeGroup( 41, ext.width() / ext.height() ); // view aspect ratio
675  writeGroup( 42, 50.0 ); // lens length
676  writeGroup( 43, 0.0 ); // front clipping plane
677  writeGroup( 44, 0.0 ); // back clipping plane
678  writeGroup( 50, 0.0 ); // snap rotation
679  writeGroup( 51, 0.0 ); // view twist angle
680  writeGroup( 71, 0 ); // view mode (0 = deactivates)
681  writeGroup( 72, 100 ); // circle zoom percent
682  writeGroup( 73, 1 ); // fast zoom setting
683  writeGroup( 74, 1 ); // UCSICON setting
684  writeGroup( 75, 0 ); // snapping off
685  writeGroup( 76, 0 ); // grid off
686  writeGroup( 77, 0 ); // snap style
687  writeGroup( 78, 0 ); // snap isopair
688  writeGroup( 281, 0 ); // render mode (0 = 2D optimized)
689  writeGroup( 65, 1 ); // value of UCSVP for this viewport
690  writeGroup( 100, QgsPoint( 0.0, 0.0 ) ); // UCS origin
691  writeGroup( 101, QgsPoint( 1.0, 0.0 ) ); // UCS x axis
692  writeGroup( 102, QgsPoint( 0.0, 1.0 ) ); // UCS y axis
693  writeGroup( 79, 0 ); // Orthographic type of UCS (0 = UCS is not orthographic)
694  writeGroup( 146, 0.0 ); // Elevation
695 
696  writeGroup( 70, 0 );
697  writeGroup( 0, "ENDTAB" );
698 
699  // DIMSTYLE
700  writeGroup( 0, "TABLE" );
701  writeGroup( 2, "DIMSTYLE" );
702  writeHandle();
703  writeGroup( 100, "AcDbSymbolTable" );
704  writeGroup( 100, "AcDbDimStyleTable" );
705  writeGroup( 70, 0 );
706  writeGroup( 0, "ENDTAB" );
707 
708  QList< QPair<QgsVectorLayer*, int> >::const_iterator layerIt = mLayers.constBegin();
709  QSet<QString> layerNames;
710  for ( ; layerIt != mLayers.constEnd(); ++layerIt )
711  {
712  if ( !layerIsScaleBasedVisible( layerIt->first ) )
713  continue;
714 
715  if ( layerIt->first )
716  {
717  if ( layerIt->second < 0 )
718  {
719  layerNames << dxfLayerName( layerIt->first->name() );
720  }
721  else
722  {
723  QList<QVariant> values;
724  layerIt->first->uniqueValues( layerIt->second, values );
725  foreach ( QVariant v, values )
726  {
727  layerNames << dxfLayerName( v.toString() );
728  }
729  }
730  }
731  }
732 
733  // Layers
734  // TODO: iterate features of all layer to produce a data-defined layer list
735  writeGroup( 0, "TABLE" );
736  writeGroup( 2, "LAYER" );
737  writeHandle();
738  writeGroup( 100, "AcDbSymbolTable" );
739  writeGroup( 70, layerNames.size() + 1 );
740 
741  writeGroup( 0, "LAYER" );
742  writeHandle();
743  writeGroup( 100, "AcDbSymbolTableRecord" );
744  writeGroup( 100, "AcDbLayerTableRecord" );
745  writeGroup( 2, "0" );
746  writeGroup( 70, 64 );
747  writeGroup( 62, 1 );
748  writeGroup( 6, "CONTINUOUS" );
750 
751  foreach ( QString layerName, layerNames )
752  {
753  writeGroup( 0, "LAYER" );
754  writeHandle();
755  writeGroup( 100, "AcDbSymbolTableRecord" );
756  writeGroup( 100, "AcDbLayerTableRecord" );
757  writeGroup( 2, layerName );
758  writeGroup( 70, 64 );
759  writeGroup( 62, 1 );
760  writeGroup( 6, "CONTINUOUS" );
762  }
763  writeGroup( 0, "ENDTAB" );
764 
765  // Text styles
766  writeGroup( 0, "TABLE" );
767  writeGroup( 2, "STYLE" );
768  writeHandle();
769  writeGroup( 100, "AcDbSymbolTable" );
770  writeGroup( 70, 1 );
771 
772  // Provide only standard font for the moment
773  writeGroup( 0, "STYLE" );
774  writeHandle();
775  writeGroup( 100, "AcDbSymbolTableRecord" );
776  writeGroup( 100, "AcDbTextStyleTableRecord" );
777  writeGroup( 2, "STANDARD" );
778  writeGroup( 70, 64 );
779  writeGroup( 40, 0.0 );
780  writeGroup( 41, 1.0 );
781  writeGroup( 50, 0.0 );
782  writeGroup( 71, 0 );
783  writeGroup( 42, 5.0 );
784  writeGroup( 3, "romans.shx" );
785  writeGroup( 4, "" );
786 
787  writeGroup( 0, "ENDTAB" );
788 
789  endSection();
790 }
791 
792 void QgsDxfExport::writeBlocks()
793 {
794  startSection();
795  writeGroup( 2, "BLOCKS" );
796 
797  foreach ( QString block, QStringList() << "*Model_Space" << "*Paper_Space" << "*Paper_Space0" )
798  {
799  writeGroup( 0, "BLOCK" );
800  writeHandle();
801  writeGroup( 330, QString( "%1" ).arg( mBlockHandles[ block ], 0, 16 ) );
802  writeGroup( 100, "AcDbEntity" );
803  writeGroup( 8, "0" );
804  writeGroup( 100, "AcDbBlockBegin" );
805  writeGroup( 2, block );
806  writeGroup( 70, 0 );
807  writeGroup( 0, QgsPoint( 0.0, 0.0 ) );
808  writeGroup( 3, block );
809  writeGroup( 1, "" );
810  writeGroup( 0, "ENDBLK" );
811  writeHandle();
812  writeGroup( 100, "AcDbEntity" );
813  writeGroup( 8, "0" );
814  writeGroup( 100, "AcDbBlockEnd" );
815  }
816 
817  QgsRenderContext ct = renderContext();
818 
819  // Iterate through all layers and get symbol layer pointers
821  if ( mSymbologyExport != NoSymbology )
822  {
823  slList = symbolLayers( ct );
824  }
825 
826  QList< QPair< QgsSymbolLayerV2*, QgsSymbolV2* > >::const_iterator slIt = slList.constBegin();
827  for ( ; slIt != slList.constEnd(); ++slIt )
828  {
829  QgsMarkerSymbolLayerV2 *ml = dynamic_cast< QgsMarkerSymbolLayerV2*>( slIt->first );
830  if ( !ml )
831  continue;
832 
833  // if point symbol layer and no data defined properties: write block
834  QgsSymbolV2RenderContext ctx( ct, QgsSymbolV2::MapUnit, slIt->second->alpha(), false, slIt->second->renderHints(), 0 );
835  ml->startRender( ctx );
836 
837  // markers with data defined properties are inserted inline
838  if ( hasDataDefinedProperties( ml, slIt->second ) )
839  {
840  continue;
841  // ml->stopRender( ctx );
842  }
843 
844  QString block( QString( "symbolLayer%1" ).arg( mBlockCounter++ ) );
845  mBlockHandle = QString( "%1" ).arg( mBlockHandles[ block ], 0, 16 );
846 
847  writeGroup( 0, "BLOCK" );
848  writeHandle();
849  writeGroup( 330, mBlockHandle );
850  writeGroup( 100, "AcDbEntity" );
851  writeGroup( 8, "0" );
852  writeGroup( 100, "AcDbBlockBegin" );
853  writeGroup( 2, block );
854  writeGroup( 70, 0 );
855 
856  // x/y/z coordinates of reference point
857  // todo: consider anchor point
858  // double size = ml->size();
859  // size *= mapUnitScaleFactor( mSymbologyScaleDenominator, ml->sizeUnit(), mMapUnits );
860  writeGroup( 0, QgsPoint( 0.0, 0.0 ) );
861  writeGroup( 3, block );
862  writeGroup( 1, "" );
863 
864  // maplayer 0 -> block receives layer from INSERT statement
865  ml->writeDxf( *this, mapUnitScaleFactor( mSymbologyScaleDenominator, ml->sizeUnit(), mMapUnits ), "0", &ctx, 0 );
866 
867  writeGroup( 0, "ENDBLK" );
868  writeHandle();
869  writeGroup( 100, "AcDbEntity" );
870  writeGroup( 8, "0" );
871  writeGroup( 100, "AcDbBlockEnd" );
872 
873  mPointSymbolBlocks.insert( ml, block );
874  ml->stopRender( ctx );
875  }
876  endSection();
877 }
878 
879 void QgsDxfExport::writeEntities()
880 {
881  startSection();
882  writeGroup( 2, "ENTITIES" );
883 
884  mBlockHandle = QString( "%1" ).arg( mBlockHandles[ "*Model_Space" ], 0, 16 );
885 
886  // label engine
887  QgsDxfPalLabeling labelEngine( this, mExtent.isEmpty() ? dxfExtent() : mExtent, mSymbologyScaleDenominator, mMapUnits );
888  QgsRenderContext& ctx = labelEngine.renderContext();
889 
890  // iterate through the maplayers
891  QList< QPair< QgsVectorLayer*, int > >::iterator layerIt = mLayers.begin();
892  for ( ; layerIt != mLayers.end(); ++layerIt )
893  {
894  QgsVectorLayer* vl = layerIt->first;
895  if ( !vl || !layerIsScaleBasedVisible( vl ) )
896  {
897  continue;
898  }
899 
900  QgsSymbolV2RenderContext sctx( ctx, QgsSymbolV2::MM, 1.0, false, 0, 0 );
901  QgsFeatureRendererV2* renderer = vl->rendererV2();
902  if ( !renderer )
903  {
904  continue;
905  }
906  renderer->startRender( ctx, vl->fields() );
907 
908  QStringList attributes = renderer->usedAttributes();
909  if ( vl->fields().exists( layerIt->second ) )
910  {
911  QString layerAttr = vl->fields().at( layerIt->second ).name();
912  if ( !attributes.contains( layerAttr ) )
913  attributes << layerAttr;
914  }
915 
916  bool labelLayer = labelEngine.prepareLayer( vl, attributes, ctx ) != 0;
917 
918  if ( mSymbologyExport == QgsDxfExport::SymbolLayerSymbology &&
920  renderer->usingSymbolLevels() )
921  {
922  writeEntitiesSymbolLevels( vl );
923  renderer->stopRender( ctx );
924  continue;
925  }
926 
927  QgsFeatureRequest freq = QgsFeatureRequest().setSubsetOfAttributes( attributes, vl->fields() );
928  if ( !mExtent.isEmpty() )
929  {
930  freq.setFilterRect( mExtent );
931  }
932 
933  QgsFeatureIterator featureIt = vl->getFeatures( freq );
934  QgsFeature fet;
935  while ( featureIt.nextFeature( fet ) )
936  {
937  ctx.expressionContext().setFeature( fet );
938  QString layerName( dxfLayerName( layerIt->second == -1 ? vl->name() : fet.attribute( layerIt->second ).toString() ) );
939 
940  sctx.setFeature( &fet );
941  if ( mSymbologyExport == NoSymbology )
942  {
943  addFeature( sctx, layerName, 0, 0 ); // no symbology at all
944  }
945  else
946  {
947  QgsSymbolV2List symbolList = renderer->symbolsForFeature( fet, ctx );
948  if ( symbolList.size() < 1 )
949  {
950  continue;
951  }
952 
953  if ( mSymbologyExport == QgsDxfExport::SymbolLayerSymbology ) // symbol layer symbology, but layer does not use symbol levels
954  {
955  QgsSymbolV2List::iterator symbolIt = symbolList.begin();
956  for ( ; symbolIt != symbolList.end(); ++symbolIt )
957  {
958  int nSymbolLayers = ( *symbolIt )->symbolLayerCount();
959  for ( int i = 0; i < nSymbolLayers; ++i )
960  {
961  addFeature( sctx, layerName, ( *symbolIt )->symbolLayer( i ), *symbolIt );
962  }
963  }
964  }
965  else
966  {
967  // take first symbollayer from first symbol
968  QgsSymbolV2* s = symbolList.first();
969  if ( !s || s->symbolLayerCount() < 1 )
970  {
971  continue;
972  }
973  addFeature( sctx, layerName, s->symbolLayer( 0 ), s );
974  }
975 
976  if ( labelLayer )
977  {
978  labelEngine.registerFeature( vl->id(), fet, ctx, layerName );
979  }
980  }
981  }
982 
983  renderer->stopRender( ctx );
984  }
985 
986  labelEngine.drawLabeling( ctx );
987  endSection();
988 }
989 
990 void QgsDxfExport::writeEntitiesSymbolLevels( QgsVectorLayer* layer )
991 {
992  if ( !layer )
993  {
994  return;
995  }
996 
997  QgsFeatureRendererV2* renderer = layer->rendererV2();
998  if ( !renderer )
999  {
1000  // TODO return error
1001  return;
1002  }
1004 
1005  QgsRenderContext ctx = renderContext();
1009  QgsSymbolV2RenderContext sctx( ctx, QgsSymbolV2::MM, 1.0, false, 0, 0 );
1010  renderer->startRender( ctx, layer->fields() );
1011 
1012  // get iterator
1013  QgsFeatureRequest req;
1014  if ( layer->wkbType() == QGis::WKBNoGeometry )
1015  {
1017  }
1018  req.setSubsetOfAttributes( QStringList( renderer->usedAttributes() ), layer->fields() );
1019  if ( !mExtent.isEmpty() )
1020  {
1021  req.setFilterRect( mExtent );
1022  }
1023  QgsFeatureIterator fit = layer->getFeatures( req );
1024 
1025  // fetch features
1026  QgsFeature fet;
1027  QgsSymbolV2* featureSymbol = 0;
1028  while ( fit.nextFeature( fet ) )
1029  {
1030  ctx.expressionContext().setFeature( fet );
1031  featureSymbol = renderer->symbolForFeature( fet, ctx );
1032  if ( !featureSymbol )
1033  {
1034  continue;
1035  }
1036 
1037  QHash< QgsSymbolV2*, QList<QgsFeature> >::iterator it = features.find( featureSymbol );
1038  if ( it == features.end() )
1039  {
1040  it = features.insert( featureSymbol, QList<QgsFeature>() );
1041  }
1042  it.value().append( fet );
1043  }
1044 
1045  // find out order
1046  QgsSymbolV2LevelOrder levels;
1047  QgsSymbolV2List symbols = renderer->symbols( ctx );
1048  for ( int i = 0; i < symbols.count(); i++ )
1049  {
1050  QgsSymbolV2* sym = symbols[i];
1051  for ( int j = 0; j < sym->symbolLayerCount(); j++ )
1052  {
1053  int level = sym->symbolLayer( j )->renderingPass();
1054  if ( level < 0 || level >= 1000 ) // ignore invalid levels
1055  continue;
1056  QgsSymbolV2LevelItem item( sym, j );
1057  while ( level >= levels.count() ) // append new empty levels
1058  levels.append( QgsSymbolV2Level() );
1059  levels[level].append( item );
1060  }
1061  }
1062 
1063  // export symbol layers and symbology
1064  for ( int l = 0; l < levels.count(); l++ )
1065  {
1066  QgsSymbolV2Level& level = levels[l];
1067  for ( int i = 0; i < level.count(); i++ )
1068  {
1069  QgsSymbolV2LevelItem& item = level[i];
1070  QHash< QgsSymbolV2*, QList<QgsFeature> >::iterator levelIt = features.find( item.symbol() );
1071  if ( levelIt == features.end() )
1072  {
1073  QgsDebugMsg( QString( "No feature found for symbol on %1 %2.%3" ).arg( layer->id() ).arg( l ).arg( i ) );
1074  continue;
1075  }
1076 
1077  int llayer = item.layer();
1078  QList<QgsFeature>& featureList = levelIt.value();
1079  QList<QgsFeature>::iterator featureIt = featureList.begin();
1080  for ( ; featureIt != featureList.end(); ++featureIt )
1081  {
1082  sctx.setFeature( &*featureIt );
1083  addFeature( sctx, layer->name(), levelIt.key()->symbolLayer( llayer ), levelIt.key() );
1084  }
1085  }
1086  }
1087  renderer->stopRender( ctx );
1088 }
1089 
1090 void QgsDxfExport::writeEndFile()
1091 {
1092  // From GDAL trailer.dxf
1093  mTextStream << "\
1094  0\n\
1095 SECTION\n\
1096  2\n\
1097 OBJECTS\n\
1098  0\n\
1099 DICTIONARY\n\
1100  5\n\
1101 C\n\
1102 330\n\
1103 0\n\
1104 100\n\
1105 AcDbDictionary\n\
1106 281\n\
1107  1\n\
1108  3\n\
1109 ACAD_GROUP\n\
1110 350\n\
1111 D\n\
1112  3\n\
1113 ACAD_LAYOUT\n\
1114 350\n\
1115 1A\n\
1116  3\n\
1117 ACAD_MLEADERSTYLE\n\
1118 350\n\
1119 43\n\
1120  3\n\
1121 ACAD_MLINESTYLE\n\
1122 350\n\
1123 17\n\
1124  3\n\
1125 ACAD_PLOTSETTINGS\n\
1126 350\n\
1127 19\n\
1128  3\n\
1129 ACAD_PLOTSTYLENAME\n\
1130 350\n\
1131 E\n\
1132  3\n\
1133 ACAD_TABLESTYLE\n\
1134 350\n\
1135 42\n\
1136  3\n\
1137 ACAD_VISUALSTYLE\n\
1138 350\n\
1139 2A\n\
1140  0\n\
1141 DICTIONARY\n\
1142  5\n\
1143 D\n\
1144 102\n\
1145 {ACAD_REACTORS\n\
1146 330\n\
1147 C\n\
1148 102\n\
1149 }\n\
1150 330\n\
1151 C\n\
1152 100\n\
1153 AcDbDictionary\n\
1154 281\n\
1155  1\n\
1156  0\n\
1157 DICTIONARY\n\
1158  5\n\
1159 1A\n\
1160 102\n\
1161 {ACAD_REACTORS\n\
1162 330\n\
1163 C\n\
1164 102\n\
1165 }\n\
1166 330\n\
1167 C\n\
1168 100\n\
1169 AcDbDictionary\n\
1170 281\n\
1171  1\n\
1172  3\n\
1173 Layout1\n\
1174 350\n\
1175 1E\n\
1176  3\n\
1177 Layout2\n\
1178 350\n\
1179 26\n\
1180  3\n\
1181 Model\n\
1182 350\n\
1183 22\n\
1184  0\n\
1185 DICTIONARY\n\
1186  5\n\
1187 43\n\
1188 102\n\
1189 {ACAD_REACTORS\n\
1190 330\n\
1191 C\n\
1192 102\n\
1193 }\n\
1194 330\n\
1195 C\n\
1196 100\n\
1197 AcDbDictionary\n\
1198 281\n\
1199  1\n\
1200  0\n\
1201 DICTIONARY\n\
1202  5\n\
1203 17\n\
1204 102\n\
1205 {ACAD_REACTORS\n\
1206 330\n\
1207 C\n\
1208 102\n\
1209 }\n\
1210 330\n\
1211 C\n\
1212 100\n\
1213 AcDbDictionary\n\
1214 281\n\
1215  1\n\
1216  3\n\
1217 Standard\n\
1218 350\n\
1219 18\n\
1220  0\n\
1221 DICTIONARY\n\
1222  5\n\
1223 19\n\
1224 102\n\
1225 {ACAD_REACTORS\n\
1226 330\n\
1227 C\n\
1228 102\n\
1229 }\n\
1230 330\n\
1231 C\n\
1232 100\n\
1233 AcDbDictionary\n\
1234 281\n\
1235  1\n\
1236  0\n\
1237 ACDBDICTIONARYWDFLT\n\
1238  5\n\
1239 E\n\
1240 102\n\
1241 {ACAD_REACTORS\n\
1242 330\n\
1243 C\n\
1244 102\n\
1245 }\n\
1246 330\n\
1247 C\n\
1248 100\n\
1249 AcDbDictionary\n\
1250 281\n\
1251  1\n\
1252  3\n\
1253 Normal\n\
1254 350\n\
1255 F\n\
1256 100\n\
1257 AcDbDictionaryWithDefault\n\
1258 340\n\
1259 F\n\
1260  0\n\
1261 DICTIONARY\n\
1262  5\n\
1263 42\n\
1264 102\n\
1265 {ACAD_REACTORS\n\
1266 330\n\
1267 C\n\
1268 102\n\
1269 }\n\
1270 330\n\
1271 C\n\
1272 100\n\
1273 AcDbDictionary\n\
1274 281\n\
1275  1\n\
1276  0\n\
1277 DICTIONARY\n\
1278  5\n\
1279 2A\n\
1280 102\n\
1281 {ACAD_REACTORS\n\
1282 330\n\
1283 C\n\
1284 102\n\
1285 }\n\
1286 330\n\
1287 C\n\
1288 100\n\
1289 AcDbDictionary\n\
1290 281\n\
1291  1\n\
1292  3\n\
1293 2dWireframe\n\
1294 350\n\
1295 2F\n\
1296  3\n\
1297 3D Hidden\n\
1298 350\n\
1299 31\n\
1300  3\n\
1301 3dWireframe\n\
1302 350\n\
1303 30\n\
1304  3\n\
1305 Basic\n\
1306 350\n\
1307 32\n\
1308  3\n\
1309 Brighten\n\
1310 350\n\
1311 36\n\
1312  3\n\
1313 ColorChange\n\
1314 350\n\
1315 3A\n\
1316  3\n\
1317 Conceptual\n\
1318 350\n\
1319 34\n\
1320  3\n\
1321 Dim\n\
1322 350\n\
1323 35\n\
1324  3\n\
1325 Facepattern\n\
1326 350\n\
1327 39\n\
1328  3\n\
1329 Flat\n\
1330 350\n\
1331 2B\n\
1332  3\n\
1333 FlatWithEdges\n\
1334 350\n\
1335 2C\n\
1336  3\n\
1337 Gouraud\n\
1338 350\n\
1339 2D\n\
1340  3\n\
1341 GouraudWithEdges\n\
1342 350\n\
1343 2E\n\
1344  3\n\
1345 Linepattern\n\
1346 350\n\
1347 38\n\
1348  3\n\
1349 Realistic\n\
1350 350\n\
1351 33\n\
1352  3\n\
1353 Thicken\n\
1354 350\n\
1355 37\n\
1356  0\n\
1357 LAYOUT\n\
1358  5\n\
1359 1E\n\
1360 102\n\
1361 {ACAD_REACTORS\n\
1362 330\n\
1363 1A\n\
1364 102\n\
1365 }\n\
1366 330\n\
1367 1A\n\
1368 100\n\
1369 AcDbPlotSettings\n\
1370  1\n\
1371 \n\
1372  2\n\
1373 none_device\n\
1374  4\n\
1375 \n\
1376  6\n\
1377 \n\
1378  40\n\
1379 0.0\n\
1380  41\n\
1381 0.0\n\
1382  42\n\
1383 0.0\n\
1384  43\n\
1385 0.0\n\
1386  44\n\
1387 0.0\n\
1388  45\n\
1389 0.0\n\
1390  46\n\
1391 0.0\n\
1392  47\n\
1393 0.0\n\
1394  48\n\
1395 0.0\n\
1396  49\n\
1397 0.0\n\
1398 140\n\
1399 0.0\n\
1400 141\n\
1401 0.0\n\
1402 142\n\
1403 1.0\n\
1404 143\n\
1405 1.0\n\
1406  70\n\
1407  688\n\
1408  72\n\
1409  0\n\
1410  73\n\
1411  0\n\
1412  74\n\
1413  5\n\
1414  7\n\
1415 \n\
1416  75\n\
1417  16\n\
1418  76\n\
1419  0\n\
1420  77\n\
1421  2\n\
1422  78\n\
1423  300\n\
1424 147\n\
1425 1.0\n\
1426 148\n\
1427 0.0\n\
1428 149\n\
1429 0.0\n\
1430 100\n\
1431 AcDbLayout\n\
1432  1\n\
1433 Layout1\n\
1434  70\n\
1435  1\n\
1436  71\n\
1437  1\n\
1438  10\n\
1439 0.0\n\
1440  20\n\
1441 0.0\n\
1442  11\n\
1443 12.0\n\
1444  21\n\
1445 9.0\n\
1446  12\n\
1447 0.0\n\
1448  22\n\
1449 0.0\n\
1450  32\n\
1451 0.0\n\
1452  14\n\
1453 1.000000000000000E+20\n\
1454  24\n\
1455 1.000000000000000E+20\n\
1456  34\n\
1457 1.000000000000000E+20\n\
1458  15\n\
1459 -1.000000000000000E+20\n\
1460  25\n\
1461 -1.000000000000000E+20\n\
1462  35\n\
1463 -1.000000000000000E+20\n\
1464 146\n\
1465 0.0\n\
1466  13\n\
1467 0.0\n\
1468  23\n\
1469 0.0\n\
1470  33\n\
1471 0.0\n\
1472  16\n\
1473 1.0\n\
1474  26\n\
1475 0.0\n\
1476  36\n\
1477 0.0\n\
1478  17\n\
1479 0.0\n\
1480  27\n\
1481 1.0\n\
1482  37\n\
1483 0.0\n\
1484  76\n\
1485  0\n\
1486 330\n\
1487 1B\n\
1488  0\n\
1489 LAYOUT\n\
1490  5\n\
1491 26\n\
1492 102\n\
1493 {ACAD_REACTORS\n\
1494 330\n\
1495 1A\n\
1496 102\n\
1497 }\n\
1498 330\n\
1499 1A\n\
1500 100\n\
1501 AcDbPlotSettings\n\
1502  1\n\
1503 \n\
1504  2\n\
1505 none_device\n\
1506  4\n\
1507 \n\
1508  6\n\
1509 \n\
1510  40\n\
1511 0.0\n\
1512  41\n\
1513 0.0\n\
1514  42\n\
1515 0.0\n\
1516  43\n\
1517 0.0\n\
1518  44\n\
1519 0.0\n\
1520  45\n\
1521 0.0\n\
1522  46\n\
1523 0.0\n\
1524  47\n\
1525 0.0\n\
1526  48\n\
1527 0.0\n\
1528  49\n\
1529 0.0\n\
1530 140\n\
1531 0.0\n\
1532 141\n\
1533 0.0\n\
1534 142\n\
1535 1.0\n\
1536 143\n\
1537 1.0\n\
1538  70\n\
1539  688\n\
1540  72\n\
1541  0\n\
1542  73\n\
1543  0\n\
1544  74\n\
1545  5\n\
1546  7\n\
1547 \n\
1548  75\n\
1549  16\n\
1550  76\n\
1551  0\n\
1552  77\n\
1553  2\n\
1554  78\n\
1555  300\n\
1556 147\n\
1557 1.0\n\
1558 148\n\
1559 0.0\n\
1560 149\n\
1561 0.0\n\
1562 100\n\
1563 AcDbLayout\n\
1564  1\n\
1565 Layout2\n\
1566  70\n\
1567  1\n\
1568  71\n\
1569  2\n\
1570  10\n\
1571 0.0\n\
1572  20\n\
1573 0.0\n\
1574  11\n\
1575 0.0\n\
1576  21\n\
1577 0.0\n\
1578  12\n\
1579 0.0\n\
1580  22\n\
1581 0.0\n\
1582  32\n\
1583 0.0\n\
1584  14\n\
1585 0.0\n\
1586  24\n\
1587 0.0\n\
1588  34\n\
1589 0.0\n\
1590  15\n\
1591 0.0\n\
1592  25\n\
1593 0.0\n\
1594  35\n\
1595 0.0\n\
1596 146\n\
1597 0.0\n\
1598  13\n\
1599 0.0\n\
1600  23\n\
1601 0.0\n\
1602  33\n\
1603 0.0\n\
1604  16\n\
1605 1.0\n\
1606  26\n\
1607 0.0\n\
1608  36\n\
1609 0.0\n\
1610  17\n\
1611 0.0\n\
1612  27\n\
1613 1.0\n\
1614  37\n\
1615 0.0\n\
1616  76\n\
1617  0\n\
1618 330\n\
1619 23\n\
1620  0\n\
1621 LAYOUT\n\
1622  5\n\
1623 22\n\
1624 102\n\
1625 {ACAD_REACTORS\n\
1626 330\n\
1627 1A\n\
1628 102\n\
1629 }\n\
1630 330\n\
1631 1A\n\
1632 100\n\
1633 AcDbPlotSettings\n\
1634  1\n\
1635 \n\
1636  2\n\
1637 none_device\n\
1638  4\n\
1639 \n\
1640  6\n\
1641 \n\
1642  40\n\
1643 0.0\n\
1644  41\n\
1645 0.0\n\
1646  42\n\
1647 0.0\n\
1648  43\n\
1649 0.0\n\
1650  44\n\
1651 0.0\n\
1652  45\n\
1653 0.0\n\
1654  46\n\
1655 0.0\n\
1656  47\n\
1657 0.0\n\
1658  48\n\
1659 0.0\n\
1660  49\n\
1661 0.0\n\
1662 140\n\
1663 0.0\n\
1664 141\n\
1665 0.0\n\
1666 142\n\
1667 1.0\n\
1668 143\n\
1669 1.0\n\
1670  70\n\
1671  1712\n\
1672  72\n\
1673  0\n\
1674  73\n\
1675  0\n\
1676  74\n\
1677  0\n\
1678  7\n\
1679 \n\
1680  75\n\
1681  0\n\
1682  76\n\
1683  0\n\
1684  77\n\
1685  2\n\
1686  78\n\
1687  300\n\
1688 147\n\
1689 1.0\n\
1690 148\n\
1691 0.0\n\
1692 149\n\
1693 0.0\n\
1694 100\n\
1695 AcDbLayout\n\
1696  1\n\
1697 Model\n\
1698  70\n\
1699  1\n\
1700  71\n\
1701  0\n\
1702  10\n\
1703 0.0\n\
1704  20\n\
1705 0.0\n\
1706  11\n\
1707 12.0\n\
1708  21\n\
1709 9.0\n\
1710  12\n\
1711 0.0\n\
1712  22\n\
1713 0.0\n\
1714  32\n\
1715 0.0\n\
1716  14\n\
1717 30.0\n\
1718  24\n\
1719 49.75\n\
1720  34\n\
1721 0.0\n\
1722  15\n\
1723 130.5\n\
1724  25\n\
1725 163.1318914119703\n\
1726  35\n\
1727 0.0\n\
1728 146\n\
1729 0.0\n\
1730  13\n\
1731 0.0\n\
1732  23\n\
1733 0.0\n\
1734  33\n\
1735 0.0\n\
1736  16\n\
1737 1.0\n\
1738  26\n\
1739 0.0\n\
1740  36\n\
1741 0.0\n\
1742  17\n\
1743 0.0\n\
1744  27\n\
1745 1.0\n\
1746  37\n\
1747 0.0\n\
1748  76\n\
1749  0\n\
1750 330\n\
1751 1F\n\
1752 331\n\
1753 29\n\
1754  0\n\
1755 MLINESTYLE\n\
1756  5\n\
1757 18\n\
1758 102\n\
1759 {ACAD_REACTORS\n\
1760 330\n\
1761 17\n\
1762 102\n\
1763 }\n\
1764 330\n\
1765 17\n\
1766 100\n\
1767 AcDbMlineStyle\n\
1768  2\n\
1769 Standard\n\
1770  70\n\
1771  0\n\
1772  3\n\
1773 \n\
1774  62\n\
1775  256\n\
1776  51\n\
1777 90.0\n\
1778  52\n\
1779 90.0\n\
1780  71\n\
1781  2\n\
1782  49\n\
1783 0.5\n\
1784  62\n\
1785  256\n\
1786  6\n\
1787 BYLAYER\n\
1788  49\n\
1789 -0.5\n\
1790  62\n\
1791  256\n\
1792  6\n\
1793 BYLAYER\n\
1794  0\n\
1795 ACDBPLACEHOLDER\n\
1796  5\n\
1797 F\n\
1798 102\n\
1799 {ACAD_REACTORS\n\
1800 330\n\
1801 E\n\
1802 102\n\
1803 }\n\
1804 330\n\
1805 E\n\
1806  0\n\
1807 VISUALSTYLE\n\
1808  5\n\
1809 2F\n\
1810 102\n\
1811 {ACAD_REACTORS\n\
1812 330\n\
1813 2A\n\
1814 102\n\
1815 }\n\
1816 330\n\
1817 2A\n\
1818 100\n\
1819 AcDbVisualStyle\n\
1820  2\n\
1821 2dWireframe\n\
1822  70\n\
1823  4\n\
1824  71\n\
1825  0\n\
1826  72\n\
1827  2\n\
1828  73\n\
1829  0\n\
1830  90\n\
1831  0\n\
1832  40\n\
1833 -0.6\n\
1834  41\n\
1835 -30.0\n\
1836  62\n\
1837  5\n\
1838  63\n\
1839  7\n\
1840 421\n\
1841  16777215\n\
1842  74\n\
1843  1\n\
1844  91\n\
1845  4\n\
1846  64\n\
1847  7\n\
1848  65\n\
1849  257\n\
1850  75\n\
1851  1\n\
1852 175\n\
1853  1\n\
1854  42\n\
1855 1.0\n\
1856  92\n\
1857  0\n\
1858  66\n\
1859  257\n\
1860  43\n\
1861 1.0\n\
1862  76\n\
1863  1\n\
1864  77\n\
1865  6\n\
1866  78\n\
1867  2\n\
1868  67\n\
1869  7\n\
1870  79\n\
1871  5\n\
1872 170\n\
1873  0\n\
1874 171\n\
1875  0\n\
1876 290\n\
1877  0\n\
1878 174\n\
1879  0\n\
1880  93\n\
1881  1\n\
1882  44\n\
1883 0.0\n\
1884 173\n\
1885  0\n\
1886 291\n\
1887  0\n\
1888  45\n\
1889 0.0\n\
1890 1001\n\
1891 ACAD\n\
1892 1000\n\
1893 AcDbSavedByObjectVersion\n\
1894 1070\n\
1895  0\n\
1896  0\n\
1897 VISUALSTYLE\n\
1898  5\n\
1899 31\n\
1900 102\n\
1901 {ACAD_REACTORS\n\
1902 330\n\
1903 2A\n\
1904 102\n\
1905 }\n\
1906 330\n\
1907 2A\n\
1908 100\n\
1909 AcDbVisualStyle\n\
1910  2\n\
1911 3D Hidden\n\
1912  70\n\
1913  6\n\
1914  71\n\
1915  1\n\
1916  72\n\
1917  2\n\
1918  73\n\
1919  2\n\
1920  90\n\
1921  0\n\
1922  40\n\
1923 -0.6\n\
1924  41\n\
1925 -30.0\n\
1926  62\n\
1927  5\n\
1928  63\n\
1929  7\n\
1930 421\n\
1931  16777215\n\
1932  74\n\
1933  2\n\
1934  91\n\
1935  2\n\
1936  64\n\
1937  7\n\
1938  65\n\
1939  257\n\
1940  75\n\
1941  2\n\
1942 175\n\
1943  1\n\
1944  42\n\
1945 40.0\n\
1946  92\n\
1947  0\n\
1948  66\n\
1949  257\n\
1950  43\n\
1951 1.0\n\
1952  76\n\
1953  1\n\
1954  77\n\
1955  6\n\
1956  78\n\
1957  2\n\
1958  67\n\
1959  7\n\
1960  79\n\
1961  3\n\
1962 170\n\
1963  0\n\
1964 171\n\
1965  0\n\
1966 290\n\
1967  0\n\
1968 174\n\
1969  0\n\
1970  93\n\
1971  1\n\
1972  44\n\
1973 0.0\n\
1974 173\n\
1975  0\n\
1976 291\n\
1977  0\n\
1978  45\n\
1979 0.0\n\
1980 1001\n\
1981 ACAD\n\
1982 1000\n\
1983 AcDbSavedByObjectVersion\n\
1984 1070\n\
1985  0\n\
1986  0\n\
1987 VISUALSTYLE\n\
1988  5\n\
1989 30\n\
1990 102\n\
1991 {ACAD_REACTORS\n\
1992 330\n\
1993 2A\n\
1994 102\n\
1995 }\n\
1996 330\n\
1997 2A\n\
1998 100\n\
1999 AcDbVisualStyle\n\
2000  2\n\
2001 3dWireframe\n\
2002  70\n\
2003  5\n\
2004  71\n\
2005  0\n\
2006  72\n\
2007  2\n\
2008  73\n\
2009  0\n\
2010  90\n\
2011  0\n\
2012  40\n\
2013 -0.6\n\
2014  41\n\
2015 -30.0\n\
2016  62\n\
2017  5\n\
2018  63\n\
2019  7\n\
2020 421\n\
2021  16777215\n\
2022  74\n\
2023  1\n\
2024  91\n\
2025  4\n\
2026  64\n\
2027  7\n\
2028  65\n\
2029  257\n\
2030  75\n\
2031  1\n\
2032 175\n\
2033  1\n\
2034  42\n\
2035 1.0\n\
2036  92\n\
2037  0\n\
2038  66\n\
2039  257\n\
2040  43\n\
2041 1.0\n\
2042  76\n\
2043  1\n\
2044  77\n\
2045  6\n\
2046  78\n\
2047  2\n\
2048  67\n\
2049  7\n\
2050  79\n\
2051  5\n\
2052 170\n\
2053  0\n\
2054 171\n\
2055  0\n\
2056 290\n\
2057  0\n\
2058 174\n\
2059  0\n\
2060  93\n\
2061  1\n\
2062  44\n\
2063 0.0\n\
2064 173\n\
2065  0\n\
2066 291\n\
2067  0\n\
2068  45\n\
2069 0.0\n\
2070 1001\n\
2071 ACAD\n\
2072 1000\n\
2073 AcDbSavedByObjectVersion\n\
2074 1070\n\
2075  0\n\
2076  0\n\
2077 VISUALSTYLE\n\
2078  5\n\
2079 32\n\
2080 102\n\
2081 {ACAD_REACTORS\n\
2082 330\n\
2083 2A\n\
2084 102\n\
2085 }\n\
2086 330\n\
2087 2A\n\
2088 100\n\
2089 AcDbVisualStyle\n\
2090  2\n\
2091 Basic\n\
2092  70\n\
2093  7\n\
2094  71\n\
2095  1\n\
2096  72\n\
2097  0\n\
2098  73\n\
2099  1\n\
2100  90\n\
2101  0\n\
2102  40\n\
2103 -0.6\n\
2104  41\n\
2105 -30.0\n\
2106  62\n\
2107  5\n\
2108  63\n\
2109  7\n\
2110 421\n\
2111  16777215\n\
2112  74\n\
2113  0\n\
2114  91\n\
2115  4\n\
2116  64\n\
2117  7\n\
2118  65\n\
2119  257\n\
2120  75\n\
2121  1\n\
2122 175\n\
2123  1\n\
2124  42\n\
2125 1.0\n\
2126  92\n\
2127  8\n\
2128  66\n\
2129  7\n\
2130  43\n\
2131 1.0\n\
2132  76\n\
2133  1\n\
2134  77\n\
2135  6\n\
2136  78\n\
2137  2\n\
2138  67\n\
2139  7\n\
2140  79\n\
2141  5\n\
2142 170\n\
2143  0\n\
2144 171\n\
2145  0\n\
2146 290\n\
2147  0\n\
2148 174\n\
2149  0\n\
2150  93\n\
2151  1\n\
2152  44\n\
2153 0.0\n\
2154 173\n\
2155  0\n\
2156 291\n\
2157  1\n\
2158  45\n\
2159 0.0\n\
2160 1001\n\
2161 ACAD\n\
2162 1000\n\
2163 AcDbSavedByObjectVersion\n\
2164 1070\n\
2165  0\n\
2166  0\n\
2167 VISUALSTYLE\n\
2168  5\n\
2169 36\n\
2170 102\n\
2171 {ACAD_REACTORS\n\
2172 330\n\
2173 2A\n\
2174 102\n\
2175 }\n\
2176 330\n\
2177 2A\n\
2178 100\n\
2179 AcDbVisualStyle\n\
2180  2\n\
2181 Brighten\n\
2182  70\n\
2183  12\n\
2184  71\n\
2185  2\n\
2186  72\n\
2187  2\n\
2188  73\n\
2189  0\n\
2190  90\n\
2191  0\n\
2192  40\n\
2193 -0.6\n\
2194  41\n\
2195 -30.0\n\
2196  62\n\
2197  5\n\
2198  63\n\
2199  7\n\
2200 421\n\
2201  16777215\n\
2202  74\n\
2203  1\n\
2204  91\n\
2205  4\n\
2206  64\n\
2207  7\n\
2208  65\n\
2209  257\n\
2210  75\n\
2211  1\n\
2212 175\n\
2213  1\n\
2214  42\n\
2215 1.0\n\
2216  92\n\
2217  8\n\
2218  66\n\
2219  7\n\
2220  43\n\
2221 1.0\n\
2222  76\n\
2223  1\n\
2224  77\n\
2225  6\n\
2226  78\n\
2227  2\n\
2228  67\n\
2229  7\n\
2230  79\n\
2231  5\n\
2232 170\n\
2233  0\n\
2234 171\n\
2235  0\n\
2236 290\n\
2237  0\n\
2238 174\n\
2239  0\n\
2240  93\n\
2241  1\n\
2242  44\n\
2243 50.0\n\
2244 173\n\
2245  0\n\
2246 291\n\
2247  1\n\
2248  45\n\
2249 0.0\n\
2250 1001\n\
2251 ACAD\n\
2252 1000\n\
2253 AcDbSavedByObjectVersion\n\
2254 1070\n\
2255  0\n\
2256  0\n\
2257 VISUALSTYLE\n\
2258  5\n\
2259 3A\n\
2260 102\n\
2261 {ACAD_REACTORS\n\
2262 330\n\
2263 2A\n\
2264 102\n\
2265 }\n\
2266 330\n\
2267 2A\n\
2268 100\n\
2269 AcDbVisualStyle\n\
2270  2\n\
2271 ColorChange\n\
2272  70\n\
2273  16\n\
2274  71\n\
2275  2\n\
2276  72\n\
2277  2\n\
2278  73\n\
2279  3\n\
2280  90\n\
2281  0\n\
2282  40\n\
2283 -0.6\n\
2284  41\n\
2285 -30.0\n\
2286  62\n\
2287  5\n\
2288  63\n\
2289  8\n\
2290 421\n\
2291  8421504\n\
2292  74\n\
2293  1\n\
2294  91\n\
2295  4\n\
2296  64\n\
2297  7\n\
2298  65\n\
2299  257\n\
2300  75\n\
2301  1\n\
2302 175\n\
2303  1\n\
2304  42\n\
2305 1.0\n\
2306  92\n\
2307  8\n\
2308  66\n\
2309  8\n\
2310 424\n\
2311  8421504\n\
2312  43\n\
2313 1.0\n\
2314  76\n\
2315  1\n\
2316  77\n\
2317  6\n\
2318  78\n\
2319  2\n\
2320  67\n\
2321  7\n\
2322  79\n\
2323  5\n\
2324 170\n\
2325  0\n\
2326 171\n\
2327  0\n\
2328 290\n\
2329  0\n\
2330 174\n\
2331  0\n\
2332  93\n\
2333  1\n\
2334  44\n\
2335 0.0\n\
2336 173\n\
2337  0\n\
2338 291\n\
2339  1\n\
2340  45\n\
2341 0.0\n\
2342 1001\n\
2343 ACAD\n\
2344 1000\n\
2345 AcDbSavedByObjectVersion\n\
2346 1070\n\
2347  0\n\
2348  0\n\
2349 VISUALSTYLE\n\
2350  5\n\
2351 34\n\
2352 102\n\
2353 {ACAD_REACTORS\n\
2354 330\n\
2355 2A\n\
2356 102\n\
2357 }\n\
2358 330\n\
2359 2A\n\
2360 100\n\
2361 AcDbVisualStyle\n\
2362  2\n\
2363 Conceptual\n\
2364  70\n\
2365  9\n\
2366  71\n\
2367  3\n\
2368  72\n\
2369  2\n\
2370  73\n\
2371  0\n\
2372  90\n\
2373  0\n\
2374  40\n\
2375 -0.6\n\
2376  41\n\
2377 -30.0\n\
2378  62\n\
2379  5\n\
2380  63\n\
2381  7\n\
2382 421\n\
2383  16777215\n\
2384  74\n\
2385  2\n\
2386  91\n\
2387  2\n\
2388  64\n\
2389  7\n\
2390  65\n\
2391  257\n\
2392  75\n\
2393  1\n\
2394 175\n\
2395  1\n\
2396  42\n\
2397 40.0\n\
2398  92\n\
2399  8\n\
2400  66\n\
2401  7\n\
2402  43\n\
2403 1.0\n\
2404  76\n\
2405  1\n\
2406  77\n\
2407  6\n\
2408  78\n\
2409  2\n\
2410  67\n\
2411  7\n\
2412  79\n\
2413  3\n\
2414 170\n\
2415  0\n\
2416 171\n\
2417  0\n\
2418 290\n\
2419  0\n\
2420 174\n\
2421  0\n\
2422  93\n\
2423  1\n\
2424  44\n\
2425 0.0\n\
2426 173\n\
2427  0\n\
2428 291\n\
2429  0\n\
2430  45\n\
2431 0.0\n\
2432 1001\n\
2433 ACAD\n\
2434 1000\n\
2435 AcDbSavedByObjectVersion\n\
2436 1070\n\
2437  0\n\
2438  0\n\
2439 VISUALSTYLE\n\
2440  5\n\
2441 35\n\
2442 102\n\
2443 {ACAD_REACTORS\n\
2444 330\n\
2445 2A\n\
2446 102\n\
2447 }\n\
2448 330\n\
2449 2A\n\
2450 100\n\
2451 AcDbVisualStyle\n\
2452  2\n\
2453 Dim\n\
2454  70\n\
2455  11\n\
2456  71\n\
2457  2\n\
2458  72\n\
2459  2\n\
2460  73\n\
2461  0\n\
2462  90\n\
2463  0\n\
2464  40\n\
2465 -0.6\n\
2466  41\n\
2467 -30.0\n\
2468  62\n\
2469  5\n\
2470  63\n\
2471  7\n\
2472 421\n\
2473  16777215\n\
2474  74\n\
2475  1\n\
2476  91\n\
2477  4\n\
2478  64\n\
2479  7\n\
2480  65\n\
2481  257\n\
2482  75\n\
2483  1\n\
2484 175\n\
2485  1\n\
2486  42\n\
2487 1.0\n\
2488  92\n\
2489  8\n\
2490  66\n\
2491  7\n\
2492  43\n\
2493 1.0\n\
2494  76\n\
2495  1\n\
2496  77\n\
2497  6\n\
2498  78\n\
2499  2\n\
2500  67\n\
2501  7\n\
2502  79\n\
2503  5\n\
2504 170\n\
2505  0\n\
2506 171\n\
2507  0\n\
2508 290\n\
2509  0\n\
2510 174\n\
2511  0\n\
2512  93\n\
2513  1\n\
2514  44\n\
2515 -50.0\n\
2516 173\n\
2517  0\n\
2518 291\n\
2519  1\n\
2520  45\n\
2521 0.0\n\
2522 1001\n\
2523 ACAD\n\
2524 1000\n\
2525 AcDbSavedByObjectVersion\n\
2526 1070\n\
2527  0\n\
2528  0\n\
2529 VISUALSTYLE\n\
2530  5\n\
2531 39\n\
2532 102\n\
2533 {ACAD_REACTORS\n\
2534 330\n\
2535 2A\n\
2536 102\n\
2537 }\n\
2538 330\n\
2539 2A\n\
2540 100\n\
2541 AcDbVisualStyle\n\
2542  2\n\
2543 Facepattern\n\
2544  70\n\
2545  15\n\
2546  71\n\
2547  2\n\
2548  72\n\
2549  2\n\
2550  73\n\
2551  0\n\
2552  90\n\
2553  0\n\
2554  40\n\
2555 -0.6\n\
2556  41\n\
2557 -30.0\n\
2558  62\n\
2559  5\n\
2560  63\n\
2561  7\n\
2562 421\n\
2563  16777215\n\
2564  74\n\
2565  1\n\
2566  91\n\
2567  4\n\
2568  64\n\
2569  7\n\
2570  65\n\
2571  257\n\
2572  75\n\
2573  1\n\
2574 175\n\
2575  1\n\
2576  42\n\
2577 1.0\n\
2578  92\n\
2579  8\n\
2580  66\n\
2581  7\n\
2582  43\n\
2583 1.0\n\
2584  76\n\
2585  1\n\
2586  77\n\
2587  6\n\
2588  78\n\
2589  2\n\
2590  67\n\
2591  7\n\
2592  79\n\
2593  5\n\
2594 170\n\
2595  0\n\
2596 171\n\
2597  0\n\
2598 290\n\
2599  0\n\
2600 174\n\
2601  0\n\
2602  93\n\
2603  1\n\
2604  44\n\
2605 0.0\n\
2606 173\n\
2607  0\n\
2608 291\n\
2609  1\n\
2610  45\n\
2611 0.0\n\
2612 1001\n\
2613 ACAD\n\
2614 1000\n\
2615 AcDbSavedByObjectVersion\n\
2616 1070\n\
2617  0\n\
2618  0\n\
2619 VISUALSTYLE\n\
2620  5\n\
2621 2B\n\
2622 102\n\
2623 {ACAD_REACTORS\n\
2624 330\n\
2625 2A\n\
2626 102\n\
2627 }\n\
2628 330\n\
2629 2A\n\
2630 100\n\
2631 AcDbVisualStyle\n\
2632  2\n\
2633 Flat\n\
2634  70\n\
2635  0\n\
2636  71\n\
2637  2\n\
2638  72\n\
2639  1\n\
2640  73\n\
2641  1\n\
2642  90\n\
2643  2\n\
2644  40\n\
2645 -0.6\n\
2646  41\n\
2647 30.0\n\
2648  62\n\
2649  5\n\
2650  63\n\
2651  7\n\
2652 421\n\
2653  16777215\n\
2654  74\n\
2655  0\n\
2656  91\n\
2657  4\n\
2658  64\n\
2659  7\n\
2660  65\n\
2661  257\n\
2662  75\n\
2663  1\n\
2664 175\n\
2665  1\n\
2666  42\n\
2667 1.0\n\
2668  92\n\
2669  8\n\
2670  66\n\
2671  7\n\
2672  43\n\
2673 1.0\n\
2674  76\n\
2675  1\n\
2676  77\n\
2677  6\n\
2678  78\n\
2679  2\n\
2680  67\n\
2681  7\n\
2682  79\n\
2683  5\n\
2684 170\n\
2685  0\n\
2686 171\n\
2687  0\n\
2688 290\n\
2689  0\n\
2690 174\n\
2691  0\n\
2692  93\n\
2693  13\n\
2694  44\n\
2695 0.0\n\
2696 173\n\
2697  0\n\
2698 291\n\
2699  1\n\
2700  45\n\
2701 0.0\n\
2702 1001\n\
2703 ACAD\n\
2704 1000\n\
2705 AcDbSavedByObjectVersion\n\
2706 1070\n\
2707  0\n\
2708  0\n\
2709 VISUALSTYLE\n\
2710  5\n\
2711 2C\n\
2712 102\n\
2713 {ACAD_REACTORS\n\
2714 330\n\
2715 2A\n\
2716 102\n\
2717 }\n\
2718 330\n\
2719 2A\n\
2720 100\n\
2721 AcDbVisualStyle\n\
2722  2\n\
2723 FlatWithEdges\n\
2724  70\n\
2725  1\n\
2726  71\n\
2727  2\n\
2728  72\n\
2729  1\n\
2730  73\n\
2731  1\n\
2732  90\n\
2733  2\n\
2734  40\n\
2735 -0.6\n\
2736  41\n\
2737 30.0\n\
2738  62\n\
2739  5\n\
2740  63\n\
2741  7\n\
2742 421\n\
2743  16777215\n\
2744  74\n\
2745  1\n\
2746  91\n\
2747  4\n\
2748  64\n\
2749  7\n\
2750  65\n\
2751  257\n\
2752  75\n\
2753  1\n\
2754 175\n\
2755  1\n\
2756  42\n\
2757 1.0\n\
2758  92\n\
2759  0\n\
2760  66\n\
2761  257\n\
2762  43\n\
2763 1.0\n\
2764  76\n\
2765  1\n\
2766  77\n\
2767  6\n\
2768  78\n\
2769  2\n\
2770  67\n\
2771  7\n\
2772  79\n\
2773  5\n\
2774 170\n\
2775  0\n\
2776 171\n\
2777  0\n\
2778 290\n\
2779  0\n\
2780 174\n\
2781  0\n\
2782  93\n\
2783  13\n\
2784  44\n\
2785 0.0\n\
2786 173\n\
2787  0\n\
2788 291\n\
2789  1\n\
2790  45\n\
2791 0.0\n\
2792 1001\n\
2793 ACAD\n\
2794 1000\n\
2795 AcDbSavedByObjectVersion\n\
2796 1070\n\
2797  0\n\
2798  0\n\
2799 VISUALSTYLE\n\
2800  5\n\
2801 2D\n\
2802 102\n\
2803 {ACAD_REACTORS\n\
2804 330\n\
2805 2A\n\
2806 102\n\
2807 }\n\
2808 330\n\
2809 2A\n\
2810 100\n\
2811 AcDbVisualStyle\n\
2812  2\n\
2813 Gouraud\n\
2814  70\n\
2815  2\n\
2816  71\n\
2817  2\n\
2818  72\n\
2819  2\n\
2820  73\n\
2821  1\n\
2822  90\n\
2823  2\n\
2824  40\n\
2825 -0.6\n\
2826  41\n\
2827 30.0\n\
2828  62\n\
2829  5\n\
2830  63\n\
2831  7\n\
2832 421\n\
2833  16777215\n\
2834  74\n\
2835  0\n\
2836  91\n\
2837  4\n\
2838  64\n\
2839  7\n\
2840  65\n\
2841  257\n\
2842  75\n\
2843  1\n\
2844 175\n\
2845  1\n\
2846  42\n\
2847 1.0\n\
2848  92\n\
2849  0\n\
2850  66\n\
2851  7\n\
2852  43\n\
2853 1.0\n\
2854  76\n\
2855  1\n\
2856  77\n\
2857  6\n\
2858  78\n\
2859  2\n\
2860  67\n\
2861  7\n\
2862  79\n\
2863  5\n\
2864 170\n\
2865  0\n\
2866 171\n\
2867  0\n\
2868 290\n\
2869  0\n\
2870 174\n\
2871  0\n\
2872  93\n\
2873  13\n\
2874  44\n\
2875 0.0\n\
2876 173\n\
2877  0\n\
2878 291\n\
2879  1\n\
2880  45\n\
2881 0.0\n\
2882 1001\n\
2883 ACAD\n\
2884 1000\n\
2885 AcDbSavedByObjectVersion\n\
2886 1070\n\
2887  0\n\
2888  0\n\
2889 VISUALSTYLE\n\
2890  5\n\
2891 2E\n\
2892 102\n\
2893 {ACAD_REACTORS\n\
2894 330\n\
2895 2A\n\
2896 102\n\
2897 }\n\
2898 330\n\
2899 2A\n\
2900 100\n\
2901 AcDbVisualStyle\n\
2902  2\n\
2903 GouraudWithEdges\n\
2904  70\n\
2905  3\n\
2906  71\n\
2907  2\n\
2908  72\n\
2909  2\n\
2910  73\n\
2911  1\n\
2912  90\n\
2913  2\n\
2914  40\n\
2915 -0.6\n\
2916  41\n\
2917 30.0\n\
2918  62\n\
2919  5\n\
2920  63\n\
2921  7\n\
2922 421\n\
2923  16777215\n\
2924  74\n\
2925  1\n\
2926  91\n\
2927  4\n\
2928  64\n\
2929  7\n\
2930  65\n\
2931  257\n\
2932  75\n\
2933  1\n\
2934 175\n\
2935  1\n\
2936  42\n\
2937 1.0\n\
2938  92\n\
2939  0\n\
2940  66\n\
2941  257\n\
2942  43\n\
2943 1.0\n\
2944  76\n\
2945  1\n\
2946  77\n\
2947  6\n\
2948  78\n\
2949  2\n\
2950  67\n\
2951  7\n\
2952  79\n\
2953  5\n\
2954 170\n\
2955  0\n\
2956 171\n\
2957  0\n\
2958 290\n\
2959  0\n\
2960 174\n\
2961  0\n\
2962  93\n\
2963  13\n\
2964  44\n\
2965 0.0\n\
2966 173\n\
2967  0\n\
2968 291\n\
2969  1\n\
2970  45\n\
2971 0.0\n\
2972 1001\n\
2973 ACAD\n\
2974 1000\n\
2975 AcDbSavedByObjectVersion\n\
2976 1070\n\
2977  0\n\
2978  0\n\
2979 VISUALSTYLE\n\
2980  5\n\
2981 38\n\
2982 102\n\
2983 {ACAD_REACTORS\n\
2984 330\n\
2985 2A\n\
2986 102\n\
2987 }\n\
2988 330\n\
2989 2A\n\
2990 100\n\
2991 AcDbVisualStyle\n\
2992  2\n\
2993 Linepattern\n\
2994  70\n\
2995  14\n\
2996  71\n\
2997  2\n\
2998  72\n\
2999  2\n\
3000  73\n\
3001  0\n\
3002  90\n\
3003  0\n\
3004  40\n\
3005 -0.6\n\
3006  41\n\
3007 -30.0\n\
3008  62\n\
3009  5\n\
3010  63\n\
3011  7\n\
3012 421\n\
3013  16777215\n\
3014  74\n\
3015  1\n\
3016  91\n\
3017  4\n\
3018  64\n\
3019  7\n\
3020  65\n\
3021  257\n\
3022  75\n\
3023  7\n\
3024 175\n\
3025  7\n\
3026  42\n\
3027 1.0\n\
3028  92\n\
3029  8\n\
3030  66\n\
3031  7\n\
3032  43\n\
3033 1.0\n\
3034  76\n\
3035  1\n\
3036  77\n\
3037  6\n\
3038  78\n\
3039  2\n\
3040  67\n\
3041  7\n\
3042  79\n\
3043  5\n\
3044 170\n\
3045  0\n\
3046 171\n\
3047  0\n\
3048 290\n\
3049  0\n\
3050 174\n\
3051  0\n\
3052  93\n\
3053  1\n\
3054  44\n\
3055 0.0\n\
3056 173\n\
3057  0\n\
3058 291\n\
3059  1\n\
3060  45\n\
3061 0.0\n\
3062 1001\n\
3063 ACAD\n\
3064 1000\n\
3065 AcDbSavedByObjectVersion\n\
3066 1070\n\
3067  0\n\
3068  0\n\
3069 VISUALSTYLE\n\
3070  5\n\
3071 33\n\
3072 102\n\
3073 {ACAD_REACTORS\n\
3074 330\n\
3075 2A\n\
3076 102\n\
3077 }\n\
3078 330\n\
3079 2A\n\
3080 100\n\
3081 AcDbVisualStyle\n\
3082  2\n\
3083 Realistic\n\
3084  70\n\
3085  8\n\
3086  71\n\
3087  2\n\
3088  72\n\
3089  2\n\
3090  73\n\
3091  0\n\
3092  90\n\
3093  0\n\
3094  40\n\
3095 -0.6\n\
3096  41\n\
3097 -30.0\n\
3098  62\n\
3099  5\n\
3100  63\n\
3101  7\n\
3102 421\n\
3103  16777215\n\
3104  74\n\
3105  1\n\
3106  91\n\
3107  0\n\
3108  64\n\
3109  7\n\
3110  65\n\
3111  257\n\
3112  75\n\
3113  1\n\
3114 175\n\
3115  1\n\
3116  42\n\
3117 1.0\n\
3118  92\n\
3119  8\n\
3120  66\n\
3121  8\n\
3122 424\n\
3123  7895160\n\
3124  43\n\
3125 1.0\n\
3126  76\n\
3127  1\n\
3128  77\n\
3129  6\n\
3130  78\n\
3131  2\n\
3132  67\n\
3133  7\n\
3134  79\n\
3135  5\n\
3136 170\n\
3137  0\n\
3138 171\n\
3139  0\n\
3140 290\n\
3141  0\n\
3142 174\n\
3143  0\n\
3144  93\n\
3145  13\n\
3146  44\n\
3147 0.0\n\
3148 173\n\
3149  0\n\
3150 291\n\
3151  0\n\
3152  45\n\
3153 0.0\n\
3154 1001\n\
3155 ACAD\n\
3156 1000\n\
3157 AcDbSavedByObjectVersion\n\
3158 1070\n\
3159  0\n\
3160  0\n\
3161 VISUALSTYLE\n\
3162  5\n\
3163 37\n\
3164 102\n\
3165 {ACAD_REACTORS\n\
3166 330\n\
3167 2A\n\
3168 102\n\
3169 }\n\
3170 330\n\
3171 2A\n\
3172 100\n\
3173 AcDbVisualStyle\n\
3174  2\n\
3175 Thicken\n\
3176  70\n\
3177  13\n\
3178  71\n\
3179  2\n\
3180  72\n\
3181  2\n\
3182  73\n\
3183  0\n\
3184  90\n\
3185  0\n\
3186  40\n\
3187 -0.6\n\
3188  41\n\
3189 -30.0\n\
3190  62\n\
3191  5\n\
3192  63\n\
3193  7\n\
3194 421\n\
3195  16777215\n\
3196  74\n\
3197  1\n\
3198  91\n\
3199  4\n\
3200  64\n\
3201  7\n\
3202  65\n\
3203  257\n\
3204  75\n\
3205  1\n\
3206 175\n\
3207  1\n\
3208  42\n\
3209 1.0\n\
3210  92\n\
3211  12\n\
3212  66\n\
3213  7\n\
3214  43\n\
3215 1.0\n\
3216  76\n\
3217  1\n\
3218  77\n\
3219  6\n\
3220  78\n\
3221  2\n\
3222  67\n\
3223  7\n\
3224  79\n\
3225  5\n\
3226 170\n\
3227  0\n\
3228 171\n\
3229  0\n\
3230 290\n\
3231  0\n\
3232 174\n\
3233  0\n\
3234  93\n\
3235  1\n\
3236  44\n\
3237 0.0\n\
3238 173\n\
3239  0\n\
3240 291\n\
3241  1\n\
3242  45\n\
3243 0.0\n\
3244 1001\n\
3245 ACAD\n\
3246 1000\n\
3247 AcDbSavedByObjectVersion\n\
3248 1070\n\
3249  0\n\
3250  0\n\
3251 ENDSEC\n\
3252 ";
3253 
3254  writeGroup( 0, "EOF" );
3255 }
3256 
3257 void QgsDxfExport::startSection()
3258 {
3259  writeGroup( 0, "SECTION" );
3260 }
3261 
3262 void QgsDxfExport::endSection()
3263 {
3264  writeGroup( 0, "ENDSEC" );
3265 }
3266 
3267 void QgsDxfExport::writePoint( const QgsPoint& pt, const QString& layer, QColor color, const QgsFeature* f, const QgsSymbolLayerV2* symbolLayer, const QgsSymbolV2* symbol )
3268 {
3269 #if 0
3270  // debug: draw rectangle for debugging
3271  const QgsMarkerSymbolLayerV2* msl = dynamic_cast< const QgsMarkerSymbolLayerV2* >( symbolLayer );
3272  if ( msl )
3273  {
3274  double halfSize = msl->size() * mapUnitScaleFactor( mSymbologyScaleDenominator,
3275  msl->sizeUnit(), mMapUnits ) / 2.0;
3276  writeGroup( 0, "SOLID" );
3277  writeGroup( 8, layer );
3278  writeGroup( 62, 1 );
3279  writeGroup( 0, pt + QgsVector( -halfSize, -halfSize ) );
3280  writeGroup( 1, pt + QgsVector( halfSize, -halfSize ) );
3281  writeGroup( 2, pt + QgsVector( -halfSize, halfSize ) );
3282  writeGroup( 3, pt + QgsVector( halfSize, halfSize ) );
3283  }
3284 #endif // 0
3285 
3286  // insert block or write point directly?
3287  QHash< const QgsSymbolLayerV2*, QString >::const_iterator blockIt = mPointSymbolBlocks.find( symbolLayer );
3288  if ( !symbolLayer || blockIt == mPointSymbolBlocks.constEnd() )
3289  {
3290  // write symbol directly here
3291  const QgsMarkerSymbolLayerV2* msl = dynamic_cast< const QgsMarkerSymbolLayerV2* >( symbolLayer );
3292  if ( msl && symbol )
3293  {
3294  QgsRenderContext ct;
3295  QgsSymbolV2RenderContext ctx( ct, QgsSymbolV2::MapUnit, symbol->alpha(), false, symbol->renderHints(), f );
3296  if ( symbolLayer->writeDxf( *this, mapUnitScaleFactor( mSymbologyScaleDenominator, msl->sizeUnit(), mMapUnits ), layer, &ctx, f, QPointF( pt.x(), pt.y() ) ) )
3297  {
3298  return;
3299  }
3300  }
3301  writePoint( layer, color, pt ); // write default point symbol
3302  }
3303  else
3304  {
3305  // insert block reference
3306  writeGroup( 0, "INSERT" );
3307  writeHandle();
3308  writeGroup( 100, "AcDbEntity" );
3309  writeGroup( 100, "AcDbBlockReference" );
3310  writeGroup( 8, layer );
3311  writeGroup( 2, blockIt.value() ); // Block name
3312  writeGroup( 0, pt ); // Insertion point (in OCS)
3313  }
3314 }
3315 
3316 void QgsDxfExport::writePolyline( const QgsPolyline& line, const QString& layer, const QString& lineStyleName, QColor color, double width )
3317 {
3318  int n = line.size();
3319  if ( n == 0 )
3320  {
3321  QgsDebugMsg( QString( "writePolyline: empty line layer=%1 lineStyleName=%2" ).arg( layer ).arg( lineStyleName ) );
3322  return;
3323  }
3324 
3325  bool polygon = line[0] == line[ line.size() - 1 ];
3326  if ( polygon )
3327  --n;
3328  if ( n < 2 )
3329  {
3330  QgsDebugMsg( QString( "writePolyline: line too short layer=%1 lineStyleName=%2" ).arg( layer ).arg( lineStyleName ) );
3331  return;
3332  }
3333 
3334  writeGroup( 0, "LWPOLYLINE" );
3335  writeHandle();
3336  writeGroup( 8, layer );
3337  writeGroup( 100, "AcDbEntity" );
3338  writeGroup( 100, "AcDbPolyline" );
3339  writeGroup( 6, lineStyleName );
3340  writeGroup( color );
3341 
3342  writeGroup( 90, n );
3343  writeGroup( 70, polygon ? 1 : 0 );
3344  writeGroup( 43, width );
3345 
3346  for ( int i = 0; i < n; i++ )
3347  writeGroup( 0, line[i] );
3348 }
3349 
3350 void QgsDxfExport::writePolygon( const QgsPolygon& polygon, const QString& layer, const QString& hatchPattern, QColor color )
3351 {
3352  writeGroup( 0, "HATCH" ); // Entity type
3353  writeHandle();
3354  writeGroup( 330, mBlockHandle );
3355  writeGroup( 100, "AcDbEntity" );
3356  writeGroup( 8, layer ); // Layer name
3357  writeGroup( color ); // Color
3358  writeGroup( 100, "AcDbHatch" );
3359 
3360  writeGroup( 0, QgsPoint( 0, 0 ) ); // Elevation point (in OCS)
3361  writeGroup( 200, QgsPoint( 0, 0 ), 1.0 );
3362 
3363  writeGroup( 2, hatchPattern ); // Hatch pattern name
3364  writeGroup( 70, hatchPattern == "SOLID" ); // Solid fill flag (solid fill = 1; pattern fill = 0)
3365  writeGroup( 71, 0 ); // Associativity flag (associative = 1; non-associative = 0)
3366 
3367  writeGroup( 91, polygon.size() ); // Number of boundary paths (loops)
3368  for ( int i = 0; i < polygon.size(); ++i )
3369  {
3370  writeGroup( 92, 2 ); // Boundary path type flag (bit coded): 0 = Default; 1 = External; 2 = Polyline 4 = Derived; 8 = Textbox; 16 = Outermost
3371  writeGroup( 72, 0 ); // Has bulge flag
3372  writeGroup( 73, 1 ); // Is closed flag
3373  writeGroup( 93, polygon[i].size() ); // Number of edges in this boundary path (only if boundary is not a polyline
3374 
3375  for ( int j = 0; j < polygon[i].size(); ++j )
3376  {
3377  writeGroup( 0, polygon[i][j], 0.0, true ); // Vertex location (in OCS)
3378  }
3379 
3380  writeGroup( 97, 0 ); // Number of source boundary objects
3381  }
3382 
3383  writeGroup( 75, 0 ); // Hatch style: 0 = Hatch "odd parity" area (Normal style), 1 = Hatch outermost area only (Outer style), 2 = Hatch through entire area (Ignore style)
3384  writeGroup( 76, 1 ); // Hatch pattern type: 0 = User-defined; 1 = Predefined; 2 = Custom
3385 
3386  writeGroup( 98, 0 ); // Number of seed points
3387 }
3388 
3389 void QgsDxfExport::writeLine( const QgsPoint& pt1, const QgsPoint& pt2, const QString& layer, const QString& lineStyleName, QColor color, double width )
3390 {
3391  QgsPolyline line( 2 );
3392  line[0] = pt1;
3393  line[1] = pt2;
3394  writePolyline( line, layer, lineStyleName, color, width );
3395 }
3396 
3397 void QgsDxfExport::writePoint( const QString& layer, QColor color, const QgsPoint& pt )
3398 {
3399  writeGroup( 0, "POINT" );
3400  writeHandle();
3401  writeGroup( 100, "AcDbEntity" );
3402  writeGroup( 100, "AcDbPoint" );
3403  writeGroup( 8, layer );
3404  writeGroup( color );
3405  writeGroup( 0, pt );
3406 }
3407 
3408 void QgsDxfExport::writeFilledCircle( const QString &layer, QColor color, const QgsPoint &pt, double radius )
3409 {
3410  writeGroup( 0, "HATCH" ); // Entity type
3411  writeHandle();
3412  writeGroup( 330, mBlockHandle );
3413  writeGroup( 100, "AcDbEntity" );
3414  writeGroup( 8, layer ); // Layer name
3415  writeGroup( color ); // Color (0 by block, 256 by layer)
3416  writeGroup( 100, "AcDbHatch" );
3417 
3418  writeGroup( 0, QgsPoint( 0, 0 ) ); // Elevation point (in OCS)
3419  writeGroup( 200, QgsPoint( 0, 0 ), 1.0 );
3420 
3421  writeGroup( 2, "SOLID" ); // Hatch pattern name
3422  writeGroup( 70, 1 ); // Solid fill flag (solid fill = 1; pattern fill = 0)
3423  writeGroup( 71, 0 ); // Associativity flag (associative = 1; non-associative = 0)
3424 
3425 
3426  writeGroup( 91, 1 ); // Number of boundary paths (loops)
3427 
3428  writeGroup( 92, 7 ); // Boundary path type flag (bit coded): 0 = Default; 1 = External; 2 = Polyline 4 = Derived; 8 = Textbox; 16 = Outermost
3429  writeGroup( 72, 2 );
3430  writeGroup( 73, 1 ); // Is closed flag
3431  writeGroup( 93, 2 ); // Number of polyline vertices
3432 
3433  writeGroup( 0, QgsPoint( pt.x() - radius, pt.y() ) );
3434  writeGroup( 42, 1.0 );
3435 
3436  writeGroup( 0, QgsPoint( pt.x() + radius, pt.y() ) );
3437  writeGroup( 42, 1.0 );
3438 
3439  writeGroup( 97, 0 ); // Number of source boundary objects
3440 
3441  writeGroup( 75, 1 ); // Hatch style: 0 = Hatch "odd parity" area (Normal style), 1 = Hatch outermost area only (Outer style), 2 = Hatch through entire area (Ignore style)
3442  writeGroup( 76, 1 ); // Hatch pattern type: 0 = User-defined; 1 = Predefined; 2 = Custom
3443  writeGroup( 47, 0.0059696789328105 ); // Pixel size
3444 
3445  writeGroup( 98, 0 ); // Number of seed points
3446 }
3447 
3448 void QgsDxfExport::writeCircle( const QString& layer, QColor color, const QgsPoint& pt, double radius, const QString &lineStyleName, double width )
3449 {
3450  writeGroup( 0, "LWPOLYLINE" );
3451  writeHandle();
3452  writeGroup( 330, mBlockHandle );
3453  writeGroup( 8, layer );
3454  writeGroup( 100, "AcDbEntity" );
3455  writeGroup( 100, "AcDbPolyline" );
3456  writeGroup( 6, lineStyleName );
3457  writeGroup( color );
3458 
3459  writeGroup( 90, 2 );
3460 
3461  writeGroup( 70, 1 );
3462  writeGroup( 43, width );
3463 
3464  writeGroup( 0, QgsPoint( pt.x() - radius, pt.y() ) );
3465  writeGroup( 42, 1.0 );
3466  writeGroup( 0, QgsPoint( pt.x() + radius, pt.y() ) );
3467  writeGroup( 42, 1.0 );
3468 }
3469 
3470 void QgsDxfExport::writeText( const QString& layer, const QString& text, const QgsPoint& pt, double size, double angle, QColor color )
3471 {
3472  writeGroup( 0, "TEXT" );
3473  writeHandle();
3474  writeGroup( 100, "AcDbEntity" );
3475  writeGroup( 100, "AcDbText" );
3476  writeGroup( 8, layer );
3477  writeGroup( color );
3478  writeGroup( 0, pt );
3479  writeGroup( 40, size );
3480  writeGroup( 1, text );
3481  writeGroup( 50, angle );
3482  writeGroup( 7, "STANDARD" ); // so far only support for standard font
3483 }
3484 
3485 void QgsDxfExport::writeMText( const QString& layer, const QString& text, const QgsPoint& pt, double width, double angle, QColor color )
3486 {
3487  if ( !mTextStream.codec()->canEncode( text ) )
3488  {
3489  // TODO return error
3490  return;
3491  }
3492 
3493  writeGroup( 0, "MTEXT" );
3494  writeHandle();
3495  writeGroup( 100, "AcDbEntity" );
3496  writeGroup( 100, "AcDbMText" );
3497  writeGroup( 8, layer );
3498  writeGroup( color );
3499 
3500  writeGroup( 0, pt );
3501 
3502  QString t( text );
3503  while ( t.length() > 250 )
3504  {
3505  writeGroup( 3, t.left( 250 ) );
3506  t = t.mid( 250 );
3507  }
3508  writeGroup( 1, text );
3509 
3510  writeGroup( 50, angle ); // Rotation angle in radians
3511  writeGroup( 41, width * 1.1 ); // Reference rectangle width
3512 
3513  // Attachment point:
3514  // 1 2 3
3515  // 4 5 6
3516  // 7 8 9
3517  writeGroup( 71, 7 );
3518 
3519  writeGroup( 7, "STANDARD" ); // so far only support for standard font
3520 }
3521 
3522 void QgsDxfExport::writeSolid( const QString& layer, QColor color, const QgsPoint& pt1, const QgsPoint& pt2, const QgsPoint& pt3, const QgsPoint& pt4 )
3523 {
3524  // pt1 pt2
3525  // pt3 pt4
3526  int i = 0;
3527  QgsPolygon p( 1 );
3528  p[0].resize( pt3 != pt4 ? 5 : 4 );
3529  p[0][i++] = pt1;
3530  p[0][i++] = pt2;
3531  p[0][i++] = pt4;
3532  if ( p[0].size() == 5 )
3533  p[0][i++] = pt3;
3534  p[0][i] = pt1;
3535 
3536  writePolygon( p, layer, "SOLID", color );
3537 }
3538 
3539 void QgsDxfExport::writeVertex( const QgsPoint& pt, const QString& layer )
3540 {
3541  writeGroup( 0, "VERTEX" );
3542  writeHandle();
3543  writeGroup( 100, "AcDbEntity" );
3544  writeGroup( 100, "AcDbVertex" );
3545  writeGroup( 100, "AcDb2dVertex" );
3546  writeGroup( 8, layer );
3547  writeGroup( 0, pt, 0.0, false );
3548 }
3549 
3550 QgsRectangle QgsDxfExport::dxfExtent() const
3551 {
3553  QList< QPair<QgsVectorLayer*, int> >::const_iterator layerIt = mLayers.constBegin();
3554  for ( ; layerIt != mLayers.constEnd(); ++layerIt )
3555  {
3556  if ( layerIt->first )
3557  {
3558  if ( extent.isEmpty() )
3559  {
3560  extent = layerIt->first->extent();
3561  }
3562  else
3563  {
3564  QgsRectangle layerExtent = layerIt->first->extent();
3565  extent.combineExtentWith( &layerExtent );
3566  }
3567  }
3568  }
3569  return extent;
3570 }
3571 
3572 void QgsDxfExport::addFeature( const QgsSymbolV2RenderContext& ctx, const QString& layer, const QgsSymbolLayerV2* symbolLayer, const QgsSymbolV2* symbol )
3573 {
3574  const QgsFeature* fet = ctx.feature();
3575  if ( !fet )
3576  return;
3577 
3578  if ( !fet->constGeometry() )
3579  return;
3580 
3581  const QgsGeometry *geom = fet->constGeometry();
3582 
3583  QGis::WkbType geometryType = geom->wkbType();
3584 
3585  QColor penColor;
3586  QColor brushColor;
3587  if ( mSymbologyExport != NoSymbology )
3588  {
3589  penColor = colorFromSymbolLayer( symbolLayer, ctx );
3590  brushColor = symbolLayer->dxfBrushColor( ctx );
3591  }
3592 
3593  Qt::PenStyle penStyle( Qt::SolidLine );
3594  Qt::BrushStyle brushStyle( Qt::NoBrush );
3595  double width = -1;
3596  double offset = 0.0;
3597  if ( mSymbologyExport != NoSymbology && symbolLayer )
3598  {
3599  width = symbolLayer->dxfWidth( *this, ctx );
3600  offset = symbolLayer->dxfOffset( *this, ctx );
3601  penStyle = symbolLayer->dxfPenStyle();
3602  brushStyle = symbolLayer->dxfBrushStyle();
3603 
3604  if ( qgsDoubleNear( offset, 0.0 ) )
3605  offset = 0.0;
3606  }
3607 
3608  QString lineStyleName = "CONTINUOUS";
3609  if ( mSymbologyExport != NoSymbology )
3610  {
3611  lineStyleName = lineStyleFromSymbolLayer( symbolLayer );
3612  }
3613 
3614  // single point
3615  if ( geometryType == QGis::WKBPoint || geometryType == QGis::WKBPoint25D )
3616  {
3617  writePoint( geom->asPoint(), layer, penColor, fet, symbolLayer, symbol );
3618  return;
3619  }
3620 
3621  // multipoint
3622  if ( geometryType == QGis::WKBMultiPoint || geometryType == QGis::WKBMultiPoint25D )
3623  {
3624  QgsMultiPoint multiPoint = geom->asMultiPoint();
3625  QgsMultiPoint::const_iterator it = multiPoint.constBegin();
3626  for ( ; it != multiPoint.constEnd(); ++it )
3627  {
3628  writePoint( *it, layer, penColor, fet, symbolLayer, symbol );
3629  }
3630 
3631  return;
3632  }
3633 
3634  if ( penStyle != Qt::NoPen )
3635  {
3636  // single line
3637  if ( geometryType == QGis::WKBLineString || geometryType == QGis::WKBLineString25D )
3638  {
3639  QgsGeometry* nonConstGeom = new QgsGeometry( *geom );
3640  QgsGeometry* offsetLine = offset == 0.0 ? nonConstGeom : nonConstGeom->offsetCurve( offset, 0, GEOSBUF_JOIN_MITRE, 2.0 );
3641  if ( !offsetLine )
3642  offsetLine = nonConstGeom;
3643 
3644  writePolyline( offsetLine->asPolyline(), layer, lineStyleName, penColor, width );
3645 
3646  if ( offsetLine != nonConstGeom )
3647  delete offsetLine;
3648  delete nonConstGeom;
3649  }
3650 
3651  // multiline
3652  if ( geometryType == QGis::WKBMultiLineString || geometryType == QGis::WKBMultiLineString25D )
3653  {
3654  QgsGeometry* nonConstGeom = new QgsGeometry( *geom );
3655  QgsGeometry *offsetLine = offset == 0.0 ? nonConstGeom : nonConstGeom->offsetCurve( offset, 0, GEOSBUF_JOIN_MITRE, 2.0 );
3656  if ( !offsetLine )
3657  offsetLine = nonConstGeom;
3658 
3659  QgsMultiPolyline multiLine = offsetLine->asMultiPolyline();
3660  QgsMultiPolyline::const_iterator lIt = multiLine.constBegin();
3661  for ( ; lIt != multiLine.constEnd(); ++lIt )
3662  {
3663  writePolyline( *lIt, layer, lineStyleName, penColor, width );
3664  }
3665 
3666  if ( offsetLine != nonConstGeom )
3667  delete offsetLine;
3668  delete nonConstGeom;
3669  }
3670 
3671  // polygon
3672  if ( geometryType == QGis::WKBPolygon || geometryType == QGis::WKBPolygon25D )
3673  {
3674  QgsGeometry* nonConstGeom = new QgsGeometry( *geom );
3675  QgsGeometry *offsetPolygon = offset == 0.0 ? nonConstGeom : nonConstGeom->buffer( -offset, 0, GEOSBUF_CAP_FLAT, GEOSBUF_JOIN_MITRE, 2.0 );
3676  if ( !offsetPolygon )
3677  offsetPolygon = nonConstGeom;
3678 
3679  QgsPolygon polygon = offsetPolygon->asPolygon();
3680  QgsPolygon::const_iterator polyIt = polygon.constBegin();
3681  for ( ; polyIt != polygon.constEnd(); ++polyIt ) // iterate over rings
3682  {
3683  writePolyline( *polyIt, layer, lineStyleName, penColor, width );
3684  }
3685 
3686  if ( offsetPolygon != nonConstGeom )
3687  delete offsetPolygon;
3688  delete nonConstGeom;
3689  }
3690 
3691  // multipolygon or polygon
3692  if ( geometryType == QGis::WKBMultiPolygon || geometryType == QGis::WKBMultiPolygon25D )
3693  {
3694  QgsGeometry* nonConstGeom = new QgsGeometry( *geom );
3695  QgsGeometry *offsetPolygon = offset == 0.0 ? nonConstGeom : nonConstGeom->buffer( -offset, 0, GEOSBUF_CAP_FLAT, GEOSBUF_JOIN_MITRE, 2.0 );
3696  if ( !offsetPolygon )
3697  offsetPolygon = nonConstGeom;
3698 
3699  QgsMultiPolygon mp = offsetPolygon->asMultiPolygon();
3701  for ( ; mpIt != mp.constEnd(); ++mpIt )
3702  {
3703  QgsPolygon::const_iterator polyIt = mpIt->constBegin();
3704  for ( ; polyIt != mpIt->constEnd(); ++polyIt )
3705  {
3706  writePolyline( *polyIt, layer, lineStyleName, penColor, width );
3707  }
3708  }
3709 
3710  if ( offsetPolygon != nonConstGeom )
3711  delete offsetPolygon;
3712  delete nonConstGeom;
3713  }
3714  }
3715 
3716  if ( brushStyle != Qt::NoBrush )
3717  {
3718  // polygon
3719  if ( geometryType == QGis::WKBPolygon || geometryType == QGis::WKBPolygon25D )
3720  {
3721  QgsPolygon polygon = geom->asPolygon();
3722  writePolygon( polygon, layer, "SOLID", brushColor );
3723  }
3724 
3725  // multipolygon or polygon
3726  if ( geometryType == QGis::WKBMultiPolygon || geometryType == QGis::WKBMultiPolygon25D )
3727  {
3728  QgsMultiPolygon mp = geom->asMultiPolygon();
3730  for ( ; mpIt != mp.constEnd(); ++mpIt )
3731  {
3732  writePolygon( *mpIt, layer, "SOLID", brushColor );
3733  }
3734  }
3735  }
3736 }
3737 
3738 QColor QgsDxfExport::colorFromSymbolLayer( const QgsSymbolLayerV2* symbolLayer, const QgsSymbolV2RenderContext& ctx )
3739 {
3740  if ( !symbolLayer )
3741  return QColor();
3742 
3743  return symbolLayer->dxfColor( ctx );
3744 }
3745 
3746 QString QgsDxfExport::lineStyleFromSymbolLayer( const QgsSymbolLayerV2* symbolLayer )
3747 {
3748  QString lineStyleName = "CONTINUOUS";
3749  if ( !symbolLayer )
3750  {
3751  return lineStyleName;
3752  }
3753 
3754  QHash< const QgsSymbolLayerV2*, QString >::const_iterator lineTypeIt = mLineStyles.find( symbolLayer );
3755  if ( lineTypeIt != mLineStyles.constEnd() )
3756  {
3757  lineStyleName = lineTypeIt.value();
3758  return lineStyleName;
3759  }
3760  else
3761  {
3762  return lineNameFromPenStyle( symbolLayer->dxfPenStyle() );
3763  }
3764 }
3765 
3767 {
3768  int idx = 0;
3769  int current_distance = INT_MAX;
3770  for ( size_t i = 1; i < sizeof( mDxfColors ) / sizeof( *mDxfColors ); ++i )
3771  {
3772  int dist = color_distance( pixel, i );
3773  if ( dist < current_distance )
3774  {
3775  current_distance = dist;
3776  idx = i;
3777  if ( dist == 0 )
3778  break;
3779  }
3780  }
3781  return idx;
3782 }
3783 
3784 int QgsDxfExport::color_distance( QRgb p1, int index )
3785 {
3786  if ( index > 255 || index < 0 )
3787  {
3788  return 0;
3789  }
3790 
3791  double redDiff = qRed( p1 ) - mDxfColors[index][0];
3792  double greenDiff = qGreen( p1 ) - mDxfColors[index][1];
3793  double blueDiff = qBlue( p1 ) - mDxfColors[index][2];
3794 #if 0
3795  QgsDebugMsg( QString( "color_distance( r:%1 g:%2 b:%3 <=> i:%4 r:%5 g:%6 b:%7 ) => %8" )
3796  .arg( qRed( p1 ) ).arg( qGreen( p1 ) ).arg( qBlue( p1 ) )
3797  .arg( index )
3798  .arg( mDxfColors[index][0] )
3799  .arg( mDxfColors[index][1] )
3800  .arg( mDxfColors[index][2] )
3801  .arg( redDiff * redDiff + greenDiff * greenDiff + blueDiff * blueDiff ) );
3802 #endif
3803  return redDiff * redDiff + greenDiff * greenDiff + blueDiff * blueDiff;
3804 }
3805 
3806 QRgb QgsDxfExport::createRgbEntry( qreal r, qreal g, qreal b )
3807 {
3808  return QColor::fromRgbF( r, g, b ).rgb();
3809 }
3810 
3811 QgsRenderContext QgsDxfExport::renderContext() const
3812 {
3813  QgsRenderContext context;
3814  context.setRendererScale( mSymbologyScaleDenominator );
3815  return context;
3816 }
3817 
3818 double QgsDxfExport::mapUnitScaleFactor( double scaleDenominator, QgsSymbolV2::OutputUnit symbolUnits, QGis::UnitType mapUnits )
3819 {
3820  if ( symbolUnits == QgsSymbolV2::MapUnit )
3821  {
3822  return 1.0;
3823  }
3824  // MM symbol unit
3825  return scaleDenominator * QGis::fromUnitToUnitFactor( QGis::Meters, mapUnits ) / 1000.0;
3826 }
3827 
3828 QList< QPair< QgsSymbolLayerV2*, QgsSymbolV2* > > QgsDxfExport::symbolLayers( QgsRenderContext &context )
3829 {
3831 
3832  QList< QPair< QgsVectorLayer*, int> >::iterator lIt = mLayers.begin();
3833  for ( ; lIt != mLayers.end(); ++lIt )
3834  {
3835  // cast to vector layer
3836  QgsVectorLayer* vl = lIt->first;
3837  if ( !vl )
3838  {
3839  continue;
3840  }
3841 
3842  // get rendererv2
3843  QgsFeatureRendererV2* r = vl->rendererV2();
3844  if ( !r )
3845  {
3846  continue;
3847  }
3848 
3849  // get all symbols
3850  QgsSymbolV2List symbols = r->symbols( context );
3851  QgsSymbolV2List::iterator symbolIt = symbols.begin();
3852  for ( ; symbolIt != symbols.end(); ++symbolIt )
3853  {
3854  int maxSymbolLayers = ( *symbolIt )->symbolLayerCount();
3855  if ( mSymbologyExport != SymbolLayerSymbology )
3856  {
3857  maxSymbolLayers = 1;
3858  }
3859  for ( int i = 0; i < maxSymbolLayers; ++i )
3860  {
3861  symbolLayers.append( qMakePair(( *symbolIt )->symbolLayer( i ), *symbolIt ) );
3862  }
3863  }
3864  }
3865 
3866  return symbolLayers;
3867 }
3868 
3869 void QgsDxfExport::writeDefaultLinetypes()
3870 {
3871  // continuous (Qt solid line)
3872  foreach ( QString ltype, QStringList() << "ByLayer" << "ByBlock" << "CONTINUOUS" )
3873  {
3874  writeGroup( 0, "LTYPE" );
3875  writeHandle();
3876  writeGroup( 100, "AcDbSymbolTableRecord" );
3877  writeGroup( 100, "AcDbLinetypeTableRecord" );
3878  writeGroup( 2, ltype );
3879  writeGroup( 70, 64 );
3880  writeGroup( 3, "Defaultstyle" );
3881  writeGroup( 72, 65 );
3882  writeGroup( 73, 0 );
3883  writeGroup( 40, 0.0 );
3884  }
3885 
3886  double das = dashSize();
3887  double dss = dashSeparatorSize();
3888  double dos = dotSize();
3889 
3890  QVector<qreal> dashVector( 2 );
3891  dashVector[0] = das;
3892  dashVector[1] = dss;
3893  writeLinetype( "DASH", dashVector, QgsSymbolV2::MapUnit );
3894 
3895  QVector<qreal> dotVector( 2 );
3896  dotVector[0] = dos;
3897  dotVector[1] = dss;
3898  writeLinetype( "DOT", dotVector, QgsSymbolV2::MapUnit );
3899 
3900  QVector<qreal> dashDotVector( 4 );
3901  dashDotVector[0] = das;
3902  dashDotVector[1] = dss;
3903  dashDotVector[2] = dos;
3904  dashDotVector[3] = dss;
3905  writeLinetype( "DASHDOT", dashDotVector, QgsSymbolV2::MapUnit );
3906 
3907  QVector<qreal> dashDotDotVector( 6 );
3908  dashDotDotVector[0] = das;
3909  dashDotDotVector[1] = dss;
3910  dashDotDotVector[2] = dos;
3911  dashDotDotVector[3] = dss;
3912  dashDotDotVector[4] = dos;
3913  dashDotDotVector[5] = dss;
3914  writeLinetype( "DASHDOTDOT", dashDotDotVector, QgsSymbolV2::MapUnit );
3915 }
3916 
3917 void QgsDxfExport::writeSymbolLayerLinetype( const QgsSymbolLayerV2* symbolLayer )
3918 {
3919  if ( !symbolLayer )
3920  {
3921  return;
3922  }
3923 
3925  QVector<qreal> customLinestyle = symbolLayer->dxfCustomDashPattern( unit );
3926  if ( customLinestyle.size() > 0 )
3927  {
3928  QString name = QString( "symbolLayer%1" ).arg( mSymbolLayerCounter++ );
3929  writeLinetype( name, customLinestyle, unit );
3930  mLineStyles.insert( symbolLayer, name );
3931  }
3932 }
3933 
3934 int QgsDxfExport::nLineTypes( const QList< QPair< QgsSymbolLayerV2*, QgsSymbolV2* > >& symbolLayers )
3935 {
3936  int nLineTypes = 0;
3937  QList< QPair< QgsSymbolLayerV2*, QgsSymbolV2*> >::const_iterator slIt = symbolLayers.constBegin();
3938  for ( ; slIt != symbolLayers.constEnd(); ++slIt )
3939  {
3940  const QgsSimpleLineSymbolLayerV2* simpleLine = dynamic_cast< const QgsSimpleLineSymbolLayerV2* >( slIt->first );
3941  if ( simpleLine )
3942  {
3943  if ( simpleLine->useCustomDashPattern() )
3944  {
3945  ++nLineTypes;
3946  }
3947  }
3948  }
3949  return nLineTypes;
3950 }
3951 
3952 void QgsDxfExport::writeLinetype( const QString& styleName, const QVector<qreal>& pattern, QgsSymbolV2::OutputUnit u )
3953 {
3954  double length = 0;
3955  QVector<qreal>::const_iterator dashIt = pattern.constBegin();
3956  for ( ; dashIt != pattern.constEnd(); ++dashIt )
3957  {
3958  length += ( *dashIt * mapUnitScaleFactor( mSymbologyScaleDenominator, u, mMapUnits ) );
3959  }
3960 
3961  writeGroup( 0, "LTYPE" );
3962  writeHandle();
3963  // 330 5
3964  writeGroup( 100, "AcDbSymbolTableRecord" );
3965  writeGroup( 100, "AcDbLinetypeTableRecord" );
3966  writeGroup( 2, styleName );
3967  writeGroup( 70, 64 ); // 0?
3968  writeGroup( 3, "" );
3969  writeGroup( 72, 65 );
3970  writeGroup( 73, pattern.size() );
3971  writeGroup( 40, length );
3972 
3973  dashIt = pattern.constBegin();
3974  bool isGap = false;
3975  for ( ; dashIt != pattern.constEnd(); ++dashIt )
3976  {
3977  // map units or mm?
3978  double segmentLength = ( isGap ? -*dashIt : *dashIt );
3979  segmentLength *= mapUnitScaleFactor( mSymbologyScaleDenominator, u, mMapUnits );
3980  writeGroup( 49, segmentLength );
3981  writeGroup( 74, 0 );
3982  isGap = !isGap;
3983  }
3984 }
3985 
3986 bool QgsDxfExport::hasDataDefinedProperties( const QgsSymbolLayerV2* sl, const QgsSymbolV2* symbol )
3987 {
3988  if ( !sl || !symbol )
3989  {
3990  return false;
3991  }
3992 
3995  {
3996  return true;
3997  }
3998 
3999  return sl->hasDataDefinedProperties();
4000 }
4001 
4002 double QgsDxfExport::dashSize() const
4003 {
4004  double size = mSymbologyScaleDenominator * 0.002;
4005  return sizeToMapUnits( size );
4006 }
4007 
4008 double QgsDxfExport::dotSize() const
4009 {
4010  double size = mSymbologyScaleDenominator * 0.0006;
4011  return sizeToMapUnits( size );
4012 }
4013 
4014 double QgsDxfExport::dashSeparatorSize() const
4015 {
4016  double size = mSymbologyScaleDenominator * 0.0006;
4017  return sizeToMapUnits( size );
4018 }
4019 
4020 double QgsDxfExport::sizeToMapUnits( double s ) const
4021 {
4022  double size = s * QGis::fromUnitToUnitFactor( QGis::Meters, mMapUnits );
4023  return size;
4024 }
4025 
4026 QString QgsDxfExport::lineNameFromPenStyle( Qt::PenStyle style )
4027 {
4028  switch ( style )
4029  {
4030  case Qt::DashLine:
4031  return "DASH";
4032  case Qt::DotLine:
4033  return "DOT";
4034  case Qt::DashDotLine:
4035  return "DASHDOT";
4036  case Qt::DashDotDotLine:
4037  return "DASHDOTDOT";
4038  case Qt::SolidLine:
4039  default:
4040  return "CONTINUOUS";
4041  }
4042 }
4043 
4045 {
4046  if ( name.isEmpty() )
4047  return "0";
4048 
4049  // dxf layers can be max 255 characters long
4050  QString layerName = name.left( 255 );
4051 
4052  // replaced restricted characters with underscore
4053  // < > / \ " : ; ? * | = '
4054  // See http://docs.autodesk.com/ACD/2010/ENU/AutoCAD%202010%20User%20Documentation/index.html?url=WS1a9193826455f5ffa23ce210c4a30acaf-7345.htm,topicNumber=d0e41665
4055  layerName.replace( "<", "_" );
4056  layerName.replace( ">", "_" );
4057  layerName.replace( "/", "_" );
4058  layerName.replace( "\\", "_" );
4059  layerName.replace( "\"", "_" );
4060  layerName.replace( ":", "_" );
4061  layerName.replace( ";", "_" );
4062  layerName.replace( "?", "_" );
4063  layerName.replace( "*", "_" );
4064  layerName.replace( "|", "_" );
4065  layerName.replace( "=", "_" );
4066  layerName.replace( "\'", "_" );
4067 
4068  return layerName;
4069 }
4070 
4071 bool QgsDxfExport::layerIsScaleBasedVisible( const QgsMapLayer* layer ) const
4072 {
4073  if ( !layer )
4074  return false;
4075 
4076  if ( mSymbologyExport == QgsDxfExport::NoSymbology || !layer->hasScaleBasedVisibility() )
4077  return true;
4078 
4079  return layer->minimumScale() < mSymbologyScaleDenominator &&
4080  layer->maximumScale() > mSymbologyScaleDenominator;
4081 }
4082 
4084 {
4085  QList< QPair<QgsVectorLayer*, int> >::const_iterator layerIt = mLayers.constBegin();
4086  for ( ; layerIt != mLayers.constEnd(); ++layerIt )
4087  {
4088  if ( layerIt->first && layerIt->first->id() == id )
4089  return dxfLayerName( layerIt->second < 0 ? layerIt->first->name() : f.attribute( layerIt->second ).toString() );
4090  }
4091 
4092  return "0";
4093 }
4094 
4096 {
4097  foreach ( QByteArray codec, QTextCodec::availableCodecs() )
4098  {
4099  if ( name != codec )
4100  continue;
4101 
4102  int i;
4103  for ( i = 0; i < ( int )( sizeof( mDxfEncodings ) / sizeof( *mDxfEncodings ) ) && name != mDxfEncodings[i][1]; ++i )
4104  ;
4105 
4106  if ( i == ( int )( sizeof( mDxfEncodings ) / sizeof( *mDxfEncodings ) ) )
4107  continue;
4108 
4109  return mDxfEncodings[i][0];
4110  }
4111 
4112  return QString::null;
4113 }
4114 
4116 {
4118  foreach ( QByteArray codec, QTextCodec::availableCodecs() )
4119  {
4120  int i;
4121  for ( i = 0; i < ( int )( sizeof( mDxfEncodings ) / sizeof( *mDxfEncodings ) ) && strcmp( codec.data(), mDxfEncodings[i][1] ) != 0; ++i )
4122  ;
4123 
4124  if ( i < ( int )( sizeof( mDxfEncodings ) / sizeof( *mDxfEncodings ) ) )
4125  encodings << codec.data();
4126  }
4127  return encodings;
4128 }
static double mapUnitScaleFactor(double scaleDenominator, QgsSymbolV2::OutputUnit symbolUnits, QGis::UnitType mapUnits)
void setCodec(QTextCodec *codec)
const QString & name() const
Gets the name of the field.
Definition: qgsfield.cpp:70
Wrapper for iterator of features from vector data provider or vector layer.
void writePoint(const QString &layer, QColor color, const QgsPoint &pt)
Write point.
static unsigned index
A rectangle specified with double values.
Definition: qgsrectangle.h:35
Base class for all map layer types.
Definition: qgsmaplayer.h:49
bool isEmpty() const
test if rectangle is empty.
iterator insert(const Key &key, const T &value)
virtual Qt::PenStyle dxfPenStyle() const
virtual double dxfWidth(const QgsDxfExport &e, const QgsSymbolV2RenderContext &context) const
const Key key(const T &value) const
virtual double dxfOffset(const QgsDxfExport &e, const QgsSymbolV2RenderContext &context) const
void addLayers(const QList< QPair< QgsVectorLayer *, int > > &layers)
void writeGroup(int code, int i)
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
#define QgsDebugMsg(str)
Definition: qgslogger.h:33
QgsFields fields() const
Returns the list of fields of this layer.
UnitType
Map units that qgis supports.
Definition: qgis.h:229
int size() const
void writePolygon(const QgsPolygon &polygon, const QString &layer, const QString &hatchPattern, QColor color)
Draw dxf polygon (HATCH)
QgsMultiPolyline asMultiPolyline() const
Return contents of the geometry as a multi linestring if wkbType is WKBMultiLineString, otherwise an empty list.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest())
Query the provider for features specified in request.
QgsPolygon asPolygon() const
Return contents of the geometry as a polygon if wkbType is WKBPolygon, otherwise an empty list...
Q_DECL_DEPRECATED void writeSolid(const QString &layer, QColor color, const QgsPoint &pt1, const QgsPoint &pt2, const QgsPoint &pt3, const QgsPoint &pt4)
Draw solid.
const_iterator constEnd() const
void setRendererScale(double scale)
float minimumScale() const
Returns the minimum scale denominator at which the layer is visible.
bool contains(const QString &str, Qt::CaseSensitivity cs) const
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
static QStringList encodings()
return list of available DXF encodings
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:75
QgsSymbolV2::OutputUnit sizeUnit() const
The QGis class provides global constants for use throughout the application.
Definition: qgis.h:34
virtual QList< QString > usedAttributes()=0
WkbType
Used for symbology operations.
Definition: qgis.h:53
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
Definition: qgsfeature.h:162
virtual bool open(QFlags< QIODevice::OpenModeFlag > mode)
static int closestColorMatch(QRgb pixel)
bool qgsDoubleNear(double a, double b, double epsilon=4 *DBL_EPSILON)
Definition: qgis.h:350
double x() const
Get the x value of the point.
Definition: qgspoint.h:126
void writeInt(int i)
void writeCircle(const QString &layer, QColor color, const QgsPoint &pt, double radius, const QString &lineStyleName, double width)
Write circle (as polyline)
int size() const
virtual void startRender(QgsRenderContext &context, const QgsFields &fields)=0
Needs to be called when a new render cycle is started.
QgsMultiPolygon asMultiPolygon() const
Return contents of the geometry as a multi polygon if wkbType is WKBMultiPolygon, otherwise an empty ...
QGis::WkbType wkbType() const
Returns the WKBType or WKBUnknown in case of error.
virtual void stopRender(QgsRenderContext &context)=0
void writeString(const QString &s)
const QString & name() const
Get the display name of the layer.
QgsRectangle extent() const
Definition: qgsdxfexport.h:60
bool exists(int i) const
Return if a field index is valid.
Definition: qgsfield.cpp:295
QgsFeatureRendererV2 * rendererV2()
Return renderer V2.
#define DXF_HANDMAX
int count(const T &value) const
void combineExtentWith(QgsRectangle *rect)
expand the rectangle so that covers both the original rectangle and the given rectangle ...
virtual Q_DECL_DEPRECATED QgsSymbolV2 * symbolForFeature(QgsFeature &feature)
To be overridden.
void append(const T &value)
static QgsExpressionContextScope * globalScope()
Creates a new scope which contains variables and functions relating to the global QGIS context...
bool hasScaleBasedVisibility() const
Returns whether scale based visibility is enabled for the layer.
void resize(int size)
const QgsFeature * feature() const
Current feature being rendered - may be null.
Definition: qgssymbolv2.h:263
const_iterator constEnd() const
void setDevice(QIODevice *device)
virtual QVector< qreal > dxfCustomDashPattern(QgsSymbolV2::OutputUnit &unit) const
QRgb rgb() const
qreal alpha() const
Get alpha transparency 1 for opaque, 0 for invisible.
Definition: qgssymbolv2.h:178
int red() const
float maximumScale() const
Returns the maximum scale denominator at which the layer is visible.
void writeGroupCode(int code)
bool isEmpty() const
This class wraps a request for features to a vector layer (or directly its vector data provider)...
int symbolLayerCount()
Returns total number of symbol layers contained in the symbol.
Definition: qgssymbolv2.h:113
QString id() const
Get this layer's unique ID, this ID is used to access this layer from map layer registry.
Definition: qgsmaplayer.cpp:99
bool isOpen() const
QGis::WkbType wkbType() const
Returns type of the geometry as a WKB type (point / linestring / polygon etc.)
void writeLine(const QgsPoint &pt1, const QgsPoint &pt2, const QString &layer, const QString &lineStyleName, QColor color, double width=-1)
Write line (as a polyline)
T & first()
int writeToFile(QIODevice *d, QString codec)
#define DXF_HANDSEED
virtual Q_DECL_DEPRECATED QgsSymbolV2List symbols()
for symbol levels
const QgsField & at(int i) const
Get field at particular index (must be in range 0..N-1)
Definition: qgsfield.cpp:305
virtual QColor dxfBrushColor(const QgsSymbolV2RenderContext &context) const
virtual bool hasDataDefinedProperties() const
Checks whether the layer has any associated data defined properties.
int alpha() const
QTextCodec * codec() const
QgsGeometry * buffer(double distance, int segments) const
Returns a buffer region around this geometry having the given width and with a specified number of se...
A class to represent a point.
Definition: qgspoint.h:63
static QString dxfEncoding(const QString &name)
return DXF encoding for Qt encoding
virtual QColor dxfColor(const QgsSymbolV2RenderContext &context) const
int green() const
virtual bool writeDxf(QgsDxfExport &e, double mmMapUnitScaleFactor, const QString &layerName, const QgsSymbolV2RenderContext *context, const QgsFeature *f, const QPointF &shift=QPointF(0.0, 0.0)) const
void clear()
double ANALYSIS_EXPORT angle(Point3D *p1, Point3D *p2, Point3D *p3, Point3D *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
iterator end()
const T value(const Key &key) const
QByteArray toLocal8Bit() const
A class to represent a vector.
Definition: qgspoint.h:32
iterator find(const Key &key)
bool contains(QChar ch, Qt::CaseSensitivity cs) const
QColor fromRgbF(qreal r, qreal g, qreal b, qreal a)
QString qgsDoubleToString(const double &a, const int &precision=17)
Definition: qgis.h:339
int renderingPass() const
QgsExpressionContext & expressionContext()
Gets the expression context.
void startRender(QgsSymbolV2RenderContext &context) override
static QString dxfLayerName(const QString &name)
Return cleaned layer name for use in DXF.
QgsPolyline asPolyline() const
Return contents of the geometry as a polyline if wkbType is WKBLineString, otherwise an empty list...
QString & replace(int position, int n, QChar after)
int blue() const
const_iterator constBegin() const
QList< QByteArray > availableCodecs()
Contains information about the context of a rendering operation.
virtual Qt::BrushStyle dxfBrushStyle() const
QVariant attribute(const QString &name) const
Lookup attribute value from attribute name.
Definition: qgsfeature.cpp:236
QString mid(int position, int n) const
QList< QPolygonF > offsetLine(QPolygonF polyline, double dist, QGis::GeometryType geometryType)
calculate geometry shifted by a specified distance
virtual Q_DECL_DEPRECATED QgsSymbolV2List symbolsForFeature(QgsFeature &feat)
return list of symbols used for rendering the feature.
QgsGeometry * offsetCurve(double distance, int segments, int joinStyle, double mitreLimit) const
Returns an offset line at a given distance and side from an input line.
#define DXF_HANDPLOTSTYLE
QgsMultiPoint asMultiPoint() const
Return contents of the geometry as a multi point if wkbType is WKBMultiPoint, otherwise an empty list...
QgsSymbolV2 * symbol()
Definition: qgsrendererv2.h:57
bool usingSymbolLevels() const
void writeFilledCircle(const QString &layer, QColor color, const QgsPoint &pt, double radius)
Write filled circle (as hatch)
void writeDouble(double d)
const QgsGeometry * constGeometry() const
Gets a const pointer to the geometry object associated with this feature.
Definition: qgsfeature.cpp:68
static double fromUnitToUnitFactor(QGis::UnitType fromUnit, QGis::UnitType toUnit)
Returns the conversion factor between the specified units.
Definition: qgis.cpp:136
int length() const
bool canEncode(QChar ch) const
char * data()
QString left(int n) const
double y() const
Get the y value of the point.
Definition: qgspoint.h:134
typedef const_iterator
static QgsExpressionContextScope * projectScope()
Creates a new scope which contains variables and functions relating to the current QGIS project...
QgsSymbolLayerV2 * symbolLayer(int layer)
Returns a specific symbol layers contained in the symbol.
iterator end()
static QgsExpressionContextScope * layerScope(const QgsMapLayer *layer)
Creates a new scope which contains variables and functions relating to a QgsMapLayer.
const_iterator constEnd() const
virtual int capabilities()
returns bitwise OR-ed capabilities of the renderer
bool nextFeature(QgsFeature &f)
const_iterator constBegin() const
Geometry is not required. It may still be returned if e.g. required for a filter condition.
int writeHandle(int code=5, int handle=0)
QgsPoint asPoint() const
Return contents of the geometry as a point if wkbType is WKBPoint, otherwise returns [0...
void writePolyline(const QgsPolyline &line, const QString &layer, const QString &lineStyleName, QColor color, double width=-1)
Draw dxf primitives (LWPOLYLINE)
int size() const
Represents a vector layer which manages a vector based data sets.
QgsFeatureRequest & setFlags(Flags flags)
Set flags that affect how features will be fetched.
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
QString toString() const
virtual void stopRender(QgsSymbolV2RenderContext &context)=0
iterator begin()
void writeMText(const QString &layer, const QString &text, const QgsPoint &pt, double width, double angle, QColor color)
Write mtext (MTEXT)
QgsFeatureRequest & setFilterRect(const QgsRectangle &rect)
Set rectangle from which features will be taken.
QString layerName(const QString &id, const QgsFeature &f) const
QgsDxfExport & operator=(const QgsDxfExport &dxfExport)
QRgb rgba() const
void writeText(const QString &layer, const QString &text, const QgsPoint &pt, double size, double angle, QColor color)
Write text (TEXT)
int renderHints() const
Definition: qgssymbolv2.h:183