Files
SzmediTools/Szmedi.RvKits/Modeling/RoomNameAssignCmd.cs
2025-09-16 16:06:41 +08:00

102 lines
4.3 KiB
C#

using System;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using Nice3point.Revit.Toolkit.External;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using Szmedi.RvKits.Assists;
namespace Szmedi.RvKits.Modeling
{
[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
public class RoomNameAssignCmd : ExternalCommand
{
public override void Execute()
{
Document.Invoke(
ts =>
{
try
{
var reference = UiDocument.Selection.PickObject(ObjectType.PointOnElement, new GenericFilter<ImportInstance>(), "请选择CAD文字");
var instance = Document.GetElement(reference) as ImportInstance;
var layerName = instance.GetLayerName(reference);
List<KeyValuePair<string, XYZ>> layerTextPoints = instance.GetTextsByLayer(layerName);
var rooms = ActiveView.OfCollector().OfCategory(BuiltInCategory.OST_Rooms).ToElements();
var roomTags = ActiveView.OfCollector().OfCategory(BuiltInCategory.OST_RoomTags).Cast<RoomTag>();
foreach (Room room in rooms)
{
var level = room.Level;
var kv = layerTextPoints.FirstOrDefault(d => ContainsChinese(d.Key) && room.IsPointInRoom(d.Value.FlattenTo(level)));
if (kv.Key != null)
{
//var flattenPoint = kv.Value.FlattenTo(level);
var tag = roomTags.FirstOrDefault(t => t.TaggedLocalRoomId == room.Id);
if (tag == null)
{
var uv = new UV(kv.Value.X, kv.Value.Y);
Document.Create.NewRoomTag(new LinkElementId(room.Id), uv, ActiveView.Id);
}
//var arc = Arc.Create(flattenPoint, 10, 0, 5, XYZ.BasisX, XYZ.BasisY);
//Document.Create.NewModelCurve(arc, SketchPlane.Create(Document, level.Id));
room.Name = kv.Key;
}
}
//foreach (var kv in layerTextPoints)
//{
// var floor = ActiveView as ViewPlan;
// var flattenPoint = kv.Value.FlattenTo(floor.GenLevel);
// var room = Document.GetRoomAtPoint(flattenPoint);
// if (room == null)
// {
// continue;
// }
// var tag = roomTags.FirstOrDefault(t => t.TaggedLocalRoomId == room.Id);
// if (tag == null)
// {
// var uv = new UV(kv.Value.X, kv.Value.Y);
// Document.Create.NewRoomTag(new LinkElementId(room.Id), uv, ActiveView.Id);
// }
// var arc = Arc.Create(flattenPoint, 10, 0, 5, XYZ.BasisX, XYZ.BasisY);
// Document.Create.NewModelCurve(arc, SketchPlane.Create(Document, floor.GenLevel.Id));
// room.Name = kv.Key;
//}
}
catch(Autodesk.Revit.Exceptions.OperationCanceledException)
{
//用户取消操作
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}, "房间命名");
}
static bool ContainsChinese(string input)
{
// 正则表达式匹配汉字
Regex regex = new Regex(@"[\u4e00-\u9fa5]");
return regex.IsMatch(input);
}
}
}