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)] public class RoomNameAssignCmd : ExternalCommand { public override void Execute() { Document.Invoke( ts => { try { var reference = UiDocument.Selection.PickObject(ObjectType.PointOnElement, new GenericFilter(), "请选择CAD文字"); var instance = Document.GetElement(reference) as ImportInstance; var layerName = instance.GetLayerName(reference); List> layerTextPoints = instance.GetTextsByLayer(layerName); var rooms = ActiveView.OfCollector().OfCategory(BuiltInCategory.OST_Rooms).ToElements(); var roomTags = ActiveView.OfCollector().OfCategory(BuiltInCategory.OST_RoomTags).Cast(); 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); } } }