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
@@ -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"); }
}
}