標籤:

為線型元素創建尺寸標註

在Revit建模過程中,尺寸標註是一個比不可少的部分。為了提高效率,可以用Revit API自動創建尺寸標註。下面羅列一些創建尺寸標註的方法(部分代碼來源於EasyDimension),供大家參考(這裡先介紹標註元素長度的方法,元素間距離後面另外再寫)。

創建元素長度標註有以下幾個步驟:

1、因為標註只屬於特定的視圖,因此需要先確定該元素是否可以在當前視圖創建標註(比如說一個柱子在平面圖上只有一個橫截面,則不能標註柱子長度)。代碼如下:

public static bool IsCurveOKForView(Element e, XYZ viewNormal, ref XYZ dirVec)n{n if (e == null || viewNormal == null)n return false;nn LocationCurve locCurve = e.Location as LocationCurve;n if (locCurve == null || locCurve.Curve == null)n return false;n if (!(locCurve.Curve is Line))n {n return false;n }n // 獲取直線的兩個端點n XYZ p1 locCurve.Curve.GetEndPoint(0);n XYZ p2 locCurve.Curve.GetEndPoint(1);n p1 = p1.Subtract(p2).Normalize();n if (IsZero(p1.DotProduct(viewNormal)))n {n dirVec = p1.CrossProduct(viewNormal);n return true;n }n return false;n}n

其中e是需要標註的元素,viewNormal是當前視圖的法向量,dirVec是標註線與元素的偏移方向向量。

2、如果元素可以在當前視圖創建標註,則接下來需要獲取元素兩端的幾何參照。

如果元素是CurveElement,獲取參照方法如下:

ReferenceArray refs;nCurveElement crv = e as CurveElement;nLine ln crv.GeometryCurve as Line;nfor (int ii = 0; ii < 2; ++ii )n{n Reference rf = ln.GetEndPointReference(ii);n if (rf != null)n {n refs.Append(rf);n }n}n

如果是其它元素,則需要得到元素兩端的幾何面參照,代碼如下:

public List GetAllSolid(Application rapp, Element e)n{n List lstSolid = new List();nn Options options = rapp.Create.NewGeometryOptions();n options.ComputeReferences = true;n options.DetailLevel = ViewDetailLevel.Fine;nn GeometryElement geoElem = e.get_Geometry(options);n IEnumerator it = geoElem.GetEnumerator();n while (it.MoveNext())n {n GeometryObject geoObject = it.Current;n Solid solid = geoObject as Solid;n if (solid == null)n continue;n lstSolid.Add(solid);n }n return lstSolid;n}nnprivate static bool getSolidReference(Application revitApp, Element e, XYZ dirLine, ref ReferenceArray refs)n{n if (refs == null)n {n return false;n }n refs.Clear();n foreach (Solid solid in GetAllSolid(revitApp, e))n {n FaceArrayIterator fIt = solid.Faces.ForwardIterator();n while (fIt.MoveNext())n {n PlanarFace p = fIt.Current as PlanarFace;n if (p == null)n continue;n if (p.Normal.CrossProduct(dirLine).IsZeroLength() == false)n {n continue;n }nn refs.Append(p.Reference);n if (2 == refs.Size)n {n break;n }n }n if (2 == refs.Size)n {n break;n }n }n return (refs.Size == 2);n}n

3、獲取到幾何參照後即可創建標註。

doc.Create.NewDimension(doc.ActiveView, newLine, arrRefs);n

其中newLine為標註線所在的直線,可以通過元素中心線及偏移方向向量得到。


推薦閱讀:

要畫管架,C型鋼和螺桿怎麼畫?
為什麼Revit渲染一張圖要那麼久,而遊戲卻可以做到實時渲染?
如何自學 Revit?
有哪些適合全面系統地學習 BIM 的書籍?
請問REVIT在水電工程中能用么。 可不可以將大壩、隧道、地下廠房之類給建模出來並指導工作?

TAG:AutoDeskRevit | API |