using System.Diagnostics; using System.IO; using System.Text; using System.Windows; using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Nice3point.Revit.Toolkit.External; using Nice3point.Revit.Toolkit.Utils; using ShrlAlgoToolkit.Revit.Assists; using ShrlAlgoToolkit.Revit.Extensions; namespace ShrlAlgo.Addin.Test; [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] internal class FluentAddin : ExternalCommand { /// /// 设备类型是否为空 /// private void CableTrayCheck() { //var list = Document.OfClass().Cast().ToList(); var list = Document.OfCollector().OfCategory(BuiltInCategory.OST_CableTrayFitting).WhereElementIsNotElementType().ToList(); var ids = new List(); foreach (var item in list) { var elem = Document.GetElement(item.GetTypeId()); var value = item.get_Parameter(BuiltInParameter.RBS_CTC_SERVICE_TYPE).AsString(); if (string.IsNullOrEmpty(value)) { ids.Add(item.Id); continue; } if (elem.Name.Contains(value)) { continue; } ids.Add(item.Id); } UiDocument.Selection.SetElementIds(ids); } /// /// 修改名称 /// private void ModifyName() { Document.Modify(set => set.Transaction) .Commit( (d, t) => { //var point = Point.Create(new XYZ(10,10,10), new ElementId(1236)); //Document.CreateTransientElements([point]); var fittings = Document .OfClass() .WhereElementIsElementType().Cast(); //var fittings = Document.OfCollector() // .OfCategory(BuiltInCategory.OST_DuctFitting) // .WhereElementIsElementType().Cast(); foreach (var item in fittings) { //point=Point.Create(XYZ.BasisX); //if (item.Name.StartsWith("DN")) //{ // item.Name = item.FamilyName + "-" + item.Name; //} if (item.Name == "标准" || item.Name == "默认") { item.Name = item.FamilyName; } //try //{ // item.get_Parameter(BuiltInParameter.ALL_MODEL_URL).Set(""); // item.get_Parameter(BuiltInParameter.ALL_MODEL_DESCRIPTION).Set(""); //} //catch (Exception) //{ // MessageBox.Show(item.Name); //} } }); } /// /// 坡度检查 /// private void SlopeCheck() { var mepCurves = ActiveView.OfClass(); var ids = new List(); foreach (var mepCurve in mepCurves) { var p1 = mepCurve.get_Parameter(BuiltInParameter.RBS_START_OFFSET_PARAM).AsDouble(); var p2 = mepCurve.get_Parameter(BuiltInParameter.RBS_END_OFFSET_PARAM).AsDouble(); var l = mepCurve.get_Parameter(BuiltInParameter.CURVE_ELEM_LENGTH).AsDouble(); var sin = Math.Abs(p1 - p2) / l; var radian = Math.Asin(sin); var slope = Math.Tan(radian); var isError = slope is (> 10E-6 and < 0.25) || (slope > Math.PI && Math.Abs(radian - Math.PI / 2) > 10E-6); if (isError) { Debug.WriteLine($"角度:{radian}"); Debug.WriteLine($"坡度:{slope}"); ids.Add(mepCurve.Id); } } UiDocument.Selection.SetElementIds(ids); } public override void Execute() { var elementsBaseFace = Document.OfClass().Where( e => e is FamilyInstance ins && ins.Symbol.Family.FamilyPlacementType == FamilyPlacementType.WorkPlaneBased && ins.Host == null && ins.HostFace == null).ToList(); StringBuilder sb = new StringBuilder(); foreach (var elem in elementsBaseFace) { sb.AppendLine($"{elem.Id},{elem.Name}"); } if (sb.Length > 0) { File.WriteAllText(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\MoveModel.csv", sb.ToString()); } //UiDocument.Selection.SetElementIds(elementsBaseFace); return; //var dwg = Document.OfClass(); //UiDocument.Selection.SetElementIds(dwg.ToElementIds()); var refer = UiDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element); Document.Invoke( ts => { var elem = Document.GetElement(refer); ElementTransformUtils.CopyElement(Document, elem.Id, XYZ.BasisY); }); return; FluentWindow fluentWindow = new FluentWindow(); fluentWindow.ShowDialog(); return; var fm = Document.FamilyManager; var current = fm.CurrentType; var count = fm.Types.Size; Document.Invoke( ts => { foreach (FamilyType item in fm.Types) { var b = string.IsNullOrWhiteSpace(item.Name); //MessageBox.Show(item.Name); if (b) { fm.CurrentType = item; fm.DeleteCurrentType(); } } //fm.NewType("NewType"); }); return; var ids = Document.ActiveView.OfCollector().WhereElementIsNotElementType().Where(e => e.GetLevelId() == ElementId.InvalidElementId).Select(e => e.Id).ToList(); UiDocument.Selection.SetElementIds(ids); return; var textTypes = Document.OfClass().ToList(); var accessoryTypes = Document.OfClass().OfCategory(BuiltInCategory.OST_PipeAccessory).WhereElementIsElementType().ToList(); var filledRegionTypes = Document.OfClass().ToList(); var materialToClean = Document.OfClass().Where(m => m.Name.StartsWith("渲染材质")).Select(e => e.Id).ToList(); Application.DocumentChanged += Application_DocumentChanged; Document.Invoke( ts => { //var id = UiDocument.Selection.GetElementIds().FirstOrDefault(); //var elem = Document.GetElement(id); //var typeId = elem.GetTypeId(); //CleanImportLinePattern(Document); //try //{ // foreach (var item in accessoryTypes) // { // if (item is FamilySymbol symbol) // { // symbol.Name = $"{symbol.FamilyName}-{symbol.Name}"; // } // } //} //catch (Exception ex) //{ // throw ex; //} //foreach (var type in textTypes) //{ // CleanTextTypes(type); //} //foreach (var item in filledRegionTypes) //{ // if (item is FilledRegionType type) // { // var foreFillType = type.ForegroundPatternId; // var foreFillColor = type.ForegroundPatternColor; // var backFillType = type.BackgroundPatternId; // var backFillColor = type.BackgroundPatternColor; // } //} //Document.Delete(materialToClean); }); //string input = type.Name; //int lastDashIndex = input.LastIndexOf('-'); //if (lastDashIndex != -1) //{ // string result = input.Substring(0, lastDashIndex); // type.Name = result; //} //UiDocument.Selection.SetElementIds(elemIds); //var refer = UiDocument.Selection.PickObject(ObjectType.Element); //var elem = Document.GetElement(refer); //var conn = elem.GetConnectors().Cast().Where(c => c.IsConnected).FirstOrDefault(); //var docType = Document.GetType(); //var method = docType.GetMethod("GetUnusedFamilies", BindingFlags.NonPublic | BindingFlags.Instance); //if (method != null) //{ // var unusedFamilyIds = method.Invoke(Document, null) as ISet; //} #region RegionName //OpenFileDialog dialog = new() { Filter = "Revit(*.rvt)|*.rvt", Multiselect = true }; //dialog.ShowDialog(); //foreach (var item in dialog.FileNames) //{ // var sb = new StringBuilder(); // sb.AppendLine($"元素ID,族名称,类型名称,标记,"); // var doc = Application.OpenDocumentFile(item); // var instances = doc.OfCollector().OfClass(typeof(FamilyInstance)).Cast().Where(e => e.Symbol.FamilyName.Contains("摄像头")); // foreach (var instance in instances) // { // var number = instance.get_Parameter(BuiltInParameter.DOOR_NUMBER); // sb.AppendLine($"{instance.Id},{instance.Symbol.FamilyName},{instance.Name},{number.AsString()},"); // } // var filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + $"\\{doc.Title}.txt"; // File.WriteAllText(filePath, sb.ToString(), Encoding.UTF8); // doc.Close(false); //} #endregion //Document.Modify(set => set.Transaction) // .Commit( // (doc, t) => // { // #region MyRegion // //var refer = UiDocument.Selection.PickObject(ObjectType.Element, new FuncFilter(e => e is DirectShape), "选择模型"); // //var shape = doc.GetElement(refer) as DirectShape; // //shape.SetName("轨道"); // #endregion // //var refer = UiDocument.Selection.PickObject(ObjectType.Element, new FuncFilter(e => e is ImportInstance importInstance), "请选择dwg实例"); // //var importInstance = doc.GetElement(refer) as ImportInstance; // //ConvertToMassCurve(importInstance); // }); } private void Application_DocumentChanged(object sender, Autodesk.Revit.DB.Events.DocumentChangedEventArgs e) { StringBuilder sb = new StringBuilder(); var doc = e.GetDocument(); bool b = true; foreach (var idAdd in e.GetAddedElementIds()) { if (b) { sb.AppendLine(); sb.AppendLine("新增的元素"); b = !b; } var elem = doc.GetElement(idAdd); var typeId = elem.GetTypeId(); if (typeId != ElementId.InvalidElementId) { var type = doc.GetElement(idAdd); sb.Append($"类型名称:{type.Name}"); } sb.Append($"元素ID:{elem.Id};元素名称:{elem.Name} "); } b = true; foreach (var idDel in e.GetDeletedElementIds()) { if (b) { sb.AppendLine(); sb.AppendLine("删除的元素"); b = !b; } var elem = doc.GetElement(idDel); var typeId = elem.GetTypeId(); if (typeId != ElementId.InvalidElementId) { var type = doc.GetElement(idDel); sb.Append($"类型名称:{type.Name}"); } sb.Append($"元素ID:{elem.Id};元素名称:{elem.Name} "); } b = true; foreach (var idModify in e.GetModifiedElementIds()) { if (b) { sb.AppendLine(); sb.AppendLine("修改的元素"); b = !b; } var elem = doc.GetElement(idModify); var typeId = elem.GetTypeId(); if (typeId != ElementId.InvalidElementId) { var type = doc.GetElement(idModify); sb.Append($"类型名称:{type.Name}"); } sb.Append($"元素ID:{elem.Id};元素名称:{elem.Name} "); } if (sb.Length > 0) { MessageBox.Show(sb.ToString()); } } /// /// 清理导入的线型图案 /// /// private static void CleanImportLinePattern(Document doc) { var templates = doc.OfClass() .Cast() .Where(e => e.Name.StartsWith("IMPORT")) .Select(e => e.Id).ToList(); doc.Delete(templates); } /// /// 清理文字样式 /// /// private void CleanTextTypes(Element type) { if (type is TextNoteType textNoteType) { try { var font = textNoteType.get_Parameter(BuiltInParameter.TEXT_FONT).AsString(); var size = textNoteType.get_Parameter(BuiltInParameter.TEXT_SIZE).AsValueString().TrimEnd('m'); var dSize = Math.Round(Convert.ToDouble(size), 1, MidpointRounding.AwayFromZero); if (dSize < 0.23) { return; } textNoteType.get_Parameter(BuiltInParameter.TEXT_SIZE).SetValueString(dSize.ToString()); var scale = textNoteType.get_Parameter(BuiltInParameter.TEXT_WIDTH_SCALE).AsValueString(); //var color = textNoteType.get_Parameter(BuiltInParameter.LINE_COLOR).AsInteger(); var name = $"{font}-{dSize}mm-{scale}"; var textTypes = Document.OfClass().ToList(); var isExist = textTypes.FirstOrDefault(t => t.Name == name); if (isExist != null) { var texts = Document.OfClass().Where(e => e.GetTypeId() == textNoteType.Id).ToList(); texts.ForEach(e => e.ChangeTypeId(isExist.Id)); Document.Regenerate(); Document.Delete(textNoteType.Id); } else { textNoteType.Name = name; } } catch (Exception) { throw; } } } }