diff --git a/Plant3D2026/P_Rec_Annot/src/PRecAnnot.Abstractions/Contracts.cs b/Plant3D2026/P_Rec_Annot/src/PRecAnnot.Abstractions/Contracts.cs index 3704eef..6ad136a 100644 --- a/Plant3D2026/P_Rec_Annot/src/PRecAnnot.Abstractions/Contracts.cs +++ b/Plant3D2026/P_Rec_Annot/src/PRecAnnot.Abstractions/Contracts.cs @@ -82,6 +82,19 @@ public sealed record LineConnectionBoundaryCandidate( AnnotationPoint Position, double Rotation); public sealed record LineConnectionBoundaryPlan(string StableId, string Text, AnnotationPoint Position, double Rotation, IReadOnlyList Reasons); +public sealed record PlantConnectorRelationshipSnapshot( + string StableId, + long ConnectorRowId, + long FirstPartRowId, + long SecondPartRowId, + long FirstLineGroupRowId, + long SecondLineGroupRowId, + IReadOnlyList Diagnostics); +public sealed record PlantConnectorRelationshipReadResult(bool Success, IReadOnlyList Connectors, string? FailureCode = null); +public interface IPlantConnectorRelationshipReader +{ + PlantConnectorRelationshipReadResult Read(); +} public sealed record LineNumberOwnedRow(string SourceStableId, int MarkerNumber, string Text, AnnotationPoint MarkerAttributePosition); public sealed record LineNumberRowMutation(string SourceStableId, int PreviousMarkerNumber, int MarkerNumber, string Text, AnnotationPoint? MarkerAttributePosition); public sealed record LineNumberTextAsset(string Layer, string TextStyle, double Size, string TextValue, Point2Dto Position); diff --git a/Plant3D2026/P_Rec_Annot/src/PRecAnnot.Plant3D2026/PlantConnectorRelationshipReader.cs b/Plant3D2026/P_Rec_Annot/src/PRecAnnot.Plant3D2026/PlantConnectorRelationshipReader.cs new file mode 100644 index 0000000..4fdfeae --- /dev/null +++ b/Plant3D2026/P_Rec_Annot/src/PRecAnnot.Plant3D2026/PlantConnectorRelationshipReader.cs @@ -0,0 +1,39 @@ +using Autodesk.ProcessPower.DataLinks; +using PRecAnnot.Abstractions; + +namespace PRecAnnot.Plant3D2026; + +// Reads the two P3dPartConnection edges and their line-group relationships. +// This is the Plant 2026 equivalent of the legacy PXP-ALC connector discovery +// pass; it deliberately returns row identities only, never PnP/AutoCAD +// objects, so Core remains Autodesk-free. +internal sealed class PlantConnectorRelationshipReader(DataLinksManager dataLinks) : IPlantConnectorRelationshipReader +{ + public PlantConnectorRelationshipReadResult Read() + { + try + { + var database = dataLinks.GetPnPDatabase(); + var rows = database.Tables["PnPDataLinks"].Select("RowClassName='P3dConnector'") + .OrderBy(row => Convert.ToInt64(row["RowId"])) + .ToArray(); + var result = new List(); + foreach (var row in rows) + { + var connector = Convert.ToInt64(row["RowId"]); + var first = dataLinks.GetRelatedRowIds("P3dPartConnection", "Part1", (int)connector, "Part2"); + var second = dataLinks.GetRelatedRowIds("P3dPartConnection", "Part2", (int)connector, "Part1"); + if (first.Count != 1 || second.Count != 1) continue; + var firstPart = first.First(); + var secondPart = second.First(); + var firstGroups = dataLinks.GetRelatedRowIds("P3dLineGroupPartRelationship", "Part", firstPart, "LineGroup"); + var secondGroups = dataLinks.GetRelatedRowIds("P3dLineGroupPartRelationship", "Part", secondPart, "LineGroup"); + if (firstGroups.Count != 1 || secondGroups.Count != 1) continue; + result.Add(new($"pnp-connector:{connector}", connector, firstPart, secondPart, firstGroups.First(), secondGroups.First(), Array.Empty())); + } + return new(true, result.OrderBy(value => value.StableId, StringComparer.Ordinal).ToArray()); + } + catch (DLException) { return new(false, Array.Empty(), "CONNECTOR_DATALINKS_READ_FAILED"); } + catch (Exception) { return new(false, Array.Empty(), "CONNECTOR_RELATIONSHIP_READ_FAILED"); } + } +} diff --git a/Plant3D2026/P_Rec_Annot/tests/PRecAnnot.Core.Tests/PlantConnectorRelationshipContractTests.cs b/Plant3D2026/P_Rec_Annot/tests/PRecAnnot.Core.Tests/PlantConnectorRelationshipContractTests.cs new file mode 100644 index 0000000..d277565 --- /dev/null +++ b/Plant3D2026/P_Rec_Annot/tests/PRecAnnot.Core.Tests/PlantConnectorRelationshipContractTests.cs @@ -0,0 +1,15 @@ +using PRecAnnot.Abstractions; + +namespace PRecAnnot.Core.Tests; + +public sealed class PlantConnectorRelationshipContractTests +{ + [Fact] + public void Snapshot_SeparatesConnectorPartsAndLineGroups() + { + var value = new PlantConnectorRelationshipSnapshot("pnp-connector:7", 7, 10, 11, 21, 22, []); + Assert.NotEqual(value.FirstPartRowId, value.SecondPartRowId); + Assert.NotEqual(value.FirstLineGroupRowId, value.SecondLineGroupRowId); + Assert.Equal("pnp-connector:7", value.StableId); + } +}