mirror of
https://github.com/ShrlAlgo/AddinManager.git
synced 2026-03-08 00:48:56 +00:00
284 lines
10 KiB
C#
284 lines
10 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
|
|
using AddInManager.Properties;
|
|
|
|
namespace AddInManager
|
|
{
|
|
public class AddinManager
|
|
{
|
|
public AddinsApplication Applications { get; }
|
|
|
|
public int AppCount => Applications.Count;
|
|
|
|
public AddinsCommand Commands { get; }
|
|
|
|
public int CmdCount => Commands.Count;
|
|
|
|
public AddinManager()
|
|
{
|
|
Commands = new AddinsCommand();
|
|
Applications = new AddinsApplication();
|
|
GetIniFilePaths();
|
|
ReadAddinsFromAimIni();
|
|
}
|
|
|
|
public IniFile AimIniFile { get; set; }
|
|
|
|
public IniFile RevitIniFile { get; set; }
|
|
|
|
private void GetIniFilePaths()
|
|
{
|
|
var folderPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
|
|
var text = Path.Combine(folderPath, Settings.Default.AppFolder);
|
|
var text2 = Path.Combine(text, "AimInternal.ini");
|
|
AimIniFile = new IniFile(text2);
|
|
var currentProcess = Process.GetCurrentProcess();
|
|
var fileName = currentProcess.MainModule.FileName;
|
|
var text3 = fileName.Replace(".exe", ".ini");
|
|
RevitIniFile = new IniFile(text3);
|
|
}
|
|
|
|
public void ReadAddinsFromAimIni()
|
|
{
|
|
Commands.ReadItems(AimIniFile);
|
|
Applications.ReadItems(AimIniFile);
|
|
}
|
|
|
|
public void RemoveAddin(Addin addin)
|
|
{
|
|
if (!Commands.RemoveAddIn(addin))
|
|
{
|
|
Applications.RemoveAddIn(addin);
|
|
}
|
|
}
|
|
|
|
public AddinType LoadAddin(string filePath)
|
|
{
|
|
var addinType = AddinType.Invalid;
|
|
if (!File.Exists(filePath))
|
|
{
|
|
return addinType;
|
|
}
|
|
Path.GetFileName(filePath);
|
|
var assemLoader = new AssemLoader();
|
|
List<AddinItem> list = null;
|
|
List<AddinItem> list2 = null;
|
|
try
|
|
{
|
|
assemLoader.HookAssemblyResolve();
|
|
var assembly = assemLoader.LoadAddinsToTempFolder(filePath, true);
|
|
if (null == assembly)
|
|
{
|
|
return addinType;
|
|
}
|
|
list = Commands.LoadItems(assembly, StaticUtil.m_ecFullName, filePath, AddinType.Command);
|
|
list2 = Applications.LoadItems(assembly, StaticUtil.m_eaFullName, filePath, AddinType.Application);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
}
|
|
finally
|
|
{
|
|
assemLoader.UnhookAssemblyResolve();
|
|
}
|
|
if (list != null && list.Count > 0)
|
|
{
|
|
var addin = new Addin(filePath, list);
|
|
Commands.AddAddIn(addin);
|
|
addinType |= AddinType.Command;
|
|
}
|
|
if (list2 != null && list2.Count > 0)
|
|
{
|
|
var addin2 = new Addin(filePath, list2);
|
|
Applications.AddAddIn(addin2);
|
|
addinType |= AddinType.Application;
|
|
}
|
|
return addinType;
|
|
}
|
|
|
|
public void SaveToRevitIni()
|
|
{
|
|
if (!File.Exists(RevitIniFile.FilePath))
|
|
{
|
|
throw new System.IO.FileNotFoundException(
|
|
$"can't find the revit.ini file from: {RevitIniFile.FilePath}",
|
|
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))
|
|
{
|
|
new FileInfo(AimIniFile.FilePath).Create();
|
|
FileUtils.SetWriteable(AimIniFile.FilePath);
|
|
}
|
|
Commands.Save(AimIniFile);
|
|
Applications.Save(AimIniFile);
|
|
}
|
|
|
|
public bool HasItemsToSave()
|
|
{
|
|
foreach (var addin in Commands.AddinDict.Values)
|
|
{
|
|
if (addin.Save)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
foreach (var addin2 in Applications.AddinDict.Values)
|
|
{
|
|
if (addin2.Save)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public string SaveToAllUserManifest(AddinType addinTypeToSave)
|
|
{
|
|
var folderPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
|
|
var currentAddinFolder = Path.Combine(folderPath, $"Autodesk\\Revit\\Addins\\{App.RevitVersion}");
|
|
var manifestFile = new ManifestFile(false);
|
|
var numCmdAddins = 0;
|
|
Addin savedCmdAddin = null;
|
|
if (addinTypeToSave == AddinType.Command)
|
|
{
|
|
foreach (var cmdAddin in Commands.AddinDict.Values.Where(a => a.Save))
|
|
{
|
|
numCmdAddins++;
|
|
savedCmdAddin = cmdAddin;
|
|
foreach (var addinItem in cmdAddin.ItemList.Where(i => i.Save))
|
|
{
|
|
manifestFile.Commands.Add(addinItem);
|
|
}
|
|
}
|
|
}
|
|
|
|
var numAppAddins = 0;
|
|
Addin savedAppAddin = null;
|
|
if (addinTypeToSave == AddinType.Application)
|
|
{
|
|
foreach (var appAddin in Applications.AddinDict.Values.Where(a => a.Save))
|
|
{
|
|
numAppAddins++;
|
|
savedAppAddin = appAddin;
|
|
foreach (var appAddinItem in appAddin.ItemList.Where(i => i.Save))
|
|
{
|
|
manifestFile.Applications.Add(appAddinItem);
|
|
}
|
|
}
|
|
}
|
|
var addinFileName = string.Empty;
|
|
string addinFilePath;
|
|
if (numCmdAddins <= 1 && numAppAddins <= 1 && numCmdAddins + numAppAddins > 0)
|
|
{
|
|
if (savedCmdAddin != null)
|
|
{
|
|
if (savedAppAddin == null || savedCmdAddin.FilePath.Equals(savedAppAddin.FilePath, StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
addinFileName = Path.GetFileNameWithoutExtension(savedCmdAddin.FilePath);
|
|
}
|
|
}
|
|
else if (savedAppAddin != null && savedCmdAddin == null)
|
|
{
|
|
addinFileName = Path.GetFileNameWithoutExtension(savedAppAddin.FilePath);
|
|
}
|
|
if (string.IsNullOrEmpty(addinFileName))
|
|
{
|
|
return string.Empty;
|
|
}
|
|
addinFilePath = GetProperFilePath(currentAddinFolder, addinFileName, ".addin");
|
|
}
|
|
else
|
|
{
|
|
addinFilePath = GetProperFilePath(currentAddinFolder, "ExternalTool", ".addin");
|
|
}
|
|
manifestFile.SaveAs(addinFilePath);
|
|
return addinFilePath;
|
|
}
|
|
|
|
public void SaveToLocalManifest(AddinType addinTypeToSave)
|
|
{
|
|
if (addinTypeToSave == AddinType.Command)
|
|
{
|
|
foreach (var cmdKeyValuePair in Commands.AddinDict.Where(kv => kv.Value.Save))
|
|
{
|
|
var value = cmdKeyValuePair.Value;
|
|
var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(value.FilePath);
|
|
var directoryName = Path.GetDirectoryName(value.FilePath);
|
|
var text = Path.Combine(directoryName, $"{fileNameWithoutExtension}.addin");
|
|
var manifestFile = new ManifestFile(true);
|
|
foreach (var addinItem in value.ItemList.Where(i => i.Save))
|
|
{
|
|
manifestFile.Commands.Add(addinItem);
|
|
}
|
|
manifestFile.SaveAs(text);
|
|
}
|
|
}
|
|
|
|
if (addinTypeToSave == AddinType.Application)
|
|
{
|
|
foreach (var appKeyValuePair in Applications.AddinDict.Where(kv => kv.Value.Save))
|
|
{
|
|
var value2 = appKeyValuePair.Value;
|
|
var fileNameWithoutExtension2 = Path.GetFileNameWithoutExtension(value2.FilePath);
|
|
var directoryName2 = Path.GetDirectoryName(value2.FilePath);
|
|
var text2 = Path.Combine(directoryName2, $"{fileNameWithoutExtension2}.addin");
|
|
var manifestFile2 = new ManifestFile(true);
|
|
foreach (var addinItem3 in value2.ItemList.Where(i => i.Save))
|
|
{
|
|
manifestFile2.Applications.Add(addinItem3);
|
|
}
|
|
manifestFile2.SaveAs(text2);
|
|
}
|
|
}
|
|
}
|
|
|
|
private static string GetProperFilePath(string folder, string fileNameWithoutExt, string ext)
|
|
{
|
|
var filePath = string.Empty;
|
|
var fileIndex = -1;
|
|
do
|
|
{
|
|
fileIndex++;
|
|
var text2 = ((fileIndex <= 0) ? (fileNameWithoutExt + ext) : (fileNameWithoutExt + fileIndex + ext));
|
|
filePath = Path.Combine(folder, text2);
|
|
}
|
|
while (File.Exists(filePath));
|
|
return filePath;
|
|
}
|
|
}
|
|
}
|