700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 模型坐标系 视图坐标系 族坐标系 链接模型坐标系(Revit二次开发)

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

时间:2020-03-22 02:19:48

相关推荐

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

在软件操作上看,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 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,最后对选取的柱子的这条边进行转换,最后得到的坐标就是模型坐标)

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;//GetGeometryObjectFromReferenceobtain an edge selected by userEdge geo_edge = revitDoc.GetElement(re).GetGeometryObjectFromReference(re) as Edge;Curve cur_geo = geo_edge.AsCurve();Options opt = new Options();puteReferences = 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。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。