计算房间长度问题
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 查询房间的边界。如果你得到四个之间有直角的边界段,其中两个等长,另外两个等短,你的问题就解决了。
在大多数情况下,您需要多考虑一下。
鉴于 area
和 perimeter
的值,您的长度和宽度不能是整数。计算它们,
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;
我想在 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 查询房间的边界。如果你得到四个之间有直角的边界段,其中两个等长,另外两个等短,你的问题就解决了。
在大多数情况下,您需要多考虑一下。
鉴于 area
和 perimeter
的值,您的长度和宽度不能是整数。计算它们,
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;