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 ) ); ++i )
375  {
376  int dist = color_distance( color.rgba(), i );
377  if ( dist == 0 )
378  {
379  writeGroup( exactMatchCode, i );
380  return;
381  }
382 
383  if ( dist < minDist )
384  {
385  minDistAt = i;
386  minDist = dist;
387  }
388  }
389 
390  writeGroup( exactMatchCode, minDistAt );
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 ENDSEC\n\
1028  0\n\
1029 SECTION\n\
1030  2\n\
1031 OBJECTS\n\
1032  0\n\
1033 DICTIONARY\n\
1034  5\n\
1035 C\n\
1036 330\n\
1037 0\n\
1038 100\n\
1039 AcDbDictionary\n\
1040 281\n\
1041  1\n\
1042  3\n\
1043 ACAD_GROUP\n\
1044 350\n\
1045 D\n\
1046  3\n\
1047 ACAD_LAYOUT\n\
1048 350\n\
1049 1A\n\
1050  3\n\
1051 ACAD_MLEADERSTYLE\n\
1052 350\n\
1053 43\n\
1054  3\n\
1055 ACAD_MLINESTYLE\n\
1056 350\n\
1057 17\n\
1058  3\n\
1059 ACAD_PLOTSETTINGS\n\
1060 350\n\
1061 19\n\
1062  3\n\
1063 ACAD_PLOTSTYLENAME\n\
1064 350\n\
1065 E\n\
1066  3\n\
1067 ACAD_TABLESTYLE\n\
1068 350\n\
1069 42\n\
1070  3\n\
1071 ACAD_VISUALSTYLE\n\
1072 350\n\
1073 2A\n\
1074  0\n\
1075 DICTIONARY\n\
1076  5\n\
1077 D\n\
1078 102\n\
1079 {ACAD_REACTORS\n\
1080 330\n\
1081 C\n\
1082 102\n\
1083 }\n\
1084 330\n\
1085 C\n\
1086 100\n\
1087 AcDbDictionary\n\
1088 281\n\
1089  1\n\
1090  0\n\
1091 DICTIONARY\n\
1092  5\n\
1093 1A\n\
1094 102\n\
1095 {ACAD_REACTORS\n\
1096 330\n\
1097 C\n\
1098 102\n\
1099 }\n\
1100 330\n\
1101 C\n\
1102 100\n\
1103 AcDbDictionary\n\
1104 281\n\
1105  1\n\
1106  3\n\
1107 Layout1\n\
1108 350\n\
1109 1E\n\
1110  3\n\
1111 Layout2\n\
1112 350\n\
1113 26\n\
1114  3\n\
1115 Model\n\
1116 350\n\
1117 22\n\
1118  0\n\
1119 DICTIONARY\n\
1120  5\n\
1121 43\n\
1122 102\n\
1123 {ACAD_REACTORS\n\
1124 330\n\
1125 C\n\
1126 102\n\
1127 }\n\
1128 330\n\
1129 C\n\
1130 100\n\
1131 AcDbDictionary\n\
1132 281\n\
1133  1\n\
1134  0\n\
1135 DICTIONARY\n\
1136  5\n\
1137 17\n\
1138 102\n\
1139 {ACAD_REACTORS\n\
1140 330\n\
1141 C\n\
1142 102\n\
1143 }\n\
1144 330\n\
1145 C\n\
1146 100\n\
1147 AcDbDictionary\n\
1148 281\n\
1149  1\n\
1150  3\n\
1151 Standard\n\
1152 350\n\
1153 18\n\
1154  0\n\
1155 DICTIONARY\n\
1156  5\n\
1157 19\n\
1158 102\n\
1159 {ACAD_REACTORS\n\
1160 330\n\
1161 C\n\
1162 102\n\
1163 }\n\
1164 330\n\
1165 C\n\
1166 100\n\
1167 AcDbDictionary\n\
1168 281\n\
1169  1\n\
1170  0\n\
1171 ACDBDICTIONARYWDFLT\n\
1172  5\n\
1173 E\n\
1174 102\n\
1175 {ACAD_REACTORS\n\
1176 330\n\
1177 C\n\
1178 102\n\
1179 }\n\
1180 330\n\
1181 C\n\
1182 100\n\
1183 AcDbDictionary\n\
1184 281\n\
1185  1\n\
1186  3\n\
1187 Normal\n\
1188 350\n\
1189 F\n\
1190 100\n\
1191 AcDbDictionaryWithDefault\n\
1192 340\n\
1193 F\n\
1194  0\n\
1195 DICTIONARY\n\
1196  5\n\
1197 42\n\
1198 102\n\
1199 {ACAD_REACTORS\n\
1200 330\n\
1201 C\n\
1202 102\n\
1203 }\n\
1204 330\n\
1205 C\n\
1206 100\n\
1207 AcDbDictionary\n\
1208 281\n\
1209  1\n\
1210  0\n\
1211 DICTIONARY\n\
1212  5\n\
1213 2A\n\
1214 102\n\
1215 {ACAD_REACTORS\n\
1216 330\n\
1217 C\n\
1218 102\n\
1219 }\n\
1220 330\n\
1221 C\n\
1222 100\n\
1223 AcDbDictionary\n\
1224 281\n\
1225  1\n\
1226  3\n\
1227 2dWireframe\n\
1228 350\n\
1229 2F\n\
1230  3\n\
1231 3D Hidden\n\
1232 350\n\
1233 31\n\
1234  3\n\
1235 3dWireframe\n\
1236 350\n\
1237 30\n\
1238  3\n\
1239 Basic\n\
1240 350\n\
1241 32\n\
1242  3\n\
1243 Brighten\n\
1244 350\n\
1245 36\n\
1246  3\n\
1247 ColorChange\n\
1248 350\n\
1249 3A\n\
1250  3\n\
1251 Conceptual\n\
1252 350\n\
1253 34\n\
1254  3\n\
1255 Dim\n\
1256 350\n\
1257 35\n\
1258  3\n\
1259 Facepattern\n\
1260 350\n\
1261 39\n\
1262  3\n\
1263 Flat\n\
1264 350\n\
1265 2B\n\
1266  3\n\
1267 FlatWithEdges\n\
1268 350\n\
1269 2C\n\
1270  3\n\
1271 Gouraud\n\
1272 350\n\
1273 2D\n\
1274  3\n\
1275 GouraudWithEdges\n\
1276 350\n\
1277 2E\n\
1278  3\n\
1279 Linepattern\n\
1280 350\n\
1281 38\n\
1282  3\n\
1283 Realistic\n\
1284 350\n\
1285 33\n\
1286  3\n\
1287 Thicken\n\
1288 350\n\
1289 37\n\
1290  0\n\
1291 LAYOUT\n\
1292  5\n\
1293 1E\n\
1294 102\n\
1295 {ACAD_REACTORS\n\
1296 330\n\
1297 1A\n\
1298 102\n\
1299 }\n\
1300 330\n\
1301 1A\n\
1302 100\n\
1303 AcDbPlotSettings\n\
1304  1\n\
1305 \n\
1306  2\n\
1307 none_device\n\
1308  4\n\
1309 \n\
1310  6\n\
1311 \n\
1312  40\n\
1313 0.0\n\
1314  41\n\
1315 0.0\n\
1316  42\n\
1317 0.0\n\
1318  43\n\
1319 0.0\n\
1320  44\n\
1321 0.0\n\
1322  45\n\
1323 0.0\n\
1324  46\n\
1325 0.0\n\
1326  47\n\
1327 0.0\n\
1328  48\n\
1329 0.0\n\
1330  49\n\
1331 0.0\n\
1332 140\n\
1333 0.0\n\
1334 141\n\
1335 0.0\n\
1336 142\n\
1337 1.0\n\
1338 143\n\
1339 1.0\n\
1340  70\n\
1341  688\n\
1342  72\n\
1343  0\n\
1344  73\n\
1345  0\n\
1346  74\n\
1347  5\n\
1348  7\n\
1349 \n\
1350  75\n\
1351  16\n\
1352  76\n\
1353  0\n\
1354  77\n\
1355  2\n\
1356  78\n\
1357  300\n\
1358 147\n\
1359 1.0\n\
1360 148\n\
1361 0.0\n\
1362 149\n\
1363 0.0\n\
1364 100\n\
1365 AcDbLayout\n\
1366  1\n\
1367 Layout1\n\
1368  70\n\
1369  1\n\
1370  71\n\
1371  1\n\
1372  10\n\
1373 0.0\n\
1374  20\n\
1375 0.0\n\
1376  11\n\
1377 12.0\n\
1378  21\n\
1379 9.0\n\
1380  12\n\
1381 0.0\n\
1382  22\n\
1383 0.0\n\
1384  32\n\
1385 0.0\n\
1386  14\n\
1387 1.000000000000000E+20\n\
1388  24\n\
1389 1.000000000000000E+20\n\
1390  34\n\
1391 1.000000000000000E+20\n\
1392  15\n\
1393 -1.000000000000000E+20\n\
1394  25\n\
1395 -1.000000000000000E+20\n\
1396  35\n\
1397 -1.000000000000000E+20\n\
1398 146\n\
1399 0.0\n\
1400  13\n\
1401 0.0\n\
1402  23\n\
1403 0.0\n\
1404  33\n\
1405 0.0\n\
1406  16\n\
1407 1.0\n\
1408  26\n\
1409 0.0\n\
1410  36\n\
1411 0.0\n\
1412  17\n\
1413 0.0\n\
1414  27\n\
1415 1.0\n\
1416  37\n\
1417 0.0\n\
1418  76\n\
1419  0\n\
1420 330\n\
1421 1B\n\
1422  0\n\
1423 LAYOUT\n\
1424  5\n\
1425 26\n\
1426 102\n\
1427 {ACAD_REACTORS\n\
1428 330\n\
1429 1A\n\
1430 102\n\
1431 }\n\
1432 330\n\
1433 1A\n\
1434 100\n\
1435 AcDbPlotSettings\n\
1436  1\n\
1437 \n\
1438  2\n\
1439 none_device\n\
1440  4\n\
1441 \n\
1442  6\n\
1443 \n\
1444  40\n\
1445 0.0\n\
1446  41\n\
1447 0.0\n\
1448  42\n\
1449 0.0\n\
1450  43\n\
1451 0.0\n\
1452  44\n\
1453 0.0\n\
1454  45\n\
1455 0.0\n\
1456  46\n\
1457 0.0\n\
1458  47\n\
1459 0.0\n\
1460  48\n\
1461 0.0\n\
1462  49\n\
1463 0.0\n\
1464 140\n\
1465 0.0\n\
1466 141\n\
1467 0.0\n\
1468 142\n\
1469 1.0\n\
1470 143\n\
1471 1.0\n\
1472  70\n\
1473  688\n\
1474  72\n\
1475  0\n\
1476  73\n\
1477  0\n\
1478  74\n\
1479  5\n\
1480  7\n\
1481 \n\
1482  75\n\
1483  16\n\
1484  76\n\
1485  0\n\
1486  77\n\
1487  2\n\
1488  78\n\
1489  300\n\
1490 147\n\
1491 1.0\n\
1492 148\n\
1493 0.0\n\
1494 149\n\
1495 0.0\n\
1496 100\n\
1497 AcDbLayout\n\
1498  1\n\
1499 Layout2\n\
1500  70\n\
1501  1\n\
1502  71\n\
1503  2\n\
1504  10\n\
1505 0.0\n\
1506  20\n\
1507 0.0\n\
1508  11\n\
1509 0.0\n\
1510  21\n\
1511 0.0\n\
1512  12\n\
1513 0.0\n\
1514  22\n\
1515 0.0\n\
1516  32\n\
1517 0.0\n\
1518  14\n\
1519 0.0\n\
1520  24\n\
1521 0.0\n\
1522  34\n\
1523 0.0\n\
1524  15\n\
1525 0.0\n\
1526  25\n\
1527 0.0\n\
1528  35\n\
1529 0.0\n\
1530 146\n\
1531 0.0\n\
1532  13\n\
1533 0.0\n\
1534  23\n\
1535 0.0\n\
1536  33\n\
1537 0.0\n\
1538  16\n\
1539 1.0\n\
1540  26\n\
1541 0.0\n\
1542  36\n\
1543 0.0\n\
1544  17\n\
1545 0.0\n\
1546  27\n\
1547 1.0\n\
1548  37\n\
1549 0.0\n\
1550  76\n\
1551  0\n\
1552 330\n\
1553 23\n\
1554  0\n\
1555 LAYOUT\n\
1556  5\n\
1557 22\n\
1558 102\n\
1559 {ACAD_REACTORS\n\
1560 330\n\
1561 1A\n\
1562 102\n\
1563 }\n\
1564 330\n\
1565 1A\n\
1566 100\n\
1567 AcDbPlotSettings\n\
1568  1\n\
1569 \n\
1570  2\n\
1571 none_device\n\
1572  4\n\
1573 \n\
1574  6\n\
1575 \n\
1576  40\n\
1577 0.0\n\
1578  41\n\
1579 0.0\n\
1580  42\n\
1581 0.0\n\
1582  43\n\
1583 0.0\n\
1584  44\n\
1585 0.0\n\
1586  45\n\
1587 0.0\n\
1588  46\n\
1589 0.0\n\
1590  47\n\
1591 0.0\n\
1592  48\n\
1593 0.0\n\
1594  49\n\
1595 0.0\n\
1596 140\n\
1597 0.0\n\
1598 141\n\
1599 0.0\n\
1600 142\n\
1601 1.0\n\
1602 143\n\
1603 1.0\n\
1604  70\n\
1605  1712\n\
1606  72\n\
1607  0\n\
1608  73\n\
1609  0\n\
1610  74\n\
1611  0\n\
1612  7\n\
1613 \n\
1614  75\n\
1615  0\n\
1616  76\n\
1617  0\n\
1618  77\n\
1619  2\n\
1620  78\n\
1621  300\n\
1622 147\n\
1623 1.0\n\
1624 148\n\
1625 0.0\n\
1626 149\n\
1627 0.0\n\
1628 100\n\
1629 AcDbLayout\n\
1630  1\n\
1631 Model\n\
1632  70\n\
1633  1\n\
1634  71\n\
1635  0\n\
1636  10\n\
1637 0.0\n\
1638  20\n\
1639 0.0\n\
1640  11\n\
1641 12.0\n\
1642  21\n\
1643 9.0\n\
1644  12\n\
1645 0.0\n\
1646  22\n\
1647 0.0\n\
1648  32\n\
1649 0.0\n\
1650  14\n\
1651 30.0\n\
1652  24\n\
1653 49.75\n\
1654  34\n\
1655 0.0\n\
1656  15\n\
1657 130.5\n\
1658  25\n\
1659 163.1318914119703\n\
1660  35\n\
1661 0.0\n\
1662 146\n\
1663 0.0\n\
1664  13\n\
1665 0.0\n\
1666  23\n\
1667 0.0\n\
1668  33\n\
1669 0.0\n\
1670  16\n\
1671 1.0\n\
1672  26\n\
1673 0.0\n\
1674  36\n\
1675 0.0\n\
1676  17\n\
1677 0.0\n\
1678  27\n\
1679 1.0\n\
1680  37\n\
1681 0.0\n\
1682  76\n\
1683  0\n\
1684 330\n\
1685 1F\n\
1686 331\n\
1687 29\n\
1688  0\n\
1689 MLINESTYLE\n\
1690  5\n\
1691 18\n\
1692 102\n\
1693 {ACAD_REACTORS\n\
1694 330\n\
1695 17\n\
1696 102\n\
1697 }\n\
1698 330\n\
1699 17\n\
1700 100\n\
1701 AcDbMlineStyle\n\
1702  2\n\
1703 Standard\n\
1704  70\n\
1705  0\n\
1706  3\n\
1707 \n\
1708  62\n\
1709  256\n\
1710  51\n\
1711 90.0\n\
1712  52\n\
1713 90.0\n\
1714  71\n\
1715  2\n\
1716  49\n\
1717 0.5\n\
1718  62\n\
1719  256\n\
1720  6\n\
1721 BYLAYER\n\
1722  49\n\
1723 -0.5\n\
1724  62\n\
1725  256\n\
1726  6\n\
1727 BYLAYER\n\
1728  0\n\
1729 ACDBPLACEHOLDER\n\
1730  5\n\
1731 F\n\
1732 102\n\
1733 {ACAD_REACTORS\n\
1734 330\n\
1735 E\n\
1736 102\n\
1737 }\n\
1738 330\n\
1739 E\n\
1740  0\n\
1741 VISUALSTYLE\n\
1742  5\n\
1743 2F\n\
1744 102\n\
1745 {ACAD_REACTORS\n\
1746 330\n\
1747 2A\n\
1748 102\n\
1749 }\n\
1750 330\n\
1751 2A\n\
1752 100\n\
1753 AcDbVisualStyle\n\
1754  2\n\
1755 2dWireframe\n\
1756  70\n\
1757  4\n\
1758  71\n\
1759  0\n\
1760  72\n\
1761  2\n\
1762  73\n\
1763  0\n\
1764  90\n\
1765  0\n\
1766  40\n\
1767 -0.6\n\
1768  41\n\
1769 -30.0\n\
1770  62\n\
1771  5\n\
1772  63\n\
1773  7\n\
1774 421\n\
1775  16777215\n\
1776  74\n\
1777  1\n\
1778  91\n\
1779  4\n\
1780  64\n\
1781  7\n\
1782  65\n\
1783  257\n\
1784  75\n\
1785  1\n\
1786 175\n\
1787  1\n\
1788  42\n\
1789 1.0\n\
1790  92\n\
1791  0\n\
1792  66\n\
1793  257\n\
1794  43\n\
1795 1.0\n\
1796  76\n\
1797  1\n\
1798  77\n\
1799  6\n\
1800  78\n\
1801  2\n\
1802  67\n\
1803  7\n\
1804  79\n\
1805  5\n\
1806 170\n\
1807  0\n\
1808 171\n\
1809  0\n\
1810 290\n\
1811  0\n\
1812 174\n\
1813  0\n\
1814  93\n\
1815  1\n\
1816  44\n\
1817 0.0\n\
1818 173\n\
1819  0\n\
1820 291\n\
1821  0\n\
1822  45\n\
1823 0.0\n\
1824 1001\n\
1825 ACAD\n\
1826 1000\n\
1827 AcDbSavedByObjectVersion\n\
1828 1070\n\
1829  0\n\
1830  0\n\
1831 VISUALSTYLE\n\
1832  5\n\
1833 31\n\
1834 102\n\
1835 {ACAD_REACTORS\n\
1836 330\n\
1837 2A\n\
1838 102\n\
1839 }\n\
1840 330\n\
1841 2A\n\
1842 100\n\
1843 AcDbVisualStyle\n\
1844  2\n\
1845 3D Hidden\n\
1846  70\n\
1847  6\n\
1848  71\n\
1849  1\n\
1850  72\n\
1851  2\n\
1852  73\n\
1853  2\n\
1854  90\n\
1855  0\n\
1856  40\n\
1857 -0.6\n\
1858  41\n\
1859 -30.0\n\
1860  62\n\
1861  5\n\
1862  63\n\
1863  7\n\
1864 421\n\
1865  16777215\n\
1866  74\n\
1867  2\n\
1868  91\n\
1869  2\n\
1870  64\n\
1871  7\n\
1872  65\n\
1873  257\n\
1874  75\n\
1875  2\n\
1876 175\n\
1877  1\n\
1878  42\n\
1879 40.0\n\
1880  92\n\
1881  0\n\
1882  66\n\
1883  257\n\
1884  43\n\
1885 1.0\n\
1886  76\n\
1887  1\n\
1888  77\n\
1889  6\n\
1890  78\n\
1891  2\n\
1892  67\n\
1893  7\n\
1894  79\n\
1895  3\n\
1896 170\n\
1897  0\n\
1898 171\n\
1899  0\n\
1900 290\n\
1901  0\n\
1902 174\n\
1903  0\n\
1904  93\n\
1905  1\n\
1906  44\n\
1907 0.0\n\
1908 173\n\
1909  0\n\
1910 291\n\
1911  0\n\
1912  45\n\
1913 0.0\n\
1914 1001\n\
1915 ACAD\n\
1916 1000\n\
1917 AcDbSavedByObjectVersion\n\
1918 1070\n\
1919  0\n\
1920  0\n\
1921 VISUALSTYLE\n\
1922  5\n\
1923 30\n\
1924 102\n\
1925 {ACAD_REACTORS\n\
1926 330\n\
1927 2A\n\
1928 102\n\
1929 }\n\
1930 330\n\
1931 2A\n\
1932 100\n\
1933 AcDbVisualStyle\n\
1934  2\n\
1935 3dWireframe\n\
1936  70\n\
1937  5\n\
1938  71\n\
1939  0\n\
1940  72\n\
1941  2\n\
1942  73\n\
1943  0\n\
1944  90\n\
1945  0\n\
1946  40\n\
1947 -0.6\n\
1948  41\n\
1949 -30.0\n\
1950  62\n\
1951  5\n\
1952  63\n\
1953  7\n\
1954 421\n\
1955  16777215\n\
1956  74\n\
1957  1\n\
1958  91\n\
1959  4\n\
1960  64\n\
1961  7\n\
1962  65\n\
1963  257\n\
1964  75\n\
1965  1\n\
1966 175\n\
1967  1\n\
1968  42\n\
1969 1.0\n\
1970  92\n\
1971  0\n\
1972  66\n\
1973  257\n\
1974  43\n\
1975 1.0\n\
1976  76\n\
1977  1\n\
1978  77\n\
1979  6\n\
1980  78\n\
1981  2\n\
1982  67\n\
1983  7\n\
1984  79\n\
1985  5\n\
1986 170\n\
1987  0\n\
1988 171\n\
1989  0\n\
1990 290\n\
1991  0\n\
1992 174\n\
1993  0\n\
1994  93\n\
1995  1\n\
1996  44\n\
1997 0.0\n\
1998 173\n\
1999  0\n\
2000 291\n\
2001  0\n\
2002  45\n\
2003 0.0\n\
2004 1001\n\
2005 ACAD\n\
2006 1000\n\
2007 AcDbSavedByObjectVersion\n\
2008 1070\n\
2009  0\n\
2010  0\n\
2011 VISUALSTYLE\n\
2012  5\n\
2013 32\n\
2014 102\n\
2015 {ACAD_REACTORS\n\
2016 330\n\
2017 2A\n\
2018 102\n\
2019 }\n\
2020 330\n\
2021 2A\n\
2022 100\n\
2023 AcDbVisualStyle\n\
2024  2\n\
2025 Basic\n\
2026  70\n\
2027  7\n\
2028  71\n\
2029  1\n\
2030  72\n\
2031  0\n\
2032  73\n\
2033  1\n\
2034  90\n\
2035  0\n\
2036  40\n\
2037 -0.6\n\
2038  41\n\
2039 -30.0\n\
2040  62\n\
2041  5\n\
2042  63\n\
2043  7\n\
2044 421\n\
2045  16777215\n\
2046  74\n\
2047  0\n\
2048  91\n\
2049  4\n\
2050  64\n\
2051  7\n\
2052  65\n\
2053  257\n\
2054  75\n\
2055  1\n\
2056 175\n\
2057  1\n\
2058  42\n\
2059 1.0\n\
2060  92\n\
2061  8\n\
2062  66\n\
2063  7\n\
2064  43\n\
2065 1.0\n\
2066  76\n\
2067  1\n\
2068  77\n\
2069  6\n\
2070  78\n\
2071  2\n\
2072  67\n\
2073  7\n\
2074  79\n\
2075  5\n\
2076 170\n\
2077  0\n\
2078 171\n\
2079  0\n\
2080 290\n\
2081  0\n\
2082 174\n\
2083  0\n\
2084  93\n\
2085  1\n\
2086  44\n\
2087 0.0\n\
2088 173\n\
2089  0\n\
2090 291\n\
2091  1\n\
2092  45\n\
2093 0.0\n\
2094 1001\n\
2095 ACAD\n\
2096 1000\n\
2097 AcDbSavedByObjectVersion\n\
2098 1070\n\
2099  0\n\
2100  0\n\
2101 VISUALSTYLE\n\
2102  5\n\
2103 36\n\
2104 102\n\
2105 {ACAD_REACTORS\n\
2106 330\n\
2107 2A\n\
2108 102\n\
2109 }\n\
2110 330\n\
2111 2A\n\
2112 100\n\
2113 AcDbVisualStyle\n\
2114  2\n\
2115 Brighten\n\
2116  70\n\
2117  12\n\
2118  71\n\
2119  2\n\
2120  72\n\
2121  2\n\
2122  73\n\
2123  0\n\
2124  90\n\
2125  0\n\
2126  40\n\
2127 -0.6\n\
2128  41\n\
2129 -30.0\n\
2130  62\n\
2131  5\n\
2132  63\n\
2133  7\n\
2134 421\n\
2135  16777215\n\
2136  74\n\
2137  1\n\
2138  91\n\
2139  4\n\
2140  64\n\
2141  7\n\
2142  65\n\
2143  257\n\
2144  75\n\
2145  1\n\
2146 175\n\
2147  1\n\
2148  42\n\
2149 1.0\n\
2150  92\n\
2151  8\n\
2152  66\n\
2153  7\n\
2154  43\n\
2155 1.0\n\
2156  76\n\
2157  1\n\
2158  77\n\
2159  6\n\
2160  78\n\
2161  2\n\
2162  67\n\
2163  7\n\
2164  79\n\
2165  5\n\
2166 170\n\
2167  0\n\
2168 171\n\
2169  0\n\
2170 290\n\
2171  0\n\
2172 174\n\
2173  0\n\
2174  93\n\
2175  1\n\
2176  44\n\
2177 50.0\n\
2178 173\n\
2179  0\n\
2180 291\n\
2181  1\n\
2182  45\n\
2183 0.0\n\
2184 1001\n\
2185 ACAD\n\
2186 1000\n\
2187 AcDbSavedByObjectVersion\n\
2188 1070\n\
2189  0\n\
2190  0\n\
2191 VISUALSTYLE\n\
2192  5\n\
2193 3A\n\
2194 102\n\
2195 {ACAD_REACTORS\n\
2196 330\n\
2197 2A\n\
2198 102\n\
2199 }\n\
2200 330\n\
2201 2A\n\
2202 100\n\
2203 AcDbVisualStyle\n\
2204  2\n\
2205 ColorChange\n\
2206  70\n\
2207  16\n\
2208  71\n\
2209  2\n\
2210  72\n\
2211  2\n\
2212  73\n\
2213  3\n\
2214  90\n\
2215  0\n\
2216  40\n\
2217 -0.6\n\
2218  41\n\
2219 -30.0\n\
2220  62\n\
2221  5\n\
2222  63\n\
2223  8\n\
2224 421\n\
2225  8421504\n\
2226  74\n\
2227  1\n\
2228  91\n\
2229  4\n\
2230  64\n\
2231  7\n\
2232  65\n\
2233  257\n\
2234  75\n\
2235  1\n\
2236 175\n\
2237  1\n\
2238  42\n\
2239 1.0\n\
2240  92\n\
2241  8\n\
2242  66\n\
2243  8\n\
2244 424\n\
2245  8421504\n\
2246  43\n\
2247 1.0\n\
2248  76\n\
2249  1\n\
2250  77\n\
2251  6\n\
2252  78\n\
2253  2\n\
2254  67\n\
2255  7\n\
2256  79\n\
2257  5\n\
2258 170\n\
2259  0\n\
2260 171\n\
2261  0\n\
2262 290\n\
2263  0\n\
2264 174\n\
2265  0\n\
2266  93\n\
2267  1\n\
2268  44\n\
2269 0.0\n\
2270 173\n\
2271  0\n\
2272 291\n\
2273  1\n\
2274  45\n\
2275 0.0\n\
2276 1001\n\
2277 ACAD\n\
2278 1000\n\
2279 AcDbSavedByObjectVersion\n\
2280 1070\n\
2281  0\n\
2282  0\n\
2283 VISUALSTYLE\n\
2284  5\n\
2285 34\n\
2286 102\n\
2287 {ACAD_REACTORS\n\
2288 330\n\
2289 2A\n\
2290 102\n\
2291 }\n\
2292 330\n\
2293 2A\n\
2294 100\n\
2295 AcDbVisualStyle\n\
2296  2\n\
2297 Conceptual\n\
2298  70\n\
2299  9\n\
2300  71\n\
2301  3\n\
2302  72\n\
2303  2\n\
2304  73\n\
2305  0\n\
2306  90\n\
2307  0\n\
2308  40\n\
2309 -0.6\n\
2310  41\n\
2311 -30.0\n\
2312  62\n\
2313  5\n\
2314  63\n\
2315  7\n\
2316 421\n\
2317  16777215\n\
2318  74\n\
2319  2\n\
2320  91\n\
2321  2\n\
2322  64\n\
2323  7\n\
2324  65\n\
2325  257\n\
2326  75\n\
2327  1\n\
2328 175\n\
2329  1\n\
2330  42\n\
2331 40.0\n\
2332  92\n\
2333  8\n\
2334  66\n\
2335  7\n\
2336  43\n\
2337 1.0\n\
2338  76\n\
2339  1\n\
2340  77\n\
2341  6\n\
2342  78\n\
2343  2\n\
2344  67\n\
2345  7\n\
2346  79\n\
2347  3\n\
2348 170\n\
2349  0\n\
2350 171\n\
2351  0\n\
2352 290\n\
2353  0\n\
2354 174\n\
2355  0\n\
2356  93\n\
2357  1\n\
2358  44\n\
2359 0.0\n\
2360 173\n\
2361  0\n\
2362 291\n\
2363  0\n\
2364  45\n\
2365 0.0\n\
2366 1001\n\
2367 ACAD\n\
2368 1000\n\
2369 AcDbSavedByObjectVersion\n\
2370 1070\n\
2371  0\n\
2372  0\n\
2373 VISUALSTYLE\n\
2374  5\n\
2375 35\n\
2376 102\n\
2377 {ACAD_REACTORS\n\
2378 330\n\
2379 2A\n\
2380 102\n\
2381 }\n\
2382 330\n\
2383 2A\n\
2384 100\n\
2385 AcDbVisualStyle\n\
2386  2\n\
2387 Dim\n\
2388  70\n\
2389  11\n\
2390  71\n\
2391  2\n\
2392  72\n\
2393  2\n\
2394  73\n\
2395  0\n\
2396  90\n\
2397  0\n\
2398  40\n\
2399 -0.6\n\
2400  41\n\
2401 -30.0\n\
2402  62\n\
2403  5\n\
2404  63\n\
2405  7\n\
2406 421\n\
2407  16777215\n\
2408  74\n\
2409  1\n\
2410  91\n\
2411  4\n\
2412  64\n\
2413  7\n\
2414  65\n\
2415  257\n\
2416  75\n\
2417  1\n\
2418 175\n\
2419  1\n\
2420  42\n\
2421 1.0\n\
2422  92\n\
2423  8\n\
2424  66\n\
2425  7\n\
2426  43\n\
2427 1.0\n\
2428  76\n\
2429  1\n\
2430  77\n\
2431  6\n\
2432  78\n\
2433  2\n\
2434  67\n\
2435  7\n\
2436  79\n\
2437  5\n\
2438 170\n\
2439  0\n\
2440 171\n\
2441  0\n\
2442 290\n\
2443  0\n\
2444 174\n\
2445  0\n\
2446  93\n\
2447  1\n\
2448  44\n\
2449 -50.0\n\
2450 173\n\
2451  0\n\
2452 291\n\
2453  1\n\
2454  45\n\
2455 0.0\n\
2456 1001\n\
2457 ACAD\n\
2458 1000\n\
2459 AcDbSavedByObjectVersion\n\
2460 1070\n\
2461  0\n\
2462  0\n\
2463 VISUALSTYLE\n\
2464  5\n\
2465 39\n\
2466 102\n\
2467 {ACAD_REACTORS\n\
2468 330\n\
2469 2A\n\
2470 102\n\
2471 }\n\
2472 330\n\
2473 2A\n\
2474 100\n\
2475 AcDbVisualStyle\n\
2476  2\n\
2477 Facepattern\n\
2478  70\n\
2479  15\n\
2480  71\n\
2481  2\n\
2482  72\n\
2483  2\n\
2484  73\n\
2485  0\n\
2486  90\n\
2487  0\n\
2488  40\n\
2489 -0.6\n\
2490  41\n\
2491 -30.0\n\
2492  62\n\
2493  5\n\
2494  63\n\
2495  7\n\
2496 421\n\
2497  16777215\n\
2498  74\n\
2499  1\n\
2500  91\n\
2501  4\n\
2502  64\n\
2503  7\n\
2504  65\n\
2505  257\n\
2506  75\n\
2507  1\n\
2508 175\n\
2509  1\n\
2510  42\n\
2511 1.0\n\
2512  92\n\
2513  8\n\
2514  66\n\
2515  7\n\
2516  43\n\
2517 1.0\n\
2518  76\n\
2519  1\n\
2520  77\n\
2521  6\n\
2522  78\n\
2523  2\n\
2524  67\n\
2525  7\n\
2526  79\n\
2527  5\n\
2528 170\n\
2529  0\n\
2530 171\n\
2531  0\n\
2532 290\n\
2533  0\n\
2534 174\n\
2535  0\n\
2536  93\n\
2537  1\n\
2538  44\n\
2539 0.0\n\
2540 173\n\
2541  0\n\
2542 291\n\
2543  1\n\
2544  45\n\
2545 0.0\n\
2546 1001\n\
2547 ACAD\n\
2548 1000\n\
2549 AcDbSavedByObjectVersion\n\
2550 1070\n\
2551  0\n\
2552  0\n\
2553 VISUALSTYLE\n\
2554  5\n\
2555 2B\n\
2556 102\n\
2557 {ACAD_REACTORS\n\
2558 330\n\
2559 2A\n\
2560 102\n\
2561 }\n\
2562 330\n\
2563 2A\n\
2564 100\n\
2565 AcDbVisualStyle\n\
2566  2\n\
2567 Flat\n\
2568  70\n\
2569  0\n\
2570  71\n\
2571  2\n\
2572  72\n\
2573  1\n\
2574  73\n\
2575  1\n\
2576  90\n\
2577  2\n\
2578  40\n\
2579 -0.6\n\
2580  41\n\
2581 30.0\n\
2582  62\n\
2583  5\n\
2584  63\n\
2585  7\n\
2586 421\n\
2587  16777215\n\
2588  74\n\
2589  0\n\
2590  91\n\
2591  4\n\
2592  64\n\
2593  7\n\
2594  65\n\
2595  257\n\
2596  75\n\
2597  1\n\
2598 175\n\
2599  1\n\
2600  42\n\
2601 1.0\n\
2602  92\n\
2603  8\n\
2604  66\n\
2605  7\n\
2606  43\n\
2607 1.0\n\
2608  76\n\
2609  1\n\
2610  77\n\
2611  6\n\
2612  78\n\
2613  2\n\
2614  67\n\
2615  7\n\
2616  79\n\
2617  5\n\
2618 170\n\
2619  0\n\
2620 171\n\
2621  0\n\
2622 290\n\
2623  0\n\
2624 174\n\
2625  0\n\
2626  93\n\
2627  13\n\
2628  44\n\
2629 0.0\n\
2630 173\n\
2631  0\n\
2632 291\n\
2633  1\n\
2634  45\n\
2635 0.0\n\
2636 1001\n\
2637 ACAD\n\
2638 1000\n\
2639 AcDbSavedByObjectVersion\n\
2640 1070\n\
2641  0\n\
2642  0\n\
2643 VISUALSTYLE\n\
2644  5\n\
2645 2C\n\
2646 102\n\
2647 {ACAD_REACTORS\n\
2648 330\n\
2649 2A\n\
2650 102\n\
2651 }\n\
2652 330\n\
2653 2A\n\
2654 100\n\
2655 AcDbVisualStyle\n\
2656  2\n\
2657 FlatWithEdges\n\
2658  70\n\
2659  1\n\
2660  71\n\
2661  2\n\
2662  72\n\
2663  1\n\
2664  73\n\
2665  1\n\
2666  90\n\
2667  2\n\
2668  40\n\
2669 -0.6\n\
2670  41\n\
2671 30.0\n\
2672  62\n\
2673  5\n\
2674  63\n\
2675  7\n\
2676 421\n\
2677  16777215\n\
2678  74\n\
2679  1\n\
2680  91\n\
2681  4\n\
2682  64\n\
2683  7\n\
2684  65\n\
2685  257\n\
2686  75\n\
2687  1\n\
2688 175\n\
2689  1\n\
2690  42\n\
2691 1.0\n\
2692  92\n\
2693  0\n\
2694  66\n\
2695  257\n\
2696  43\n\
2697 1.0\n\
2698  76\n\
2699  1\n\
2700  77\n\
2701  6\n\
2702  78\n\
2703  2\n\
2704  67\n\
2705  7\n\
2706  79\n\
2707  5\n\
2708 170\n\
2709  0\n\
2710 171\n\
2711  0\n\
2712 290\n\
2713  0\n\
2714 174\n\
2715  0\n\
2716  93\n\
2717  13\n\
2718  44\n\
2719 0.0\n\
2720 173\n\
2721  0\n\
2722 291\n\
2723  1\n\
2724  45\n\
2725 0.0\n\
2726 1001\n\
2727 ACAD\n\
2728 1000\n\
2729 AcDbSavedByObjectVersion\n\
2730 1070\n\
2731  0\n\
2732  0\n\
2733 VISUALSTYLE\n\
2734  5\n\
2735 2D\n\
2736 102\n\
2737 {ACAD_REACTORS\n\
2738 330\n\
2739 2A\n\
2740 102\n\
2741 }\n\
2742 330\n\
2743 2A\n\
2744 100\n\
2745 AcDbVisualStyle\n\
2746  2\n\
2747 Gouraud\n\
2748  70\n\
2749  2\n\
2750  71\n\
2751  2\n\
2752  72\n\
2753  2\n\
2754  73\n\
2755  1\n\
2756  90\n\
2757  2\n\
2758  40\n\
2759 -0.6\n\
2760  41\n\
2761 30.0\n\
2762  62\n\
2763  5\n\
2764  63\n\
2765  7\n\
2766 421\n\
2767  16777215\n\
2768  74\n\
2769  0\n\
2770  91\n\
2771  4\n\
2772  64\n\
2773  7\n\
2774  65\n\
2775  257\n\
2776  75\n\
2777  1\n\
2778 175\n\
2779  1\n\
2780  42\n\
2781 1.0\n\
2782  92\n\
2783  0\n\
2784  66\n\
2785  7\n\
2786  43\n\
2787 1.0\n\
2788  76\n\
2789  1\n\
2790  77\n\
2791  6\n\
2792  78\n\
2793  2\n\
2794  67\n\
2795  7\n\
2796  79\n\
2797  5\n\
2798 170\n\
2799  0\n\
2800 171\n\
2801  0\n\
2802 290\n\
2803  0\n\
2804 174\n\
2805  0\n\
2806  93\n\
2807  13\n\
2808  44\n\
2809 0.0\n\
2810 173\n\
2811  0\n\
2812 291\n\
2813  1\n\
2814  45\n\
2815 0.0\n\
2816 1001\n\
2817 ACAD\n\
2818 1000\n\
2819 AcDbSavedByObjectVersion\n\
2820 1070\n\
2821  0\n\
2822  0\n\
2823 VISUALSTYLE\n\
2824  5\n\
2825 2E\n\
2826 102\n\
2827 {ACAD_REACTORS\n\
2828 330\n\
2829 2A\n\
2830 102\n\
2831 }\n\
2832 330\n\
2833 2A\n\
2834 100\n\
2835 AcDbVisualStyle\n\
2836  2\n\
2837 GouraudWithEdges\n\
2838  70\n\
2839  3\n\
2840  71\n\
2841  2\n\
2842  72\n\
2843  2\n\
2844  73\n\
2845  1\n\
2846  90\n\
2847  2\n\
2848  40\n\
2849 -0.6\n\
2850  41\n\
2851 30.0\n\
2852  62\n\
2853  5\n\
2854  63\n\
2855  7\n\
2856 421\n\
2857  16777215\n\
2858  74\n\
2859  1\n\
2860  91\n\
2861  4\n\
2862  64\n\
2863  7\n\
2864  65\n\
2865  257\n\
2866  75\n\
2867  1\n\
2868 175\n\
2869  1\n\
2870  42\n\
2871 1.0\n\
2872  92\n\
2873  0\n\
2874  66\n\
2875  257\n\
2876  43\n\
2877 1.0\n\
2878  76\n\
2879  1\n\
2880  77\n\
2881  6\n\
2882  78\n\
2883  2\n\
2884  67\n\
2885  7\n\
2886  79\n\
2887  5\n\
2888 170\n\
2889  0\n\
2890 171\n\
2891  0\n\
2892 290\n\
2893  0\n\
2894 174\n\
2895  0\n\
2896  93\n\
2897  13\n\
2898  44\n\
2899 0.0\n\
2900 173\n\
2901  0\n\
2902 291\n\
2903  1\n\
2904  45\n\
2905 0.0\n\
2906 1001\n\
2907 ACAD\n\
2908 1000\n\
2909 AcDbSavedByObjectVersion\n\
2910 1070\n\
2911  0\n\
2912  0\n\
2913 VISUALSTYLE\n\
2914  5\n\
2915 38\n\
2916 102\n\
2917 {ACAD_REACTORS\n\
2918 330\n\
2919 2A\n\
2920 102\n\
2921 }\n\
2922 330\n\
2923 2A\n\
2924 100\n\
2925 AcDbVisualStyle\n\
2926  2\n\
2927 Linepattern\n\
2928  70\n\
2929  14\n\
2930  71\n\
2931  2\n\
2932  72\n\
2933  2\n\
2934  73\n\
2935  0\n\
2936  90\n\
2937  0\n\
2938  40\n\
2939 -0.6\n\
2940  41\n\
2941 -30.0\n\
2942  62\n\
2943  5\n\
2944  63\n\
2945  7\n\
2946 421\n\
2947  16777215\n\
2948  74\n\
2949  1\n\
2950  91\n\
2951  4\n\
2952  64\n\
2953  7\n\
2954  65\n\
2955  257\n\
2956  75\n\
2957  7\n\
2958 175\n\
2959  7\n\
2960  42\n\
2961 1.0\n\
2962  92\n\
2963  8\n\
2964  66\n\
2965  7\n\
2966  43\n\
2967 1.0\n\
2968  76\n\
2969  1\n\
2970  77\n\
2971  6\n\
2972  78\n\
2973  2\n\
2974  67\n\
2975  7\n\
2976  79\n\
2977  5\n\
2978 170\n\
2979  0\n\
2980 171\n\
2981  0\n\
2982 290\n\
2983  0\n\
2984 174\n\
2985  0\n\
2986  93\n\
2987  1\n\
2988  44\n\
2989 0.0\n\
2990 173\n\
2991  0\n\
2992 291\n\
2993  1\n\
2994  45\n\
2995 0.0\n\
2996 1001\n\
2997 ACAD\n\
2998 1000\n\
2999 AcDbSavedByObjectVersion\n\
3000 1070\n\
3001  0\n\
3002  0\n\
3003 VISUALSTYLE\n\
3004  5\n\
3005 33\n\
3006 102\n\
3007 {ACAD_REACTORS\n\
3008 330\n\
3009 2A\n\
3010 102\n\
3011 }\n\
3012 330\n\
3013 2A\n\
3014 100\n\
3015 AcDbVisualStyle\n\
3016  2\n\
3017 Realistic\n\
3018  70\n\
3019  8\n\
3020  71\n\
3021  2\n\
3022  72\n\
3023  2\n\
3024  73\n\
3025  0\n\
3026  90\n\
3027  0\n\
3028  40\n\
3029 -0.6\n\
3030  41\n\
3031 -30.0\n\
3032  62\n\
3033  5\n\
3034  63\n\
3035  7\n\
3036 421\n\
3037  16777215\n\
3038  74\n\
3039  1\n\
3040  91\n\
3041  0\n\
3042  64\n\
3043  7\n\
3044  65\n\
3045  257\n\
3046  75\n\
3047  1\n\
3048 175\n\
3049  1\n\
3050  42\n\
3051 1.0\n\
3052  92\n\
3053  8\n\
3054  66\n\
3055  8\n\
3056 424\n\
3057  7895160\n\
3058  43\n\
3059 1.0\n\
3060  76\n\
3061  1\n\
3062  77\n\
3063  6\n\
3064  78\n\
3065  2\n\
3066  67\n\
3067  7\n\
3068  79\n\
3069  5\n\
3070 170\n\
3071  0\n\
3072 171\n\
3073  0\n\
3074 290\n\
3075  0\n\
3076 174\n\
3077  0\n\
3078  93\n\
3079  13\n\
3080  44\n\
3081 0.0\n\
3082 173\n\
3083  0\n\
3084 291\n\
3085  0\n\
3086  45\n\
3087 0.0\n\
3088 1001\n\
3089 ACAD\n\
3090 1000\n\
3091 AcDbSavedByObjectVersion\n\
3092 1070\n\
3093  0\n\
3094  0\n\
3095 VISUALSTYLE\n\
3096  5\n\
3097 37\n\
3098 102\n\
3099 {ACAD_REACTORS\n\
3100 330\n\
3101 2A\n\
3102 102\n\
3103 }\n\
3104 330\n\
3105 2A\n\
3106 100\n\
3107 AcDbVisualStyle\n\
3108  2\n\
3109 Thicken\n\
3110  70\n\
3111  13\n\
3112  71\n\
3113  2\n\
3114  72\n\
3115  2\n\
3116  73\n\
3117  0\n\
3118  90\n\
3119  0\n\
3120  40\n\
3121 -0.6\n\
3122  41\n\
3123 -30.0\n\
3124  62\n\
3125  5\n\
3126  63\n\
3127  7\n\
3128 421\n\
3129  16777215\n\
3130  74\n\
3131  1\n\
3132  91\n\
3133  4\n\
3134  64\n\
3135  7\n\
3136  65\n\
3137  257\n\
3138  75\n\
3139  1\n\
3140 175\n\
3141  1\n\
3142  42\n\
3143 1.0\n\
3144  92\n\
3145  12\n\
3146  66\n\
3147  7\n\
3148  43\n\
3149 1.0\n\
3150  76\n\
3151  1\n\
3152  77\n\
3153  6\n\
3154  78\n\
3155  2\n\
3156  67\n\
3157  7\n\
3158  79\n\
3159  5\n\
3160 170\n\
3161  0\n\
3162 171\n\
3163  0\n\
3164 290\n\
3165  0\n\
3166 174\n\
3167  0\n\
3168  93\n\
3169  1\n\
3170  44\n\
3171 0.0\n\
3172 173\n\
3173  0\n\
3174 291\n\
3175  1\n\
3176  45\n\
3177 0.0\n\
3178 1001\n\
3179 ACAD\n\
3180 1000\n\
3181 AcDbSavedByObjectVersion\n\
3182 1070\n\
3183  0\n\
3184  0\n\
3185 ENDSEC\n\
3186 ";
3187 
3188  writeGroup( 0, "EOF" );
3189 }
3190 
3191 void QgsDxfExport::startSection()
3192 {
3193  writeGroup( 0, "SECTION" );
3194 }
3195 
3196 void QgsDxfExport::endSection()
3197 {
3198  writeGroup( 0, "ENDSEC" );
3199 }
3200 
3201 void QgsDxfExport::writePoint( const QgsPoint& pt, const QString& layer, QColor color, const QgsFeature* f, const QgsSymbolLayerV2* symbolLayer, const QgsSymbolV2* symbol )
3202 {
3203 #if 0
3204  //debug: draw rectangle for debugging
3205  const QgsMarkerSymbolLayerV2* msl = dynamic_cast< const QgsMarkerSymbolLayerV2* >( symbolLayer );
3206  if ( msl )
3207  {
3208  double halfSize = msl->size() * mapUnitScaleFactor( mSymbologyScaleDenominator,
3209  msl->sizeUnit(), mMapUnits ) / 2.0;
3210  writeGroup( 0, "SOLID" );
3211  writeGroup( 8, layer );
3212  writeGroup( 62, 1 );
3213  writeGroup( 0, pt + QgsVector( -halfSize, -halfSize ) );
3214  writeGroup( 1, pt + QgsVector( halfSize, -halfSize ) );
3215  writeGroup( 2, pt + QgsVector( -halfSize, halfSize ) );
3216  writeGroup( 3, pt + QgsVector( halfSize, halfSize ) );
3217  }
3218 #endif //0
3219 
3220  //insert block or write point directly?
3221  QHash< const QgsSymbolLayerV2*, QString >::const_iterator blockIt = mPointSymbolBlocks.find( symbolLayer );
3222  if ( !symbolLayer || blockIt == mPointSymbolBlocks.constEnd() )
3223  {
3224  //write symbol directly here
3225  const QgsMarkerSymbolLayerV2* msl = dynamic_cast< const QgsMarkerSymbolLayerV2* >( symbolLayer );
3226  if ( symbolLayer && symbol )
3227  {
3228  QgsRenderContext ct;
3229  QgsSymbolV2RenderContext ctx( ct, QgsSymbolV2::MapUnit, symbol->alpha(), false, symbol->renderHints(), f );
3230  if ( symbolLayer->writeDxf( *this, mapUnitScaleFactor( mSymbologyScaleDenominator, msl->sizeUnit(), mMapUnits ), layer, &ctx, f, QPointF( pt.x(), pt.y() ) ) )
3231  {
3232  return;
3233  }
3234  }
3235  writePoint( layer, color, pt ); //write default point symbol
3236  }
3237  else
3238  {
3239  //insert block reference
3240  writeGroup( 0, "INSERT" );
3241  writeHandle();
3242  writeGroup( 100, "AcDbEntity" );
3243  writeGroup( 100, "AcDbBlockReference" );
3244  writeGroup( 8, layer );
3245  writeGroup( 2, blockIt.value() ); // Block name
3246  writeGroup( 0, pt ); // Insertion point (in OCS)
3247  }
3248 }
3249 
3250 void QgsDxfExport::writePolyline( const QgsPolyline& line, const QString& layer, const QString& lineStyleName, QColor color,
3251  double width, bool polygon )
3252 {
3253  writeGroup( 0, "LWPOLYLINE" );
3254  writeHandle();
3255  writeGroup( 8, layer );
3256  writeGroup( 100, "AcDbEntity" );
3257  writeGroup( 100, "AcDbPolyline" );
3258  writeGroup( 6, lineStyleName );
3259  writeGroup( color );
3260 
3261  writeGroup( 90, line.size() );
3262 
3263  writeGroup( 70, polygon ? 1 : 0 );
3264  writeGroup( 43, width );
3265 
3266  QgsPolyline::const_iterator lineIt = line.constBegin();
3267  for ( ; lineIt != line.constEnd(); ++lineIt )
3268  {
3269  writeGroup( 0, *lineIt );
3270  }
3271 }
3272 
3273 void QgsDxfExport::writePolygon( const QgsPolygon& polygon, const QString& layer, const QString& hatchPattern, QColor color )
3274 {
3275  writeGroup( 0, "HATCH" ); // Entity type
3276  writeHandle();
3277  writeGroup( 330, mModelSpaceBR );
3278  writeGroup( 100, "AcDbEntity" );
3279  writeGroup( 100, "AcDbHatch" );
3280 
3281  writeGroup( 8, layer ); // Layer name
3282  writeGroup( 0, QgsPoint( 0, 0 ) ); // Elevation point (in OCS)
3283  writeGroup( 200, QgsPoint( 0, 0 ), 1.0 );
3284 
3285  writeGroup( 2, hatchPattern ); // Hatch pattern name
3286  writeGroup( 70, hatchPattern == "SOLID" ); // Solid fill flag (solid fill = 1; pattern fill = 0)
3287  writeGroup( 71, 0 ); // Associativity flag (associative = 1; non-associative = 0)
3288 
3289  writeGroup( color ); // Color (0 by block, 256 by layer)
3290 
3291  writeGroup( 91, polygon.size() ); // Number of boundary paths (loops)
3292  for ( int i = 0; i < polygon.size(); ++i )
3293  {
3294  writeGroup( 92, 2 ); // Boundary path type flag (bit coded): 0 = Default; 1 = External; 2 = Polyline 4 = Derived; 8 = Textbox; 16 = Outermost
3295  writeGroup( 72, 0 ); // Has bulge flag
3296  writeGroup( 73, 1 ); // Is closed flag
3297  writeGroup( 93, polygon[i].size() ); // Number of edges in this boundary path (only if boundary is not a polyline
3298 
3299  for ( int j = 0; j < polygon[i].size(); ++j )
3300  {
3301  writeGroup( 0, polygon[i][j], 0.0, true ); // Vertex location (in OCS)
3302  }
3303 
3304  writeGroup( 97, 0 ); // Number of source boundary objects
3305  }
3306 
3307  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)
3308  writeGroup( 76, 1 ); // Hatch pattern type: 0 = User-defined; 1 = Predefined; 2 = Custom
3309 
3310  writeGroup( 98, 0 ); // Number of seed points
3311 }
3312 
3313 void QgsDxfExport::writeLine( const QgsPoint& pt1, const QgsPoint& pt2, const QString& layer, const QString& lineStyleName, QColor color, double width )
3314 {
3315  QgsPolyline line( 2 );
3316  line[0] = pt1;
3317  line[1] = pt2;
3318  writePolyline( line, layer, lineStyleName, color, width, false );
3319 }
3320 
3321 void QgsDxfExport::writePoint( const QString& layer, QColor color, const QgsPoint& pt )
3322 {
3323  writeGroup( 0, "POINT" );
3324  writeHandle();
3325  writeGroup( 100, "AcDbEntity" );
3326  writeGroup( 100, "AcDbPoint" );
3327  writeGroup( 8, layer );
3328  writeGroup( color );
3329  writeGroup( 0, pt );
3330 }
3331 
3332 void QgsDxfExport::writeCircle( const QString& layer, QColor color, const QgsPoint& pt, double radius )
3333 {
3334  writeGroup( 0, "CIRCLE" );
3335  writeHandle();
3336  writeGroup( 100, "AcDbEntity" );
3337  writeGroup( 100, "AcDbCircle" );
3338  writeGroup( 8, layer );
3339  writeGroup( color );
3340  writeGroup( 0, pt );
3341  writeGroup( 40, radius );
3342 
3343 #if 0
3344  writeGroup( 0, "HATCH" );
3345  writeHandle();
3346  writeGroup( 330, mModelSpaceBR );
3347  writeGroup( 100, "AcDbEntity" );
3348  writeGroup( 100, "AcDbHatch" );
3349  writeGroup( 8, layer );
3350  writeGroup( color );
3351  writeGroup( 0, QgsPoint( 0.0, 0.0 ) ); // elevation point
3352  writeGroup( 200, QgsPoint( 0, 0 ), 1.0 ); // Extrusion direction
3353  writeGroup( 2, "SOLID" ); // hatch pattern
3354  writeGroup( 70, 1 ); // solid fill flag
3355  writeGroup( 71, 0 ); // non-associative
3356  writeGroup( 91, 1 ); // 1 loop
3357  writeGroup( 92, 0 ); // Default edge type
3358  writeGroup( 72, 2 ); // Edge type Arc
3359  writeGroup( 93, 1 ); // Is closed
3360 
3361  writeGroup( 0, QgsPoint( pt.x(), pt.y() ), 0.0, false ); // center point
3362  writeGroup( 40, radius ); // radius
3363  writeGroup( 50, 0.0 ); // start angle
3364  writeGroup( 51, 2*M_PI ); // end angle
3365 
3366  writeGroup( 97, 0 ); // # of source boundary objects
3367  writeGroup( 75, 1 ); // odd parity hatch style
3368  writeGroup( 76, 1 ); // predefined hatch pattern
3369  writeGroup( 98, 0 ); // # of seed points
3370 #endif
3371 }
3372 
3373 void QgsDxfExport::writeText( const QString& layer, const QString& text, const QgsPoint& pt, double size, double angle, QColor color )
3374 {
3375  writeGroup( 0, "TEXT" );
3376  writeHandle();
3377  writeGroup( 100, "AcDbEntity" );
3378  writeGroup( 100, "AcDbText" );
3379  writeGroup( 8, layer );
3380  writeGroup( color );
3381  writeGroup( 0, pt );
3382  writeGroup( 40, size );
3383  writeGroup( 1, text );
3384  writeGroup( 50, angle );
3385  writeGroup( 7, "STANDARD" ); //so far only support for standard font
3386 }
3387 
3388 void QgsDxfExport::writeMText( const QString& layer, const QString& text, const QgsPoint& pt, double width, double angle, QColor color )
3389 {
3390  writeGroup( 0, "MTEXT" );
3391  writeHandle();
3392  writeGroup( 100, "AcDbEntity" );
3393  writeGroup( 100, "AcDbMText" );
3394  writeGroup( 8, layer );
3395  writeGroup( color );
3396 
3397  writeGroup( 0, pt );
3398 
3399  QString t( text );
3400  while ( t.length() > 250 )
3401  {
3402  writeGroup( 3, t.left( 250 ) );
3403  t = t.mid( 250 );
3404  }
3405  writeGroup( 1, text );
3406 
3407  writeGroup( 50, angle ); // Rotation angle in radians
3408  writeGroup( 41, width ); // Reference rectangle width
3409 
3410  // Attachment point:
3411  // 1 2 3
3412  // 4 5 6
3413  // 7 8 9
3414  writeGroup( 71, 7 );
3415 
3416  writeGroup( 7, "STANDARD" ); //so far only support for standard font
3417 }
3418 
3419 void QgsDxfExport::writeSolid( const QString& layer, QColor color, const QgsPoint& pt1, const QgsPoint& pt2, const QgsPoint& pt3, const QgsPoint& pt4 )
3420 {
3421  writeGroup( 0, "SOLID" );
3422  writeHandle();
3423  writeGroup( 100, "AcDbEntity" );
3424  writeGroup( 100, "AcDbTrace" );
3425  writeGroup( 8, layer );
3426  writeGroup( color );
3427  writeGroup( 0, pt1 );
3428  writeGroup( 1, pt2 );
3429  writeGroup( 2, pt3 );
3430  writeGroup( 3, pt4 );
3431 }
3432 
3433 void QgsDxfExport::writeVertex( const QgsPoint& pt, const QString& layer )
3434 {
3435  writeGroup( 0, "VERTEX" );
3436  writeHandle();
3437  writeGroup( 100, "AcDbEntity" );
3438  writeGroup( 100, "AcDbVertex" );
3439  writeGroup( 100, "AcDb2dVertex" );
3440  writeGroup( 8, layer );
3441  writeGroup( 0, pt, 0.0, false );
3442 }
3443 
3444 QgsRectangle QgsDxfExport::dxfExtent() const
3445 {
3447  QList< QPair<QgsVectorLayer*, int> >::const_iterator layerIt = mLayers.constBegin();
3448  for ( ; layerIt != mLayers.constEnd(); ++layerIt )
3449  {
3450  if ( layerIt->first )
3451  {
3452  if ( extent.isEmpty() )
3453  {
3454  extent = layerIt->first->extent();
3455  }
3456  else
3457  {
3458  QgsRectangle layerExtent = layerIt->first->extent();
3459  extent.combineExtentWith( &layerExtent );
3460  }
3461  }
3462  }
3463  return extent;
3464 }
3465 
3466 void QgsDxfExport::addFeature( const QgsSymbolV2RenderContext& ctx, const QString& layer, const QgsSymbolLayerV2* symbolLayer, const QgsSymbolV2* symbol )
3467 {
3468  const QgsFeature* fet = ctx.feature();
3469  if ( !fet )
3470  return;
3471 
3472  QgsGeometry *geom = fet->geometry();
3473  if ( !geom )
3474  return;
3475 
3476  QGis::WkbType geometryType = geom->wkbType();
3477 
3478  QColor penColor;
3479  QColor brushColor;
3480  if ( mSymbologyExport != NoSymbology )
3481  {
3482  penColor = colorFromSymbolLayer( symbolLayer, ctx );
3483  brushColor = symbolLayer->dxfBrushColor( ctx );
3484  }
3485 
3486  Qt::PenStyle penStyle( Qt::SolidLine );
3487  Qt::BrushStyle brushStyle( Qt::NoBrush );
3488  double width = -1;
3489  if ( mSymbologyExport != NoSymbology && symbolLayer )
3490  {
3491  width = symbolLayer->dxfWidth( *this, ctx );
3492  penStyle = symbolLayer->dxfPenStyle();
3493  brushStyle = symbolLayer->dxfBrushStyle();
3494  }
3495 
3496  QString lineStyleName = "CONTINUOUS";
3497  if ( mSymbologyExport != NoSymbology )
3498  {
3499  lineStyleName = lineStyleFromSymbolLayer( symbolLayer );
3500  }
3501 
3502  //single point
3503  if ( geometryType == QGis::WKBPoint || geometryType == QGis::WKBPoint25D )
3504  {
3505  writePoint( geom->asPoint(), layer, penColor, fet, symbolLayer, symbol );
3506  return;
3507  }
3508 
3509  //multipoint
3510  if ( geometryType == QGis::WKBMultiPoint || geometryType == QGis::WKBMultiPoint25D )
3511  {
3512  QgsMultiPoint multiPoint = geom->asMultiPoint();
3513  QgsMultiPoint::const_iterator it = multiPoint.constBegin();
3514  for ( ; it != multiPoint.constEnd(); ++it )
3515  {
3516  writePoint( *it, layer, penColor, fet, symbolLayer, symbol );
3517  }
3518 
3519  return;
3520  }
3521 
3522  if ( penStyle != Qt::NoPen )
3523  {
3524  //single line
3525  if ( geometryType == QGis::WKBLineString || geometryType == QGis::WKBLineString25D )
3526  {
3527  writePolyline( geom->asPolyline(), layer, lineStyleName, penColor, width, false );
3528  }
3529 
3530  //multiline
3531  if ( geometryType == QGis::WKBMultiLineString || geometryType == QGis::WKBMultiLineString25D )
3532  {
3533  QgsMultiPolyline multiLine = geom->asMultiPolyline();
3534  QgsMultiPolyline::const_iterator lIt = multiLine.constBegin();
3535  for ( ; lIt != multiLine.constEnd(); ++lIt )
3536  {
3537  writePolyline( *lIt, layer, lineStyleName, penColor, width, false );
3538  }
3539  }
3540 
3541  //polygon
3542  if ( geometryType == QGis::WKBPolygon || geometryType == QGis::WKBPolygon25D )
3543  {
3544  QgsPolygon polygon = geom->asPolygon();
3545  QgsPolygon::const_iterator polyIt = polygon.constBegin();
3546  for ( ; polyIt != polygon.constEnd(); ++polyIt ) //iterate over rings
3547  {
3548  writePolyline( *polyIt, layer, lineStyleName, penColor, width, true );
3549  }
3550  }
3551 
3552  //multipolygon or polygon
3553  if ( geometryType == QGis::WKBMultiPolygon || geometryType == QGis::WKBMultiPolygon25D )
3554  {
3555  QgsMultiPolygon mp = geom->asMultiPolygon();
3556  QgsMultiPolygon::const_iterator mpIt = mp.constBegin();
3557  for ( ; mpIt != mp.constEnd(); ++mpIt )
3558  {
3559  QgsPolygon::const_iterator polyIt = mpIt->constBegin();
3560  for ( ; polyIt != mpIt->constEnd(); ++polyIt )
3561  {
3562  writePolyline( *polyIt, layer, lineStyleName, penColor, width, true );
3563  }
3564  }
3565  }
3566  }
3567 
3568  if ( brushStyle != Qt::NoBrush )
3569  {
3570  //polygon
3571  if ( geometryType == QGis::WKBPolygon || geometryType == QGis::WKBPolygon25D )
3572  {
3573  QgsPolygon polygon = geom->asPolygon();
3574  writePolygon( polygon, layer, "SOLID", brushColor );
3575  }
3576 
3577  //multipolygon or polygon
3578  if ( geometryType == QGis::WKBMultiPolygon || geometryType == QGis::WKBMultiPolygon25D )
3579  {
3580  QgsMultiPolygon mp = geom->asMultiPolygon();
3581  QgsMultiPolygon::const_iterator mpIt = mp.constBegin();
3582  for ( ; mpIt != mp.constEnd(); ++mpIt )
3583  {
3584  writePolygon( *mpIt, layer, "SOLID", brushColor );
3585  }
3586  }
3587  }
3588 }
3589 
3590 QColor QgsDxfExport::colorFromSymbolLayer( const QgsSymbolLayerV2* symbolLayer, const QgsSymbolV2RenderContext& ctx )
3591 {
3592  if ( !symbolLayer )
3593  return QColor();
3594 
3595  return symbolLayer->dxfColor( ctx );
3596 }
3597 
3598 QString QgsDxfExport::lineStyleFromSymbolLayer( const QgsSymbolLayerV2* symbolLayer )
3599 {
3600  QString lineStyleName = "CONTINUOUS";
3601  if ( !symbolLayer )
3602  {
3603  return lineStyleName;
3604  }
3605 
3606  QHash< const QgsSymbolLayerV2*, QString >::const_iterator lineTypeIt = mLineStyles.find( symbolLayer );
3607  if ( lineTypeIt != mLineStyles.constEnd() )
3608  {
3609  lineStyleName = lineTypeIt.value();
3610  return lineStyleName;
3611  }
3612  else
3613  {
3614  return lineNameFromPenStyle( symbolLayer->dxfPenStyle() );
3615  }
3616 }
3617 
3619 {
3620  int idx = 0;
3621  int current_distance = INT_MAX;
3622  for ( size_t i = 1; i < sizeof( mDxfColors ) / sizeof( *mDxfColors ); ++i )
3623  {
3624  int dist = color_distance( pixel, i );
3625  if ( dist < current_distance )
3626  {
3627  current_distance = dist;
3628  idx = i;
3629  if ( dist == 0 )
3630  break;
3631  }
3632  }
3633  return idx;
3634 }
3635 
3636 int QgsDxfExport::color_distance( QRgb p1, int index )
3637 {
3638  if ( index > 255 || index < 0 )
3639  {
3640  return 0;
3641  }
3642 
3643  double redDiff = qRed( p1 ) - mDxfColors[index][0];
3644  double greenDiff = qGreen( p1 ) - mDxfColors[index][1];
3645  double blueDiff = qBlue( p1 ) - mDxfColors[index][2];
3646 #if 0
3647  QgsDebugMsg( QString( "color_distance( r:%1 g:%2 b:%3 <=> i:%4 r:%5 g:%6 b:%7 ) => %8" )
3648  .arg( qRed( p1 ) ).arg( qGreen( p1 ) ).arg( qBlue( p1 ) )
3649  .arg( index )
3650  .arg( mDxfColors[index][0] )
3651  .arg( mDxfColors[index][1] )
3652  .arg( mDxfColors[index][2] )
3653  .arg( redDiff * redDiff + greenDiff * greenDiff + blueDiff * blueDiff ) );
3654 #endif
3655  return redDiff * redDiff + greenDiff * greenDiff + blueDiff * blueDiff;
3656 }
3657 
3658 QRgb QgsDxfExport::createRgbEntry( qreal r, qreal g, qreal b )
3659 {
3660  return QColor::fromRgbF( r, g, b ).rgb();
3661 }
3662 
3663 QgsRenderContext QgsDxfExport::renderContext() const
3664 {
3665  QgsRenderContext context;
3666  context.setRendererScale( mSymbologyScaleDenominator );
3667  return context;
3668 }
3669 
3670 double QgsDxfExport::mapUnitScaleFactor( double scaleDenominator, QgsSymbolV2::OutputUnit symbolUnits, QGis::UnitType mapUnits )
3671 {
3672  if ( symbolUnits == QgsSymbolV2::MapUnit )
3673  {
3674  return 1.0;
3675  }
3676  //MM symbol unit
3677  return scaleDenominator * QGis::fromUnitToUnitFactor( QGis::Meters, mapUnits ) / 1000.0;
3678 }
3679 
3680 QList< QPair< QgsSymbolLayerV2*, QgsSymbolV2* > > QgsDxfExport::symbolLayers()
3681 {
3682  QList< QPair< QgsSymbolLayerV2*, QgsSymbolV2* > > symbolLayers;
3683 
3684  QList< QPair< QgsVectorLayer*, int> >::iterator lIt = mLayers.begin();
3685  for ( ; lIt != mLayers.end(); ++lIt )
3686  {
3687  //cast to vector layer
3688  QgsVectorLayer* vl = lIt->first;
3689  if ( !vl )
3690  {
3691  continue;
3692  }
3693 
3694  //get rendererv2
3695  QgsFeatureRendererV2* r = vl->rendererV2();
3696  if ( !r )
3697  {
3698  continue;
3699  }
3700 
3701  //get all symbols
3702  QgsSymbolV2List symbols = r->symbols();
3703  QgsSymbolV2List::iterator symbolIt = symbols.begin();
3704  for ( ; symbolIt != symbols.end(); ++symbolIt )
3705  {
3706  int maxSymbolLayers = ( *symbolIt )->symbolLayerCount();
3707  if ( mSymbologyExport != SymbolLayerSymbology )
3708  {
3709  maxSymbolLayers = 1;
3710  }
3711  for ( int i = 0; i < maxSymbolLayers; ++i )
3712  {
3713  symbolLayers.append( qMakePair(( *symbolIt )->symbolLayer( i ), *symbolIt ) );
3714  }
3715  }
3716  }
3717 
3718  return symbolLayers;
3719 }
3720 
3721 void QgsDxfExport::writeDefaultLinetypes()
3722 {
3723  // continuous (Qt solid line)
3724  foreach ( QString ltype, QStringList() << "ByLayer" << "ByBlock" << "CONTINUOUS" )
3725  {
3726  writeGroup( 0, "LTYPE" );
3727  writeHandle();
3728  writeGroup( 100, "AcDbSymbolTableRecord" );
3729  writeGroup( 100, "AcDbLinetypeTableRecord" );
3730  writeGroup( 2, ltype );
3731  writeGroup( 70, 64 );
3732  writeGroup( 3, "Defaultstyle" );
3733  writeGroup( 72, 65 );
3734  writeGroup( 73, 0 );
3735  writeGroup( 40, 0.0 );
3736  }
3737 
3738  double das = dashSize();
3739  double dss = dashSeparatorSize();
3740  double dos = dotSize();
3741 
3742  QVector<qreal> dashVector( 2 );
3743  dashVector[0] = das;
3744  dashVector[1] = dss;
3745  writeLinetype( "DASH", dashVector, QgsSymbolV2::MapUnit );
3746 
3747  QVector<qreal> dotVector( 2 );
3748  dotVector[0] = dos;
3749  dotVector[1] = dss;
3750  writeLinetype( "DOT", dotVector, QgsSymbolV2::MapUnit );
3751 
3752  QVector<qreal> dashDotVector( 4 );
3753  dashDotVector[0] = das;
3754  dashDotVector[1] = dss;
3755  dashDotVector[2] = dos;
3756  dashDotVector[3] = dss;
3757  writeLinetype( "DASHDOT", dashDotVector, QgsSymbolV2::MapUnit );
3758 
3759  QVector<qreal> dashDotDotVector( 6 );
3760  dashDotDotVector[0] = das;
3761  dashDotDotVector[1] = dss;
3762  dashDotDotVector[2] = dos;
3763  dashDotDotVector[3] = dss;
3764  dashDotDotVector[4] = dos;
3765  dashDotDotVector[5] = dss;
3766  writeLinetype( "DASHDOTDOT", dashDotDotVector, QgsSymbolV2::MapUnit );
3767 }
3768 
3769 void QgsDxfExport::writeSymbolLayerLinetype( const QgsSymbolLayerV2* symbolLayer )
3770 {
3771  if ( !symbolLayer )
3772  {
3773  return;
3774  }
3775 
3777  QVector<qreal> customLinestyle = symbolLayer->dxfCustomDashPattern( unit );
3778  if ( customLinestyle.size() > 0 )
3779  {
3780  QString name = QString( "symbolLayer%1" ).arg( mSymbolLayerCounter++ );
3781  writeLinetype( name, customLinestyle, unit );
3782  mLineStyles.insert( symbolLayer, name );
3783  }
3784 }
3785 
3786 int QgsDxfExport::nLineTypes( const QList< QPair< QgsSymbolLayerV2*, QgsSymbolV2* > >& symbolLayers )
3787 {
3788  int nLineTypes = 0;
3789  QList< QPair< QgsSymbolLayerV2*, QgsSymbolV2*> >::const_iterator slIt = symbolLayers.constBegin();
3790  for ( ; slIt != symbolLayers.constEnd(); ++slIt )
3791  {
3792  const QgsSimpleLineSymbolLayerV2* simpleLine = dynamic_cast< const QgsSimpleLineSymbolLayerV2* >( slIt->first );
3793  if ( simpleLine )
3794  {
3795  if ( simpleLine->useCustomDashPattern() )
3796  {
3797  ++nLineTypes;
3798  }
3799  }
3800  }
3801  return nLineTypes;
3802 }
3803 
3804 void QgsDxfExport::writeLinetype( const QString& styleName, const QVector<qreal>& pattern, QgsSymbolV2::OutputUnit u )
3805 {
3806  double length = 0;
3807  QVector<qreal>::const_iterator dashIt = pattern.constBegin();
3808  for ( ; dashIt != pattern.constEnd(); ++dashIt )
3809  {
3810  length += ( *dashIt * mapUnitScaleFactor( mSymbologyScaleDenominator, u, mMapUnits ) );
3811  }
3812 
3813  writeGroup( 0, "LTYPE" );
3814  writeHandle();
3815  // 330 5
3816  writeGroup( 100, "AcDbSymbolTableRecord" );
3817  writeGroup( 100, "AcDbLinetypeTableRecord" );
3818  writeGroup( 2, styleName );
3819  writeGroup( 70, 64 ); // 0?
3820  writeGroup( 3, "" );
3821  writeGroup( 72, 65 );
3822  writeGroup( 73, pattern.size() );
3823  writeGroup( 40, length );
3824 
3825  dashIt = pattern.constBegin();
3826  bool isGap = false;
3827  for ( ; dashIt != pattern.constEnd(); ++dashIt )
3828  {
3829  //map units or mm?
3830  double segmentLength = ( isGap ? -*dashIt : *dashIt );
3831  segmentLength *= mapUnitScaleFactor( mSymbologyScaleDenominator, u, mMapUnits );
3832  writeGroup( 49, segmentLength );
3833  writeGroup( 74, 0 );
3834  isGap = !isGap;
3835  }
3836 }
3837 
3838 bool QgsDxfExport::hasDataDefinedProperties( const QgsSymbolLayerV2* sl, const QgsSymbolV2* symbol )
3839 {
3840  if ( !sl || !symbol )
3841  {
3842  return false;
3843  }
3844 
3847  {
3848  return true;
3849  }
3850 
3851  return sl->hasDataDefinedProperties();
3852 }
3853 
3854 double QgsDxfExport::dashSize() const
3855 {
3856  double size = mSymbologyScaleDenominator * 0.002;
3857  return sizeToMapUnits( size );
3858 }
3859 
3860 double QgsDxfExport::dotSize() const
3861 {
3862  double size = mSymbologyScaleDenominator * 0.0006;
3863  return sizeToMapUnits( size );
3864 }
3865 
3866 double QgsDxfExport::dashSeparatorSize() const
3867 {
3868  double size = mSymbologyScaleDenominator * 0.0006;
3869  return sizeToMapUnits( size );
3870 }
3871 
3872 double QgsDxfExport::sizeToMapUnits( double s ) const
3873 {
3874  double size = s * QGis::fromUnitToUnitFactor( QGis::Meters, mMapUnits );
3875  return size;
3876 }
3877 
3878 QString QgsDxfExport::lineNameFromPenStyle( Qt::PenStyle style )
3879 {
3880  switch ( style )
3881  {
3882  case Qt::DashLine:
3883  return "DASH";
3884  case Qt::DotLine:
3885  return "DOT";
3886  case Qt::DashDotLine:
3887  return "DASHDOT";
3888  case Qt::DashDotDotLine:
3889  return "DASHDOTDOT";
3890  case Qt::SolidLine:
3891  default:
3892  return "CONTINUOUS";
3893  }
3894 }
3895 
3896 QString QgsDxfExport::dxfLayerName( const QString& name )
3897 {
3898  if ( name.isEmpty() )
3899  return "0";
3900 
3901  //dxf layers can be max 255 characters long
3902  QString layerName = name.left( 255 );
3903 
3904  // replaced restricted characters with underscore
3905  // < > / \ " : ; ? * | = '
3906  // See http://docs.autodesk.com/ACD/2010/ENU/AutoCAD%202010%20User%20Documentation/index.html?url=WS1a9193826455f5ffa23ce210c4a30acaf-7345.htm,topicNumber=d0e41665
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  layerName.replace( "=", "_" );
3918  layerName.replace( "\'", "_" );
3919 
3920  return layerName;
3921 }
3922 
3923 bool QgsDxfExport::layerIsScaleBasedVisible( const QgsMapLayer* layer ) const
3924 {
3925  if ( !layer )
3926  return false;
3927 
3928  if ( mSymbologyExport == QgsDxfExport::NoSymbology || !layer->hasScaleBasedVisibility() )
3929  return true;
3930 
3931  return layer->minimumScale() < mSymbologyScaleDenominator &&
3932  layer->maximumScale() > mSymbologyScaleDenominator;
3933 }
3934 
3935 QString QgsDxfExport::layerName( const QString &id, const QgsFeature &f ) const
3936 {
3937  QList< QPair<QgsVectorLayer*, int> >::const_iterator layerIt = mLayers.constBegin();
3938  for ( ; layerIt != mLayers.constEnd(); ++layerIt )
3939  {
3940  if ( layerIt->first && layerIt->first->id() == id )
3941  return dxfLayerName( layerIt->second < 0 ? layerIt->first->name() : f.attribute( layerIt->second ).toString() );
3942  }
3943 
3944  return "0";
3945 }
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:37
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
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
const QgsFeature * feature() const
Current feature being rendered - may be null.
Definition: qgssymbolv2.h:192
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:130
float maximumScale() const
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()
Definition: qgssymbolv2.h:85
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:63
QString qgsDoubleToString(const double &a, const int &precision=17)
Definition: qgis.h:313
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:55
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:66
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)
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:135