皆様こんにちは。
AMDlabの翟(テキ)です。
Rhino.Inside.Revit「RIR」について話していきたいと思います。RIRはMcNeelのオープンソースプロジェクトで、現時点300以上のコンポーネントがあり、今後もどんどん増えていくそうです。しかし、鉄筋はおそらくモデル上の特殊性により、それについてのコンポーネントはまだありません。そこで、いくつかの鉄筋コンポーネントを作ってみました。鉄筋と通常のモデルの違いも含めて、共有できればと思います!
コンポーネントの内容は以下三つになります。
1.鉄筋の中心線を取得
2.Instanceから鉄筋の直径を取得
3.梁から鉄筋を取得
GHでRIRコードを書くときに注意したいこと
・Rhino8ではPython3が登場しましたが、RevitAPIなどの相性を考えると続けてIronPythonを使うほうがよいと思います。
・
doc = DocumentManager.Instance.CurrentDBDocument がコード内部に書くと、動けないこともありますので、「Active Document」をInputにしたほうがいいです。
1.鉄筋の中心線を取得
まずなぜ「ジオメトリ」ではなく、「中心線」を取得する理由について説明させてください。モデルのジオメトリを取得するには、最初に
get_Geometry() を使うことを思い浮かべる人も多いと思います。
でも、鉄筋要素はちょっと特殊で、Solid みたいな実体を持ってるわけじゃなくて、パラメータ駆動でビューに見えているだけです。(ちなみにCivil3Dではソリッドを持っています。)なので
get_Geometry() は他の要素(壁、床など)では機能しますが、鉄筋には効きません。実際の形状は
GetCenterlineCurves() などを使って明示的に取得して、GHで作成する必要があります。
Autodesk 公式フォーラムにも似た質問があります:
🔗 https://forums.autodesk.com/t5/revit-api-forum/rebar-geometry-get-geometry-vs-computedrivingcurves/td-p/10919860
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
import clr clr.AddReference("RhinoInside.Revit") clr.AddReference("RevitAPI") clr.AddReference("RevitServices") from Autodesk.Revit.DB.Structure import MultiplanarOption from Autodesk.Revit.DB import Transform from RevitServices.Persistence import DocumentManager import RhinoInside.Revit.Convert.Geometry clr.ImportExtensions(RhinoInside.Revit.Convert.Geometry) curves = [] # Choose option to extract only planar centerlines option = MultiplanarOption.IncludeOnlyPlanarCurves # Get current document (for safety) doc = DocumentManager.Instance.CurrentDBDocument # Check if input is a valid Rebar element if x and x.GetType().Name == "Rebar": count = x.NumberOfBarPositions print "Bar count:", count for i in range(count): # Skip nonexistent bar positions if not x.DoesBarExistAtPosition(i): print "Position", i, "does not exist — skipped" continue try: # Get centerline curves at this bar index centerline_curves = x.GetCenterlineCurves( True, # Adjust for self-intersections False, # Don't suppress hooks False, # Don't suppress bend radius option, # Planar curves only i # Bar position index ) # If the rebar is shape-driven, apply transform to position it if x.IsRebarShapeDriven: accessor = x.GetShapeDrivenAccessor() transform = accessor.GetBarPositionTransform(i) centerline_curves = [c.CreateTransformed(transform) for c in centerline_curves] print "Position:", i, "→ #Curves:", len(centerline_curves) # Convert Revit curves to Rhino NurbsCurves for c in centerline_curves: rhino_curve = c.ToCurve() if rhino_curve: curves.append(rhino_curve.ToNurbsCurve()) else: print "⚠️ Conversion failed:", c.GetType() except Exception as ex: print "❌ Error at position", i, "→", ex else: print "⚠️ Input is not a Rebar element" curves = ["Input is not Rebar"] # Output to Grasshopper a = curves |
2.鉄筋インスタンスから直径を取得
ご存じの方が多いと思いますが、Revitのパラメータには以下の3種類があります:
・Instance Parameter(インスタンスごと)
・Type Parameter(タイプごと)
・Family Parameter(ファミリに属する)
鉄筋の「Bar Diameter(直径)」はType Parameterなので、鉄筋インスタンスからは直接に見えません。そのため、「鉄筋インスタンス → その鉄筋のタイプ → 直径取得」という流れが必要になります。パラメータの種類については、RIRのガイドにわかりやすく説明されていますので、リンクを載せておきます。参考になればと思います。
https://www.rhino3d.com/en/inside/revit/1.0/guides/revit-revit#the-element-dna
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import clr clr.AddReference('RevitAPI') clr.AddReference('RevitServices') from Autodesk.Revit.DB import BuiltInParameter, UnitUtils, UnitTypeId from RevitServices.Persistence import DocumentManager # Input: a Rebar element rebar = x # Get the bar type element from the rebar bar_type = doc.GetElement(rebar.GetTypeId()) # Try to get the bar diameter parameter param = bar_type.get_Parameter(BuiltInParameter.REBAR_BAR_DIAMETER) diameter_mm = None if param: diameter_internal = param.AsDouble() diameter_mm = UnitUtils.ConvertFromInternalUnits(diameter_internal, UnitTypeId.Millimeters) a = diameter_mm |
3.梁から鉄筋を取得する方法
Revit API(C#)では、オブジェクトの「子 → 親」の関係は一方通行で、「親(梁)→ 子(鉄筋)」のように逆方向で直接に辿ることはできません。
そのため、ここでは BoundingBox と鉄筋が持つ HostID を使って、対象の梁と紐付いている鉄筋を絞り込んでいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import clr clr.AddReference('RevitAPI') clr.AddReference('RevitServices') from Autodesk.Revit.DB.Structure import Rebar from Autodesk.Revit.DB import ( Outline, BoundingBoxIntersectsFilter, FilteredElementCollector ) from RevitServices.Persistence import DocumentManager bbox = x.get_BoundingBox(None) outline = Outline(bbox.Min, bbox.Max) bbox_filter = BoundingBoxIntersectsFilter(outline) rebars = FilteredElementCollector(doc).OfClass(Rebar).WherePasses(bbox_filter).ToElements() rebars = [r for r in rebars if r.GetHostId() == x.Id] a = rebars |
おわりに
今回は RIR で鉄筋に関するコンポーネントを作ってみました。
Revit API のデータ構造についての理解も深まり、今後はそれをより意識しながら取り組んでいきたいと思います。
AMDlabでは、開発に力を貸していただけるエンジニアさんを大募集しております。少しでもご興味をお持ちいただけましたら、カジュアルにお話するだけでも大丈夫ですのでお気軽にご連絡ください!
中途求人ページ: https://www.amd-lab.com/recruit-list/mid-career
カジュアル面談がエントリーフォームからできるようになりました。
採用種別を「カジュアル面談(オンライン)」にして必要事項を記載の上送信してください!
エントリーフォーム: https://www.amd-lab.com/entry
AMDlabのSNSアカウントです!ぜひフォローお願いします✨
■ X(旧Twitter):https://x.com/amdlabinc
■ Instagram:https://www.instagram.com/amdlabinc/
■ Facebook:https://www.facebook.com/amdlab.lnc/
COMMENTS