@@ -286,7 +286,7 @@ double QgsDxfExport::mDxfColors[][3] =
286
286
{1 , 1 , 1 } // 255
287
287
};
288
288
289
- QgsDxfExport::QgsDxfExport (): mSymbologyScaleDenominator( 1.0 ), mSymbologyExport( NoSymbology ), mMapUnits( QGis::Meters ), mSymbolLayerCounter( 0 ), mNextHandleId( 10 )
289
+ QgsDxfExport::QgsDxfExport (): mSymbologyScaleDenominator( 1.0 ), mSymbologyExport( NoSymbology ), mMapUnits( QGis::Meters ), mSymbolLayerCounter( 0 ), mNextHandleId( 10 ), mBlockCounter( 0 )
290
290
{
291
291
}
292
292
@@ -310,6 +310,7 @@ int QgsDxfExport::writeToFile( QIODevice* d )
310
310
QTextStream outStream ( d );
311
311
writeHeader ( outStream );
312
312
writeTables ( outStream );
313
+ writeBlocks ( outStream );
313
314
writeEntities ( outStream );
314
315
writeEndFile ( outStream );
315
316
return 0 ;
@@ -451,6 +452,63 @@ void QgsDxfExport::writeTables( QTextStream& stream )
451
452
endSection ( stream );
452
453
}
453
454
455
+ void QgsDxfExport::writeBlocks ( QTextStream& stream )
456
+ {
457
+ startSection ( stream );
458
+ stream << " 2\n " ;
459
+ stream << " BLOCKS\n " ;
460
+
461
+ // iterate through all layers and get symbol layer pointers
462
+ QList<QgsSymbolLayerV2*> slList;
463
+ if ( mSymbologyExport != NoSymbology )
464
+ {
465
+ slList = symbolLayers ();
466
+ }
467
+
468
+ QList<QgsSymbolLayerV2*>::const_iterator slIt = slList.constBegin ();
469
+ for ( ; slIt != slList.constEnd (); ++slIt )
470
+ {
471
+ // if point symbol layer and no data defined properties: write block
472
+ QgsMarkerSymbolLayerV2* ml = dynamic_cast < QgsMarkerSymbolLayerV2*>( *slIt );
473
+ if ( ml )
474
+ {
475
+ // todo: find out if the marker symbol layer has data defined properties
476
+ stream << " 0\n " ;
477
+ stream << " BLOCK\n " ;
478
+ stream << " 8\n " ; // Layer (0 to take layer where INSERT happens)
479
+ stream << " 0\n " ;
480
+ QString blockName = QString ( " symbolLayer%1" ).arg ( mBlockCounter );
481
+ stream << " 2\n " ;
482
+ stream << QString ( " %1\n " ).arg ( blockName );
483
+ stream << " 70\n " ;
484
+ stream << " 64\n " ;
485
+
486
+ // x/y/z coordinates of reference point
487
+ // todo: consider anchor point
488
+ double size = ml->size ();
489
+ size *= mapUnitScaleFactor ( mSymbologyScaleDenominator , ml->sizeUnit (), mMapUnits );
490
+ stream << " 10\n " ;
491
+ stream << QString ( " %1\n " ).arg ( size / 2.0 );
492
+ stream << " 20\n " ;
493
+ stream << QString ( " %1\n " ).arg ( size / 2.0 );
494
+ stream << " 30\n " ;
495
+ stream << " 0\n " ;
496
+ stream << " 3\n " ;
497
+ stream << QString ( " %1\n " ).arg ( blockName );
498
+
499
+ ml->writeDxf ( stream, mapUnitScaleFactor ( mSymbologyScaleDenominator , ml->sizeUnit (), mMapUnits ) );
500
+
501
+ stream << " 0\n " ;
502
+ stream << " ENDBLK\n " ;
503
+ stream << " 8\n " ;
504
+ stream << " 0\n " ;
505
+
506
+ mPointSymbolBlocks .insert ( ml, blockName );
507
+ }
508
+ }
509
+ endSection ( stream );
510
+ }
511
+
454
512
void QgsDxfExport::writeEntities ( QTextStream& stream )
455
513
{
456
514
startSection ( stream );
@@ -617,6 +675,32 @@ void QgsDxfExport::endSection( QTextStream& stream )
617
675
stream << " ENDSEC\n " ;
618
676
}
619
677
678
+ void QgsDxfExport::writePoint ( QTextStream& stream, const QgsPoint& pt, const QString& layer, const QgsSymbolLayerV2* symbolLayer )
679
+ {
680
+ // insert block or write point directly?
681
+ QHash< const QgsSymbolLayerV2*, QString >::const_iterator blockIt = mPointSymbolBlocks .find ( symbolLayer );
682
+ if ( !symbolLayer || blockIt == mPointSymbolBlocks .constEnd () )
683
+ {
684
+ // write symbol directly here
685
+ }
686
+ else
687
+ {
688
+ // insert block
689
+ stream << " 0\n " ;
690
+ stream << " INSERT\n " ;
691
+ stream << " 8\n " ;
692
+ stream << layer << " \n " ;
693
+ stream << " 2\n " ;
694
+ stream << blockIt.value () << " \n " ;
695
+ stream << " 10\n " ;
696
+ stream << QString ( " %1\n " ).arg ( pt.x () );
697
+ stream << " 20\n " ;
698
+ stream << QString ( " %1\n " ).arg ( pt.y () );
699
+ stream << " 30\n " ;
700
+ stream << " 0\n " ;
701
+ }
702
+ }
703
+
620
704
void QgsDxfExport::writePolyline ( QTextStream& stream, const QgsPolyline& line, const QString& layer, const QString& lineStyleName, int color,
621
705
double width, bool polygon )
622
706
{
@@ -700,6 +784,13 @@ void QgsDxfExport::addFeature( const QgsFeature& fet, QTextStream& stream, const
700
784
// todo: write point symbols as blocks
701
785
702
786
QGis::WkbType geometryType = geom->wkbType ();
787
+
788
+ // single point
789
+ if ( geometryType == QGis::WKBPoint || geometryType == QGis::WKBPoint25D )
790
+ {
791
+ writePoint ( stream, geom->asPoint (), layer, symbolLayer );
792
+ }
793
+
703
794
// single line
704
795
if ( geometryType == QGis::WKBLineString || geometryType == QGis::WKBLineString25D )
705
796
{
0 commit comments