bug297fix.diff
| src/app/qgsoptions.cpp (Arbeitskopie) | ||
|---|---|---|
| 142 | 142 | |
| 143 | 143 |
cbxSplitterRedraw->setChecked(settings.value("/qgis/splitterRedraw", QVariant(true)).toBool());
|
| 144 | 144 | |
| 145 |
cbxInteriorLabels->setChecked(settings.value("/qgis/interiorLabels", QVariant(false)).toBool());
|
|
| 146 | ||
| 145 | 147 |
// |
| 146 | 148 |
// Locale settings |
| 147 | 149 |
// |
| ... | ... | |
| 262 | 264 |
settings.writeEntry("/qgis/zoom_factor", spinZoomFactor->value());
|
| 263 | 265 | |
| 264 | 266 |
settings.setValue("/qgis/splitterRedraw", cbxSplitterRedraw->isChecked());
|
| 267 |
settings.setValue("/qgis/interiorLabels", cbxInteriorLabels->isChecked());
|
|
| 268 | ||
| 265 | 269 |
// |
| 266 | 270 |
// Locale settings |
| 267 | 271 |
// |
| src/core/qgsgeometry.cpp (Arbeitskopie) | ||
|---|---|---|
| 2276 | 2276 |
return sqrDist; |
| 2277 | 2277 |
} |
| 2278 | 2278 | |
| 2279 |
void QgsGeometry::interiorPoints(std::vector<QgsPoint> &points) |
|
| 2280 |
{
|
|
| 2281 |
exportWkbToGeos(); |
|
| 2282 | ||
| 2283 |
points.clear(); |
|
| 2284 | ||
| 2285 |
for(size_t i=0; i<mGeos->getNumGeometries(); i++) {
|
|
| 2286 |
GEOS_GEOM::Point *p = mGeos->getGeometryN(i)->getInteriorPoint(); |
|
| 2287 |
points.push_back( QgsPoint( p->getX(), p->getY() ) ); |
|
| 2288 |
} |
|
| 2289 |
} |
|
| 2290 | ||
| 2279 | 2291 |
int QgsGeometry::addRing(const QList<QgsPoint>& ring) |
| 2280 | 2292 |
{
|
| 2281 | 2293 |
//bail out if this geometry is not polygon/multipolygon |
| ... | ... | |
| 3159 | 3171 | |
| 3160 | 3172 |
bool QgsGeometry::exportWkbToGeos() |
| 3161 | 3173 |
{
|
| 3162 |
QgsDebugMsg("QgsGeometry::exportWkbToGeos: entered.");
|
|
| 3174 |
// QgsDebugMsg("QgsGeometry::exportWkbToGeos: entered.");
|
|
| 3163 | 3175 | |
| 3164 | 3176 |
if (!mDirtyGeos) |
| 3165 | 3177 |
{
|
| ... | ... | |
| 3238 | 3250 |
hasZValue = true; |
| 3239 | 3251 |
case QGis::WKBLineString: |
| 3240 | 3252 |
{
|
| 3241 |
QgsDebugMsg("QgsGeometry::geosGeometry: Linestring found");
|
|
| 3253 |
// QgsDebugMsg("QgsGeometry::geosGeometry: Linestring found");
|
|
| 3242 | 3254 | |
| 3243 | 3255 |
GEOS_GEOM::DefaultCoordinateSequence* sequence=new GEOS_GEOM::DefaultCoordinateSequence(); |
| 3244 | 3256 |
ptr = mGeometry + 5; |
| ... | ... | |
| 3299 | 3311 |
hasZValue = true; |
| 3300 | 3312 |
case QGis::WKBPolygon: |
| 3301 | 3313 |
{
|
| 3302 |
QgsDebugMsg("Polygon found");
|
|
| 3314 |
// QgsDebugMsg("Polygon found");
|
|
| 3303 | 3315 | |
| 3304 | 3316 |
// get number of rings in the polygon |
| 3305 | 3317 |
numRings = (int *) (mGeometry + 1 + sizeof(int)); |
| ... | ... | |
| 3349 | 3361 |
hasZValue = true; |
| 3350 | 3362 |
case QGis::WKBMultiPolygon: |
| 3351 | 3363 |
{
|
| 3352 |
QgsDebugMsg("Multipolygon found");
|
|
| 3364 |
//QgsDebugMsg("Multipolygon found");
|
|
| 3353 | 3365 | |
| 3354 | 3366 |
std::vector<GEOS_GEOM::Geometry *> *polygons=new std::vector<GEOS_GEOM::Geometry *>; |
| 3355 | 3367 |
// get the number of polygons |
| src/core/qgslabel.cpp (Arbeitskopie) | ||
|---|---|---|
| 19 | 19 |
#include <QString> |
| 20 | 20 |
#include <QFont> |
| 21 | 21 |
#include <QFontMetrics> |
| 22 |
#include <QSettings> |
|
| 22 | 23 | |
| 23 | 24 |
#include <QPainter> |
| 24 | 25 |
#include <QDomNode> |
| ... | ... | |
| 457 | 458 | |
| 458 | 459 |
void QgsLabel::labelPoint ( std::vector<QgsPoint>& points, QgsFeature & feature ) |
| 459 | 460 |
{
|
| 460 |
QgsGeometry* geometry = feature.geometry(); |
|
| 461 |
unsigned char *geom = geometry->wkbBuffer(); |
|
| 462 |
QGis::WKBTYPE wkbType = geometry->wkbType(); |
|
| 461 |
QSettings settings; |
|
| 462 |
if( settings.value("/qgis/interiorLabels").toBool() )
|
|
| 463 |
{
|
|
| 464 |
feature.geometry()->interiorPoints(points); |
|
| 465 |
} |
|
| 466 |
else |
|
| 467 |
{
|
|
| 468 |
QgsGeometry* geometry = feature.geometry(); |
|
| 469 |
unsigned char *geom = geometry->wkbBuffer(); |
|
| 470 |
QGis::WKBTYPE wkbType = geometry->wkbType(); |
|
| 463 | 471 |
|
| 464 |
QgsPoint point; |
|
| 472 |
QgsPoint point;
|
|
| 465 | 473 | |
| 466 |
switch (wkbType) |
|
| 467 |
{
|
|
| 468 |
case QGis::WKBPoint25D: |
|
| 469 |
case QGis::WKBPoint: |
|
| 470 |
case QGis::WKBLineString25D: |
|
| 471 |
case QGis::WKBLineString: |
|
| 472 |
case QGis::WKBPolygon25D: |
|
| 473 |
case QGis::WKBPolygon: |
|
| 474 |
switch (wkbType) |
|
| 474 | 475 |
{
|
| 475 |
labelPoint(point, geom); |
|
| 476 |
points.push_back(point); |
|
| 477 |
} |
|
| 478 |
break; |
|
| 479 |
case QGis::WKBMultiPoint25D: |
|
| 480 |
case QGis::WKBMultiPoint: |
|
| 481 |
case QGis::WKBMultiLineString25D: |
|
| 482 |
case QGis::WKBMultiLineString: |
|
| 483 |
case QGis::WKBMultiPolygon25D: |
|
| 484 |
case QGis::WKBMultiPolygon: |
|
| 485 |
// Return a position for each individual in the multi-feature |
|
| 486 |
{
|
|
| 487 |
int numFeatures = (int)(*(geom + 5)); |
|
| 488 |
geom += 9; // now points to start of array of WKB's |
|
| 489 |
for (int i = 0; i < numFeatures; ++i) |
|
| 476 |
case QGis::WKBPoint25D: |
|
| 477 |
case QGis::WKBPoint: |
|
| 478 |
case QGis::WKBLineString25D: |
|
| 479 |
case QGis::WKBLineString: |
|
| 480 |
case QGis::WKBPolygon25D: |
|
| 481 |
case QGis::WKBPolygon: |
|
| 490 | 482 |
{
|
| 491 |
geom = labelPoint(point, geom);
|
|
| 483 |
labelPoint(point, geom); |
|
| 492 | 484 |
points.push_back(point); |
| 493 | 485 |
} |
| 486 |
break; |
|
| 487 |
case QGis::WKBMultiPoint25D: |
|
| 488 |
case QGis::WKBMultiPoint: |
|
| 489 |
case QGis::WKBMultiLineString25D: |
|
| 490 |
case QGis::WKBMultiLineString: |
|
| 491 |
case QGis::WKBMultiPolygon25D: |
|
| 492 |
case QGis::WKBMultiPolygon: |
|
| 493 |
// Return a position for each individual in the multi-feature |
|
| 494 |
{
|
|
| 495 |
int numFeatures = (int)(*(geom + 5)); |
|
| 496 |
geom += 9; // now points to start of array of WKB's |
|
| 497 |
for (int i = 0; i < numFeatures; ++i) |
|
| 498 |
{
|
|
| 499 |
geom = labelPoint(point, geom); |
|
| 500 |
points.push_back(point); |
|
| 501 |
} |
|
| 502 |
} |
|
| 503 |
break; |
|
| 504 |
default: |
|
| 505 |
QgsDebugMsg("Unknown geometry type of " + QString::number(wkbType));
|
|
| 494 | 506 |
} |
| 495 |
break; |
|
| 496 |
default: |
|
| 497 |
QgsDebugMsg("Unknown geometry type of " + QString::number(wkbType));
|
|
| 498 | 507 |
} |
| 499 | 508 |
} |
| 500 | 509 | |
| src/core/qgsgeometry.h (Arbeitskopie) | ||
|---|---|---|
| 236 | 236 |
QgsPoint& minDistPoint, |
| 237 | 237 |
QgsGeometryVertexIndex& beforeVertex); |
| 238 | 238 | |
| 239 |
/** |
|
| 240 |
* Get interior points (e.g. for labels) |
|
| 241 |
*/ |
|
| 242 |
void interiorPoints(std::vector<QgsPoint>& points); |
|
| 243 | ||
| 239 | 244 |
/**Adds a new ring to this geometry. This makes only sense for polygon and multipolygons. |
| 240 | 245 |
@return 0 in case of success (ring added), 1 problem with geometry type, 2 ring not closed, \ |
| 241 | 246 |
3 ring is not valid geometry, 4 ring not disjoint with existing rings, 5 no polygon found which contained the ring*/ |
| src/ui/qgsoptionsbase.ui (Arbeitskopie) | ||
|---|---|---|
| 427 | 427 |
</property> |
| 428 | 428 |
</widget> |
| 429 | 429 |
</item> |
| 430 |
<item> |
|
| 431 |
<widget class="QCheckBox" name="cbxInteriorLabels" > |
|
| 432 |
<property name="text" > |
|
| 433 |
<string>Render labels inside areas (slower)</string> |
|
| 434 |
</property> |
|
| 435 |
</widget> |
|
| 436 |
</item> |
|
| 430 | 437 |
</layout> |
| 431 | 438 |
</widget> |
| 432 | 439 |
</item> |