Skip to content

Commit 12dd395

Browse files
author
stopa85
committedJan 28, 2011
Separate gui-part and graph construction part. Added message box in shortestpath widget.
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@15093 c8812cc2-4d05-0410-92ff-de0c093fc19c

File tree

8 files changed

+164
-80
lines changed

8 files changed

+164
-80
lines changed
 

‎src/plugins/roadgraph/graphdirector.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,6 @@ class RgGraphDirector
4040
*/
4141
virtual void makeGraph( RgGraphBuilder * ) const = 0;
4242

43-
/**
44-
* return pointer to my Settings
45-
*/
46-
virtual RgSettings* settings() = 0;
47-
4843
/**
4944
* return Director name
5045
*/

‎src/plugins/roadgraph/linevectorlayerdirector.cpp

Lines changed: 50 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
* \brief implementation of RgLineVectorLayerDirector
1515
*/
1616

17-
#include "linevectorlayersettings.h"
1817
#include "linevectorlayerdirector.h"
1918
#include "graphbuilder.h"
2019
#include "units.h"
@@ -32,16 +31,30 @@
3231
//standard includes
3332
#include <iostream>
3433

35-
RgLineVectorLayerDirector::RgLineVectorLayerDirector()
34+
RgLineVectorLayerDirector::RgLineVectorLayerDirector( const QString& layerId,
35+
int directionFieldId,
36+
const QString& directDirectionValue,
37+
const QString& reverseDirectionValue,
38+
const QString& bothDirectionValue,
39+
int defaultDirection,
40+
const QString& speedUnitName,
41+
int speedFieldId,
42+
double defaultSpeed)
3643
{
44+
mLayerId = layerId;
45+
mDirectionFieldId = directionFieldId;
46+
mDirectDirectionValue = directDirectionValue;
47+
mReverseDirectionValue = reverseDirectionValue;
48+
mDefaultDirection = defaultDirection;
49+
mBothDirectionValue = bothDirectionValue;
50+
mSpeedUnitName = speedUnitName;
51+
mSpeedFieldId = speedFieldId;
52+
mDefaultSpeed = defaultSpeed;
3753
}
54+
3855
RgLineVectorLayerDirector::~RgLineVectorLayerDirector()
3956
{
4057
}
41-
RgSettings* RgLineVectorLayerDirector::settings()
42-
{
43-
return &mSettings;
44-
}
4558

4659
QString RgLineVectorLayerDirector::name() const
4760
{
@@ -50,77 +63,59 @@ QString RgLineVectorLayerDirector::name() const
5063

5164
void RgLineVectorLayerDirector::makeGraph( RgGraphBuilder *builder ) const
5265
{
53-
QgsVectorLayer *vl = NULL;
54-
QMap< QString, QgsMapLayer*> m = QgsMapLayerRegistry::instance()->mapLayers();
55-
QMap< QString, QgsMapLayer*>::const_iterator it;
56-
for ( it = m.constBegin(); it != m.constEnd(); ++it )
57-
{
58-
if ( it.value()->name() == mSettings.mLayer )
59-
{
60-
vl = dynamic_cast<QgsVectorLayer*>( it.value() );
61-
break;
62-
}
63-
}
64-
if ( vl == NULL )
65-
return;
66+
QgsVectorLayer *vl = myLayer();
6667

67-
QgsVectorDataProvider *provider = dynamic_cast<QgsVectorDataProvider*>( vl->dataProvider() );
68-
if ( provider == NULL )
68+
if ( vl == NULL )
6969
return;
7070

71-
int directionFieldId = provider->fieldNameIndex( mSettings.mDirection );
72-
int speedFieldId = provider->fieldNameIndex( mSettings.mSpeed );
73-
7471
builder->setSourceCrs( vl->crs() );
7572
QgsAttributeList la;
76-
if ( directionFieldId > -1 )
77-
la.push_back( directionFieldId );
78-
if ( speedFieldId > -1 )
79-
la.push_back( speedFieldId );
73+
la.push_back( mDirectionFieldId );
74+
la.push_back( mSpeedFieldId );
8075

81-
SpeedUnit su = SpeedUnit::byName( mSettings.mSpeedUnitName );
76+
SpeedUnit su = SpeedUnit::byName( mSpeedUnitName );
8277

8378
vl->select( la );
8479
QgsFeature feature;
8580
while ( vl->nextFeature( feature ) )
8681
{
8782
QgsAttributeMap attr = feature.attributeMap();
88-
RgLineVectorLayerSettings::DirectionType directionType = mSettings.mDefaultDirection;
83+
int directionType = mDefaultDirection;
8984
QgsAttributeMap::const_iterator it;
9085
// What direction have feature?
9186
for ( it = attr.constBegin(); it != attr.constEnd(); ++it )
9287
{
93-
if ( it.key() != directionFieldId )
88+
if ( it.key() != mDirectionFieldId )
9489
{
9590
continue;
9691
}
9792
QString str = it.value().toString();
98-
if ( str == mSettings.mBothDirectionVal )
93+
if ( str == mBothDirectionValue )
9994
{
100-
directionType = RgLineVectorLayerSettings::Both;
95+
directionType = 3;
10196
}
102-
else if ( str == mSettings.mFirstPointToLastPointDirectionVal )
97+
else if ( str == mDirectDirectionValue )
10398
{
104-
directionType = RgLineVectorLayerSettings::FirstPointToLastPoint;
99+
directionType = 1;
105100
}
106-
else if ( str == mSettings.mLastPointToFirstPointDirectionVal )
101+
else if ( str == mReverseDirectionValue )
107102
{
108-
directionType = RgLineVectorLayerSettings::LastPointToFirstPoint;
103+
directionType = 2;
109104
}
110105
}
111106
// What speed have feature?
112107
double speed = 0.0;
113108
for ( it = attr.constBegin(); it != attr.constEnd(); ++it )
114109
{
115-
if ( it.key() != speedFieldId )
110+
if ( it.key() != mSpeedFieldId )
116111
{
117112
continue;
118113
}
119114
speed = it.value().toDouble();
120115
}
121116
if ( speed <= 0.0 )
122117
{
123-
speed = mSettings.mDefaultSpeed;
118+
speed = mDefaultSpeed;
124119
}
125120

126121
// begin features segments and add arc to the Graph;
@@ -134,13 +129,13 @@ void RgLineVectorLayerDirector::makeGraph( RgGraphBuilder *builder ) const
134129
pt2 = *pointIt;
135130
if ( !isFirstPoint )
136131
{
137-
if ( directionType == RgLineVectorLayerSettings::FirstPointToLastPoint ||
138-
directionType == RgLineVectorLayerSettings::Both )
132+
if ( directionType == 1 ||
133+
directionType == 3 )
139134
{
140135
builder->addArc( pt1, pt2, speed*su.multipler() );
141136
}
142-
if ( directionType == RgLineVectorLayerSettings::LastPointToFirstPoint ||
143-
directionType == RgLineVectorLayerSettings::Both )
137+
if ( directionType == 2 ||
138+
directionType == 3 )
144139
{
145140
builder->addArc( pt2, pt1, speed*su.multipler() );
146141
}
@@ -151,3 +146,15 @@ void RgLineVectorLayerDirector::makeGraph( RgGraphBuilder *builder ) const
151146

152147
} // while( vl->nextFeature(feature) )
153148
} // makeGraph( RgGraphBuilder *builder, const QgsRectangle& rt )
149+
150+
QgsVectorLayer* RgLineVectorLayerDirector::myLayer() const
151+
{
152+
QMap <QString, QgsMapLayer*> m = QgsMapLayerRegistry::instance()->mapLayers();
153+
QMap <QString, QgsMapLayer*>::const_iterator it = m.find( mLayerId );
154+
if ( it == m.end() )
155+
{
156+
return NULL;
157+
}
158+
// return NULL if it.value() isn't QgsVectorLayer()
159+
return dynamic_cast<QgsVectorLayer*>( it.value() );
160+
}

‎src/plugins/roadgraph/linevectorlayerdirector.h

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@
2121

2222
// Road-graph plugin includes
2323
#include "graphdirector.h"
24-
#include "linevectorlayersettings.h"
2524

2625
//forward declarations
2726
class RgGraphBuilder;
27+
class QgsVectorLayer;
2828

2929
/**
3030
* \class RgLineVectorLayerDirector
@@ -33,21 +33,48 @@ class RgGraphBuilder;
3333
class RgLineVectorLayerDirector : public RgGraphDirector
3434
{
3535
public:
36-
RgLineVectorLayerDirector();
36+
RgLineVectorLayerDirector( const QString& layerId,
37+
int directionFiledId,
38+
const QString& directDirectionValue,
39+
const QString& reverseDirectionValue,
40+
const QString& bothDirectionValue,
41+
int defaultDirection,
42+
const QString& speedValueUnit = QString("m/s"),
43+
int speedFieldId = -1,
44+
double defaultSpeed = 1.0 );
45+
3746
//! Destructor
3847
virtual ~RgLineVectorLayerDirector();
3948
/**
4049
* MANDATORY DIRECTOR PROPERTY DECLARATION
4150
*/
4251
void makeGraph( RgGraphBuilder * ) const;
4352

44-
RgSettings* settings();
45-
4653
QString name() const;
54+
4755
private:
48-
/**
49-
* settings of this director
50-
*/
51-
RgLineVectorLayerSettings mSettings;
56+
57+
QgsVectorLayer* myLayer() const;
58+
59+
private:
60+
61+
QString mLayerId;
62+
63+
int mSpeedFieldId;
64+
65+
double mDefaultSpeed;
66+
67+
QString mSpeedUnitName;
68+
69+
int mDirectionFieldId;
70+
71+
QString mDirectDirectionValue;
72+
73+
QString mReverseDirectionValue;
74+
75+
QString mBothDirectionValue;
76+
77+
//FIXME: need enum
78+
int mDefaultDirection;
5279
};
5380
#endif //GRAPHDIRECTOR

‎src/plugins/roadgraph/roadgraphplugin.cpp

Lines changed: 50 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,18 @@
2323
#include <qgsmaptoolemitpoint.h>
2424
#include <qgsmaprenderer.h>
2525

26+
#include <qgsmaplayerregistry.h>
27+
#include <qgsvectorlayer.h>
28+
#include <qgsvectordataprovider.h>
29+
2630
// Road grap plugin includes
2731
#include "roadgraphplugin.h"
2832
#include "shortestpathwidget.h"
2933
#include "settingsdlg.h"
30-
#include "graphdirector.h"
34+
3135
#include "linevectorlayerdirector.h"
36+
#include "linevectorlayersettings.h"
3237
#include "simplegraphbuilder.h"
33-
3438
//
3539
// Qt4 Related Includes
3640
//
@@ -70,7 +74,7 @@ RoadGraphPlugin::RoadGraphPlugin( QgisInterface * theQgisInterface ):
7074
{
7175

7276
mQShortestPathDock = NULL;
73-
mDirector = new RgLineVectorLayerDirector();
77+
mSettings = new RgLineVectorLayerSettings();
7478
mTimeUnitName = "h";
7579
mDistanceUnitName = "km";
7680
}
@@ -166,17 +170,18 @@ void RoadGraphPlugin::newProject()
166170

167171
void RoadGraphPlugin::property()
168172
{
169-
RgSettingsDlg dlg( mDirector, mQGisIface->mainWindow(), QgisGui::ModalDialogFlags );
173+
RgSettingsDlg dlg( mSettings, mQGisIface->mainWindow(), QgisGui::ModalDialogFlags );
170174

171175
dlg.setTimeUnitName( mTimeUnitName );
172176
dlg.setDistanceUnitName( mDistanceUnitName );
173177

174178
if ( !dlg.exec() )
175179
return;
180+
176181
mTimeUnitName = dlg.timeUnitName();
177182
mDistanceUnitName = dlg.distanceUnitName();
178183

179-
mDirector->settings()->write( QgsProject::instance() );
184+
mSettings->write( QgsProject::instance() );
180185
QgsProject::instance()->writeEntry( "roadgraphplugin", "/pluginTimeUnit", mTimeUnitName );
181186
QgsProject::instance()->writeEntry( "roadgraphplugin", "/pluginDistanceUnit", mDistanceUnitName );
182187

@@ -236,7 +241,7 @@ void RoadGraphPlugin::about()
236241

237242
void RoadGraphPlugin::projectRead()
238243
{
239-
mDirector->settings()->read( QgsProject::instance() );
244+
mSettings->read( QgsProject::instance() );
240245
mTimeUnitName = QgsProject::instance()->readEntry( "roadgraphplugin", "/pluginTimeUnit", "h" );
241246
mDistanceUnitName = QgsProject::instance()->readEntry( "roadgraphplugin", "/pluginDistanceUnit", "km" );
242247
setGuiElementsToDefault();
@@ -249,17 +254,51 @@ QgisInterface* RoadGraphPlugin::iface()
249254

250255
const RgGraphDirector* RoadGraphPlugin::director() const
251256
{
252-
return mDirector;
257+
QString layerId;
258+
QgsVectorLayer *layer = NULL;
259+
QMap< QString, QgsMapLayer* > mapLayers = QgsMapLayerRegistry::instance()->mapLayers();
260+
QMap< QString, QgsMapLayer* >::const_iterator it;
261+
for ( it = mapLayers.begin(); it != mapLayers.end(); ++it )
262+
{
263+
if ( it.value()->name() != mSettings->mLayer )
264+
continue;
265+
layerId = it.key();
266+
layer = dynamic_cast< QgsVectorLayer* >( it.value() );
267+
break;
268+
}
269+
if ( layer == NULL )
270+
return NULL;
271+
272+
QgsVectorDataProvider *provider = dynamic_cast< QgsVectorDataProvider* > ( layer->dataProvider() );
273+
if ( provider == NULL )
274+
return NULL;
275+
276+
RgLineVectorLayerDirector * director =
277+
new RgLineVectorLayerDirector( layerId,
278+
provider->fieldNameIndex( mSettings->mDirection ),
279+
mSettings->mFirstPointToLastPointDirectionVal,
280+
mSettings->mLastPointToFirstPointDirectionVal,
281+
mSettings->mBothDirectionVal,
282+
mSettings->mDefaultDirection,
283+
mSettings->mSpeedUnitName,
284+
provider->fieldNameIndex( mSettings->mSpeed ),
285+
mSettings->mDefaultSpeed );
286+
287+
return director;
253288
}
254289
void RoadGraphPlugin::render( QPainter *painter )
255290
{
256-
if ( mDirector == NULL )
257-
return;
258291
if ( !mQShowDirectionAction->isChecked() )
259292
return;
293+
294+
const RgGraphDirector *graphDirector = director();
295+
296+
if ( graphDirector == NULL )
297+
return;
298+
260299
RgSimpleGraphBuilder builder;
261300
builder.setDestinationCrs( mQGisIface->mapCanvas()->mapRenderer()->destinationSrs() );
262-
mDirector->makeGraph( &builder );
301+
graphDirector->makeGraph( &builder );
263302
AdjacencyMatrix m = builder.adjacencyMatrix();
264303

265304
AdjacencyMatrix::iterator it1;
@@ -293,7 +332,7 @@ void RoadGraphPlugin::render( QPainter *painter )
293332
painter->drawPolygon( tmp );
294333
}
295334
}
296-
335+
delete graphDirector;
297336
}// RoadGraphPlugin::render()
298337
QString RoadGraphPlugin::timeUnitName()
299338
{

‎src/plugins/roadgraph/roadgraphplugin.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class QDockWidget;
3232
//forward declarations RoadGraph plugins classes
3333
class RgGraphDirector;
3434
class RgShortestPathWidget;
35+
class RgLineVectorLayerSettings;
3536

3637
/**
3738
* \class RoadGraphPlugin
@@ -56,7 +57,7 @@ class RoadGraphPlugin: public QObject, public QgisPlugin
5657
QgisInterface *iface();
5758

5859
/**
59-
* return pointer to my Graph director
60+
* return pointer to graph director
6061
*/
6162
const RgGraphDirector* director() const;
6263

@@ -140,9 +141,10 @@ class RoadGraphPlugin: public QObject, public QgisPlugin
140141
RgShortestPathWidget *mQShortestPathDock;
141142

142143
/**
143-
* My Graph Director
144+
* My graph settings.
145+
* @note. Should be used RgSettings
144146
*/
145-
RgGraphDirector *mDirector;
147+
RgLineVectorLayerSettings *mSettings;
146148

147149
/**
148150
* time unit for results presentation

‎src/plugins/roadgraph/settingsdlg.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,12 @@
2121

2222

2323
// Qgis includes
24-
#include "graphdirector.h"
2524
#include "settings.h"
2625

2726
//standard includes
2827

29-
RgSettingsDlg::RgSettingsDlg( RgGraphDirector *director, QWidget* parent, Qt::WFlags fl )
30-
: mDirector( director ), QDialog( parent, fl )
28+
RgSettingsDlg::RgSettingsDlg( RgSettings *settings, QWidget* parent, Qt::WFlags fl )
29+
: mSettings( settings ), QDialog( parent, fl )
3130
{
3231
// create base widgets;
3332
setWindowTitle( tr( "Road graph plugins settings" ) );
@@ -55,7 +54,8 @@ RgSettingsDlg::RgSettingsDlg( RgGraphDirector *director, QWidget* parent, Qt::WF
5554
h->addWidget(mcbGraphDirector);
5655
v->addLayout(h);
5756
*/
58-
mSettingsWidget = director->settings()->getGui( this );
57+
58+
mSettingsWidget = mSettings->getGui( this );
5959
v->addWidget( mSettingsWidget );
6060

6161
QDialogButtonBox *bb = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this );
@@ -76,7 +76,7 @@ RgSettingsDlg::~RgSettingsDlg()
7676

7777
void RgSettingsDlg::on_buttonBox_accepted()
7878
{
79-
mDirector->settings()->setFromGui( mSettingsWidget );
79+
mSettings->setFromGui( mSettingsWidget );
8080
accept();
8181
}
8282

‎src/plugins/roadgraph/settingsdlg.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class QComboBox;
2323
// forward declaration Qgis-classes
2424

2525
//forward declaration RoadGraph plugins classes
26-
class RgGraphDirector;
26+
class RgSettings;
2727

2828
/**
2929
@author Sergey Yakushev
@@ -36,7 +36,7 @@ class RgSettingsDlg : public QDialog
3636
{
3737
Q_OBJECT
3838
public:
39-
RgSettingsDlg( RgGraphDirector *director, QWidget* parent = 0, Qt::WFlags fl = 0 );
39+
RgSettingsDlg( RgSettings *settings, QWidget* parent = 0, Qt::WFlags fl = 0 );
4040
~RgSettingsDlg();
4141

4242
QString timeUnitName();
@@ -60,9 +60,9 @@ class RgSettingsDlg : public QDialog
6060
QComboBox *mcbGraphDirector;
6161

6262
/**
63-
* current graph director
63+
* current graph settings object
6464
*/
65-
RgGraphDirector *mDirector;
65+
RgSettings *mSettings;
6666

6767
QWidget *mSettingsWidget;
6868

‎src/plugins/roadgraph/shortestpathwidget.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include <qlabel.h>
2525
#include <qlineedit.h>
2626
#include <QToolButton>
27+
#include <QMessageBox>
2728

2829
// Qgis includes
2930
#include <qgsmapcanvas.h>
@@ -224,15 +225,28 @@ bool RgShortestPathWidget::getPath( AdjacencyMatrix& matrix, QgsPoint& p1, QgsPo
224225
return false;
225226
RgSimpleGraphBuilder builder;
226227
builder.setDestinationCrs( mPlugin->iface()->mapCanvas()->mapRenderer()->destinationSrs() );
227-
mPlugin->director()->makeGraph( &builder );
228+
{
229+
const RgGraphDirector *director = mPlugin->director();
230+
director->makeGraph( &builder );
231+
232+
// not need
233+
delete director;
234+
}
235+
228236
bool ok;
229237

230238
p1 = builder.tiePoint( mFrontPoint, ok );
231239
if ( !ok )
240+
{
241+
QMessageBox::critical (this, tr("Tie point failed"), tr("Start point don't tie to the road!") );
232242
return false;
243+
}
233244
p2 = builder.tiePoint( mBackPoint, ok );
234245
if ( !ok )
246+
{
247+
QMessageBox::critical (this, tr("Tie point failed"), tr("Stop point don't tie to the road!") );
235248
return false;
249+
}
236250
AdjacencyMatrix m = builder.adjacencyMatrix();
237251

238252
DijkstraFinder::OptimizationCriterion criterion = DijkstraFinder::byCost;

0 commit comments

Comments
 (0)
Please sign in to comment.