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