概要 - ビュー

Revit API では、View プロパティにアクセスでき、プログラムによってビューを作成、削除することができます。

このセクションでは次の内容についての概要を説明します。

ビューの処理

次の図は、ビューの生成方法を示します。

図 94: ビューの作成処理

各ビューは 2D 投影面に 3D オブジェクトを投影することによって生成されます。投影は次の 2 つの基本的なクラスに分割されます。

  • パース
  • 平行

投影タイプを決定した後、どういう条件で3D モデルが必要とされ、シーンがレンダリングされるのか指定する必要があります。投影の詳細は、「View3D」セクションを参照してください。

ワールド座標には次のものが含まれます。

  • 見る人の目の位置
  • 投影が表示される、表示する面の位置。

Revit は次の 2 つの座標系を使用します。

  • 建物が存在するグローバル空間座標かモデル空間座標
  • 表示する座標系。

表示する座標系は、観察者のビューでモデルがどのように表示されるかを表します。 その基準点は見る人の目の位置になり、モデル空間内のその座標は View.Origin プロパティによって取得します。X、Y、Z 軸は、それぞれ View.RightDirection、View.UpDirection、View.ViewDirection プロパティによって表されます。

  • View.RightDirection は画面の右側に移動します。
  • View.UpDirection は画面の上側に移動します。
  • View.ViewDirection は画面から見る人の方に移動します。

表示する座標系は右利き用のものです。詳細は、「パース投影図」と平行投影図(「View3D」)を参照してください。

表示されない 3D モデル空間の一部(見る人の背後に隠れるものや遠すぎてはっきりと表示されないもの)は、投影面に投影される前に除外されます。この操作にはビューのトリミングが必要になります。トリミングには次の規則が適用されます。

  • トリミング領域の外側にある要素はビューでは使用されません。
  • View.GetCropRegionShapeManager メソッドは ViewCropRegionShapeManager を返します。これは、トリミング領域の境界情報(長方形またはそれ以外)を提供します。

  • View.CropBoxVisible プロパティはトリミング ボックスをビューに表示するかどうかを決定します。
  • View.CropBoxActive プロパティはトリミング ボックスが実際にビューのトリミングに使用されているかどうかを決定します。

トリミング後、モデルが投影面に投影されます。投影には次の規則が適用されます。

  • 投影のコンテンツは表示用に画面のビューポートにマッピングされます。
  • マッピング処理中は、画面に適切に表示されるように投影のコンテンツの縮尺が設定されます。
  • View.Scale プロパティは、実際のモデル サイズとビュー サイズの比率です。
  • 用紙上のビューの境界はトリミング領域となり、投影面上ではトリミング形状の投影となります。
  • トリミング領域のサイズと位置は View.OutLine プロパティによって決まります。

ビュー ナビゲーション ツール

現在 ViewCube 設定に設定されているホーム ビュー カメラに関する情報にアクセスできます。ドキュメントに設定されるホーム ビュー カメラは 1 つだけです。これは、ViewCube の右クリック コンテキスト メニューで「現在のビューをホーム ビューに設定」する ViewCube UI コマンドを呼び出したときに保存される、ビューの向きとその他のカメラ パラメータに対応しています。

静的メソッド ViewNavigationToolSettings.GetViewNavigationToolSettings()を呼び出して ViewNavigationToolSettings にアクセスします。このメソッドはドキュメントに関連付けられている ViewNavigationToolSettings 要素を返します。

ViewNavigationToolSettings では、ホーム ビューがメソッド IsHomeCameraSet()で設定されているかどうかを照会できます。このメソッドは、ホーム ビュー設定の現在の状態を示すブール値を返します。

ViewNavigationToolSettings.GetHomeCamera()メソッドでホーム カメラのコピーを取得することで、ViewCube に設定されているホーム カメラに関する読み取り専用の情報にアクセスします。ホーム カメラがまだ設定されていない場合、この関数は Null を返します。HomeCamera クラスは、EyePosition や UpDirection といったモデルに格納されている Home ビューの向きのカメラやビューに関する情報を提供します。

ビューを作成、削除する

Revit プラットフォーム API には、Autodesk.Revit.DB.View クラスから派生した対応するビュー要素を作成するための、メソッドが数多く用意されています。ほとんどのビュー タイプは、派生した表示クラスの静的メソッドを使用して作成されます。ビューが正常に作成されている場合、これらのメソッドはビューに参照を返し、正常に作成されていない場合は null を返します。メソッドについては後述の各ビュー クラスのセクションで説明します。

ビューは View.Duplicate()メソッドを使用して作成することもできます。従属させるか、詳細を持たせるかといった新しいビュー用のオプションを使用して、既存のビューから新しいビューを作成できます。次の例では、新しい従属ビューを作成する方法を紹介します。

コード領域: 従属ビューを作成

public View CreateDependentCopy(View view)
{
    View dependentView = null;
    ElementId newViewId = ElementId.InvalidElementId;
    if (view.CanViewBeDuplicated(ViewDuplicateOption.AsDependent))
    {
        newViewId = view.Duplicate(ViewDuplicateOption.AsDependent);
        dependentView = view.Document.GetElement(newViewId) as View;
        if (null != dependentView)
        {
            if (dependentView.GetPrimaryViewId() == view.Id)
            {
                TaskDialog.Show("Dependent View", "Dependent view created successfully!");
            }
        }
    }

    return dependentView;
}

Document.Delete() メソッドとビュー ID を使用してビューを削除します。また、ビューに関連付けられている要素を削除することもできます。たとえば、レベル要素を削除すると対応する平面図ビューが削除され、カメラ要素を削除すると対応する 3D ビューが削除されます。

従属ビュー

前述のとおり、View.Duplicate() メソッドを使用して、ViewDuplicationOption 列挙子の AsDependent 値に渡すことで従属ビューを作成することができます。従属ビューはメイン ビューおよび他のすべての従属ビューとの同期性を維持しているため、ビュー固有の変更(ビューのスケールや注釈)をあるビューで行うと、この変更がすべてのビューに反映されます。ビューのなかには複製できないタイプがあります。また、従属ビューを他の従属ビューから作成することはできません。特定のビューから従属ビューを作成できるかどうかを確認するには、View.CanViewBeDuplicated() メソッドを使用します。このメソッドは、ViewDuplicationOption 列挙値を使用して、指定した方法でビューを複製できるかどうかを検証します。ビューを個別ビューとして複製することができるにもかかわらず、従属ビューとして複製することはできない場合があります。

従属ビューには、有効なメイン ビュー要素 ID が用意されています。この ID は View.GetPrimaryViewId() メソッドを使用して取得することができます。個別ビューには、メイン ビュー ID を示す InvalidElementId があります。従属ビューを個別ビューに変換するには、View.ConvertToIndependent() メソッドを使用することができます。このメソッドでは、ビューが従属ビューではない場合に例外が発生します。

コード領域: 従属ビューを個別ビューに変換

public void MakeViewIndependent(View view)
{
    // Independent views will have an InvalidElementId for the Primary View Id
    if (view.GetPrimaryViewId() != ElementId.InvalidElementId)
    {
        view.ConvertToIndependent();
    }
}