feat: model legacy support annotation settings

This commit is contained in:
codex
2026-08-10 15:46:01 +03:00
parent a80ff5220d
commit 6624c4ffd0
2 changed files with 28 additions and 2 deletions
@@ -18,7 +18,8 @@ public sealed record ProductionSettingsContract(
string SetLayer, string SetLayer,
double? FixedSupportPlusLength, double? FixedSupportPlusLength,
string? ScriptFolder, string? ScriptFolder,
LineNumberMarkerSettings? LineNumberMarker) LineNumberMarkerSettings? LineNumberMarker,
SupportTopViewSettings? SupportTopView)
{ {
public static ProductionSettingsContract Parse(string xml) public static ProductionSettingsContract Parse(string xml)
{ {
@@ -45,6 +46,16 @@ public sealed record ProductionSettingsContract(
TryParseLegacyNumber(marker.Attribute("maskscalefactor")?.Value, out var mask) ? mask : null, TryParseLegacyNumber(marker.Attribute("maskscalefactor")?.Value, out var mask) ? mask : null,
ParseLine(marker.Element("Line")), ParseLine(marker.Element("Line")),
ParseText(marker.Element("Text"))); ParseText(marker.Element("Text")));
var supports = root.Element("SupportsInTopView");
SupportTopViewSettings? parsedSupports = supports is null ? null : new(
supports.Attribute("undefinedsize")?.Value,
supports.Elements("Support").Select(value => new SupportRule(
Required(value, "scriptname"),
TryParseLegacyNumber(value.Attribute("nominaldiameter")?.Value, out var diameter) ? diameter : null,
value.Attribute("nominalumit")?.Value,
int.TryParse(value.Attribute("lastdigit")?.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var lastDigit) ? lastDigit : null,
TryParseLegacyNumber(value.Attribute("scale")?.Value, out var scale) ? scale : null,
value.Attribute("selectionvalue")?.Value)).ToArray());
return new( return new(
copy, copy,
layers, layers,
@@ -59,7 +70,8 @@ public sealed record ProductionSettingsContract(
setLayer, setLayer,
parsedPlusLength, parsedPlusLength,
root.Element("ScriptFolder")?.Attribute("path")?.Value, root.Element("ScriptFolder")?.Attribute("path")?.Value,
parsedMarker); parsedMarker,
parsedSupports);
} }
private static LineGeometrySettings? ParseLine(XElement? value) => value is null ? null : new( private static LineGeometrySettings? ParseLine(XElement? value) => value is null ? null : new(
@@ -92,3 +104,5 @@ public sealed record LayerSetupRule(string FilterType, string FilterValue, int?
public sealed record LineNumberMarkerSettings(string Layer, double? MaskScaleFactor, LineGeometrySettings? Line, TextAnnotationSettings? Text); 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 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); public sealed record TextAnnotationSettings(string? Layer, string? TextStyle, double? Size, string? TextValue, double? PositionX, double? PositionY);
public sealed record SupportTopViewSettings(string? UndefinedSize, IReadOnlyList<SupportRule> Rules);
public sealed record SupportRule(string ScriptName, double? NominalDiameter, string? NominalUnit, int? LastDigit, double? Scale, string? SelectionValue);
@@ -54,4 +54,16 @@ public sealed class ProductionSettingsContractTests
Assert.Equal(-1.0607, result.LineNumberMarker.Line!.StartX); Assert.Equal(-1.0607, result.LineNumberMarker.Line!.StartX);
Assert.Equal(2.5, result.LineNumberMarker.Text!.Size); Assert.Equal(2.5, result.LineNumberMarker.Text!.Size);
} }
[Fact]
public void ParsesLegacySupportTopViewRules()
{
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'/><SupportsInTopView undefinedsize='UNKNOWN'><Support scriptname='CS_SUP' nominaldiameter='50,0' nominalumit='mm' lastdigit='1' scale='0,04' selectionvalue='DN50'/></SupportsInTopView><SetLayer name='AXIS'/></Main>";
var result = ProductionSettingsContract.Parse(xml);
Assert.NotNull(result.SupportTopView);
var rule = Assert.Single(result.SupportTopView!.Rules);
Assert.Equal(50.0, rule.NominalDiameter);
Assert.Equal(0.04, rule.Scale);
Assert.Equal("DN50", rule.SelectionValue);
}
} }