From c616188336494fa8b64289b4b397ec7300fee419 Mon Sep 17 00:00:00 2001 From: codex Date: Mon, 3 Aug 2026 07:54:00 +0300 Subject: [PATCH] fix: tolerate missing Ortho DataLinks rows in DryRun --- .../PRecAnnot.Plant3D2026/PlantReadPath.cs | 54 +++++++++++-------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/Plant3D2026/P_Rec_Annot/src/PRecAnnot.Plant3D2026/PlantReadPath.cs b/Plant3D2026/P_Rec_Annot/src/PRecAnnot.Plant3D2026/PlantReadPath.cs index 7ba66e7..2204de6 100644 --- a/Plant3D2026/P_Rec_Annot/src/PRecAnnot.Plant3D2026/PlantReadPath.cs +++ b/Plant3D2026/P_Rec_Annot/src/PRecAnnot.Plant3D2026/PlantReadPath.cs @@ -164,34 +164,42 @@ internal sealed class PlantObjectReader : IPlantObjectReader if (dataLinks is null) return Array.Empty(); var snapshots = new List(); - foreach (var rowId in dataLinks.SelectAcPpRowIds(document.Database)) + try { - try + foreach (var rowId in dataLinks.SelectAcPpRowIds(document.Database)) { - cancellationToken.ThrowIfCancellationRequested(); - var className = dataLinks.GetObjectClassname(rowId); - var properties = dataLinks.GetAllProperties(rowId, true) - .GroupBy(x => x.Key, StringComparer.OrdinalIgnoreCase) - .ToDictionary(x => x.Key, x => x.Last().Value, StringComparer.OrdinalIgnoreCase); - string? Value(params string[] names) => properties.FirstOrDefault(x => names.Any(name => string.Equals(name, x.Key, StringComparison.OrdinalIgnoreCase))).Value; - snapshots.Add(new PlantObjectSnapshot + try { - SnapshotId = StableId(Path.GetFileName(document.Name), rowId, className), - ObjectClass = className ?? string.Empty, - Tag = Value("Tag", "TAG"), - LineNumber = Value("Line Number", "LineNumber", "LINENUMBER"), - SupportNumber = Value("Support Number", "SupportNumber"), - EquipmentNumber = Value("Equipment Number", "EquipmentNumber"), - Geometry = new GeometrySnapshot(), - Properties = properties.ToDictionary(x => x.Key, x => (string?)x.Value, StringComparer.OrdinalIgnoreCase), - Diagnostics = new[] { "GEOMETRY_NOT_MAPPED" } - }); - } - catch - { - // Keep the read path best-effort; no write operation is attempted. + cancellationToken.ThrowIfCancellationRequested(); + var className = dataLinks.GetObjectClassname(rowId); + var properties = dataLinks.GetAllProperties(rowId, true) + .GroupBy(x => x.Key, StringComparer.OrdinalIgnoreCase) + .ToDictionary(x => x.Key, x => x.Last().Value, StringComparer.OrdinalIgnoreCase); + string? Value(params string[] names) => properties.FirstOrDefault(x => names.Any(name => string.Equals(name, x.Key, StringComparison.OrdinalIgnoreCase))).Value; + snapshots.Add(new PlantObjectSnapshot + { + SnapshotId = StableId(Path.GetFileName(document.Name), rowId, className), + ObjectClass = className ?? string.Empty, + Tag = Value("Tag", "TAG"), + LineNumber = Value("Line Number", "LineNumber", "LINENUMBER"), + SupportNumber = Value("Support Number", "SupportNumber"), + EquipmentNumber = Value("Equipment Number", "EquipmentNumber"), + Geometry = new GeometrySnapshot(), + Properties = properties.ToDictionary(x => x.Key, x => (string?)x.Value, StringComparer.OrdinalIgnoreCase), + Diagnostics = new[] { "GEOMETRY_NOT_MAPPED" } + }); + } + catch + { + // Keep the read path best-effort; no write operation is attempted. + } } } + catch (DLException) + { + // An Ortho sheet can have no direct Piping DataLinks rows. The caller + // receives an empty read-only result rather than a command failure. + } return snapshots.OrderBy(x => x.SnapshotId, StringComparer.Ordinal).ToArray(); }