Works for IEnumerable

This commit is contained in:
Matthias Heil
2026-04-02 15:20:12 +02:00
parent 0276f0a34c
commit 38c916b86b
5 changed files with 41 additions and 33 deletions
@@ -27,17 +27,17 @@ internal sealed class NrxDebuggerVisualizerProvider : DebuggerVisualizerProvider
}; };
public override async Task<IRemoteUserControl> CreateVisualizerAsync(VisualizerTarget visualizerTarget, CancellationToken cancellationToken) public override async Task<IRemoteUserControl> CreateVisualizerAsync(VisualizerTarget visualizerTarget, CancellationToken cancellationToken)
{ {
Vector3Model? model = await visualizerTarget.ObjectSource.RequestDataAsync<Vector3Model?>(jsonSerializer: null, cancellationToken); VisualizerModel? model = await visualizerTarget.ObjectSource.RequestDataAsync<VisualizerModel?>(jsonSerializer: null, cancellationToken);
SendToVisualizer(model); SendToVisualizer(model);
//throw new InvalidOperationException("This is a test exception to demonstrate the visualizer. Please remove this line and implement the visualizer logic."); //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); var control = new Vector3VisualizerUserControl(dataContext: model);
return await Task.FromResult<IRemoteUserControl>(control); return await Task.FromResult<IRemoteUserControl>(control);
} }
private static NamedPipeClient? PipeClient { get; set; } 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 ??= 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}");
} }
} }
@@ -5,10 +5,10 @@ namespace NrxDebugVisualizer;
internal sealed class Vector3VisualizerUserControl : RemoteUserControl 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; }
} }
@@ -1,16 +1,5 @@
<DataTemplate xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <DataTemplate xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Grid> <Grid>
<Grid.ColumnDefinitions> <TextBox TextWrapping="Wrap" AcceptsReturn="True" Text="{Binding Content}" Grid.Column="1" Grid.Row="0" />
<ColumnDefinition Width="100"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="20"></RowDefinition>
<RowDefinition Height="20"></RowDefinition>
</Grid.RowDefinitions>
<TextBlock Text="Vector3" Grid.Column="0" Grid.Row="0" />
<TextBlock Text="{Binding Vector3}" Grid.Column="1" Grid.Row="0" />
<TextBlock Text="Quaternion" Grid.Column="0" Grid.Row="1" />
<TextBlock Text="{Binding Quaternion}" Grid.Column="1" Grid.Row="1" />
</Grid> </Grid>
</DataTemplate> </DataTemplate>
@@ -1,5 +1,8 @@
using Microsoft.VisualStudio.DebuggerVisualizers; using Microsoft.VisualStudio.DebuggerVisualizers;
using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
@@ -14,21 +17,39 @@ public class NrxVisualizerObjectSource : VisualizerObjectSource
} }
public override void GetData(object target, Stream outgoingData) public override void GetData(object target, Stream outgoingData)
{ {
Debug.WriteLine("GetData: objectType is: " + target.GetType().FullName); var fullname = target.GetType().FullName;
Vector3Model vector3Model = new(); Trace.WriteLine("GetData: objectType is: " + fullname);
switch (target) VisualizerModel visualizerModel = new();
switch (fullname)
{ {
case Vector3 vector3: case "System.Numerics.Vector3":
vector3Model.Vector3 = vector3; visualizerModel.Content = target.ToString();
break; break;
case IEnumerable<Vector3> vector3List: case "System.Numerics.Quaternion":
vector3Model.Vector3 = vector3List.Last(); visualizerModel.Content = target.ToString();
break; break;
case Quaternion quaternion: case "Num.Roto.Visualization.Math.Geometry.Frame":
vector3Model.Quaternion = quaternion; var tupleType = typeof(ValueTuple<Vector3,Quaternion,float>);
var tuple = (ValueTuple<Vector3, Quaternion, float>)TypeDescriptor.GetConverter(target).ConvertTo(target, tupleType);
visualizerModel.Content = tuple.ToString();
//visualizerModel.Content = (string)TypeDescriptor.GetConverter(target).ConvertTo(target, typeof(string));
break; break;
} }
SerializeAsJson(outgoingData, vector3Model); if(target is IEnumerable<object> enumerable)
{
Trace.WriteLine($"enumerable is not null = {enumerable is not null}");
if (enumerable is not null)
{
List<string> 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) public override object CreateReplacementObject(object target, Stream incomingData)
{ {
@@ -3,11 +3,9 @@ using System.Runtime.Serialization;
namespace NrxVisualizerObjectSource; namespace NrxVisualizerObjectSource;
[DataContract] [DataContract]
public class Vector3Model public class VisualizerModel
{ {
[DataMember] [DataMember]
public Vector3? Vector3 { get; set; } public string? Content { get; set; }
[DataMember]
public Quaternion? Quaternion { get; set;}
} }