Skip to content

Commit ddee21c

Browse files
committedSep 13, 2013
First implementation of dxf feature writing (but it does not work yet)
1 parent edc3b5f commit ddee21c

File tree

2 files changed

+97
-2
lines changed

2 files changed

+97
-2
lines changed
 

‎src/core/qgsdxfexport.cpp

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
***************************************************************************/
1717

1818
#include "qgsdxfexport.h"
19+
#include "qgsvectordataprovider.h"
20+
#include "qgspoint.h"
21+
#include "qgsrendererv2.h"
22+
#include "qgsvectorlayer.h"
1923
#include <QIODevice>
2024
#include <QTextStream>
2125

@@ -28,7 +32,7 @@ QgsDxfExport::~QgsDxfExport()
2832

2933
}
3034

31-
int QgsDxfExport::writeToFile( QIODevice* d )
35+
int QgsDxfExport::writeToFile( QIODevice* d, SymbologyExport s )
3236
{
3337
if ( !d )
3438
{
@@ -42,6 +46,8 @@ int QgsDxfExport::writeToFile( QIODevice* d )
4246

4347
QTextStream outStream( d );
4448
writeHeader( outStream );
49+
writeEntities( outStream );
50+
writeEndFile( outStream );
4551
return 0;
4652
}
4753

@@ -61,8 +67,83 @@ void QgsDxfExport::writeHeader( QTextStream& stream )
6167
stream << "ENDSEC\n";
6268
}
6369

70+
void QgsDxfExport::writeEntities( QTextStream& stream )
71+
{
72+
stream << "0\n";
73+
stream << "SECTION\n";
74+
stream << " 2\n";
75+
stream << "ENTITIES\n";
76+
77+
//iterate through the maplayers
78+
QList< QgsMapLayer* >::iterator layerIt = mLayers.begin();
79+
for ( ; layerIt != mLayers.end(); ++layerIt )
80+
{
81+
QgsVectorLayer* vl = qobject_cast<QgsVectorLayer*>( *layerIt );
82+
if ( !vl )
83+
{
84+
continue;
85+
}
86+
QgsVectorDataProvider* dp = vl->dataProvider();
87+
if ( !dp )
88+
{
89+
continue;
90+
}
91+
92+
QgsFeatureRendererV2* renderer = vl->rendererV2();
93+
QgsFeatureIterator featureIt = vl->getFeatures( QgsFeatureRequest().setSubsetOfAttributes(
94+
renderer->usedAttributes(), dp->fields() ) );
95+
QgsFeature fet;
96+
while ( featureIt.nextFeature( fet ) )
97+
{
98+
//get geometry and write it. Todo: consider symbolisation
99+
QgsGeometry* geom = fet.geometry();
100+
if ( geom )
101+
{
102+
//try with line first
103+
writePolyline( stream, geom->asPolyline(), vl->name() ); //todo.......
104+
}
105+
}
106+
}
107+
108+
stream << " 0\n";
109+
stream << "ENDSEC\n";
110+
}
111+
64112
void QgsDxfExport::writeEndFile( QTextStream& stream )
65113
{
66114
stream << " 0\n";
67115
stream << "ENDSEC\n";
68116
}
117+
118+
void QgsDxfExport::writePolyline( QTextStream& stream, const QgsPolyline& line, const QString& layer, bool closed )
119+
{
120+
stream << " 0\n";
121+
stream << "POLYLINE\n";
122+
stream << " 8\n";
123+
stream << layer << "\n";
124+
stream << " 66\n";
125+
stream << " 1\n";
126+
stream << " 70\n";
127+
int type = closed ? 32 : 0;
128+
stream << type << "\n";
129+
130+
QgsPolyline::const_iterator lineIt = line.constBegin();
131+
for ( ; lineIt != line.constEnd(); ++lineIt )
132+
{
133+
writeVertex( stream, *lineIt, layer );
134+
}
135+
}
136+
137+
void QgsDxfExport::writeVertex( QTextStream& stream, const QgsPoint& pt, const QString& layer )
138+
{
139+
stream << " 0\n";
140+
stream << "VERTEX\n";
141+
stream << " 8\n";
142+
stream << layer << "\n";
143+
stream << " 10\n";
144+
stream << pt.x() << "\n";
145+
stream << " 20\n";
146+
stream << pt.y() << "\n";
147+
stream << " 30\n";
148+
stream << "0.0\n";
149+
}

‎src/core/qgsdxfexport.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,41 @@
1818
#ifndef QGSDXFEXPORT_H
1919
#define QGSDXFEXPORT_H
2020

21+
#include "qgsgeometry.h"
2122
#include <QList>
2223

2324
class QgsMapLayer;
25+
class QgsPoint;
2426
class QIODevice;
2527
class QTextStream;
2628

2729
class QgsDxfExport
2830
{
2931
public:
32+
enum SymbologyExport
33+
{
34+
NoSymbology = 0, //export only data
35+
FeatureSymbology, //Keeps the number of features and export symbology per feature
36+
SymbolLayerSymbology //Exports one feature per symbol layer (considering symbol levels)
37+
};
38+
3039
QgsDxfExport();
3140
~QgsDxfExport();
3241

3342
void addLayers( QList< QgsMapLayer* >& layers ) { mLayers = layers; }
34-
int writeToFile( QIODevice* d ); //maybe add progress dialog? //other parameters (e.g. scale, dpi)?
43+
int writeToFile( QIODevice* d, SymbologyExport s = SymbolLayerSymbology ); //maybe add progress dialog? //other parameters (e.g. scale, dpi)?
3544

3645
private:
3746

3847
QList< QgsMapLayer* > mLayers;
3948

4049
void writeHeader( QTextStream& stream );
50+
void writeEntities( QTextStream& stream );
4151
void writeEndFile( QTextStream& stream );
52+
53+
void writePolyline( QTextStream& stream, const QgsPolyline& line, const QString& layer, bool closed = false );
54+
void writeVertex( QTextStream& stream, const QgsPoint& pt, const QString& layer );
55+
4256
//collect styles
4357
//writeEntities
4458

0 commit comments

Comments
 (0)
Please sign in to comment.