|
@@ -0,0 +1,252 @@
|
|
|
+using Autodesk.Revit.DB;
|
|
|
+using Autodesk.Revit.DB.Architecture;
|
|
|
+using Autodesk.Revit.DB.Mechanical;
|
|
|
+using SAGA.RevitUtils.Extends;
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.Linq;
|
|
|
+using System.Text;
|
|
|
+using System.Threading.Tasks;
|
|
|
+using SAGA.DotNetUtils.Extend;
|
|
|
+
|
|
|
+namespace ToolCommand
|
|
|
+{
|
|
|
+ public static class RoomToSpaceUtils
|
|
|
+ {
|
|
|
+ /// <summary>
|
|
|
+ /// 获取指定的元素信息
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="view"></param>
|
|
|
+ /// <param name="filter"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static List<Element> GetElements(View view, ElementFilter filter)
|
|
|
+ {
|
|
|
+ //删除当前视图下的所有空间和空间分割
|
|
|
+ var doc = view.Document;
|
|
|
+ var elements = doc.GetElements(filter);
|
|
|
+ return elements.Where(e => e.LevelId == view.GenLevel.Id).ToList();
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
+ /// 房间转换成空间
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="view"></param>
|
|
|
+ /// <param name="option"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static List<RoomRelationItem> RoomToSpace(View view, RoomToSpaceTransOption option)
|
|
|
+ {
|
|
|
+ //删除当前视图下的所有空间和空间分割
|
|
|
+ var doc = view.Document;
|
|
|
+ var spaces = GetElements(view, new SpaceFilter());
|
|
|
+ if (option.DeleteOriginalSpace)
|
|
|
+ {
|
|
|
+ doc.Delete(spaces.Select(e => e.Id).ToList());
|
|
|
+ }
|
|
|
+
|
|
|
+ var spaceSeps = GetElements(view, new ElementCategoryFilter(BuiltInCategory.OST_MEPSpaceSeparationLines)).OfType<ModelLine>().ToList();
|
|
|
+ if (option.DeleteOriginalSpaceSq)
|
|
|
+ {
|
|
|
+ doc.Delete(spaceSeps.Select(e => e.Id).ToList());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ var rooms = GetElements(view, new RoomFilter()).OfType<Room>().ToList();
|
|
|
+
|
|
|
+ #region 根据房间分割创建空间分割
|
|
|
+
|
|
|
+ if (option.RoomSqToSpaceSq)
|
|
|
+ {
|
|
|
+ var roomSeps = GetElements(view, new ElementCategoryFilter(BuiltInCategory.OST_RoomSeparationLines)).OfType<ModelLine>().ToList();
|
|
|
+ CurveArray curveArray = new CurveArray();
|
|
|
+ foreach (var roomSep in roomSeps)
|
|
|
+ {
|
|
|
+ curveArray.Append(roomSep.GeometryCurve);
|
|
|
+ }
|
|
|
+ if (!curveArray.IsEmpty)
|
|
|
+ {
|
|
|
+ Plane p = Plane.CreateByNormalAndOrigin(view.ViewDirection, view.Origin);
|
|
|
+ var sp = SketchPlane.Create(doc, p);
|
|
|
+ doc.Create.NewSpaceBoundaryLines(sp, curveArray, view);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+ var offset = XYZ.BasisZ * 0.1;
|
|
|
+ List<RoomRelationItem> relations = new List<RoomRelationItem>();
|
|
|
+ var level = view.GenLevel;
|
|
|
+ Parameter para = view.GetParameter(BuiltInParameter.VIEW_PHASE);
|
|
|
+ ElementId phaseId = para.AsElementId();
|
|
|
+ var phase = doc.GetElement(phaseId) as Phase;
|
|
|
+ if (phase == null)
|
|
|
+ {
|
|
|
+ throw new ArgumentNullException("视图阶段");
|
|
|
+ }
|
|
|
+ foreach (Room room in rooms)
|
|
|
+ {
|
|
|
+ var relationItem = new RoomRelationItem() { RoomId = room.Id.ToString()};
|
|
|
+ relations.Add(relationItem);
|
|
|
+ using (SubTransaction subTran = new SubTransaction(doc))
|
|
|
+ {
|
|
|
+ Space useSpcae = null;
|
|
|
+ try
|
|
|
+ {
|
|
|
+ subTran.Start();
|
|
|
+ var location = room.Location.GetPoint();
|
|
|
+ if (location == null || room.Area.IsEqual(0))
|
|
|
+ {
|
|
|
+ relationItem.Messages.Add("房间信息无效");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ useSpcae = doc.GetSpaceAtPoint(location, phase);
|
|
|
+ if (useSpcae == null)
|
|
|
+ {
|
|
|
+ useSpcae = doc.Create.NewSpace(level, phase, new UV(location.X, location.Y));
|
|
|
+ if (useSpcae != null)
|
|
|
+ {
|
|
|
+ var name = room.GetParameterString(BuiltInParameter.ROOM_NAME) ?? string.Empty;
|
|
|
+ useSpcae.SetParameter(BuiltInParameter.ROOM_NAME, name);
|
|
|
+ subTran.Commit();
|
|
|
+ relationItem.SpaceId = useSpcae.Id.ToString();
|
|
|
+ relationItem.IsSuccess = true;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ relationItem.Messages.Add("转换失败");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ relationItem.SpaceId = useSpcae.Id.ToString();
|
|
|
+ relationItem.Messages.Add("空间已和其他房间对应");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ subTran.RollBack();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return relations;
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
+ /// 房间数据转移到空间数据
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="view"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public static List<RoomRelationItem> RoomDataToSpace(View view)
|
|
|
+ {
|
|
|
+ var doc = view.Document;
|
|
|
+ var rooms = GetElements(view, new RoomFilter()).OfType<Room>();
|
|
|
+ var offset = XYZ.BasisZ * 0.1;
|
|
|
+ List<RoomRelationItem> relations = new List<RoomRelationItem>();
|
|
|
+ foreach (Room room in rooms)
|
|
|
+ {
|
|
|
+ var relationItem = new RoomRelationItem() { RoomId = room.Id.ToString() };
|
|
|
+ relations.Add(relationItem);
|
|
|
+ using (SubTransaction subTran = new SubTransaction(doc))
|
|
|
+ {
|
|
|
+ Space useSpcae = null;
|
|
|
+ try
|
|
|
+ {
|
|
|
+ subTran.Start();
|
|
|
+ var location = room.Location.GetPoint();
|
|
|
+ if (location == null || room.Area.IsEqual(0))
|
|
|
+ {
|
|
|
+ relationItem.Messages.Add("房间信息无效");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ useSpcae = doc.GetSpaceAtPoint(location.Add(offset));
|
|
|
+ if (useSpcae == null)
|
|
|
+ {
|
|
|
+ relationItem.Messages.Add("未找到对应空间");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //if (IsAreaNotEqual(room,useSpcae))
|
|
|
+ //{
|
|
|
+ // var item = new RoomRelationItem() { RoomId = room.Id.ToString(), SpaceId = useSpcae.Id.ToString(), Message = "面积不匹配" };
|
|
|
+ // relations.Add(item);
|
|
|
+ //}
|
|
|
+ var name = room.GetParameterString(BuiltInParameter.ROOM_NAME) ?? string.Empty;
|
|
|
+ useSpcae.SetParameter(BuiltInParameter.ROOM_NAME, name);
|
|
|
+ subTran.Commit();
|
|
|
+ //成功
|
|
|
+ relationItem.SpaceId = useSpcae.Id.ToString();
|
|
|
+ relationItem.IsSuccess = true;
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ relationItem.Messages.Add("赋值异常");
|
|
|
+ subTran.RollBack();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return relations;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static bool IsAreaNotEqual(Room room,Space space)
|
|
|
+ {
|
|
|
+ return Math.Abs(room.Area - space.Area) > 0.1;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static StringBuilder CreateResult(List<RoomRelationItem> items)
|
|
|
+ {
|
|
|
+ StringBuilder builder = new StringBuilder();
|
|
|
+ int errorCount = 0;
|
|
|
+ foreach (var item in items)
|
|
|
+ {
|
|
|
+ if (item.IsSuccess)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ builder.AppendLine(item.ToString());
|
|
|
+ errorCount++;
|
|
|
+ }
|
|
|
+
|
|
|
+ builder.AppendLine($"总共{items.Count}房间,转换过程出现问题{errorCount}个");
|
|
|
+ return builder;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public class RoomRelationItem
|
|
|
+ {
|
|
|
+
|
|
|
+ public string RoomId { get; set; }
|
|
|
+ public string SpaceId { get; set; }
|
|
|
+ /// <summary>
|
|
|
+ /// 是否成功
|
|
|
+ /// </summary>
|
|
|
+ public bool IsSuccess { get; set; }
|
|
|
+ /// <summary>
|
|
|
+ /// 错误消息
|
|
|
+ /// </summary>
|
|
|
+ public List<string> Messages { get; private set; } = new List<string>();
|
|
|
+
|
|
|
+ public override string ToString()
|
|
|
+ {
|
|
|
+ var message = string.Join(";", Messages);
|
|
|
+ return $"RoomId:{RoomId} SpaceId:{SpaceId} Result:{message}";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class RoomToSpaceTransOption
|
|
|
+ {
|
|
|
+ /// <summary>
|
|
|
+ /// 是否删除原始空间
|
|
|
+ /// </summary>
|
|
|
+ public bool DeleteOriginalSpace { get; set; } = true;
|
|
|
+ /// <summary>
|
|
|
+ /// 是否删除原始空间分割
|
|
|
+ /// </summary>
|
|
|
+ public bool DeleteOriginalSpaceSq { get; set; }
|
|
|
+ /// <summary>
|
|
|
+ /// 是否将房间分割转换成空间分割
|
|
|
+ /// </summary>
|
|
|
+ public bool RoomSqToSpaceSq { get; set; }
|
|
|
+
|
|
|
+ }
|
|
|
+}
|