最近开发功能需要用到【高程点】功能,之前没怎么用过,借此机会探索了下。Revit跟高程点相关的命令如下图:
对应的两个API方法如下:
这次主要用的是高程点,所以及采用下面方法:
Parameters view Type: Autodesk.Revit.DB.View reference Type: Autodesk.Revit.DB.Reference origin Type: Autodesk.Revit.DB.XYZ bend Type: Autodesk.Revit.DB.XYZ end Type: Autodesk.Revit.DB.XYZ refPt Type: Autodesk.Revit.DB.XYZ hasLeader Type: System.Boolean |
参数中需要传四个点,实在不知道该怎么传,最后问了小伙伴,四个点可以为相同值,但是要注意一点该点必须在reference实体上,也就是说必须在所标注的Element上。
另外可以参考下Revit开发者的博客:https://thebuildingcoder.typepad.com/blog/2010/01/spot-elevation-creation-on-top-of-beam.html
我们以梁作为参照,来看下怎样获取底部高层:
程序思路是:
- 通过几何数据获取最低的面PlanarFace.
- 将这个面的引用face.Reference作为参数传入方法中
本来这样应该没有问题,但是提示点不在参照面上,这样让我百思不得其解,最后用射线法找到最下面的面,将通过几何取到的面转换为字符串,两个对比发现了差异:
- 通过几何数据直接取到的引用转化为字符串是这样的格式:a9071887-81f2-45ed-bbca-9cf4b7dae1da-0007d50a:19:SURFACE
- 通过射线法取到底面找到面引用转化为字符串是这样的:a9071887-81f2-45ed-bbca-9cf4b7dae1da-0007d4f1:0:INSTANCE:a9071887-81f2-45ed-bbca-9cf4b7dae1da-0007d50a:19:SURFACE
而9071887-81f2-45ed-bbca-9cf4b7dae1da-0007d4f1这个字符串是梁本身的引用转化成的字符串,由此可以得出,在取引用的时候需要给面加上前缀。即最终的字符串应该是 本身字符串+:0:INSTANCE:+面的引用。说了这么多看下面代码:
Element instance = wrapper.UiApp.PickElement("选择一个梁", SelectionFilters.Beam);
if (instance != null)
{
Transaction trans = new Transaction(wrapper.Doc, "CreateSpotDimension");
trans.Start();
try
{
FamilyInstance beam = instance as FamilyInstance;
Line line = beam.GetLocationCurve() as Line;
List<string> referList = new List<string>();
Reference ref1 = new Reference(beam);
referList.Add(ref1.ConvertToStableRepresentation(wrapper.Doc));
List<PlanarFace> faceList = beam.GetFaces().ToList<PlanarFace>();
faceList.RemoveAll(p => !p.FaceNormal.IsParallel(XYZ.BasisZ));
var list = faceList.OrderBy(p => p.Origin.Z);
PlanarFace face = list.ElementAt(0);
Reference refer1 = face.Reference;
string referStr = refer1.ConvertToStableRepresentation(wrapper.Doc);
string actualStr = $"{ref1.ConvertToStableRepresentation(wrapper.Doc)}:0:INSTANCE:{referStr}";
Reference referenc = Reference.ParseFromStableRepresentation(wrapper.Doc, actualStr);
XYZ point = line.Evaluate(0.5, true);
XYZ bend = point + XYZ.BasisX * 100;
XYZ end = bend - XYZ.BasisZ;
SpotDimension spotDimension = wrapper.DocCreater.NewSpotElevation(wrapper.ActiveView, referenc, point, bend, end, point, true);
trans.Commit();
}
catch (Exception ex)
{
trans.RollBack();
}
}