feat: port p-rec-annot line-number refresh pipeline
This commit is contained in:
@@ -60,6 +60,26 @@ internal sealed class LineNumberOwnedAnnotationReader
|
||||
return new(stableId, markerNumber, text, new(localPosition.X, localPosition.Y, localPosition.Z));
|
||||
}
|
||||
|
||||
public IReadOnlyList<LineNumberOwnedRow> ReadMarkers(Document document)
|
||||
{
|
||||
using var transaction = document.Database.TransactionManager.StartOpenCloseTransaction();
|
||||
var blocks = (BlockTable)transaction.GetObject(document.Database.BlockTableId, OpenMode.ForRead);
|
||||
var paper = (BlockTableRecord)transaction.GetObject(blocks[BlockTableRecord.PaperSpace], OpenMode.ForRead);
|
||||
var rows = new List<LineNumberOwnedRow>();
|
||||
foreach (ObjectId id in paper)
|
||||
{
|
||||
if (transaction.GetObject(id, OpenMode.ForRead) is not BlockReference marker || !HasRole(marker, "MARKER")) continue;
|
||||
var values = marker.GetXDataForApplication(ApplicationName)?.AsArray() ?? [];
|
||||
var strings = values.Where(value => value.TypeCode == 1000).Select(value => value.Value as string).ToArray();
|
||||
var stableId = strings.FirstOrDefault(value => !string.Equals(value, "MARKER", StringComparison.OrdinalIgnoreCase));
|
||||
var markerNumber = values.Where(value => value.TypeCode == 1071).Select(value => Convert.ToInt32(value.Value)).FirstOrDefault();
|
||||
var text = strings.LastOrDefault() ?? string.Empty;
|
||||
if (string.IsNullOrWhiteSpace(stableId) || markerNumber <= 0) continue;
|
||||
rows.Add(new(stableId, markerNumber, text, default));
|
||||
}
|
||||
return rows.OrderBy(value => value.MarkerNumber).ThenBy(value => value.SourceStableId, StringComparer.Ordinal).ToArray();
|
||||
}
|
||||
|
||||
private static bool HasRole(BlockReference reference, string role) =>
|
||||
reference.GetXDataForApplication(ApplicationName)?.AsArray().Any(value =>
|
||||
value.TypeCode == 1000 && string.Equals(value.Value as string, role, StringComparison.OrdinalIgnoreCase)) == true;
|
||||
|
||||
Reference in New Issue
Block a user