Skip to content

Commit 3c32f2b

Browse files
committed
refactor: readability
- refactor GeometryListener - Rename TraceEventNotifier to NotifyListener for clarity - Update TraceLogViewModel to utilize new listener classes - Refactor trace listener registration and unregistration methods
1 parent 581f6cd commit 3c32f2b

File tree

9 files changed

+168
-175
lines changed

9 files changed

+168
-175
lines changed

source/RevitDevTool/Application.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public override void OnStartup()
2424

2525
public override void OnShutdown()
2626
{
27-
TraceEventNotifier.TraceReceived -= TraceCommand.TraceReceivedHandler;
27+
NotifyListener.TraceReceived -= TraceCommand.TraceReceivedHandler;
2828
if (TraceCommand.SharedViewModel is not null) TraceCommand.SharedViewModel.IsStarted = false;
2929
SettingsService.Instance.SaveSettings();
3030
VisualizationController.Stop();

source/RevitDevTool/Commands/TraceCommand.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,17 +113,17 @@ private static void SubscribeEvents(UIControlledApplication application)
113113

114114
application.ControlledApplication.DocumentOpened += OnDocumentOpened;
115115
application.ControlledApplication.DocumentClosed += OnDocumentClosed;
116-
TraceEventNotifier.TraceReceived += TraceReceivedHandler;
116+
NotifyListener.TraceReceived += TraceReceivedHandler;
117117
}
118118

119119
private static void OnTraceReceived()
120120
{
121-
TraceEventNotifier.TraceReceived -= TraceReceivedHandler;
121+
NotifyListener.TraceReceived -= TraceReceivedHandler;
122122

123123
if (HasDocumentOpened) return;
124124
if (SharedViewModel is not { IsStarted: true })
125125
{
126-
TraceEventNotifier.TraceReceived += TraceReceivedHandler;
126+
NotifyListener.TraceReceived += TraceReceivedHandler;
127127
return;
128128
}
129129
if (FloatingWindow != null) return;
@@ -135,7 +135,7 @@ private static void OnTraceReceived()
135135
private static void OnDocumentOpened(object? sender, DocumentOpenedEventArgs args)
136136
{
137137
CloseFloatingWindow();
138-
TraceEventNotifier.TraceReceived -= TraceReceivedHandler;
138+
NotifyListener.TraceReceived -= TraceReceivedHandler;
139139

140140
if (IsForceHide)
141141
{
@@ -180,7 +180,7 @@ private static void OnFloatingWindowClosed(object? sender, EventArgs e)
180180
FloatingWindow.Closed -= OnFloatingWindowClosed;
181181
FloatingWindow = null;
182182
if (HasDocumentOpened) return;
183-
TraceEventNotifier.TraceReceived += TraceReceivedHandler;
183+
NotifyListener.TraceReceived += TraceReceivedHandler;
184184
}
185185

186186
private static void OnDocumentClosed(object? sender, DocumentClosedEventArgs args)
@@ -192,6 +192,6 @@ private static void OnDocumentClosed(object? sender, DocumentClosedEventArgs arg
192192
SharedViewModel = new TraceLogViewModel();
193193
}
194194

195-
TraceEventNotifier.TraceReceived += TraceReceivedHandler;
195+
NotifyListener.TraceReceived += TraceReceivedHandler;
196196
}
197197
}
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
using System.Diagnostics ;
2+
3+
namespace RevitDevTool.Models.Trace;
4+
5+
public class GeometryListener : TraceListener
6+
{
7+
// ReSharper disable once CognitiveComplexity
8+
public override void Write(object? o)
9+
{
10+
switch (o)
11+
{
12+
case ICollection<object> geometries:
13+
List<GeometryObject>? geometryObjects = null;
14+
List<BoundingBoxXYZ>? boundingBoxes = null;
15+
List<Outline>? outlines = null;
16+
List<XYZ>? xyZs = null;
17+
18+
foreach (var geometry in geometries)
19+
{
20+
switch (geometry)
21+
{
22+
case GeometryObject geometryObject:
23+
(geometryObjects ??= []).Add(geometryObject);
24+
break;
25+
case BoundingBoxXYZ boundingBox:
26+
(boundingBoxes ??= []).Add(boundingBox);
27+
break;
28+
case Outline outline:
29+
(outlines ??= []).Add(outline);
30+
break;
31+
case XYZ xyz:
32+
(xyZs ??= []).Add(xyz);
33+
break;
34+
case CurveLoop curveLoop:
35+
(geometryObjects ??= []).AddRange(curveLoop);
36+
break;
37+
case CurveArray curveArray:
38+
(geometryObjects ??= []).AddRange(curveArray.Cast<Curve>());
39+
break;
40+
case EdgeArray edgeArray:
41+
(geometryObjects ??= []).AddRange(edgeArray.Cast<Edge>());
42+
break;
43+
case FaceArray faceArray:
44+
(geometryObjects ??= []).AddRange(faceArray.Cast<Face>());
45+
break;
46+
default:
47+
base.Write(geometry);
48+
break;
49+
}
50+
}
51+
52+
if (geometryObjects?.Count > 0) Trace(geometryObjects);
53+
if (boundingBoxes?.Count > 0) Trace(boundingBoxes);
54+
if (outlines?.Count > 0) Trace(outlines);
55+
if (xyZs?.Count > 0) Trace(xyZs);
56+
break;
57+
case GeometryObject geometryObject:
58+
Trace(geometryObject);
59+
break;
60+
case XYZ xyz:
61+
Trace(xyz);
62+
break;
63+
case BoundingBoxXYZ boundingBoxXyz:
64+
Trace(boundingBoxXyz);
65+
break;
66+
case Outline outline:
67+
Trace(outline);
68+
break;
69+
case FaceArray faceArray:
70+
Trace(faceArray.Cast<Face>());
71+
break;
72+
case CurveArray curveArray:
73+
Trace(curveArray.Cast<Curve>());
74+
break;
75+
case EdgeArray edgeArray:
76+
Trace(edgeArray.Cast<Edge>());
77+
break;
78+
case IEnumerable<GeometryObject> geometries:
79+
Trace(geometries);
80+
break;
81+
case IEnumerable<CurveLoop> curves:
82+
Trace(curves.SelectMany(x => x));
83+
break;
84+
case IEnumerable<CurveArray> curveArrays:
85+
Trace(curveArrays.SelectMany(x => x.Cast<Curve>()));
86+
break;
87+
case IEnumerable<EdgeArray> edgeArrays:
88+
Trace(edgeArrays.SelectMany(x => x.Cast<Edge>()));
89+
break;
90+
case IEnumerable<FaceArray> faceArrays:
91+
Trace(faceArrays.SelectMany(x => x.Cast<Face>()));
92+
break;
93+
case IEnumerable<XYZ> xyzs:
94+
Trace(xyzs);
95+
break;
96+
case IEnumerable<BoundingBoxXYZ> boundingBoxXyzs:
97+
Trace(boundingBoxXyzs);
98+
break;
99+
default:
100+
base.Write(o);
101+
break;
102+
}
103+
}
104+
105+
public override void Write(string? message)
106+
{
107+
}
108+
109+
public override void WriteLine(string? message)
110+
{
111+
}
112+
113+
private static void Trace(object geometryObject)
114+
{
115+
VisualizationController.Add(geometryObject);
116+
}
117+
118+
private static void Trace(IEnumerable<object> geometries)
119+
{
120+
VisualizationController.Add(geometries);
121+
}
122+
}

source/RevitDevTool/Models/Trace/TraceEventNotifier.cs renamed to source/RevitDevTool/Models/Trace/NotifyListener.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace RevitDevTool.Models.Trace;
88
/// Used to trigger actions like showing the floating TraceLog window.
99
/// Only responds to trace events when Revit is fully initialized and ready.
1010
/// </summary>
11-
internal class TraceEventNotifier : TraceListener
11+
internal class NotifyListener : TraceListener
1212
{
1313
/// <summary>
1414
/// Event raised when any trace output is received (only when Revit is active).

source/RevitDevTool/Models/Trace/SerilogTraceListener.cs

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -252,13 +252,27 @@ private void Write(
252252
string messageTemplate,
253253
IList<LogEventProperty> properties)
254254
{
255-
Write(LevelMapping.ToLogEventLevel(eventType), exception, messageTemplate, properties);
255+
Write(GetLogEventLevel(eventType), exception, messageTemplate, properties);
256256
}
257257

258-
private static string EnrichMessageWithStackTrace(string messageTemplate, IList<LogEventProperty> properties)
258+
private string EnrichMessage([CanBeNull] string messageTemplate, IList<LogEventProperty> properties)
259259
{
260260
var stackTraceProp = properties.FirstOrDefault(p => p.Name == StackTraceProperty);
261-
return stackTraceProp != null ? $"{messageTemplate}\n at {{StackTrace}}" : messageTemplate;
261+
var categoryProp = properties.FirstOrDefault(p => p.Name == CategoryProperty);
262+
263+
messageTemplate ??= string.Empty;
264+
265+
if (categoryProp != null)
266+
{
267+
var isEmptyStringCategory = categoryProp.Value is ScalarValue { Value: string s } && string.IsNullOrWhiteSpace(s);
268+
if (!isEmptyStringCategory)
269+
messageTemplate = $"[{{Category}}] {messageTemplate}";
270+
}
271+
272+
if (stackTraceProp != null && includeStackTrace)
273+
messageTemplate = $"{messageTemplate}\n at {{StackTrace}}";
274+
275+
return messageTemplate;
262276
}
263277

264278
private void Write(
@@ -267,11 +281,12 @@ private void Write(
267281
string messageTemplate,
268282
IList<LogEventProperty> properties)
269283
{
270-
messageTemplate ??= string.Empty;
271-
if (includeStackTrace) messageTemplate = EnrichMessageWithStackTrace(messageTemplate, properties);
284+
messageTemplate = EnrichMessage(messageTemplate, properties);
272285
var logger = _logger ?? Log.Logger;
286+
#pragma warning disable CA2254
273287
// ReSharper disable once TemplateIsNotCompileTimeConstantProblem
274288
if (!logger.BindMessageTemplate(messageTemplate, null, out var parsedTemplate, out _))
289+
#pragma warning restore CA2254
275290
return;
276291
var logEvent = new LogEvent(DateTimeOffset.Now, level, exception, parsedTemplate, properties);
277292
logger.Write(logEvent);
@@ -293,15 +308,12 @@ private bool ShouldTrace(
293308

294309
private void WriteData(TraceEventType eventType, IList<LogEventProperty> properties, object data)
295310
{
296-
var logEventLevel = LevelMapping.ToLogEventLevel(eventType);
311+
var logEventLevel = GetLogEventLevel(eventType);
297312
SafeAddProperty(properties, TraceDataProperty, data);
298313
Write(logEventLevel, null, TraceDataMessageTemplate, properties);
299314
}
300-
}
301315

302-
internal static class LevelMapping
303-
{
304-
public static LogEventLevel ToLogEventLevel(TraceEventType eventType)
316+
private static LogEventLevel GetLogEventLevel(TraceEventType eventType)
305317
{
306318
return eventType switch
307319
{

source/RevitDevTool/Models/Trace/TraceGeometry.cs

Lines changed: 0 additions & 125 deletions
This file was deleted.

source/RevitDevTool/Utils/StackTraceUtils.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ public static class StackTraceUtils
1010
/// </summary>
1111
private static readonly string[] DefaultIgnoredNamespacePrefixes =
1212
[
13-
"System",
14-
"Microsoft",
1513
"Serilog",
14+
"Nlog",
15+
"Microsoft.Extensions.Logging",
16+
"MS.Internal",
17+
"System.Environment.get_StackTrace",
18+
"System.Diagnostics",
1619
"RevitDevTool",
17-
"IronPython",
1820
"Autodesk.Revit.UI",
1921
"revitAPIStartupFromSingleManifest"
2022
];

0 commit comments

Comments
 (0)