diff --git a/AddInManager.sln b/AddInManager.sln index e55e977..eb3f9ea 100644 --- a/AddInManager.sln +++ b/AddInManager.sln @@ -1,20 +1,26 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31903.59 +# Visual Studio Version 18 +VisualStudioVersion = 18.1.11312.151 d18.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddInManager", "AddInManager\AddInManager.csproj", "{1A000607-4238-4AB2-9E73-A6937E061ABE}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {1A000607-4238-4AB2-9E73-A6937E061ABE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1A000607-4238-4AB2-9E73-A6937E061ABE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1A000607-4238-4AB2-9E73-A6937E061ABE}.Debug|x64.ActiveCfg = Debug|x64 + {1A000607-4238-4AB2-9E73-A6937E061ABE}.Debug|x64.Build.0 = Debug|x64 {1A000607-4238-4AB2-9E73-A6937E061ABE}.Release|Any CPU.ActiveCfg = Release|Any CPU {1A000607-4238-4AB2-9E73-A6937E061ABE}.Release|Any CPU.Build.0 = Release|Any CPU + {1A000607-4238-4AB2-9E73-A6937E061ABE}.Release|x64.ActiveCfg = Release|x64 + {1A000607-4238-4AB2-9E73-A6937E061ABE}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/AddInManager/AIM.cs b/AddInManager/AIM.cs index 63fbe47..c611ca3 100644 --- a/AddInManager/AIM.cs +++ b/AddInManager/AIM.cs @@ -1,5 +1,4 @@ using System; -using System.Reflection; using System.Windows; using Autodesk.Revit.DB; diff --git a/AddInManager/AddInManager.csproj b/AddInManager/AddInManager.csproj index 213e96a..48b23f6 100644 --- a/AddInManager/AddInManager.csproj +++ b/AddInManager/AddInManager.csproj @@ -9,8 +9,10 @@ False False net48 + AnyCPU;x64 + diff --git a/AddInManager/Addin.cs b/AddInManager/Addin.cs index b50b3df..d274c55 100644 --- a/AddInManager/Addin.cs +++ b/AddInManager/Addin.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.IO; namespace AddInManager diff --git a/AddInManager/AddinItem.cs b/AddInManager/AddinItem.cs index f4d324b..7149e35 100644 --- a/AddInManager/AddinItem.cs +++ b/AddInManager/AddinItem.cs @@ -10,12 +10,12 @@ namespace AddInManager public AddinItem(AddinType type) { AddinType = type; - m_clientId = Guid.NewGuid(); - ClientIdString = m_clientId.ToString(); - m_assemblyPath = string.Empty; + MClientId = Guid.NewGuid(); + ClientIdString = MClientId.ToString(); + MAssemblyPath = string.Empty; AssemblyName = string.Empty; FullClassName = string.Empty; - m_name = string.Empty; + _mName = string.Empty; Save = true; VisibilityMode = VisibilityMode.AlwaysVisible; } @@ -26,20 +26,20 @@ namespace AddInManager RegenerationMode = regenerationOption; JournalingMode = journalingMode; AddinType = type; - m_assemblyPath = assemblyPath; - AssemblyName = Path.GetFileName(m_assemblyPath); - m_clientId = clientId; + MAssemblyPath = assemblyPath; + AssemblyName = Path.GetFileName(MAssemblyPath); + MClientId = clientId; ClientIdString = clientId.ToString(); FullClassName = fullClassName; var num = fullClassName.LastIndexOf("."); - m_name = fullClassName.Substring(num + 1); + _mName = fullClassName.Substring(num + 1); Save = true; VisibilityMode = VisibilityMode.AlwaysVisible; } public void SaveToManifest() { - var manifestFile = new ManifestFile($"{m_name}.addin"); + var manifestFile = new ManifestFile($"{_mName}.addin"); if (AddinType == AddinType.Application) { manifestFile.Applications.Add(this); @@ -55,11 +55,11 @@ namespace AddInManager public string AssemblyPath { - get => m_assemblyPath; + get => MAssemblyPath; set { - m_assemblyPath = value; - AssemblyName = Path.GetFileName(m_assemblyPath); + MAssemblyPath = value; + AssemblyName = Path.GetFileName(MAssemblyPath); } } @@ -67,11 +67,11 @@ namespace AddInManager public Guid ClientId { - get => m_clientId; + get => MClientId; set { - m_clientId = value; - ClientIdString = m_clientId.ToString(); + MClientId = value; + ClientIdString = MClientId.ToString(); } } @@ -81,43 +81,29 @@ namespace AddInManager public string Name { - get - { - if (string.IsNullOrEmpty(m_name)) - { - return "External Tool"; - } - return m_name; - } + get => string.IsNullOrEmpty(_mName) ? "External Tool" : _mName; set { if (!string.IsNullOrEmpty(value)) { - m_name = value; + _mName = value; return; } - m_name = "External Tool"; + _mName = "External Tool"; } } public string Description { - get - { - if (string.IsNullOrEmpty(m_description)) - { - return "\"\""; - } - return m_description; - } + get => string.IsNullOrEmpty(field) ? "\"\"" : field; set { if (string.IsNullOrEmpty(value)) { - m_description = "\"\""; + field = "\"\""; return; } - m_description = value; + field = value; } } @@ -135,12 +121,11 @@ namespace AddInManager public override string ToString() { - return m_name; + return _mName; } - protected string m_assemblyPath; - protected Guid m_clientId; - private string m_name; - private string m_description; + protected string MAssemblyPath; + protected Guid MClientId; + private string _mName; } } diff --git a/AddInManager/AddinManager.cs b/AddInManager/AddinManager.cs index 7c1cc7a..6b63af3 100644 --- a/AddInManager/AddinManager.cs +++ b/AddInManager/AddinManager.cs @@ -4,7 +4,8 @@ using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; - +using System.Runtime.Serialization.Json; +using System.Text; using AddInManager.Properties; namespace AddInManager @@ -33,10 +34,46 @@ namespace AddInManager private void GetIniFilePaths() { - var folderPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + //var folderPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + var folderPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); var appFolder = Path.Combine(folderPath, Resources.AppFolder); - var iniFilePath = Path.Combine(appFolder, "AimInternal.ini"); + // switch from INI to JSON storage + var iniFilePath = Path.Combine(appFolder, "AimInternal.json"); AimIniFile = new IniFile(iniFilePath); + + // If an old INI exists, migrate it to JSON (one-time) + try + { + var oldIniPath = Path.Combine(appFolder, "AimInternal.ini"); + if (File.Exists(oldIniPath) && !File.Exists(iniFilePath)) + { + var oldIni = new IniFile(oldIniPath); + // populate commands/applications from old INI + Commands.ReadItems(oldIni); + Applications.ReadItems(oldIni); + + // save to new JSON store + SaveToPersistentStore(iniFilePath); + + // backup old INI + try + { + var backupPath = oldIniPath + ".bak"; + File.Copy(oldIniPath, backupPath, true); + FileUtils.SetWriteable(oldIniPath); + File.Delete(oldIniPath); + } + catch (Exception) + { + // ignore backup errors + } + } + } + catch (Exception) + { + // ignore migration errors + } + var currentProcess = Process.GetCurrentProcess(); var fileName = currentProcess.MainModule.FileName; var revitIniFilePath = fileName.Replace(".exe", ".ini"); @@ -45,8 +82,12 @@ namespace AddInManager public void ReadAddinsFromAimIni() { - Commands.ReadItems(AimIniFile); - Applications.ReadItems(AimIniFile); + // try load from persistent JSON store; if fails, fall back to legacy INI-format reader + if (!LoadFromPersistentStore(AimIniFile.FilePath)) + { + Commands.ReadItems(AimIniFile); + Applications.ReadItems(AimIniFile); + } } public void RemoveAddin(Addin addin) @@ -101,49 +142,34 @@ namespace AddInManager return addinType; } - public void SaveToRevitIni() - { - if (!File.Exists(RevitIniFile.FilePath)) - { - throw new System.IO.FileNotFoundException($"路径{RevitIniFile.FilePath}中未找到revit.ini: ", - RevitIniFile.FilePath -); - } - Commands.Save(RevitIniFile); - Applications.Save(RevitIniFile); - } - public void SaveToLocal(AddinType addinTypeToSave) { SaveToLocalManifest(addinTypeToSave); } - public void SaveToLocalRevitIni() - { - foreach (var keyValuePair in Commands.AddinDict) - { - var key = keyValuePair.Key; - var value = keyValuePair.Value; - var directoryName = Path.GetDirectoryName(value.FilePath); - var iniFile = new IniFile(Path.Combine(directoryName, "revit.ini")); - value.SaveToLocalIni(iniFile); - if (Applications.AddinDict.ContainsKey(key)) - { - var addin = Applications.AddinDict[key]; - addin.SaveToLocalIni(iniFile); - } - } - } - public void SaveToAimIni() { - if (!File.Exists(AimIniFile.FilePath)) + // ensure file exists + try { - new FileInfo(AimIniFile.FilePath).Create(); - FileUtils.SetWriteable(AimIniFile.FilePath); + if (!File.Exists(AimIniFile.FilePath)) + { + new FileInfo(AimIniFile.FilePath).Directory?.Create(); + FileUtils.CreateFile(AimIniFile.FilePath); + FileUtils.SetWriteable(AimIniFile.FilePath); + } + } + catch (Exception) + { + // ignore + } + + // save to persistent JSON store; if fails, fall back to legacy INI writer + if (!SaveToPersistentStore(AimIniFile.FilePath)) + { + Commands.Save(AimIniFile); + Applications.Save(AimIniFile); } - Commands.Save(AimIniFile); - Applications.Save(AimIniFile); } public bool HasItemsToSave() @@ -222,7 +248,7 @@ namespace AddInManager } else { - addinFilePath = GetProperFilePath(currentAddinFolder, "ExternalTool", ".addin"); + addinFilePath = GetProperFilePath(currentAddinFolder, addinFileName, ".addin"); } manifestFile.SaveAs(addinFilePath); return addinFilePath; @@ -278,5 +304,168 @@ namespace AddInManager while (File.Exists(filePath)); return filePath; } + + private bool LoadFromPersistentStore(string filePath) + { + try + { + if (string.IsNullOrEmpty(filePath) || !File.Exists(filePath)) return false; + using (var fs = File.OpenRead(filePath)) + { + var ser = new DataContractJsonSerializer(typeof(PersistentAddinStore)); + var obj = ser.ReadObject(fs) as PersistentAddinStore; + if (obj == null) return false; + + + // reset internal dictionaries + Commands.AddinDict.Clear(); + Applications.AddinDict.Clear(); + + foreach (var p in obj.Commands) + { + var items = new List(); + foreach (var pi in p.Items) + { + var ai = new AddinItem(pi.AssemblyPath ?? string.Empty, pi.ClientId == Guid.Empty ? Guid.NewGuid() : pi.ClientId, pi.FullClassName ?? string.Empty, AddinType.Command, pi.TransactionMode, pi.RegenerationMode, pi.JournalingMode) + { + Name = pi.Name, + Description = pi.Description, + VisibilityMode = pi.VisibilityMode, + Save = pi.Save, + Hidden = pi.Hidden + }; + items.Add(ai); + } + var addin = new Addin(p.FilePath ?? string.Empty, items) + { + Save = p.Save, + Hidden = p.Hidden + }; + Commands.AddAddIn(addin); + } + + foreach (var p in obj.Applications) + { + var items = new List(); + foreach (var pi in p.Items) + { + var ai = new AddinItem(pi.AssemblyPath ?? string.Empty, pi.ClientId == Guid.Empty ? Guid.NewGuid() : pi.ClientId, pi.FullClassName ?? string.Empty, AddinType.Application, pi.TransactionMode, pi.RegenerationMode, pi.JournalingMode) + { + Name = pi.Name, + Description = pi.Description, + VisibilityMode = pi.VisibilityMode, + Save = pi.Save, + Hidden = pi.Hidden + }; + items.Add(ai); + } + var addin = new Addin(p.FilePath ?? string.Empty, items) + { + Save = p.Save, + Hidden = p.Hidden + }; + Applications.AddAddIn(addin); + } + + return true; + } + } + catch (Exception) + { + return false; + } + } + + private bool SaveToPersistentStore(string filePath) + { + try + { + var store = new PersistentAddinStore + { + FormatVersion = 1, + RevitVersion = App.RevitVersion, + LastSaved = DateTime.Now + }; + + foreach (var kv in Commands.AddinDict) + { + var a = kv.Value; + var p = new PersistentAddin + { + FilePath = a.FilePath, + Save = a.Save, + Hidden = a.Hidden + }; + foreach (var ai in a.ItemList) + { + var pi = new PersistentAddinItem + { + AddinType = ai.AddinType, + AssemblyPath = ai.AssemblyPath, + AssemblyName = ai.AssemblyName, + ClientId = ai.ClientId, + FullClassName = ai.FullClassName, + Name = ai.Name, + Description = ai.Description, + VisibilityMode = ai.VisibilityMode, + Save = ai.Save, + Hidden = ai.Hidden, + TransactionMode = ai.TransactionMode, + RegenerationMode = ai.RegenerationMode, + JournalingMode = ai.JournalingMode + }; + p.Items.Add(pi); + } + store.Commands.Add(p); + } + + foreach (var kv in Applications.AddinDict) + { + var a = kv.Value; + var p = new PersistentAddin + { + FilePath = a.FilePath, + Save = a.Save, + Hidden = a.Hidden + }; + foreach (var ai in a.ItemList) + { + var pi = new PersistentAddinItem + { + AddinType = ai.AddinType, + AssemblyPath = ai.AssemblyPath, + AssemblyName = ai.AssemblyName, + ClientId = ai.ClientId, + FullClassName = ai.FullClassName, + Name = ai.Name, + Description = ai.Description, + VisibilityMode = ai.VisibilityMode, + Save = ai.Save, + Hidden = ai.Hidden, + TransactionMode = ai.TransactionMode, + RegenerationMode = ai.RegenerationMode, + JournalingMode = ai.JournalingMode + }; + p.Items.Add(pi); + } + store.Applications.Add(p); + } + + var directory = Path.GetDirectoryName(filePath); + if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) Directory.CreateDirectory(directory); + + using (var fs = File.Open(filePath, FileMode.Create, FileAccess.Write, FileShare.None)) + { + var ser = new DataContractJsonSerializer(typeof(PersistentAddinStore)); + ser.WriteObject(fs, store); + } + + return true; + } + catch (Exception) + { + return false; + } + } } } diff --git a/AddInManager/AddinsApplication.cs b/AddInManager/AddinsApplication.cs index cf31e0d..e17b324 100644 --- a/AddInManager/AddinsApplication.cs +++ b/AddInManager/AddinsApplication.cs @@ -1,6 +1,4 @@ -using System; - -namespace AddInManager +namespace AddInManager { public class AddinsApplication : Addins { diff --git a/AddInManager/AddinsCommand.cs b/AddInManager/AddinsCommand.cs index e7217d8..f7f59f1 100644 --- a/AddInManager/AddinsCommand.cs +++ b/AddInManager/AddinsCommand.cs @@ -1,6 +1,4 @@ -using System; - -namespace AddInManager +namespace AddInManager { public class AddinsCommand : Addins { diff --git a/AddInManager/App.cs b/AddInManager/App.cs index 9f9fc2d..e2865c9 100644 --- a/AddInManager/App.cs +++ b/AddInManager/App.cs @@ -5,19 +5,10 @@ using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.IO; -using System.Linq; using System.Reflection; -using System.Reflection.Emit; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Media; using System.Windows.Media.Imaging; using AddInManager.Properties; - -using Autodesk.Private.InfoCenter; -using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Autodesk.Windows; @@ -58,12 +49,10 @@ namespace AddInManager AddPushButton(pulldownButton, typeof(CAddInManagerFaceless), "插件管理(手动模式,无界面)"); AddPushButton(pulldownButton, typeof(CAddInManagerReadOnly), "插件管理(只读模式)"); var tab = ComponentManager.Ribbon.FindTab("Modify"); - if (tab != null) - { - var adwPanel = new Autodesk.Windows.RibbonPanel(); - adwPanel.CopyFrom(GetRibbonPanel(ribbonPanel)); - tab.Panels.Add(adwPanel); - } + if (tab == null) return; + var adwPanel = new Autodesk.Windows.RibbonPanel(); + adwPanel.CopyFrom(GetRibbonPanel(ribbonPanel)); + tab.Panels.Add(adwPanel); } internal static BitmapImage ToImageSource(Bitmap bitmap) diff --git a/AddInManager/CAddInManagerFaceless.cs b/AddInManager/CAddInManagerFaceless.cs index d2ec081..91f9964 100644 --- a/AddInManager/CAddInManagerFaceless.cs +++ b/AddInManager/CAddInManagerFaceless.cs @@ -4,8 +4,6 @@ using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.UI; -using System; - namespace AddInManager { [Transaction(TransactionMode.Manual)] diff --git a/AddInManager/FailedToRunECDialog.cs b/AddInManager/FailedToRunECDialog.cs index adb373b..aa1aa51 100644 --- a/AddInManager/FailedToRunECDialog.cs +++ b/AddInManager/FailedToRunECDialog.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows; +using System.Windows; using AddInManager.Properties; diff --git a/AddInManager/FileUtils.cs b/AddInManager/FileUtils.cs index 14f8b16..d4e23bc 100644 --- a/AddInManager/FileUtils.cs +++ b/AddInManager/FileUtils.cs @@ -30,7 +30,7 @@ namespace AddInManager { } } - var text = string.Format("{0:yyyyMMdd_HHmmss_ffff}", DateTime.Now); + var text = $"{DateTime.Now:yyyyMMdd_HHmmss_ffff}"; var text2 = Path.Combine(directoryInfo.FullName, prefix + text); var directoryInfo3 = new DirectoryInfo(text2); directoryInfo3.Create(); @@ -48,7 +48,7 @@ namespace AddInManager public static bool SameFile(string file1, string file2) { - return 0 == string.Compare(file1.Trim(), file2.Trim(), true); + return 0 == string.Compare(file1.Trim(), file2.Trim(), StringComparison.OrdinalIgnoreCase); } public static bool CreateFile(string filePath) @@ -213,6 +213,7 @@ namespace AddInManager } catch (Exception) { + // ignored } } @@ -233,7 +234,5 @@ namespace AddInManager } return num / 1024L / 1024L; } - - private const string TempFolderName = "RevitAddins"; } } diff --git a/AddInManager/FolderTooBigDialog.cs b/AddInManager/FolderTooBigDialog.cs index c127490..7f4a791 100644 --- a/AddInManager/FolderTooBigDialog.cs +++ b/AddInManager/FolderTooBigDialog.cs @@ -1,6 +1,4 @@ using AddInManager.Properties; - -using System; using System.Text; using System.Windows; diff --git a/AddInManager/IAddinNode.cs b/AddInManager/IAddinNode.cs index f05171d..cf9f95e 100644 --- a/AddInManager/IAddinNode.cs +++ b/AddInManager/IAddinNode.cs @@ -1,6 +1,4 @@ -using System; - -namespace AddInManager +namespace AddInManager { public interface IAddinNode { diff --git a/AddInManager/IniFile.cs b/AddInManager/IniFile.cs index 1fc7866..59a6f8f 100644 --- a/AddInManager/IniFile.cs +++ b/AddInManager/IniFile.cs @@ -1,7 +1,10 @@ -using System; -using System.IO; +using System.IO; using System.Runtime.InteropServices; using System.Text; +using System; +using System.Collections.Generic; +using System.Runtime.Serialization.Json; +using System.Runtime.Serialization; namespace AddInManager { @@ -9,28 +12,78 @@ namespace AddInManager { public string FilePath { get; } + private readonly bool m_isJson; + private Dictionary> m_jsonData; + public IniFile(string filePath) { FilePath = filePath; + m_isJson = string.Equals(Path.GetExtension(FilePath), ".json", StringComparison.OrdinalIgnoreCase); if (!File.Exists(FilePath)) { FileUtils.CreateFile(FilePath); FileUtils.SetWriteable(FilePath); + if (m_isJson) + { + m_jsonData = new Dictionary>(StringComparer.Ordinal); + SaveJson(); + } + } + + if (m_isJson) + { + LoadJson(); } } public void WriteSection(string iniSection) { + if (m_isJson) + { + if (m_jsonData == null) + { + m_jsonData = new Dictionary>(StringComparer.Ordinal); + } + m_jsonData[iniSection] = new Dictionary(StringComparer.Ordinal); + SaveJson(); + return; + } WritePrivateProfileSection(iniSection, null, FilePath); } public void Write(string iniSection, string iniKey, object iniValue) { + if (m_isJson) + { + if (m_jsonData == null) + { + m_jsonData = new Dictionary>(StringComparer.Ordinal); + } + if (!m_jsonData.ContainsKey(iniSection)) + { + m_jsonData[iniSection] = new Dictionary(StringComparer.Ordinal); + } + m_jsonData[iniSection][iniKey] = iniValue?.ToString() ?? string.Empty; + SaveJson(); + return; + } WritePrivateProfileString(iniSection, iniKey, iniValue.ToString(), FilePath); } public string ReadString(string iniSection, string iniKey) { + if (m_isJson) + { + if (m_jsonData != null && m_jsonData.TryGetValue(iniSection, out var section)) + { + if (section != null && section.TryGetValue(iniKey, out var val)) + { + return val; + } + } + return string.Empty; + } + var stringBuilder = new StringBuilder(255); GetPrivateProfileString(iniSection, iniKey, string.Empty, stringBuilder, 255, FilePath); return stringBuilder.ToString(); @@ -38,9 +91,66 @@ namespace AddInManager public int ReadInt(string iniSection, string iniKey) { + if (m_isJson) + { + var s = ReadString(iniSection, iniKey); + if (int.TryParse(s, out var v)) return v; + return 0; + } return GetPrivateProfileInt(iniSection, iniKey, 0, FilePath); } + private void LoadJson() + { + try + { + if (!File.Exists(FilePath)) + { + m_jsonData = new Dictionary>(StringComparer.Ordinal); + return; + } + var bytes = File.ReadAllBytes(FilePath); + if (bytes == null || bytes.Length == 0) + { + m_jsonData = new Dictionary>(StringComparer.Ordinal); + return; + } + using (var ms = new MemoryStream(bytes)) + { + var ser = new DataContractJsonSerializer(typeof(Dictionary>)); + var obj = ser.ReadObject(ms) as Dictionary>; + m_jsonData = obj ?? new Dictionary>(StringComparer.Ordinal); + } + } + catch (Exception) + { + m_jsonData = new Dictionary>(StringComparer.Ordinal); + } + } + + private void SaveJson() + { + try + { + var directory = Path.GetDirectoryName(FilePath); + if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) + { + Directory.CreateDirectory(directory); + } + using (var ms = new MemoryStream()) + { + var ser = new DataContractJsonSerializer(typeof(Dictionary>)); + ser.WriteObject(ms, m_jsonData ?? new Dictionary>(StringComparer.Ordinal)); + var data = ms.ToArray(); + File.WriteAllBytes(FilePath, data); + } + } + catch (Exception) + { + // ignore + } + } + [DllImport("kernel32.dll")] private static extern int WritePrivateProfileSection(string lpAppName, string lpString, string lpFileName); diff --git a/AddInManager/PersistentAddinStore.cs b/AddInManager/PersistentAddinStore.cs new file mode 100644 index 0000000..a4aaecb --- /dev/null +++ b/AddInManager/PersistentAddinStore.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using Autodesk.Revit.Attributes; + +namespace AddInManager +{ + [DataContract] + public class PersistentAddinStore + { + [DataMember] + public int FormatVersion { get; set; } = 1; + + [DataMember] + public string RevitVersion { get; set; } + + [DataMember] + public DateTime LastSaved { get; set; } + + [DataMember] + public List Commands { get; set; } = new List(); + + [DataMember] + public List Applications { get; set; } = new List(); + } + + [DataContract] + public class PersistentAddin + { + [DataMember] + public string FilePath { get; set; } + + [DataMember] + public bool Save { get; set; } + + [DataMember] + public bool Hidden { get; set; } + + [DataMember] + public List Items { get; set; } = new List(); + } + + [DataContract] + public class PersistentAddinItem + { + [DataMember] + public AddinType AddinType { get; set; } + + [DataMember] + public string AssemblyPath { get; set; } + + [DataMember] + public string AssemblyName { get; set; } + + [DataMember] + public Guid ClientId { get; set; } + + [DataMember] + public string FullClassName { get; set; } + + [DataMember] + public string Name { get; set; } + + [DataMember] + public string Description { get; set; } + + [DataMember] + public VisibilityMode VisibilityMode { get; set; } + + [DataMember] + public bool Save { get; set; } + + [DataMember] + public bool Hidden { get; set; } + + [DataMember] + public TransactionMode? TransactionMode { get; set; } + + [DataMember] + public RegenerationOption? RegenerationMode { get; set; } + + [DataMember] + public JournalingMode? JournalingMode { get; set; } + } +} diff --git a/AddInManager/Properties/Resources.Designer.cs b/AddInManager/Properties/Resources.Designer.cs index b0bdbd0..ec80be6 100644 --- a/AddInManager/Properties/Resources.Designer.cs +++ b/AddInManager/Properties/Resources.Designer.cs @@ -61,7 +61,7 @@ namespace AddInManager.Properties { } /// - /// 查找类似 RevitAddInManager 的本地化字符串。 + /// 查找类似 AddinData 的本地化字符串。 /// internal static string AppFolder { get { diff --git a/AddInManager/Properties/Resources.resx b/AddInManager/Properties/Resources.resx index e24b8f4..9642296 100644 --- a/AddInManager/Properties/Resources.resx +++ b/AddInManager/Properties/Resources.resx @@ -118,7 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - RevitAddInManager + AddinData 插件管理 diff --git a/AddInManager/Wpf/AssemblySelectorWindow.xaml.cs b/AddInManager/Wpf/AssemblySelectorWindow.xaml.cs index 00d270d..dabafeb 100644 --- a/AddInManager/Wpf/AssemblySelectorWindow.xaml.cs +++ b/AddInManager/Wpf/AssemblySelectorWindow.xaml.cs @@ -1,6 +1,4 @@ using Microsoft.Win32; - -using System; using System.IO; using System.Text; using System.Windows; diff --git a/AddInManager/Wpf/MainWindow.xaml.cs b/AddInManager/Wpf/MainWindow.xaml.cs index 56ff2ab..f926d5d 100644 --- a/AddInManager/Wpf/MainWindow.xaml.cs +++ b/AddInManager/Wpf/MainWindow.xaml.cs @@ -1116,7 +1116,7 @@ namespace AddInManager.Wpf // (重写) 重新加载 private void ContextMenuReload_Click(object sender, RoutedEventArgs e) { - if (!(commandsTreeView.SelectedItem is TreeViewItem selectedItem)) return; + if (commandsTreeView.SelectedItem is not TreeViewItem selectedItem) return; Addin addinToReload = null; // 判断选中项是Addin(父)还是AddinItem(子) @@ -1130,7 +1130,7 @@ namespace AddInManager.Wpf var parent = VisualTreeHelper.GetParent(selectedItem); while (parent != null) { - if (parent is TreeViewItem parentItem && parentItem.Tag is Addin parentAddin) + if (parent is TreeViewItem { Tag: Addin parentAddin }) { addinToReload = parentAddin; break;