Browse Source

mxg:优化空间外轮廓提取算法

mengxiangge 5 years ago
parent
commit
dfe46511be

+ 30 - 10
Executer/DataExport/RevitToJBim/Extension/SpaceExtension.cs

@@ -105,26 +105,26 @@ namespace RevitToJBim.Extension
                 var segments = space.GetBoundarySegments(options);
                 var segments = space.GetBoundarySegments(options);
                 Document doc = space.Document;
                 Document doc = space.Document;
                 double tolerance = doc.Application.ShortCurveTolerance;
                 double tolerance = doc.Application.ShortCurveTolerance;
-                
+
+                var allWalls = doc.GetElements<Wall>();
+                var tupleWalls = allWalls
+                    .Select(t => new Tuple<Curve, Wall>(t.GetLocationCurve(), t)).ToList();
                 foreach (var segment in segments)
                 foreach (var segment in segments)
                 {
                 {
                     #region 取外轮廓的点
                     #region 取外轮廓的点
 
 
                     List<XYZ> xyzs = new List<XYZ>();
                     List<XYZ> xyzs = new List<XYZ>();
-                    var allWalls = doc.GetElements<Wall>();
-                    var tupleWalls = allWalls
-                        .Select(t => new Tuple<Curve, Wall>(t.GetLocationCurve(), t)).ToList();
                     foreach (BoundarySegment boundarySegment in segment)
                     foreach (BoundarySegment boundarySegment in segment)
                     {
                     {
                         var segmentElement = space.Document.GetElement(boundarySegment.ElementId);
                         var segmentElement = space.Document.GetElement(boundarySegment.ElementId);
                         if (segmentElement is Wall wall)
                         if (segmentElement is Wall wall)
                         {
                         {
-                            var wallCurve = wall.GetLocationCurve();
                             var parallelWalls = GetParallelWalls(wall, tupleWalls);
                             var parallelWalls = GetParallelWalls(wall, tupleWalls);
                             var segmentCurve = boundarySegment.GetCurve();
                             var segmentCurve = boundarySegment.GetCurve();
                             var tessellates = segmentCurve.Tessellate();
                             var tessellates = segmentCurve.Tessellate();
                             foreach (XYZ tessellate in tessellates)
                             foreach (XYZ tessellate in tessellates)
                             {
                             {
+                                var wallCurve = wall.GetLocationCurve();
                                 var project = wallCurve.GetProjectPt(tessellate);
                                 var project = wallCurve.GetProjectPt(tessellate);
                                 var verticalVector = (project - tessellate).Normalize();
                                 var verticalVector = (project - tessellate).Normalize();
                                 var tempXyz = GetOuterXYZ(tessellate, verticalVector, segmentCurve, parallelWalls);
                                 var tempXyz = GetOuterXYZ(tessellate, verticalVector, segmentCurve, parallelWalls);
@@ -224,15 +224,35 @@ namespace RevitToJBim.Extension
                         if (walls.Contains(parallelWall)) continue;
                         if (walls.Contains(parallelWall)) continue;
                         var curve2 = referenceWall.GetLocationCurve();
                         var curve2 = referenceWall.GetLocationCurve();
                         var startP12 = CurveExtend.GetProjectPt(curve2, startP11);
                         var startP12 = CurveExtend.GetProjectPt(curve2, startP11);
-                        var endP12 = CurveExtend.GetProjectPt(curve2, endP11);
-                        //判断是否有重叠部分
-                        if (startP12.IsOnCurve(curve2) || endP12.IsOnCurve(curve2))
+                        //速度优化
+                        if (startP12.IsOnCurve(curve2))
                         {
                         {
                             double width2 = referenceWall.Width;
                             double width2 = referenceWall.Width;
-                            double distacne = curve1.Distance(curve2);
+                            double distacne = startP11.DistanceTo(endP11);
                             if (distacne < (width1 + width2) / 2.0 + m_RedundancySpace)
                             if (distacne < (width1 + width2) / 2.0 + m_RedundancySpace)
                                 walls.Add(parallelWall);
                                 walls.Add(parallelWall);
                         }
                         }
+                        else
+                        {
+                            var endP12 = CurveExtend.GetProjectPt(curve2, endP11);
+                            if (endP12.IsOnCurve(curve2))
+                            {
+                                double width2 = referenceWall.Width;
+                                double distacne = startP11.DistanceTo(endP11);
+                                if (distacne < (width1 + width2) / 2.0 + m_RedundancySpace)
+                                    walls.Add(parallelWall);
+                            }
+                        }
+                        //var startP12 = CurveExtend.GetProjectPt(curve2, startP11);
+                        //var endP12 = CurveExtend.GetProjectPt(curve2, endP11);
+                        ////判断是否有重叠部分
+                        //if (startP12.IsOnCurve(curve2) || endP12.IsOnCurve(curve2))
+                        //{
+                        //    double width2 = referenceWall.Width;
+                        //    double distacne = curve1.Distance(curve2);
+                        //    if (distacne < (width1 + width2) / 2.0 + m_RedundancySpace)
+                        //        walls.Add(parallelWall);
+                        //}
                     }
                     }
                 }
                 }
             } while (len != walls.Count);
             } while (len != walls.Count);
@@ -296,7 +316,7 @@ namespace RevitToJBim.Extension
                 }
                 }
             }
             }
 
 
-            return outerXyz;
+            return outerXyz.NewZ(xyz.Z);
         }
         }
     }
     }
 }
 }

+ 4 - 4
Starter/Starter/Program.cs

@@ -39,7 +39,7 @@ namespace ExportStart
                 command = "DataExport";
                 command = "DataExport";
                 //command = "DataCheck";
                 //command = "DataCheck";
                 path = @"E:\导出测试\testSpace.rvt";
                 path = @"E:\导出测试\testSpace.rvt";
-                path = @"E:\导出测试\编码修改后模型v1203\热源系统图模型第一版V1129.rvt";
+                path = @"E:\导出测试\系统图修改编码版\冷源系统图模型第一版V1129 .rvt";
                 path = @"C:\Users\SAGACLOUD\Desktop\新建文件夹\b1-2172005.rvt";
                 path = @"C:\Users\SAGACLOUD\Desktop\新建文件夹\b1-2172005.rvt";
                 JObject jObject=new JObject();
                 JObject jObject=new JObject();
                 jObject.Add("ResultFileName", @"C:\Users\SAGACLOUD\AppData\Local\RevitService\Result_e26be2fd-2097-462b-bdd0-a2a86b616928.txt");
                 jObject.Add("ResultFileName", @"C:\Users\SAGACLOUD\AppData\Local\RevitService\Result_e26be2fd-2097-462b-bdd0-a2a86b616928.txt");
@@ -61,6 +61,7 @@ namespace ExportStart
                 var app = RevitCoreContext.Instance.Application;
                 var app = RevitCoreContext.Instance.Application;
                 var doc = app.OpenDocumentFile(path);
                 var doc = app.OpenDocumentFile(path);
                 string result = null;
                 string result = null;
+                Console.WriteLine("StartTime:"+DateTime.Now);
                 switch (commandType)
                 switch (commandType)
                 {
                 {
                     case CommandType.DataCheck:
                     case CommandType.DataCheck:
@@ -70,9 +71,8 @@ namespace ExportStart
                         result=Export(doc,param);
                         result=Export(doc,param);
                         break;
                         break;
                 }
                 }
-
                 SaveResult(param, result);
                 SaveResult(param, result);
-
+                Console.WriteLine("EndTime:"+DateTime.Now);
                 RevitCoreContext.Instance.Stop();
                 RevitCoreContext.Instance.Stop();
             }
             }
             Console.WriteLine("ExportStart End");
             Console.WriteLine("ExportStart End");
@@ -91,7 +91,7 @@ namespace ExportStart
             try
             try
             {
             {
 
 
-                JObject jObject = JObject.Parse(param);
+                JObject jObject  = JObject.Parse(param);
                 string key = "ResultFileName";
                 string key = "ResultFileName";
                 string path = jObject[key].ToString();
                 string path = jObject[key].ToString();
                 if (path.IsNotNullEmpty())
                 if (path.IsNotNullEmpty())