using System.Diagnostics; using System.IO; using System.Management.Instrumentation; using System.Text; using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.DB.Mechanical; using Autodesk.Revit.UI; using Autodesk.Revit.UI.Selection; using Microsoft.Win32; using Nice3point.Revit.Toolkit.External; using Nice3point.Revit.Toolkit.Utils; using Sai.Toolkit.Revit.Assist; using Sai.Toolkit.Revit.Helpers; namespace RvAddinTest; [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] internal class FluentAddin : ExternalCommand { public override void Execute() { //var b = Document.ActiveView.ViewTemplateId == null; //MessageExtensions.ShowMessage(b.ToString()); //var h = Document.ActiveView // .OfClass() // .Cast() // .Where( // d => // d.ConnectorManager.Connectors.OfType().FirstOrDefault().Shape // != ConnectorProfileType.Round // ) // .Max(d => d.Height); //Document.Invoke 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); } //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); // }); //DebugAssist.CreateTransientGeometries(Document,Point.Create(Document.ActiveView.CropBox.Transform.Origin)); //DebugAssist.CreateTransientGeometries(Document,Point.Create(Document.ActiveView.CropBox.Min)); //DebugAssist.CreateTransientGeometries(Document,Point.Create(Document.ActiveView.CropBox.Max)); //var mepCurve = UiDocument.SelectObject(); //if (mepCurve != null) //{ // var list = new List(); // mepCurve.GetAllConnectedElements(list); // UiDocument.Selection.SetElementIds(list); //} } private void GetDiffSystemFittings() { var elbows = Document.OfClass() .OfCategory(BuiltInCategory.OST_PipeFitting) .Cast() .Where(fi => fi.MEPModel is MechanicalFitting fitting && fitting.PartType == PartType.Elbow); var elementId = ElementId.InvalidElementId; foreach (var elbow in elbows) { if (elbow.Id.IntegerValue == 9437638) { } try { var connectors = elbow.GetConnectors(); var connector1 = connectors.OfType().ElementAt(0); var connector2 = connectors.OfType().ElementAt(1); var system1 = connector1.AllRefs.OfType().FirstOrDefault(c => c.Owner.Id != elbow.Id).MEPSystem; var system2 = connector2.AllRefs.OfType().FirstOrDefault(c => c.Owner.Id != elbow.Id).MEPSystem; //MEPSystem tempSystem = null; //foreach (Connector conn in connectors) //{ // foreach (Connector item in conn.AllRefs) // { // if (tempSystem==null) // { // tempSystem = item.MEPSystem; // continue; // } // if (tempSystem==item.MEPSystem) // { // continue; // } // if (tempSystem.Name) // { // } // } //} if (system1.Name != system2.Name) { elementId = elbow.Id; break; } } catch (Exception) { //MessageBox.Show(elbow.Id.ToString()); continue; } } if (elementId != ElementId.InvalidElementId) { UiDocument.Selection.SetElementIds([elementId]); } } private void ModifyName() { Document.Modify(set => set.Transaction) .Commit( (d, t) => { //var point = Point.Create(new XYZ(10,10,10), new ElementId(1236)); //Document.CreateTransientGeometries([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.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 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 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); } }