diff --git a/Directory.Packages.props b/Directory.Packages.props index b782abb4..1587176a 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -7,6 +7,7 @@ + @@ -38,4 +39,4 @@ - + \ No newline at end of file diff --git a/TagMappingTemp.Tests/GlobalUsings.cs b/TagMappingTemp.Tests/GlobalUsings.cs new file mode 100644 index 00000000..32445676 --- /dev/null +++ b/TagMappingTemp.Tests/GlobalUsings.cs @@ -0,0 +1 @@ +global using NUnit.Framework; diff --git a/TagMappingTemp.Tests/StidTagMapper/PdmsNode.cs b/TagMappingTemp.Tests/StidTagMapper/PdmsNode.cs new file mode 100644 index 00000000..6f594e50 --- /dev/null +++ b/TagMappingTemp.Tests/StidTagMapper/PdmsNode.cs @@ -0,0 +1,10 @@ +namespace CadRevealComposer.Operations; + +using System.Text.Json.Serialization; + +public class PdmsNode +{ + public required string NodeName { get; set; } + public string? PdmsTag { get; set; } + public string? Type { get; set; } +} diff --git a/TagMappingTemp.Tests/StidTagMapper/StidTag.cs b/TagMappingTemp.Tests/StidTagMapper/StidTag.cs new file mode 100644 index 00000000..ba070732 --- /dev/null +++ b/TagMappingTemp.Tests/StidTagMapper/StidTag.cs @@ -0,0 +1,8 @@ +namespace CadRevealComposer.Operations; + +public class StidTag +{ + public required string TAG_NO { get; set; } + public required int TAG_CATEGORY { get; set; } + public required string DOC_NO_3D { get; set; } +} diff --git a/TagMappingTemp.Tests/StidTagMapper/StidTagMapper.cs b/TagMappingTemp.Tests/StidTagMapper/StidTagMapper.cs new file mode 100644 index 00000000..bb78a865 --- /dev/null +++ b/TagMappingTemp.Tests/StidTagMapper/StidTagMapper.cs @@ -0,0 +1,120 @@ +namespace CadRevealComposer.Operations; + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; + +using CsvHelper; +using CsvHelper.Configuration; + +using Newtonsoft.Json; + + +public static class StidTagMapper +{ + [Test] + public static void CompareProcessedPdmsNodesWithStidTags() + { + string pdmsNodesPath = @"/Users/KAG/Documents/Repos/rvmsharp/TestData/troll_b_echo_tags.json"; + string stidTagsPath = @"/Users/KAG/Documents/Repos/rvmsharp/TestData/troll_b_stid_tags.csv"; + + var pdmsNodes = ParseFromJson(pdmsNodesPath); + var stidTags = ParseFromCsv(stidTagsPath); + + var nodes = FilterPdmsNodesByStidTags(pdmsNodes, stidTags); + Console.WriteLine("Number of matched tags: " + nodes.Length + ", out of: " + stidTags.Length + " that exists in STID"); + } + + private static PdmsNode[] ParseFromJson(string path) + { + var json = File.ReadAllText(path); + + return JsonConvert.DeserializeObject(json)!; + } + private static StidTag[] ParseFromCsv(string path) + { + using (var reader = new StreamReader(path)) + using (var csv = new CsvReader(reader, new CsvConfiguration(CultureInfo.InvariantCulture){Delimiter = ";"})) + { + return csv.GetRecords().ToArray(); + } + } + + private class ResultNode + { + public required PdmsNode PdmsNode { get; set; } + public required StidTag StidTag { get; set; } + public required string MatchType { get; set; } + } + + + private static ResultNode[] FilterPdmsNodesByStidTags( + PdmsNode[] pdmsNodes, StidTag[] stidTags) + { + + var resultNodes = new List(); + + var stidTagLookup = stidTags.ToDictionary(x => x.TAG_NO.Trim(), x => x, StringComparer.OrdinalIgnoreCase); + + var lineStidTags = stidTags.Where(x => x.TAG_CATEGORY == 6).ToArray(); // 6 is a line tag in STID (multiple stid tags per pdms tag). I.e they use wildcards. + + foreach (PdmsNode pdmsNode in pdmsNodes) + { + if (pdmsNode.PdmsTag != null) + { + if (stidTagLookup.TryGetValue(pdmsNode.PdmsTag, out var stidTag)) + { + resultNodes.Add(new ResultNode(){PdmsNode = pdmsNode, StidTag = stidTag, MatchType = "PdmsTag"}); + continue; + } + } + + if (stidTagLookup.TryGetValue(pdmsNode.NodeName.Trim(['/']).Trim(), out var value)) + { + resultNodes.Add(new ResultNode(){PdmsNode = pdmsNode, StidTag = value, MatchType = "PdmsName"}); + continue; + } + + if (pdmsNode.Type != null && pdmsNode.Type.Contains("PIPE", StringComparison.OrdinalIgnoreCase)) + { + // var baseLineTag = pdmsNode.NodeName.Split("_")[0].TrimStart('/').Trim(); + // var matchingLineTags = lineStidTags + // .Where(x => x.TAG_NO.Contains(baseLineTag, StringComparison.OrdinalIgnoreCase)) + // .ToArray(); + + if (pdmsNode.PdmsTag != null) + { + var pdmsTagWithoutStars = pdmsNode.PdmsTag.Trim('*'); + var pdmsTagMatchingLineTags = lineStidTags + .Where(x => x.TAG_NO.Contains(pdmsTagWithoutStars, StringComparison.OrdinalIgnoreCase)) + .ToArray(); + if (pdmsTagMatchingLineTags.Any()) + { + if (pdmsTagMatchingLineTags.Length == 1) + { + resultNodes.Add(new ResultNode() + { + PdmsNode = pdmsNode, StidTag = pdmsTagMatchingLineTags.First(), MatchType = "PdmsTag" + }); + continue; + } + // else + // { + // resultNodes.Add(pdmsNode); + // continue; + // } + } + } + // if (matchingLineTags.Any()) + // { + // resultNodes.Add(pdmsNode); + // continue; + // } + } + } + + return resultNodes.ToArray(); + } +} diff --git a/TagMappingTemp.Tests/StidTagMapper/TagDataFromStid.cs b/TagMappingTemp.Tests/StidTagMapper/TagDataFromStid.cs new file mode 100644 index 00000000..08455513 --- /dev/null +++ b/TagMappingTemp.Tests/StidTagMapper/TagDataFromStid.cs @@ -0,0 +1,33 @@ +namespace CadRevealComposer.Operations; + +using Newtonsoft.Json; + +[JsonObject] +public class TagDataFromStid +{ + public required string TagNo { get; set; } + public required string Description { get; set; } + public required string TagStatus { get; set; } + public required int TagCategory { get; set; } + public required string TagCategoryDescription { get; set; } + public required string? TagType { get; set; } + public required string UpdatedDate { get; set; } + public required string LocationCode { get; set; } + public required string DisciplineCode { get; set; } + public required string ContrCode { get; set; } + public required string System { get; set; } + public required string ProjectCode { get; set; } + public required string PoNo { get; set; } + public required string PlantNo { get; set; } + public float? XCoordinate { get; set; } + public float? YCoordinate { get; set; } + public float? ZCoordinate { get; set; } + public required AdditionalFields[] AdditionalFields { get; set; } +} + +[JsonObject] +public class AdditionalFields +{ + public required string Type { get; set; } + public required string Value { get; set; } +} diff --git a/TagMappingTemp.Tests/TagMappingTemp.Tests.csproj b/TagMappingTemp.Tests/TagMappingTemp.Tests.csproj new file mode 100644 index 00000000..ae7cc7ae --- /dev/null +++ b/TagMappingTemp.Tests/TagMappingTemp.Tests.csproj @@ -0,0 +1,21 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + + + + + + diff --git a/rvmsharp.sln b/rvmsharp.sln index f43f92c6..f688bf25 100644 --- a/rvmsharp.sln +++ b/rvmsharp.sln @@ -35,6 +35,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Commons", "Commons\Commons. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Commons.Tests", "Commons.Tests\Commons.Tests.csproj", "{E928953C-E0A7-4EDF-9484-49CFF5E303C5}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TagMappingTemp.Tests", "TagMappingTemp.Tests\TagMappingTemp.Tests.csproj", "{0A87A3EF-53BF-4E80-926A-E8816FE1B2D4}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -105,6 +107,10 @@ Global {E928953C-E0A7-4EDF-9484-49CFF5E303C5}.Debug|Any CPU.Build.0 = Debug|Any CPU {E928953C-E0A7-4EDF-9484-49CFF5E303C5}.Release|Any CPU.ActiveCfg = Release|Any CPU {E928953C-E0A7-4EDF-9484-49CFF5E303C5}.Release|Any CPU.Build.0 = Release|Any CPU + {0A87A3EF-53BF-4E80-926A-E8816FE1B2D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0A87A3EF-53BF-4E80-926A-E8816FE1B2D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0A87A3EF-53BF-4E80-926A-E8816FE1B2D4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0A87A3EF-53BF-4E80-926A-E8816FE1B2D4}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE