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