在软件操作上看,AutoCAD的所有定位都以坐标来进行。相对的在Revit没有坐标这个概念,Revit里面对象的位置关系都是相对位置关系。(X对应的是东方,Y对应的是北方)
但是在Revit内部,坐标是实实在在的。没有坐标无法管理对象的位置。在做Revit二次开发,特别是涉及到几何和位置关系时,需要密切关注对象的坐标,以及不同坐标系之间的坐标转换。
Revit里面的几种坐标系:
模型坐标系: 也理解为全局坐标系
视图坐标系:与模型坐标系之间的转换
族坐标系: 在制作族有一个坐标系,族插入到模型中,其中的几何体有自己在模型中的位置,需要进行模型坐标系的转换。
链接模型坐标系: 链接模型的位置在host模型中的位置,需要坐标转换。
首先说明下概念:
在制作族的时候,族文件中的几何体具有自己的坐标系。当加载族文件到Revit模型文件中,插入改族实例到模型后,族实例中的几何体具有自己的坐标。
从族实例获取几何体的几何信息由两种方法:
FamilyInstance.GetOriginalGeometry() 方法: 获取这个族实例在被剪切,合并等操作之前的几何数据GeometryElement。其数字是相对于Revit的模型坐标系。
FamilyInstance.Geometry 属性: 可以获得这个族实例经过后期处理(剪切,合并等)之后的几何数据(GeometryElement)。
现在我们了解下上面方法返回的几何体的坐标值与族文件中的几何体的坐标值之间的关系。Revit API在这点上作了非常好的工作它提供了一个属性GeometryInstance.Transform,我们可以获得转换矩阵Transform。这个转换矩阵可以把族文件中几何实体的坐标信息直接转成成族实例在模型文件坐标系中的坐标。
GeometryInstance 对象可以从GeometryElement) 中获得。
如何进行坐标转换
使用Transform进行坐标转换,其中有三种获得Transform的方法,
- 自己创建一个转换矩阵:
- 直接从Revit的对象获得转换矩阵。
GeometryInstance.Transform 属性可以访问族定义到模型中的位置的矩阵。使用此矩阵可以计算出族实例中的所有点在模型坐标系(也是全局坐标系)的位置。(注:从族的实例中获取其中的点线面的坐标也可以通过GeometryInstance对象的GeometryInstance.GetInstanceGeomery() 方法直接返回在模型坐标系下的坐标。) - 从视图中获取视图到全局坐标系的坐标转换。
比如从立面图获取立面图的坐标与全局坐标的转换矩阵: ViewSection.CropBox.Transform。用来把在立面图中的点的坐标转到到模型坐标系
链接模型坐标系转模型坐标系
(这段代码的目的是选取链接文件中的墙,然后得到链接文件中构件对象的trans,最后转换墙的curve的两点坐标,然后打印出来,打印出来的坐标就是模型坐标)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.DB;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Electrical;
using Autodesk.Revit.DB.Plumbing;
namespace WindowTest
{
[Regeneration(RegenerationOption.Manual)]
[Transaction(TransactionMode.Manual)]
public class Class1 : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
Document revitDoc = commandData.Application.ActiveUIDocument.Document;
Application revitApp = commandData.Application.Application;
UIDocument