API にはいくつかのジオメトリ ヘルパー クラスがあります。Helper クラスは、BoundingBoxXYZ クラスを使用してビューの CropBox を定義するなど、特定の要素のジオメトリ情報を説明するために使用します。
BoundingBoxXYZ - 3D ビューの断面の面積を定義する場合などに使用する 3D 矩形ボックスです。
Transform - アフィン 3D 空間の変換です。
Reference - Revit モデル内のジオメトリ オブジェクトへの安定した参照です。寸法などの要素を作成する際に使用します。
Plane - ジオメトリ内の平面サーフェスです。
Options - ジオメトリ解析のためのユーザ設定です。
XYZ - 3D 空間の座標を表すオブジェクトです。
UV - 2D 空間の座標を表すオブジェクトです。
BoundingBoxUV - 座標軸に平行な 2D 長方形です。
Revit アプリケーションでの変換は 3x4 変換(行列)に制限されており、モデル空間内のオブジェクトの場所を残りのモデル空間と他のオブジェクトを基準にして変換します。変換はモデル空間における位置と方向から作成されます。3 つの方向ベクトル(BasisX、BasisY、BasisZ プロパティ)と基準点により、すべての変換情報が決まります。4 つの値によって形成された行列は次のとおりです。
点への変換の適用は次のようになります。
Transform OfPoint メソッドは前述の関数を実装します。
Geometry.Transform クラスのプロパティとメソッドは次のセクションのとおりです。
識別を変換します。
CreateReflection()
図 112: 壁の反射の関係
前の図に示すように、1 つの壁が参照面によって鏡像化されます。CreateReflection()メソッドには、参照面のジオメトリ平面の情報が必要です。
コード領域 20-8: 反射プロパティを使用 |
private Transform Reflect(ReferencePlane refPlane) { Transform mirTrans = Transform.CreateReflection(refPlane.Plane); return mirTrans; } |
(0,0,0)や指定した点で指定した軸を中心に、指定した角度だけ回転します。
指定したベクトルによって移動します。ベクトル XYZ データを指定すると、次のように変換が作成されます。
変換の行列式です。
変換で反射が生成されるかどうかを示すブール値です。
変換の尺度を表す値です。
逆変換です。A*B = B*A = I (identity)となるような変換行列 B がある場合は、変換行列 A を逆にすることができます。
この変換が識別であるかどうかを示すブール値です。
この変換が移動であるかどうかを示すブール値です。
Geometry.Transform には、基本的な行列操作を実行するメソッドが備わっています。
指定した変換で変換を乗算し、結果を返します。
演算子 * - 指定した 2 つの変換を乗算します。
基底ベクトルの尺度を設定し、結果を返します。
基底ベクトルの尺度を設定し、変換基準点が結果を返します。
点に変換を適用します。Origin プロパティを使用します。
ベクトルに変換を適用します。Origin プロパティは使用しません。
2 つの変換を比較します。AlmostEqual は Revit コア コードの計算メカニズムと正確性に整合性を持ちます。さらに、Equal と == 演算子は Transform クラスには実装されません。
API には、ジオメトリの変換を実行するためのいくつかのショートカットが用意されています。いくつかのジオメトリ クラスの Transformed プロパティは、次の表に示すような操作のために使用されます。
表 48: Transformed メソッド
クラス名 |
機能の説明 |
Curve.get_Transformed(Transform 変換) |
指定した変換を曲線に適用します |
GeometryElement.GetTransformed(Transform 変換) |
元の要素のジオメトリのコピーを変換します。 |
Profile.get_Transformed(Transform 変換) |
プロファイルを変換し、その結果を返します。 |
Mesh.get_Transformed(Transform 変換) |
メッシュを変換し、その結果を返します。 |
Reference は要素の作成に非常に便利です。
寸法の作成には参照が必要です。
参照は、ジオメトリ表現ツリー内のパスを柔軟な方法で特定します。
ツリーは、特定のジオメトリ表現の作成を表示するために使用します。
API は、異なった選択ポインタのタイプに基づいて、4 つのタイプの参照を表示します。API からの取得方法は、次のようにさまざまです。
点の場合 - Curve.GetEndPointReference メソッド
曲線の場合(線分、円弧など) Curve.Reference プロパティ
面の場合 - Face.Reference プロパティ
切り取りエッジの場合 - Edge.Reference プロパティ
異なる参照タイプを任意に使用することはできません。次に例を示します。
NewLineBoundaryConditions()メソッドには線分の参照が必要です
NewAreaBoundaryConditions()メソッドには面の参照が必要です
NewPointBoundaryConditions()メソッドには点の参照が必要です。
ジオメトリは、通常、インデックス化されたプロパティ Element.Geometry から抽出します。接合、切り込み、欠込み、延長、その他の後処理でインスタンスを修正する前の、梁、柱、ブレースの元のジオメトリは、FamilyInstance.GetOriginalGeometry()メソッドを使用して抽出します。Element.Geometry と FamilyInstance.GetOriginalGeometry()の両方とも、提供するオプションのクラスを受け入れます。オプションのクラスは、そのプロパティに基づいて、次のように受け取る出力のタイプをカスタマイズします。
ComputeReferences - ジオメトリ情報を取得する際に、ジオメトリ参照を計算するかどうかを示します。既定は False なので、このプロパティが True に設定されていない場合は、参照にはアクセスできません。
IncludeNonVisibleObjects - 既定のビューに表示されないジオメトリ オブジェクトも返すかどうかを示します。
View - 特定のビューからジオメトリ情報を取得します。ビューが割り当てられている場合は、「DetailLevel」の代わりにこのビューの詳細レベルが使用されますので注意してください。
DetailLevel - 優先される詳細レベルを示します。既定は標準です。
このプロパティを False に設定すると、API は参照ジオメトリを計算しません。ジオメトリ ツリーから取得されるすべての Reference プロパティは何も返しません。参照についての詳細は、「参照」セクションを参照してください。FamilyInstance.GetOriginalGeometry()で使用する場合は、このオプションを True に設定することはできません。
非表示のジオメトリの大部分は、要素の編集時に表示される建設と条件ジオメトリです(窓ファミリ インスタンスの中心面など)。このプロパティの既定は False です。ただし、この条件付きで表示されているジオメトリの一部は、Revit MEP のダクトを覆う断熱材など実世界のオブジェクトを表しており、抽出する必要があります。
ユーザが別のビューに View プロパティを設定している場合、取得されたジオメトリの情報が異なる場合があります。詳細については、次の例を確認してください。
Revit の [3D ビュー]で階段を描画し、[3D ビュー]の[トリミング領域]、[トリミング領域を表示]、[断面ボックス]プロパティを選択します。[トリミング領域]で、[3D ビュー]の断面ボックスを修正して階段の一部を表示します。API を使用して階段のジオメトリ情報を取得し、Options.View プロパティに[3D ビュー]を設定すると、階段ジオメトリの一部のみが取得できます。次の図は、Revit アプリケーションにおける階段(左)と、API で描画した階段(右)を表しています。
図 113: 断面ボックスにより表示されるジオメトリが異なる
Revit で階段を描画し、次に左の図のように断面図を描画します。API を使用してこの階段の情報を取得し、Options.View プロパティにこの断面図ビューを設定すると、階段ジオメトリの一部のみが取得できます。API で描画した階段が右の図になります。
図 114: ジオメトリの断面図ビューを取得
API では Geometry.Options.DetailLevels に 3 つの列挙を定義します。次に示すように、3 つの列挙は Revit アプリケーションの 3 つの詳細レベルに対応しています。
図 115: 3 つの詳細レベル
DetailLevel プロパティの設定が異なると、異なるジオメトリ情報が取得されます。たとえば、Revit アプリケーションで梁を描画して、次に、 API でその梁からジオメトリを取得して描画します。次の図は、描画の結果を表しています。
図 116: 梁の詳細ジオメトリ
BoundingBoxXYZ は、任意の座標軸に並行にする必要がある 3D 長方形ボックスを定義します。Instance クラスと同様に、BoundingBoxXYZ はローカルの座標空間にデータを格納します。ボックスのローカル座標空間からモデル空間にデータを変換する Transform プロパティを持ちます。つまり、モデル空間内のボックスの境界(Revit 内と同じもの)を取得するには、Transform プロパティを使用して各データ メンバーを変換します。次のセクションは、BoundingBoxXYZ の使用方法を表しています。
BoundingBoxXYZ を使用すると、View.CropBox プロパティを通じてビューの境界を定義できます。次の図では、断面図ビューを使用して、Revit アプリケーションでの BoundingBoxXYZ の使用方法を表しています。
図 117: 断面図ビューでの BoundingBoxXYZ
前の図の破線は、CropBox プロパティ(BoundingBoxXYZ インスタンス)として表示された断面図ビューの境界を表しています。
図 118: 作成された断面図ビュー
前の図は、対応する断面図ビューを表しています。ビューの境界の外側の壁は表示されません。
BoundingBoxXYZ を使用すると、View3D.GetSectionBox()メソッドから取得される 3D ビューの断面ボックスを定義することができます。[プロパティ]ダイアログ ボックスで、[断面ボックス]プロパティを選択します。断面ボックスは、次のように表示されます。
図 119: 3D ビューの断面ボックス
要素のジオメトリの周辺にボックスを定義します(Element.BoundingBox Property)。この方法で取得した BoundingBoxXYZ インスタンスは座標軸に平行になります。
ViewSection.CreateDetail()メソッドで使用します。
次の表は、このクラスの主な用途を表しています。
表 49: BoundingBoxXYZ プロパティ
プロパティ名 |
使用法 |
||||
Max/Min |
最大/最小座標です。これら 2 つのプロパティは、任意の座標軸に平行な 3D ボックスを定義します。Transform プロパティには、ボックスを適切な位置に変換することができる変換行列があります。 |
||||
Transform |
ボックスの座標空間からモデル空間に変換します。 |
||||
Enabled |
境界ボックスがオンになっているかどうかを示します。 |
||||
MaxEnabled/ MinEnabled |
特定の寸法で境界最大値/最小値をアクティブにするかどうかを定義します。
|
||||
Bounds |
Max/Min プロパティのラッパーです。 |
||||
BoundEnabled |
MaxEnabled/ MinEnabled プロパティのラッパーです。 |
次のコード サンプルは、BoundingBoxXYZ を回転して 3D ビューの断面ボックスを修正する方法を表しています。
コード領域 20-9: BoundingBoxXYZ を回転 |
private void RotateBoundingBox(View3D view3d) { BoundingBoxXYZ box = view3d.GetSectionBox(); if (false == box.Enabled) { TaskDialog.Show("Revit","The section box for View3D isn't enabled."); return; } // Create a rotation transform, XYZ origin = new XYZ(0, 0, 0); XYZ axis = new XYZ(0, 0, 1); // Rotate 2 radians Transform rotate = Transform.CreateRotationAtPoint(axis, 2, origin); // Transform the View3D's GetSectionBox() with the rotation transform box.Transform = box.Transform.Multiply(rotate); view3d.SetSectionBox(box); } |
BoundingBoxUV は、座標軸に平行な 2D 長方形を定義する値クラスです。Min と Max データ メンバーをサポートしています。これらはともに BoundingBoxUV の境界を定義します。BoundingBoxUV は、ペーパー空間ビューの境界ビューである View.Outline プロパティから取得します。
図 120: ビューのアウトライン
2 つの点が BoundingBoxUV を定義します。
Min 点 - 左下の端点です。
Max 点 - 右上の端点です。
図 121: BoundingBoxUV の Max と Min
図 122: 傾いた長方形