ビュー フィルタ

ビュー フィルタ

フィルタは、ビューに依存しない要素です。これらは、ParameterFilterElement クラスか SelectionFilterElement クラスを使用してビューに適用できます。

ParameterFilterElement

ParameterFilterElement は、カテゴリと一連のフィルタ規則に基づいて要素をフィルタします。1 つ以上のカテゴリをフィルタの許容値として指定することができます。

フィルタが定義されると(1 つ以上のカテゴリと 1 つ以上のフィルタ規則を使用)、いくつかのメソッドのいずれかを使用して、フィルタをビューに適用することができます。View.AddFilter()メソッドは、フィルタをビューに適用しますが、既定の優先を使用する場合は、ビューの表示は変更しないことになります。View.SetFilterOverrides()はフィルタに関連付けられているグラフィックスの優先を設定します。また View.SetFilterVisibility()はフィルタを通過する要素をビューに表示するかどうかを設定します。AddFilter()および SetFilterVisibility()は、まだフィルタが適用されていない場合は両方がビューにフィルタを適用し、個別に AddFilter()を呼び出す必要がないようにします。

次の例では、複数の基準に一致する新しいビュー フィルタを作成し、ビュー内の要素を非表示にします。

コード領域: パラメータ フィルタをビューに適用

public static void CreateViewFilter(Document doc, View view)
{
    List<ElementId> categories = new List<ElementId>();
    categories.Add(new ElementId(BuiltInCategory.OST_Walls));
    List<FilterRule> filterRules = new List<FilterRule>();

    using (Transaction t = new Transaction(doc, "Add view filter"))
    {
        t.Start();

        // Create filter element associated to the input categories
        ParameterFilterElement parameterFilterElement = ParameterFilterElement.Create(doc, "Example view filter", categories);

        // Criterion 1 - wall type Function is "Exterior"
        ElementId exteriorParamId = new ElementId(BuiltInParameter.FUNCTION_PARAM);
        filterRules.Add(ParameterFilterRuleFactory.CreateEqualsRule(exteriorParamId, (int)WallFunction.Exterior));

        // Criterion 2 - wall height > some number
        ElementId lengthId = new ElementId(BuiltInParameter.CURVE_ELEM_LENGTH);
        filterRules.Add(ParameterFilterRuleFactory.CreateGreaterOrEqualRule(lengthId, 28.0, 0.0001));

        // Criterion 3 - custom shared parameter value matches string pattern
        // Get the id for the shared parameter - the ElementId is not hardcoded, so we need to get an instance of this type to find it
        Guid spGuid = new Guid("96b00b61-7f5a-4f36-a828-5cd07890a02a");
        FilteredElementCollector collector = new FilteredElementCollector(doc);
        collector.OfClass(typeof(Wall));
        Wall wall = collector.FirstElement() as Wall;

        if (wall != null)
        {
            Parameter sharedParam = wall.get_Parameter(spGuid);
            ElementId sharedParamId = sharedParam.Id;

            filterRules.Add(ParameterFilterRuleFactory.CreateBeginsWithRule(sharedParamId, "15.", true));
        }

        parameterFilterElement.SetRules(filterRules);

        // Apply filter to view
        view.AddFilter(parameterFilterElement.Id);
        view.SetFilterVisibility(parameterFilterElement.Id, false);
        t.Commit();
    }
}

SelectionFilterElement

SelectionFilterElement は特殊なビュー フィルタであり、規則ではなく、関係がないと思われる要素のグループを基準とします。必要に応じて特定の要素をフィルタに追加でき、結果としてできた選択は ParameterFilterElement のように変更することができます。

次の例では、新しい選択フィルタを作成し、変更を適用します。

コード領域: 選択フィルタをビューに適用

public static void CreateSelectionFilter(Document doc, View view)
{
    // find room tags in this view
    FilteredElementCollector collector = new FilteredElementCollector(doc, view.Id);
    collector.WherePasses(new RoomTagFilter());

    // collect tags whose room number matches criteria
    List<ElementId> tagIds = new List<ElementId>();

    foreach (RoomTag tag in collector.Cast<RoomTag>())
    {
        int number = Int32.Parse(tag.Room.Number);
        if (number % 3 == 0)
        {
            tagIds.Add(tag.Id);
        }
    }

    using (Transaction t = new Transaction(doc, "Create SelectionFilterElement"))
    {
        t.Start();

        // Create selection filter and assign ids
        SelectionFilterElement filterElement = SelectionFilterElement.Create(doc, "Room tags filter");
        filterElement.SetElementIds(tagIds);

        ElementId filterId = filterElement.Id;

        // Add the filter to the view
        view.AddFilter(filterId);

        doc.Regenerate();

        // Use the existing graphics settings, and change the color to Blue
        OverrideGraphicSettings overrideSettings = view.GetFilterOverrides(filterId);

        overrideSettings.SetProjectionLineColor(new Color(0x00, 0x00, 0xFF));

        view.SetFilterOverrides(filterId, overrideSettings);

        t.Commit();
    }
}

フィルタを修正する

ビューに適用されたすべてのフィルタは、フィルタ ID のリストを返す View.GetFilters()メソッドを使用して取得できます。View.GetFilterVisibility()および View.GetFilterOverrides()をそれぞれ使用して、特定のフィルタに対するフィルタ表示およびグラフィックスの優先をチェックできます。View.RemoveFilter はビューからフィルタを削除します。

次の例は、ビューのフィルタを取得し、現在切り取りの色を赤に設定しているすべてのフィルタに関連付けられている優先を修正する方法を示しています。

コード領域 : 既存のフィルタを修正

public static void ModifyExistingFilter(Document doc, View view)
{
    // Find any filter with overrides setting cut color to Red
    Dictionary<ElementId, OverrideGraphicSettings> filterIdsToChange = new Dictionary<ElementId, OverrideGraphicSettings>();

    foreach (ElementId filterId in view.GetFilters())
    {
        OverrideGraphicSettings overrideSettings = view.GetFilterOverrides(filterId);

        Color lineColor = overrideSettings.CutLineColor;

        if (lineColor == Color.InvalidColorValue)
            continue;

        // Save overrides setting the cut color to green
        if (lineColor.Red == 0xFF && lineColor.Green == 0x00 && lineColor.Blue == 0x00)
        {
            overrideSettings.SetCutLineColor(new Color(0x00, 0xFF, 0x00));
            filterIdsToChange[filterId] = overrideSettings;
        }
    }

    // Make the change to all found filters
    using (Transaction t = new Transaction(doc, "Change override filters"))
    {
        t.Start();

        foreach (ElementId filterId in filterIdsToChange.Keys)
        {
            view.SetFilterOverrides(filterId, filterIdsToChange[filterId]);
        }
        t.Commit();
    }
}