※アイキャッチ画像はDALL·E 3で作成しました。
はじめに
AMDlab BIMエンジニアの河野(twitter@tatsukikouno)です。
昨年末ですが、AutodeskからRevit等の.NET(旧.NET Core)への移行が発表されてましたね。
これまで弊社で手掛けてきたシステム達も少なからず対応が必要になってくると思われます。
今後の展開に色んな意味でドキドキが止まらない今日この頃です。
さて、今日この頃といえば弊社へのRevit関連開発のご相談は年々増加傾向にあります。
Dynamoのようなビジュアルプログラミングでの自動化も試行錯誤には良いですが、メンテナンス性や安定性の面ではやはりアドインでの実装が有効です。
本記事は「RevitAPIで学ぶC#」第一弾として、Revitのデータベース構造とその基本であるクラスについて解説します。
Revitアドインを開発してみたい方にはもちろん、実務でプログラムを書かない方でも、Revitのデータ構造を知ることでRevitの仕組みの理解が深まると思います。
RevitAPI調査用必須ツール&Webサイト
- Revit Lookup
Revitのデータ構造を調査するためのRevitアドインです。GithubのReleasesから各Revitバージョンに対応したインストーラーをダウンロードできます。 - RevitAPI Docs
RevitAPIの辞書です。 - Revit API 開発者用ガイド
ヘルプの一節ですが、大抵の場合ここを見れば答えが書いてあります。 - The Building Coder
@jeremytammikさんの運営するブログです。Revit API Forumで見つかった有用な解決策などを逐一まとめてくれています。
道に迷ったとき、Googleで検索してこのブログの記事がヒットすれば勝ちです。 - ChatGPT等
プログラミングで悩んだら相談してみましょう。最近はRevitAPIを使ったコードの正答率もかなり高くて重宝してます。
Revitのクラスとは
OOPにおけるクラスとは…等の説明はここでは省略しますが、一度調べてみるといいかもです。
一点注意しておいてほしいのが、C#などのプログラミングにおける「インスタンス」とRevit用語の「インスタンス」は似て非なる概念です。
本記事ではRevit用語の「インスタンス」しか用いません。
何はともあれWallクラスとWallTypeクラスをみてみましょう。
Wallクラスは壁インスタンスを、WallTypeクラスは壁タイプを表すクラスです。
「◯◯を表す」のとおり、クラスはオブジェクトそのものを指す概念ではなくオブジェクトの定義を表す概念です。
例えば、Wallクラスの記述から壁インスタンスはCreateメソッドやLocationプロパティ等を持っていることが分かります。
メソッドは関数、プロパティは属性みたいなものですが、本筋から反れるため詳細は割愛します。
それでは、Revitで実際のデータを確認してみましょう。
サンプルの意匠モデルを開いて適当な壁インスタンスを選択→アドインタブのRevitLookupでSnoop Selectionをクリックします。
Member列が先程RevitAPI Docsで確認したWallクラスのプロパティやメソッドの一覧、Value列がその値(返り値)になります。
更にLocation→Curve→GetEndPoint(Int32)の順番でクリックしてみましょう。
これで、壁の座標を取得することができました。
XYZクラスオブジェクトの形で、始端・終端それぞれのX,Y,Z座標が保持されていることがわかります。
このことを少し考察してみましょう。
壁は立体的な形状をしているため、立面的には4つの頂点で描画されます。
一方で、Revitで壁を配置するとき、普通はマウスで始端と終端をクリックすると思います。
このときクリックしている1点目と2点目が、WallクラスのLocationプロパティの始端と終端を指定していたんですね。
このことはWallクラスオブジェクトを作成するCreateメソッドからも読み取れるので、実装する際は気にしてみてください。
ちなみに、壁の立面的な形状はSketchクラスという形でWallクラスに紐づけられおり、こちらも興味深い仕組みなので機会があればピックアップしたいと思います。
WallクラスとWallTypeクラスの関係
前述のとおり、Wallクラスは壁インスタンスを、WallTypeクラスは壁タイプを表すクラスです。
Revitでは壁インスタンスのタイプを任意に変更できますが、その関係はDB上ではどうなっているでしょうか。
先ほどと同様にしてRevit Lookupで確認します。
WallクラスのWallTypeプロパティが、ValueとしてWallTypeクラスオブジェクトを保持していました。
(プロパティ名とクラス名がどちらも同じ”WallType”でややこしいですが・・・)
ここまででお気づきの方もいると思いますが、プロパティの値やメソッドの返り値は整数、実数、文字列に加えて、何らかのクラスオブジェクトであることが多いです。
オブジェクトがオブジェクトを保持して、そのオブジェクトが別のオブジェクトを保持して…という連鎖が、Revitのオブジェクティブなデータベースを構築しているんですね。
おわりに
今回は「RevitAPIで学ぶC#」第一弾として、Revitの基本であるクラスとその調べ方について解説しました。
続編もそのうち投稿できればと思っています。
また、弊社では随時BIMエンジニア、コンピュテーショナルデザイナーを募集しています。
ご興味のある方は、DMかContactからご連絡ください。
COMMENTS