皆様こんにちは。
AMDlabのテキです。
(アイキャッチ画像は、今年「千葉県開府900年」イベントの会場となっている千葉城です。)
寸法配置は実務でよく行う作業です。
一見単純な作業ですが、意外と時間がかかってしまいます。
「ワンクリックで寸法を配置できたら便利なのに」と思ったことはないでしょうか。
それでは、自動寸法の実装をやってみましょう。
Revit寸法の仕様上の特徴
Revitを使い始める前に、Cadや3Dmodelingソフト(Rhino、SketchUp)を先に触ったことがある方が多いと思います。
寸法配置も大した違いがないと思われますが、実際そうではなく、大きな落とし穴があります。
■CAD/Rhino の寸法
- ジオメトリに依存
- 点・線に直接スナップして寸法を作成する
- 寸法は「ジオメトリそのもの」に紐づく
■Revitの寸法
- 参照(Reference)に依存
- 寸法は「参照」に対して付与される
- ジオメトリではなく、その背後にある「Reference」が本体
■ 寸法を作るメソッド
|
1 2 3 4 5 |
<span class="keyword">public</span> <a href="https://www.revitapidocs.com/2023/210f88be-e3c5-26a4-7dd8-3296f6725cce.htm">Dimension</a> <span class="identifier">NewDimension</span>( <a href="https://www.revitapidocs.com/2023/fb92a4e7-f3a7-ef14-e631-342179b18de9.htm">View</a> <span class="parameter">view</span>, <a href="https://www.revitapidocs.com/2023/e7329450-434a-918b-661c-65e15e0585a5.htm">Line</a> <span class="parameter">line</span>, <a href="https://www.revitapidocs.com/2023/bc9192b5-6666-a8de-0128-87dae479fd6a.htm">ReferenceArray</a> <span class="parameter">references</span> ) |
公式ドキュメントの NewDimension メソッドを見ると、寸法作成には参照(Reference)が必要であることが分かります。ここで、「参照が必要なら、まずはモデルの面から取得すればよいのではないか」と考えるのは、ごく自然な発想だと思います。一見正しそうに見えますが、実際にはジオメトリの面から取得した参照は、寸法用の参照としては適切ではありません。
実際にハマったポイント
前述の通り、CADと同じ考え方で、
ジオメトリから参照面を取得、Dimensionを取得するロジックを実装してました。
Solid → Face → Reference → Dimensionという流れです。
|
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 |
Options opt = new Options(); opt.ComputeReferences = true; var geo = foundationInstance.get_Geometry(opt); ReferenceArray ra = new ReferenceArray(); foreach (GeometryObject obj in geo) { if (obj is not Solid solid) { continue; } foreach (Face face in solid.Faces) { if (face is not PlanarFace pf) { continue; } if (Math.Abs(pf.FaceNormal.Z) <= 0.99) { continue; } Reference reference = pf.Reference; if (reference == null) { continue; } ra.Append(reference); } } var dim = doc.Create.NewDimension(view, dimLine, ra); |
しかしここで、
pf.Reference の返し値のタイプが
REFERENCE_TYPE_SURFACE(ジオメトリ参照)となります。
この参照は
ReferenceArray に追加することは可能ですが、
var dim = doc.Create.NewDimension(view, dimLine, ra) を実行しても、寸法は生成されるものの、ビュー上には正しく表示されません。
正しい参照面の取得方法
Instance → Reference → Dimension
正しいやり方は実はシンプルです。
ファミリの右・左・中央などの参照面は、次のように取得できます。
|
1 |
Reference? refLeft = fi.GetReferences(FamilyInstanceReferenceType.Left)?.FirstOrDefault(); |
|
1 2 |
Reference? refCustom1 = fi.GetReferenceByName("カスタマイズ参照面1"); Reference? refCustom2 = fi.GetReferenceByName("カスタマイズ参照面2"); |

ここの返し値のタイプが
REFERENCE_TYPE_ReferencePlane (参照面)となります。
あともう一つのポイントは、参照設定に、弱参照か強参照にしておくことです。
おわりに
いかがでしょうか。今回の検証を通じて、Revitにおける寸法の仕組みについて理解を深めることができました。
これで、汎用的な自動寸法ロジックの構築ができると思います。ぜひやってみてください。
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