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 { /// /// 添加到族文件的族参数 /// internal class AddFamilyFileFamilyParamsHandler : IExternalEventHandler { private string transName; public List ParameterList { get; set; } public bool IsFamilyParam { get; set; } public List 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 "添加族文件参数"; } } }