31
31
#include < QTreeWidgetItem>
32
32
#include < QModelIndex>
33
33
#include < QVariant>
34
+ #include < QRegExp>
34
35
35
36
#include " qgis.h"
36
37
#include " qgsapplication.h"
38
+ #include " qgsfeatureattribute.h" // TODO: remove - this is only for qgsgrassprovider.h
37
39
38
40
extern " C" {
39
41
#include < grass/gis.h>
40
42
#include < grass/Vect.h>
41
43
}
42
44
43
45
#include " ../../src/providers/grass/qgsgrass.h"
46
+ #include " ../../src/providers/grass/qgsgrassprovider.h"
44
47
#include " qgsgrassmodel.h"
45
48
#include " qgsgrassselect.h"
46
49
@@ -124,6 +127,7 @@ QVariant QgsGrassModelItem::data (int role)
124
127
125
128
QString QgsGrassModelItem::info ()
126
129
{
130
+ QString tblStart = " <table border=1 cellspacing=1 cellpadding=1>" ;
127
131
switch ( mType )
128
132
{
129
133
case QgsGrassModel::Location:
@@ -136,56 +140,52 @@ QString QgsGrassModelItem::info()
136
140
case QgsGrassModel::Rasters:
137
141
return " Location: " + mLocation + " <br>Mapset: " + mMapset ;
138
142
break ;
139
- case QgsGrassModel::Vector:
140
- return " Vector: " + mMap ;
141
143
case QgsGrassModel::Raster:
142
144
{
143
- QString nl = " <br> " ;
144
- QString str = " <b>Raster: " + mMap + " </b>" + nl ;
145
+ QString str = tblStart ;
146
+ str += htmlTableRow ( " <b>Raster</b> " , " <b> " + mMap + " </b>" ) ;
145
147
146
148
struct Cell_head head;
147
149
QgsGrass::setLocation ( mGisbase , mLocation );
148
150
149
151
if ( G_get_cellhd ( mMap .toLocal8Bit ().data (),
150
152
mMapset .toLocal8Bit ().data (), &head) != 0 )
151
153
{
152
- str += " Cannot open raster header" + nl ;
154
+ str += " <tr><td colspan=2> Cannot open raster header</td></tr> " ;
153
155
}
154
156
else
155
157
{
156
- // str += QString::number(head.rows) + " rows" + nl;
157
- str += " <table border=1 cellspacing=1 cellpadding=1>" ;
158
- str += htmlTableRow ( " rows" , QString::number (head.rows ));
159
- str += htmlTableRow ( " columns" , QString::number (head.cols ) );
158
+ str += htmlTableRow ( " Rows" , QString::number (head.rows ));
159
+ str += htmlTableRow ( " Columns" , QString::number (head.cols ) );
160
160
str += htmlTableRow ( " N-S resolution" , QString::number (head.ns_res ) );
161
161
str += htmlTableRow ( " E-W resolution" , QString::number (head.ew_res ) );
162
- str += htmlTableRow ( " north" , QString::number (head.north ) );
163
- str += htmlTableRow ( " south" , QString::number (head.south ) );
164
- str += htmlTableRow ( " east" , QString::number (head.east ) );
165
- str += htmlTableRow ( " west" , QString::number (head.west ) );
166
- str += " </table>" ;
162
+ str += htmlTableRow ( " North" , QString::number (head.north ) );
163
+ str += htmlTableRow ( " South" , QString::number (head.south ) );
164
+ str += htmlTableRow ( " East" , QString::number (head.east ) );
165
+ str += htmlTableRow ( " West" , QString::number (head.west ) );
167
166
168
167
int rasterType = G_raster_map_type ( mMap .toLocal8Bit ().data (),
169
168
mMapset .toLocal8Bit ().data () );
170
169
170
+ QString format;
171
171
if ( rasterType == CELL_TYPE )
172
172
{
173
- str + = " integer (" + QString::number (head.format );
174
- str += head.format ==0 ? " byte)" : " bytes)" ;
173
+ format = " integer (" + QString::number (head.format );
174
+ format += head.format ==0 ? " byte)" : " bytes)" ;
175
175
}
176
176
else if ( rasterType == FCELL_TYPE )
177
177
{
178
- str += " floating point (4 bytes)" ;
178
+ format += " floating point (4 bytes)" ;
179
179
}
180
180
else if ( rasterType == DCELL_TYPE )
181
181
{
182
- str += " floating point (8 bytes)" ;
182
+ format += " floating point (8 bytes)" ;
183
183
}
184
184
else
185
185
{
186
- str += " unknown" ;
186
+ format += " unknown" ;
187
187
}
188
- str += " format" + nl ;
188
+ str += htmlTableRow ( " Format " , format ) ;
189
189
}
190
190
191
191
struct FPRange range;
@@ -195,31 +195,168 @@ QString QgsGrassModelItem::info()
195
195
double min, max;
196
196
G_get_fp_range_min_max ( &range, &min, &max );
197
197
198
- str += QString::number (min) + " minimum value" + nl ;
199
- str += QString::number (max) + " maximum value" + nl ;
198
+ str += htmlTableRow ( " Minimum value" , QString::number (min)) ;
199
+ str += htmlTableRow ( " Maximum value" , QString::number (max)) ;
200
200
}
201
201
202
202
203
203
struct History hist;
204
204
if ( G_read_history ( mMap .toLocal8Bit ().data (),
205
205
mMapset .toLocal8Bit ().data (), &hist) >= 0 )
206
206
{
207
- str += " Data source: " + QString (hist.datsrc_1 ) + " "
208
- + QString (hist.datsrc_2 ) + nl;
209
- str += " Data description: " + QString (hist.keywrd ) + nl;
210
- str += " Comments: " + nl;
211
- for (int i = 0 ; i < hist.edlinecnt ; i++)
212
- {
213
- str += QString (hist.edhist [i]) + nl;
214
- }
207
+ if ( QString (hist.datsrc_1 ).length () > 0
208
+ || QString (hist.datsrc_2 ).length () > 0 )
209
+ {
210
+ str += htmlTableRow ( " Data source" , QString (hist.datsrc_1 ) + " "
211
+ + QString (hist.datsrc_2 ) );
212
+ }
213
+ if ( QString (hist.keywrd ).length () > 0 )
214
+ {
215
+ str += htmlTableRow ( " Data description" , QString (hist.keywrd ) );
216
+ }
217
+ if ( hist.edlinecnt > 0 )
218
+ {
219
+ QString h;
220
+ for (int i = 0 ; i < hist.edlinecnt ; i++)
221
+ {
222
+ h += QString (hist.edhist [i]) + " <br>" ;
223
+ }
224
+ str += htmlTableRow ( " Comments" , h);
225
+ }
215
226
}
227
+ str += " </table>" ;
216
228
217
229
return str;
218
230
}
219
231
break ;
232
+
233
+ case QgsGrassModel::Vector:
234
+ {
235
+ QString str = tblStart;
236
+ str += htmlTableRow (" <b>Vector</b>" , " <b>" + mMap + " </b>" );
237
+
238
+ QgsGrass::setLocation ( mGisbase , mLocation );
239
+
240
+ struct Map_info Map;
241
+ int level = Vect_open_old_head ( &Map, mMap .toLocal8Bit ().data (),
242
+ mMapset .toLocal8Bit ().data ());
243
+
244
+ if ( level >= 2 )
245
+ {
246
+ int is3d = Vect_is_3d (&Map);
247
+
248
+ // Number of elements
249
+ str += htmlTableRow ( " Points" , QString::number (Vect_get_num_primitives (&Map, GV_POINT)) );
250
+ str += htmlTableRow ( " Lines" , QString::number (Vect_get_num_primitives (&Map, GV_LINE)) );
251
+ str += htmlTableRow ( " Boundaries" , QString::number (Vect_get_num_primitives (&Map, GV_BOUNDARY)) );
252
+ str += htmlTableRow ( " Centroids" , QString::number (Vect_get_num_primitives (&Map, GV_CENTROID)) );
253
+ if ( is3d )
254
+ {
255
+ str += htmlTableRow ( " Faces" , QString::number ( Vect_get_num_primitives (&Map, GV_FACE) ) );
256
+ str += htmlTableRow ( " Kernels" , QString::number ( Vect_get_num_primitives (&Map, GV_KERNEL) ) );
257
+ }
258
+
259
+ str += htmlTableRow ( " Areas" , QString::number (Vect_get_num_areas (&Map)) );
260
+ str += htmlTableRow ( " Islands" , QString::number ( Vect_get_num_islands (&Map) ) );
261
+
262
+
263
+ // Box and dimension
264
+ BOUND_BOX box;
265
+ char buffer[100 ];
266
+
267
+ Vect_get_map_box (&Map, &box );
268
+ int proj = Vect_get_proj (&Map);
269
+
270
+ G_format_northing (box.N , buffer, proj);
271
+ str += htmlTableRow ( " North" , QString (buffer) );
272
+ G_format_northing (box.S , buffer, proj);
273
+ str += htmlTableRow ( " South" , QString (buffer) );
274
+ G_format_easting (box.E , buffer, proj );
275
+ str += htmlTableRow ( " East" , QString (buffer) );
276
+ G_format_easting (box.W , buffer, proj );
277
+ str += htmlTableRow ( " West" , QString (buffer) );
278
+ if ( is3d )
279
+ {
280
+ str += htmlTableRow ( " Top" , QString::number (box.T ) );
281
+ str += htmlTableRow ( " Bottom" , QString::number (box.B ) );
282
+ }
283
+
284
+ str += htmlTableRow ( " 3D" , is3d ? " yes" : " no" );
285
+
286
+ str += " </table>" ;
287
+
288
+ // History
289
+ Vect_hist_rewind ( &Map );
290
+ char hbuffer[1001 ];
291
+ str += " <p>History<br>" ;
292
+ QRegExp rx ( " ^-+$" );
293
+ while ( Vect_hist_read ( hbuffer, 1000 , &Map ) != NULL ) {
294
+ QString row = QString (hbuffer);
295
+ if ( rx.search ( row ) != -1 )
296
+ {
297
+ str += " <hr>" ;
298
+ }
299
+ else
300
+ {
301
+ str += row + " <br>" ;
302
+ }
303
+ }
304
+ }
305
+ else
306
+ {
307
+ str += " </table>" ;
308
+ }
309
+
310
+ Vect_close (&Map);
311
+ return str;
312
+ }
313
+ break ;
314
+
220
315
case QgsGrassModel::VectorLayer:
221
- return " Vector: " + mMap + " <br>Layer: " + mLayer ;
222
- break ;
316
+ {
317
+ QString str = tblStart;
318
+ str += htmlTableRow (" <b>Vector</b>" , " <b>" + mMap + " </b>" );
319
+ str += htmlTableRow (" <b>Layer</b>" , " <b>" + mLayer + " </b>" );
320
+
321
+ QgsGrass::setLocation ( mGisbase , mLocation );
322
+
323
+ struct Map_info Map;
324
+ int level = Vect_open_old_head ( &Map, mMap .toLocal8Bit ().data (),
325
+ mMapset .toLocal8Bit ().data ());
326
+
327
+ if ( level >= 2 )
328
+ {
329
+ struct field_info *fi;
330
+
331
+ int field = QgsGrassProvider::grassLayer (mLayer );
332
+ if ( field != -1 )
333
+ {
334
+ // Number of features
335
+ int type = QgsGrassProvider::grassLayerType (mLayer );
336
+ if (type != -1 )
337
+ {
338
+ str += htmlTableRow (" Features" ,
339
+ QString::number (Vect_cidx_get_type_count (&Map, field, type)) );
340
+ }
341
+
342
+ fi = Vect_get_field ( &Map, field);
343
+
344
+ // Database link
345
+ if ( fi )
346
+ {
347
+ str += htmlTableRow (" Driver" , QString (fi->driver ) );
348
+ str += htmlTableRow (" Database" , QString (fi->database ) );
349
+ str += htmlTableRow (" Table" , QString (fi->table ) );
350
+ str += htmlTableRow (" Key column" , QString (fi->key ) );
351
+ }
352
+ }
353
+ }
354
+ str += " </table>" ;
355
+
356
+ Vect_close (&Map);
357
+ return str;
358
+ }
359
+ break ;
223
360
}
224
361
return QString ();
225
362
}
0 commit comments