diff --git a/AddInManager.sln b/AddInManager.sln index 436368c..461e335 100644 --- a/AddInManager.sln +++ b/AddInManager.sln @@ -28,6 +28,8 @@ Global Debug R23|Any CPU = Debug R23|Any CPU Debug R24|Any CPU = Debug R24|Any CPU Debug R25|Any CPU = Debug R25|Any CPU + Debug R26|Any CPU = Debug R26|Any CPU + Debug R27|Any CPU = Debug R27|Any CPU Installer|Any CPU = Installer|Any CPU Release R19|Any CPU = Release R19|Any CPU Release R20|Any CPU = Release R20|Any CPU @@ -67,6 +69,10 @@ Global {C872CDA2-93F5-4681-BD2F-207EACF83D2E}.Release R26|Any CPU.Build.0 = Release R26|Any CPU {C872CDA2-93F5-4681-BD2F-207EACF83D2E}.Release R27|Any CPU.ActiveCfg = Release R27|Any CPU {C872CDA2-93F5-4681-BD2F-207EACF83D2E}.Release R27|Any CPU.Build.0 = Release R27|Any CPU + {C872CDA2-93F5-4681-BD2F-207EACF83D2E}.Debug R26|Any CPU.ActiveCfg = Debug R26|Any CPU + {C872CDA2-93F5-4681-BD2F-207EACF83D2E}.Debug R26|Any CPU.Build.0 = Debug R26|Any CPU + {C872CDA2-93F5-4681-BD2F-207EACF83D2E}.Debug R27|Any CPU.ActiveCfg = Debug R27|Any CPU + {C872CDA2-93F5-4681-BD2F-207EACF83D2E}.Debug R27|Any CPU.Build.0 = Debug R27|Any CPU {E3C87D34-638C-47A0-A73A-D967B119458D}.Debug R22|Any CPU.ActiveCfg = Debug|Any CPU {E3C87D34-638C-47A0-A73A-D967B119458D}.Debug R23|Any CPU.ActiveCfg = Debug|Any CPU {E3C87D34-638C-47A0-A73A-D967B119458D}.Debug R24|Any CPU.ActiveCfg = Debug|Any CPU @@ -82,6 +88,8 @@ Global {E3C87D34-638C-47A0-A73A-D967B119458D}.Release R25|Any CPU.ActiveCfg = Release|Any CPU {E3C87D34-638C-47A0-A73A-D967B119458D}.Release R26|Any CPU.ActiveCfg = Release|Any CPU {E3C87D34-638C-47A0-A73A-D967B119458D}.Release R27|Any CPU.ActiveCfg = Release|Any CPU + {E3C87D34-638C-47A0-A73A-D967B119458D}.Debug R26|Any CPU.ActiveCfg = Debug|Any CPU + {E3C87D34-638C-47A0-A73A-D967B119458D}.Debug R27|Any CPU.ActiveCfg = Debug|Any CPU {5016ED6D-5A9A-4F59-AE49-CAA9615798F7}.Debug R22|Any CPU.ActiveCfg = Debug|Any CPU {5016ED6D-5A9A-4F59-AE49-CAA9615798F7}.Debug R23|Any CPU.ActiveCfg = Debug|Any CPU {5016ED6D-5A9A-4F59-AE49-CAA9615798F7}.Debug R24|Any CPU.ActiveCfg = Debug|Any CPU @@ -96,6 +104,8 @@ Global {5016ED6D-5A9A-4F59-AE49-CAA9615798F7}.Release R25|Any CPU.ActiveCfg = Release|Any CPU {5016ED6D-5A9A-4F59-AE49-CAA9615798F7}.Release R26|Any CPU.ActiveCfg = Release|Any CPU {5016ED6D-5A9A-4F59-AE49-CAA9615798F7}.Release R27|Any CPU.ActiveCfg = Release|Any CPU + {5016ED6D-5A9A-4F59-AE49-CAA9615798F7}.Debug R26|Any CPU.ActiveCfg = Debug|Any CPU + {5016ED6D-5A9A-4F59-AE49-CAA9615798F7}.Debug R27|Any CPU.ActiveCfg = Debug|Any CPU {1661572C-EF3A-4DD6-83BD-CB4239CE8CDD}.Debug R22|Any CPU.ActiveCfg = Debug R22|Any CPU {1661572C-EF3A-4DD6-83BD-CB4239CE8CDD}.Debug R22|Any CPU.Build.0 = Debug R22|Any CPU {1661572C-EF3A-4DD6-83BD-CB4239CE8CDD}.Debug R23|Any CPU.ActiveCfg = Debug R23|Any CPU @@ -113,6 +123,8 @@ Global {1661572C-EF3A-4DD6-83BD-CB4239CE8CDD}.Release R27|Any CPU.ActiveCfg = Release R27|Any CPU {1661572C-EF3A-4DD6-83BD-CB4239CE8CDD}.Debug R25|Any CPU.ActiveCfg = Debug R25|Any CPU {1661572C-EF3A-4DD6-83BD-CB4239CE8CDD}.Debug R25|Any CPU.Build.0 = Debug R25|Any CPU + {1661572C-EF3A-4DD6-83BD-CB4239CE8CDD}.Debug R26|Any CPU.ActiveCfg = Debug R26|Any CPU + {1661572C-EF3A-4DD6-83BD-CB4239CE8CDD}.Debug R27|Any CPU.ActiveCfg = Debug R27|Any CPU {21460D85-C4AD-49D5-963F-CF13C4AE99EB}.Debug R22|Any CPU.ActiveCfg = Debug R22|Any CPU {21460D85-C4AD-49D5-963F-CF13C4AE99EB}.Debug R22|Any CPU.Build.0 = Debug R22|Any CPU {21460D85-C4AD-49D5-963F-CF13C4AE99EB}.Debug R23|Any CPU.ActiveCfg = Debug R23|Any CPU @@ -140,6 +152,10 @@ Global {21460D85-C4AD-49D5-963F-CF13C4AE99EB}.Release R26|Any CPU.Build.0 = Release R26|Any CPU {21460D85-C4AD-49D5-963F-CF13C4AE99EB}.Release R27|Any CPU.ActiveCfg = Release R27|Any CPU {21460D85-C4AD-49D5-963F-CF13C4AE99EB}.Release R27|Any CPU.Build.0 = Release R27|Any CPU + {21460D85-C4AD-49D5-963F-CF13C4AE99EB}.Debug R26|Any CPU.ActiveCfg = Debug R26|Any CPU + {21460D85-C4AD-49D5-963F-CF13C4AE99EB}.Debug R26|Any CPU.Build.0 = Debug R26|Any CPU + {21460D85-C4AD-49D5-963F-CF13C4AE99EB}.Debug R27|Any CPU.ActiveCfg = Debug R27|Any CPU + {21460D85-C4AD-49D5-963F-CF13C4AE99EB}.Debug R27|Any CPU.Build.0 = Debug R27|Any CPU {DA609427-F086-4C79-A5FA-202DBB5DE48D}.Debug R22|Any CPU.ActiveCfg = Debug|Any CPU {DA609427-F086-4C79-A5FA-202DBB5DE48D}.Debug R22|Any CPU.Build.0 = Debug|Any CPU {DA609427-F086-4C79-A5FA-202DBB5DE48D}.Debug R23|Any CPU.ActiveCfg = Debug|Any CPU @@ -157,6 +173,8 @@ Global {DA609427-F086-4C79-A5FA-202DBB5DE48D}.Release R25|Any CPU.ActiveCfg = Release|Any CPU {DA609427-F086-4C79-A5FA-202DBB5DE48D}.Release R26|Any CPU.ActiveCfg = Release|Any CPU {DA609427-F086-4C79-A5FA-202DBB5DE48D}.Release R27|Any CPU.ActiveCfg = Release|Any CPU + {DA609427-F086-4C79-A5FA-202DBB5DE48D}.Debug R26|Any CPU.ActiveCfg = Debug|Any CPU + {DA609427-F086-4C79-A5FA-202DBB5DE48D}.Debug R27|Any CPU.ActiveCfg = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/AddInManager/Command/AddinManagerBase.cs b/AddInManager/Command/AddinManagerBase.cs index 51fcabe..384c76a 100644 --- a/AddInManager/Command/AddinManagerBase.cs +++ b/AddInManager/Command/AddinManagerBase.cs @@ -170,7 +170,7 @@ public static AddinManagerBase Instance private AddinManagerBase() { - _addinManager = new AddinManager(); + _addinManager = null; // initialized dynamically later when version is available _activeCmd = null; _activeCmdItem = null; _activeApp = null; diff --git a/AddInManager/Properties/App.Designer.cs b/AddInManager/Properties/App.Designer.cs index 9ba9c1b..594464b 100644 --- a/AddInManager/Properties/App.Designer.cs +++ b/AddInManager/Properties/App.Designer.cs @@ -81,5 +81,17 @@ public double AppTop { this["AppTop"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool IsSeparateVersion { + get { + return ((bool)(this["IsSeparateVersion"])); + } + set { + this["IsSeparateVersion"] = value; + } + } } } diff --git a/AddInManager/Properties/App.settings b/AddInManager/Properties/App.settings index e28bc87..32b3f84 100644 --- a/AddInManager/Properties/App.settings +++ b/AddInManager/Properties/App.settings @@ -17,6 +17,9 @@ 0 + + False + diff --git a/AddInManager/View/FrmAddInManager.xaml b/AddInManager/View/FrmAddInManager.xaml index 68b4f22..19d50b5 100644 --- a/AddInManager/View/FrmAddInManager.xaml +++ b/AddInManager/View/FrmAddInManager.xaml @@ -60,7 +60,7 @@ Margin="1,0,5,0" VerticalAlignment="Center" PreviewKeyDown="HandleTextboxKeyPress" - Text="{Binding SearchText, Mode=TwoWay,Delay=200, UpdateSourceTrigger=PropertyChanged}"> + Text="{Binding SearchText, Mode=TwoWay, Delay=200, UpdateSourceTrigger=PropertyChanged}"> + OnPropertyChanged(ref isCurrentVersion, value); } + public bool IsSeparateVersion + { + get => Properties.App.Default.IsSeparateVersion; + set + { + if (Properties.App.Default.IsSeparateVersion == value) return; + Properties.App.Default.IsSeparateVersion = value; + Properties.App.Default.Save(); + OnPropertyChanged(); + + // Reload commands/apps list + MAddinManagerBase.AddinManager = new AddinManager(ExternalCommandData.Application.Application.VersionNumber); + CommandItems = FreshTreeItems(false, MAddinManagerBase.AddinManager.Commands); + ApplicationItems = FreshTreeItems(false, MAddinManagerBase.AddinManager.Applications); + FreshSearchClick(); + } + } + private ObservableCollection addinStartup; public ObservableCollection AddInStartUps @@ -250,6 +268,16 @@ public AddInManagerViewModel(ExternalCommandData data, ref string message, Eleme { AssemLoader = new AssemLoader(); MAddinManagerBase = AddinManagerBase.Instance; + // Make sure AddinManager uses the correct revit version if needed + if (MAddinManagerBase.AddinManager == null) + { + MAddinManagerBase.AddinManager = new AddinManager(data.Application.Application.VersionNumber); + } + else if (Properties.App.Default.IsSeparateVersion) + { + // if we missed setting it properly before due to no commandData at Instance creation + MAddinManagerBase.AddinManager = new AddinManager(data.Application.Application.VersionNumber); + } CommandItems = FreshTreeItems(false, MAddinManagerBase.AddinManager.Commands); ApplicationItems = FreshTreeItems(false, MAddinManagerBase.AddinManager.Applications); ExternalCommandData = data; diff --git a/AddInManager/ViewModel/AddinManager.cs b/AddInManager/ViewModel/AddinManager.cs index d68449f..9e7cbaf 100644 --- a/AddInManager/ViewModel/AddinManager.cs +++ b/AddInManager/ViewModel/AddinManager.cs @@ -13,11 +13,11 @@ public class AddinManager public AddinsCommand Commands => commands; public int CmdCount => commands.Count; - public AddinManager() + public AddinManager(string revitVersion = "") { commands = new AddinsCommand(); applications = new AddinsApplication(); - GetIniFilePaths(); + GetIniFilePaths(revitVersion); ReadAddinsFromAimIni(); } @@ -29,10 +29,14 @@ public IniFile RevitIniFile set => revitIniFile = value; } - private void GetIniFilePaths() + private void GetIniFilePaths(string revitVersion) { var folderPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); var path = Path.Combine(folderPath, Resource.AppName); + if (Properties.App.Default.IsSeparateVersion && !string.IsNullOrEmpty(revitVersion)) + { + path = Path.Combine(path, revitVersion); + } var filePath = Path.Combine(path, DefaultSetting.AimInternalName); aimIniFile = new IniFile(filePath); var currentProcess = Process.GetCurrentProcess(); diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a444bd..ce321b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,6 @@ # Changelog +- 2026-06-12 **1.6.3** + - Add option load separate version Revit. - 2026-05-27 **1.6.2** - Support Revit 2027 Release - 2026-02-09 **1.6.1** diff --git a/Installer/Installer.cs b/Installer/Installer.cs index 09909a0..c54b5f1 100644 --- a/Installer/Installer.cs +++ b/Installer/Installer.cs @@ -14,7 +14,7 @@ const string projectName = "RevitAddinManager"; const string outputName = "RevitAddinManager"; const string outputDir = "output"; -const string version = "1.6.2"; +const string version = "1.6.3"; var fileName = new StringBuilder().Append(outputName).Append("-").Append(version); var project = new Project diff --git a/Test/Sample/BenchmarkCommand/CategoriesCommand.cs b/Test/Sample/BenchmarkCommand/CategoriesCommand.cs index 3ca029d..e4f1164 100644 --- a/Test/Sample/BenchmarkCommand/CategoriesCommand.cs +++ b/Test/Sample/BenchmarkCommand/CategoriesCommand.cs @@ -106,7 +106,7 @@ private double CountAssemblyCode(List elements) var familySymbols = elements.Select(x => x.Document.GetElement(x.GetTypeId()) as FamilySymbol); foreach (FamilySymbol familySymbol in familySymbols) { - string? assemblyCode = familySymbol?.get_Parameter(BuiltInParameter.UNIFORMAT_CODE)?.AsValueString(); + string? assemblyCode = familySymbol?.get_Parameter(BuiltInParameter.ASSEMBLY_CODE)?.AsValueString(); if (assemblyCode != null) names.Add(assemblyCode); } return names.Distinct().Count(); diff --git a/Test/Sample/ImportExportAssCodeFamily.cs b/Test/Sample/ImportExportAssCodeFamily.cs index 35c8d40..ff81985 100644 --- a/Test/Sample/ImportExportAssCodeFamily.cs +++ b/Test/Sample/ImportExportAssCodeFamily.cs @@ -101,7 +101,7 @@ public Result Execute(ExternalCommandData commandData, ref string message, Eleme if (symbol != null) { - Parameter assemblyCodeParam = symbol.get_Parameter(BuiltInParameter.UNIFORMAT_CODE); + Parameter assemblyCodeParam = symbol.get_Parameter(BuiltInParameter.ASSEMBLY_CODE); if (assemblyCodeParam != null && !assemblyCodeParam.IsReadOnly) { if(data.AssemblyCode=="N/A") continue; diff --git a/Test/Sample/UpdateAssemblyCode.cs b/Test/Sample/UpdateAssemblyCode.cs index 6054888..1a4b0be 100644 --- a/Test/Sample/UpdateAssemblyCode.cs +++ b/Test/Sample/UpdateAssemblyCode.cs @@ -24,7 +24,7 @@ public Result Execute(ExternalCommandData commandData, ref string message, Eleme // read csv file var allElements = new FilteredElementCollector(doc).WhereElementIsElementType() //group by id - .GroupBy(x => x.Id.IntegerValue).Select(x => x.First()) + .GroupBy(x => x.Id.Value).Select(x => x.First()) .Where(x => x.Category != null); @@ -37,10 +37,10 @@ public Result Execute(ExternalCommandData commandData, ref string message, Eleme var records = csv.GetRecords().ToList(); foreach (var record in records) { - var type_elements = allElements.Where(x => Math.Abs(x.Category.Id.IntegerValue - record.Category) < 0.001); + var type_elements = allElements.Where(x => Math.Abs(x.Category.Id.Value - record.Category) < 0.001); foreach (var element in type_elements) { - Parameter parameter = element.get_Parameter(BuiltInParameter.UNIFORMAT_CODE); + Parameter parameter = element.get_Parameter(BuiltInParameter.ASSEMBLY_CODE); if (parameter != null && !parameter.IsReadOnly) { parameter.Set(record.UniformatCode); diff --git a/Test/Sample/UpdateUFCodeBaseFamilyNameType.cs b/Test/Sample/UpdateUFCodeBaseFamilyNameType.cs index 0b12a69..f1e5545 100644 --- a/Test/Sample/UpdateUFCodeBaseFamilyNameType.cs +++ b/Test/Sample/UpdateUFCodeBaseFamilyNameType.cs @@ -65,7 +65,7 @@ public void Execute(Autodesk.Revit.DB.Document doc, string browseFile) x.Family == familySymbol.FamilyName && x.FamilyType == familySymbol.Name); if (inputAssembly != null) { - Parameter parameter = familySymbol.get_Parameter(BuiltInParameter.UNIFORMAT_CODE); + Parameter parameter = familySymbol.get_Parameter(BuiltInParameter.ASSEMBLY_CODE); if (parameter != null && !parameter.IsReadOnly) { parameter.Set(inputAssembly.UF2Code);