添加项目文件。

This commit is contained in:
ShrlAlgo
2025-09-04 09:53:20 +08:00
parent 54b372165a
commit 5f24922f54
42 changed files with 5570 additions and 0 deletions

View File

@@ -0,0 +1,320 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
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()
{
SaveToLocalManifest();
}
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()
{
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;
foreach (var cmdAddin in Commands.AddinDict.Values)
{
if (cmdAddin.Save)
{
numCmdAddins++;
savedCmdAddin = cmdAddin;
}
foreach (var addinItem in cmdAddin.ItemList)
{
if (addinItem.Save)
{
manifestFile.Commands.Add(addinItem);
}
}
}
var numAppAddins = 0;
Addin savedAppAddin = null;
foreach (var appAddin in Applications.AddinDict.Values)
{
if (appAddin.Save)
{
numCmdAddins++;
savedAppAddin = appAddin;
}
foreach (var appAddinItem in appAddin.ItemList)
{
if (appAddinItem.Save)
{
manifestFile.Applications.Add(appAddinItem);
numAppAddins++;
savedAppAddin = appAddin;
}
}
}
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()
{
var dictionary = new Dictionary<string, Addin>();
var dictionary2 = new Dictionary<string, Addin>();
foreach (var cmdKeyValuePair in Commands.AddinDict)
{
var key = cmdKeyValuePair.Key;
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)
{
if (addinItem.Save)
{
manifestFile.Commands.Add(addinItem);
}
}
if (Applications.AddinDict.ContainsKey(key))
{
var addin = Applications.AddinDict[key];
foreach (var addinItem2 in addin.ItemList)
{
if (addinItem2.Save)
{
manifestFile.Applications.Add(addinItem2);
}
}
dictionary.Add(key, Applications.AddinDict[key]);
}
manifestFile.SaveAs(text);
}
foreach (var appKeyValuePair in Applications.AddinDict)
{
var key2 = appKeyValuePair.Key;
var value2 = appKeyValuePair.Value;
if (!dictionary.ContainsKey(key2))
{
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)
{
if (addinItem3.Save)
{
manifestFile2.Applications.Add(addinItem3);
}
}
if (Commands.AddinDict.ContainsKey(key2))
{
var addin2 = Commands.AddinDict[key2];
foreach (var addinItem4 in addin2.ItemList)
{
if (addinItem4.Save)
{
manifestFile2.Commands.Add(addinItem4);
}
}
dictionary2.Add(key2, Commands.AddinDict[key2]);
}
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;
}
}
}