第一次在博客園上寫東西,也不知道該寫些什么,我想就寫點最近項目到遇到的問題吧。
最近在做一個小項目,具體需求大概是在一個revit模型中的對應的樓板位置繪制鋼筋。
由於剛接觸Revit二次開發,之前也沒有畫過鋼筋,所以在網上搜了一些用Revit畫鋼筋的資料。
Revit中是提供了用於為混凝土柱、梁、牆、基礎牆和結構樓板中的鋼筋進行建模的工具。因此我們是可以通過類似於畫牆或者柱的方法來畫鋼筋的。
通過檢索,Revit API 中提供了兩種繪制鋼筋的方法:
一是通過給定幾何形狀創建Rebar.CreateFromRebarShape(Document doc, RebarShape rebarShape, RebarBarType, …)
二是通過給定曲線創建Rebar.CreateFromCurves(Document doc, …, IList<Curve> curves, …)
創建箍筋需要注意的幾個輸入參數的理解:
第二個參數(RebarStyle style)是 選擇鋼筋類型, 對於箍筋需要設置為: RebarStyle.StirupTie. 如果對於直線鋼筋或縱筋設置為RebarStyle.Standard。
bartype,我這里是選擇的是項目中加載好的一個鋼筋族。
第4,、5個參數(RebarHookType)是定義鋼筋彎鈎類型,此處我設為null。
第六個參數(host),由於我所話的鋼筋較多而且分布在不同的樓板上,所以我這里是在項目中隨機選了一個樓板當做host,這樣做不會出錯,但是會彈出一個警告(如下所示)。
第七個參數(XYZ norm) 是箍筋坐在平面的法向量方向,由於本項目的樓板都在XY平面,所以直接選取Z軸作為法向量。當然也可以選用curvesList中相交兩線叉乘,獲得法向量。
第八個參數(IList<Curve>)當然就是最重要的待繪制的鋼筋曲線列表,此處應該注意的是,此處的曲線列表必須是首尾相連放入這個List中,不然是畫不出鋼筋的。樓主一開始只是把組成鋼筋的三個直線無序加入List中,然后就一直報這個錯誤。

double edge = 1; Transaction transT = new Transaction(doc); transT.Start("Create Rebar From RebarShape"); for (int j = 0; j < ptList.Count; j++) { Line steelLine = Line.CreateBound(ptList[j].Item1, ptList[j].Item2); IList<Curve> curves = new List<Curve>(); XYZ direction = steelLine.Direction; XYZ verticalVector = RotateTo(direction, -Math.PI / 2.0, XYZ.BasisZ); XYZ leftEdgePt = ptList[j].Item1 + verticalVector.Normalize() * edge; XYZ rightEdgePt = ptList[j].Item2 + verticalVector.Normalize() * edge; Line leftEdgeLine = Line.CreateBound(leftEdgePt, ptList[j].Item1); Line rightEdgeLine = Line.CreateBound(ptList[j].Item2, rightEdgePt); curves.Add(leftEdgeLine); curves.Add(steelLine); curves.Add(rightEdgeLine); XYZ normal = XYZ.BasisZ; RebarBarType bartype = new FilteredElementCollector(doc).OfClass(typeof(RebarBarType)).FirstOrDefault(t => t.Name == SystemInfoConfig.SteelTypeName) as RebarBarType; var instanceFitler = new ElementClassFilter(typeof(Floor)); var collector = new FilteredElementCollector(doc); Element host = collector.WherePasses(instanceFitler).FirstOrDefault(); Rebar newRebar = Rebar.CreateFromCurves(doc, RebarStyle.Standard, bartype, null, null, host, normal, curves, RebarHookOrientation.Left, RebarHookOrientation.Left, true, true); } transT.Commit();

樓主是初學者,有缺漏或者不對的地方,歡迎大家補充和糾正。