using System.Linq; using System.Text; using System.Windows; using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Autodesk.Revit.UI.Selection; using EPPlus.Core.Extensions; using Nice3point.Revit.Toolkit.External; using Nice3point.Revit.Toolkit.Utils; using OfficeOpenXml; using RevitAddins; using Szmedi.RvKits.Mvvm.Attributes; namespace Szmedi.Test { [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] [ShortcutRep("TEST")] public class TestCmd : ExternalCommand { //一个判断两条模型线是否平行的方法 /// /// 扩展包围盒的大小 /// /// /// /// public static BoundingBoxXYZ Extend(BoundingBoxXYZ boundingBox, double distance = 2.0) { var transform = boundingBox.Transform; var max = boundingBox.Max + (distance * (transform.BasisX + transform.BasisY + transform.BasisZ)); var min = boundingBox.Min - (distance * (transform.BasisX + transform.BasisY + transform.BasisZ)); return new BoundingBoxXYZ { Max = max, Min = min, Transform = transform }; } // 合法化 Sheet 名称 private string MakeValidSheetName(string name) { var invalid = new[] { '\\', '/', '*', '[', ']', ':', '?' }; foreach (var ch in invalid) { name = name.Replace(ch, '_'); } return name.Length > 31 ? name.Substring(0, 31) : name; } private void NewMethod(IEnumerable> groupedModels) { using (var pkg = new ExcelPackage()) { //深圳构件标识 foreach (var g in groupedModels) { var sheetName = MakeValidSheetName(g.Key); var ws = pkg.Workbook.Worksheets.Add(sheetName); //第一行 ws.Cells[1, 1].Value = g.Key; var columns = g.Sum(m => m.Count); //合并单元格 ws.Cells[1, 1, 1, columns].Merge = true; ws.Cells[1, 1].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; ws.Cells[1, 1].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; ws.Cells[1, 1].Style.Font.Size = 20; ws.Cells[1, 1].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.FromArgb(255, 255, 0)); ws.Cells[1, 1].Style.Border.BorderAround(OfficeOpenXml.Style.ExcelBorderStyle.Thin); var currentColumns = 1; var models = g.ToList(); foreach (var m in models) { var subColumns = m.Count; //第二行 ws.Cells[2, currentColumns, 2, subColumns].Merge = true; //合并单元格 ws.Cells[2, currentColumns].Value = models.FirstOrDefault().Groups.Keys; currentColumns += 1 + subColumns; } } } } private static bool IsParallel(Line line1, Line line2) { return line1.Direction.IsAlmostEqualTo(line2.Direction) || line1.Direction.IsAlmostEqualTo(-line2.Direction); } //private bool IsConnectToSystem(FamilyInstance ins) //{ // bool hasConnectToSystem = false; // if (ins.Category.CategoryType != CategoryType.FacilityNumber) // { // return true; // } // if (ins.get_BoundingBox(null) != null && // ins.MEPModel?.ConnectorManager != null) // { // var cons = ins.GetConnectors(false); // foreach (Connector con in cons) // { // if (con.Domain != Domain.DomainElectrical && con.Domain != Domain.DomainUndefined) // { // try // { // if (con.IsConnected) // { // hasConnectToSystem = true; // } // } // catch (Exception) // { // } // } // } // } // return hasConnectToSystem; //} public List GetUsedFamilies(Document doc) { // 获取所有实例元素(这里不需要由ToElements()转化全部对象,节省内存,仅遍历) var instances = doc.OfClass(); // 3. 收集所有被使用的“类型ID” (使用HashSet自动去重) HashSet usedTypeIds = new HashSet(); foreach (Element elem in instances) { ElementId typeId = elem.GetTypeId(); if (typeId != ElementId.InvalidElementId) { usedTypeIds.Add(typeId); } } // 4. 从类型反向获取族 (使用HashSet再次去重族ID,防止多个类型属于同一个族) HashSet usedFamilyIds = new HashSet(); List resultFamilies = new List(); foreach (ElementId typeId in usedTypeIds) { // 获取类型元素 (FamilySymbol) Element typeElem = doc.GetElement(typeId); FamilySymbol symbol = typeElem as FamilySymbol; if (symbol != null) { Family family = symbol.Family; // 确保族存在且未被添加过 if (family != null && !usedFamilyIds.Contains(family.Id)) { usedFamilyIds.Add(family.Id); resultFamilies.Add(family); } } } return resultFamilies; } public static void ToExcel(string excelPath, List infos) { FileInfo fi = new(excelPath); ExcelPackage package = infos.ToWorksheet("构件数量变动对比表") .WithConfiguration(cfg => cfg.WithColumnConfiguration(c => c.AutoFit())) .ToExcelPackage(); package.SaveAs(fi); } public override void Execute() { //var parameter = Document.FamilyManager.GetParameters().FirstOrDefault(p => p.Definition.Name == "额定电流"); //Document.Invoke( // ts => // { // Document.FamilyManager.ReplaceParameter(parameter, "测试", BuiltInParameterGroup.PG_TEXT, true); // }); var docs = Application.Documents; if (docs.Size != 2) { return; } var doc1 = docs.OfType().First(); var doc2 = docs.OfType().Last(); var elements1 = doc1.OfCollector().WhereElementIsNotElementType().Where(e => e.Category?.CategoryType == CategoryType.Model && e.get_BoundingBox(null) != null); var elements2 = doc2.OfCollector().WhereElementIsNotElementType().Where(e => e.Category?.CategoryType == CategoryType.Model && e.get_BoundingBox(null) != null); StringBuilder stringBuilder = new StringBuilder(); foreach (var e1 in elements1) { foreach (var e2 in elements2) { if (e1.Id.IntegerValue == e2.Id.IntegerValue) { stringBuilder.Append($"重复图元:{e1.Id};"); } } } MessageBox.Show(stringBuilder.ToString()); return; var doc = Document; if (doc.IsFamilyDocument) { return; } var familyCollector = new FilteredElementCollector(doc) .OfClass(typeof(Family)) .Cast() .ToList(); MessageBox.Show(familyCollector.Count().ToString()); var fams = GetUsedFamilies(doc) .Cast() .Where( fam => fam.FamilyCategory.AllowsBoundParameters && fam.IsEditable && fam.FamilyCategory.CategoryType == CategoryType.Model && !Enum.GetName(typeof(BuiltInCategory), fam.FamilyCategoryId.IntegerValue)!.Contains( "Fitting") && fam.FamilyCategoryId.IntegerValue != -2008013).ToList();//风道末端 MessageBox.Show(fams.Count().ToString()); return; var elements = new FilteredElementCollector(Document).WhereElementIsNotElementType() .ToElements() .ToList(); StringBuilder sb = new StringBuilder(); var elementIds = new List(); foreach (var item in elements) { var level = Document.GetElement(item.GetLevelId())?.Name; var param = item.get_Parameter(BuiltInParameter.DOOR_NUMBER)?.AsString(); if (param != null && level != null && param.Contains("B2") && level.Contains("站厅")) { sb.AppendLine($"{item.Id}"); elementIds.Add(item.Id); } if (param != null && level != null && param.Contains("B1") && level.Contains("站台")) { sb.AppendLine($"{item.Id}"); elementIds.Add(item.Id); } } if (sb.Length > 0) { UiDocument.Selection.SetElementIds(elementIds); } return; var walls = new FilteredElementCollector(Document).WhereElementIsNotElementType() .OfClass(typeof(Wall)) .ToElements() .Cast() .ToList(); foreach (var wall in walls) { var inserts = wall.FindInserts(true, false, false, false); foreach (var id in inserts) { var insert = Document.GetElement(id); if (insert != null) { switch (insert) { //门窗 case FamilyInstance fi: { var symbol = fi.Symbol; //Revit2018 //宽度 var width = symbol.get_Parameter(BuiltInParameter.DOOR_WIDTH).AsValueString(); //高度 var height = symbol.get_Parameter(BuiltInParameter.GENERIC_HEIGHT).AsValueString(); //Revit2020 var width2020 = symbol.get_Parameter(BuiltInParameter.FURNITURE_WIDTH).AsValueString(); var height2020 = symbol.get_Parameter(BuiltInParameter.FAMILY_HEIGHT_PARAM).AsValueString(); break; } //洞口 case Opening o: { var minPoint = o.BoundaryRect[0]; var maxPoint = o.BoundaryRect[1]; //高度 var height = Math.Abs(maxPoint.Z - minPoint.Z) * 304.8; var minPointFlatten = new XYZ(minPoint.X, minPoint.Y, 0); var maxPointFlatten = new XYZ(maxPoint.X, maxPoint.Y, 0); //宽度 var width = minPointFlatten.DistanceTo(maxPointFlatten) * 304.8; MessageBox.Show($"{width} x {height}"); break; } default: break; } } } } //var elements = UiDocument.Selection // .GetElementIds() // .Select(Document.GetElement) // .Cast() // .Where(e => e.get_Parameter(BuiltInParameter.INSTANCE_ELEVATION_PARAM).AsDouble() < 10e-5) // .Select(e => e.Id).ToList(); //UiDocument.Selection.SetElementIds(elements); return; //Document.Invoke(ts => //{ // elements.ForEach(e=>e.Host) //}) //Material.Create(Document, "测试材质"); //var reference = UiDocument.Selection.PickObject(ObjectType.Element); //var ins = Document.GetElement(reference) as FamilyInstance; //var bo = IsConnectToSystem(ins); //MessageBox.Show(bo.ToString()); //return; #if false var manager = Document.FamilyManager; var names = manager.Types.OfType().Select(t => t.Name); bool b = names.Contains(" "); MessageBox.Show(manager.Types.Size.ToString()); return; var e = UiDocument.Selection.PickElementsByRectangle().Cast().FirstOrDefault(); //var b1 = e.Diameter == null; //var b2 = e.Height == null; //MessageBox.Show(.ToString()); return; var refer1 = UiDocument.Selection.PickObject(ObjectType.Element, new GenericFilter(), "选择模型线"); var elem = Document.GetElement(refer1) as ModelCurve; var col = new FilteredElementCollector(Document, Document.ActiveView.Id).WhereElementIsNotElementType() .Where(e => e is ModelCurve mc && mc.LineStyle.Id == elem.LineStyle.Id).Select(e => e.Id).ToList(); UiDocument.Selection.SetElementIds(col); //var refer2 = UiDocument.Selection.PickObject(ObjectType.Element, new GenericFilter(), "选择模型线"); //var elem2 = Document.GetElement(refer2) as ModelCurve; //if (IsParallel(elem.GeometryCurve as Line, elem2.GeometryCurve as Line)) //{ // MessageBox.Show("平行"); //} //var groups = Document.OfParentModelCollector().WhereElementIsNotElementType() // .GroupBy(e => e.GetParameters("深圳构件标识").FirstOrDefault().AsString()); //StringBuilder sb = new StringBuilder(); //foreach (var element in groups) //{ // sb.AppendLine(element.Key); //} //MessageBox.Show(sb.ToString()); //var reference = UiDocument.Selection.PickObject(ObjectType.PointOnElement, new GenericFilter(), "请选择CAD文字"); //var instance = doc.GetElement(reference) as ImportInstance; //var ids = UiDocument.Selection.GetElementIds(); //Document.Modify( // settings => settings.Transaction).Commit((doc, _) => // { //var familyName = "族名称"; //using (Transaction ts = new Transaction(doc, "更新族类型名称")) //{ // ts.Start(); // //获取某个族 // var element = new FilteredElementCollector(doc).OfClass(typeof(Family)).Where(e => e.Name == familyName).Cast().FirstOrDefault(); // if (element == null) // { // TaskDialog.Show("提示", "没有找到指定的族"); // ts.RollBack(); // return; // } // var ids = element.GetFamilySymbolIds(); // foreach (var id in ids) // { // //获取族类型 // var symbol = doc.GetElement(id) as FamilySymbol; // //宽度 // var w = Convert.ToDouble(symbol.GetParameters("宽度").FirstOrDefault().AsValueString()); // //高度 // var h = Convert.ToDouble(symbol.GetParameters("高度").FirstOrDefault().AsValueString()); // if (ids != null) // { // //前缀 // var prefix = string.Empty; // //后缀 // var suffix = string.Empty; // string width = string.Empty; // string height = string.Empty; // if (w / 1000 < 1) // { // width = $"0{w}mm"; // } // if (h / 1000 < 1) // { // height = $"0{h}mm"; // } // //如果width和height最后一个数字是5,则把5改成a // if (width.Last() == '5') // { // width = width.Remove(width.Length - 1) + "a"; // } // if (height.Last() == '5') // { // height = height.Remove(height.Length - 1) + "a"; // } // var newName = $"{prefix}{width} x {height}{suffix}"; // symbol.Name = newName; // } // } // ts.Commit(); //} // }); //var ids = Document.ActiveView // .OfCollector() // .Where(e => e.get_Parameter(BuiltInParameter.DOOR_NUMBER)?.AsString() == "J4921321-11332-(005)DK0001").Select(e => e.Id).ToList(); //MessageBox.Show(ids.Count.ToString()); //UiDocument.Selection.SetElementIds(ids); //var elemIds = GetElementIds(); //var ids = UiDocument.Selection.GetElementIds(); //var start = new XYZ(-61995.832703373, 4243.667605320, 5999.999999997); //var end = new XYZ(0.000000000, 0.000000000, 5999.999999997); //var translate = (end - start) / 304.8; //using (Transaction ts = new Transaction(doc, "移动")) //{ // ts.Start(); // ElementTransformUtils.MoveElements(doc, ids, translate); // ts.Commit(); //} //var id = UiDocument.Selection.GetElementIds().FirstOrDefault(); //var ids = doc.GetElement(id) as FamilyInstance; //var n = ids.GetSubComponentIds().Count; //MessageBox.Show(n.ToString()); //var ids = UiDocument.Selection.GetElementIds(); //var translate = XYZ.BasisZ * 20; //using (Transaction ts = new Transaction(doc, "移动")) //{ // ts.Start(); // ElementTransformUtils.CopyElements(doc, ids, translate); // ElementTransformUtils.MoveElements(doc, ids, translate); // ts.Commit(); //} #endif #if false var symbols = new FilteredElementCollector(Document).OfClass(typeof(Wall)).ToElementIds(); foreach (var item in symbols) { var elem = Document.GetElement(item); var cat = elem.Category.Name; var cate = Category.GetCategory(Document, elem.Category.Id); var cate1 = Category.GetCategory(Document, (BuiltInCategory)elem.Category.Id.IntegerValue); } var dict = new FilteredElementCollector(Document).OfClass(typeof(ElementType)) .OfType() .Where( t => t.CanBeRenamed && t.Category is { CategoryType: CategoryType.Model or CategoryType.Annotation }) .GroupBy(t => t.Category.Id) .Where(g => !string.IsNullOrEmpty(g.FirstOrDefault().Category?.Name)) .ToDictionary(g => g.FirstOrDefault().Category.Name, g => g.ToList()); //UiDocument.Selection.SetElementIds(symbols); StringBuilder sb = new StringBuilder(); foreach (var kv in dict) { foreach (var item in kv.Value) { if (item is WallType t) { sb.AppendLine($"{kv.Key}-{t.Kind}-{item.Name}"); } } } MessageBox.Show(sb.ToString()); #endif //foreach (BuiltInCategory id in Enum.GetValues(typeof(BuiltInCategory))) //{ // var names = Enum.GetName(typeof(BuiltInCategory), id); //} //using (Transaction ts = new Transaction(doc, "修改类型名称")) //{ // ts.Start(); // try // { // foreach (var id in symbols) // { // if (id.Name == "标准") // { // if (id is FamilySymbol ids) // { // id.Name = ids.FamilyName; // } // } // } // } // catch (Exception) // { // throw; // } // ts.Commit(); //} //UiDocument.Selection.SetElementIds([new ElementId(2222596)]); //var dims = doc.QueryElementsByType().WhereElementIsNotElementType().ToElementIds(); //UiDocument.Selection.SetElementIds(dims); //var refer = UiDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element); //var ids = doc.GetElement(refer); //foreach (Parameter param in ids.Parameters) //{ //} #region MyRegion ////var service = new ricaun.Revit.ExtensibleShortcuts.Services.KeyboardShortcutService(); ////service.SetRibbonItemShortcut("CustomCtrl_%CustomCtrl_%SZMEDI工具%机电工具%MoveConnectCmd", "MC"); //var dict = ShortcutsHelper.Commands; //StringBuilder sb = new StringBuilder(); //sb.AppendLine("Name,CommandName,CommandId,CommandPaths,CommandScope,Shortcuts,ShortcutType,ShortcutsRep,"); //foreach (var id in dict) //{ // string text = id.Value.CommandName; // string commandName = string.Join("", text.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries)); // sb.AppendLine( // $"{id.Key},{commandName},{id.Value.CommandId},{id.Value.CommandPaths},{id.Value.CommandScope},{id.Value.Shortcuts},{id.Value.ShortcutType},{id.Value.ShortcutsRep},"); // //if (ShortcutsHelper.Commands.TryGetValue("CustomCtrl_%CustomCtrl_%SZMEDI工具%机电工具%MoveConnectCmd", out var shortcutItem)) // //{ // // //为命令指定快捷键QQQQ // // shortcutItem.Shortcuts.Add("MC"); // // break; // // //为命令删除快捷键QQQQ // // //shortcutItem.Shortcuts.Remove("QQQQ"); // // //为命令清空快捷键 // // //shortcutItem.Shortcuts.Clear(); // //} //} //LogUtil.WriteTxtFile("快捷键", sb.ToString()); ////KeyboardShortcutService.applyShortcutChanges(dict); #endregion //var window = new MainWindow() { DataContext = new MainWindowViewModel(UiDocument) }; //window.Show(); //var refer = UiDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element); //var ids = doc.GetElement(refer); //var boundingbox = ids.get_BoundingBox(null); //using var ts = new Transaction(doc, "Test"); //ts.Start(); //if (doc.ActiveView is View3D view3D) //{ // view3D.SetSectionBox(Extend(boundingbox)); //} //ts.Commit(); //var ids = UiDocument.Selection.GetElementIds(); //using (var ts = new Transaction(doc, "Test")) //{ // ts.Start(); // foreach (var id in ids) // { // var ids = doc.GetElement(id) as FamilyInstance; // //ElementTransformUtils.RotateElement(doc, id, Line.CreateUnbound((ids.Location as LocationPoint).Point, XYZ.BasisZ), /*65.43 / 180 * */Math.PI); // ElementTransformUtils.MoveElement(doc, id, ids.HandOrientation * 1200 / 304.8); // doc.Regenerate(); // //ElementTransformUtils.RotateElement(doc, id, Line.CreateUnbound((ids.Location as LocationPoint).Point, XYZ.BasisZ), /*65.43 / 180 * */Math.PI); // } // ts.Commit(); //} #region Updater //ChangeTypeUpdater _updater = new(UiApplication, new Guid("{A3441B77-7558-41EF-A3BF-4690C99F67C0}")); //UpdaterRegistry.RegisterUpdater(_updater, true); //UpdaterRegistry.AddTrigger(_updater.GetUpdaterId(), new ElementClassFilter(typeof(FamilyInstance)), Element.GetChangeTypeAny()); #endregion //var ids = UiDocument.Selection.GetElementIds().Select(id=>doc.GetElement(id)).OfType().Select(mc=>mc.GeometryCurve).ToList(); //SetComparisonResult comparisonR = ids[0].Intersect(ids[1], out var intersectionResult); //System.Windows.MessageBox.Show($"{comparisonR}"); //try //{ // var cl = CurveLoop.Create(ids); //} //catch (Exception) //{ // throw; //} //Application.DocumentChanged -= Application_DocumentChanged; //Application.DocumentChanged += Application_DocumentChanged; #region MyRegion var refer = UiDocument.Selection.PickObject(ObjectType.Element); var ids = (Document.GetElement(refer) as FamilyInstance).Symbol; Document.Modify(set => set.Transaction) .Commit((d, _) => { if (!ids.IsActive) { ids.Activate(); } var level = new FilteredElementCollector(d).OfClass(typeof(Level)) .OfType() .FirstOrDefault(l => l.Elevation > 0); d.Create .NewFamilyInstance( new XYZ(0, 0, 0), ids, level, Autodesk.Revit.DB.Structure.StructuralType.NonStructural); }); #endregion //XYZ p1 = new XYZ(); //XYZ p2 = XYZ.BasisX; //XYZ p3 = XYZ.BasisY; //XYZ p4 = XYZ.BasisZ; //var list = new List() { p1, p2, p3 }; //HermiteSpline curve = HermiteSpline.Create(list, false); //using (Transaction ts = new Transaction(doc, "test")) //{ // ts.Start(); // SketchPlane sketch = SketchPlane.Create(doc, Plane.CreateByNormalAndOrigin(p4, p1)); // var mc = doc.Create.NewModelCurve(curve, sketch); // ts.Commit(); //} //Autodesk.Revit.DB.Reference e = UiDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element); } private static void MoveRoomSeparator(Document doc, ICollection ids, double dis) { var distance = dis / 304.8; foreach (var id in ids) { var element = doc.GetElement(id); if (element is ModelCurve modelCurve) { var start = modelCurve.GeometryCurve.GetEndPoint(0); var end = modelCurve.GeometryCurve.GetEndPoint(1); var sketch = SketchPlane.Create(doc, Plane.CreateByNormalAndOrigin(XYZ.BasisZ, start + (XYZ.BasisZ * distance))); var line = Line.CreateBound(start + (XYZ.BasisZ * distance), end + (XYZ.BasisZ * distance)); var array = new CurveArray(); array.Append(line); doc.Create.NewRoomBoundaryLines(sketch, array, doc.ActiveView); } } doc.Delete(ids); } private static void DrawColumnsBoundLines(Document doc, List selectedColumns) { foreach (FamilyInstance column in selectedColumns) { // 获取结构柱的几何信息 var geomOptions = new Options(); var geomElement = column.get_Geometry(geomOptions); foreach (var geomObj in geomElement) { var geometryInstance = geomObj as GeometryInstance; if (geometryInstance != null) { // 处理几何实例 var instanceGeomElement = geometryInstance.GetInstanceGeometry(); foreach (var instanceGeomObj in instanceGeomElement) { if (instanceGeomObj is Solid solid) { foreach (Face face in solid.Faces) { if (face is PlanarFace planarFace && planarFace.FaceNormal.IsAlmostEqualTo(-XYZ.BasisZ)) { var edgeLoops = planarFace.EdgeLoops; foreach (EdgeArray edgeArray in edgeLoops) { var curveArray = new CurveArray(); foreach (Edge edge in edgeArray) { var curve = edge.AsCurve(); curveArray.Append(curve); } if (curveArray.Size > 0) { // 获取活动视图的 SketchPlane var sketchPlane = SketchPlane.Create( doc, doc.ActiveView.GenLevel.Id); // 绘制房间分割线 var lines = doc.Create .NewRoomBoundaryLines(sketchPlane, curveArray, doc.ActiveView); } } } } } } } } } } public class SelectionFilter : ISelectionFilter { public bool AllowElement(Element elem) { return elem is Wall; } public bool AllowReference(Reference reference, XYZ position) { return true; } } public class ChangeTypeUpdater : IUpdater { private UpdaterId _uid; public ChangeTypeUpdater(UIApplication uiapp, Guid guid) { _uid = new UpdaterId(uiapp.ActiveAddInId, guid); } public void Execute(UpdaterData data) { Func, string> toString = ids => ids.Aggregate(string.Empty, (ss, id) => ss + "," + id).TrimStart(','); StringBuilder sb = new(); sb.AppendLine("added:" + toString(data.GetAddedElementIds())); sb.AppendLine("modified:" + toString(data.GetModifiedElementIds())); sb.AppendLine("deleted:" + toString(data.GetDeletedElementIds())); TaskDialog.Show("Changes", sb.ToString()); } public string GetAdditionalInformation() { return "N/A"; } public ChangePriority GetChangePriority() { return ChangePriority.FreeStandingComponents; } public UpdaterId GetUpdaterId() { return _uid; } public string GetUpdaterName() { return "ChangeTypeUpdater"; } } private void Application_DocumentChanged(object sender, Autodesk.Revit.DB.Events.DocumentChangedEventArgs e) { var a = sender as Autodesk.Revit.ApplicationServices.Application; var doc = e.GetDocument(); ElementClassFilter filter = new(typeof(FamilyInstance)); var modifyIds = e.GetModifiedElementIds(filter); var addIds = e.GetAddedElementIds(filter); var deleteIds = e.GetDeletedElementIds(); StringBuilder sb = new(); if (modifyIds.Count > 0) { sb.AppendLine("修改"); foreach (var id in modifyIds) { sb.AppendLine($"{id}-{doc.GetElement(id).Name}"); } } if (addIds.Count > 0) { sb.AppendLine("添加"); foreach (var id in addIds) { sb.AppendLine($"{id}-{doc.GetElement(id).Name}"); } } if (deleteIds.Count > 0) { sb.AppendLine("删除"); foreach (var id in deleteIds) { sb.AppendLine($"{id}-{doc.GetElement(id).Name}"); } } MessageBox.Show(sb.ToString(), "文档修改"); } } }