/*-------------------------------------------------------------------------
* 功能描述:AddInManager
* 作者:xulisong
* 创建时间: 2019/1/16 16:13:43
* 版本号:v1.0
* -------------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using Autodesk.RevitAddIns;
namespace RevitVersion
{
public class AddInManager
{
///
/// 删除指定名称addIn文件
///
///
///
public static void ClearFile(RevitProduct product, string addInFileName)
{
string currentUserAddInFolder = product.CurrentUserAddInFolder;
string allUsersAddInFolder = product.AllUsersAddInFolder;
List paths = new List { currentUserAddInFolder, allUsersAddInFolder };
ClearFile(paths, addInFileName);
}
///
/// 删除指定名称addIn文件
///
///
///
public static void ClearFile(List useFolders, string addInFileName)
{
string fileName = string.Format("{0}.addin", addInFileName);
foreach (string addinPath in useFolders)
{
if (!string.IsNullOrWhiteSpace(addinPath))
{
string path = Path.Combine(addinPath, fileName);
if (File.Exists(path))
{
try
{
File.Delete(path);
}
catch
{
}
}
}
}
}
///
/// 增加启动文件
///
///
///
///
public static void AddFile(RevitProduct product, string addInFileName, string addInContent)
{
AddFile(product.CurrentUserAddInFolder, addInFileName, addInContent);
}
///
/// 增加启动文件
///
///
///
///
public static void AddFile(string userAddInFolder, string addInFileName,string addInContent)
{
//清除文件
ClearFile(new List(){ userAddInFolder }, addInFileName);
string fileName = string.Format("{0}.addin", addInFileName);
string currentUserAddInFolder = userAddInFolder;
string path = Path.Combine(currentUserAddInFolder, fileName);
using (StreamWriter writer = new StreamWriter(path, false, Encoding.UTF8))
{
if (!string.IsNullOrEmpty(addInContent))
{
writer.Write(addInContent);
}
}
}
///
/// 增加指定名称的Addin文件
///
///
///
///
public static void AddFile(RevitProduct product, string addInFileName, RevitAddInApplication application)
{
//清除文件
AddFile(product.CurrentUserAddInFolder, addInFileName, application);
}
public static void AddFile(string userAddInFolder, string addInFileName, RevitAddInApplication application)
{
//清除文件
ClearFile(new List() { userAddInFolder }, addInFileName);
string fileName = string.Format("{0}.addin", addInFileName);
RevitAddInManifest manifest = new RevitAddInManifest();
manifest.AddInApplications.Add(application);
string currentUserAddInFolder = userAddInFolder;
string path = Path.Combine(currentUserAddInFolder, fileName);
manifest.SaveAs(path);
}
#region 获取当前产品信息
public static RevitProduct GetCurrentProduct()
{
return VersionManager.Current?.Product;
}
public static string GetAllUsersAddInFolder(Version version)
{
return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), @"Autodesk\Revit\AddIns", version.ToString().Replace("Revit", ""));
}
public static string GetCurrentUserAddInFolder(Version version)
{
return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Autodesk\Revit\AddIns", version.ToString().Replace("Revit", ""));
}
#endregion
#region 启动方式设置
///
/// 获取临时目录位置
///
///
private static string GetFilePath()
{
//以临时目录为目录,以类所在dll路径生成MD5值为一级,以类名为文件名
var basePath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
var path = typeof(AddInManager).Assembly.Location;
byte[] bytes = UTF8Encoding.UTF8.GetBytes(path);
MD5 md5 = MD5.Create();
var guid= new Guid(md5.ComputeHash(bytes));
string fileName = "AddInManagerConfig.txt";
var directory = Path.Combine(basePath, guid.ToString());
var filePath= Path.Combine(directory, fileName);
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
if (!File.Exists(filePath))
{
//初始化文件
File.WriteAllText(filePath,"");
}
return filePath;
}
private const string CancelFlag = "0";
///
/// 设置取消标记
///
///
private static void SetCancelFlag(string addinName)
{
var filePath = GetFilePath();
File.WriteAllLines(filePath, new string[] { CancelFlag, addinName});
}
///
/// 获取需要取消application名称
///
///
private static string GetCancelAddinName()
{
var filePath = GetFilePath();
var results = File.ReadAllLines(filePath);
if (results.Length == 0)
{
return null;
}
if (string.IsNullOrWhiteSpace(results[0])|| results[0].Trim() != CancelFlag)
{
return null;
}
if (results.Length > 1)
{
return results[1];
}
return null;
}
public static void CheckCancelAddin()
{
var addinName = GetCancelAddinName();
if (string.IsNullOrWhiteSpace(addinName))
{
return;
}
var folder = GetCurrentUserAddInFolder(VersionManager.Current.Version);
AddInManager.ClearFile(new List(){ folder }, addinName);
var filePath = GetFilePath();
File.WriteAllText(filePath,"");
}
public static void Start(RevitAddInApplication application)
{
Attach(application);
RevitShell.Start(VersionManager.Current.Product);
//加一个标志,判断是否隐藏信息
SetCancelFlag(application.Name);
}
public static void StartAuto(RevitAddInApplication application)
{
Attach(application);
RevitShell.Start(VersionManager.Current.Product);
}
public static void Attach(RevitAddInApplication application)
{
AddInManager.AddFile(VersionManager.Current.Product, application.Name, application);
}
public static void Cancel(RevitAddInApplication application)
{
AddInManager.ClearFile(VersionManager.Current.Product, application.Name);
}
///
/// 根据启动类型启动Revit
///
///
///
public static void StartRevit(StartType type, RevitAddInApplication application)
{
switch (type)
{
case StartType.Start:
{
Start(application);
break;
}
case StartType.StartAuto:
{
StartAuto(application);
break;
}
case StartType.Cancel:
{
Cancel(application);
break;
}
case StartType.Attach:
{
Attach(application);
break;
}
}
}
#endregion
}
}