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