Files
Shrlalgo.RvKits/ShrlAlgo.Addin.Test/FluentAddin.cs
2025-04-24 20:56:44 +08:00

344 lines
13 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Diagnostics;
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
{
/// <summary>
/// 设备类型是否为空
/// </summary>
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);
}
/// <summary>
/// 修改名称
/// </summary>
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<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.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);
//}
}
});
}
/// <summary>
/// 坡度检查
/// </summary>
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);
}
public override void Execute()
{
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<TextNoteType>().ToList();
var accessoryTypes = Document.OfClass<FamilySymbol>().OfCategory(BuiltInCategory.OST_PipeAccessory).WhereElementIsElementType().ToList();
var filledRegionTypes = Document.OfClass<FilledRegionType>().ToList();
var materialToClean = Document.OfClass<Material>().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<Connector>().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<ElementId>;
//}
#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<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);
//}
#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());
}
}
/// <summary>
/// 清理导入的线型图案
/// </summary>
/// <param name="doc"></param>
private static void CleanImportLinePattern(Document doc)
{
var templates = doc.OfClass<LinePatternElement>()
.Cast<LinePatternElement>()
.Where(e => e.Name.StartsWith("IMPORT"))
.Select(e => e.Id).ToList();
doc.Delete(templates);
}
/// <summary>
/// 清理文字样式
/// </summary>
/// <param name="type"></param>
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<TextNoteType>().ToList();
var isExist = textTypes.FirstOrDefault(t => t.Name == name);
if (isExist != null)
{
var texts = Document.OfClass<TextNote>().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;
}
}
}
}