From 034f2e96d894e9d65a3589f84aa8a3588a616575 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuzhan=20Koral?= <45078678+oguzhankoral@users.noreply.github.com> Date: Fri, 24 May 2024 15:01:26 +0300 Subject: [PATCH] CNX-9500 Implement highlighting sent elements (#3432) * Implement highlighting sent elements * Remove not null check from active map * Edit using as inline --- .../Bindings/BasicConnectorBinding.cs | 99 ++++++++++++++++++- 1 file changed, 98 insertions(+), 1 deletion(-) diff --git a/DUI3-DX/Connectors/ArcGIS/Speckle.Connectors.ArcGIS3/Bindings/BasicConnectorBinding.cs b/DUI3-DX/Connectors/ArcGIS/Speckle.Connectors.ArcGIS3/Bindings/BasicConnectorBinding.cs index 30504b4c80..97d3aceb5e 100644 --- a/DUI3-DX/Connectors/ArcGIS/Speckle.Connectors.ArcGIS3/Bindings/BasicConnectorBinding.cs +++ b/DUI3-DX/Connectors/ArcGIS/Speckle.Connectors.ArcGIS3/Bindings/BasicConnectorBinding.cs @@ -1,5 +1,9 @@ using System.Reflection; +using ArcGIS.Core.Data; +using ArcGIS.Core.Geometry; using ArcGIS.Desktop.Core; +using ArcGIS.Desktop.Framework.Threading.Tasks; +using ArcGIS.Desktop.Mapping; using Speckle.Connectors.ArcGIS.HostApp; using Speckle.Connectors.DUI.Bindings; using Speckle.Connectors.DUI.Bridge; @@ -49,5 +53,98 @@ public BasicConnectorBinding(DocumentModelStore store, ArcGISSettings settings, public void RemoveModel(ModelCard model) => _store.RemoveModel(model); - public void HighlightModel(string modelCardId) => throw new System.NotImplementedException(); + public async void HighlightModel(string modelCardId) + { + MapView mapView = MapView.Active; + + var model = _store.GetModelById(modelCardId); + + if (model is null) + { + return; + } + + var objectIds = new List(); + + if (model is SenderModelCard senderModelCard) + { + objectIds = senderModelCard.SendFilter.NotNull().GetObjectIds(); + } + + if (model is ReceiverModelCard receiverModelCard) + { + objectIds = receiverModelCard.ReceiveResult?.BakedObjectIds.NotNull(); + } + + if (objectIds is null) + { + return; + } + + await QueuedTask + .Run(() => + { + List mapMembers = GetMapMembers(objectIds, mapView); + ClearSelection(); + SelectMapMembers(mapMembers); + mapView.ZoomToSelected(); + }) + .ConfigureAwait(false); + } + + private List GetMapMembers(List objectIds, MapView mapView) + { + List mapMembers = new(); + + foreach (string objectId in objectIds) + { + MapMember mapMember = mapView.Map.FindLayer(objectId); + if (mapMember is null) + { + mapMember = mapView.Map.FindStandaloneTable(objectId); + } + if (mapMember is null) + { + continue; + } + mapMembers.Add(mapMember); + } + + return mapMembers; + } + + private void ClearSelection() + { + List mapMembers = MapView.Active.Map.GetLayersAsFlattenedList().ToList(); + foreach (var member in mapMembers) + { + if (member is FeatureLayer featureLayer) + { + featureLayer.ClearSelection(); + } + } + } + + private void SelectMapMembers(List mapMembers) + { + foreach (var member in mapMembers) + { + if (member is FeatureLayer featureLayer) + { + using RowCursor rowCursor = featureLayer.Search(); + while (rowCursor.MoveNext()) + { + using (var row = rowCursor.Current) + { + if (row is not Feature feature) + { + continue; + } + Geometry geometry = feature.GetShape(); + MapView.Active.SelectFeatures(geometry, SelectionCombinationMethod.Add); + } + } + } + } + } }