我在Revit中使用变换来显示单个光束的高程视图(用于细节)。只要光束是平坦的(相同的开始和结束偏移),这种方法就可以正常工作,但如果我有一个倾斜的光束,我就不得不“压扁”端点。
我尝试沿着实际的起点/终点定义一个单位向量,并在XY平面上定义一个垂直于该向量的数据,该平面贯穿变换的已定义“.Origin”。然后,我使用简单的方程来定义这两个向量的法线... double newx = first.Y * second.Z - first.Z * second.Y; double newy = first.Z * second.X - first.X * second.Z; double newz = first.X * second.Y - first.Y * second.X; double vectlong = Math.Sqrt(newx * newx + newy * newy + newz * newz); XYZ normal = new Autodesk.Revit.DB.XYZ(newx / vectlong,newy / vectlong,newz / vectlong);
然后我使用这三个向量作为我的“.set_Basis”0,1和& 2。
只要我强制光束的起点和终点是平的(这表明生成的“正常”有效),但是当我删除代码以展平并使用实际的Z值时,此代码就可以工作。倾斜梁的端点,当我尝试使用这些值时程序失败。
通过光束中间(CreateViewSection)生成截面的SDK示例似乎发现了同样的问题,但程序员放弃了,只是强制程序只接受已经在同一XY平面上的光束,这不是梁的“规则”。
我导出了三个向量的计算值并验证它们都是单位长度和正交,这应该是变换所需的全部。任何人都可以解释为什么这些基础值会失败吗?
答案 0 :(得分:0)
请使用此代码设置程序集转换。它将正确对齐装配体原点和轴,以便装配视图始终与XYZ轴对齐!
var assyTransform = Transform.Identity;
var beamInst = mainElement as FamilyInstance;
if( beamInst != null )
{
assyTransform = beamInst.GetTransform();
assyTransform.Origin = ( assyInstance.Location as LocationPoint ).Point;
}
if ( !assyInstance.GetTransform()
.AlmostEqual( assyTransform ) )
{
assyInstance.SetTransform( assyTransform );
return true;
}