@@ -236,6 +236,9 @@ QString QgsVectorLayer::providerType() const
236
236
*/
237
237
void QgsVectorLayer::setDisplayField ( QString fldName )
238
238
{
239
+ if ( geometryType () == QGis::NoGeometry )
240
+ return ;
241
+
239
242
// If fldName is provided, use it as the display field, otherwise
240
243
// determine the field index for the feature column of the identify
241
244
// dialog. We look for fields containing "name" first and second for
@@ -313,12 +316,15 @@ void QgsVectorLayer::setDisplayField( QString fldName )
313
316
// This method will probably be removed again in the near future!
314
317
void QgsVectorLayer::drawLabels ( QgsRenderContext& rendererContext )
315
318
{
319
+ if ( geometryType () == QGis::NoGeometry )
320
+ return ;
321
+
316
322
QgsDebugMsg ( " Starting draw of labels" );
317
323
318
324
if (( mRenderer || mRendererV2 ) && mLabelOn &&
319
- ( !label () ->scaleBasedVisibility () ||
320
- ( label () ->minScale () <= rendererContext.rendererScale () &&
321
- rendererContext.rendererScale () <= label () ->maxScale () ) ) )
325
+ ( !mLabel ->scaleBasedVisibility () ||
326
+ ( mLabel ->minScale () <= rendererContext.rendererScale () &&
327
+ rendererContext.rendererScale () <= mLabel ->maxScale () ) ) )
322
328
{
323
329
QgsAttributeList attributes;
324
330
if ( mRenderer )
@@ -701,6 +707,9 @@ unsigned char *QgsVectorLayer::drawPolygon( unsigned char *feature, QgsRenderCon
701
707
702
708
void QgsVectorLayer::drawRendererV2 ( QgsRenderContext& rendererContext, bool labeling )
703
709
{
710
+ if ( geometryType () == QGis::NoGeometry )
711
+ return ;
712
+
704
713
QSettings settings;
705
714
bool vertexMarkerOnlyForSelection = settings.value ( " /qgis/digitizing/marker_only_for_selected" , false ).toBool ();
706
715
@@ -763,6 +772,9 @@ void QgsVectorLayer::drawRendererV2( QgsRenderContext& rendererContext, bool lab
763
772
764
773
void QgsVectorLayer::drawRendererV2Levels ( QgsRenderContext& rendererContext, bool labeling )
765
774
{
775
+ if ( geometryType () == QGis::NoGeometry )
776
+ return ;
777
+
766
778
QHash< QgsSymbolV2*, QList<QgsFeature> > features; // key = symbol, value = array of features
767
779
768
780
QSettings settings;
@@ -898,6 +910,9 @@ void QgsVectorLayer::reload()
898
910
899
911
bool QgsVectorLayer::draw ( QgsRenderContext& rendererContext )
900
912
{
913
+ if ( geometryType () == QGis::NoGeometry )
914
+ return true ;
915
+
901
916
// set update threshold before each draw to make sure the current setting is picked up
902
917
QSettings settings;
903
918
mUpdateThreshold = settings.value ( " Map/updateThreshold" , 0 ).toInt ();
@@ -1272,6 +1287,9 @@ const QgsRenderer* QgsVectorLayer::renderer() const
1272
1287
1273
1288
void QgsVectorLayer::setRenderer ( QgsRenderer * r )
1274
1289
{
1290
+ if ( geometryType () == QGis::NoGeometry )
1291
+ return ;
1292
+
1275
1293
if ( r != mRenderer )
1276
1294
{
1277
1295
delete mRenderer ;
@@ -1398,6 +1416,9 @@ long QgsVectorLayer::updateFeatureCount() const
1398
1416
1399
1417
void QgsVectorLayer::updateExtents ()
1400
1418
{
1419
+ if ( geometryType () == QGis::NoGeometry )
1420
+ return ;
1421
+
1401
1422
mLayerExtent .setMinimal ();
1402
1423
1403
1424
if ( !mDataProvider )
@@ -1778,7 +1799,9 @@ bool QgsVectorLayer::addFeature( QgsFeature& f, bool alsoUpdateExtent )
1778
1799
// and add to the known added features.
1779
1800
f.setFeatureId ( addedIdLowWaterMark );
1780
1801
editFeatureAdd ( f );
1781
- mCachedGeometries [f.id ()] = *f.geometry ();
1802
+
1803
+ if ( f.geometry () )
1804
+ mCachedGeometries [f.id ()] = *f.geometry ();
1782
1805
1783
1806
setModified ( true );
1784
1807
@@ -1793,6 +1816,9 @@ bool QgsVectorLayer::addFeature( QgsFeature& f, bool alsoUpdateExtent )
1793
1816
1794
1817
bool QgsVectorLayer::insertVertex ( double x, double y, int atFeatureId, int beforeVertex )
1795
1818
{
1819
+ if ( geometryType () == QGis::NoGeometry )
1820
+ return false ;
1821
+
1796
1822
if ( !mEditable )
1797
1823
{
1798
1824
return false ;
@@ -1829,6 +1855,9 @@ bool QgsVectorLayer::insertVertex( double x, double y, int atFeatureId, int befo
1829
1855
1830
1856
bool QgsVectorLayer::moveVertex ( double x, double y, int atFeatureId, int atVertex )
1831
1857
{
1858
+ if ( geometryType () == QGis::NoGeometry )
1859
+ return false ;
1860
+
1832
1861
if ( !mEditable )
1833
1862
{
1834
1863
return false ;
@@ -1866,6 +1895,9 @@ bool QgsVectorLayer::moveVertex( double x, double y, int atFeatureId, int atVert
1866
1895
1867
1896
bool QgsVectorLayer::deleteVertex ( int atFeatureId, int atVertex )
1868
1897
{
1898
+ if ( geometryType () == QGis::NoGeometry )
1899
+ return false ;
1900
+
1869
1901
if ( !mEditable )
1870
1902
{
1871
1903
return false ;
@@ -1937,6 +1969,9 @@ bool QgsVectorLayer::deleteSelectedFeatures()
1937
1969
1938
1970
int QgsVectorLayer::addRing ( const QList<QgsPoint>& ring )
1939
1971
{
1972
+ if ( geometryType () == QGis::NoGeometry )
1973
+ return 5 ;
1974
+
1940
1975
int addRingReturnCode = 5 ; // default: return code for 'ring not inserted'
1941
1976
double xMin, yMin, xMax, yMax;
1942
1977
QgsRectangle bBox;
@@ -1971,6 +2006,9 @@ int QgsVectorLayer::addRing( const QList<QgsPoint>& ring )
1971
2006
1972
2007
int QgsVectorLayer::addIsland ( const QList<QgsPoint>& ring )
1973
2008
{
2009
+ if ( geometryType () == QGis::NoGeometry )
2010
+ return 6 ;
2011
+
1974
2012
// number of selected features must be 1
1975
2013
1976
2014
if ( mSelectedFeatureIds .size () < 1 )
@@ -2045,6 +2083,9 @@ int QgsVectorLayer::addIsland( const QList<QgsPoint>& ring )
2045
2083
2046
2084
int QgsVectorLayer::translateFeature ( int featureId, double dx, double dy )
2047
2085
{
2086
+ if ( geometryType () == QGis::NoGeometry )
2087
+ return 1 ;
2088
+
2048
2089
// look if geometry of selected feature already contains geometry changes
2049
2090
QgsGeometryMap::iterator changedIt = mChangedGeometries .find ( featureId );
2050
2091
if ( changedIt != mChangedGeometries .end () )
@@ -2100,6 +2141,9 @@ int QgsVectorLayer::translateFeature( int featureId, double dx, double dy )
2100
2141
2101
2142
int QgsVectorLayer::splitFeatures ( const QList<QgsPoint>& splitLine, bool topologicalEditing )
2102
2143
{
2144
+ if ( geometryType () == QGis::NoGeometry )
2145
+ return 4 ;
2146
+
2103
2147
QgsFeatureList newFeatures; // store all the newly created features
2104
2148
double xMin, yMin, xMax, yMax;
2105
2149
QgsRectangle bBox; // bounding box of the split line
@@ -2209,6 +2253,9 @@ int QgsVectorLayer::splitFeatures( const QList<QgsPoint>& splitLine, bool topolo
2209
2253
2210
2254
int QgsVectorLayer::removePolygonIntersections ( QgsGeometry* geom )
2211
2255
{
2256
+ if ( geometryType () == QGis::NoGeometry )
2257
+ return 1 ;
2258
+
2212
2259
int returnValue = 0 ;
2213
2260
2214
2261
// first test if geom really has type polygon or multipolygon
@@ -2241,6 +2288,9 @@ int QgsVectorLayer::removePolygonIntersections( QgsGeometry* geom )
2241
2288
2242
2289
int QgsVectorLayer::addTopologicalPoints ( QgsGeometry* geom )
2243
2290
{
2291
+ if ( geometryType () == QGis::NoGeometry )
2292
+ return 1 ;
2293
+
2244
2294
if ( !geom )
2245
2295
{
2246
2296
return 1 ;
@@ -2345,6 +2395,9 @@ int QgsVectorLayer::addTopologicalPoints( QgsGeometry* geom )
2345
2395
2346
2396
int QgsVectorLayer::addTopologicalPoints ( const QgsPoint& p )
2347
2397
{
2398
+ if ( geometryType () == QGis::NoGeometry )
2399
+ return 1 ;
2400
+
2348
2401
QMultiMap<double , QgsSnappingResult> snapResults; // results from the snapper object
2349
2402
// we also need to snap to vertex to make sure the vertex does not already exist in this geometry
2350
2403
QMultiMap<double , QgsSnappingResult> vertexSnapResults;
@@ -2397,7 +2450,7 @@ int QgsVectorLayer::addTopologicalPoints( const QgsPoint& p )
2397
2450
return 0 ;
2398
2451
}
2399
2452
2400
- QgsLabel * QgsVectorLayer::label ()
2453
+ QgsLabel *QgsVectorLayer::label ()
2401
2454
{
2402
2455
return mLabel ;
2403
2456
}
@@ -2648,103 +2701,119 @@ bool QgsVectorLayer::writeXml( QDomNode & layer_node,
2648
2701
2649
2702
// renderer specific settings
2650
2703
QString errorMsg;
2651
- if ( geometryType () != QGis::NoGeometry )
2652
- {
2653
- if ( !writeSymbology ( layer_node, document, errorMsg ) )
2654
- {
2655
- return false ;
2656
- }
2657
- }
2658
- return true ;
2704
+ return writeSymbology ( layer_node, document, errorMsg );
2659
2705
} // bool QgsVectorLayer::writeXml
2660
2706
2661
2707
bool QgsVectorLayer::readSymbology ( const QDomNode& node, QString& errorMessage )
2662
2708
{
2663
- // try renderer v2 first
2664
- QDomElement rendererElement = node.firstChildElement ( RENDERER_TAG_NAME );
2665
- if ( !rendererElement.isNull () )
2709
+ if ( geometryType () != QGis::NoGeometry )
2666
2710
{
2667
- // using renderer v2
2668
- setUsingRendererV2 ( true );
2711
+ // try renderer v2 first
2712
+ QDomElement rendererElement = node.firstChildElement ( RENDERER_TAG_NAME );
2713
+ if ( !rendererElement.isNull () )
2714
+ {
2715
+ // using renderer v2
2716
+ setUsingRendererV2 ( true );
2669
2717
2670
- QgsFeatureRendererV2* r = QgsFeatureRendererV2::load ( rendererElement );
2671
- if ( r == NULL )
2672
- return false ;
2718
+ QgsFeatureRendererV2* r = QgsFeatureRendererV2::load ( rendererElement );
2719
+ if ( r == NULL )
2720
+ return false ;
2673
2721
2674
- setRendererV2 ( r );
2675
- }
2676
- else
2677
- {
2678
- // using renderer v1
2679
- setUsingRendererV2 ( false );
2722
+ setRendererV2 ( r );
2723
+ }
2724
+ else
2725
+ {
2726
+ // using renderer v1
2727
+ setUsingRendererV2 ( false );
2680
2728
2681
- // create and bind a renderer to this layer
2729
+ // create and bind a renderer to this layer
2682
2730
2683
- QDomNode singlenode = node.namedItem ( " singlesymbol" );
2684
- QDomNode graduatednode = node.namedItem ( " graduatedsymbol" );
2685
- QDomNode continuousnode = node.namedItem ( " continuoussymbol" );
2686
- QDomNode uniquevaluenode = node.namedItem ( " uniquevalue" );
2731
+ QDomNode singlenode = node.namedItem ( " singlesymbol" );
2732
+ QDomNode graduatednode = node.namedItem ( " graduatedsymbol" );
2733
+ QDomNode continuousnode = node.namedItem ( " continuoussymbol" );
2734
+ QDomNode uniquevaluenode = node.namedItem ( " uniquevalue" );
2687
2735
2688
- QgsRenderer * renderer = 0 ;
2689
- int returnCode = 1 ;
2736
+ QgsRenderer * renderer = 0 ;
2737
+ int returnCode = 1 ;
2690
2738
2691
- if ( !singlenode.isNull () )
2692
- {
2693
- renderer = new QgsSingleSymbolRenderer ( geometryType () );
2694
- returnCode = renderer->readXML ( singlenode, *this );
2695
- }
2696
- else if ( !graduatednode.isNull () )
2697
- {
2698
- renderer = new QgsGraduatedSymbolRenderer ( geometryType () );
2699
- returnCode = renderer->readXML ( graduatednode, *this );
2700
- }
2701
- else if ( !continuousnode.isNull () )
2702
- {
2703
- renderer = new QgsContinuousColorRenderer ( geometryType () );
2704
- returnCode = renderer->readXML ( continuousnode, *this );
2705
- }
2706
- else if ( !uniquevaluenode.isNull () )
2707
- {
2708
- renderer = new QgsUniqueValueRenderer ( geometryType () );
2709
- returnCode = renderer->readXML ( uniquevaluenode, *this );
2739
+ if ( !singlenode.isNull () )
2740
+ {
2741
+ renderer = new QgsSingleSymbolRenderer ( geometryType () );
2742
+ returnCode = renderer->readXML ( singlenode, *this );
2743
+ }
2744
+ else if ( !graduatednode.isNull () )
2745
+ {
2746
+ renderer = new QgsGraduatedSymbolRenderer ( geometryType () );
2747
+ returnCode = renderer->readXML ( graduatednode, *this );
2748
+ }
2749
+ else if ( !continuousnode.isNull () )
2750
+ {
2751
+ renderer = new QgsContinuousColorRenderer ( geometryType () );
2752
+ returnCode = renderer->readXML ( continuousnode, *this );
2753
+ }
2754
+ else if ( !uniquevaluenode.isNull () )
2755
+ {
2756
+ renderer = new QgsUniqueValueRenderer ( geometryType () );
2757
+ returnCode = renderer->readXML ( uniquevaluenode, *this );
2758
+ }
2759
+
2760
+ if ( !renderer )
2761
+ {
2762
+ errorMessage = tr ( " Unknown renderer" );
2763
+ return false ;
2764
+ }
2765
+
2766
+ if ( returnCode == 1 )
2767
+ {
2768
+ errorMessage = tr ( " No renderer object" ); delete renderer; return false ;
2769
+ }
2770
+ else if ( returnCode == 2 )
2771
+ {
2772
+ errorMessage = tr ( " Classification field not found" ); delete renderer; return false ;
2773
+ }
2774
+
2775
+ mRenderer = renderer;
2710
2776
}
2711
2777
2712
- if ( !renderer )
2778
+ // get and set the display field if it exists.
2779
+ QDomNode displayFieldNode = node.namedItem ( " displayfield" );
2780
+ if ( !displayFieldNode.isNull () )
2713
2781
{
2714
- errorMessage = tr ( " Unknown renderer " );
2715
- return false ;
2782
+ QDomElement e = displayFieldNode. toElement ( );
2783
+ setDisplayField ( e. text () ) ;
2716
2784
}
2717
2785
2718
- if ( returnCode == 1 )
2786
+ // use scale dependent visibility flag
2787
+ QDomElement e = node.toElement ();
2788
+ mLabel ->setScaleBasedVisibility ( e.attribute ( " scaleBasedLabelVisibilityFlag" , " 0" ) == " 1" );
2789
+ mLabel ->setMinScale ( e.attribute ( " minLabelScale" , " 1" ).toFloat () );
2790
+ mLabel ->setMaxScale ( e.attribute ( " maxLabelScale" , " 100000000" ).toFloat () );
2791
+
2792
+ // Test if labeling is on or off
2793
+ QDomNode labelnode = node.namedItem ( " label" );
2794
+ QDomElement element = labelnode.toElement ();
2795
+ int hasLabelsEnabled = element.text ().toInt ();
2796
+ if ( hasLabelsEnabled < 1 )
2719
2797
{
2720
- errorMessage = tr ( " No renderer object " ); delete renderer; return false ;
2798
+ enableLabels ( false ) ;
2721
2799
}
2722
- else if ( returnCode == 2 )
2800
+ else
2723
2801
{
2724
- errorMessage = tr ( " Classification field not found " ); delete renderer; return false ;
2802
+ enableLabels ( true ) ;
2725
2803
}
2726
2804
2727
- mRenderer = renderer ;
2805
+ QDomNode labelattributesnode = node. namedItem ( " labelattributes " ) ;
2728
2806
2807
+ if ( !labelattributesnode.isNull () )
2808
+ {
2809
+ QgsDebugMsg ( " calling readXML" );
2810
+ mLabel ->readXML ( labelattributesnode );
2811
+ }
2729
2812
}
2730
2813
2731
2814
// process the attribute actions
2732
2815
mActions ->readXML ( node );
2733
2816
2734
- // get and set the display field if it exists.
2735
- QDomNode displayFieldNode = node.namedItem ( " displayfield" );
2736
- if ( !displayFieldNode.isNull () )
2737
- {
2738
- QDomElement e = displayFieldNode.toElement ();
2739
- setDisplayField ( e.text () );
2740
- }
2741
-
2742
- // use scale dependent visibility flag
2743
- QDomElement e = node.toElement ();
2744
- label ()->setScaleBasedVisibility ( e.attribute ( " scaleBasedLabelVisibilityFlag" , " 0" ) == " 1" );
2745
- label ()->setMinScale ( e.attribute ( " minLabelScale" , " 1" ).toFloat () );
2746
- label ()->setMaxScale ( e.attribute ( " maxLabelScale" , " 100000000" ).toFloat () );
2747
-
2748
2817
mEditTypes .clear ();
2749
2818
QDomNode editTypesNode = node.namedItem ( " edittypes" );
2750
2819
if ( !editTypesNode.isNull () )
@@ -2825,73 +2894,91 @@ bool QgsVectorLayer::readSymbology( const QDomNode& node, QString& errorMessage
2825
2894
}
2826
2895
}
2827
2896
2828
- // Test if labeling is on or off
2829
- QDomNode labelnode = node.namedItem ( " label" );
2830
- QDomElement element = labelnode.toElement ();
2831
- int hasLabelsEnabled = element.text ().toInt ();
2832
- if ( hasLabelsEnabled < 1 )
2833
- {
2834
- enableLabels ( false );
2835
- }
2836
- else
2837
- {
2838
- enableLabels ( true );
2839
- }
2840
-
2841
- QDomNode labelattributesnode = node.namedItem ( " labelattributes" );
2842
-
2843
- if ( !labelattributesnode.isNull () )
2844
- {
2845
- QgsDebugMsg ( " qgsvectorlayer calling label readXML routine" );
2846
- mLabel ->readXML ( labelattributesnode );
2847
- }
2848
-
2849
2897
return true ;
2850
2898
}
2851
2899
2852
2900
bool QgsVectorLayer::writeSymbology ( QDomNode& node, QDomDocument& doc, QString& errorMessage ) const
2853
2901
{
2854
- if ( mUsingRendererV2 )
2855
- {
2856
- QDomElement rendererElement = mRendererV2 ->save ( doc );
2857
- node.appendChild ( rendererElement );
2858
- }
2859
- else
2902
+ QDomElement mapLayerNode = node.toElement ();
2903
+
2904
+ if ( geometryType () != QGis::NoGeometry )
2860
2905
{
2861
- // classification field(s)
2862
- QgsAttributeList attributes = mRenderer ->classificationAttributes ();
2863
- const QgsFieldMap providerFields = mDataProvider ->fields ();
2864
- for ( QgsAttributeList::const_iterator it = attributes.begin (); it != attributes.end (); ++it )
2906
+ if ( mUsingRendererV2 )
2865
2907
{
2866
- QDomElement classificationElement = doc.createElement ( " classificationattribute" );
2867
- QDomText classificationText = doc.createTextNode ( providerFields[*it].name () );
2868
- classificationElement.appendChild ( classificationText );
2869
- node.appendChild ( classificationElement );
2908
+ QDomElement rendererElement = mRendererV2 ->save ( doc );
2909
+ node.appendChild ( rendererElement );
2870
2910
}
2871
-
2872
- // renderer settings
2873
- const QgsRenderer * myRenderer = renderer ();
2874
- if ( myRenderer )
2911
+ else
2875
2912
{
2876
- if ( !myRenderer->writeXML ( node, doc, *this ) )
2913
+ // use scale dependent visibility flag
2914
+ mapLayerNode.setAttribute ( " scaleBasedLabelVisibilityFlag" , mLabel ->scaleBasedVisibility () ? 1 : 0 );
2915
+ mapLayerNode.setAttribute ( " minLabelScale" , mLabel ->minScale () );
2916
+ mapLayerNode.setAttribute ( " maxLabelScale" , mLabel ->maxScale () );
2917
+
2918
+ // classification field(s)
2919
+ QgsAttributeList attributes = mRenderer ->classificationAttributes ();
2920
+ const QgsFieldMap providerFields = mDataProvider ->fields ();
2921
+ for ( QgsAttributeList::const_iterator it = attributes.begin (); it != attributes.end (); ++it )
2922
+ {
2923
+ QDomElement classificationElement = doc.createElement ( " classificationattribute" );
2924
+ QDomText classificationText = doc.createTextNode ( providerFields[*it].name () );
2925
+ classificationElement.appendChild ( classificationText );
2926
+ node.appendChild ( classificationElement );
2927
+ }
2928
+
2929
+ // renderer settings
2930
+ const QgsRenderer * myRenderer = renderer ();
2931
+ if ( myRenderer )
2877
2932
{
2878
- errorMessage = tr ( " renderer failed to save" );
2933
+ if ( !myRenderer->writeXML ( node, doc, *this ) )
2934
+ {
2935
+ errorMessage = tr ( " renderer failed to save" );
2936
+ return false ;
2937
+ }
2938
+ }
2939
+ else
2940
+ {
2941
+ QgsDebugMsg ( " no renderer" );
2942
+ errorMessage = tr ( " no renderer" );
2879
2943
return false ;
2880
2944
}
2881
2945
}
2946
+
2947
+ // add the display field
2948
+ QDomElement dField = doc.createElement ( " displayfield" );
2949
+ QDomText dFieldText = doc.createTextNode ( displayField () );
2950
+ dField.appendChild ( dFieldText );
2951
+ node.appendChild ( dField );
2952
+
2953
+ // add label node
2954
+ QDomElement labelElem = doc.createElement ( " label" );
2955
+ QDomText labelText = doc.createTextNode ( " " );
2956
+
2957
+ if ( hasLabelsEnabled () )
2958
+ {
2959
+ labelText.setData ( " 1" );
2960
+ }
2882
2961
else
2883
2962
{
2884
- QgsDebugMsg ( " no renderer" );
2885
- errorMessage = tr ( " no renderer" );
2886
- return false ;
2963
+ labelText.setData ( " 0" );
2887
2964
}
2888
- }
2965
+ labelElem. appendChild ( labelText );
2889
2966
2890
- // use scale dependent visibility flag
2891
- QDomElement mapLayerNode = node.toElement ();
2892
- mapLayerNode.setAttribute ( " scaleBasedLabelVisibilityFlag" , label ()->scaleBasedVisibility () ? 1 : 0 );
2893
- mapLayerNode.setAttribute ( " minLabelScale" , label ()->minScale () );
2894
- mapLayerNode.setAttribute ( " maxLabelScale" , label ()->maxScale () );
2967
+ node.appendChild ( labelElem );
2968
+
2969
+ // Now we get to do all that all over again for QgsLabel
2970
+
2971
+ QString fieldname = mLabel ->labelField ( QgsLabel::Text );
2972
+ if ( fieldname != " " )
2973
+ {
2974
+ dField = doc.createElement ( " labelfield" );
2975
+ dFieldText = doc.createTextNode ( fieldname );
2976
+ dField.appendChild ( dFieldText );
2977
+ node.appendChild ( dField );
2978
+ }
2979
+
2980
+ mLabel ->writeXML ( node, doc );
2981
+ }
2895
2982
2896
2983
// edit types
2897
2984
if ( mEditTypes .size () > 0 )
@@ -2973,53 +3060,9 @@ bool QgsVectorLayer::writeSymbology( QDomNode& node, QDomDocument& doc, QString&
2973
3060
node.appendChild ( aliasElem );
2974
3061
}
2975
3062
2976
- // add the display field
2977
- QDomElement dField = doc.createElement ( " displayfield" );
2978
- QDomText dFieldText = doc.createTextNode ( displayField () );
2979
- dField.appendChild ( dFieldText );
2980
- node.appendChild ( dField );
2981
-
2982
- // add label node
2983
- QDomElement labelElem = doc.createElement ( " label" );
2984
- QDomText labelText = doc.createTextNode ( " " );
2985
-
2986
- if ( hasLabelsEnabled () )
2987
- {
2988
- labelText.setData ( " 1" );
2989
- }
2990
- else
2991
- {
2992
- labelText.setData ( " 0" );
2993
- }
2994
- labelElem.appendChild ( labelText );
2995
-
2996
- node.appendChild ( labelElem );
2997
-
2998
3063
// add attribute actions
2999
3064
mActions ->writeXML ( node, doc );
3000
3065
3001
- // Now we get to do all that all over again for QgsLabel
3002
-
3003
- // XXX Since this is largely a cut-n-paste from the previous, this
3004
- // XXX therefore becomes a candidate to be generalized into a separate
3005
- // XXX function. I think.
3006
-
3007
- const QgsLabel *myLabel = label ();
3008
-
3009
- if ( myLabel )
3010
- {
3011
- QString fieldname = myLabel->labelField ( QgsLabel::Text );
3012
- if ( fieldname != " " )
3013
- {
3014
- dField = doc.createElement ( " labelfield" );
3015
- dFieldText = doc.createTextNode ( fieldname );
3016
- dField.appendChild ( dFieldText );
3017
- node.appendChild ( dField );
3018
- }
3019
-
3020
- myLabel->writeXML ( node, doc );
3021
- }
3022
-
3023
3066
// save vector overlays (e.g. diagrams)
3024
3067
QList<QgsVectorOverlay*>::const_iterator overlay_it = mOverlays .constBegin ();
3025
3068
for ( ; overlay_it != mOverlays .constEnd (); ++overlay_it )
@@ -3036,7 +3079,7 @@ bool QgsVectorLayer::writeSymbology( QDomNode& node, QDomDocument& doc, QString&
3036
3079
3037
3080
bool QgsVectorLayer::changeGeometry ( int fid, QgsGeometry* geom )
3038
3081
{
3039
- if ( !mEditable || !mDataProvider )
3082
+ if ( !mEditable || !mDataProvider || geometryType () == QGis::NoGeometry )
3040
3083
{
3041
3084
return false ;
3042
3085
}
@@ -3674,6 +3717,9 @@ bool QgsVectorLayer::addFeatures( QgsFeatureList features, bool makeSelected )
3674
3717
3675
3718
bool QgsVectorLayer::copySymbologySettings ( const QgsMapLayer& other )
3676
3719
{
3720
+ if ( geometryType () == QGis::NoGeometry )
3721
+ return false ;
3722
+
3677
3723
const QgsVectorLayer* vl = qobject_cast<const QgsVectorLayer *>( &other );
3678
3724
3679
3725
// exit if both vectorlayer are the same
@@ -3739,6 +3785,9 @@ bool QgsVectorLayer::hasCompatibleSymbology( const QgsMapLayer& other ) const
3739
3785
3740
3786
bool QgsVectorLayer::snapPoint ( QgsPoint& point, double tolerance )
3741
3787
{
3788
+ if ( geometryType () == QGis::NoGeometry )
3789
+ return false ;
3790
+
3742
3791
QMultiMap<double , QgsSnappingResult> snapResults;
3743
3792
int result = snapWithContext ( point, tolerance, snapResults, QgsSnapper::SnapToVertex );
3744
3793
@@ -3763,6 +3812,9 @@ int QgsVectorLayer::snapWithContext( const QgsPoint& startPoint, double snapping
3763
3812
QMultiMap<double , QgsSnappingResult>& snappingResults,
3764
3813
QgsSnapper::SnappingType snap_to )
3765
3814
{
3815
+ if ( geometryType () == QGis::NoGeometry )
3816
+ return 1 ;
3817
+
3766
3818
if ( snappingTolerance <= 0 || !mDataProvider )
3767
3819
{
3768
3820
return 1 ;
@@ -3869,6 +3921,9 @@ void QgsVectorLayer::snapToGeometry( const QgsPoint& startPoint, int featureId,
3869
3921
3870
3922
int QgsVectorLayer::insertSegmentVerticesForSnap ( const QList<QgsSnappingResult>& snapResults )
3871
3923
{
3924
+ if ( geometryType () == QGis::NoGeometry )
3925
+ return 1 ;
3926
+
3872
3927
int returnval = 0 ;
3873
3928
QgsPoint layerPoint;
3874
3929
@@ -4266,6 +4321,9 @@ QgsFeatureRendererV2* QgsVectorLayer::rendererV2()
4266
4321
}
4267
4322
void QgsVectorLayer::setRendererV2 ( QgsFeatureRendererV2* r )
4268
4323
{
4324
+ if ( geometryType () == QGis::NoGeometry )
4325
+ return ;
4326
+
4269
4327
delete mRendererV2 ;
4270
4328
mRendererV2 = r;
4271
4329
}
@@ -4275,6 +4333,9 @@ bool QgsVectorLayer::isUsingRendererV2()
4275
4333
}
4276
4334
void QgsVectorLayer::setUsingRendererV2 ( bool usingRendererV2 )
4277
4335
{
4336
+ if ( geometryType () == QGis::NoGeometry )
4337
+ return ;
4338
+
4278
4339
mUsingRendererV2 = usingRendererV2;
4279
4340
}
4280
4341
0 commit comments