Skip to content

Commit fb0dcbc

Browse files
committed
introduce templates for code generation
1 parent ca8149b commit fb0dcbc

22 files changed

+405
-179
lines changed

sources/RevitDBExplorer/Domain/CHMService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public static void OpenCHM()
3838
if (helpFileName != null)
3939
{
4040
System.Windows.Forms.Help.ShowHelp(null, helpFileName,
41-
System.Windows.Forms.HelpNavigator.Index,
41+
System.Windows.Forms.HelpNavigator.KeywordIndex,
4242
null
4343
);
4444
}

sources/RevitDBExplorer/Domain/DataModel/SnoopableItem.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public bool CanBeSnooped
3232
return false;
3333
}
3434
}
35+
public virtual bool CanGenerateCode { get; }
3536

3637

3738
public SnoopableItem(SnoopableObject parent, IAccessor accessor)
@@ -48,7 +49,7 @@ public void Read()
4849
if (!HasAccessor()) return;
4950
Read(parent.Context, parent.Object);
5051
}
51-
private bool HasAccessor() => accessor is not null;
52+
protected bool HasAccessor() => accessor is not null;
5253
private void Read(SnoopableContext context, object @object)
5354
{
5455
try
@@ -106,5 +107,8 @@ public void Freeze(int candies)
106107

107108
public abstract int CompareTo(SnoopableItem other);
108109
public abstract bool Equals(SnoopableItem other);
110+
111+
112+
public abstract string GenerateScript();
109113
}
110114
}

sources/RevitDBExplorer/Domain/DataModel/SnoopableMember.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using RevitDBExplorer.Domain.DataModel.Streams.Base;
2+
using RevitDBExplorer.Domain.RevitDatabaseScripting;
23

34
// (c) Revit Database Explorer https://github.com/NeVeSpl/RevitDBExplorer/blob/main/license.md
45

@@ -12,7 +13,8 @@ internal sealed class SnoopableMember : SnoopableItem
1213
public DeclaringType DeclaringType => memberDescriptor.DeclaringType;
1314
public MemberKind MemberKind => memberDescriptor.Kind;
1415
public override string Name => memberDescriptor.Name;
15-
public DocXml Documentation => memberDescriptor.Documentation;
16+
public DocXml Documentation => memberDescriptor.Documentation;
17+
public override bool CanGenerateCode => memberDescriptor.Kind != MemberKind.None;
1618

1719

1820
public SnoopableMember(SnoopableObject parent, MemberDescriptor memberDescriptor) : base(parent, memberDescriptor.MemberAccessor)
@@ -36,7 +38,6 @@ public override SourceOfObjects Snoop()
3638
}
3739

3840

39-
4041
public override int CompareTo(SnoopableItem other)
4142
{
4243
if (other is SnoopableMember snoopableMember)
@@ -54,5 +55,14 @@ public override bool Equals(SnoopableItem other)
5455
}
5556
return false;
5657
}
58+
59+
public override string GenerateScript()
60+
{
61+
if (HasAccessor())
62+
{
63+
return new MemberInvocation_SelectTemplate().Evaluate(parent.Object.GetType(), Name);
64+
}
65+
return new MemberInvocation_UpdateTemplate().Evaluate(parent.Object.GetType(), Name);
66+
}
5767
}
5868
}

sources/RevitDBExplorer/Domain/DataModel/SnoopableParameter.cs

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using RevitDBExplorer.Domain.DataModel.Parameters;
44
using RevitDBExplorer.Domain.DataModel.ValueContainers.Base;
55
using RevitDBExplorer.Domain.DataModel.ValueViewModels;
6+
using RevitDBExplorer.Domain.RevitDatabaseScripting;
67

78
// (c) Revit Database Explorer https://github.com/NeVeSpl/RevitDBExplorer/blob/main/license.md
89

@@ -12,18 +13,19 @@ internal class SnoopableParameter : SnoopableItem
1213
{
1314
private readonly Parameter parameter;
1415

15-
16+
1617
public override string Name => parameter.Definition.Name;
1718
public ParameterOrgin Orgin { get; }
18-
19+
public override bool CanGenerateCode => true;
20+
1921

2022
public SnoopableParameter(SnoopableObject parent, Parameter parameter) : base(parent, new ParameterAccessor(parameter))
2123
{
2224
this.parameter = parameter;
2325
this.Orgin = parameter.GetOrgin();
24-
}
26+
}
27+
2528

26-
2729
public override SourceOfObjects Snoop()
2830
{
2931
var title = $"{parent.Name}->{this.Name}";
@@ -33,7 +35,7 @@ public override SourceOfObjects Snoop()
3335
public SourceOfObjects SnoopParameter()
3436
{
3537
var snoopableObject = new SnoopableObject(parent.Context.Document, parameter);
36-
var title = $"{parent.Name}: {snoopableObject.Name}";
38+
var title = $"{parent.Name}: {snoopableObject.Name}";
3739
var source = new SourceOfObjects(new[] { snoopableObject }) { Info = new InfoAboutSource(title) };
3840
return source;
3941
}
@@ -58,7 +60,7 @@ public string GenerateQueryForForParameterValue()
5860
break;
5961
case StorageType.Double:
6062
var vcd = presenter.ValueContainer as ValueContainer<double>;
61-
63+
6264

6365
var units = Application.UIApplication?.ActiveUIDocument?.Document?.GetUnits();
6466
#if R2022b
@@ -100,8 +102,7 @@ public string GenerateQueryForForParameterValue()
100102
return $"p: {name} {value}";
101103
}
102104

103-
104-
#region IComparable & IEquatable
105+
105106
public override int CompareTo(SnoopableItem other)
106107
{
107108
if (other is SnoopableParameter snoopableParameter)
@@ -118,6 +119,22 @@ public override bool Equals(SnoopableItem other)
118119
}
119120
return false;
120121
}
121-
#endregion
122+
123+
124+
public override string GenerateScript()
125+
{
126+
if (parameter.IsShared)
127+
{
128+
return new ParameterShared_UpdateTemplate().Evaluate(parameter.GUID);
129+
}
130+
if (parameter.Definition is InternalDefinition internalDef)
131+
{
132+
if (internalDef.BuiltInParameter != BuiltInParameter.INVALID)
133+
{
134+
return new ParameterBuiltIn_UpdateTemplate().Evaluate(internalDef.BuiltInParameter);
135+
}
136+
}
137+
return new ParameterProject_UpdateTemplate().Evaluate(parameter.Definition.Name);
138+
}
122139
}
123140
}

sources/RevitDBExplorer/Domain/RevitDatabaseScripting/CodeGenerator.cs

Lines changed: 0 additions & 83 deletions
This file was deleted.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
7+
// (c) Revit Database Explorer https://github.com/NeVeSpl/RevitDBExplorer/blob/main/license.md
8+
9+
namespace RevitDBExplorer.Domain.RevitDatabaseScripting.Dummies
10+
{
11+
internal class TypePlaceholder
12+
{
13+
public object MethodPlaceholder()
14+
{
15+
return null;
16+
}
17+
}
18+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using NSourceGenerators;
4+
using RevitDBExplorer.Domain.RevitDatabaseScripting.Dummies;
5+
6+
// (c) Revit Database Explorer https://github.com/NeVeSpl/RevitDBExplorer/blob/main/license.md
7+
8+
namespace RevitDBExplorer.Domain.RevitDatabaseScripting
9+
{
10+
internal class MemberInvocation_SelectTemplate
11+
{
12+
public string Evaluate(System.Type type, string m)
13+
{
14+
var template = GetTemplate();
15+
var result = template.ReplaceMany(new[]
16+
{
17+
("TypePlaceholder", type.GetCSharpName()),
18+
("MethodPlaceholder()", m)
19+
});
20+
21+
return result;
22+
}
23+
24+
25+
public string GetTemplate()
26+
{
27+
return CodeToStringRepo.GetText(nameof(MemberInvocation_SelectTemplate), true);
28+
}
29+
30+
31+
[CodeToString(nameof(MemberInvocation_SelectTemplate))]
32+
IEnumerable<object> Select(IEnumerable<TypePlaceholder> inputs)
33+
{
34+
foreach (var item in inputs)
35+
{
36+
yield return item.MethodPlaceholder();
37+
}
38+
}
39+
}
40+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using NSourceGenerators;
4+
using RevitDBExplorer.Domain.RevitDatabaseScripting.Dummies;
5+
6+
// (c) Revit Database Explorer https://github.com/NeVeSpl/RevitDBExplorer/blob/main/license.md
7+
8+
namespace RevitDBExplorer.Domain.RevitDatabaseScripting
9+
{
10+
internal class MemberInvocation_UpdateTemplate
11+
{
12+
public string Evaluate(System.Type type, string m)
13+
{
14+
var template = GetTemplate();
15+
var result = template.ReplaceMany(new[]
16+
{
17+
("TypePlaceholder", type.GetCSharpName()),
18+
("MethodPlaceholder()", m)
19+
});
20+
21+
return result;
22+
}
23+
24+
25+
public string GetTemplate()
26+
{
27+
return CodeToStringRepo.GetText(nameof(MemberInvocation_UpdateTemplate), true);
28+
}
29+
30+
31+
[CodeToString(nameof(MemberInvocation_UpdateTemplate))]
32+
void Update(IEnumerable<TypePlaceholder> inputs)
33+
{
34+
foreach (var item in inputs)
35+
{
36+
item.MethodPlaceholder();
37+
}
38+
}
39+
}
40+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using Autodesk.Revit.DB;
4+
using NSourceGenerators;
5+
6+
// (c) Revit Database Explorer https://github.com/NeVeSpl/RevitDBExplorer/blob/main/license.md
7+
8+
namespace RevitDBExplorer.Domain.RevitDatabaseScripting
9+
{
10+
internal class ParameterBuiltIn_UpdateTemplate
11+
{
12+
public string Evaluate(BuiltInParameter parameter)
13+
{
14+
var template = GetTemplate();
15+
var result = template.ReplaceMany(new[]
16+
{
17+
("HOST_AREA_COMPUTED", parameter.ToString()),
18+
});
19+
20+
return result;
21+
}
22+
23+
24+
public string GetTemplate()
25+
{
26+
return CodeToStringRepo.GetText(nameof(ParameterBuiltIn_UpdateTemplate), true);
27+
}
28+
29+
30+
[CodeToString(nameof(ParameterBuiltIn_UpdateTemplate))]
31+
void Update(Document document, IEnumerable<Element> elements)
32+
{
33+
foreach (var element in elements)
34+
{
35+
var param = element.get_Parameter(BuiltInParameter.HOST_AREA_COMPUTED);
36+
if (param?.IsReadOnly == false)
37+
{
38+
param.Set(0);
39+
}
40+
}
41+
}
42+
}
43+
}

0 commit comments

Comments
 (0)