feat: add p-rec-annot Plant connector relationship reader

This commit is contained in:
codex
2026-08-07 09:37:43 +03:00
parent f9cd0a43bf
commit 20ac5e4808
3 changed files with 67 additions and 0 deletions
@@ -82,6 +82,19 @@ public sealed record LineConnectionBoundaryCandidate(
AnnotationPoint Position, AnnotationPoint Position,
double Rotation); double Rotation);
public sealed record LineConnectionBoundaryPlan(string StableId, string Text, AnnotationPoint Position, double Rotation, IReadOnlyList<string> Reasons); public sealed record LineConnectionBoundaryPlan(string StableId, string Text, AnnotationPoint Position, double Rotation, IReadOnlyList<string> Reasons);
public sealed record PlantConnectorRelationshipSnapshot(
string StableId,
long ConnectorRowId,
long FirstPartRowId,
long SecondPartRowId,
long FirstLineGroupRowId,
long SecondLineGroupRowId,
IReadOnlyList<string> Diagnostics);
public sealed record PlantConnectorRelationshipReadResult(bool Success, IReadOnlyList<PlantConnectorRelationshipSnapshot> Connectors, string? FailureCode = null);
public interface IPlantConnectorRelationshipReader
{
PlantConnectorRelationshipReadResult Read();
}
public sealed record LineNumberOwnedRow(string SourceStableId, int MarkerNumber, string Text, AnnotationPoint MarkerAttributePosition); 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 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); public sealed record LineNumberTextAsset(string Layer, string TextStyle, double Size, string TextValue, Point2Dto Position);
@@ -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<PlantConnectorRelationshipSnapshot>();
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<string>()));
}
return new(true, result.OrderBy(value => value.StableId, StringComparer.Ordinal).ToArray());
}
catch (DLException) { return new(false, Array.Empty<PlantConnectorRelationshipSnapshot>(), "CONNECTOR_DATALINKS_READ_FAILED"); }
catch (Exception) { return new(false, Array.Empty<PlantConnectorRelationshipSnapshot>(), "CONNECTOR_RELATIONSHIP_READ_FAILED"); }
}
}
@@ -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);
}
}