From 38c916b86b51bb2ceb9ee9ad354430f7fe8f433c Mon Sep 17 00:00:00 2001 From: Matthias Heil Date: Thu, 2 Apr 2026 15:20:12 +0200 Subject: [PATCH] Works for IEnumerable --- .../NrxDebuggerVisualizerProvider.cs | 8 ++-- .../Vector3VisualizerUserControl.cs | 6 +-- .../Vector3VisualizerUserControl.xaml | 13 +----- .../NrxVisualizerObjectSource.cs | 41 ++++++++++++++----- .../{Vector3Model.cs => VisualizerModel.cs} | 6 +-- 5 files changed, 41 insertions(+), 33 deletions(-) rename NrxVisualizerObjectSource/{Vector3Model.cs => VisualizerModel.cs} (50%) diff --git a/NrxDebuggerVisualizerProvider/NrxDebuggerVisualizerProvider.cs b/NrxDebuggerVisualizerProvider/NrxDebuggerVisualizerProvider.cs index 5b0144f..377397c 100644 --- a/NrxDebuggerVisualizerProvider/NrxDebuggerVisualizerProvider.cs +++ b/NrxDebuggerVisualizerProvider/NrxDebuggerVisualizerProvider.cs @@ -27,17 +27,17 @@ internal sealed class NrxDebuggerVisualizerProvider : DebuggerVisualizerProvider }; public override async Task CreateVisualizerAsync(VisualizerTarget visualizerTarget, CancellationToken cancellationToken) { - Vector3Model? model = await visualizerTarget.ObjectSource.RequestDataAsync(jsonSerializer: null, cancellationToken); + VisualizerModel? model = await visualizerTarget.ObjectSource.RequestDataAsync(jsonSerializer: null, cancellationToken); SendToVisualizer(model); //throw new InvalidOperationException("This is a test exception to demonstrate the visualizer. Please remove this line and implement the visualizer logic."); var control = new Vector3VisualizerUserControl(dataContext: model); return await Task.FromResult(control); } private static NamedPipeClient? PipeClient { get; set; } - private static void SendToVisualizer(Vector3Model? vector3Model) + private static void SendToVisualizer(VisualizerModel? visualizerModel) { - if (vector3Model is null) return; + if (visualizerModel is null) return; PipeClient ??= new NamedPipeClient("testPipe", serverName: @"TestServer", logger: (m) => Console.WriteLine(m)); - _ = PipeClient.SetMessageAsync($"Hello from {nameof(CreateVisualizerAsync)},vector3Model = {vector3Model.Vector3},{vector3Model.Quaternion}"); + _ = PipeClient.SetMessageAsync($"Hello from {nameof(CreateVisualizerAsync)},visualizerModel.Content = {visualizerModel.Content}"); } } diff --git a/NrxDebuggerVisualizerProvider/Vector3VisualizerUserControl.cs b/NrxDebuggerVisualizerProvider/Vector3VisualizerUserControl.cs index 8482e33..b4590b2 100644 --- a/NrxDebuggerVisualizerProvider/Vector3VisualizerUserControl.cs +++ b/NrxDebuggerVisualizerProvider/Vector3VisualizerUserControl.cs @@ -5,10 +5,10 @@ namespace NrxDebugVisualizer; internal sealed class Vector3VisualizerUserControl : RemoteUserControl { - public Vector3VisualizerUserControl(Vector3Model? dataContext) : base(dataContext) + public Vector3VisualizerUserControl(VisualizerModel? dataContext) : base(dataContext) { - Vector3Model = (Vector3Model?)DataContext; + Vector3Model = (VisualizerModel?)DataContext; } - public Vector3Model? Vector3Model { get; } + public VisualizerModel? Vector3Model { get; } } \ No newline at end of file diff --git a/NrxDebuggerVisualizerProvider/Vector3VisualizerUserControl.xaml b/NrxDebuggerVisualizerProvider/Vector3VisualizerUserControl.xaml index 35f36db..ad2afc3 100644 --- a/NrxDebuggerVisualizerProvider/Vector3VisualizerUserControl.xaml +++ b/NrxDebuggerVisualizerProvider/Vector3VisualizerUserControl.xaml @@ -1,16 +1,5 @@  - - - - - - - - - - - - + \ No newline at end of file diff --git a/NrxVisualizerObjectSource/NrxVisualizerObjectSource.cs b/NrxVisualizerObjectSource/NrxVisualizerObjectSource.cs index 1fb463a..46654aa 100644 --- a/NrxVisualizerObjectSource/NrxVisualizerObjectSource.cs +++ b/NrxVisualizerObjectSource/NrxVisualizerObjectSource.cs @@ -1,5 +1,8 @@ using Microsoft.VisualStudio.DebuggerVisualizers; +using System; +using System.Collections; using System.Collections.Generic; +using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Linq; @@ -14,21 +17,39 @@ public class NrxVisualizerObjectSource : VisualizerObjectSource } public override void GetData(object target, Stream outgoingData) { - Debug.WriteLine("GetData: objectType is: " + target.GetType().FullName); - Vector3Model vector3Model = new(); - switch (target) + var fullname = target.GetType().FullName; + Trace.WriteLine("GetData: objectType is: " + fullname); + VisualizerModel visualizerModel = new(); + switch (fullname) { - case Vector3 vector3: - vector3Model.Vector3 = vector3; + case "System.Numerics.Vector3": + visualizerModel.Content = target.ToString(); break; - case IEnumerable vector3List: - vector3Model.Vector3 = vector3List.Last(); + case "System.Numerics.Quaternion": + visualizerModel.Content = target.ToString(); break; - case Quaternion quaternion: - vector3Model.Quaternion = quaternion; + case "Num.Roto.Visualization.Math.Geometry.Frame": + var tupleType = typeof(ValueTuple); + var tuple = (ValueTuple)TypeDescriptor.GetConverter(target).ConvertTo(target, tupleType); + visualizerModel.Content = tuple.ToString(); + //visualizerModel.Content = (string)TypeDescriptor.GetConverter(target).ConvertTo(target, typeof(string)); break; } - SerializeAsJson(outgoingData, vector3Model); + if(target is IEnumerable enumerable) + { + Trace.WriteLine($"enumerable is not null = {enumerable is not null}"); + if (enumerable is not null) + { + List stringList = []; + foreach (var item in enumerable) + { + stringList.Add(TypeDescriptor.GetConverter(item).ConvertToString(item)); + } + visualizerModel.Content = string.Join(Environment.NewLine, stringList); + } + } + Trace.WriteLine($"visualizerModel.Content = {visualizerModel.Content}"); + SerializeAsJson(outgoingData, visualizerModel); } public override object CreateReplacementObject(object target, Stream incomingData) { diff --git a/NrxVisualizerObjectSource/Vector3Model.cs b/NrxVisualizerObjectSource/VisualizerModel.cs similarity index 50% rename from NrxVisualizerObjectSource/Vector3Model.cs rename to NrxVisualizerObjectSource/VisualizerModel.cs index f2d04f8..494d318 100644 --- a/NrxVisualizerObjectSource/Vector3Model.cs +++ b/NrxVisualizerObjectSource/VisualizerModel.cs @@ -3,11 +3,9 @@ using System.Runtime.Serialization; namespace NrxVisualizerObjectSource; [DataContract] -public class Vector3Model +public class VisualizerModel { [DataMember] - public Vector3? Vector3 { get; set; } - [DataMember] - public Quaternion? Quaternion { get; set;} + public string? Content { get; set; } }