ジオメトリ ヘルパー クラス

ジオメトリ ヘルパー クラス

API にはいくつかのジオメトリ ヘルパー クラスがあります。Helper クラスは、BoundingBoxXYZ クラスを使用してビューの CropBox を定義するなど、特定の要素のジオメトリ情報を説明するために使用します。

Transform

Revit アプリケーションでの変換は 3x4 変換(行列)に制限されており、モデル空間内のオブジェクトの場所を残りのモデル空間と他のオブジェクトを基準にして変換します。変換はモデル空間における位置と方向から作成されます。3 つの方向ベクトル(BasisX、BasisY、BasisZ プロパティ)と基準点により、すべての変換情報が決まります。4 つの値によって形成された行列は次のとおりです。

点への変換の適用は次のようになります。

Transform OfPoint メソッドは前述の関数を実装します。

Geometry.Transform クラスのプロパティとメソッドは次のセクションのとおりです。

Identity

識別を変換します。

CreateReflection()

指定した面が反映されます。

図 112: 壁の反射の関係

前の図に示すように、1 つの壁が参照面によって鏡像化されます。CreateReflection()メソッドには、参照面のジオメトリ平面の情報が必要です。

コード領域 20-8: 反射プロパティを使用

private Transform Reflect(ReferencePlane refPlane)
{
    Transform mirTrans = Transform.CreateReflection(refPlane.Plane);

    return mirTrans;
}

CreateRotation()と CreateRotationAtPoint()

(0,0,0)や指定した点で指定した軸を中心に、指定した角度だけ回転します。

CreateTranslation()

指定したベクトルによって移動します。ベクトル XYZ データを指定すると、次のように変換が作成されます。

Determinant

変換の行列式です。

HasReflection

変換で反射が生成されるかどうかを示すブール値です。

Scale

変換の尺度を表す値です。

Inverse

逆変換です。A*B = B*A = I (identity)となるような変換行列 B がある場合は、変換行列 A を逆にすることができます。

IsIdentity

この変換が識別であるかどうかを示すブール値です。

IsTranslation

この変換が移動であるかどうかを示すブール値です。

Geometry.Transform には、基本的な行列操作を実行するメソッドが備わっています。

Multiply

指定した変換で変換を乗算し、結果を返します。

演算子 * - 指定した 2 つの変換を乗算します。

ScaleBasis

基底ベクトルの尺度を設定し、結果を返します。

ScaleBasisAndOrigin

基底ベクトルの尺度を設定し、変換基準点が結果を返します。

OfPoint

点に変換を適用します。Origin プロパティを使用します。

OfVector

ベクトルに変換を適用します。Origin プロパティは使用しません。

AlmostEqual

2 つの変換を比較します。AlmostEqual は Revit コア コードの計算メカニズムと正確性に整合性を持ちます。さらに、Equal と == 演算子は Transform クラスには実装されません。

API には、ジオメトリの変換を実行するためのいくつかのショートカットが用意されています。いくつかのジオメトリ クラスの Transformed プロパティは、次の表に示すような操作のために使用されます。

表 48: Transformed メソッド

クラス名

機能の説明

Curve.get_Transformed(Transform 変換)

指定した変換を曲線に適用します

GeometryElement.GetTransformed(Transform 変換)

元の要素のジオメトリのコピーを変換します。

Profile.get_Transformed(Transform 変換)

プロファイルを変換し、その結果を返します。

Mesh.get_Transformed(Transform 変換)

メッシュを変換し、その結果を返します。

注: Transformed メソッドは自身をクローン化し、変換してクローン化した結果を返します。
これらのメソッドに加え、Instance クラス(ファミリ インスタンス、リンク インスタンス、読み込んだ CAD コンテンツなどの要素の親クラス)には、特定の Instance のための変換機能が備わっています。GetTransform()メソッドは、インスタンスの配置方法に基づいてインスタンスの基本変換を取得し、GetTotalTransform()メソッドは読み込みインスタンスなどのインスタンスのための真北変換で修正した変換を提供します。

Reference

Reference は要素の作成に非常に便利です。

  • 寸法の作成には参照が必要です。

  • 参照は、ジオメトリ表現ツリー内のパスを柔軟な方法で特定します。

  • ツリーは、特定のジオメトリ表現の作成を表示するために使用します。

API は、異なった選択ポインタのタイプに基づいて、4 つのタイプの参照を表示します。API からの取得方法は、次のようにさまざまです。

  1. 点の場合 - Curve.GetEndPointReference メソッド

  2. 曲線の場合(線分、円弧など) Curve.Reference プロパティ

  3. 面の場合 - Face.Reference プロパティ

  4. 切り取りエッジの場合 - Edge.Reference プロパティ

異なる参照タイプを任意に使用することはできません。次に例を示します。

  • NewLineBoundaryConditions()メソッドには線分の参照が必要です

  • NewAreaBoundaryConditions()メソッドには面の参照が必要です

  • NewPointBoundaryConditions()メソッドには点の参照が必要です。

Reference.ConvertToStableRepresentation()メソッドを使用して、ジオメトリ オブジェクト(面、エッジ、曲線)に参照を文字列として保存しておき、後で同じ Revit セッション(または、同じドキュメントが存在する別のセッション)で ParseFromStableRepresentation()メソッドを使用し、文字列を入力として使い同じ Reference を取得することができます。

オプション

ジオメトリは、通常、インデックス化されたプロパティ Element.Geometry から抽出します。接合、切り込み、欠込み、延長、その他の後処理でインスタンスを修正する前の、梁、柱、ブレースの元のジオメトリは、FamilyInstance.GetOriginalGeometry()メソッドを使用して抽出します。Element.Geometry と FamilyInstance.GetOriginalGeometry()の両方とも、提供するオプションのクラスを受け入れます。オプションのクラスは、そのプロパティに基づいて、次のように受け取る出力のタイプをカスタマイズします。

  • ComputeReferences - ジオメトリ情報を取得する際に、ジオメトリ参照を計算するかどうかを示します。既定は False なので、このプロパティが True に設定されていない場合は、参照にはアクセスできません。

  • IncludeNonVisibleObjects - 既定のビューに表示されないジオメトリ オブジェクトも返すかどうかを示します。

  • View - 特定のビューからジオメトリ情報を取得します。ビューが割り当てられている場合は、「DetailLevel」の代わりにこのビューの詳細レベルが使用されますので注意してください。

  • DetailLevel - 優先される詳細レベルを示します。既定は標準です。

ComputeReferences

このプロパティを False に設定すると、API は参照ジオメトリを計算しません。ジオメトリ ツリーから取得されるすべての Reference プロパティは何も返しません。参照についての詳細は、「参照」セクションを参照してください。FamilyInstance.GetOriginalGeometry()で使用する場合は、このオプションを True に設定することはできません。

IncludeNonVisibleObjects

非表示のジオメトリの大部分は、要素の編集時に表示される建設と条件ジオメトリです(窓ファミリ インスタンスの中心面など)。このプロパティの既定は False です。ただし、この条件付きで表示されているジオメトリの一部は、Revit MEP のダクトを覆う断熱材など実世界のオブジェクトを表しており、抽出する必要があります。

ビュー

ユーザが別のビューに View プロパティを設定している場合、取得されたジオメトリの情報が異なる場合があります。詳細については、次の例を確認してください。

  1. Revit の [3D ビュー]で階段を描画し、[3D ビュー]の[トリミング領域]、[トリミング領域を表示]、[断面ボックス]プロパティを選択します。[トリミング領域]で、[3D ビュー]の断面ボックスを修正して階段の一部を表示します。API を使用して階段のジオメトリ情報を取得し、Options.View プロパティに[3D ビュー]を設定すると、階段ジオメトリの一部のみが取得できます。次の図は、Revit アプリケーションにおける階段(左)と、API で描画した階段(右)を表しています。

図 113: 断面ボックスにより表示されるジオメトリが異なる

Revit で階段を描画し、次に左の図のように断面図を描画します。API を使用してこの階段の情報を取得し、Options.View プロパティにこの断面図ビューを設定すると、階段ジオメトリの一部のみが取得できます。API で描画した階段が右の図になります。

図 114: ジオメトリの断面図ビューを取得

DetailLevel

API では Geometry.Options.DetailLevels に 3 つの列挙を定義します。次に示すように、3 つの列挙は Revit アプリケーションの 3 つの詳細レベルに対応しています。

図 115: 3 つの詳細レベル

DetailLevel プロパティの設定が異なると、異なるジオメトリ情報が取得されます。たとえば、Revit アプリケーションで梁を描画して、次に、 API でその梁からジオメトリを取得して描画します。次の図は、描画の結果を表しています。

図 116: 梁の詳細ジオメトリ

BoundingBoxXYZ

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

特定の寸法で境界最大値/最小値をアクティブにするかどうかを定義します。

  • Enable プロパティが False の場合は、これら 2 つのプロパティも False を返します。

    [ビューをトリミング]がオンになっていると、 MaxEnabled プロパティと MinEnabled プロパティの両方が True を返します。

    [ビューをトリミング]がオフになっていると、 MaxEnabled プロパティと MinEnabled プロパティの両方が False を返します。

  • このプロパティは、ビューのトリミング ボックスの面を使用して要素のビューをクリップできるかどうかを示します。

  • BoundingBoxXYZ を View3D.GetSectionBox()メソッドから取得する場合は、[3D ビューのプロパティ]ダイアログ ボックスの[断面ボックス]プロパティが選択されているかどうかによって戻り値が異なります。選択されている場合、Enabled プロパティはすべて True を返します。

  • BoundingBoxXYZ を Element.BoundingBox プロパティから取得する場合は、Enabled プロパティはすべて True を返します。

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

BoundingBoxUV は、座標軸に平行な 2D 長方形を定義する値クラスです。Min と Max データ メンバーをサポートしています。これらはともに BoundingBoxUV の境界を定義します。BoundingBoxUV は、ペーパー空間ビューの境界ビューである View.Outline プロパティから取得します。

図 120: ビューのアウトライン

2 つの点が BoundingBoxUV を定義します。

  • Min 点 - 左下の端点です。

  • Max 点 - 右上の端点です。

図 121: BoundingBoxUV の Max と Min

注: BoundingBoxUV は、次の図で示すように、傾いた長方形は
表現できません。

図 122: 傾いた長方形