231 lines
8.9 KiB
C#
231 lines
8.9 KiB
C#
|
|
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<Duct>()
|
|
// .Cast<Duct>()
|
|
// .Where(
|
|
// d =>
|
|
// d.ConnectorManager.Connectors.OfType<Connector>().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<FamilyInstance>().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<MEPCurve>();
|
|
//if (mepCurve != null)
|
|
//{
|
|
// var list = new List<ElementId>();
|
|
// mepCurve.GetAllConnectedElements(list);
|
|
// UiDocument.Selection.SetElementIds(list);
|
|
//}
|
|
}
|
|
|
|
|
|
private void GetDiffSystemFittings()
|
|
{
|
|
var elbows = Document.OfClass<FamilyInstance>()
|
|
.OfCategory(BuiltInCategory.OST_PipeFitting)
|
|
.Cast<FamilyInstance>()
|
|
.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<Connector>().ElementAt(0);
|
|
var connector2 = connectors.OfType<Connector>().ElementAt(1);
|
|
var system1 = connector1.AllRefs.OfType<Connector>().FirstOrDefault(c => c.Owner.Id != elbow.Id).MEPSystem;
|
|
var system2 = connector2.AllRefs.OfType<Connector>().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<FamilySymbol>()
|
|
.WhereElementIsElementType().Cast<FamilySymbol>();
|
|
//var fittings = Document.OfCollector()
|
|
// .OfCategory(BuiltInCategory.OST_DuctFitting)
|
|
// .WhereElementIsElementType().Cast<FamilySymbol>();
|
|
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<CableTray>().Cast<CableTray>().ToList();
|
|
var list = Document.OfCollector().OfCategory(BuiltInCategory.OST_CableTrayFitting).WhereElementIsNotElementType().ToList();
|
|
var ids = new List<ElementId>();
|
|
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<MEPCurve>();
|
|
var ids = new List<ElementId>();
|
|
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);
|
|
}
|
|
}
|
|
|
|
|