2025-02-10 20:53:40 +08:00
|
|
|
|
|
2025-05-05 17:04:06 +08:00
|
|
|
|
|
2025-02-10 20:53:40 +08:00
|
|
|
|
|
2025-08-12 23:08:54 +08:00
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
|
using System.IO;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
using System.Windows;
|
|
|
|
|
|
|
2025-02-10 20:53:40 +08:00
|
|
|
|
using Autodesk.Revit.Attributes;
|
|
|
|
|
|
using Autodesk.Revit.DB;
|
|
|
|
|
|
|
|
|
|
|
|
using Nice3point.Revit.Toolkit.External;
|
|
|
|
|
|
using Nice3point.Revit.Toolkit.Utils;
|
|
|
|
|
|
|
2025-04-24 20:56:44 +08:00
|
|
|
|
using ShrlAlgoToolkit.Revit.Assists;
|
|
|
|
|
|
using ShrlAlgoToolkit.Revit.Extensions;
|
|
|
|
|
|
|
2025-02-10 20:53:40 +08:00
|
|
|
|
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()
|
|
|
|
|
|
{
|
2025-08-12 23:08:54 +08:00
|
|
|
|
var elementsBaseFace = Document.OfClass<FamilyInstance>().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<ImportInstance>();
|
|
|
|
|
|
//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;
|
2025-05-05 17:04:06 +08:00
|
|
|
|
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");
|
|
|
|
|
|
});
|
2025-04-24 20:56:44 +08:00
|
|
|
|
|
2025-05-05 17:04:06 +08:00
|
|
|
|
|
|
|
|
|
|
return;
|
2025-04-24 20:56:44 +08:00
|
|
|
|
var ids = Document.ActiveView.OfCollector().WhereElementIsNotElementType().Where(e => e.GetLevelId() == ElementId.InvalidElementId).Select(e => e.Id).ToList();
|
|
|
|
|
|
UiDocument.Selection.SetElementIds(ids);
|
|
|
|
|
|
return;
|
2025-02-10 20:53:40 +08:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|