Browse Source

xls:空间转换

xulisong 5 years ago
parent
commit
8371c72e8e

+ 24 - 0
MBI/Menu/Tool.xml

@@ -47,6 +47,30 @@
       <MenuTab>Tool_W</MenuTab>
       <Modules>Tool</Modules>
     </Button>
+ <Button ButtonStyles="Large">
+      <ButtonName>ToolCommand.RoomDataToSpaceCommand</ButtonName>
+      <ButtonText>房间信息复制到空间</ButtonText>
+      <ImageName>1、打开楼层模型</ImageName>
+      <DllName>..\OutputDll\ToolCommand.dll</DllName>
+      <ClassName>ToolCommand.RoomDataToSpaceCommand</ClassName>
+      <ToolTip>房间信息复制到空间</ToolTip>
+      <LongDescription>房间信息复制到空间</LongDescription>
+      <ToolTipImage></ToolTipImage>
+      <MenuTab>Tool_W</MenuTab>
+      <Modules>Tool</Modules>
+    </Button>
+<Button ButtonStyles="Large">
+      <ButtonName>ToolCommand.RoomToSpaceCommand</ButtonName>
+      <ButtonText>房间转换空间</ButtonText>
+      <ImageName>1、打开楼层模型</ImageName>
+      <DllName>..\OutputDll\ToolCommand.dll</DllName>
+      <ClassName>ToolCommand.RoomToSpaceCommand</ClassName>
+      <ToolTip>房间转换空间</ToolTip>
+      <LongDescription>房间转换空间</LongDescription>
+      <ToolTipImage></ToolTipImage>
+      <MenuTab>Tool_W</MenuTab>
+      <Modules>Tool</Modules>
+    </Button>
   </Panel>
 </Menus>
 <!--名称里面换行-->

+ 68 - 0
MBI/ToolCommand/RoomDataToSpaceCommand.cs

@@ -0,0 +1,68 @@
+/*-------------------------------------------------------------------------
+ * 功能描述:RoomDataToSpace
+ * 作者:xulisong
+ * 创建时间: 2019/7/26 10:14:55
+ * 版本号:v1.0
+ *  -------------------------------------------------------------------------*/
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using Autodesk.Revit.Attributes;
+using Autodesk.Revit.DB;
+using Autodesk.Revit.UI;
+using SAGA.RevitUtils.Extends;
+
+namespace ToolCommand
+{
+    [Transaction(TransactionMode.Manual)]
+    [Regeneration(RegenerationOption.Manual)]
+    //[Button(ButtonName = "房间数据\r\n赋值到空间")]
+    public class RoomDataToSpaceCommand : ExternalCommand
+    {
+        public override Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
+        {
+
+            var document = commandData.Application.ActiveUIDocument.Document;
+            var view = document.ActiveView;
+            if (view is View3D)
+            {
+                MessageBox.Show("指定导出平面视图");
+                return Result.Succeeded;
+            } 
+            using (Transaction tran = new Transaction(document, "创建空间"))
+            {
+                try
+                {
+                    tran.Start();
+                    var list = RoomToSpaceUtils.RoomDataToSpace(view);
+                    if (list.All(r => r.IsSuccess))
+                    {
+                        MessageBox.Show("赋值成功");
+                    }
+                    else
+                    {
+                        MessageBox.Show("部分赋值成功");
+                        var text = RoomToSpaceUtils.CreateResult(list).ToString();
+                        string path = @"d:\result.txt";
+                        File.WriteAllText(path, text);
+                        Process.Start("notepad.exe", path);
+                    }
+                    tran.Commit();
+                }
+                catch (Exception e)
+                {
+                    tran.RollBack();
+                    throw;
+                }
+            }
+            return Result.Succeeded;
+
+        }
+    }
+}

+ 70 - 0
MBI/ToolCommand/RoomToSpaceCommand.cs

@@ -0,0 +1,70 @@
+/*-------------------------------------------------------------------------
+ * 功能描述:RoomToSpaceCommand
+ * 作者:xulisong
+ * 创建时间: 2019/7/26 10:16:25
+ * 版本号:v1.0
+ *  -------------------------------------------------------------------------*/
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using Autodesk.Revit.Attributes;
+using Autodesk.Revit.DB;
+using Autodesk.Revit.UI;
+using SAGA.RevitUtils.Extends;
+
+
+namespace ToolCommand
+{
+    [Transaction(TransactionMode.Manual)]
+    [Regeneration(RegenerationOption.Manual)]
+    //[Button(ButtonName = "房间转换空间")]
+    public class RoomToSpaceCommand : ExternalCommand
+    {
+        public override Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
+        {
+
+            var document = commandData.Application.ActiveUIDocument.Document;
+            var view = document.ActiveView;
+            if (view is View3D)
+            {
+                MessageBox.Show("指定导出平面视图");
+                return Result.Succeeded;
+            }
+            using (Transaction tran = new Transaction(document, "创建空间"))
+            {
+                try
+                {
+                    tran.Start();
+                    var list = RoomToSpaceUtils.RoomToSpace(view, new RoomToSpaceTransOption());
+                    if (list.Count==0||list.All(r => r.IsSuccess))
+                    {
+                        MessageBox.Show("转换成功");
+                    }
+                    else
+                    {
+                        MessageBox.Show("部分转换成功");
+                        var text = RoomToSpaceUtils.CreateResult(list).ToString();
+                        string path = @"d:\result.txt";
+                        File.WriteAllText(path, text);
+                        Process.Start("notepad.exe", path);
+
+                    }
+                    tran.Commit();
+                }
+                catch (Exception e)
+                {
+                    tran.RollBack();
+                    throw;
+                }
+            }
+            return Result.Succeeded;
+
+        }
+    }
+}

+ 252 - 0
MBI/ToolCommand/RoomToSpaceUtils.cs

@@ -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; }
+
+    }
+}

+ 3 - 0
MBI/ToolCommand/ToolCommand.csproj

@@ -69,6 +69,9 @@
     <Compile Include="DelZeroSpace.cs" />
     <Compile Include="ExportAllCategory.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="RoomDataToSpaceCommand.cs" />
+    <Compile Include="RoomToSpaceCommand.cs" />
+    <Compile Include="RoomToSpaceUtils.cs" />
     <Compile Include="WinLocation.xaml.cs">
       <DependentUpon>WinLocation.xaml</DependentUpon>
     </Compile>