|
@@ -19,21 +19,40 @@ namespace RevitToJBim.Extension
|
|
{
|
|
{
|
|
public static class WallExtension
|
|
public static class WallExtension
|
|
{
|
|
{
|
|
- public static List<PlanarFace> GetTopFaces(this Wall wall)
|
|
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 获取墙底面的轮廓,主要处理门窗分割墙问题
|
|
|
|
+ /// </summary>
|
|
|
|
+ /// <param name="wall"></param>
|
|
|
|
+ /// <returns></returns>
|
|
|
|
+ public static List<PlanarFace> GetBottomFaces(this Wall wall)
|
|
{
|
|
{
|
|
- var solids = Extension.GeometryElementExtension.GetSolids(wall, wall.Document.GetUseView());
|
|
|
|
|
|
+ var solids = Extension.GeometryElementExtension.GetSolids(wall);
|
|
//var topZ = wall.GetTopStaticHeight();
|
|
//var topZ = wall.GetTopStaticHeight();
|
|
- //比较最大值不靠谱,取当前面中高度最高的
|
|
|
|
- double topZ = double.MinValue;
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ double volume = double.MinValue;
|
|
List<PlanarFace> faces = new List<PlanarFace>();
|
|
List<PlanarFace> faces = new List<PlanarFace>();
|
|
foreach (var solid in solids)
|
|
foreach (var solid in solids)
|
|
{
|
|
{
|
|
|
|
+ var tempVolume = solid.Volume;
|
|
|
|
+ double topZ = double.MaxValue;
|
|
|
|
+ //取体积最大的Solid
|
|
|
|
+ if (tempVolume.IsThan(volume))
|
|
|
|
+ {
|
|
|
|
+ volume = tempVolume;
|
|
|
|
+ faces.Clear();
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
foreach (Face face in solid.Faces)
|
|
foreach (Face face in solid.Faces)
|
|
{
|
|
{
|
|
- if (face is PlanarFace planarFace && planarFace.FaceNormal.IsEqual(XYZ.BasisZ))
|
|
|
|
|
|
+ if (face is PlanarFace planarFace && planarFace.FaceNormal.IsEqual(-XYZ.BasisZ))
|
|
{
|
|
{
|
|
var tempZ = planarFace.Origin.Z;
|
|
var tempZ = planarFace.Origin.Z;
|
|
- if (tempZ.IsThan(topZ))
|
|
|
|
|
|
+ //取底面FaceNormal为(0,0,-1),Z最小
|
|
|
|
+ if (tempZ.IsLess(topZ))
|
|
{
|
|
{
|
|
faces.Clear();
|
|
faces.Clear();
|
|
topZ = tempZ;
|
|
topZ = tempZ;
|