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::writeCircle( const QString& layer, QColor color, const QgsPoint& pt, double radius )
3331 {
3332  writeGroup( 0, "CIRCLE" );
3333  writeHandle();
3334  writeGroup( 100, "AcDbEntity" );
3335  writeGroup( 100, "AcDbCircle" );
3336  writeGroup( 8, layer );
3337  writeGroup( color );
3338  writeGroup( 0, pt );
3339  writeGroup( 40, radius );
3340 
3341 #if 0
3342  writeGroup( 0, "HATCH" );
3343  writeHandle();
3344  writeGroup( 330, mModelSpaceBR );
3345  writeGroup( 100, "AcDbEntity" );
3346  writeGroup( 100, "AcDbHatch" );
3347  writeGroup( 8, layer );
3348  writeGroup( color );
3349  writeGroup( 0, QgsPoint( 0.0, 0.0 ) ); // elevation point
3350  writeGroup( 200, QgsPoint( 0, 0 ), 1.0 ); // Extrusion direction
3351  writeGroup( 2, "SOLID" ); // hatch pattern
3352  writeGroup( 70, 1 ); // solid fill flag
3353  writeGroup( 71, 0 ); // non-associative
3354  writeGroup( 91, 1 ); // 1 loop
3355  writeGroup( 92, 0 ); // Default edge type
3356  writeGroup( 72, 2 ); // Edge type Arc
3357  writeGroup( 93, 1 ); // Is closed
3358 
3359  writeGroup( 0, QgsPoint( pt.x(), pt.y() ), 0.0, false ); // center point
3360  writeGroup( 40, radius ); // radius
3361  writeGroup( 50, 0.0 ); // start angle
3362  writeGroup( 51, 2*M_PI ); // end angle
3363 
3364  writeGroup( 97, 0 ); // # of source boundary objects
3365  writeGroup( 75, 1 ); // odd parity hatch style
3366  writeGroup( 76, 1 ); // predefined hatch pattern
3367  writeGroup( 98, 0 ); // # of seed points
3368 #endif
3369 }
3370 
3371 void QgsDxfExport::writeText( const QString& layer, const QString& text, const QgsPoint& pt, double size, double angle, QColor color )
3372 {
3373  writeGroup( 0, "TEXT" );
3374  writeHandle();
3375  writeGroup( 100, "AcDbEntity" );
3376  writeGroup( 100, "AcDbText" );
3377  writeGroup( 8, layer );
3378  writeGroup( color );
3379  writeGroup( 0, pt );
3380  writeGroup( 40, size );
3381  writeGroup( 1, text );
3382  writeGroup( 50, angle );
3383  writeGroup( 7, "STANDARD" ); //so far only support for standard font
3384 }
3385 
3386 void QgsDxfExport::writeMText( const QString& layer, const QString& text, const QgsPoint& pt, double width, double angle, QColor color )
3387 {
3388  writeGroup( 0, "MTEXT" );
3389  writeHandle();
3390  writeGroup( 100, "AcDbEntity" );
3391  writeGroup( 100, "AcDbMText" );
3392  writeGroup( 8, layer );
3393  writeGroup( color );
3394 
3395  writeGroup( 0, pt );
3396 
3397  QString t( text );
3398  while ( t.length() > 250 )
3399  {
3400  writeGroup( 3, t.left( 250 ) );
3401  t = t.mid( 250 );
3402  }
3403  writeGroup( 1, text );
3404 
3405  writeGroup( 50, angle ); // Rotation angle in radians
3406  writeGroup( 41, width ); // Reference rectangle width
3407 
3408  // Attachment point:
3409  // 1 2 3
3410  // 4 5 6
3411  // 7 8 9
3412  writeGroup( 71, 7 );
3413 
3414  writeGroup( 7, "STANDARD" ); //so far only support for standard font
3415 }
3416 
3417 void QgsDxfExport::writeSolid( const QString& layer, QColor color, const QgsPoint& pt1, const QgsPoint& pt2, const QgsPoint& pt3, const QgsPoint& pt4 )
3418 {
3419  writeGroup( 0, "SOLID" );
3420  writeHandle();
3421  writeGroup( 100, "AcDbEntity" );
3422  writeGroup( 100, "AcDbTrace" );
3423  writeGroup( 8, layer );
3424  writeGroup( color );
3425  writeGroup( 0, pt1 );
3426  writeGroup( 1, pt2 );
3427  writeGroup( 2, pt3 );
3428  writeGroup( 3, pt4 );
3429 }
3430 
3431 void QgsDxfExport::writeVertex( const QgsPoint& pt, const QString& layer )
3432 {
3433  writeGroup( 0, "VERTEX" );
3434  writeHandle();
3435  writeGroup( 100, "AcDbEntity" );
3436  writeGroup( 100, "AcDbVertex" );
3437  writeGroup( 100, "AcDb2dVertex" );
3438  writeGroup( 8, layer );
3439  writeGroup( 0, pt, 0.0, false );
3440 }
3441 
3442 QgsRectangle QgsDxfExport::dxfExtent() const
3443 {
3445  QList< QPair<QgsVectorLayer*, int> >::const_iterator layerIt = mLayers.constBegin();
3446  for ( ; layerIt != mLayers.constEnd(); ++layerIt )
3447  {
3448  if ( layerIt->first )
3449  {
3450  if ( extent.isEmpty() )
3451  {
3452  extent = layerIt->first->extent();
3453  }
3454  else
3455  {
3456  QgsRectangle layerExtent = layerIt->first->extent();
3457  extent.combineExtentWith( &layerExtent );
3458  }
3459  }
3460  }
3461  return extent;
3462 }
3463 
3464 void QgsDxfExport::addFeature( const QgsSymbolV2RenderContext& ctx, const QString& layer, const QgsSymbolLayerV2* symbolLayer, const QgsSymbolV2* symbol )
3465 {
3466  const QgsFeature* fet = ctx.feature();
3467  if ( !fet )
3468  return;
3469 
3470  QgsGeometry *geom = fet->geometry();
3471  if ( !geom )
3472  return;
3473 
3474  QGis::WkbType geometryType = geom->wkbType();
3475 
3476  QColor penColor;
3477  QColor brushColor;
3478  if ( mSymbologyExport != NoSymbology )
3479  {
3480  penColor = colorFromSymbolLayer( symbolLayer, ctx );
3481  brushColor = symbolLayer->dxfBrushColor( ctx );
3482  }
3483 
3484  Qt::PenStyle penStyle( Qt::SolidLine );
3485  Qt::BrushStyle brushStyle( Qt::NoBrush );
3486  double width = -1;
3487  if ( mSymbologyExport != NoSymbology && symbolLayer )
3488  {
3489  width = symbolLayer->dxfWidth( *this, ctx );
3490  penStyle = symbolLayer->dxfPenStyle();
3491  brushStyle = symbolLayer->dxfBrushStyle();
3492  }
3493 
3494  QString lineStyleName = "CONTINUOUS";
3495  if ( mSymbologyExport != NoSymbology )
3496  {
3497  lineStyleName = lineStyleFromSymbolLayer( symbolLayer );
3498  }
3499 
3500  //single point
3501  if ( geometryType == QGis::WKBPoint || geometryType == QGis::WKBPoint25D )
3502  {
3503  writePoint( geom->asPoint(), layer, penColor, fet, symbolLayer, symbol );
3504  return;
3505  }
3506 
3507  //multipoint
3508  if ( geometryType == QGis::WKBMultiPoint || geometryType == QGis::WKBMultiPoint25D )
3509  {
3510  QgsMultiPoint multiPoint = geom->asMultiPoint();
3511  QgsMultiPoint::const_iterator it = multiPoint.constBegin();
3512  for ( ; it != multiPoint.constEnd(); ++it )
3513  {
3514  writePoint( *it, layer, penColor, fet, symbolLayer, symbol );
3515  }
3516 
3517  return;
3518  }
3519 
3520  if ( penStyle != Qt::NoPen )
3521  {
3522  //single line
3523  if ( geometryType == QGis::WKBLineString || geometryType == QGis::WKBLineString25D )
3524  {
3525  writePolyline( geom->asPolyline(), layer, lineStyleName, penColor, width, false );
3526  }
3527 
3528  //multiline
3529  if ( geometryType == QGis::WKBMultiLineString || geometryType == QGis::WKBMultiLineString25D )
3530  {
3531  QgsMultiPolyline multiLine = geom->asMultiPolyline();
3532  QgsMultiPolyline::const_iterator lIt = multiLine.constBegin();
3533  for ( ; lIt != multiLine.constEnd(); ++lIt )
3534  {
3535  writePolyline( *lIt, layer, lineStyleName, penColor, width, false );
3536  }
3537  }
3538 
3539  //polygon
3540  if ( geometryType == QGis::WKBPolygon || geometryType == QGis::WKBPolygon25D )
3541  {
3542  QgsPolygon polygon = geom->asPolygon();
3543  QgsPolygon::const_iterator polyIt = polygon.constBegin();
3544  for ( ; polyIt != polygon.constEnd(); ++polyIt ) //iterate over rings
3545  {
3546  writePolyline( *polyIt, layer, lineStyleName, penColor, width, true );
3547  }
3548  }
3549 
3550  //multipolygon or polygon
3551  if ( geometryType == QGis::WKBMultiPolygon || geometryType == QGis::WKBMultiPolygon25D )
3552  {
3553  QgsMultiPolygon mp = geom->asMultiPolygon();
3554  QgsMultiPolygon::const_iterator mpIt = mp.constBegin();
3555  for ( ; mpIt != mp.constEnd(); ++mpIt )
3556  {
3557  QgsPolygon::const_iterator polyIt = mpIt->constBegin();
3558  for ( ; polyIt != mpIt->constEnd(); ++polyIt )
3559  {
3560  writePolyline( *polyIt, layer, lineStyleName, penColor, width, true );
3561  }
3562  }
3563  }
3564  }
3565 
3566  if ( brushStyle != Qt::NoBrush )
3567  {
3568  //polygon
3569  if ( geometryType == QGis::WKBPolygon || geometryType == QGis::WKBPolygon25D )
3570  {
3571  QgsPolygon polygon = geom->asPolygon();
3572  writePolygon( polygon, layer, "SOLID", brushColor );
3573  }
3574 
3575  //multipolygon or polygon
3576  if ( geometryType == QGis::WKBMultiPolygon || geometryType == QGis::WKBMultiPolygon25D )
3577  {
3578  QgsMultiPolygon mp = geom->asMultiPolygon();
3579  QgsMultiPolygon::const_iterator mpIt = mp.constBegin();
3580  for ( ; mpIt != mp.constEnd(); ++mpIt )
3581  {
3582  writePolygon( *mpIt, layer, "SOLID", brushColor );
3583  }
3584  }
3585  }
3586 }
3587 
3588 QColor QgsDxfExport::colorFromSymbolLayer( const QgsSymbolLayerV2* symbolLayer, const QgsSymbolV2RenderContext& ctx )
3589 {
3590  if ( !symbolLayer )
3591  return QColor();
3592 
3593  return symbolLayer->dxfColor( ctx );
3594 }
3595 
3596 QString QgsDxfExport::lineStyleFromSymbolLayer( const QgsSymbolLayerV2* symbolLayer )
3597 {
3598  QString lineStyleName = "CONTINUOUS";
3599  if ( !symbolLayer )
3600  {
3601  return lineStyleName;
3602  }
3603 
3604  QHash< const QgsSymbolLayerV2*, QString >::const_iterator lineTypeIt = mLineStyles.find( symbolLayer );
3605  if ( lineTypeIt != mLineStyles.constEnd() )
3606  {
3607  lineStyleName = lineTypeIt.value();
3608  return lineStyleName;
3609  }
3610  else
3611  {
3612  return lineNameFromPenStyle( symbolLayer->dxfPenStyle() );
3613  }
3614 }
3615 
3617 {
3618  int idx = 0;
3619  int current_distance = INT_MAX;
3620  for ( size_t i = 1; i < sizeof( mDxfColors ) / sizeof( *mDxfColors ); ++i )
3621  {
3622  int dist = color_distance( pixel, i );
3623  if ( dist < current_distance )
3624  {
3625  current_distance = dist;
3626  idx = i;
3627  if ( dist == 0 )
3628  break;
3629  }
3630  }
3631  return idx;
3632 }
3633 
3634 int QgsDxfExport::color_distance( QRgb p1, int index )
3635 {
3636  if ( index > 255 || index < 0 )
3637  {
3638  return 0;
3639  }
3640 
3641  double redDiff = qRed( p1 ) - mDxfColors[index][0];
3642  double greenDiff = qGreen( p1 ) - mDxfColors[index][1];
3643  double blueDiff = qBlue( p1 ) - mDxfColors[index][2];
3644 #if 0
3645  QgsDebugMsg( QString( "color_distance( r:%1 g:%2 b:%3 <=> i:%4 r:%5 g:%6 b:%7 ) => %8" )
3646  .arg( qRed( p1 ) ).arg( qGreen( p1 ) ).arg( qBlue( p1 ) )
3647  .arg( index )
3648  .arg( mDxfColors[index][0] )
3649  .arg( mDxfColors[index][1] )
3650  .arg( mDxfColors[index][2] )
3651  .arg( redDiff * redDiff + greenDiff * greenDiff + blueDiff * blueDiff ) );
3652 #endif
3653  return redDiff * redDiff + greenDiff * greenDiff + blueDiff * blueDiff;
3654 }
3655 
3656 QRgb QgsDxfExport::createRgbEntry( qreal r, qreal g, qreal b )
3657 {
3658  return QColor::fromRgbF( r, g, b ).rgb();
3659 }
3660 
3661 QgsRenderContext QgsDxfExport::renderContext() const
3662 {
3663  QgsRenderContext context;
3664  context.setRendererScale( mSymbologyScaleDenominator );
3665  return context;
3666 }
3667 
3668 double QgsDxfExport::mapUnitScaleFactor( double scaleDenominator, QgsSymbolV2::OutputUnit symbolUnits, QGis::UnitType mapUnits )
3669 {
3670  if ( symbolUnits == QgsSymbolV2::MapUnit )
3671  {
3672  return 1.0;
3673  }
3674  //MM symbol unit
3675  return scaleDenominator * QGis::fromUnitToUnitFactor( QGis::Meters, mapUnits ) / 1000.0;
3676 }
3677 
3678 QList< QPair< QgsSymbolLayerV2*, QgsSymbolV2* > > QgsDxfExport::symbolLayers()
3679 {
3680  QList< QPair< QgsSymbolLayerV2*, QgsSymbolV2* > > symbolLayers;
3681 
3682  QList< QPair< QgsVectorLayer*, int> >::iterator lIt = mLayers.begin();
3683  for ( ; lIt != mLayers.end(); ++lIt )
3684  {
3685  //cast to vector layer
3686  QgsVectorLayer* vl = lIt->first;
3687  if ( !vl )
3688  {
3689  continue;
3690  }
3691 
3692  //get rendererv2
3693  QgsFeatureRendererV2* r = vl->rendererV2();
3694  if ( !r )
3695  {
3696  continue;
3697  }
3698 
3699  //get all symbols
3700  QgsSymbolV2List symbols = r->symbols();
3701  QgsSymbolV2List::iterator symbolIt = symbols.begin();
3702  for ( ; symbolIt != symbols.end(); ++symbolIt )
3703  {
3704  int maxSymbolLayers = ( *symbolIt )->symbolLayerCount();
3705  if ( mSymbologyExport != SymbolLayerSymbology )
3706  {
3707  maxSymbolLayers = 1;
3708  }
3709  for ( int i = 0; i < maxSymbolLayers; ++i )
3710  {
3711  symbolLayers.append( qMakePair(( *symbolIt )->symbolLayer( i ), *symbolIt ) );
3712  }
3713  }
3714  }
3715 
3716  return symbolLayers;
3717 }
3718 
3719 void QgsDxfExport::writeDefaultLinetypes()
3720 {
3721  // continuous (Qt solid line)
3722  foreach ( QString ltype, QStringList() << "ByLayer" << "ByBlock" << "CONTINUOUS" )
3723  {
3724  writeGroup( 0, "LTYPE" );
3725  writeHandle();
3726  writeGroup( 100, "AcDbSymbolTableRecord" );
3727  writeGroup( 100, "AcDbLinetypeTableRecord" );
3728  writeGroup( 2, ltype );
3729  writeGroup( 70, 64 );
3730  writeGroup( 3, "Defaultstyle" );
3731  writeGroup( 72, 65 );
3732  writeGroup( 73, 0 );
3733  writeGroup( 40, 0.0 );
3734  }
3735 
3736  double das = dashSize();
3737  double dss = dashSeparatorSize();
3738  double dos = dotSize();
3739 
3740  QVector<qreal> dashVector( 2 );
3741  dashVector[0] = das;
3742  dashVector[1] = dss;
3743  writeLinetype( "DASH", dashVector, QgsSymbolV2::MapUnit );
3744 
3745  QVector<qreal> dotVector( 2 );
3746  dotVector[0] = dos;
3747  dotVector[1] = dss;
3748  writeLinetype( "DOT", dotVector, QgsSymbolV2::MapUnit );
3749 
3750  QVector<qreal> dashDotVector( 4 );
3751  dashDotVector[0] = das;
3752  dashDotVector[1] = dss;
3753  dashDotVector[2] = dos;
3754  dashDotVector[3] = dss;
3755  writeLinetype( "DASHDOT", dashDotVector, QgsSymbolV2::MapUnit );
3756 
3757  QVector<qreal> dashDotDotVector( 6 );
3758  dashDotDotVector[0] = das;
3759  dashDotDotVector[1] = dss;
3760  dashDotDotVector[2] = dos;
3761  dashDotDotVector[3] = dss;
3762  dashDotDotVector[4] = dos;
3763  dashDotDotVector[5] = dss;
3764  writeLinetype( "DASHDOTDOT", dashDotDotVector, QgsSymbolV2::MapUnit );
3765 }
3766 
3767 void QgsDxfExport::writeSymbolLayerLinetype( const QgsSymbolLayerV2* symbolLayer )
3768 {
3769  if ( !symbolLayer )
3770  {
3771  return;
3772  }
3773 
3775  QVector<qreal> customLinestyle = symbolLayer->dxfCustomDashPattern( unit );
3776  if ( customLinestyle.size() > 0 )
3777  {
3778  QString name = QString( "symbolLayer%1" ).arg( mSymbolLayerCounter++ );
3779  writeLinetype( name, customLinestyle, unit );
3780  mLineStyles.insert( symbolLayer, name );
3781  }
3782 }
3783 
3784 int QgsDxfExport::nLineTypes( const QList< QPair< QgsSymbolLayerV2*, QgsSymbolV2* > >& symbolLayers )
3785 {
3786  int nLineTypes = 0;
3787  QList< QPair< QgsSymbolLayerV2*, QgsSymbolV2*> >::const_iterator slIt = symbolLayers.constBegin();
3788  for ( ; slIt != symbolLayers.constEnd(); ++slIt )
3789  {
3790  const QgsSimpleLineSymbolLayerV2* simpleLine = dynamic_cast< const QgsSimpleLineSymbolLayerV2* >( slIt->first );
3791  if ( simpleLine )
3792  {
3793  if ( simpleLine->useCustomDashPattern() )
3794  {
3795  ++nLineTypes;
3796  }
3797  }
3798  }
3799  return nLineTypes;
3800 }
3801 
3802 void QgsDxfExport::writeLinetype( const QString& styleName, const QVector<qreal>& pattern, QgsSymbolV2::OutputUnit u )
3803 {
3804  double length = 0;
3805  QVector<qreal>::const_iterator dashIt = pattern.constBegin();
3806  for ( ; dashIt != pattern.constEnd(); ++dashIt )
3807  {
3808  length += ( *dashIt * mapUnitScaleFactor( mSymbologyScaleDenominator, u, mMapUnits ) );
3809  }
3810 
3811  writeGroup( 0, "LTYPE" );
3812  writeHandle();
3813  // 330 5
3814  writeGroup( 100, "AcDbSymbolTableRecord" );
3815  writeGroup( 100, "AcDbLinetypeTableRecord" );
3816  writeGroup( 2, styleName );
3817  writeGroup( 70, 64 ); // 0?
3818  writeGroup( 3, "" );
3819  writeGroup( 72, 65 );
3820  writeGroup( 73, pattern.size() );
3821  writeGroup( 40, length );
3822 
3823  dashIt = pattern.constBegin();
3824  bool isGap = false;
3825  for ( ; dashIt != pattern.constEnd(); ++dashIt )
3826  {
3827  //map units or mm?
3828  double segmentLength = ( isGap ? -*dashIt : *dashIt );
3829  segmentLength *= mapUnitScaleFactor( mSymbologyScaleDenominator, u, mMapUnits );
3830  writeGroup( 49, segmentLength );
3831  writeGroup( 74, 0 );
3832  isGap = !isGap;
3833  }
3834 }
3835 
3836 bool QgsDxfExport::hasDataDefinedProperties( const QgsSymbolLayerV2* sl, const QgsSymbolV2* symbol )
3837 {
3838  if ( !sl || !symbol )
3839  {
3840  return false;
3841  }
3842 
3845  {
3846  return true;
3847  }
3848 
3849  return sl->hasDataDefinedProperties();
3850 }
3851 
3852 double QgsDxfExport::dashSize() const
3853 {
3854  double size = mSymbologyScaleDenominator * 0.002;
3855  return sizeToMapUnits( size );
3856 }
3857 
3858 double QgsDxfExport::dotSize() const
3859 {
3860  double size = mSymbologyScaleDenominator * 0.0006;
3861  return sizeToMapUnits( size );
3862 }
3863 
3864 double QgsDxfExport::dashSeparatorSize() const
3865 {
3866  double size = mSymbologyScaleDenominator * 0.0006;
3867  return sizeToMapUnits( size );
3868 }
3869 
3870 double QgsDxfExport::sizeToMapUnits( double s ) const
3871 {
3872  double size = s * QGis::fromUnitToUnitFactor( QGis::Meters, mMapUnits );
3873  return size;
3874 }
3875 
3876 QString QgsDxfExport::lineNameFromPenStyle( Qt::PenStyle style )
3877 {
3878  switch ( style )
3879  {
3880  case Qt::DashLine:
3881  return "DASH";
3882  case Qt::DotLine:
3883  return "DOT";
3884  case Qt::DashDotLine:
3885  return "DASHDOT";
3886  case Qt::DashDotDotLine:
3887  return "DASHDOTDOT";
3888  case Qt::SolidLine:
3889  default:
3890  return "CONTINUOUS";
3891  }
3892 }
3893 
3894 QString QgsDxfExport::dxfLayerName( const QString& name )
3895 {
3896  if ( name.isEmpty() )
3897  return "0";
3898 
3899  //dxf layers can be max 255 characters long
3900  QString layerName = name.left( 255 );
3901 
3902  // replaced restricted characters with underscore
3903  // < > / \ " : ; ? * | = '
3904  // See http://docs.autodesk.com/ACD/2010/ENU/AutoCAD%202010%20User%20Documentation/index.html?url=WS1a9193826455f5ffa23ce210c4a30acaf-7345.htm,topicNumber=d0e41665
3905  layerName.replace( "<", "_" );
3906  layerName.replace( ">", "_" );
3907  layerName.replace( "/", "_" );
3908  layerName.replace( "\\", "_" );
3909  layerName.replace( "\"", "_" );
3910  layerName.replace( ":", "_" );
3911  layerName.replace( ";", "_" );
3912  layerName.replace( "?", "_" );
3913  layerName.replace( "*", "_" );
3914  layerName.replace( "|", "_" );
3915  layerName.replace( "=", "_" );
3916  layerName.replace( "\'", "_" );
3917 
3918  return layerName;
3919 }
3920 
3921 bool QgsDxfExport::layerIsScaleBasedVisible( const QgsMapLayer* layer ) const
3922 {
3923  if ( !layer )
3924  return false;
3925 
3926  if ( mSymbologyExport == QgsDxfExport::NoSymbology || !layer->hasScaleBasedVisibility() )
3927  return true;
3928 
3929  return layer->minimumScale() < mSymbologyScaleDenominator &&
3930  layer->maximumScale() > mSymbologyScaleDenominator;
3931 }
3932 
3933 QString QgsDxfExport::layerName( const QString &id, const QgsFeature &f ) const
3934 {
3935  QList< QPair<QgsVectorLayer*, int> >::const_iterator layerIt = mLayers.constBegin();
3936  for ( ; layerIt != mLayers.constEnd(); ++layerIt )
3937  {
3938  if ( layerIt->first && layerIt->first->id() == id )
3939  return dxfLayerName( layerIt->second < 0 ? layerIt->first->name() : f.attribute( layerIt->second ).toString() );
3940  }
3941 
3942  return "0";
3943 }
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:48
bool isEmpty() const
test if rectangle is empty.
virtual Qt::PenStyle dxfPenStyle() const
virtual double dxfWidth(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)
void startRender(QgsSymbolV2RenderContext &context)
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)
double x() const
Definition: qgspoint.h:126
void writeInt(int i)
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
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
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)
#define M_PI
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:95
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
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
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 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
void writeCircle(const QString &layer, QColor color, const QgsPoint &pt, double radius)
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