Revit二次開發之繪制鋼筋


第一次在博客園上寫東西,也不知道該寫些什么,我想就寫點最近項目到遇到的問題吧。

 

最近在做一個小項目,具體需求大概是在一個revit模型中的對應的樓板位置繪制鋼筋。

由於剛接觸Revit二次開發,之前也沒有畫過鋼筋,所以在網上搜了一些用Revit畫鋼筋的資料。

Revit中是提供了用於為混凝土柱、梁、牆、基礎牆和結構樓板中的鋼筋進行建模的工具。因此我們是可以通過類似於畫牆或者柱的方法來畫鋼筋的。

通過檢索,Revit API 中提供了兩種繪制鋼筋的方法:

一是通過給定幾何形狀創建Rebar.CreateFromRebarShape(Document doc, RebarShape rebarShape, RebarBarType, …)

二是通過給定曲線創建Rebar.CreateFromCurves(Document doc, …, IList<Curve> curves, …)

 
第一種CreateFromRebarShape是根據已有的的鋼筋幾何形狀以及鋼筋族,選擇一個host繪制。后面 XYZ origin, XYZ xVec , XYZ yVec這三個參數設置插入點,以及約束條件。用這個方法試了很多次都滿足不了我項目上的要求,而且使用這個方法之后,還需要配合Rebar.ScaleToBox(XYZ origin, XYZ xVec, XYZ yVec)方法,把鋼筋放置在給定的包圍盒內。
 
放棄了CreateFromRebarShape,選用的是第二種CreateFromCurves方法。該方法同樣是需要根據已有的的鋼筋幾何形狀以及鋼筋族,選擇一個host繪制。

 創建箍筋需要注意的幾個輸入參數的理解:

第二個參數(RebarStyle style)是 選擇鋼筋類型, 對於箍筋需要設置為: RebarStyle.StirupTie.  如果對於直線鋼筋或縱筋設置為RebarStyle.Standard。

bartype,我這里是選擇的是項目中加載好的一個鋼筋族。

第4,、5個參數(RebarHookType)是定義筋彎鈎類型,此處我設為null。

第六個參數(host),由於我所話的鋼筋較多而且分布在不同的樓板上,所以我這里是在項目中隨機選了一個樓板當做host,這樣做不會出錯,但是會彈出一個警告(如下所示)。

第七個參數(XYZ norm) 是箍筋坐在平面的法向量方向,由於本項目的樓板都在XY平面,所以直接選取Z軸作為法向量。當然也可以選用curvesList中相交兩線叉乘,獲得法向量。

第八個參數(IList<Curve>)當然就是最重要的待繪制的鋼筋曲線列表,此處應該注意的是,此處的曲線列表必須是首尾相連放入這個List中,不然是畫不出鋼筋的。樓主一開始只是把組成鋼筋的三個直線無序加入List中,然后就一直報這個錯誤。

始終提示,提供的曲線列表是個無效的曲線。找了半天,才發現加入列表的線段不是按順序首尾相連。害我調試了很久....
 
最后兩個參數應該很好理解,一個是使用存在的鋼筋形狀,另一個是創建一個新的鋼筋形狀。
如果這兩個參數分別置成false,true的話,那樣每畫一次鋼筋就會默認創建一個新的鋼筋形狀;
而置成true,false的話,程序會提示沒有適用的鋼筋形狀而畫不出鋼筋;
樓主這里置成true,true,這樣同一類型的鋼筋就共用一個新創建的鋼筋形狀。
            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();

 

最后的效果,如下圖所示:
 
由於想在俯視圖上能看到這些鋼筋,所以在畫的時候,故意將鋼筋的Z坐標稍微調高了一點,使得鋼筋不在樓板中,以便看到效果,紅色顯示的就是所畫的鋼筋。
 

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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM