using Microsoft.Win32; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace LRH { /// /// revit相关管理 /// public class RevitManager { #region 私有设置 private const string RevitNameMatch = @"^20\d{2}$"; private const string ExeName = "Revit.exe"; private static Dictionary m_DicRevitItems = new Dictionary(); static RevitManager() { LoadRevitItems(); } /// /// 初始化所有安装revit项目 /// private static void LoadRevitItems() { List revitItems = new List(); string baseKey = string.Format("SOFTWARE\\Autodesk\\Revit"); //LocalMachine key值 var useRegistryView = Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32; var localMachineKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, useRegistryView); #region 查找注册表安装路径 using (RegistryKey registryKey = localMachineKey.OpenSubKey(baseKey)) { if (registryKey != null) { //找到形如(2018,2019)的键值 var revitVersions = registryKey.GetSubKeyNames().Where(n => CheckRevitName(n)).ToList(); foreach (var version in revitVersions) { var versionKey = registryKey.OpenSubKey(version); //找到包含REVIT名称的键值 var subKeyName = versionKey.GetSubKeyNames().FirstOrDefault(n => n.ToUpper().StartsWith("REVIT")); if (string.IsNullOrWhiteSpace(subKeyName)) { continue; } var tempKey = versionKey.OpenSubKey(subKeyName); if (tempKey != null) { #region 初始化RevitItem var installationLocation = tempKey.GetValue("InstallationLocation") as string ?? string.Empty; var revitFile = Path.Combine(installationLocation, ExeName); if (File.Exists(revitFile)) { RevitItem item = new RevitItem(version, revitFile); revitItems.Add(item); } #endregion } } registryKey.Close(); } } #endregion revitItems.ForEach(revit => m_DicRevitItems[revit.Name]=revit); } #endregion /// /// 获取所有Revit项目 /// /// public static List GetRevitItems() { return m_DicRevitItems.Values.ToList(); } /// /// 获取指定名称的Revit项目 /// /// /// public static RevitItem GetRevitItem(string revitName) { m_DicRevitItems.TryGetValue(revitName, out RevitItem revitItem); return revitItem; } /// /// 检查Revit名称格式是否正确 /// /// /// public static bool CheckRevitName(string revitName) { return Regex.IsMatch(revitName, RevitNameMatch); } /// /// 获取插件放置公共目录 /// /// /// public static string GetAllUsersAddInFolder(string revitItemName) { return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), @"Autodesk\Revit\AddIns", revitItemName); } /// /// 获取插件放置当前用户目录 /// /// /// public static string GetCurrentUserAddInFolder(string revitItemName) { return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Autodesk\Revit\AddIns", revitItemName); } } /// /// Revit安装信息 /// public class RevitItem { internal RevitItem(string name,string revitFile) { Name = name; RevitFile = revitFile; AllUsersAddInFolder = RevitManager.GetAllUsersAddInFolder(name); CurrentUserAddInFolder= RevitManager.GetCurrentUserAddInFolder(name); } /// /// Revit名称(2018,2019) /// public string Name { get; private set; } /// /// revit.exe所在位置 /// public string RevitFile { get;private set; } /// /// 所有用户插件目录 /// public string AllUsersAddInFolder { get; private set; } /// /// 当前用户插件目录 /// public string CurrentUserAddInFolder { get; private set; } } }