计算房间长度问题

Calculating room length issue

我想在 Revit 中获取房间的长度和宽度值,但 Revit 似乎无法像访问房间周长、面积和体积那样提供对这些值的访问权限。

我决定首先通过代码找到房间的长度值,因为我可以使用长度计算宽度,但我得到的结果似乎不正确,下面是我的代码的相关部分:

Room room = oneRoom as Room;
double area = room.Area;
double perimeter = room.Perimeter;

int roomArea = (int)area;
int roomPerimeter = (int)perimeter;

int length = (int)(((roomPerimeter / 2) - Math.Sqrt((roomPerimeter / 2) ^ 2 - 4 * roomArea)) / 2);

//int width = roomArea / length;
string valueMessage = "perimeter of room is " + length;
TaskDialog.Show("Message", valueMessage);

我正在使用方程式计算给定面积和周长的长度。然而,我得到的值是 -21,474,836,648,即使我将该值视为 cm 并忽略它是一个负值,它仍然高得离谱并且不正确。

关于房间的上下文,是一个长方形,周长为116.141732283465,面积为755.626511253023

感谢任何解决此问题的帮助

首先,内部 Revit 数据库单位或长度是英制英尺。如果您使用的是公制单位,则必须进行转换。

其次,房间可以有任何形状,因此很难定义 'width' 和 'length' 的确切含义。

如果您希望将计算限制在矩形房间内,那么您的问题很有意义。

我建议使用 GetBoundarySegments method 查询房间的边界。如果你得到四个之间有直角的边界段,其中两个等长,另外两个等短,你的问题就解决了。

在大多数情况下,您需要多考虑一下。

鉴于 areaperimeter 的值,您的长度和宽度不能是整数。计算它们,

var length = (perimeter - Math.Sqrt(Math.Pow(perimeter, 2) - 16 * area)) / 4;
var width = area / length;

我的推导:

A = l*w
P = 2l + 2w = 2(l+w)

l = A/w

P = 2(A/w+w)
P = 2A/w + 2w
wP = 2A + 2w^2
-2w^2+wP = 2A
-2W^2 + wP - 2A = 0

a = -2
b = P
c = -2A

x = (-b +/- Sqrt(b^2 - 4ac)) / 2a
w = (-P +/- Sqrt(P^2 - 4*(-2)*(-2A)) / 2(-2)
w = (-P +/- Sqrt(P^2 - 16A)) / -4
  = (-P - Sqrt(P^2 - 16A)) / -4
  = (P + Sqrt(P^2 - 16A)) / 4
w = (-P + Sqrt(P^2 - 16A)) / -4
  = (P - Sqrt(P^2 - 16A)) / 4

您可能确实想使用房间 class 中的 GetBoundarySegments() 方法,这会为您提供构成房间的部分。

请注意,这是一个列表列表,因为房间可能包含内部循环

IList<IList<BoundarySegment>> boundaryList = room.GetBoundarySegments(new SpatialElementBoundaryOptions());

您可以通过

获取长度、方向等信息
Curve curve = boundarySegment.GetCurve();

例如:

double nativeLenght = boundarySegment.GetCurve().Length;