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(), "文档修改");
}
}
}