Skip to content

Commit d69a7f2

Browse files
committed
Merge pull request #1533 from manisandro/multilabeling_datadefined
Fix multilabeling with datadefined value
2 parents 8d822c4 + f267791 commit d69a7f2

File tree

5 files changed

+53
-47
lines changed

5 files changed

+53
-47
lines changed

src/core/pal/feature.h

+4
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ namespace pal
9696
bool fixedPosition() const { return fixedPos; }
9797
//Set label rotation to fixed value
9898
void setFixedAngle( double a ) { fixedRotation = true; fixedAngle = a; }
99+
void setRepeatDistance( double dist ) { repeatDist = dist; }
100+
double repeatDistance() const { return repeatDist; }
99101
void setAlwaysShow( bool bl ) { alwaysShow = bl; }
100102

101103
protected:
@@ -120,9 +122,11 @@ namespace pal
120122
//Fixed (e.g. data defined) angle only makes sense together with fixed position
121123
bool fixedRotation;
122124
double fixedAngle; //fixed angle value (in rad)
125+
double repeatDist;
123126

124127
bool alwaysShow; //true is label is to always be shown (but causes overlapping)
125128

129+
126130
// array of parts - possibly not necessary
127131
//int nPart;
128132
//FeaturePart** parts;

src/core/pal/layer.cpp

+5-3
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ namespace pal
229229

230230
bool Layer::registerFeature( const char *geom_id, PalGeometry *userGeom, double label_x, double label_y, const char* labelText,
231231
double labelPosX, double labelPosY, bool fixedPos, double angle, bool fixedAngle,
232-
int xQuadOffset, int yQuadOffset, double xOffset, double yOffset, bool alwaysShow )
232+
int xQuadOffset, int yQuadOffset, double xOffset, double yOffset, bool alwaysShow, double repeatDistance )
233233
{
234234
if ( !geom_id || label_x < 0 || label_y < 0 )
235235
return false;
@@ -269,6 +269,7 @@ namespace pal
269269
{
270270
f->setFixedAngle( angle );
271271
}
272+
f->setRepeatDistance( repeatDistance );
272273

273274
f->setAlwaysShow( alwaysShow );
274275

@@ -490,13 +491,14 @@ namespace pal
490491
connectedTexts = NULL;
491492
}
492493

493-
void Layer::chopFeatures( double chopInterval )
494+
void Layer::chopFeaturesAtRepeatDistance( )
494495
{
495496
LinkedList<FeaturePart*> * newFeatureParts = new LinkedList<FeaturePart*>( ptrFeaturePartCompare );
496497
while ( FeaturePart* fpart = featureParts->pop_front() )
497498
{
498499
const GEOSGeometry* geom = fpart->getGeometry();
499-
if ( GEOSGeomTypeId( geom ) == GEOS_LINESTRING )
500+
double chopInterval = fpart->getFeature()->repeatDistance();
501+
if ( chopInterval != 0. && GEOSGeomTypeId( geom ) == GEOS_LINESTRING )
500502
{
501503

502504
double bmin[2], bmax[2];

src/core/pal/layer.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -326,15 +326,16 @@ namespace pal
326326
const char* labelText = NULL, double labelPosX = 0.0, double labelPosY = 0.0,
327327
bool fixedPos = false, double angle = 0.0, bool fixedAngle = false,
328328
int xQuadOffset = 0, int yQuadOffset = 0, double xOffset = 0.0, double yOffset = 0.0,
329-
bool alwaysShow = false );
329+
bool alwaysShow = false, double repeatDistance = 0 );
330330

331331
/** return pointer to feature or NULL if doesn't exist */
332332
Feature* getFeature( const char* geom_id );
333333

334334
/** join connected features with the same label text */
335335
void joinConnectedFeatures();
336336

337-
void chopFeatures( double chopInterval );
337+
/** chop layer features at the repeat distance **/
338+
void chopFeaturesAtRepeatDistance();
338339

339340
};
340341

src/core/pal/pal.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -429,8 +429,8 @@ namespace pal
429429
if ( layer->getMergeConnectedLines() )
430430
layer->joinConnectedFeatures();
431431

432-
if ( layer->getRepeatDistance() > 0 )
433-
layer->chopFeatures( layer->getRepeatDistance() );
432+
layer->chopFeaturesAtRepeatDistance();
433+
434434

435435
context->layer = layer;
436436
context->priority = layersFactor[i];

src/core/qgspallabeling.cpp

+39-40
Original file line numberDiff line numberDiff line change
@@ -2249,12 +2249,50 @@ void QgsPalLayerSettings::registerFeature( QgsFeature& f, const QgsRenderContext
22492249
#endif
22502250
lbl->setDefinedFont( labelFont );
22512251

2252+
// set repeat distance
2253+
// data defined repeat distance?
2254+
double repeatDist = repeatDistance;
2255+
if ( dataDefinedEvaluate( QgsPalLayerSettings::RepeatDistance, exprVal ) )
2256+
{
2257+
bool ok;
2258+
double distD = exprVal.toDouble( &ok );
2259+
if ( ok )
2260+
{
2261+
repeatDist = distD;
2262+
}
2263+
}
2264+
2265+
// data defined label-repeat distance units?
2266+
bool repeatdistinmapunit = repeatDistanceUnit == QgsPalLayerSettings::MapUnits;
2267+
if ( dataDefinedEvaluate( QgsPalLayerSettings::RepeatDistanceUnit, exprVal ) )
2268+
{
2269+
QString units = exprVal.toString().trimmed();
2270+
QgsDebugMsgLevel( QString( "exprVal RepeatDistanceUnits:%1" ).arg( units ), 4 );
2271+
if ( !units.isEmpty() )
2272+
{
2273+
repeatdistinmapunit = ( _decodeUnits( units ) == QgsPalLayerSettings::MapUnits );
2274+
}
2275+
}
2276+
2277+
if ( repeatDist != 0 )
2278+
{
2279+
if ( repeatdistinmapunit ) //convert distance from mm/map units to pixels
2280+
{
2281+
repeatDist /= repeatDistanceMapUnitScale.computeMapUnitsPerPixel( context ) * context.scaleFactor();
2282+
}
2283+
else //mm
2284+
{
2285+
repeatDist *= vectorScaleFactor;
2286+
}
2287+
repeatDist *= qAbs( ptOne.x() - ptZero.x() );
2288+
}
2289+
22522290
// feature to the layer
22532291
try
22542292
{
22552293
if ( !palLayer->registerFeature( lbl->strId(), lbl, labelX, labelY, labelText.toUtf8().constData(),
22562294
xPos, yPos, dataDefinedPosition, angle, dataDefinedRotation,
2257-
quadOffsetX, quadOffsetY, offsetX, offsetY, alwaysShow ) )
2295+
quadOffsetX, quadOffsetY, offsetX, offsetY, alwaysShow, repeatDist ) )
22582296
return;
22592297
}
22602298
catch ( std::exception &e )
@@ -3375,45 +3413,6 @@ int QgsPalLabeling::prepareLayer( QgsVectorLayer* layer, QStringList& attrNames,
33753413
// set whether location of centroid must be inside of polygons
33763414
l->setCentroidInside( lyr.centroidInside );
33773415

3378-
// set repeat distance
3379-
// data defined repeat distance?
3380-
QVariant exprVal;
3381-
double repeatDist = lyr.repeatDistance;
3382-
if ( lyr.dataDefinedEvaluate( QgsPalLayerSettings::RepeatDistance, exprVal ) )
3383-
{
3384-
bool ok;
3385-
double distD = exprVal.toDouble( &ok );
3386-
if ( ok )
3387-
{
3388-
repeatDist = distD;
3389-
}
3390-
}
3391-
3392-
// data defined label-repeat distance units?
3393-
bool repeatdistinmapunit = lyr.repeatDistanceUnit == QgsPalLayerSettings::MapUnits;
3394-
if ( lyr.dataDefinedEvaluate( QgsPalLayerSettings::RepeatDistanceUnit, exprVal ) )
3395-
{
3396-
QString units = exprVal.toString().trimmed();
3397-
QgsDebugMsgLevel( QString( "exprVal RepeatDistanceUnits:%1" ).arg( units ), 4 );
3398-
if ( !units.isEmpty() )
3399-
{
3400-
repeatdistinmapunit = ( _decodeUnits( units ) == QgsPalLayerSettings::MapUnits );
3401-
}
3402-
}
3403-
3404-
if ( repeatDist != 0 )
3405-
{
3406-
if ( !repeatdistinmapunit ) //convert distance from mm/map units to pixels
3407-
{
3408-
repeatDist *= lyr.repeatDistanceMapUnitScale.computeMapUnitsPerPixel( ctx ) * ctx.scaleFactor();
3409-
}
3410-
else //mm
3411-
{
3412-
repeatDist *= lyr.vectorScaleFactor;
3413-
}
3414-
}
3415-
l->setRepeatDistance( repeatDist );
3416-
34173416
// set how to show upside-down labels
34183417
Layer::UpsideDownLabels upsdnlabels;
34193418
switch ( lyr.upsidedownLabels )

0 commit comments

Comments
 (0)