WallExtension.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /* ==============================================================================
  2. * 功能描述:WallExtension
  3. * 创 建 者:Garrett
  4. * 创建日期:2019/10/9 16:04:36
  5. * ==============================================================================*/
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using Autodesk.Revit.DB;
  12. using SAGA.DotNetUtils.Extend;
  13. using SAGA.RevitUtils.Extends;
  14. namespace SAGA.MBI.RevitExport.Entity
  15. {
  16. public static class WallExtension
  17. {
  18. /// <summary>
  19. /// 获取墙底面的轮廓,主要处理门窗分割墙问题
  20. /// </summary>
  21. /// <param name="wall"></param>
  22. /// <returns></returns>
  23. public static List<PlanarFace> GetBottomFaces(this Wall wall)
  24. {
  25. var solids = GeometryElementExtension.GetSolids(wall);
  26. //var topZ = wall.GetTopStaticHeight();
  27. double volume = double.MinValue;
  28. List<PlanarFace> faces = new List<PlanarFace>();
  29. foreach (var solid in solids)
  30. {
  31. var tempVolume = solid.Volume;
  32. double topZ = double.MaxValue;
  33. //取体积最大的Solid
  34. if (tempVolume.IsThan(volume))
  35. {
  36. volume = tempVolume;
  37. faces.Clear();
  38. }
  39. else
  40. {
  41. continue;
  42. }
  43. foreach (Face face in solid.Faces)
  44. {
  45. if (face is PlanarFace planarFace && planarFace.FaceNormal.IsEqual(-Autodesk.Revit.DB.XYZ.BasisZ))
  46. {
  47. var tempZ = planarFace.Origin.Z;
  48. //取底面FaceNormal为(0,0,-1),Z最小
  49. if (tempZ.IsLess(topZ))
  50. {
  51. faces.Clear();
  52. topZ = tempZ;
  53. faces.Add(planarFace);
  54. }
  55. else if (tempZ.IsEqual(topZ))
  56. {
  57. faces.Add(planarFace);
  58. }
  59. }
  60. }
  61. }
  62. return faces;
  63. }
  64. }
  65. }