给定具有相同LocationPoint的两个族实例,如何使实例#1和#2具有相同的方向

问题描述 投票:0回答:2

在Revit API中,我试图用“机械设备”类别的几乎相同版本替换“专业设备”类别的系列实例。到目前为止,我已经能够将新实例插入与旧实例相同的位置,但我无法匹配相同的方向。一个FamilyInstance有一个方法GetTransform,我可以用来获得旧TransformFamilyInstance,但没有方法SetTransform设置新的FamilyInstance变换。可用于移动新FamilyInstance的唯一工具是具有ElementTransformUtilsMoveElement等功能的RotateElement,但我不确定使用旧的Transform传递给这些的什么。

我如何确保新的qazxsw poi的方向与旧的qazxsw poi的方向相匹配?

c# revit-api
2个回答
1
投票

在检查了维基百科的FamilyInstance后,我能够为此编写代码。我还必须查找FamilyInstance以确定角度。

how to determine the axis and the angle of rotation

然后我将这些传递到how to calculate the trace方法,以便将private static Line GetRotationAxisFromTransform(Transform transform) { double x = transform.BasisY.Z - transform.BasisZ.Y; double y = transform.BasisZ.X - transform.BasisX.Z; double z = transform.BasisX.Y - transform.BasisY.X; return Line.CreateUnbound(transform.Origin, new XYZ(x, y, z)); } private static double GetRotationAngleFromTransform(Transform transform) { double x = transform.BasisX.X; double y = transform.BasisY.Y; double z = transform.BasisZ.Z; double trace = x + y + z; return Math.Acos((trace - 1) / 2.0); } #2旋转到与ElementTransformUtils.RotateElement#1相同的位置。


1
投票

我找到了一个更好的解决方案,可以解决0或180度旋转问题。我的第一个解决方案在这种情况下不起作用。我在FamilyInstance找到了解决方案和java版本的代码。

这是我的代码从FamilyInstance获取矩阵,然后调用函数来获取轴和角度。

euclideanspace.com

这是数学函数

Transform
© www.soinside.com 2019 - 2024. All rights reserved.