Skip to content

Commit

Permalink
Enable snapping on intersection introduced
Browse files Browse the repository at this point in the history
  • Loading branch information
cmoe authored and jef-n committed Oct 5, 2012
1 parent 3c525fd commit e0d4784
Show file tree
Hide file tree
Showing 4 changed files with 155 additions and 28 deletions.
29 changes: 29 additions & 0 deletions src/app/qgssnappingdialog.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ QgsSnappingDialog::QgsSnappingDialog( QWidget* parent, QgsMapCanvas* canvas ): Q
connect( QgsMapLayerRegistry::instance(), SIGNAL( layersAdded( QList<QgsMapLayer * > ) ), this, SLOT( addLayers( QList<QgsMapLayer * > ) ) ); connect( QgsMapLayerRegistry::instance(), SIGNAL( layersAdded( QList<QgsMapLayer * > ) ), this, SLOT( addLayers( QList<QgsMapLayer * > ) ) );
connect( QgsMapLayerRegistry::instance(), SIGNAL( layersWillBeRemoved( QStringList ) ), this, SLOT( layersWillBeRemoved( QStringList ) ) ); connect( QgsMapLayerRegistry::instance(), SIGNAL( layersWillBeRemoved( QStringList ) ), this, SLOT( layersWillBeRemoved( QStringList ) ) );
connect( cbxEnableTopologicalEditingCheckBox, SIGNAL( stateChanged( int ) ), this, SLOT( on_cbxEnableTopologicalEditingCheckBox_stateChanged( int ) ) ); connect( cbxEnableTopologicalEditingCheckBox, SIGNAL( stateChanged( int ) ), this, SLOT( on_cbxEnableTopologicalEditingCheckBox_stateChanged( int ) ) );
connect( cbxEnableIntersectionSnappingCheckBox, SIGNAL( stateChanged( int ) ), this, SLOT( on_cbxEnableIntersectionSnappingCheckBox_stateChanged( int ) ) );


reload(); reload();


Expand Down Expand Up @@ -113,12 +114,20 @@ void QgsSnappingDialog::reload()
} }


setTopologicalEditingState(); setTopologicalEditingState();
setIntersectionSnapppingState();
} }


void QgsSnappingDialog::on_cbxEnableTopologicalEditingCheckBox_stateChanged( int state ) void QgsSnappingDialog::on_cbxEnableTopologicalEditingCheckBox_stateChanged( int state )
{ {
int topologicalEditingEnabled = ( state == Qt::Checked ) ? 1 : 0; int topologicalEditingEnabled = ( state == Qt::Checked ) ? 1 : 0;
QgsProject::instance()->writeEntry( "Digitizing", "/TopologicalEditing", topologicalEditingEnabled ); QgsProject::instance()->writeEntry( "Digitizing", "/TopologicalEditing", topologicalEditingEnabled );
setTopologicalEditingState();
}

void QgsSnappingDialog::on_cbxEnableIntersectionSnappingCheckBox_stateChanged( int state )
{
int intersectionSnappingEnabled = ( state == Qt::Checked ) ? 1 : 0;
QgsProject::instance()->writeEntry( "Digitizing", "/IntersectionSnapping", intersectionSnappingEnabled );
} }


void QgsSnappingDialog::closeEvent( QCloseEvent* event ) void QgsSnappingDialog::closeEvent( QCloseEvent* event )
Expand Down Expand Up @@ -188,6 +197,7 @@ void QgsSnappingDialog::apply()
void QgsSnappingDialog::show() void QgsSnappingDialog::show()
{ {
setTopologicalEditingState(); setTopologicalEditingState();
setIntersectionSnapppingState();
if ( mDock ) if ( mDock )
mDock->setVisible( true ); mDock->setVisible( true );
else else
Expand Down Expand Up @@ -317,6 +327,9 @@ void QgsSnappingDialog::addLayer( QgsMapLayer * theMapLayer )
{ {
connect( cbxAvoidIntersection, SIGNAL( stateChanged( int ) ), this, SLOT( apply() ) ); connect( cbxAvoidIntersection, SIGNAL( stateChanged( int ) ), this, SLOT( apply() ) );
} }

setTopologicalEditingState();
setIntersectionSnapppingState();
} }
} }


Expand Down Expand Up @@ -354,3 +367,19 @@ void QgsSnappingDialog::setTopologicalEditingState()
} }
cbxEnableTopologicalEditingCheckBox->blockSignals( false ); cbxEnableTopologicalEditingCheckBox->blockSignals( false );
} }

void QgsSnappingDialog::setIntersectionSnapppingState()
{
// read the digitizing settings
int intersectionSnapping = QgsProject::instance()->readNumEntry( "Digitizing", "/IntersectionSnapping", 0 );
cbxEnableIntersectionSnappingCheckBox->blockSignals( true );
if ( intersectionSnapping != 0 )
{
cbxEnableIntersectionSnappingCheckBox->setCheckState( Qt::Checked );
}
else
{
cbxEnableIntersectionSnappingCheckBox->setCheckState( Qt::Unchecked );
}
cbxEnableIntersectionSnappingCheckBox->blockSignals( false );
}
5 changes: 5 additions & 0 deletions src/app/qgssnappingdialog.h
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ class QgsSnappingDialog: public QDialog, private Ui::QgsSnappingDialogBase


void on_cbxEnableTopologicalEditingCheckBox_stateChanged( int ); void on_cbxEnableTopologicalEditingCheckBox_stateChanged( int );


void on_cbxEnableIntersectionSnappingCheckBox_stateChanged( int );

protected: protected:
/**Constructor /**Constructor
@param canvas pointer to the map canvas (for detecting which vector layers are loaded @param canvas pointer to the map canvas (for detecting which vector layers are loaded
Expand Down Expand Up @@ -85,6 +87,9 @@ class QgsSnappingDialog: public QDialog, private Ui::QgsSnappingDialogBase


/**Set checkbox value based on project setting*/ /**Set checkbox value based on project setting*/
void setTopologicalEditingState(); void setTopologicalEditingState();

/**Set checkbox value based on project setting*/
void setIntersectionSnapppingState();
}; };


#endif #endif
88 changes: 84 additions & 4 deletions src/gui/qgsmapcanvassnapper.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@
#include "qgsvectorlayer.h" #include "qgsvectorlayer.h"
#include "qgstolerance.h" #include "qgstolerance.h"
#include <QSettings> #include <QSettings>

#include "qgslogger.h"
#include "qgsgeometry.h"


QgsMapCanvasSnapper::QgsMapCanvasSnapper( QgsMapCanvas* canvas ): mMapCanvas( canvas ), mSnapper( 0 ) QgsMapCanvasSnapper::QgsMapCanvasSnapper( QgsMapCanvas* canvas ): mMapCanvas( canvas ), mSnapper( 0 )
{ {
Expand Down Expand Up @@ -133,15 +134,34 @@ int QgsMapCanvasSnapper::snapToBackgroundLayers( const QPoint& p, QList<QgsSnapp
{ {
//topological editing on? //topological editing on?
int topologicalEditing = QgsProject::instance()->readNumEntry( "Digitizing", "/TopologicalEditing", 0 ); int topologicalEditing = QgsProject::instance()->readNumEntry( "Digitizing", "/TopologicalEditing", 0 );

//snapping on intersection on?
int intersectionSnapping = QgsProject::instance()->readNumEntry( "Digitizing", "/IntersectionSnapping", 0 );

if ( topologicalEditing == 0 ) if ( topologicalEditing == 0 )
{ {
mSnapper->setSnapMode( QgsSnapper::SnapWithOneResult ); if ( intersectionSnapping == 0 )
{
mSnapper->setSnapMode( QgsSnapper::SnapWithOneResult );
}
else
{
mSnapper->setSnapMode( QgsSnapper::SnapWithResultsWithinTolerances );
}
} }
else else
{ {
mSnapper->setSnapMode( QgsSnapper::SnapWithResultsForSamePosition ); if ( intersectionSnapping == 0 )
{
mSnapper->setSnapMode( QgsSnapper::SnapWithResultsForSamePosition );
}
else
{
mSnapper->setSnapMode( QgsSnapper::SnapWithResultsWithinTolerances );
}
} }



//read snapping settings from project //read snapping settings from project
bool ok; //todo: take the default snapping tolerance for all vector layers if snapping not defined in project bool ok; //todo: take the default snapping tolerance for all vector layers if snapping not defined in project
bool snappingDefinedInProject = true; bool snappingDefinedInProject = true;
Expand Down Expand Up @@ -252,13 +272,73 @@ int QgsMapCanvasSnapper::snapToBackgroundLayers( const QPoint& p, QList<QgsSnapp


snapLayers.append( snapLayer ); snapLayers.append( snapLayer );
} }

mSnapper->setSnapLayers( snapLayers ); mSnapper->setSnapLayers( snapLayers );


if ( mSnapper->snapPoint( p, results, excludePoints ) != 0 ) if ( mSnapper->snapPoint( p, results, excludePoints ) != 0 )
{ {
return 4; return 4;
} }

if( intersectionSnapping == 1 )
{
QList<QgsSnappingResult>::const_iterator it = results.constBegin();
QList<QgsSnappingResult> segments;
QList<QgsSnappingResult> points;
for ( ; it != results.constEnd(); ++it )
{
if(it->snappedVertexNr==-1)
{
QgsDebugMsg("segment");
segments.push_back(*it);
}
else
{
QgsDebugMsg("no segment");
points.push_back(*it);
}
}

if(segments.length() >=2 )
{

QgsGeometry* intersectionPoint;
QList<QgsSnappingResult> myResults;

QList<QgsSnappingResult>::const_iterator oSegIt = segments.constBegin();
QList<QgsSnappingResult>::iterator iSegIt;
for( ; oSegIt != segments.constEnd(); ++oSegIt)
{
QgsDebugMsg( QString::number(oSegIt->beforeVertexNr) );

QVector<QgsPoint> vertexPoints;
vertexPoints.append( oSegIt->beforeVertex );
vertexPoints.append( oSegIt->afterVertex );
QgsGeometry* lineA = QgsGeometry::fromPolyline( vertexPoints );

for( iSegIt = segments.begin(); iSegIt != segments.end(); ++iSegIt)
{
QVector<QgsPoint> vertexPoints;
vertexPoints.append( iSegIt->beforeVertex );
vertexPoints.append( iSegIt->afterVertex );
QgsGeometry* lineB = QgsGeometry::fromPolyline( vertexPoints );

intersectionPoint = lineA->intersection(lineB);
if( intersectionPoint->type() == QGis::Point)
{
iSegIt->snappedVertex = intersectionPoint->asPoint();
myResults.append(*iSegIt);
}
}

}

if( myResults.length() > 0 )
{
results.clear();
results = myResults;
}
}
}
return 0; return 0;
} }
else else
Expand Down
61 changes: 37 additions & 24 deletions src/ui/qgssnappingdialogbase.ui
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -14,30 +14,7 @@
<string>Snapping options</string> <string>Snapping options</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="1" column="0"> <item row="0" column="0" colspan="3">
<widget class="QCheckBox" name="cbxEnableTopologicalEditingCheckBox">
<property name="text">
<string>Enable topological editing</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
<property name="tristate">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QDialogButtonBox" name="mButtonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QTreeWidget" name="mLayerTreeWidget"> <widget class="QTreeWidget" name="mLayerTreeWidget">
<property name="selectionMode"> <property name="selectionMode">
<enum>QAbstractItemView::NoSelection</enum> <enum>QAbstractItemView::NoSelection</enum>
Expand Down Expand Up @@ -89,6 +66,42 @@
</column> </column>
</widget> </widget>
</item> </item>
<item row="1" column="0">
<widget class="QCheckBox" name="cbxEnableTopologicalEditingCheckBox">
<property name="text">
<string>Enable topological editing</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
<property name="tristate">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="cbxEnableIntersectionSnappingCheckBox">
<property name="text">
<string>Enable snapping on intersection</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
<property name="tristate">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QDialogButtonBox" name="mButtonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>
Expand Down

0 comments on commit e0d4784

Please sign in to comment.