在Revit API中,我试图用“机械设备”类别的几乎相同版本替换“专业设备”类别的系列实例。到目前为止,我已经能够将新实例插入与旧实例相同的位置,但我无法匹配相同的方向。一个FamilyInstance
有一个方法GetTransform
,我可以用来获得旧Transform
的FamilyInstance
,但没有方法SetTransform
设置新的FamilyInstance
变换。可用于移动新FamilyInstance
的唯一工具是具有ElementTransformUtils
和MoveElement
等功能的RotateElement
,但我不确定使用旧的Transform
传递给这些的什么。
我如何确保新的qazxsw poi的方向与旧的qazxsw poi的方向相匹配?
在检查了维基百科的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相同的位置。
我找到了一个更好的解决方案,可以解决0或180度旋转问题。我的第一个解决方案在这种情况下不起作用。我在FamilyInstance
找到了解决方案和java版本的代码。
这是我的代码从FamilyInstance
获取矩阵,然后调用函数来获取轴和角度。
euclideanspace.com
这是数学函数
Transform