Revit开发——创建高程点

最近开发功能需要用到【高程点】功能,之前没怎么用过,借此机会探索了下。Revit跟高程点相关的命令如下图:

高程点

对应的两个API方法如下:

高程点

这次主要用的是高程点,所以及采用下面方法:

public SpotDimension NewSpotElevation(
	View view,
	Reference reference,
	XYZ origin,
	XYZ bend,
	XYZ end,
	XYZ refPt,
	bool hasLeader
)

Parameters

view

Type: Autodesk.Revit.DB.View
The view in which the spot elevation is to be visible.

reference

Type: Autodesk.Revit.DB.Reference
The reference to which the spot elevation is to be bound.

origin

Type: Autodesk.Revit.DB.XYZ
The point which the spot elevation evaluate.

bend

Type: Autodesk.Revit.DB.XYZ
The bend point for the spot elevation.

end

Type: Autodesk.Revit.DB.XYZ
The end point for the spot elevation.

refPt

Type: Autodesk.Revit.DB.XYZ
The actual point on the reference which the spot elevation evaluate.

hasLeader

Type: System.Boolean
Indicate if it has leader or not.

参数中需要传四个点,实在不知道该怎么传,最后问了小伙伴,四个点可以为相同值,但是要注意一点该点必须在reference实体上,也就是说必须在所标注的Element上。

另外可以参考下Revit开发者的博客:https://thebuildingcoder.typepad.com/blog/2010/01/spot-elevation-creation-on-top-of-beam.html

我们以梁作为参照,来看下怎样获取底部高层:

程序思路是:

  1. 通过几何数据获取最低的面PlanarFace.
  2. 将这个面的引用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();
                }
            }

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值