using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Sai.RvWrapper.Shared; namespace SZBIM.StandardTools.ParameterManager { /// /// 添加项目文件中的族的族参数 /// public class AddProjectFileFamilyParamsHandler : IExternalEventHandler { private string transName; /// /// 要添加的参数合集 /// public List ParameterList { get; set; } /// /// 所有共享参数的合集(要添加的参数合集中的参数若能在这里找到,则添加这里的共享参数) /// public List SharedParameters { get; set; } public List Instances { get; set; } public bool IsFamilyParam { get; set; } //是:族参数,否:族共享参数 public void Execute(UIApplication uiapp) { StringBuilder sb = new StringBuilder(); UIDocument uidoc = uiapp.ActiveUIDocument; var app = uiapp.Application; Document doc = uidoc.Document; List instancesSelected = uidoc.Selection.PickElementsByRectangle(new TypesSelectionFilter(typeof(FamilyInstance)), "请框选需要添加共享参数作为族参数的族实例").Cast().ToList(); if (!instancesSelected.Any()) { return; } //根据族实例,去重得到族 var families = instancesSelected.GroupBy(ins => ins.Symbol.Family.Id.IntegerValue) .Select(g => g.FirstOrDefault()?.Symbol.Family) .ToList(); SharedParamsUtil util = new SharedParamsUtil(); transName = IsFamilyParam ? "添加族参数" : "添加族参数(共享参数)"; using (var group = new TransactionGroup(doc, transName)) { group.Start(); var originSharedParametersFile = uiapp.Application.SharedParametersFilename.Clone(); var tempFile = util.CreateTempSharedParameterFile(app, "TempSharedParameters"); var g = tempFile.Groups.Create("TempGroup"); foreach (var family in families) { if (!family.IsEditable) { sb.AppendLine($"族:{family.Name},无法编辑。"); continue; } var paramDatas = ParameterList.Where(data => data.IsChecked == true); var famdoc = doc.EditFamily(family); 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 transName; } } }