feat: model legacy line number marker settings

This commit is contained in:
codex
2026-08-10 15:44:38 +03:00
parent 5047b7d41b
commit beadf751b0
2 changed files with 39 additions and 2 deletions
@@ -17,7 +17,8 @@ public sealed record ProductionSettingsContract(
string ElevationTextStyle,
string SetLayer,
double? FixedSupportPlusLength,
string? ScriptFolder)
string? ScriptFolder,
LineNumberMarkerSettings? LineNumberMarker)
{
public static ProductionSettingsContract Parse(string xml)
{
@@ -38,6 +39,12 @@ public sealed record ProductionSettingsContract(
if (string.IsNullOrWhiteSpace(setLayer)) throw Invalid("SetLayer.name");
var plusLength = root.Element("PlusLengthNO")?.Attribute("value")?.Value;
double? parsedPlusLength = TryParseLegacyNumber(plusLength, out var plus) ? plus : null;
var marker = root.Element("LineNumbers")?.Element("Marker");
LineNumberMarkerSettings? parsedMarker = marker is null ? null : new(
Required(marker, "layer"),
TryParseLegacyNumber(marker.Attribute("maskscalefactor")?.Value, out var mask) ? mask : null,
ParseLine(marker.Element("Line")),
ParseText(marker.Element("Text")));
return new(
copy,
layers,
@@ -51,9 +58,25 @@ public sealed record ProductionSettingsContract(
Required(elevations, "textstyle"),
setLayer,
parsedPlusLength,
root.Element("ScriptFolder")?.Attribute("path")?.Value);
root.Element("ScriptFolder")?.Attribute("path")?.Value,
parsedMarker);
}
private static LineGeometrySettings? ParseLine(XElement? value) => value is null ? null : new(
TryParseLegacyNumber(value.Attribute("startx")?.Value, out var startX) ? startX : null,
TryParseLegacyNumber(value.Attribute("starty")?.Value, out var startY) ? startY : null,
TryParseLegacyNumber(value.Attribute("endx")?.Value, out var endX) ? endX : null,
TryParseLegacyNumber(value.Attribute("endy")?.Value, out var endY) ? endY : null,
value.Attribute("layer")?.Value);
private static TextAnnotationSettings? ParseText(XElement? value) => value is null ? null : new(
value.Attribute("layer")?.Value,
value.Attribute("textstyle")?.Value,
TryParseLegacyNumber(value.Attribute("size")?.Value, out var size) ? size : null,
value.Attribute("textvalue")?.Value,
TryParseLegacyNumber(value.Attribute("positionx")?.Value, out var positionX) ? positionX : null,
TryParseLegacyNumber(value.Attribute("positiony")?.Value, out var positionY) ? positionY : null);
private static int? ParseInt(XElement value, string name) => int.TryParse(value.Attribute(name)?.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var parsed) ? parsed : null;
private static bool TryParseLegacyNumber(string? value, out double parsed)
{
@@ -66,3 +89,6 @@ public sealed record ProductionSettingsContract(
public sealed record NamedDrawingObject(string Type, string Name);
public sealed record LayerSetupRule(string FilterType, string FilterValue, int? LineWeight, string LineType, string Color);
public sealed record LineNumberMarkerSettings(string Layer, double? MaskScaleFactor, LineGeometrySettings? Line, TextAnnotationSettings? Text);
public sealed record LineGeometrySettings(double? StartX, double? StartY, double? EndX, double? EndY, string? Layer);
public sealed record TextAnnotationSettings(string? Layer, string? TextStyle, double? Size, string? TextValue, double? PositionX, double? PositionY);
@@ -43,4 +43,15 @@ public sealed class ProductionSettingsContractTests
var result = ProductionSettingsContract.Parse(xml);
Assert.Equal(1.5, result.FixedSupportPlusLength);
}
[Fact]
public void ParsesLegacyLineNumberMarkerContract()
{
const string xml = "<Main><CopyMissingObjects/><LayersSetup/><Annotations layer='TEXT' textstyle='GOSTC' multileaderstyle='PXP'/><LinenumberConnections polylinelayer='AXIS' textlayer='TEXT' textstyle='GOSTC'/><Elevations layer='THIN' textstyle='GOSTC'/><LineNumbers><Marker layer='DIM' maskscalefactor='1,10'><Line layer='DIM' startx='-1,0607' starty='-1,0607' endx='1,0607' endy='1,0607'/><Text layer='TEXT' textstyle='GOSTC' size='2,5' textvalue='' positionx='-4.0' positiony='4.4'/></Marker></LineNumbers><SetLayer name='AXIS'/></Main>";
var result = ProductionSettingsContract.Parse(xml);
Assert.NotNull(result.LineNumberMarker);
Assert.Equal(1.10, result.LineNumberMarker!.MaskScaleFactor);
Assert.Equal(-1.0607, result.LineNumberMarker.Line!.StartX);
Assert.Equal(2.5, result.LineNumberMarker.Text!.Size);
}
}