From 0ec34b50850abc6cfe0fbf2195e92112b85e8b6d Mon Sep 17 00:00:00 2001 From: tomasMizera Date: Tue, 31 Aug 2021 08:41:28 +0200 Subject: [PATCH 1/2] remove useless repetitive log --- core/merginprojectmetadata.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/core/merginprojectmetadata.cpp b/core/merginprojectmetadata.cpp index e79bd454a..85673b4f2 100644 --- a/core/merginprojectmetadata.cpp +++ b/core/merginprojectmetadata.cpp @@ -174,10 +174,6 @@ MerginConfig MerginConfig::fromFile( const QString &filePath ) QByteArray data = file.readAll(); config = MerginConfig::fromJson( data ); } - else - { - CoreUtils::log( QStringLiteral( "MerginConfig" ), QStringLiteral( "Project does not contain a config file on path: %1" ).arg( filePath ) ); - } return config; } From 910c0e4583d4e43b42f8b1ed1be68091da094171 Mon Sep 17 00:00:00 2001 From: tomasMizera Date: Tue, 31 Aug 2021 12:04:44 +0200 Subject: [PATCH 2/2] discover relations in autogenerated layout --- app/attributes/attributecontroller.cpp | 57 + app/attributes/attributecontroller.h | 1 + app/inpututils.cpp | 8 +- app/inpututils.h | 2 +- app/test/testformeditors.cpp | 74 + app/test/testformeditors.h | 1 + test/test_data/planes/geo-layers.gpkg | Bin 0 -> 118784 bytes test/test_data/planes/quickapp_project.qgs | 1950 ++++++++++++++++---- 8 files changed, 1723 insertions(+), 370 deletions(-) create mode 100644 test/test_data/planes/geo-layers.gpkg diff --git a/app/attributes/attributecontroller.cpp b/app/attributes/attributecontroller.cpp index e941bfca4..1cce3172c 100644 --- a/app/attributes/attributecontroller.cpp +++ b/app/attributes/attributecontroller.cpp @@ -407,6 +407,11 @@ void AttributeController::updateOnLayerChange() // Auto-Generated Layout // We create fake root tab QgsAttributeEditorContainer *tab = autoLayoutTabContainer(); + + // We need to look for relations and include them into form, + // in auto-generated layout they are not included in form config + discoverRelations( tab ); + createTab( tab ); } @@ -987,6 +992,58 @@ void AttributeController::setFieldValuesValid( bool valid ) } } +void AttributeController::discoverRelations( QgsAttributeEditorContainer *container ) +{ + QgsRelationManager *rManager = QgsProject::instance()->relationManager(); + + if ( !rManager || !mFeatureLayerPair.layer() ) + return; + + // find relation references (add relation reference widgets) + const QList childRelations = rManager->referencingRelations( mFeatureLayerPair.layer() ); + + for ( const QgsRelation &relation : childRelations ) + { + for ( QgsAttributeEditorElement *child : container->children() ) + { + if ( child->name() == relation.fieldPairs().at( 0 ).first ) + { + CoreUtils::log( QStringLiteral( "DiscoverRelations" ), QStringLiteral( "Changing field %1 to RelationReference" ) ); + QgsAttributeEditorField *editorField = static_cast( child ); + + if ( editorField ) + { + int fieldIdx = editorField->idx(); + QgsField field = mFeatureLayerPair.layer()->fields().at( fieldIdx ); + QVariantMap additionalArgs = { { "ReferencedLayerId", relation.referencedLayerId() } }; + + // relation reference fields in autogenerated fields have empty config, we need to set needed properties here + if ( mFeatureLayerPair.layer()->editorWidgetSetup( fieldIdx ).config().isEmpty() ) + { + const QgsEditorWidgetSetup newWidgetSetup = InputUtils::getEditorWidgetSetup( field, QStringLiteral( "RelationReference" ), additionalArgs ); + mFeatureLayerPair.layer()->setEditorWidgetSetup( fieldIdx, newWidgetSetup ); + } + } + } + } + } + + // find relations (add relation widgets) + const QList referencingRelations = rManager->referencedRelations( mFeatureLayerPair.layer() ); + + for ( const QgsRelation &relation : referencingRelations ) + { + std::unique_ptr relationEditor = std::unique_ptr( new QgsAttributeEditorRelation( relation, container ) ); + if ( relationEditor->label().isEmpty() && relation.name().isEmpty() ) + { + // relation does not have a name nor field have label, set label based on child layer + QString label = relation.referencingLayer()->name(); + relationEditor->setLabel( label ); + } + container->addChildElement( relationEditor.release() ); + } +} + bool AttributeController::isValidFormId( const QUuid &id ) const { return mFormItems.contains( id ); diff --git a/app/attributes/attributecontroller.h b/app/attributes/attributecontroller.h index ff44fdf03..83aa2338c 100644 --- a/app/attributes/attributecontroller.h +++ b/app/attributes/attributecontroller.h @@ -181,6 +181,7 @@ class AttributeController : public QObject void setHasAnyChanges( bool hasChanges ); void updateFieldValuesValidity(); void setFieldValuesValid( bool valid ); + void discoverRelations( QgsAttributeEditorContainer *container ); bool isValidTabId( int id ) const; bool isValidFormId( const QUuid &id ) const; diff --git a/app/inpututils.cpp b/app/inpututils.cpp index 1c83c4185..2183e7ba0 100644 --- a/app/inpututils.cpp +++ b/app/inpututils.cpp @@ -804,7 +804,7 @@ const QgsEditorWidgetSetup InputUtils::getEditorWidgetSetup( const QgsField &fie return getEditorWidgetSetup( field, QStringLiteral( "TextEdit" ) ); } -const QgsEditorWidgetSetup InputUtils::getEditorWidgetSetup( const QgsField &field, const QString &widgetType ) +const QgsEditorWidgetSetup InputUtils::getEditorWidgetSetup( const QgsField &field, const QString &widgetType, const QVariantMap &additionalArgs ) { if ( field.name() == QStringLiteral( "fid" ) ) return QgsEditorWidgetSetup( QStringLiteral( "Hidden" ), QVariantMap() ); @@ -816,6 +816,8 @@ const QgsEditorWidgetSetup InputUtils::getEditorWidgetSetup( const QgsField &fie else { QVariantMap config; + config = config.unite( additionalArgs ); + if ( widgetType == QStringLiteral( "TextEdit" ) ) { config.insert( QStringLiteral( "isMultiline" ), false ); @@ -842,6 +844,10 @@ const QgsEditorWidgetSetup InputUtils::getEditorWidgetSetup( const QgsField &fie QgsPropertyCollection collection; config.insert( QStringLiteral( "PropertyCollection" ), collection.toVariant( QgsPropertiesDefinition() ) ); } + else if ( widgetType == QStringLiteral( "RelationReference" ) ) + { + config.insert( QStringLiteral( "AllowNULL" ), true ); + } return QgsEditorWidgetSetup( widgetType, config ); } diff --git a/app/inpututils.h b/app/inpututils.h index 66b650de9..7c5aa001e 100644 --- a/app/inpututils.h +++ b/app/inpututils.h @@ -392,7 +392,7 @@ class InputUtils: public QObject * @return QgsEditorWidgetSetup for given field. */ static const QgsEditorWidgetSetup getEditorWidgetSetup( const QgsField &field ); - static const QgsEditorWidgetSetup getEditorWidgetSetup( const QgsField &field, const QString &widgetType ); + static const QgsEditorWidgetSetup getEditorWidgetSetup( const QgsField &field, const QString &widgetType, const QVariantMap &additionalArgs = QVariantMap() ); // Returns geometry type in form that qml understands Q_INVOKABLE static QString geometryFromLayer( QgsVectorLayer *layer ); diff --git a/app/test/testformeditors.cpp b/app/test/testformeditors.cpp index 3243dd752..faa0989db 100644 --- a/app/test/testformeditors.cpp +++ b/app/test/testformeditors.cpp @@ -17,6 +17,7 @@ #include #include "qgsvectorlayer.h" +#include "qgsrelationmanager.h" void TestFormEditors::init() { @@ -156,3 +157,76 @@ void TestFormEditors::testNumericFields() // field "Cabin Crew" stayed with invalid input, check controller flag of values validity QCOMPARE( controller.fieldValuesValid(), false ); } + +void TestFormEditors::testRelationsWidgetPresence() +{ + QString projectDir = TestUtils::testDataDir() + "/planes"; + QString projectName = "quickapp_project.qgs"; + + QString layersDb = projectDir + "/geo-layers.gpkg"; + + QSignalSpy spy( QgsProject::instance()->relationManager(), &QgsRelationManager::relationsLoaded ); + QVERIFY( QgsProject::instance()->read( projectDir + "/" + projectName ) ); + QCOMPARE( spy.count(), 1 ); + + + QgsMapLayer *airportsLayer = QgsProject::instance()->mapLayersByName( QStringLiteral( "airports" ) ).at( 0 ); + QgsVectorLayer *airportsVLayer = static_cast( airportsLayer ); + + QgsMapLayer *airportTowersLayer = QgsProject::instance()->mapLayersByName( QStringLiteral( "airport-towers" ) ).at( 0 ); + QgsVectorLayer *airportTowersVLayer = static_cast( airportTowersLayer ); + + QVERIFY( airportsVLayer && airportsVLayer->isValid() ); + QVERIFY( airportTowersVLayer && airportTowersVLayer->isValid() ); + + // check if we added exactly one relation widget when project has autogenerated layout + + QgsFeature f = airportsVLayer->getFeature( 1 ); + FeatureLayerPair pair( f, airportsVLayer ); + + AttributeController controller; + controller.setFeatureLayerPair( pair ); + + const TabItem *tabItem = controller.tabItem( 0 ); + QVector formItems = tabItem->formItems(); + + int relationsCount = 0; + int relationReferencesCount = 0; + + for ( const auto &itemId : formItems ) + { + const FormItem *item = controller.formItem( itemId ); + if ( item->editorWidgetType() == QStringLiteral( "relation" ) ) + relationsCount++; + else if ( item->editorWidgetType() == QStringLiteral( "RelationReference" ) ) + relationReferencesCount++; + } + + QVERIFY( relationsCount == 1 ); + QVERIFY( relationReferencesCount == 0 ); + + // check if we added exactly one relation reference widget when project has autogenerated layout + + QgsFeature ft = airportTowersVLayer->getFeature( 1 ); + FeatureLayerPair pairTower( ft, airportTowersVLayer ); + + controller.setFeatureLayerPair( pairTower ); + + const TabItem *tabItemTower = controller.tabItem( 0 ); + formItems = tabItemTower->formItems(); + + relationsCount = 0; + relationReferencesCount = 0; + + for ( const auto &itemId : formItems ) + { + const FormItem *item = controller.formItem( itemId ); + if ( item->editorWidgetType() == QStringLiteral( "relation" ) ) + relationsCount++; + else if ( item->editorWidgetType() == QStringLiteral( "RelationReference" ) ) + relationReferencesCount++; + } + + QVERIFY( relationsCount == 0 ); + QVERIFY( relationReferencesCount == 1 ); +} diff --git a/app/test/testformeditors.h b/app/test/testformeditors.h index 66071972c..4f11c6152 100644 --- a/app/test/testformeditors.h +++ b/app/test/testformeditors.h @@ -20,6 +20,7 @@ class TestFormEditors : public QObject void cleanup(); // will be called after every testfunction. void testNumericFields(); + void testRelationsWidgetPresence(); }; #endif // TESTFORMEDITORS_H diff --git a/test/test_data/planes/geo-layers.gpkg b/test/test_data/planes/geo-layers.gpkg new file mode 100644 index 0000000000000000000000000000000000000000..b1c9b9cd3951a84311916571c0edb44b6044f047 GIT binary patch literal 118784 zcmeI*eQX=&eFyM6$`&Qd5*5b|lPavAFi|Palq^w}E!pub+C0--BvR%}6j=*6nmkEY zi=@muRaRCcqhzNDT5Q9z1#34TD6nqJhIYlUb-_ApYKAp`EJM1NKawqJRv<8jwb-z3 zO|c}H_S_qJ$2XIb9NEd2HYwfRbI(2Zd7kI)o}>6<^x}jd@nkNS&m<)>%ycs>%ZwAk zFw8;vbkL{%7^c7M(I@CnmSJ3P$kTzT#{!1=#$OLI183gcOXsxM{!5r@vyJ$_#- zKB-J5hQ>yZIX%&-3tS`|^p}zxA3iZUGWPoo0)aW zIXgYh6NAHp&L^L&vgG)%_qe=dDiWOJ=+**xp3klbsRgHJuuAgLvB4oZc{~)1%{tTk zJWWnh4h#;RI5slu9rKP1jg1`}u2zPzA+J{{!xKTelM_ivke1VQN>uw#S=llSm8!2tWV=5P$##AOHafKmY;|xbp>`WIG%VN9SoPeOQu0ekqri z#5q1GE$4YrpY{%Vhx!Lc`-g{OgQF+CLnjAE21bvMUD}v^?$F`Q&G*OsiT4wmo0}V# z4h}xEx%q$N{tplQ6`k(BDOft(4!1e`ekr%Y=gT*u%`My1;K^fy1IN9?bW;nzdRWQ& z8?7(WtT!%Ay_?wF{NHi^x7*&K)7>|z^_gvW@1yHlY(HRZKd}AJHnPF05P$##AOHaf zKmY;|fB*y_009W>roe#~H>=&y(C#%@I$9j<`aKSe|97);ux$uH00Izz00bZa0SG_< z0uX?}4hh_1{4an0-(q`*vHdrF!2<#ifB*y_009U<00Izz00bZafxA)QfThaY|194B zzZ>fkWrhF*AOHafKmY;|fB*y_009Wp7HH`G|Cbrt_iZoN&IC&!009U<00Izz00bZa z0SG_<0ua~@fk!M>x5I8}YcqegpMIr6hL`fIQ{iAJ)_s$(R)?dflu9fupO^`RL)|yk z&;P&9*j~5&a5we?+k^lFAOHafKmY;|fB*y_009UjUiIlv&$P-sZ8C)*%IU%>0lz5S(a#>NzCxxtZl4yIW>>f!av)P

0p0N+zb0N?6eK>8T$XambfUc3C5Fo9 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 LCTeErW+wW7DbU5c literal 0 HcmV?d00001 diff --git a/test/test_data/planes/quickapp_project.qgs b/test/test_data/planes/quickapp_project.qgs index 5cc9aa6a5..4c85d6aee 100644 --- a/test/test_data/planes/quickapp_project.qgs +++ b/test/test_data/planes/quickapp_project.qgs @@ -1,47 +1,76 @@ - + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] +proj=longlat +datum=WGS84 +no_defs 3452 4326 EPSG:4326 WGS 84 longlat - WGS84 + EPSG:7030 true - - - + + + + + + + + + - - + + + - - + + + + + + + points20151123133104693 polys20151123133114244 lines20151123133101198 + airports_3c14ef82_e3d0_440d_a8ce_48455d0d700a + airport_towers_701598d1_bc0c_4378_9524_9a7b66c0a10c - + - - - + + + + + - - + + + + + + + degrees -119.35580667290255974 @@ -52,45 +81,596 @@ 0 + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] +proj=longlat +datum=WGS84 +no_defs 3452 4326 EPSG:4326 WGS 84 longlat - WGS84 + EPSG:7030 true 0 + + - - + + degrees + + 0 + 0 + 0 + 0 + + 0 + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + 0 + + + + Annotations_1dbb1cec_4a27_4855_b748_cf6f68d2afe3 + + + + + + + + + + 0 + 0 + + + + + false + + + + + + + + + + + + + + + + + 0 + 0 + + + + + false + + + + + + 1 + 0 + - + + + -109.63379669189500021 + 41.35957717895509944 + -105.26393890380799689 + 41.46120834350590201 + + + -109.63379669189500021 + 41.35957717895509944 + -105.26393890380799689 + 41.46120834350590201 + + airport_towers_701598d1_bc0c_4378_9524_9a7b66c0a10c + ./geo-layers.gpkg|layername=airport-towers + + + + airport-towers + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + + + dataset + + + + + + + + + + 0 + 0 + + + + + false + + + + + ogr + + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + "Code" + + + + + -110.14191436767599441 + 40.74982833862299714 + -104.3154602050779971 + 41.96932220458980112 + + + -110.14191436767599441 + 40.74982833862299714 + -104.3154602050779971 + 41.96932220458980112 + + airports_3c14ef82_e3d0_440d_a8ce_48455d0d700a + ./geo-layers.gpkg|layername=airports + + + + airports + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + + + dataset + + + + + + + + + + 0 + 0 + + + + + false + + + + + ogr + + + + + + + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + "Name" + + + -117.62319839219053108 - 23.20820580488508966 + 30.41924429435494659 -82.32264950769274492 46.18290982947509349 + + -117.62319839219053108 + 30.41924429435494659 + -82.32264950769274492 + 46.18290982947509349 + lines20151123133101198 ./lines.shp @@ -99,13 +679,14 @@ Roads + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] +proj=longlat +datum=WGS84 +no_defs 3452 4326 EPSG:4326 WGS 84 longlat - WGS84 + EPSG:7030 true @@ -116,10 +697,12 @@ + + 0 0 @@ -131,7 +714,6 @@ - ogr @@ -142,29 +724,89 @@ - + + 1 + 1 + 1 + 0 + + + + + + + + - - + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + 0 0 1 - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + - + - + - - + + - - - - + + - - + + - - + + + - + - - ../src/quickgui/app/qgis-data + + + + + + 0 ../src/quickgui/app/qgis-data @@ -308,23 +1086,26 @@ def my_form_open(dialog, layer, feature): 0 generatedlayout - - - - - - - + + + + COALESCE( "Name", '<NULL>' ) - + -118.88888888888877204 22.80020703933767834 -83.33333333333315807 46.87198067632875365 + + -118.88888888888877204 + 22.80020703933767834 + -83.33333333333315807 + 46.87198067632875365 + points20151123133104693 ./points.shp @@ -333,13 +1114,14 @@ def my_form_open(dialog, layer, feature): Planes + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] +proj=longlat +datum=WGS84 +no_defs 3452 4326 EPSG:4326 WGS 84 longlat - WGS84 + EPSG:7030 true @@ -350,10 +1132,12 @@ def my_form_open(dialog, layer, feature): + + 0 0 @@ -365,7 +1149,6 @@ def my_form_open(dialog, layer, feature): - ogr @@ -376,32 +1159,72 @@ def my_form_open(dialog, layer, feature): - + + 1 + 1 + 1 + 0 + + + + + + + + - - - + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - + 0 0 1 - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + - + - + - + - + - + - + - - - - - - + + + + + + - - - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - - + + + + + - - ../src/quickgui/app/qgis-data + + + + + + 0 ../src/quickgui/app/qgis-data @@ -654,22 +1623,25 @@ def my_form_open(dialog, layer, feature): generatedlayout + + - - - - - COALESCE( "Class", '<NULL>' ) - + -118.92286230599032137 24.50786971868489061 -83.79001199101509201 46.72617265077044379 + + -118.92286230599032137 + 24.50786971868489061 + -83.79001199101509201 + 46.72617265077044379 + polys20151123133114244 ./polys.shp @@ -678,13 +1650,14 @@ def my_form_open(dialog, layer, feature): Land + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] +proj=longlat +datum=WGS84 +no_defs 3452 4326 EPSG:4326 WGS 84 longlat - WGS84 + EPSG:7030 true @@ -695,10 +1668,12 @@ def my_form_open(dialog, layer, feature): + + 0 0 @@ -710,7 +1685,6 @@ def my_form_open(dialog, layer, feature): - ogr @@ -721,25 +1695,57 @@ def my_form_open(dialog, layer, feature): - + + 1 + 1 + 1 + 0 + + + + + + + + - - + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - + 0 0 1 - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + - + - + - - + + - - - - + + - - + + - - + + + - + - - ../src/quickgui/app/qgis-data + + + + + + 0 ../src/quickgui/app/qgis-data @@ -879,12 +1993,9 @@ def my_form_open(dialog, layer, feature): generatedlayout + + - - - - - COALESCE( "Name", '<NULL>' ) @@ -893,126 +2004,229 @@ def my_form_open(dialog, layer, feature): + + - 8 - - conditions unknown - false - - false - - - - false - - - - - - None - - - - - - - - - - - - - MU - 2 - true - - false - - - - - - - - 255 - - + + + + 0 true - false - - - - - EPSG:4326 - 1 - 3452 - +proj=longlat +datum=WGS84 +no_defs - - - NONE - - - - - false - - - - m2 - meters - - to vertex and segment + + 2 + 20 1 + to vertex and segment + + to_vertex_and_segment + to_vertex_and_segment + to_vertex_and_segment + + + enabled + enabled + enabled + lines20151123133101198 points20151123133104693 polys20151123133114244 - 20 20.000000 20.000000 20.000000 - - to_vertex_and_segment - to_vertex_and_segment - to_vertex_and_segment - - current_layer - 1 1 1 - - enabled - enabled - enabled - + current_layer - - 90 - 255 - 255 + 255 + 255 255 255 - 255 0 - 255 + 255 + 255 + + + + + false + + + + + + NONE + + + m2 + meters + + + 5 + 2.5 + false + false + 0 + 0 + false + false + true + 0 + 255,0,0,255 + + + false + + + true + 2 + MU + + false + + 3452 + +proj=longlat +datum=WGS84 +no_defs + EPSG:4326 + 1 + + + + + + + + + + + + + + None + false + + + + + + 1 + false + conditions unknown + 90 + + + + 1 + + 8 + + false + + false + + 0 + + false + + + + + + + + false + + + + + false + + 5000 + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + 2000-01-01T00:00:00 + + + + + + + GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]] + +proj=longlat +datum=WGS84 +no_defs + 3452 + 4326 + EPSG:4326 + WGS 84 + longlat + EPSG:7030 + true + + + + + + + + +