Fix for #6315, and keeps centroid calc. for whole feature in adv labeling

This commit is contained in:
Larry Shaffer 2012-09-07 20:03:38 -06:00
parent 595d2a5f70
commit f143507840
4 changed files with 522 additions and 344 deletions

View File

@ -99,6 +99,8 @@ QgsLabelingGui::QgsLabelingGui( QgsPalLabeling* lbl, QgsVectorLayer* layer, QgsM
int distUnitIndex = lyr.distInMapUnits ? 1 : 0;
mXQuadOffset = lyr.xQuadOffset;
mYQuadOffset = lyr.yQuadOffset;
mCentroidRadioWhole->setChecked( lyr.centroidWhole );
mCentroidFrame->setVisible( false );
switch ( lyr.placement )
{
case QgsPalLayerSettings::AroundPoint:
@ -106,6 +108,8 @@ QgsLabelingGui::QgsLabelingGui( QgsPalLabeling* lbl, QgsVectorLayer* layer, QgsM
radAroundCentroid->setChecked( true );
spinDistPoint->setValue( lyr.dist );
mPointDistanceUnitComboBox->setCurrentIndex( distUnitIndex );
mCentroidFrame->setVisible( layer->geometryType() == QGis::Polygon );
//spinAngle->setValue( lyr.angle );
break;
case QgsPalLayerSettings::OverPoint:
@ -126,6 +130,7 @@ QgsLabelingGui::QgsLabelingGui( QgsPalLabeling* lbl, QgsVectorLayer* layer, QgsM
mPointOffsetYOffsetSpinBox->setValue( lyr.yOffset );
mPointOffsetUnitsComboBox->setCurrentIndex( lyr.labelOffsetInMapUnits ? 1 : 0 );
mPointOffsetAngleSpinBox->setValue( lyr.angleOffset );
mCentroidFrame->setVisible( layer->geometryType() == QGis::Polygon );
break;
case QgsPalLayerSettings::Line:
@ -290,6 +295,7 @@ QgsPalLayerSettings QgsLabelingGui::layerSettings()
lyr.dist = 0;
lyr.placementFlags = 0;
lyr.centroidWhole = mCentroidRadioWhole->isChecked();
if (( stackedPlacement->currentWidget() == pagePoint && radAroundPoint->isChecked() )
|| ( stackedPlacement->currentWidget() == pagePolygon && radAroundCentroid->isChecked() ) )
{
@ -820,15 +826,20 @@ void QgsLabelingGui::changeBufferColor()
void QgsLabelingGui::updateOptions()
{
mCentroidFrame->setVisible( false );
if (( stackedPlacement->currentWidget() == pagePoint && radAroundPoint->isChecked() )
|| ( stackedPlacement->currentWidget() == pagePolygon && radAroundCentroid->isChecked() ) )
{
stackedOptions->setCurrentWidget( pageOptionsPoint );
mCentroidFrame->setVisible( stackedPlacement->currentWidget() == pagePolygon
&& radAroundCentroid->isChecked() );
}
else if (( stackedPlacement->currentWidget() == pagePoint && radOverPoint->isChecked() )
|| ( stackedPlacement->currentWidget() == pagePolygon && radOverCentroid->isChecked() ) )
{
stackedOptions->setCurrentWidget( pageOptionsPointOffset );
mCentroidFrame->setVisible( stackedPlacement->currentWidget() == pagePolygon
&& radOverCentroid->isChecked() );
}
else if (( stackedPlacement->currentWidget() == pageLine && radLineParallel->isChecked() )
|| ( stackedPlacement->currentWidget() == pagePolygon && radPolygonPerimeter->isChecked() )

View File

@ -147,6 +147,7 @@ QgsPalLayerSettings::QgsPalLayerSettings()
xOffset = 0;
yOffset = 0;
angleOffset = 0;
centroidWhole = false;
//textFont = QFont();
textNamedStyle = QString( "" );
textColor = Qt::black;
@ -193,6 +194,7 @@ QgsPalLayerSettings::QgsPalLayerSettings( const QgsPalLayerSettings& s )
xOffset = s.xOffset;
yOffset = s.yOffset;
angleOffset = s.angleOffset;
centroidWhole = s.centroidWhole;
textFont = s.textFont;
textNamedStyle = s.textNamedStyle;
textColor = s.textColor;
@ -363,6 +365,7 @@ void QgsPalLayerSettings::readFromLayer( QgsVectorLayer* layer )
xOffset = layer->customProperty( "labeling/xOffset", QVariant( 0.0 ) ).toDouble();
yOffset = layer->customProperty( "labeling/yOffset", QVariant( 0.0 ) ).toDouble();
angleOffset = layer->customProperty( "labeling/angleOffset", QVariant( 0.0 ) ).toDouble();
centroidWhole = layer->customProperty( "labeling/centroidWhole", QVariant( false ) ).toBool();
QString fontFamily = layer->customProperty( "labeling/fontFamily" ).toString();
double fontSize = layer->customProperty( "labeling/fontSize" ).toDouble();
int fontWeight = layer->customProperty( "labeling/fontWeight" ).toInt();
@ -421,6 +424,7 @@ void QgsPalLayerSettings::writeToLayer( QgsVectorLayer* layer )
layer->setCustomProperty( "labeling/xOffset", xOffset );
layer->setCustomProperty( "labeling/yOffset", yOffset );
layer->setCustomProperty( "labeling/angleOffset", angleOffset );
layer->setCustomProperty( "labeling/centroidWhole", centroidWhole );
layer->setCustomProperty( "labeling/fontFamily", textFont.family() );
layer->setCustomProperty( "labeling/namedStyle", textNamedStyle );
@ -676,10 +680,29 @@ void QgsPalLayerSettings::registerFeature( QgsVectorLayer* layer, QgsFeature& f
return;
}
// convert centroids to points before processing to use GEOS instead of PAL calculation
if (( placement == QgsPalLayerSettings::AroundPoint
// whether we're going to create a centroid for polygon
bool centroidPoly = (( placement == QgsPalLayerSettings::AroundPoint
|| placement == QgsPalLayerSettings::OverPoint )
&& geom->type() == QGis::Polygon )
&& geom->type() == QGis::Polygon );
// CLIP the geometry if it is bigger than the extent
// don't clip if centroid is requested for whole feature
bool do_clip = false;
if ( !centroidPoly || ( centroidPoly && !centroidWhole ) )
{
do_clip = !extentGeom->contains( geom );
if ( do_clip )
{
geom = geom->intersection( extentGeom ); // creates new geometry
if ( !geom )
{
return;
}
}
}
// convert centroids to points before processing to use GEOS instead of PAL calculation
if ( centroidPoly )
{
QgsGeometry* centroidpt = geom->centroid();
if ( centroidpt->isGeosValid() && extentGeom->contains( centroidpt ) )
@ -692,34 +715,17 @@ void QgsPalLayerSettings::registerFeature( QgsVectorLayer* layer, QgsFeature& f
}
else
{
// invalid geom type, skip registering feature with PAL
// invalid geom type or outside extents
return;
}
}
// CLIP the geometry if it is bigger than the extent
QgsGeometry* geomClipped = NULL;
GEOSGeometry* geos_geom;
bool do_clip = !extentGeom->contains( geom );
if ( do_clip )
{
geomClipped = geom->intersection( extentGeom ); // creates new geometry
if ( !geomClipped )
{
return;
}
geos_geom = geomClipped->asGeos();
}
else
{
geos_geom = geom->asGeos();
}
GEOSGeometry* geos_geom = geom->asGeos();
if ( geos_geom == NULL )
return; // invalid geometry
GEOSGeometry* geos_geom_clone = GEOSGeom_clone( geos_geom );
if ( do_clip )
delete geomClipped;
//data defined position / alignment / rotation?
bool dataDefinedPosition = false;
@ -921,12 +927,11 @@ void QgsPalLayerSettings::registerFeature( QgsVectorLayer* layer, QgsFeature& f
pal::LabelPosition* lp = new LabelPosition( 1, xPos, yPos, labelX, labelY,
( angleOffset * M_PI / 180 ), 0.0, fpart );
// lp->getWidth or lp->getHeight doesn't account for rotation, get bbox instead
double amin[2], amax[2];
lp->getBoundingBox( amin, amax );
QgsRectangle lblrect = QgsRectangle( amin[0], amin[1], amax[0], amax[1] );
// labelW = lp->getWidth();
// labelH = lp->getHeight();
labelW = lblrect.width();
labelH = lblrect.height();
delete fpart;

View File

@ -123,6 +123,7 @@ class CORE_EXPORT QgsPalLayerSettings
int xQuadOffset, yQuadOffset;
double xOffset, yOffset; // offset from point in mm or map units
double angleOffset; // rotation applied to offset labels
bool centroidWhole; // whether centroid calculated from whole or visible polygon
QFont textFont;
QString textNamedStyle;
QColor textColor;

View File

@ -1470,7 +1470,7 @@
<x>0</x>
<y>0</y>
<width>686</width>
<height>485</height>
<height>521</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_13">
@ -1659,7 +1659,7 @@
<item>
<widget class="QStackedWidget" name="stackedPlacement">
<property name="currentIndex">
<number>2</number>
<number>1</number>
</property>
<widget class="QWidget" name="pagePoint">
<layout class="QVBoxLayout" name="verticalLayout_6">
@ -1761,57 +1761,87 @@
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_11">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QFrame" name="mCentroidFrame">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>12</number>
</property>
<property name="topMargin">
<number>12</number>
</property>
<property name="rightMargin">
<number>12</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="mCentroidLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Centroid of</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="mCentroidRadioVisible">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>visible polygon</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="mCentroidRadioWhole">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>whole polygon</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QStackedWidget" name="stackedOptions">
<property name="currentIndex">
<number>0</number>
<number>1</number>
</property>
<widget class="QWidget" name="pageOptionsPoint">
<layout class="QGridLayout" name="gridLayout_7">
<item row="0" column="0">
<widget class="QLabel" name="label_21">
<property name="text">
<string>Label distance</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QDoubleSpinBox" name="spinDistPoint">
<property name="decimals">
<number>4</number>
</property>
<property name="maximum">
<double>999999999.000000000000000</double>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_23">
<property name="text">
<string>Rotation</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="spinAngle">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_24">
<property name="text">
<string>degrees</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QComboBox" name="mPointDistanceUnitComboBox">
<item>
@ -1826,6 +1856,75 @@
</item>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_24">
<property name="text">
<string>degrees</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="spinAngle">
<property name="enabled">
<bool>false</bool>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_23">
<property name="text">
<string>Rotation</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QDoubleSpinBox" name="spinDistPoint">
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="decimals">
<number>4</number>
</property>
<property name="maximum">
<double>999999999.000000000000000</double>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_21">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Label distance</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="1">
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="pageOptionsLine">
@ -1864,16 +1963,25 @@
<layout class="QHBoxLayout" name="horizontalLayout_14">
<item>
<widget class="QLabel" name="label_26">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Label distance</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="spinDistLine">
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="decimals">
<number>4</number>
</property>
@ -1941,13 +2049,6 @@
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="label_27">
<property name="text">
<string>degrees</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QComboBox" name="mPointOffsetUnitsComboBox">
<property name="sizePolicy">
@ -1956,6 +2057,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="currentIndex">
<number>1</number>
</property>
<item>
<property name="text">
<string>mm</string>
@ -1996,16 +2100,6 @@
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_25">
<property name="text">
<string>Rotation</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="0" colspan="3">
<layout class="QGridLayout" name="gridLayout_19">
<property name="verticalSpacing">
@ -2079,7 +2173,25 @@
</item>
</layout>
</item>
<item row="2" column="1">
<item row="2" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_13">
<item>
<widget class="QLabel" name="label_25">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Rotation</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="mPointOffsetAngleSpinBox">
<property name="enabled">
<bool>true</bool>
@ -2095,11 +2207,28 @@
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_27">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>degrees</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item row="3" column="0">
@ -2653,12 +2782,12 @@
<slot>setValue(int)</slot>
<hints>
<hint type="sourcelabel">
<x>341</x>
<y>286</y>
<x>319</x>
<y>408</y>
</hint>
<hint type="destinationlabel">
<x>415</x>
<y>288</y>
<x>393</x>
<y>410</y>
</hint>
</hints>
</connection>
@ -2669,12 +2798,12 @@
<slot>setValue(int)</slot>
<hints>
<hint type="sourcelabel">
<x>325</x>
<y>499</y>
<x>319</x>
<y>547</y>
</hint>
<hint type="destinationlabel">
<x>397</x>
<y>500</y>
<x>391</x>
<y>549</y>
</hint>
</hints>
</connection>
@ -2685,12 +2814,12 @@
<slot>setValue(int)</slot>
<hints>
<hint type="sourcelabel">
<x>397</x>
<y>500</y>
<x>391</x>
<y>549</y>
</hint>
<hint type="destinationlabel">
<x>325</x>
<y>499</y>
<x>319</x>
<y>547</y>
</hint>
</hints>
</connection>
@ -2701,12 +2830,44 @@
<slot>setValue(int)</slot>
<hints>
<hint type="sourcelabel">
<x>415</x>
<y>288</y>
<x>393</x>
<y>410</y>
</hint>
<hint type="destinationlabel">
<x>341</x>
<y>286</y>
<x>319</x>
<y>408</y>
</hint>
</hints>
</connection>
<connection>
<sender>radOverCentroid</sender>
<signal>toggled(bool)</signal>
<receiver>mCentroidFrame</receiver>
<slot>setVisible(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>105</x>
<y>154</y>
</hint>
<hint type="destinationlabel">
<x>362</x>
<y>131</y>
</hint>
</hints>
</connection>
<connection>
<sender>radAroundCentroid</sender>
<signal>toggled(bool)</signal>
<receiver>mCentroidFrame</receiver>
<slot>setVisible(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>141</x>
<y>187</y>
</hint>
<hint type="destinationlabel">
<x>404</x>
<y>128</y>
</hint>
</hints>
</connection>