Skip to content

Commit

Permalink
improve the generation of invocations for static methods
Browse files Browse the repository at this point in the history
  • Loading branch information
NeVeSpl committed May 18, 2024
1 parent 500e418 commit 0a756f4
Show file tree
Hide file tree
Showing 24 changed files with 289 additions and 104 deletions.
2 changes: 1 addition & 1 deletion sources/RevitDBExplorer/Application.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public Result OnStartup(UIControlledApplication application)

var panel = application.CreateRibbonPanel("Explorer");
var cmdType = typeof(Command);
var pushButtonData = new PushButtonData(cmdType.FullName, "Revit DB\r\nExplorer", cmdType.Assembly.Location, cmdType.FullName);
var pushButtonData = new PushButtonData(cmdType.FullName, "Revit\r\nExplorer", cmdType.Assembly.Location, cmdType.FullName);
pushButtonData.Image = new BitmapImage(new Uri("pack://application:,,,/RevitDBExplorer;component/Resources/RDBE.Icon.16.png", UriKind.RelativeOrAbsolute));
pushButtonData.LargeImage = new BitmapImage(new Uri("pack://application:,,,/RevitDBExplorer;component/Resources/RDBE.Icon.32.png", UriKind.RelativeOrAbsolute));
panel.AddItem(pushButtonData);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,8 @@ internal class MemberOverride<TForType> : IMemberOverride

public static IMemberOverride ByFunc<TReturnType>(Expression<Func<Document, TForType, TReturnType>> getter)
{
var compiledGetter = getter.Compile();
var methodCallExpression = getter.Body as MethodCallExpression;

string syntax = methodCallExpression.ToCeSharp();
var compiledGetter = getter.Compile();
string syntax = getter.ToCeSharp();
var uniqueId = getter.GetUniqueId();

return new MemberOverride<TForType>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public static ISnoopableMemberTemplate Create<TReturnType>(Expression<Func<Docum
var memberAccessor = new MemberAccessorByFunc<TForType, TReturnType>(compiledGetter);

memberAccessor.UniqueId = $"{typeof(TForType).Name}_{getter.GetUniqueId()}";
memberAccessor.DefaultInvocation.Syntax = methodCallExpression.ToCeSharp();
memberAccessor.DefaultInvocation.Syntax = getter.ToCeSharp();

return WithCustomAC(methodCallExpression.Method.DeclaringType, methodCallExpression.Method.Name, memberAccessor, canBeUsed, kind, () => RevitDocumentationReader.GetMethodComments(methodCallExpression.Method));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System.Collections.Generic;
using RevitDBExplorer.Domain.DataModel.Members;
using RevitDBExplorer.Domain.DataModel.Members.Base;

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

namespace RevitDBExplorer.Domain.DataModel.MembersOverrides
{
internal class Application_Overrides : IHaveMembersOverrides
{
public IEnumerable<IMemberOverride> GetOverrides() =>
[
MemberOverride<Autodesk.Revit.ApplicationServices.Application>.ByFunc((document, element) => Autodesk.Revit.ApplicationServices.Application.GetFailureDefinitionRegistry()),
];
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System.Collections.Generic;
using Autodesk.Revit.DB.Visual;
using RevitDBExplorer.Domain.DataModel.Members;
using RevitDBExplorer.Domain.DataModel.Members.Base;

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

namespace RevitDBExplorer.Domain.DataModel.MembersOverrides
{
internal class AssetProperty_Overrides : IHaveMembersOverrides
{
public IEnumerable<IMemberOverride> GetOverrides() =>
[
MemberOverride<AssetProperty>.ByFunc((document, target) => AssetProperty.GetTypeName(target.Type)),
];
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using System.Collections.Generic;
using Autodesk.Revit.DB;
using RevitDBExplorer.Domain.DataModel.Members;
using RevitDBExplorer.Domain.DataModel.Members.Base;

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

namespace RevitDBExplorer.Domain.DataModel.MembersOverrides
{
internal class Category_Overrides : IHaveMembersOverrides
{
public IEnumerable<IMemberOverride> GetOverrides() =>
[
#if R2022_MIN && R2022_MAX
MemberOverride<Category>.ByFunc((doc, category) => Category.GetBuiltInCategoryTypeId((BuiltInCategory)category.Id.IntegerValue)),
#endif
#if R2023_MIN
MemberOverride<Category>.ByFunc((doc, category) => Category.GetBuiltInCategoryTypeId(category.BuiltInCategory)),
#endif
];
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System.Collections.Generic;
using Autodesk.Revit.DB;
using RevitDBExplorer.Domain.DataModel.Members;
using RevitDBExplorer.Domain.DataModel.Members.Base;

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

namespace RevitDBExplorer.Domain.DataModel.MembersOverrides
{
internal class XYZ_Overrides : IHaveMembersOverrides
{
public IEnumerable<IMemberOverride> GetOverrides() =>
[
MemberOverride<XYZ>.ByFunc((doc, point) => XYZ.IsWithinLengthLimits(point)),
];
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using System.Collections.Generic;
using Autodesk.Revit.DB;
using RevitDBExplorer.Domain.DataModel.Members;
using RevitDBExplorer.Domain.DataModel.Members.Base;

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

namespace RevitDBExplorer.Domain.DataModel.MembersTemplates
{
internal class Application_Templates : IHaveMemberTemplates
{
public IEnumerable<ISnoopableMemberTemplate> GetTemplates() =>
[
MemberTemplate<Autodesk.Revit.ApplicationServices.Application>.Create((doc, category) => FormulaManager.GetFunctions()),
MemberTemplate<Autodesk.Revit.ApplicationServices.Application>.Create((doc, category) => FormulaManager.GetOperators()),
];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ public IEnumerable<ISnoopableMemberTemplate> GetTemplates() =>
MemberTemplate<BoundingBoxXYZ>.WithCustomAC(typeof(BoundingBoxXYZ), "BoundingBoxIntersectsFilter", new BoundingBox_BoundingBoxIntersectsFilter(), kind: MemberKind.Extra, documentationFactoryMethod: () => new DocXml() { Summary ="TEST" }),
];
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using System.Collections.Generic;
using Autodesk.Revit.DB;
using RevitDBExplorer.Domain.DataModel.Members;
using RevitDBExplorer.Domain.DataModel.Members.Base;

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

namespace RevitDBExplorer.Domain.DataModel.MembersTemplates
{
internal class Category_Templates : IHaveMemberTemplates
{
public IEnumerable<ISnoopableMemberTemplate> GetTemplates() =>
[
#if R2022_MIN
MemberTemplate<Category>.Create((doc, category) => ParameterFilterUtilities.GetFilterableParametersInCommon(doc, new[] { category.Id } )),
#endif
];
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Lighting;
using Autodesk.Revit.DB.Structure;
using RevitDBExplorer.Domain.DataModel.Members;
using RevitDBExplorer.Domain.DataModel.Members.Base;

Expand All @@ -9,14 +10,25 @@
namespace RevitDBExplorer.Domain.DataModel.MembersTemplates
{
internal class Document_Templates : IHaveMemberTemplates
{
{
public IEnumerable<ISnoopableMemberTemplate> GetTemplates() =>
[
MemberTemplate<Document>.Create((doc, target) => BasicFileInfo.Extract(target.PathName), kind: MemberKind.StaticMethod),

MemberTemplate<Document>.Create((doc, target) => BasePoint.GetSurveyPoint(doc), kind: MemberKind.StaticMethod),
MemberTemplate<Document>.Create((doc, target) => BasePoint.GetProjectBasePoint(doc), kind: MemberKind.StaticMethod),
MemberTemplate<Document>.Create((doc, target) => InternalOrigin.Get(doc), kind: MemberKind.StaticMethod),
];

MemberTemplate<Document>.Create((doc, target) => GlobalParametersManager.AreGlobalParametersAllowed(doc)),
MemberTemplate<Document>.Create((doc, target) => GlobalParametersManager.GetAllGlobalParameters(doc)),
MemberTemplate<Document>.Create((doc, target) => GlobalParametersManager.GetGlobalParametersOrdered(doc)),

MemberTemplate<Document>.Create((doc, target) => LightGroupManager.GetLightGroupManager(doc)),
#if R2022_MIN
MemberTemplate<Document>.Create((doc, target) => TemporaryGraphicsManager.GetTemporaryGraphicsManager(doc)),
#endif
#if R2023_MIN
MemberTemplate<Document>.Create((doc, target) => AnalyticalToPhysicalAssociationManager.GetAnalyticalToPhysicalAssociationManager(doc)),
#endif
];
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using System.Collections.Generic;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.DB.Structure.StructuralSections;
using RevitDBExplorer.Domain.DataModel.Members;
using RevitDBExplorer.Domain.DataModel.Members.Base;
using RevitDBExplorer.Domain.DataModel.MembersTemplates.Accessors;
Expand All @@ -15,21 +14,24 @@ internal class Element_Templates : IHaveMemberTemplates
public IEnumerable<ISnoopableMemberTemplate> GetTemplates() =>
[
MemberTemplate<Element>.Create((doc, target) => doc.ActiveView.GetElementOverrides(target.Id), kind: MemberKind.AsArgument),
MemberTemplate<Element>.Create((doc, target) => doc.GetWorksetId(target.Id), kind: MemberKind.AsArgument),
MemberTemplate<FamilyInstance>.Create((doc, target) => StructuralSectionUtils.GetStructuralSection(doc, target.Id), kind: MemberKind.StaticMethod),
MemberTemplate<Element>.Create((doc, target) => doc.GetWorksetId(target.Id), kind: MemberKind.AsArgument),

MemberTemplate<Reference>.Create((doc, target) => doc.GetElement(target.ElementId).GetGeometryObjectFromReference(target), canBeUsed: x => x.ElementId != null, kind: MemberKind.AsArgument),

#if R2023_MIN
MemberTemplate<Element>.Create((doc, target) => AnalyticalNodeData.GetAnalyticalNodeData(target), kind: MemberKind.StaticMethod, canBeUsed: x => x is ReferencePoint),
#if R2023_MIN
MemberTemplate<Element>.WithCustomAC(typeof(AnalyticalToPhysicalAssociationManager), nameof(AnalyticalToPhysicalAssociationManager.HasAssociation), new AnalyticalToPhysicalAssociationManager_HasAssociation(), kind: MemberKind.AsArgument),
MemberTemplate<Element>.WithCustomAC(typeof(AnalyticalToPhysicalAssociationManager), nameof(AnalyticalToPhysicalAssociationManager.GetAssociatedElementId), new AnalyticalToPhysicalAssociationManager_GetAssociatedElementId(), kind: MemberKind.AsArgument),
#endif

#if R2024_MIN
MemberTemplate<Element>.Create((doc, target) => AnalyticalToPhysicalAssociationManager.IsAnalyticalElement(doc, target.Id), kind: MemberKind.StaticMethod),
MemberTemplate<Element>.Create((doc, target) => AnalyticalToPhysicalAssociationManager.IsPhysicalElement(doc, target.Id), kind: MemberKind.StaticMethod),
MemberTemplate<Element>.WithCustomAC(typeof(AnalyticalToPhysicalAssociationManager), nameof(AnalyticalToPhysicalAssociationManager.GetAssociatedElementIds), new AnalyticalToPhysicalAssociationManager_GetAssociatedElementIds(), kind: MemberKind.AsArgument),
#endif

MemberTemplate<Element>.Create((document, target) => SolidSolidCutUtils.IsAllowedForSolidCut(target)),
MemberTemplate<Element>.Create((document, target) => SolidSolidCutUtils.GetCuttingSolids(target)),
MemberTemplate<Element>.Create((document, target) => SolidSolidCutUtils.GetSolidsBeingCut(target)),

MemberTemplate<Element>.Create((document, target) => ElementTransformUtils.CanMirrorElement(document, target.Id)),
];
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System.Collections.Generic;
using Autodesk.Revit.DB;
using RevitDBExplorer.Domain.DataModel.Members;
using RevitDBExplorer.Domain.DataModel.Members.Base;

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

namespace RevitDBExplorer.Domain.DataModel.MembersTemplates
{
internal class Face_Templates : IHaveMemberTemplates
{
public IEnumerable<ISnoopableMemberTemplate> GetTemplates() =>
[
// MemberTemplate<Face>.Create((doc, target) => doc.fac, kind: MemberKind.StaticMethod),
];
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Collections.Generic;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Structure.StructuralSections;
using RevitDBExplorer.Domain.DataModel.Members;
using RevitDBExplorer.Domain.DataModel.Members.Base;

Expand All @@ -11,6 +12,11 @@ internal class FamilyInstance_Templates : IHaveMemberTemplates
{
public IEnumerable<ISnoopableMemberTemplate> GetTemplates() =>
[

MemberTemplate<FamilyInstance>.Create((doc, target) => StructuralSectionUtils.GetStructuralSection(doc, target.Id), kind: MemberKind.StaticMethod),


MemberTemplate<FamilyInstance>.Create((doc, target) => AdaptiveComponentInstanceUtils.IsAdaptiveComponentInstance(target), kind: MemberKind.StaticMethod),
MemberTemplate<FamilyInstance>.Create((doc, target) => AdaptiveComponentInstanceUtils.GetInstancePlacementPointElementRefIds(target), canBeUsed: (x)=> AdaptiveComponentInstanceUtils.IsAdaptiveComponentInstance(x) , kind: MemberKind.StaticMethod),
];
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System.Collections.Generic;
using Autodesk.Revit.DB;
using RevitDBExplorer.Domain.DataModel.Members;
using RevitDBExplorer.Domain.DataModel.Members.Base;

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

namespace RevitDBExplorer.Domain.DataModel.MembersTemplates
{
internal class FamilySymbol_Templates : IHaveMemberTemplates
{
public IEnumerable<ISnoopableMemberTemplate> GetTemplates() =>
[
MemberTemplate<FamilySymbol>.Create((doc, target) => AdaptiveComponentInstanceUtils.IsAdaptiveFamilySymbol(target), kind: MemberKind.StaticMethod),
];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ internal class Family_Templates : IHaveMemberTemplates
public IEnumerable<ISnoopableMemberTemplate> GetTemplates() =>
[
MemberTemplate<Family>.Create((doc, target) => doc.EditFamily(target), kind: MemberKind.AsArgument),
MemberTemplate<Family>.Create((doc, target) => FamilySizeTableManager.GetFamilySizeTableManager(doc, target.Id), kind: MemberKind.StaticMethod),

MemberTemplate<Family>.Create((doc, target) => FamilySizeTableManager.GetFamilySizeTableManager(doc, target.Id), kind: MemberKind.StaticMethod),
];
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System.Collections.Generic;
using System.Linq;
using Autodesk.Revit.DB;
using RevitDBExplorer.Domain.DataModel.Members;
using RevitDBExplorer.Domain.DataModel.Members.Base;
Expand All @@ -13,24 +12,19 @@ internal class ForgeTypeId_Templates : IHaveMemberTemplates
#if R2022_MIN
private static readonly HashSet<ForgeTypeId> AllDisciplines = new(UnitUtils.GetAllDisciplines());
#endif
private static readonly IEnumerable<ISnoopableMemberTemplate> ForForgeTypeId = Enumerable.Empty<ISnoopableMemberTemplate>();
private static readonly IEnumerable<ISnoopableMemberTemplate> ForCategory = Enumerable.Empty<ISnoopableMemberTemplate>();
private static readonly IEnumerable<ISnoopableMemberTemplate> ForParameter = Enumerable.Empty<ISnoopableMemberTemplate>();



static ForgeTypeId_Templates()
{
ForForgeTypeId = new ISnoopableMemberTemplate[]
{
public IEnumerable<ISnoopableMemberTemplate> GetTemplates() =>
[
#if R2022_MIN
MemberTemplate<ForgeTypeId>.Create((doc, forgeId) => Category.IsBuiltInCategory(forgeId)),
MemberTemplate<ForgeTypeId>.Create((doc, forgeId) => Category.GetBuiltInCategory(forgeId), x => Category.IsBuiltInCategory(x)),
MemberTemplate<ForgeTypeId>.Create((doc, forgeId) => doc.GetTypeOfStorage(forgeId), x=> ParameterUtils.IsBuiltInParameter(x)),
MemberTemplate<ForgeTypeId>.Create((doc, forgeId) => doc.GetUnits().GetFormatOptions(forgeId), x => UnitUtils.IsMeasurableSpec(x), Members.Base.MemberKind.AsArgument),
MemberTemplate<ForgeTypeId>.Create((doc, forgeId) => doc.GetTypeOfStorage(forgeId), x=> ParameterUtils.IsBuiltInParameter(x), MemberKind.AsArgument),
MemberTemplate<ForgeTypeId>.Create((doc, forgeId) => doc.GetUnits().GetFormatOptions(forgeId), x => UnitUtils.IsMeasurableSpec(x), MemberKind.AsArgument),
MemberTemplate<ForgeTypeId>.Create((doc, forgeId) => ParameterUtils.IsBuiltInParameter(forgeId)),
MemberTemplate<ForgeTypeId>.Create((doc, forgeId) => ParameterUtils.GetBuiltInParameter(forgeId), x=> ParameterUtils.IsBuiltInParameter(x)),
MemberTemplate<ForgeTypeId>.Create((doc, forgeId) => ParameterUtils.IsBuiltInGroup(forgeId), x => true),


MemberTemplate<ForgeTypeId>.Create((doc, forgeId) => UnitUtils.IsMeasurableSpec(forgeId)),
#endif
Expand Down Expand Up @@ -67,26 +61,6 @@ static ForgeTypeId_Templates()

MemberTemplate<ForgeTypeId>.Create((doc, forgeId) => FormatOptions.GetValidSymbols(forgeId), x => UnitUtils.IsUnit(x)),
MemberTemplate<ForgeTypeId>.Create((doc, forgeId) => FormatOptions.CanHaveSymbol(forgeId), x => UnitUtils.IsUnit(x)),
};
ForCategory = new ISnoopableMemberTemplate[]
{
#if R2022_MIN
MemberTemplate<Category>.Create((doc, category) => Category.GetBuiltInCategoryTypeId((BuiltInCategory)category.Id.Value())),
MemberTemplate<Category>.Create((doc, category) => ParameterFilterUtilities.GetFilterableParametersInCommon(doc, new[] { category.Id } )),
#endif
};
ForParameter = new ISnoopableMemberTemplate[]
{
#if R2022_MIN
MemberTemplate<Parameter>.Create((doc, parameter) => UnitFormatUtils.Format(doc.GetUnits(), parameter.Definition.GetDataType(), parameter.AsDouble(), false), x => UnitUtils.IsMeasurableSpec(x.Definition?.GetDataType())),
#endif
};
}


public IEnumerable<ISnoopableMemberTemplate> GetTemplates()
{
return ForForgeTypeId.Concat(ForCategory).Concat(ForParameter);
}
];
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using System.Collections.Generic;
using Autodesk.Revit.DB;
using RevitDBExplorer.Domain.DataModel.Members;
using RevitDBExplorer.Domain.DataModel.Members.Base;

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

namespace RevitDBExplorer.Domain.DataModel.MembersTemplates
{
internal class Parameter_Templates : IHaveMemberTemplates
{
public IEnumerable<ISnoopableMemberTemplate> GetTemplates() =>
[
#if R2022_MIN
MemberTemplate<Parameter>.Create((doc, parameter) => UnitFormatUtils.Format(doc.GetUnits(), parameter.Definition.GetDataType(), parameter.AsDouble(), false), x => UnitUtils.IsMeasurableSpec(x.Definition?.GetDataType())),
#endif
MemberTemplate<Parameter>.Create((doc, target) => GlobalParametersManager.IsValidGlobalParameter(doc, target.Id)),
MemberTemplate<Parameter>.Create((doc, target) => doc.FamilyManager.GetAssociatedFamilyParameter(target)),
];
}
}
Loading

0 comments on commit 0a756f4

Please sign in to comment.