模型坐标系,视图坐标系,族坐标系,链接模型坐标系(Revit二次开发)

在软件操作上看,AutoCAD的所有定位都以坐标来进行。相对的在Revit没有坐标这个概念,Revit里面对象的位置关系都是相对位置关系。但是在Revit内部,坐标是实实在在的。没有坐标无法管理对象的位置。在做Revit二次开发,特别是涉及到几何和位置关系时,需要密切关注对象的坐标,以及不同坐标系之间的坐标转换。Revit里面的几种坐标系:模型坐标系: 也理解为全局坐标系视图坐标系:与模型坐标系之间的转换族坐标系: 在制作族有一个坐标系,族插入到模型中,其中的几何体有自己在模型中的位置,需要进行模
摘要由CSDN通过智能技术生成

在软件操作上看,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的方法,

  1. 自己创建一个转换矩阵:
  2. 直接从Revit的对象获得转换矩阵。
    GeometryInstance.Transform 属性可以访问族定义到模型中的位置的矩阵。使用此矩阵可以计算出族实例中的所有点在模型坐标系(也是全局坐标系)的位置。(注:从族的实例中获取其中的点线面的坐标也可以通过GeometryInstance对象的GeometryInstance.GetInstanceGeomery() 方法直接返回在模型坐标系下的坐标。)
  3. 从视图中获取视图到全局坐标系的坐标转换。
    比如从立面图获取立面图的坐标与全局坐标的转换矩阵: 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
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值