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; }
}
}