Files
RevitArchive/RevitKits/ParameterManager/AddFamilyFileFamilyParamsHandler.cs

154 lines
6.4 KiB
C#
Raw Normal View History

2026-02-23 14:58:05 +08:00
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Microsoft.Win32;
using Sai.RvWrapper.Shared;
namespace SZBIM.StandardTools.ParameterManager
{
/// <summary>
/// 添加到族文件的族参数
/// </summary>
internal class AddFamilyFileFamilyParamsHandler : IExternalEventHandler
{
private string transName;
public List<ParamModel> ParameterList { get; set; }
public bool IsFamilyParam { get; set; }
public List<SharedParamModel> SharedParameters { get; set; }
public void Execute(UIApplication uiapp)
{
StringBuilder sb = new StringBuilder();
UIDocument uidoc = uiapp.ActiveUIDocument;
var app = uiapp.Application;
Document doc = uidoc.Document;
string filter = "选择族文件(*.rfa)|*.rfa";
OpenFileDialog openDialog = new OpenFileDialog
{
AddExtension = false,
CheckFileExists = false,
CheckPathExists = false,
DereferenceLinks = false,
Filter = filter,
FilterIndex = 0,
RestoreDirectory = true,
Title = "选择族文件",
ValidateNames = false,
Multiselect = true
};
if (openDialog.ShowDialog() != true || openDialog.FileNames.Length == 0)
{
return;
}
string[] families = openDialog.FileNames;
SharedParamsUtil util = new SharedParamsUtil();
DefinitionFile tempFile;
transName = IsFamilyParam ? "添加族参数" : "添加族参数(共享参数)";
using (var group = new TransactionGroup(doc, transName))
{
group.Start();
var originSharedParametersFile = uiapp.Application.SharedParametersFilename.Clone();
tempFile = util.CreateTempSharedParameterFile(app, "TempSharedParameters");
var g = tempFile.Groups.Create("TempGroup");
foreach (var family in families)
{
var famdoc = app.OpenDocumentFile(family);
var paramDatas = ParameterList.Where(data => data.IsChecked == true);
famdoc.Invoke(ts =>
{
if (IsFamilyParam)
{
foreach (var paramData in paramDatas)
{
famdoc.FamilyManager.AddParameter(paramData.FullProperty,
BuiltInParameterGroup.PG_ADSK_MODEL_PROPERTIES, ParameterType.MultilineText,
true);
}
}
else
{
foreach (var paramData in paramDatas)
{
var familyParam = famdoc.FamilyManager.get_Parameter(paramData.FullProperty);
//族参数已经存在时
if (familyParam != null)
{
sb.AppendLine($"{famdoc.Title}的{paramData.FullProperty}参数已存在,不进行添加。");
continue;
}
var sharedParamFinded = SharedParameters.FirstOrDefault(p =>
p.FullParamName == paramData.FullProperty);
try
{
if (sharedParamFinded != null)
{
var options =
new ExternalDefinitionCreationOptions(sharedParamFinded.FullParamName,
ParameterType.MultilineText)
{
GUID = new Guid(sharedParamFinded.Guid)
};
var definition = g.Definitions.get_Item(sharedParamFinded.FullParamName) ?? g.Definitions.Create(options);
famdoc.FamilyManager.AddParameter((ExternalDefinition)definition,
BuiltInParameterGroup.PG_ADSK_MODEL_PROPERTIES, true);
}
else //找不到则添加为新的共享参数
{
var options = new ExternalDefinitionCreationOptions(paramData.FullProperty,
ParameterType.MultilineText)
{
GUID = new Guid(paramData.Guid)
};
var definition = g.Definitions.get_Item(paramData.FullProperty) ??
g.Definitions.Create(options);
famdoc.FamilyManager.AddParameter((ExternalDefinition)definition,
BuiltInParameterGroup.PG_ADSK_MODEL_PROPERTIES, true);
}
}
catch (Exception)
{
// ignored
}
}
}
});
famdoc.LoadFamily(doc, new LoadFamilyOptions());
famdoc.Close(false);
}
File.Delete(tempFile.Filename);
uiapp.Application.SharedParametersFilename = originSharedParametersFile.ToString();
group.Assimilate();
}
if (string.IsNullOrEmpty(sb.ToString()))
{
TaskDialog.Show("提示", "添加完成!");
}
else
{
TaskDialog.Show("警告", sb.ToString());
}
}
public string GetName()
{
return "添加族文件参数";
}
}
}