From 41f7b018ac0c672ee1d6daf701010403ec38bfc6 Mon Sep 17 00:00:00 2001 From: NeVeSpl Date: Thu, 9 May 2024 13:29:25 +0200 Subject: [PATCH] introduce a new trait IHaveVisualization.CanBeVisualized for type handlers --- .../MemberAccessors/MemberAccessorByFunc.cs | 2 +- .../MemberAccessors/MemberAccessorByRef.cs | 2 +- .../MemberAccessorByRefCompiled.cs | 2 +- .../MemberAccessorForConstValue.cs | 2 +- .../DataModel/Parameters/ParameterAccessor.cs | 2 +- .../ValueContainers/Base/ITypeHandler.cs | 4 +-- .../ValueContainers/Base/IValueContainer.cs | 3 +- .../DataModel/ValueContainers/Base/Traits.cs | 25 +++++++--------- .../ValueContainers/Base/TypeHandler.cs | 26 +++++++++++++---- .../ValueContainers/Base/ValueContainer.cs | 10 +++---- .../ValueContainers/BindingMapHandler.cs | 7 +++-- .../ValueContainers/BoundarySegmentHandler.cs | 13 +++++++-- .../ValueContainers/ElementIdHandler.cs | 2 +- tests/ValueContainersTests.cs | 29 +++++++++++++++---- 14 files changed, 84 insertions(+), 45 deletions(-) diff --git a/sources/RevitDBExplorer/Domain/DataModel/MemberAccessors/MemberAccessorByFunc.cs b/sources/RevitDBExplorer/Domain/DataModel/MemberAccessors/MemberAccessorByFunc.cs index dcba837..b2fab73 100644 --- a/sources/RevitDBExplorer/Domain/DataModel/MemberAccessors/MemberAccessorByFunc.cs +++ b/sources/RevitDBExplorer/Domain/DataModel/MemberAccessors/MemberAccessorByFunc.cs @@ -25,7 +25,7 @@ public override ReadResult Read(SnoopableContext context, TSnoopedObjectType @ob var value = new ValueContainer(); var result = get(context.Document, @object); value.SetValueTyped(context, result); - return new ReadResult(value.ValueAsString, "[ByFunc] " + value.TypeName, value.CanBeSnooped, value); + return new ReadResult(value.ValueAsString, "[ByFunc] " + value.TypeHandlerName, value.CanBeSnooped, value); } public override IEnumerable Snoop(SnoopableContext context, TSnoopedObjectType @object, IValueContainer state) { diff --git a/sources/RevitDBExplorer/Domain/DataModel/MemberAccessors/MemberAccessorByRef.cs b/sources/RevitDBExplorer/Domain/DataModel/MemberAccessors/MemberAccessorByRef.cs index 59c41f9..eb07c92 100644 --- a/sources/RevitDBExplorer/Domain/DataModel/MemberAccessors/MemberAccessorByRef.cs +++ b/sources/RevitDBExplorer/Domain/DataModel/MemberAccessors/MemberAccessorByRef.cs @@ -28,7 +28,7 @@ public override ReadResult Read(SnoopableContext context, object @object) var resolvedArgs = ResolveArguments(paramsDef, context.Document, @object); var result = getMethod.Invoke(@object, resolvedArgs); value.SetValue(context, result); - return new ReadResult(value.ValueAsString, "[ByRef] " + value.TypeName, value.CanBeSnooped, value); + return new ReadResult(value.ValueAsString, "[ByRef] " + value.TypeHandlerName, value.CanBeSnooped, value); } public override IEnumerable Snoop(SnoopableContext context, object @object, IValueContainer state) { diff --git a/sources/RevitDBExplorer/Domain/DataModel/MemberAccessors/MemberAccessorByRefCompiled.cs b/sources/RevitDBExplorer/Domain/DataModel/MemberAccessors/MemberAccessorByRefCompiled.cs index da92c10..5e4825e 100644 --- a/sources/RevitDBExplorer/Domain/DataModel/MemberAccessors/MemberAccessorByRefCompiled.cs +++ b/sources/RevitDBExplorer/Domain/DataModel/MemberAccessors/MemberAccessorByRefCompiled.cs @@ -25,7 +25,7 @@ public override ReadResult Read(SnoopableContext context, TSnoopedObjectType typ var value = new ValueContainer(); var result = func(typedObject); value.SetValueTyped(context, result); - return new ReadResult(value.ValueAsString, "[ByRefComp] " + value.TypeName, value.CanBeSnooped, value); + return new ReadResult(value.ValueAsString, "[ByRefComp] " + value.TypeHandlerName, value.CanBeSnooped, value); } public override IEnumerable Snoop(SnoopableContext context, TSnoopedObjectType typedObject, IValueContainer state) diff --git a/sources/RevitDBExplorer/Domain/DataModel/MemberAccessors/MemberAccessorForConstValue.cs b/sources/RevitDBExplorer/Domain/DataModel/MemberAccessors/MemberAccessorForConstValue.cs index ae94800..1824590 100644 --- a/sources/RevitDBExplorer/Domain/DataModel/MemberAccessors/MemberAccessorForConstValue.cs +++ b/sources/RevitDBExplorer/Domain/DataModel/MemberAccessors/MemberAccessorForConstValue.cs @@ -21,7 +21,7 @@ public MemberAccessorForConstValue(Type type, SnoopableContext context, object v public override ReadResult Read(SnoopableContext context, object @object) { - return new ReadResult(value.ValueAsString, value.TypeName, value.CanBeSnooped, value); + return new ReadResult(value.ValueAsString, value.TypeHandlerName, value.CanBeSnooped, value); } public override IEnumerable Snoop(SnoopableContext context, object @object, IValueContainer state) { diff --git a/sources/RevitDBExplorer/Domain/DataModel/Parameters/ParameterAccessor.cs b/sources/RevitDBExplorer/Domain/DataModel/Parameters/ParameterAccessor.cs index adc9a64..2d2565a 100644 --- a/sources/RevitDBExplorer/Domain/DataModel/Parameters/ParameterAccessor.cs +++ b/sources/RevitDBExplorer/Domain/DataModel/Parameters/ParameterAccessor.cs @@ -61,7 +61,7 @@ public ReadResult Read(SnoopableContext context, object @object) case StorageType.None: break; } - return new ReadResult(value.ValueAsString, "[ByParam] " + value.TypeName, value.CanBeSnooped, value); + return new ReadResult(value.ValueAsString, "[ByParam] " + value.TypeHandlerName, value.CanBeSnooped, value); } public IEnumerable Snoop(SnoopableContext context, object @object, IValueContainer state) diff --git a/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/Base/ITypeHandler.cs b/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/Base/ITypeHandler.cs index 0b9ff6a..7a5153f 100644 --- a/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/Base/ITypeHandler.cs +++ b/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/Base/ITypeHandler.cs @@ -4,11 +4,11 @@ namespace RevitDBExplorer.Domain.DataModel.ValueContainers.Base { - internal interface ITypeHandler : IToLabel, ICanBeSnooped, ISnoop, IHaveVisualization + internal interface ITypeHandler : IHaveLabel, ISnoop, IHaveVisualization { Type Type { get; } } - internal interface ITypeHandler : IToLabel, ICanBeSnooped, ISnoop, IHaveVisualization + internal interface ITypeHandler : IHaveLabel, ISnoop, IHaveVisualization { Type Type { get; } string GetTypeHandlerName(T value); diff --git a/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/Base/IValueContainer.cs b/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/Base/IValueContainer.cs index 1b23e83..e7111b1 100644 --- a/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/Base/IValueContainer.cs +++ b/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/Base/IValueContainer.cs @@ -10,12 +10,13 @@ internal interface IValueContainer { Type Type { get; } Type TypeHandlerType { get; } - string TypeName { get; } + string TypeHandlerName { get; } IValueContainer SetValue(SnoopableContext context, object value); string ValueAsString { get; } bool CanBeSnooped { get; } + bool CanBeVisualized { get; } string ToolTip { get; } IEnumerable Snoop(); IEnumerable GetVisualization(); diff --git a/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/Base/Traits.cs b/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/Base/Traits.cs index 6704685..24de2b4 100644 --- a/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/Base/Traits.cs +++ b/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/Base/Traits.cs @@ -5,32 +5,26 @@ namespace RevitDBExplorer.Domain.DataModel.ValueContainers.Base { - internal interface ICanBeSnooped + internal interface ISnoop { bool CanBeSnooped(SnoopableContext context, object value); + IEnumerable Snoop(SnoopableContext context, object value); } - internal interface ICanBeSnooped + internal interface ISnoop { bool CanBeSnooped(SnoopableContext context, T value); + IEnumerable Snoop(SnoopableContext context, T value); } - internal interface IToLabel + + internal interface IHaveLabel { string ToLabel(SnoopableContext context, object value); } - internal interface IToLabel + internal interface IHaveLabel { string ToLabel(SnoopableContext context, T value); - } - - internal interface ISnoop - { - IEnumerable Snoop(SnoopableContext context, object value); - } - internal interface ISnoop - { - IEnumerable Snoop(SnoopableContext context, T value); - } + } internal interface IHaveToolTip @@ -38,12 +32,15 @@ internal interface IHaveToolTip string GetToolTip(SnoopableContext context, T value); } + internal interface IHaveVisualization { + bool CanBeVisualized(SnoopableContext context, object value); IEnumerable GetVisualization(SnoopableContext context, object value); } internal interface IHaveVisualization { + bool CanBeVisualized(SnoopableContext context, T value); IEnumerable GetVisualization(SnoopableContext context, T value); } } \ No newline at end of file diff --git a/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/Base/TypeHandler.cs b/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/Base/TypeHandler.cs index 8b1206a..f4f968c 100644 --- a/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/Base/TypeHandler.cs +++ b/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/Base/TypeHandler.cs @@ -24,12 +24,12 @@ public string GetTypeHandlerName(T value) - bool ICanBeSnooped.CanBeSnooped(SnoopableContext context, object value) + bool ISnoop.CanBeSnooped(SnoopableContext context, object value) { T typedValue = value.CastValue(type); - return (this as ICanBeSnooped).CanBeSnooped(context, typedValue); + return (this as ISnoop).CanBeSnooped(context, typedValue); } - bool ICanBeSnooped.CanBeSnooped(SnoopableContext context, T value) + bool ISnoop.CanBeSnooped(SnoopableContext context, T value) { if (value is null) return false; return CanBeSnoooped(context, value); @@ -51,12 +51,12 @@ IEnumerable ISnoop.Snoop(SnoopableContext context, T value) - string IToLabel.ToLabel(SnoopableContext context, object value) + string IHaveLabel.ToLabel(SnoopableContext context, object value) { T typedValue = value.CastValue(type); - return (this as IToLabel).ToLabel(context, typedValue); + return (this as IHaveLabel).ToLabel(context, typedValue); } - string IToLabel.ToLabel(SnoopableContext context, T value) + string IHaveLabel.ToLabel(SnoopableContext context, T value) { if (value is null) return ""; var label = ToLabel(context, value); @@ -67,6 +67,20 @@ string IToLabel.ToLabel(SnoopableContext context, T value) + bool IHaveVisualization.CanBeVisualized(SnoopableContext context, object value) + { + T typedValue = value.CastValue(type); + return (this as IHaveVisualization).CanBeVisualized(context, typedValue); + } + bool IHaveVisualization.CanBeVisualized(SnoopableContext context, T value) + { + if (value is null) return false; + return CanBeVisualized(context, value); + } + protected virtual bool CanBeVisualized(SnoopableContext context, T value) => false; + + + IEnumerable IHaveVisualization.GetVisualization(SnoopableContext context, object value) { T typedValue = value.CastValue(type); diff --git a/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/Base/ValueContainer.cs b/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/Base/ValueContainer.cs index c61eb1f..7876024 100644 --- a/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/Base/ValueContainer.cs +++ b/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/Base/ValueContainer.cs @@ -16,7 +16,7 @@ internal sealed class ValueContainer : IValueContainer public Type TypeHandlerType => typeHandler.GetType(); public Type Type => typeHandler.Type; public T Value => value; - public string TypeName + public string TypeHandlerName { get { @@ -38,10 +38,9 @@ public ValueContainer() public IValueContainer SetValue(SnoopableContext context, object value) - { - this.context = context; - this.value = value.CastValue(Type); - + { + SetValueTyped(context, value.CastValue(Type)); + return this; } public ValueContainer SetValueTyped(SnoopableContext context, T value) @@ -55,6 +54,7 @@ public ValueContainer SetValueTyped(SnoopableContext context, T value) public string ValueAsString => typeHandler?.ToLabel(context, value) ?? "RDBE Error"; public bool CanBeSnooped => typeHandler.CanBeSnooped(context, value); + public bool CanBeVisualized => typeHandler.CanBeVisualized(context, value); public string ToolTip { diff --git a/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/BindingMapHandler.cs b/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/BindingMapHandler.cs index 695095b..f0994c1 100644 --- a/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/BindingMapHandler.cs +++ b/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/BindingMapHandler.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using Autodesk.Revit.DB; +using NSourceGenerators; using RevitDBExplorer.Domain.DataModel.ValueContainers.Base; // (c) Revit Database Explorer https://github.com/NeVeSpl/RevitDBExplorer/blob/main/license.md @@ -8,8 +9,10 @@ namespace RevitDBExplorer.Domain.DataModel.ValueContainers { internal class BindingMapHandler : TypeHandler { - protected override bool CanBeSnoooped(SnoopableContext context, BindingMap map) => map is not null && !map.IsEmpty; - protected override string ToLabel(SnoopableContext context, BindingMap map) => $"Bindings : {map.Size}"; + protected override bool CanBeSnoooped(SnoopableContext context, BindingMap map) => !map.IsEmpty; + protected override string ToLabel(SnoopableContext context, BindingMap map) => Labeler.GetLabelForCollection("Binding", map.Size); + + [CodeToString] protected override IEnumerable Snooop(SnoopableContext context, BindingMap map) { var iterator = map.ForwardIterator(); diff --git a/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/BoundarySegmentHandler.cs b/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/BoundarySegmentHandler.cs index 0946a59..cb6791a 100644 --- a/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/BoundarySegmentHandler.cs +++ b/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/BoundarySegmentHandler.cs @@ -1,4 +1,6 @@ -using Autodesk.Revit.DB; +using System.Collections.Generic; +using Autodesk.Revit.DB; +using NSourceGenerators; using RevitDBExplorer.Domain.DataModel.ValueContainers.Base; // (c) Revit Database Explorer https://github.com/NeVeSpl/RevitDBExplorer/blob/main/license.md @@ -7,11 +9,16 @@ namespace RevitDBExplorer.Domain.DataModel.ValueContainers { internal class BoundarySegmentHandler : TypeHandler { - protected override bool CanBeSnoooped(SnoopableContext context, BoundarySegment boundarySegment) => boundarySegment is not null; - + protected override bool CanBeSnoooped(SnoopableContext context, BoundarySegment boundarySegment) => true; protected override string ToLabel(SnoopableContext context, BoundarySegment boundarySegment) { return $"ID: {boundarySegment.ElementId}, {boundarySegment.GetCurve()?.Length} ft"; ; } + + [CodeToString] + protected override IEnumerable Snooop(SnoopableContext context, BoundarySegment boundarySegment) + { + yield return new SnoopableObject(context.Document, boundarySegment); + } } } \ No newline at end of file diff --git a/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/ElementIdHandler.cs b/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/ElementIdHandler.cs index e0c082b..aaff495 100644 --- a/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/ElementIdHandler.cs +++ b/sources/RevitDBExplorer/Domain/DataModel/ValueContainers/ElementIdHandler.cs @@ -33,7 +33,7 @@ protected override string ToLabel(SnoopableContext context, ElementId id) var element = context.Document?.GetElement(id); if (element != null) { - return (new ElementHandler() as IToLabel).ToLabel(context, element); + return (new ElementHandler() as IHaveLabel).ToLabel(context, element); } return $"{id}"; } diff --git a/tests/ValueContainersTests.cs b/tests/ValueContainersTests.cs index 28a604c..69d6e09 100644 --- a/tests/ValueContainersTests.cs +++ b/tests/ValueContainersTests.cs @@ -13,7 +13,7 @@ namespace RevitDBExplorer.Tests public class ValueContainersTests { [RevitTestMethod] - public void SelectTypeHandlerFor_BuiltInParameter(RevitContext revitContext) + public void TypeHandlerFor_BuiltInParameter(RevitContext revitContext) { var type = typeof(BuiltInParameter); var typeHandler = ValueContainerFactory.SelectTypeHandlerFor(type); @@ -23,7 +23,7 @@ public void SelectTypeHandlerFor_BuiltInParameter(RevitContext revitContext) } [RevitTestMethod] - public void SelectTypeHandlerFor_Long(RevitContext revitContext) + public void TypeHandlerFor_Long(RevitContext revitContext) { var type = typeof(long); var typeHandler = ValueContainerFactory.SelectTypeHandlerFor(type); @@ -34,7 +34,7 @@ public void SelectTypeHandlerFor_Long(RevitContext revitContext) [RevitTestMethod] - public void CreateValueContainerFor_BuiltInParameter(RevitContext revitContext) + public void ValueContainerFor_BuiltInParameter(RevitContext revitContext) { var document = OpenRevitFile(revitContext); @@ -46,10 +46,27 @@ public void CreateValueContainerFor_BuiltInParameter(RevitContext revitContext) Assert.AreEqual(typeof(EnumHandler), valueContainer.TypeHandlerType); Assert.AreEqual(typeof(System.Enum), valueContainer.Type); - Assert.AreEqual("Enum : BuiltInParameter", valueContainer.TypeName); - Assert.AreEqual("BuiltInParameter.FUNCTION_PARAM", valueContainer.ValueAsString); + Assert.AreEqual("Enum : BuiltInParameter", valueContainer.TypeHandlerName); + Assert.AreEqual("BuiltInParameter.FUNCTION_PARAM", valueContainer.ValueAsString); - + document.Close(false); + } + + [RevitTestMethod] + public void ValueContainerFor_Wall(RevitContext revitContext) + { + var document = OpenRevitFile(revitContext); + + var wall = new FilteredElementCollector(document).WhereElementIsNotElementType().OfClass(typeof(Wall)).FirstElement(); + var valueContainer = ValueContainerFactory.Create(typeof(Wall)); + valueContainer.SetValue(new SnoopableContext() { Document = document }, wall); + + Assert.AreEqual(typeof(ValueContainer), valueContainer.GetType()); + Assert.AreEqual(typeof(ElementHandler), valueContainer.TypeHandlerType); + Assert.AreEqual(typeof(Element), valueContainer.Type); + + Assert.AreEqual("Element : Wall", valueContainer.TypeHandlerName); + Assert.AreEqual("Basic Wall: Generic - 200mm (420680)", valueContainer.ValueAsString); document.Close(false); }