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