using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using Autodesk.RevitAddIns;
using SAGY.DotNetUtils;
namespace SAGY.Revit.RevitInfo
{
public static class RevitStartHelper
{
private const string AddInFormat = "\r\n\r\n\r\n{0}\r\n{1}\r\n{2}\r\n{3}\r\n{4}\r\n上格云技术, www.sagacloud.cn\r\n\r\n";
///
/// 启动完成后删除Addin文件
///
///
///
///
///
public static bool ClearAddInFile(Guid addInId, string strProductType, string strRevitVersion)
{
try
{
RevitVersionExt ext;
ProductType unknown = ProductType.Unknown;
string str7 = strProductType;
if (str7 != null)
{
if (!(str7 == "Revit"))
{
if (str7 == "Architecture")
{
goto Label_0054;
}
if (str7 == "Structure")
{
goto Label_0058;
}
if (str7 == "MEP")
{
goto Label_005C;
}
if (str7 == "Unknown")
{
goto Label_0060;
}
}
else
{
unknown = ProductType.Revit;
}
}
goto Label_0062;
Label_0054:
unknown = ProductType.Architecture;
goto Label_0062;
Label_0058:
unknown = ProductType.Structure;
goto Label_0062;
Label_005C:
unknown = ProductType.MEP;
goto Label_0062;
Label_0060:
unknown = ProductType.Unknown;
Label_0062:
ext = GetRevitVersion(strRevitVersion);
if ((unknown == ProductType.Unknown) || (ext == RevitVersionExt.Unknown))
{
return false;
}
//获取所有安装过的Revit版本
List allInstalledRevitProducts = RevitProductUtility.GetAllInstalledRevitProducts();
if ((allInstalledRevitProducts == null) || (allInstalledRevitProducts.Count <= 0))
{
return false;
}
RevitProduct product = null;
foreach (RevitProduct product2 in allInstalledRevitProducts)
{
if ((product2.Product == unknown) && (product2.Version == ((RevitVersion) ((int) ext))))
{
product = product2;
break;
}
}
if (product != null)
{
string currentUserAddInFolder = product.CurrentUserAddInFolder;
string allUsersAddInFolder = product.AllUsersAddInFolder;
string str4 = GetTszPoductString(addInId.ToString()) + ".addin";
string[] strArray = new string[] { currentUserAddInFolder, allUsersAddInFolder };
foreach (string str5 in strArray)
{
if ((str5 != null) && (str5.Trim().Length > 0))
{
string path = Path.Combine(str5, str4);
if (File.Exists(path))
{
try
{
File.Delete(path);
}
catch
{
}
}
}
}
}
return true;
}
catch
{
return false;
}
}
///
/// AddIn内部文件赋值
///
///
///
///
public static string GetAddInFormatString(string strFormat, string strAddInId)
{
string str = "上格云技术";
string str2 = "SAGY.RevitMenu.MenuApp";
string str3 = "SAGY";
string revitMenuDll = GetRevitMenuDll();
return string.Format(strFormat, new object[] { str, revitMenuDll, strAddInId, str2, str3 });
}
///
/// 获取Revit启动加载dll的路径
///
///
public static string GetRevitMenuDll()
{
return Path.Combine(Path.Combine(AppBaseInfo.AppRunPath, "OutputDll"), "SAGY.RevitMenu.dll");
}
///
/// 获取已安装的Revit版本信息
///
///
public static List GetRevitProductExts()
{
List list = new List();
foreach (RevitProduct product in RevitProductUtility.GetAllInstalledRevitProducts())
{
list.Add(new Revit.RevitInfo.RevitProductExt(product));
}
return list;
}
///
/// 由R18获取Revit版本信息
///
///
///
public static Revit.RevitInfo.RevitProductExt GetRevitProductVer(string strVer)
{
RevitProduct rp = null;
RevitVersionExt versionExt = GetRevitVersion2(strVer);
List revitProductExts = GetRevitProductExts();
Revit.RevitInfo.RevitProductExt revitProductExt =
revitProductExts.FirstOrDefault(t => t.Version.ToInt() == (int)versionExt);
return revitProductExt;
}
///
/// 2018 转化为RevitVersionExt.Revit2018
///
///
///
public static RevitVersionExt GetRevitVersion(string strVersionNumber)
{
RevitVersionExt result = RevitVersionExt.Unknown;
if (strVersionNumber == null)
{
return result;
}
string str = strVersionNumber;
int versionInt = str.ToInt();
int rvInt = versionInt - 2010;
try
{
result = (RevitVersionExt) rvInt;
}
catch
{
//强转失败
result=RevitVersionExt.Unknown;
}
return result;
}
///
/// R18 转化为RevitVersionExt.Revit2018
///
///
///
public static RevitVersionExt GetRevitVersion2(string strVersionNumber)
{
RevitVersionExt result = RevitVersionExt.Unknown;
if (strVersionNumber == null)
{
return result;
}
//R18
string str = strVersionNumber.Substring(1);
//18
int versionInt = str.ToInt();
int rvInt = versionInt - 10;
try
{
result = (RevitVersionExt)rvInt;
}
catch
{
//强转失败
result = RevitVersionExt.Unknown;
}
return result;
}
///
/// 获取AddIn文件的名称
///
///
///
public static string GetTszPoductString(string strAddInId)
{
string str2;
string str = "";
//if (((str2 = strAddInId.ToUpper()) != null) && (str2 == "EABBE53F-04A0-4D10-905F-FE4DB67E1F3C"))
//{
// str = "TSBIM";
//}
str = "SAGABIM";
return str;
}
[DllImport("shell32.dll")]
public static extern int ShellExecute(IntPtr hwnd, StringBuilder lpszOp, StringBuilder lpszFile, StringBuilder lpszParams, StringBuilder lpszDir, int fsShowCmd);
public static bool StartRevit(Revit.RevitInfo.RevitProductExt prodInfo, List listTszProg)
{
try
{
string currentUserAddInFolder = prodInfo.CurrentUserAddInFolder;
string allUsersAddInFolder = prodInfo.AllUsersAddInFolder;
string[] strArray = new string[] { currentUserAddInFolder };
//foreach (string str3 in listTszProg)
{
string str3 = "EABBE53F-04A0-4D10-905F-FE4DB67E1F3C";//addinid,后期可根据需要修改
string str5 = GetTszPoductString(str3) + ".addin";
foreach (string str6 in strArray)
{
if ((str6 != null) && (str6.Trim().Length > 0))
{
string path = Path.Combine(str6, str5);
string str8 = Path.Combine(allUsersAddInFolder, str5);
try
{
if (!Directory.Exists(str6))
{
Directory.CreateDirectory(str6);
}
if (File.Exists(path))
{
File.Delete(path);
}
if (File.Exists(str8))
{
File.Delete(str8);
}
}
catch
{
}
using (StreamWriter writer = new StreamWriter(path, false, Encoding.UTF8))
{
string addInFormatString = GetAddInFormatString(AddInFormat, str3);
if (!string.IsNullOrEmpty(addInFormatString))
{
writer.Write(addInFormatString);
}
else
{
MessageShowBase.Infomation("初始化Revit加载信息错误");
return false;
}
}
}
}
}
string directoryName = Path.GetDirectoryName(prodInfo.RevitExeFile);
return (ShellExecute(IntPtr.Zero, new StringBuilder("open"), new StringBuilder("Revit"), new StringBuilder(""), new StringBuilder(directoryName), 1) > 0x20);
}
catch (Exception exception)
{
MessageShowBase.Infomation("配置Revit加载文件失败,请以管理员登录或在控制面板中“更改UAC设置”。");
MessageShowBase.Show(exception);
return false;
}
}
}
}