グラフィックスを表示する

ビューのグラフィックスの多くの要素と表示オプションが API を介して表示されます。

表示設定

ビュー クラスには、表示スタイル設定と詳細レベル設定を取得、設定するためのプロパティがあります。View.DisplayStyle プロパティは DisplayStyle 列挙値を使用し、下の図のように Revit ウィンドウの下部の表示オプションに対応します。
注: Revit API を使用して表示スタイルを Raytrace に設定すると、Revit の機能が制限されるため、これを行うことはできません。

View.DetailLevel プロパティは ViewDetailLevel 列挙値を使用し、下の図のように Revit ウィンドウの下部の詳細レベル オプションに対応します。

ViewDetailLevel 列挙値には、指定されたビューが詳細レベルを使用しない場合、Undefined が含まれます。

細線

Revit UI の[表示]タブの[グラフィックス]パネルにある[細線]オプションは、ビューに線分を描画する方法をコントロールします。通常は、小さなスケール ビューでモデルを拡大表示すると、要素線分は実際よりも太く表示されます。[細線]を有効にすると、ズーム レベルに関係なく、すべての線分が 1 つの幅で描画されます。このオプションは、AreThinLinesEnabled と呼ばれるプロパティを持つ ThinLinesOptions ユーティリティ クラスで使用できます。これは Revit セッション全体に影響を与える静的なプロパティです。

一時表示モード

TemporaryViewModes クラスでは、一時表示モードをコントロールすることができます。このクラスには View.TemporaryViewModes プロパティからアクセスできます。一時表示モードをサポートしないビューの場合は、このプロパティは null になります。RevealConstraints、RevealHiddenElements、WorksharingDisplay プロパティを使用すると、対応するビューにおける表示モードの現在の状態を取得したり、設定することができます。ビューやコンテキストによっては、限られたモードしか使用できない場合があります。また、使用できるモードは現在のコンテキストで有効であるとは限りません。TemporaryViewModes の IsModeAvailable() と IsModeEnabled() メソッドを使用すると、ある特定のモードが使用可能かつ有効であるかどうか、モードの使用前にテストすることができます。これらのメソッドは TemporaryViewMode 列挙値を使用します。使用可能なオプションは次のとおりです。

メンバー名

説明

RevealHiddenElements

非表示要素の一時表示モード

TemporaryHideIsolate

一時的な非表示/選択表示モード

WorksharingDisplay

ワークシェアリング表示モードのいずれか

TemporaryViewProperties

一時的なビュー プロパティ モード

Raytrace

インタラクティブ レイトレーシングでモデルを表示するモード

ExplodedView

モデルを展開ビューで表示し、ユーザによる変更と設定を許可するモード

RevealConstraints

モデル内の要素間の拘束を一時表示するモード

コード領域: ビュー内の非表示要素を一時表示

public bool RevealHiddenElementsInView(View view)
{
    bool hiddenRevealed = false;
    TemporaryViewModes viewModes = view.TemporaryViewModes;

    if (viewModes == null)
    {
        TaskDialog.Show("Invalid View", "This view does not support temporary view modes.");
    }
    else
    {
        // Mode must be available and enabled to be activated
        if (viewModes.IsModeEnabled(TemporaryViewMode.RevealHiddenElements) && viewModes.IsModeAvailable(TemporaryViewMode.RevealHiddenElements))
        {
            viewModes.RevealHiddenElements = true;
            hiddenRevealed = viewModes.RevealHiddenElements;
        }
    }

    return hiddenRevealed;
}

TemporaryViewModes.IsModeActive() メソッドを使用して、指定されたモードが現在ビューでアクティブであるかどうかを検証します。現在アクティブであるビューをすべてアクティブ解除するには、DeactivateAllModes() メソッドを使用します。また、特定のモードをアクティブ解除するには、DeactiveMode() を使用します。

PreviewFamilyVisibility プロパティは、関連付けられたビューの PreviewFamilyVisibility モードの現在の状態を取得および設定します。このモードは、ビューのドキュメントがファミリ エディタの環境内にある場合にのみ使用できます。このプロパティは、ブール値ではなく、PreviewFamilyVisibilityMode 列挙値です。このモードの状態は次のうちいずれかになります。

メンバー名

説明

Off

要素の表示設定は適用されません。すべてのファミリ要素が表示されます。

On

ビューの要素の表示設定が適用され、表示要素のみが表示されます。参照面によって切り取られた要素は、切り取られたジオメトリと一緒に表示されます。

Uncut

ビューの要素の表示設定が適用され、インスタンスが切り取られていない場合は要素を表示します。この状態を使用できるのは、平面図ビューや天井伏図ビューなどの一部のビューに限られます。

PreviewFamilyVisibility モードがビューで使用可能かつ有効であったとしても、すべてのビューですべての状態が有効にはなることはありません。上記の状態のいずれかをビューに適用する前に、その状態が適用できるかどうかを確かめるには、IsValidState() を呼び出してください。

コード領域: プレビュー ファミリ表示モードをオフにする

public void TurnOffFamilyVisibilityMode(View view)
{
    TemporaryViewModes viewModes = view.TemporaryViewModes;

    if (viewModes != null)
    {
        if (viewModes.IsModeAvailable(TemporaryViewMode.PreviewFamilyVisibility) && viewModes.IsModeEnabled(TemporaryViewMode.PreviewFamilyVisibility))
        {
            if (viewModes.IsValidState(PreviewFamilyVisibilityMode.Off))
            {
                viewModes.PreviewFamilyVisibility = PreviewFamilyVisibilityMode.Off;
            }
        }
    }
}

ビューを初めて開いたとき、ビューの PreviewFamilyVisibility モードの状態は、TemporaryViewModes の PreviewFamilyVisibilityDefaultOnState 静的プロパティと PreviewFamilyVisibilityDefaultUncutState 静的プロパティを通じてコントロールされる既定の設定に基づいて決定されます。

コード領域: 既定のプレビュー ファミリの表示状態を設定

public void SetDefaultPreviewFamilyVisibilityState()
{
    TemporaryViewModes.PreviewFamilyVisibilityDefaultOnState = true;
    TemporaryViewModes.PreviewFamilyVisibilityDefaultUncutState = true;
}

PreviewFamilyVisibilityDefaultOnState の値は、ビューを新しく開くたびにそれぞれのビューで PreviewFamilyVisibility モードを既定で On にするかどうかをコントロールします。このプロパティはすべてのタイプのビューに適用できます。切り取りの有無にかかわらずプレビューをサポートする平面図ビューなどのビューは、PreviewFamilyVisibilityDefaultUncutState プロパティで示された Cut または Uncut の状態を使用します。ただし、PreviewFamilyVisibilityDefaultOnState プロパティが true に設定されている場合に限ります。

こうした設定は、個々のファミリ ドキュメントではなくアプリケーション全体に適用することができます。値は Revit の次のセッションに引き継がれます。値はいつでも設定できますが、Revit アプリケーションの初期化後に加えた変更は、Revit の次のセッションまで反映されません。

PreviewFamilyVisibility プロパティが明示的に修正された場合、それぞれのビューに適用された設定は、そのビューを閉じてから後で開き直しても、有効のままで維持されます。

ビューにおける要素の表示

ビューは表示要素の追跡を続けます。ビューに表示されるすべてのグラフィックス要素は、ドキュメントとビューの ID で構成される FilteredElementCollector を使用して取得することができます。ただし、セット内の一部の要素は非表示になったり、他の要素によって覆われる場合があります。ビューを回転したり、覆っている要素を削除すると表示することができます。表示されているこれらの要素にアクセスするには、Revit でビューのジオメトリを再構築する必要があります。コードが指定されたビューにこのコンストラクタを初めて使用する場合や、コードがこのコンストラクタを表示設定が変更されたビューに使用する場合は、パフォーマンスが大幅に低下することがあります。

個々の要素を特定のビューで非表示にすることができます。Element.IsHidden() メソッドは、指定されたビューで要素が非表示になっているかどうかを示します。Element.CanBeHidden() は、要素を非表示にできるかどうかを返します。個々の要素を非表示にするには、View.HideElements() を使用します。このメソッドは、非表示にする要素に対応する ElementIds の集合を使用します。

要素の表示設定をカテゴリごとに変更することもできます。

ビューに基づいた FilteredElementCollector には、現在のビューで表示されている要素のみが含まれます。グラフィックスでない要素や非表示になっている要素は取得することができません。ドキュメントに基づいた FilteredElementCollector は、非表示の要素や非グラフィックスの要素を含む、ドキュメント内のすべての要素を取得します。たとえば、空のプロジェクトに既定の 3D ビューを作成する場合、ビューには要素がありませんが、ドキュメントには多数の要素(すべて非表示)が含まれる場合があります。

次のコード サンプルは、アクティブなドキュメントとアクティブなビューの壁カテゴリの要素の数をカウントします。ドキュメントには非グラフィックスの壁カテゴリ要素が含まれるため、アクティブなビュー内の要素の数とドキュメント内の要素の数は異なります。

コードの領域: アクティブ ビューの要素をカウント

private void CountElements(UIDocument uiDoc)
{
    StringBuilder message = new StringBuilder();
    FilteredElementCollector viewCollector = 
        new FilteredElementCollector(uiDoc.Document, uiDoc.ActiveView.Id);
    viewCollector.OfCategory(BuiltInCategory.OST_Walls);
    message.AppendLine("Wall category elements within active View: "
        + viewCollector.ToElementIds().Count);

    FilteredElementCollector docCollector = new FilteredElementCollector(uiDoc.Document);
    docCollector.OfCategory(BuiltInCategory.OST_Walls);
    message.AppendLine("Wall category elements within document: "
        + docCollector.ToElementIds().Count);

    TaskDialog.Show("Revit", message.ToString());
}

一時表示モードは要素の表示に影響を与えることがあります。View.IsInTemporaryViewMode()メソッドを使用すると、ビューが一時表示モードになっているかどうかを判断できます。メソッド View.IsElementVisibleInTemporaryViewMode()は、指定した表示モードで要素が表示されるかどうかを識別します。これは、TemporaryHideIsolate と AnalyticalModel 表示モードにのみ適用されます。その他のモードの場合は例外が発生します。

奥行きの表現

ViewDisplayDepthCueing クラスでは、断面図ビューと立面図ビューで遠くにあるオブジェクトの表示方法をコントロールすることができます。奥行きの表現がアクティブになっている場合、鑑賞者から見てより遠くにあるオブジェクトはより背景色に溶け込んでいきます。任意のビューで使用されている現在の奥行きの表現設定を取得するには、View.GetDepthCueing() を使用します。返された ViewDisplayDepthCueing に変更を加えた場合、View.SetDepthCueing() を呼び出すまでそれらの変更はビューに反映されません。

ViewDisplayDepthCueing クラスには、次のプロパティがあります。

メンバー名

説明

EnableDepthCueing

奥行きの表現を有効にするには true を指定します。

StartPercentage

奥行きの表現の開始位置を示します。0 の値は、奥行きの表現の開始位置がビューの前方クリップ面に一致することを示します。

EndPercentage

奥行きの表現の終了位置を示します。終了位置よりも遠くにあるオブジェクトには、終了位置にあるオブジェクトと同じ奥行き効果が与えられます。100 の値は前方クリップ面に相当します。

FadeTo

奥行きの表現によりオブジェクトに与える奥行き効果の上限を示します。100 の値は、完全に表示されなくなるまでフェード アウトすることを示します。

SetStartEndPercentages() メソッドを使用すると、開始パーセンテージと終了パーセンテージを一度に指定することができます。

次の例は現在の奥行き表現の設定を取得し、プロパティを変更してビューに反映する方法を示しています。すべてのビューで奥行きの表現を使用できるわけではないことに注意してください。

コード領域: ビューの奥行き表現を変更

private void AdjustDepthCueing(View view)
{
    if (view.CanUseDepthCueing())
    {
        using (Transaction t = new Transaction(view.Document, "Change depth cueing"))
        {
            t.Start();
            ViewDisplayDepthCueing depthCueing = view.GetDepthCueing();
            depthCueing.EnableDepthCueing = true;
            depthCueing.FadeTo = 50;    // set fade to percent
            depthCueing.SetStartEndPercentages(0, 75);
            view.SetDepthCueing(depthCueing);
            t.Commit();
        }
    }
}