Skip to content

Commit cc2762b

Browse files
author
rblazek
committed
freeze/thaw map
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@5860 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 4d9c9e1 commit cc2762b

File tree

2 files changed

+99
-14
lines changed

2 files changed

+99
-14
lines changed

src/providers/grass/qgsgrassprovider.cpp

+68-11
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ QgsFeature *QgsGrassProvider::getFirstFeature(bool fetchAttributes)
289289
std::cout << "QgsGrassProvider::getFirstFeature()" << std::endl;
290290
#endif
291291

292-
if ( isEdited() )
292+
if ( isEdited() || isFrozen() )
293293
return 0;
294294

295295
if ( mCidxFieldIndex < 0 ) return 0; // No features, no features in this layer
@@ -309,7 +309,7 @@ bool QgsGrassProvider::getNextFeature(QgsFeature &feature, bool fetchAttributes)
309309
std::cout << "QgsGrassProvider::getNextFeature()" << std::endl;
310310
#endif
311311

312-
if ( isEdited() )
312+
if ( isEdited() || isFrozen() )
313313
return 0;
314314

315315
if ( mCidxFieldIndex < 0 ) return 0; // No features, no features in this layer
@@ -330,7 +330,7 @@ QgsFeature *QgsGrassProvider::getNextFeature(bool fetchAttributes)
330330
<< " fetchAttributes = " << fetchAttributes << std::endl;
331331
#endif
332332

333-
if ( isEdited() )
333+
if ( isEdited() || isFrozen() )
334334
return 0;
335335

336336
if ( mCidxFieldIndex < 0 ) return 0; // No features, no features in this layer
@@ -357,7 +357,7 @@ QgsFeature* QgsGrassProvider::getNextFeature(std::list<int> const& attlist, int
357357
std::cout << "QgsGrassProvider::getNextFeature( attlist )" << std::endl;
358358
#endif
359359

360-
if ( isEdited() )
360+
if ( isEdited() || isFrozen() )
361361
return 0;
362362

363363
if ( mCidxFieldIndex < 0 ) return 0; // No features, no features in this layer
@@ -486,7 +486,7 @@ void QgsGrassProvider::select(QgsRect *rect, bool useIntersect)
486486
std::cout << "QgsGrassProvider::select() useIntersect = " << useIntersect << std::endl;
487487
#endif
488488

489-
if ( isEdited() )
489+
if ( isEdited() || isFrozen() )
490490
return;
491491

492492
// check if outdated and update if necessary
@@ -560,7 +560,7 @@ std::vector<QgsFeature>& QgsGrassProvider::identify(QgsRect * rect)
560560

561561
// TODO: does not return vector of features! Should it?
562562

563-
if ( !isEdited() ) {
563+
if ( !isEdited() && !isFrozen() ) {
564564
select(rect, true);
565565
}
566566
}
@@ -614,7 +614,7 @@ int QgsGrassProvider::keyField()
614614

615615
void QgsGrassProvider::reset()
616616
{
617-
if ( isEdited() )
617+
if ( isEdited() || isFrozen() )
618618
return;
619619

620620
int mapId = mLayers[mLayerId].mapId;
@@ -1013,6 +1013,8 @@ int QgsGrassProvider::openMap(QString gisdbase, QString location, QString mapset
10131013
}
10141014

10151015
GMAP map;
1016+
map.valid = false;
1017+
map.frozen = false;
10161018
map.gisdbase = gisdbase;
10171019
map.location = location;
10181020
map.mapset = mapset;
@@ -1096,6 +1098,8 @@ int QgsGrassProvider::openMap(QString gisdbase, QString location, QString mapset
10961098
#ifdef QGISDEBUG
10971099
std::cerr << "GRASS map successfully opened" << std::endl;
10981100
#endif
1101+
1102+
map.valid = true;
10991103

11001104
// Add new map to maps
11011105
mMaps.push_back(map);
@@ -1373,6 +1377,49 @@ bool QgsGrassProvider::isEdited ( void )
13731377
return (map->update);
13741378
}
13751379

1380+
bool QgsGrassProvider::isFrozen ( void )
1381+
{
1382+
#if QGISDEBUG > 3
1383+
std::cerr << "QgsGrassProvider::isFrozen" << std::endl;
1384+
#endif
1385+
1386+
GMAP *map = &(mMaps[mLayers[mLayerId].mapId]);
1387+
return (map->frozen);
1388+
}
1389+
1390+
void QgsGrassProvider::freeze()
1391+
{
1392+
#ifdef QGISDEBUG
1393+
std::cerr << "QgsGrassProvider::freeze" << std::endl;
1394+
#endif
1395+
1396+
if ( !isValid() ) return;
1397+
1398+
GMAP *map = &(mMaps[mLayers[mLayerId].mapId]);
1399+
1400+
if ( map->frozen ) return;
1401+
1402+
map->frozen = true;
1403+
Vect_close ( map->map );
1404+
}
1405+
1406+
void QgsGrassProvider::thaw()
1407+
{
1408+
#ifdef QGISDEBUG
1409+
std::cerr << "QgsGrassProvider::thaw" << std::endl;
1410+
#endif
1411+
1412+
if ( !isValid() ) return;
1413+
GMAP *map = &(mMaps[mLayers[mLayerId].mapId]);
1414+
1415+
if ( !map->frozen ) return;
1416+
1417+
if ( reopenMap() )
1418+
{
1419+
map->frozen = false;
1420+
}
1421+
}
1422+
13761423
bool QgsGrassProvider::startEdit ( void )
13771424
{
13781425
#ifdef QGISDEBUG
@@ -1485,6 +1532,19 @@ bool QgsGrassProvider::closeEdit ( bool newMap )
14851532

14861533
Vect_close ( map->map );
14871534

1535+
map->update = false;
1536+
1537+
if ( !reopenMap() ) return false;
1538+
1539+
map->valid = true;
1540+
1541+
return true;
1542+
}
1543+
1544+
bool QgsGrassProvider::reopenMap()
1545+
{
1546+
GMAP *map = &(mMaps[mLayers[mLayerId].mapId]);
1547+
14881548
QFileInfo di ( mGisdbase + "/" + mLocation + "/" + mMapset + "/vector/" + mMapName );
14891549
map->lastModified = di.lastModified();
14901550

@@ -1499,7 +1559,7 @@ bool QgsGrassProvider::closeEdit ( bool newMap )
14991559

15001560
if ( QgsGrass::getError() == QgsGrass::FATAL ) {
15011561
std::cerr << "Cannot reopen GRASS vector: " << QgsGrass::getErrorMessage().toLocal8Bit().data() << std::endl;
1502-
return -1;
1562+
return false;
15031563
}
15041564

15051565
#ifdef QGISDEBUG
@@ -1515,9 +1575,6 @@ bool QgsGrassProvider::closeEdit ( bool newMap )
15151575
}
15161576
}
15171577

1518-
map->update = false;
1519-
map->valid = true;
1520-
15211578
return true;
15221579
}
15231580

src/providers/grass/qgsgrassprovider.h

+31-3
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ class QgsField;
3434
* Member variables which must be updated after updateMap() are marked !UPDATE! in this file.
3535
*/
3636

37+
/* Freezing.
38+
* Because open file cannot be deleted on Windows it is necessary to
39+
* close output vector from GRASS tools before a module is run.
40+
* This is not however solution for multiple instances of QGIS.
41+
*/
42+
3743
/* Editing.
3844
* If editing is started by startEdit, vector map is reopened in update mode, and GMAP.update
3945
* is set to true. All data loaded from the map to QgsGrassProvider remain unchanged
@@ -82,6 +88,10 @@ struct GMAP
8288
QString path; // path to the layer gisdbase+location+mapset+mapName
8389
bool valid; // true if map is opened, once the map is closed,
8490
// valid is set to false and no more used
91+
92+
// Vector temporally disabled. Necessary for GRASS Tools on Windows
93+
bool frozen;
94+
8595
struct Map_info *map; // map header
8696
int nUsers; // number layers using this map
8797
int update; // true if the map is opened in update mode -> disabled standard reading
@@ -219,12 +229,27 @@ class QgsGrassProvider : public QgsVectorDataProvider
219229
*/
220230
bool isEdited();
221231

232+
/** Returns true if the layer is currently froze, i.e. a module
233+
* from GRASS Tools is writing to this vector
234+
* @return true in update mode
235+
* @return false not edited
236+
*/
237+
bool isFrozen();
238+
222239
/** Start editing. Reopen the vector for update and set GMAP.update = true
223-
* @return true success
224-
* @return false failed to reopen success
240+
* @return true is frozen
241+
* @return false is not frozen
225242
*/
226243
bool startEdit();
227244

245+
/** Freeze vector.
246+
*/
247+
void freeze();
248+
249+
/** Thaw vector.
250+
*/
251+
void thaw();
252+
228253
/** Close editing. Rebuild topology, GMAP.update = false
229254
* @param newMap set to true if a new map was created
230255
* and it is not yet used as layer
@@ -540,9 +565,12 @@ class QgsGrassProvider : public QgsVectorDataProvider
540565

541566
bool mValid; // !UPDATE!
542567
long mNumberFeatures; // !UPDATE!
543-
568+
544569
void resetSelection(bool sel); // reset selection
545570

571+
// Reopen map after edit or freeze
572+
bool reopenMap();
573+
546574
// -----------------------------------------------------------------------------------------
547575
/* Static variables and methods.
548576
* These methods opens GRASS vectors and loads some parts of vectors to the memory.

0 commit comments

Comments
 (0)