Skip to content

Commit 5fe32d9

Browse files
authored
Merge pull request #564 from Esri/Caleb/New-SnapGeometryEditsWithUtilityNetworkRules
[New] Snap geometry edits with utility network rules
2 parents a710fa1 + 53b367e commit 5fe32d9

File tree

6 files changed

+742
-0
lines changed

6 files changed

+742
-0
lines changed

Samples.xcodeproj/project.pbxproj

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,8 @@
221221
D7010EBF2B05616900D43F55 /* DisplaySceneFromMobileScenePackageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7010EBC2B05616900D43F55 /* DisplaySceneFromMobileScenePackageView.swift */; };
222222
D7010EC12B05618400D43F55 /* DisplaySceneFromMobileScenePackageView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D7010EBC2B05616900D43F55 /* DisplaySceneFromMobileScenePackageView.swift */; };
223223
D701D72C2A37C7F7006FF0C8 /* bradley_low_3ds in Resources */ = {isa = PBXBuildFile; fileRef = D701D72B2A37C7F7006FF0C8 /* bradley_low_3ds */; settings = {ASSET_TAGS = (ShowViewshedFromGeoelementInScene, ); }; };
224+
D703F04D2D9334AC0077E3A8 /* SnapGeometryEditsWithUtilityNetworkRulesView.Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = D703F04C2D9334AC0077E3A8 /* SnapGeometryEditsWithUtilityNetworkRulesView.Model.swift */; };
225+
D703F04E2D9334BD0077E3A8 /* SnapGeometryEditsWithUtilityNetworkRulesView.Model.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D703F04C2D9334AC0077E3A8 /* SnapGeometryEditsWithUtilityNetworkRulesView.Model.swift */; };
224226
D7044B962BE18D73000F2C43 /* EditWithBranchVersioningView.Views.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7044B952BE18D73000F2C43 /* EditWithBranchVersioningView.Views.swift */; };
225227
D7044B972BE18D8D000F2C43 /* EditWithBranchVersioningView.Views.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D7044B952BE18D73000F2C43 /* EditWithBranchVersioningView.Views.swift */; };
226228
D704AA5A2AB22C1A00A3BB63 /* GroupLayersTogetherView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D704AA592AB22C1A00A3BB63 /* GroupLayersTogetherView.swift */; };
@@ -256,6 +258,8 @@
256258
D718A1E82B571C9100447087 /* OrbitCameraAroundObjectView.Model.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D718A1E62B570F7500447087 /* OrbitCameraAroundObjectView.Model.swift */; };
257259
D718A1ED2B575FD900447087 /* ManageBookmarksView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D718A1EA2B575FD900447087 /* ManageBookmarksView.swift */; };
258260
D718A1F02B57602000447087 /* ManageBookmarksView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D718A1EA2B575FD900447087 /* ManageBookmarksView.swift */; };
261+
D71A9DE22D8CC88D00CA03CB /* SnapGeometryEditsWithUtilityNetworkRulesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D71A9DE02D8CC88D00CA03CB /* SnapGeometryEditsWithUtilityNetworkRulesView.swift */; };
262+
D71A9DE52D8CC8B500CA03CB /* SnapGeometryEditsWithUtilityNetworkRulesView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D71A9DE02D8CC88D00CA03CB /* SnapGeometryEditsWithUtilityNetworkRulesView.swift */; };
259263
D71C5F642AAA7A88006599FD /* CreateSymbolStylesFromWebStylesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D71C5F632AAA7A88006599FD /* CreateSymbolStylesFromWebStylesView.swift */; };
260264
D71C5F652AAA83D2006599FD /* CreateSymbolStylesFromWebStylesView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D71C5F632AAA7A88006599FD /* CreateSymbolStylesFromWebStylesView.swift */; };
261265
D71C90A22C6C249B0018C63E /* StyleGeometryTypesWithSymbolsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D71C909C2C6C249B0018C63E /* StyleGeometryTypesWithSymbolsView.swift */; };
@@ -369,6 +373,7 @@
369373
D762AF5F2BF6A7B900ECE3C7 /* EditFeaturesWithFeatureLinkedAnnotationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D762AF5B2BF6A7B900ECE3C7 /* EditFeaturesWithFeatureLinkedAnnotationView.swift */; };
370374
D762AF622BF6A7D100ECE3C7 /* EditFeaturesWithFeatureLinkedAnnotationView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D762AF5B2BF6A7B900ECE3C7 /* EditFeaturesWithFeatureLinkedAnnotationView.swift */; };
371375
D762AF652BF6A96100ECE3C7 /* loudoun_anno.geodatabase in Resources */ = {isa = PBXBuildFile; fileRef = D762AF632BF6A96100ECE3C7 /* loudoun_anno.geodatabase */; settings = {ASSET_TAGS = (EditFeaturesWithFeatureLinkedAnnotation, ); }; };
376+
D762DA0E2D94C750001052DD /* NapervilleGasUtilities.geodatabase in Resources */ = {isa = PBXBuildFile; fileRef = D762DA0C2D94C750001052DD /* NapervilleGasUtilities.geodatabase */; settings = {ASSET_TAGS = (SnapGeometryEditsWithUtilityNetworkRules, ); }; };
372377
D7634FAF2A43B7AC00F8AEFB /* CreateConvexHullAroundGeometriesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7634FAE2A43B7AC00F8AEFB /* CreateConvexHullAroundGeometriesView.swift */; };
373378
D7634FB02A43B8B000F8AEFB /* CreateConvexHullAroundGeometriesView.swift in Copy Source Code Files */ = {isa = PBXBuildFile; fileRef = D7634FAE2A43B7AC00F8AEFB /* CreateConvexHullAroundGeometriesView.swift */; };
374379
D7635FF12B9272CB0044AB97 /* DisplayClustersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7635FED2B9272CB0044AB97 /* DisplayClustersView.swift */; };
@@ -589,6 +594,8 @@
589594
dstPath = "";
590595
dstSubfolderSpec = 7;
591596
files = (
597+
D703F04E2D9334BD0077E3A8 /* SnapGeometryEditsWithUtilityNetworkRulesView.Model.swift in Copy Source Code Files */,
598+
D71A9DE52D8CC8B500CA03CB /* SnapGeometryEditsWithUtilityNetworkRulesView.swift in Copy Source Code Files */,
592599
D789AAAE2D66C737007A8E0E /* CreateKMLMultiTrackView.Model.swift in Copy Source Code Files */,
593600
D71563EA2D5AC2D500D2E948 /* CreateKMLMultiTrackView.swift in Copy Source Code Files */,
594601
D74F6C452D0CD54200D4FB15 /* ConfigureElectronicNavigationalChartsView.swift in Copy Source Code Files */,
@@ -942,6 +949,7 @@
942949
D70082EA2ACF900100E0C3C2 /* IdentifyKMLFeaturesView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IdentifyKMLFeaturesView.swift; sourceTree = "<group>"; };
943950
D7010EBC2B05616900D43F55 /* DisplaySceneFromMobileScenePackageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisplaySceneFromMobileScenePackageView.swift; sourceTree = "<group>"; };
944951
D701D72B2A37C7F7006FF0C8 /* bradley_low_3ds */ = {isa = PBXFileReference; lastKnownFileType = folder; path = bradley_low_3ds; sourceTree = "<group>"; };
952+
D703F04C2D9334AC0077E3A8 /* SnapGeometryEditsWithUtilityNetworkRulesView.Model.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SnapGeometryEditsWithUtilityNetworkRulesView.Model.swift; sourceTree = "<group>"; };
945953
D7044B952BE18D73000F2C43 /* EditWithBranchVersioningView.Views.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditWithBranchVersioningView.Views.swift; sourceTree = "<group>"; };
946954
D704AA592AB22C1A00A3BB63 /* GroupLayersTogetherView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GroupLayersTogetherView.swift; sourceTree = "<group>"; };
947955
D70539032CD0122D00F63F4A /* mil2525d.stylx */ = {isa = PBXFileReference; lastKnownFileType = file; path = mil2525d.stylx; sourceTree = "<group>"; };
@@ -962,6 +970,7 @@
962970
D71563E32D5AC2B600D2E948 /* CreateKMLMultiTrackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateKMLMultiTrackView.swift; sourceTree = "<group>"; };
963971
D718A1E62B570F7500447087 /* OrbitCameraAroundObjectView.Model.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrbitCameraAroundObjectView.Model.swift; sourceTree = "<group>"; };
964972
D718A1EA2B575FD900447087 /* ManageBookmarksView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManageBookmarksView.swift; sourceTree = "<group>"; };
973+
D71A9DE02D8CC88D00CA03CB /* SnapGeometryEditsWithUtilityNetworkRulesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SnapGeometryEditsWithUtilityNetworkRulesView.swift; sourceTree = "<group>"; };
965974
D71C5F632AAA7A88006599FD /* CreateSymbolStylesFromWebStylesView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateSymbolStylesFromWebStylesView.swift; sourceTree = "<group>"; };
966975
D71C909C2C6C249B0018C63E /* StyleGeometryTypesWithSymbolsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StyleGeometryTypesWithSymbolsView.swift; sourceTree = "<group>"; };
967976
D71C909D2C6C249B0018C63E /* StyleGeometryTypesWithSymbolsView.Views.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StyleGeometryTypesWithSymbolsView.Views.swift; sourceTree = "<group>"; };
@@ -1026,6 +1035,7 @@
10261035
D76000B62AF19FCA00B3084D /* SanFrancisco.mmpk */ = {isa = PBXFileReference; lastKnownFileType = file; path = SanFrancisco.mmpk; sourceTree = "<group>"; };
10271036
D762AF5B2BF6A7B900ECE3C7 /* EditFeaturesWithFeatureLinkedAnnotationView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditFeaturesWithFeatureLinkedAnnotationView.swift; sourceTree = "<group>"; };
10281037
D762AF632BF6A96100ECE3C7 /* loudoun_anno.geodatabase */ = {isa = PBXFileReference; lastKnownFileType = file; path = loudoun_anno.geodatabase; sourceTree = "<group>"; };
1038+
D762DA0C2D94C750001052DD /* NapervilleGasUtilities.geodatabase */ = {isa = PBXFileReference; lastKnownFileType = file; path = NapervilleGasUtilities.geodatabase; sourceTree = "<group>"; };
10291039
D7634FAE2A43B7AC00F8AEFB /* CreateConvexHullAroundGeometriesView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateConvexHullAroundGeometriesView.swift; sourceTree = "<group>"; };
10301040
D7635FED2B9272CB0044AB97 /* DisplayClustersView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisplayClustersView.swift; sourceTree = "<group>"; };
10311041
D7635FF52B9277DC0044AB97 /* ConfigureClustersView.Model.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfigureClustersView.Model.swift; sourceTree = "<group>"; };
@@ -1405,6 +1415,7 @@
14051415
0086F3FC28E3770900974721 /* Show viewshed from point in scene */,
14061416
95DEB9B72C127A97009BEC35 /* Show viewshed from point on map */,
14071417
00E7C15A2BBE1BF000B85D69 /* Snap geometry edits */,
1418+
D71A9DE12D8CC88D00CA03CB /* Snap geometry edits with utility network rules */,
14081419
D75B584D2AAFB2C20038B3B4 /* Style features with custom dictionary */,
14091420
D71C909E2C6C249B0018C63E /* Style geometry types with symbols */,
14101421
E066DD362860AB0B004D3D5B /* Style graphics with renderer */,
@@ -1506,6 +1517,7 @@
15061517
00CCB8A6285D059300BBAB70 /* Portal Data */ = {
15071518
isa = PBXGroup;
15081519
children = (
1520+
D762DA0D2D94C750001052DD /* 0fd3a39660d54c12b05d5f81f207dffd */,
15091521
D74C8C002ABA6202007C76B8 /* 1bd036f221f54a99abc9e46ff3511cbf */,
15101522
D7781D472B7EB03400E53C51 /* 4caec8c55ea2463982f1af7d9611b8d5 */,
15111523
D7C16D1D2AC5FE8200689E89 /* 5a9b60cee9ba41e79640a06bcdf8084d */,
@@ -2137,6 +2149,15 @@
21372149
path = "Manage bookmarks";
21382150
sourceTree = "<group>";
21392151
};
2152+
D71A9DE12D8CC88D00CA03CB /* Snap geometry edits with utility network rules */ = {
2153+
isa = PBXGroup;
2154+
children = (
2155+
D71A9DE02D8CC88D00CA03CB /* SnapGeometryEditsWithUtilityNetworkRulesView.swift */,
2156+
D703F04C2D9334AC0077E3A8 /* SnapGeometryEditsWithUtilityNetworkRulesView.Model.swift */,
2157+
);
2158+
path = "Snap geometry edits with utility network rules";
2159+
sourceTree = "<group>";
2160+
};
21402161
D71C5F602AAA7854006599FD /* Create symbol styles from web styles */ = {
21412162
isa = PBXGroup;
21422163
children = (
@@ -2544,6 +2565,14 @@
25442565
path = 74c0c9fa80f4498c9739cc42531e9948;
25452566
sourceTree = "<group>";
25462567
};
2568+
D762DA0D2D94C750001052DD /* 0fd3a39660d54c12b05d5f81f207dffd */ = {
2569+
isa = PBXGroup;
2570+
children = (
2571+
D762DA0C2D94C750001052DD /* NapervilleGasUtilities.geodatabase */,
2572+
);
2573+
path = 0fd3a39660d54c12b05d5f81f207dffd;
2574+
sourceTree = "<group>";
2575+
};
25472576
D7635FEA2B9272CB0044AB97 /* Display clusters */ = {
25482577
isa = PBXGroup;
25492578
children = (
@@ -3293,6 +3322,7 @@
32933322
ShowDeviceLocationWithNmeaDataSources,
32943323
ShowMobileMapPackageExpirationDate,
32953324
ShowViewshedFromGeoelementInScene,
3325+
SnapGeometryEditsWithUtilityNetworkRules,
32963326
StyleFeaturesWithCustomDictionary,
32973327
StylePointWithDistanceCompositeSceneSymbol,
32983328
StyleSymbolsFromMobileStyleFile,
@@ -3346,6 +3376,7 @@
33463376
4D126D7C29CA3E6000CFB7A7 /* Redlands.nmea in Resources */,
33473377
00C94A0D28B53DE1004E42D9 /* raster-file in Resources */,
33483378
D7464F2B2ACE0965007FEE88 /* SA_EVI_8Day_03May20 in Resources */,
3379+
D762DA0E2D94C750001052DD /* NapervilleGasUtilities.geodatabase in Resources */,
33493380
004FE87129DF5D8700075217 /* Bristol in Resources */,
33503381
D713C6F72CB9B9A60073AA72 /* US_State_Capitals.kml in Resources */,
33513382
D7C16D252AC5FEA600689E89 /* Snowdon.csv in Resources */,
@@ -3591,6 +3622,7 @@
35913622
D73FC0FD2AD4A18D0067A19B /* CreateMobileGeodatabaseView.swift in Sources */,
35923623
D7F2A02F2CD00F1C0008D981 /* ApplyDictionaryRendererToFeatureLayerView.swift in Sources */,
35933624
1C19B4F12A578E46001D2506 /* CreateLoadReportView.Views.swift in Sources */,
3625+
D703F04D2D9334AC0077E3A8 /* SnapGeometryEditsWithUtilityNetworkRulesView.Model.swift in Sources */,
35943626
E066DD3B2860CA08004D3D5B /* ShowResultOfSpatialRelationshipsView.swift in Sources */,
35953627
7573E81E29D6134C00BEED9C /* TraceUtilityNetworkView.Views.swift in Sources */,
35963628
D75E5EE62CC0340100252595 /* ListContentsOfKMLFileView.swift in Sources */,
@@ -3629,6 +3661,7 @@
36293661
E066DD382860AB28004D3D5B /* StyleGraphicsWithRendererView.swift in Sources */,
36303662
108EC04129D25B2C000F35D0 /* QueryFeatureTableView.swift in Sources */,
36313663
D71D516E2B51D7B600B2A2BE /* SearchForWebMapView.Views.swift in Sources */,
3664+
D71A9DE22D8CC88D00CA03CB /* SnapGeometryEditsWithUtilityNetworkRulesView.swift in Sources */,
36323665
D7114A0D2BDC6A3300FA68CA /* EditWithBranchVersioningView.Model.swift in Sources */,
36333666
00B04FB5283EEBA80026C882 /* DisplayOverviewMapView.swift in Sources */,
36343667
D718A1E72B570F7500447087 /* OrbitCameraAroundObjectView.Model.swift in Sources */,
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# Snap geometry edits with utility network rules
2+
3+
Use the Geometry Editor to edit geometries using utility network connectivity rules.
4+
5+
![Screenshot of Snap geometry edits with utility network rules sample](snap-geometry-edits-with-utility-network-rules.png)
6+
7+
## Use case
8+
9+
A field worker can create new features in a utility network by editing and snapping the vertices of a geometry to existing features on a map. In a gas utility network, gas pipeline features can be represented with the polyline geometry type. Utility networks use geometric coincident-based connectivity to provide pathways for resources. Rule-based snapping uses utility network connectivity rules when editing features based on their asset type and asset group to help maintain network connectivity.
10+
11+
## How to use the sample
12+
13+
To edit a geometry, tap a feature on the map to select it and press the edit button to start the geometry editor.
14+
15+
Tap the "Snap Sources" button to view and enable/disable the snap sources. To interactively snap a vertex to a feature or graphic, ensure that snapping is enabled for the relevant snap source, then drag a vertex to nearby an existing feature or graphic. If the existing feature or graphic has valid utility network connectivity rules for the asset type that is being created or edited, the edit position will be adjusted to coincide with (or snap to) edges and vertices of its geometry. Tap to place the vertex at the snapped location. Snapping will not occur when `SnapRuleBehavior.rulesPreventSnapping` is `true`, even when the source is enabled.
16+
17+
To discard changes and stop the geometry editor, press the Cancel (X) button. To save your edits, press the Save (✔️) button.
18+
19+
## How it works
20+
21+
1. Create a map and use its `loadSettings` to set `featureTilingMode` to `enabledWithFullResolutionWhenSupported`.
22+
2. Create a `Geodatabase` using the mobile geodatabase file location.
23+
3. Display `Geodatabase.featureTables` on the map using subtype feature layers.
24+
4. Create a `GeometryEditor` and connect it to a `MapView`.
25+
5. When editing a feature:
26+
1. Create a `UtilityAssetType` for the feature with `UtilityNetwork.makeElement(arcGISFeature:terminal:)` using the utility network from the geodatabase.
27+
2. Call `SnapRules.rules(for:assetType:)` to get the snap rules associated with the utility asset type.
28+
3. Use `SnapSettings.syncSourceSettings(rules:sourceEnablingBehavior:)` passing in the snap rules and `SnapSourceEnablingBehavior.setFromRules` to populate the `SnapSettings.sourceSettings` with `SnapSourceSettings`.
29+
6. Start the geometry editor with the feature's geometry or a `Point` geometry type.
30+
31+
## Relevant API
32+
33+
* FeatureLayer
34+
* Geometry
35+
* GeometryEditor
36+
* GeometryEditorStyle
37+
* GraphicsOverlay
38+
* MapView
39+
* SnapRuleBehavior
40+
* SnapRules
41+
* SnapSettings
42+
* SnapSource
43+
* SnapSourceEnablingBehavior
44+
* SnapSourceSettings
45+
* UtilityNetwork
46+
47+
## About the data
48+
49+
This sample downloads the [NapervilleGasUtilities](https://www.arcgis.com/home/item.html?id=0fd3a39660d54c12b05d5f81f207dffd) item from *ArcGIS Online* automatically. The Naperville gas utilities mobile geodatabase contains a utility network with a set of connectivity rules that can be used to perform geometry edits with rule-based snapping.
50+
51+
## Tags
52+
53+
edit, feature, geometry editor, graphics, layers, map, snapping, utility network
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{
2+
"category": "Utility Networks",
3+
"description": "Use the Geometry Editor to edit geometries using utility network connectivity rules.",
4+
"ignore": false,
5+
"images": [
6+
"snap-geometry-edits-with-utility-network-rules.png"
7+
],
8+
"keywords": [
9+
"edit",
10+
"feature",
11+
"geometry editor",
12+
"graphics",
13+
"layers",
14+
"map",
15+
"snapping",
16+
"utility network",
17+
"FeatureLayer",
18+
"Geometry",
19+
"GeometryEditor",
20+
"GeometryEditorStyle",
21+
"GraphicsOverlay",
22+
"MapView",
23+
"SnapRuleBehavior",
24+
"SnapRules",
25+
"SnapSettings",
26+
"SnapSource",
27+
"SnapSourceEnablingBehavior",
28+
"SnapSourceSettings",
29+
"UtilityNetwork"
30+
],
31+
"offline_data": [
32+
"0fd3a39660d54c12b05d5f81f207dffd"
33+
],
34+
"redirect_from": [],
35+
"relevant_apis": [
36+
"FeatureLayer",
37+
"Geometry",
38+
"GeometryEditor",
39+
"GeometryEditorStyle",
40+
"GraphicsOverlay",
41+
"MapView",
42+
"SnapRuleBehavior",
43+
"SnapRules",
44+
"SnapSettings",
45+
"SnapSource",
46+
"SnapSourceEnablingBehavior",
47+
"SnapSourceSettings",
48+
"UtilityNetwork"
49+
],
50+
"snippets": [
51+
"SnapGeometryEditsWithUtilityNetworkRulesView.swift",
52+
"SnapGeometryEditsWithUtilityNetworkRulesView.Model.swift"
53+
],
54+
"title": "Snap geometry edits with utility network rules"
55+
}

0 commit comments

Comments
 (0)