【Revit二次开发】链接模型坐标系/族坐标系与模型坐标系转换
前因:因做管线分布时,参照线选择Revit链接文件中的构件(墙,梁,柱,管等)后,调整的管距离参照线的距离不对,经测试是坐标系不同导致。查了很多资料,故总结如下
Revit中坐标系有哪几种(原文链接:https://blog.csdn.net/JoeXiongjin/article/details/8202910)
模型坐标系: 也理解为全局坐标系
视图坐标系:与模型坐标系之间的转换
族坐标系: 在制作族有一个坐标系,族插入到模型中,其中的几何体有自己在模型中的位置,需要进行模型坐标系的转换。
链接模型坐标系: 链接模型的位置在host模型中的位置,需要坐标转换。
如何进行坐标转换
使用Transform进行坐标转换,在叶雄进老师的博客中描述有三种获得Transform的方法,
1. 自己创建一个转换矩阵:
2. 直接从Revit的对象获得转换矩阵。
3. 从视图中获取视图到全局坐标系的坐标转换。
我只会用第二种(从Revit的对象获得转换矩阵),以下举两个自己遇到的两个例子用作说明
链接模型坐标系转模型坐标系(这段代码的目的是选取链接文件中的墙,然后得到链接文件中构件对象的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 uiDoc = commandData.Application.ActiveUIDocument;Reference reference1 = uiDoc.Selection.PickObject(ObjectType.LinkedElement, new SelectionLinkFilter(revitDoc),"请选择一个链接参照构件");Transform trans = null;if (reference1 != null){// get RevitLinkInstanceElement ele2 = uiDoc.Document.GetElement(reference1);RevitLinkInstance linkInstance = ele2 as RevitLinkInstance;trans = linkInstance.GetTransform(); //get transDocument linkDoc = null;linkDoc = linkInstance.GetLinkDocument();Element wall = linkDoc.GetElement(reference1.LinkedElementId);Line line_test = (wall.Location as LocationCurve).Curve as Line;XYZ wallLineStartPoint = line_test.GetEndPoint(0);XYZ wallLineEndPoint = line_test.GetEndPoint(1);if (wall is Wall){TaskDialog.Show("wallStartPoint", wallLineStartPoint.ToString());TaskDialog.Show("wallEndPoint:", wallLineEndPoint.ToString());TaskDialog.Show("Trans_wallStartPoint", trans.OfPoint(wallLineStartPoint).ToString());TaskDialog.Show("Trans_wallEndPoint", trans.OfPoint(wallLineEndPoint).ToString());}else{TaskDialog.Show("ERROR", "请勿选择非墙的元素!");return Result.Failed;}}return Result.Succeeded;} }//外链接过滤器public class SelectionLinkFilter : ISelectionFilter{public RevitLinkInstance rvtIns;private readonly Document _doc;Document linkDoc = null;public SelectionLinkFilter(Document doc){_doc = doc;}public bool AllowElement(Element elem){if (elem is RevitLinkInstance){linkDoc = (elem as RevitLinkInstance).GetLinkDocument();rvtIns = elem as RevitLinkInstance;return true;}return false;}public bool AllowReference(Reference reference, XYZ position){//TaskDialog.Show("reference.LinkedElementId", linkDoc.GetElement(reference.LinkedElementId).GetType().ToString());if (linkDoc.GetElement(reference.LinkedElementId) is Wall){//TaskDialog.Show("RevitLinkInstance", (_doc.GetElement(reference) is RevitLinkInstance).ToString());return true;}return false;}}
}
族坐标系转模型坐标系(这段代码的目的是选取柱子的一条边(备注:柱子是族实例),然后得到柱子的几何实例对象的Trans,最后对选取的柱子的这条边进行转换,最后得到的坐标就是模型坐标)
要想清楚知道族坐标和模型坐标之间的关系的,可以查看叶雄进老师的这篇文章 文章链接:https://blog.csdn.net/JoeXiongjin/article/details/16883451
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 GetFamilyInstanceTrans : IExternalCommand{public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements){Application revitApp = commandData.Application.Application; UIDocument uiDoc = commandData.Application.ActiveUIDocument;Document revitDoc = commandData.Application.ActiveUIDocument.Document; Selection S2 = uiDoc.Selection;Reference re = null;try{re = S2.PickObject(ObjectType.Edge, "请选择柱的一条边:");}catch (Autodesk.Revit.Exceptions.OperationCanceledException){return Result.Failed;}if (re != null){FamilyInstance col = revitDoc.GetElement(re) as FamilyInstance;//GetGeometryObjectFromReference obtain an edge selected by userEdge geo_edge = revitDoc.GetElement(re).GetGeometryObjectFromReference(re) as Edge;Curve cur_geo = geo_edge.AsCurve();Options opt = new Options();opt.ComputeReferences = false;opt.View = revitDoc.ActiveView;GeometryElement geoElement = col.get_Geometry(opt);Line transColumeEdge = null; //转换后的柱子的一条边Transform trans = null;foreach (GeometryObject geo_Obj in geoElement){if (geo_Obj is GeometryInstance){GeometryInstance geoInst = geo_Obj as GeometryInstance;trans = geoInst.Transform;break;}}if (trans != null){XYZ edge_start = cur_geo.GetEndPoint(0);XYZ edge_end = cur_geo.GetEndPoint(1);XYZ trans_edgestart = trans.OfPoint(edge_start);XYZ trans_edgeend = trans.OfPoint(edge_end);transColumeEdge = Line.CreateBound(trans_edgestart, trans_edgeend);}}return Result.Succeeded;}}
}
总结:不管是链接模型坐标系还是族坐标系,要想要转换其中坐标为模型坐标的核心就是得到实例对象的TransForm,链接模型是reference ->Element—>RevitLinkInstance。族是得到reference—>Element—>FamilyInstance—>GeometryElement—>GeometryInstance.Transform。
2019.11.27日补充:
当一个Revit项目中存在一个Revit链接模型,Revit链接模型中有一个柱子(族),要想获得柱子的某一边的坐标需要进行的坐标转换步骤如下,首先,获得族实例的Trans,然后进行第一次转换,然后获得链接文件的Trans,将第一步获得的结果进行第二次转换。经过两次转换后才能得到柱子上某点的模型坐标。(此结果花了大半天才总结出来,虽然简单,以此告诫自己,做事情首先思考,明明很简单的转换关系,不思考,一点一点的试,费时费力!)
【Revit二次开发】链接模型坐标系/族坐标系与模型坐标系转换相关推荐
- Revit二次开发之批量修改族名称及族类型名称
昨天是参加工作整一年的好日子,在这一年中逐步开始接触C#和Revit二次开发,困扰和BUG伴随着整个学习过程.由于Revit二次开发的资料和课程不多,很多情况下都是依靠博客.技术贴和QQ群里的大神等方 ...
- revit二次开发之批量打开族文档,样板文件,项目文件
欢迎加入BIM行业开发交流1群 群号:711844216(满),二群群号:1016453207 1背景 小伙伴们在做revit二次开发的时候,可能需要通过程序去打开指定的族文档,样板文件,或者项目文件 ...
- Revit二次开发之判断一个族实例是否基于面创建【比目鱼原创】
=========[更多高级应用请关注公众号]======== =================================== Revit中有些族是不基于面创建,有些族是基于面创建(如环形吸顶 ...
- revit 二次开发 链接CAD文件读取
revit中读取CAD文件的地址 UIApplication uiapp = commandData.Application;UIDocument uidoc = uiapp.ActiveUIDocu ...
- Revit二次开发之技能篇(五)———模型轻量化.RVT到JSON实现的测试
最近作者一直在研究Revit模型轻量化显示在网页中,通过查找大量的资料,找到了一条可行的方法进行分享: 在开文前明确告诉大读者,将.RVT文件转为JSON文件再由three.js读取到网页,并没有实现 ...
- Revit二次开发——族库管理插件的开发思路
Revit二次开发--族库管理插件的开发思路 成熟的BIM团队都会有自己的族库及项目样板文件 在项目样板中载入常用的族及配置好管道系统为项目节约了初始环节的时间 然鹅,项目开展阶段仍需载入新的族 或是 ...
- Revit二次开发选择模型面生成新的三维视图
觉得自己做的一些Revit二次开发的项目经验需要找个地方保存下来,不然以后碰到类似的又得去冲浪捞人家的结晶再整合,所以从今天起开始写CSDN博客啦 选择模型面生成新的三维视图 废话不多说,直接上代码! ...
- Revit二次开发 如何获得链接CAD中所有的多段线PolyLine?
项目场景: 最近做的这个项目,涉及到提取链接CAD中的所有多段线,并根据这些多段线的几何信息做一些分析,但是产生了一些意想不到的问题. 问题描述 通过网上流传的提取手段,并不能完全提取CAD中的所有多 ...
- Revit二次开发—载入族并交互式放置
文章目录 核心代码 问题一:按esc取消放置时报错 问题二:如何在放置一个族实例之后退出放置 问题三:已存在所载入族时,如何正常放置 参考资料 核心代码 using (Transaction tx = ...
- Revit二次开发 获取模型截面线、截面轮廓
描述 获取Revit模型的截面线.横切面线.截面轮廓. 用途 用于获取模型的截面线.横切面线.截面轮廓. 实现方式 创建视图平面: 从视图平面获取轮廓线: 获取平面标高处的截面线. 效果 示例 /// ...
最新文章
- JVM的垃圾回收与内存分配
- ubuntu20.04中安装划词翻译_教你轻松玩转免安装的网页翻译插件“有道网页翻译2.0”...
- mysql 攻击密码_MySQL用户Root密码为弱口令的攻击
- python 编程效率_如何有效提升数据分析效率?五大Python技巧
- char*和CString转换
- JavaScriptJQ 004_JS闭包
- 快速排序(java版)
- 管理员说:CSDN博客,一天访问量1000就很好了
- Android常用应用市场包名
- 夜神模拟器与mac os之间共享文件
- Connect Four四子棋c++程序 - 显示窗口(0)
- 常用的办公软件有哪些?
- Ruby方法参数默认值的一个小技巧在Rails中的应用
- karas报错filename = 'fine_tuned_net.h5', file descriptor = 24, errno = 28, error message = 'No space l
- 鲲鹏平台兼容的操作系统介绍
- IOS开发(17)IOS 使用LBXScan框架开发扫一扫功能
- 微信小程序云开发基础版也开始收费了
- Ubuntu系统中如何进行屏幕截图
- JDK 16 新特性,正式发布!程序员:追不上了……
- 信安66部——OA办公系统部署
热门文章
- 计算机科学与技术项目,计算机科学与技术在工程建设项目中的运用
- Netkiller Java 手札之前言
- java计算机毕业设计国外摇滚乐队交流和周边售卖系统MyBatis+系统+LW文档+源码+调试部署
- 机械设计制造及其自动化
- lighttpd 的 flv 流媒体(含有防盗链功能)
- 视频网站或者网站中有视频,如何阻止迅雷劫持下载
- 转载:森林生物量、碳储量的遥感反演与计算
- labview+PLC程序+OPC完整项目程序Labview和西门子PLC smart200 OPC通讯仪器串口通讯
- 轻松搭建微信答题活动小程序
- 腾讯QQ2007 beta1┊解决Windows Vista下QQ基本的兼容性问题┊纯净绿色特别版