在软件操作上看,AutoCAD的所有定位都以坐标来进行。相对的在Revit没有坐标这个概念,Revit里面对象的位置关系都是相对位置关系。
但是在Revit内部,坐标是实实在在的。没有坐标无法管理对象的位置。在做Revit二次开发,特别是涉及到几何和位置关系时,需要密切关注对象的坐标,以及不同坐标系之间的坐标转换。
Revit里面的几种坐标系:
- 模型坐标系: 也理解为全局坐标系
- 视图坐标系:与模型坐标系之间的转换
- 族坐标系: 在制作族有一个坐标系,族插入到模型中,其中的几何体有自己在模型中的位置,需要进行模型坐标系的转换。
- 链接模型坐标系: 链接模型的位置在host模型中的位置,需要坐标转换
Revit里面的坐标系转换工具类: Transform
通过Transform里的Origin,BasisX,BasisY,BasisZ可以定义一个局部坐标系,需要注意的是BasisX,BasisY和BasisZ必须是归一化的。OfPoint就是讲局部坐标系中点转换到模型坐标系,Inverse.OfPoint将模型坐标系下的点转换到局部坐标系。
这个Transform有两中获得途径
1. 自己创建一个转换矩阵:
2. 直接从Revit的对象获得转换矩阵。 我们可以从族的实例对象里获得这个族是如何从族定义坐标系到族实例在模型中的位置的坐标转换。
GeometryInstance.Transform 属性可以访问族定义到模型中的位置的矩阵。使用此矩阵可以计算出族实例中的所有点在模型坐标系(也是全局坐标系)的位置。(注:从族的实例中获取其中的点线面的坐标也可以通过GeometryInstance对象的GeometryInstance.GetInstanceGeomery() 方法直接返回在模型坐标系下的坐标。)
3. 从视图中获取视图到全局坐标系的坐标转换。
比如从立面图获取立面图的坐标与全局坐标的转换矩阵: ViewSection.CropBox.Transform。用来把在立面图中的点的坐标转到到模型坐标系
例子:
//先定义一个点,可以属于任何坐标系
XYZ temp = new XYZ(1, 1, 1);
//获取恒等变换,Origin={0,0,0},BasisX={1,0,0},BasisY={0,1,0},BasisZ={0,0,1}
Transform identityTemp = Transform.Identity;
//改变局部坐标系的原点
identityTemp.Origin = new XYZ(1, 1, 1);
//此时将temp理解为局部坐标系下的点,temp1为转换到模型坐标系下的点,temp1={2,2,2}
XYZ temp1 = identityTemp.OfPoint(temp);
//将temp理解为模型坐标系下的点,temp2为转换到局部坐标系下的点,temp2={0,0,0}
XYZ temp2 = identityTemp.Inverse.OfPoint(temp);