ViewSchedule を使用して作業する

ViewSchedule を使用して作業する

ScheduleDefinition クラスには、次のような集計表ビューの内容を定義するさまざまな設定が含まれています。

多くの集計表には、ViewSchedule.Definition プロパティから取得される単一の ScheduleDefinition が含まれます。Revit MEP では、特定のカテゴリの集計表は、各部屋の要素を表示する部屋集計表、または各システムに関連付けられている要素を表示するダクト システム集計表などの、主要な集計表の要素に関連付けられた要素を含む「埋め込み集計表」を含むことができます。埋め込み組み込み集計表には独自のカテゴリ、フィールド、フィルタなどがあります。これらの設定は、2 つ目の ScheduleDefinition オブジェクトに格納されます。存在する場合は、埋め込まれた ScheduleDefinition が ScheduleDefinition.EmbeddedDefinition プロパティから取得されます。

フィールドを追加する

ViewSchedule が作成されると、フィールドを追加することができます。ScheduleDefinition.GetSchedulableFields()メソッドは、集計表に含めることのできる未計算フィールドを表す SchedulableField オブジェクトのリストを返します。SchedulableField オブジェクトから、または ScheduleFieldType を使用して新しいフィールドを追加できます。次の表は、ScheduleFieldType 列挙から使用可能なオプションについて説明しています。

メンバー名 説明
Instance 集計された要素のインスタンス パラメータです。インスタンスまたはタイプ パラメータであるかどうかに関わらず、すべての共有パラメータもこのタイプを使用します。
ElementType 集計された要素のタイプ パラメータです。
Count 集計表の列に表示される要素の数です。
ViewBased

表示される値がビューの設定に基づいて変更できる、いくつかのパラメータに使用される特別なタイプのフィールドです。

  • 部屋とスペースの集計表の ROOM_AREA および ROOM_PERIMETER です。
  • 改訂表の PROJECT_REVISION_REVISION_NUM です。
  • シート単位で番号が付けられているキーノート凡例の KEYNOTE_NUMBER です。
Formula 集計表のその他のフィールドの値から計算した式です。
Percentage 他のフィールドの合計に対する各要素の割合をパーセントで示した値です。
Room 集計された要素が属する部屋のパラメータです。
FromRoom ドアまたは窓の「外」側の部屋のパラメータです。
ToRoom ドアまたは窓の「内」側の部屋のパラメータです。
ProjectInfo 集計された要素が属するプロジェクト内の Project Info 要素のパラメータで、リンクされたファイルである場合があります。リンクされたファイルからの要素を含む集計表でのみ使用できます。
Material マテリアル拾い出しでは、集計された要素のいずれかのマテリアルのパラメータです。
MaterialQuantity マテリアル拾い出しでは、集計された要素内で特定のマテリアルがどう使用されたかを表す値です。パラメータの ID は、MATERIAL_AREA、MATERIAL_VOLUME、または MATERIAL_ASPAINT です。
RevitLinkInstance リンクされたファイルの要素に属する RevitLinkInstance のパラメータです。現在サポートされているパラメータは、RVT_LINK_INSTANCE_NAME のみです。リンクされたファイルからの要素を含む集計表でのみ使用できます。
RevitLinkType リンクされたファイルの要素に属する RevitLinkType のパラメータです。現在サポートされているパラメータは、RVT_LINK_FILE_NAME_WITHOUT_EXT のみです。リンクされたファイルからの要素を含む集計表でのみ使用できます。
StructuralMaterial 集計された要素の構造マテリアルのパラメータです。
スペース 集計された要素が属するスペースのパラメータです。

ScheduleDefinition.AddField()メソッドのいずれかを使用して、フィールド リストの最後にフィールドを追加します。フィールド リストの特定の場所に新しいフィールドを配置するには、ScheduleDefinition.InsertField()メソッドのいずれかを使用します。フィールドは、ScheduleDefinition.SetFieldOrder()を使用して、後で順序を変更することもできます。

次は、フィールドがまだビューの集計表にない場合にフィールドをビューに追加する方法を簡単に示した例です。

コード領域: フィールドを集計表に追加

/// <summary>
/// Add fields to view schedule.
/// </summary>
/// <param name="schedules">List of view schedule.</param>
public void AddFieldToSchedule(List<ViewSchedule> schedules)
{
    IList<SchedulableField> schedulableFields = null;

    foreach (ViewSchedule vs in schedules)
    {
        //Get all schedulable fields from view schedule definition.
        schedulableFields = vs.Definition.GetSchedulableFields();

        foreach (SchedulableField sf in schedulableFields)
        {
            bool fieldAlreadyAdded = false;
            //Get all schedule field ids
            IList<ScheduleFieldId> ids = vs.Definition.GetFieldOrder();
            foreach (ScheduleFieldId id in ids)
            {
                //If the GetSchedulableField() method of gotten schedule field returns same schedulable field,
                // it means the field is already added to the view schedule.
                if (vs.Definition.GetField(id).GetSchedulableField() == sf)
                {
                    fieldAlreadyAdded = true;
                    break;
                }
            }

            //If schedulable field doesn't exist in view schedule, add it.
            if (fieldAlreadyAdded == false)
            {
                vs.Definition.AddField(sf);
            }
        }
    }
}

ScheduleField クラスは、フィールドの ScheduleDefinition のリスト内の 1 つのフィールドを表します。各(表示)フィールドは、集計表の列になります。

最も一般的には、フィールドは、集計表に表示される要素のインスタンスまたはタイプ パラメータを表します。一部のフィールドは、集計された要素が属する部屋などの他の関連要素のパラメータを表します。フィールドは、集計表の他のフィールド、特に Formula および Percentage フィールドから計算されたデータを表すこともできます。

ScheduleField クラスには、列見出しのテキストと向きの両方をコントロールするプロパティがあります。列の幅および列の水平方向の位置合わせを定義することもできます。

ScheduleField.IsHidden プロパティを使用して、フィールドを非表示にできます。非表示フィールドは集計表に表示されませんが、フィルタリング、並べ替え、グループ化、条件付き書式に使用でき、Formula および Percentage フィールドによって参照されます。

一部の ScheduleFields は合計でき、HasTotals プロパティが true に設定された場合は、フッタ行が有効化されていて合計が表示される場合は、合計が表示されます。これは、集計表の末尾の総計行、または集計表のグループ化されたフィールドのいずれかのフッタ行のどちらかです。項目化されていない集計表では、同一行に複数の要素が表示される場合、合計も通常行に表示されます。

フィールドのスタイルと書式

ScheduleField.GetStyle()および ScheduleField.SetStyle()は、TableCellStyle クラスを使用して集計表のフィールドのスタイルの作業をします。SetStyle()を使用して、セルの境界線の線種や文字フォント、色、サイズなどのフィールドの各種属性を設定できます。

ScheduleField.SetFormatOptions()および ScheduleField.GetFormatOptions()は、FormatOptions クラスを使用してフィールドのデータの書式の作業をします。FormatOptions クラスには、単位を文字列として使用して数字を書式設定する方法をコントロールする設定が含まれています。これには、通常[形式]ダイアログで、エンドユーザによって選択され、ドキュメントに保存される設定が含まれています。

次の例では、ViewSchedule のすべての長さフィールドが、フィートと分数表記インチで表示するように書式設定されています。

コード領域: フィールドを書式設定

// format length units to display in feet and inches format
public void FormatLengthFields(ViewSchedule schedule)
{
    int nFields = schedule.Definition.GetFieldCount();
    for (int n = 0; n < nFields; n++)
    {
        ScheduleField field = schedule.Definition.GetField(n);
        if (field.UnitType == UnitType.UT_Length)
        {
            FormatOptions formatOpts = new FormatOptions();
            formatOpts.UseDefault = false;
            formatOpts.DisplayUnits = DisplayUnitType.DUT_FEET_FRACTIONAL_INCHES;
            field.SetFormatOptions(formatOpts);
        }
    }
}

下の例は、書式設定とスタイルの優先の両方を特定のフィールドに適用します。

コード領域: 書式設定とスタイルの優先をフィールドに適用

public static void ApplyFormattingToField(ViewSchedule schedule, int fieldIndex)
{
    // Get the field.
    ScheduleDefinition definition = schedule.Definition;
    ScheduleField field = definition.GetField(fieldIndex);

    // Build unit formatting for the field.
    FormatOptions options = field.GetFormatOptions();
    options.UseDefault = false;
    options.DisplayUnits = DisplayUnitType.DUT_SQUARE_INCHES;
    options.UnitSymbol = UnitSymbolType.UST_IN_SUP_2;

    // Build style overrides for the field
    // Use override options to indicate fields that are overridden and apply changes
    TableCellStyle style = field.GetStyle();
    TableCellStyleOverrideOptions overrideOptions = style.GetCellStyleOverrideOptions();
    overrideOptions.BackgroundColor = true;
    style.BackgroundColor = new Color(0x00, 0x00, 0xFF);
    overrideOptions.FontColor = true;
    style.TextColor = new Color(0xFF, 0xFF, 0xFF);
    overrideOptions.Italics = true;
    style.IsFontItalic = true;

    style.SetCellStyleOverrideOptions(overrideOptions);

    double width = field.GridColumnWidth;

    using (Transaction t = new Transaction(schedule.Document, "Set style etc"))
    {
        t.Start();
        field.SetStyle(style);
        field.SetFormatOptions(options);
        // Change column width (affects width in grid and on sheet) - units are in Revit length units - ft.
        field.GridColumnWidth = width + 0.5;
        t.Commit();
    }
}

集計表でグループ化と並べ替えを実行する

1 つ以上の集計表のフィールドを使用して、集計表を並べ替え、またはグループ化することができます。いくつかのメソッドを使用して、フィールドのグループ化や並べ替えをコントロールできます。ScheduleSortGroupField クラスは、集計表を並べ替え、またはグループ化したいずれかのフィールドを表します。並べ替えとグループ化は関連した操作です。どちらの場合も、集計表に表示される要素は、集計表を並べ替え、またはグループ化するフィールドの値に基づいて並べ替えられます。これによりグループ化される要素と同じ値を持つ要素が自動的に作成されます。追加の見出し、フッタ、空白行を有効化することで、各グループを視覚的に区別することができます。

ScheduleDefinition.IsItemized プロパティが false の場合、並べ替えやグループ化に使用したすべてのフィールドに同じ値を持つ要素は同一行に結合されます。それ以外の場合は、集計表は各要素を別の行に表示します。

集計表は、ScheduleField.IsHidden プロパティを使用して並べ替えやグループ化に使用したフィールドを非表示にすることで、集計表に表示されないデータで並べ替え、またはグループ化することができます。

コード領域: 集計表にグループ化/並べ替えを追加

public static void AddGroupingToSchedule(ViewSchedule schedule, BuiltInParameter paramEnum, bool withTotalsAndDecoration, ScheduleSortOrder order)
{
    // Find field 
    ScheduleField field = FindField(schedule, paramEnum);

    if (field == null)
        throw new Exception("Unable to find field.");

    // Build sort/group field.
    ScheduleSortGroupField sortGroupField = new ScheduleSortGroupField(field.FieldId, order);
    if (withTotalsAndDecoration)
    {
        sortGroupField.ShowFooter = true;
        sortGroupField.ShowFooterTitle = true;
        sortGroupField.ShowFooterCount = true;
        sortGroupField.ShowHeader = true;
        sortGroupField.ShowBlankLine = true;
    }

    // Add the sort/group field
    ScheduleDefinition definition = schedule.Definition;

    using (Transaction t = new Transaction(schedule.Document, "Add sort/group field"))
    {
        t.Start();
        definition.AddSortGroupField(sortGroupField);
        t.Commit();
    }
}

public static ScheduleField FindField(ViewSchedule schedule, BuiltInParameter paramEnum)
{
    ScheduleDefinition definition = schedule.Definition;
    ScheduleField foundField = null;
    ElementId paramId = new ElementId(paramEnum);

    foreach (ScheduleFieldId fieldId in definition.GetFieldOrder())
    {
        foundField = definition.GetField(fieldId);
        if (foundField.ParameterId == paramId)
        {
            return foundField;
        }
    }

    return null;
}

見出しもグループ化することができます。ViewSchedule.GroupHeaders()メソッドを使用して、見出しセクションのグループに含める行と列を指定できます。最後のパラメータは、グループ化された行と列のキャプションの文字列です。

次の例では、単一カテゴリの集計表の列をグループ化します。

コード領域: 見出しをグループ化

public static void CreateSingleCategoryScheduleWithGroupedColumnHeaders(Document doc)
{
    using (Transaction t = new Transaction(doc, "Create single-category with grouped column headers"))
    {
        // Build the schedule
        t.Start();
        ViewSchedule vs = ViewSchedule.CreateSchedule(doc, new ElementId(BuiltInCategory.OST_Windows));

        AddRegularFieldToSchedule(vs, new ElementId(BuiltInParameter.WINDOW_HEIGHT));
        AddRegularFieldToSchedule(vs, new ElementId(BuiltInParameter.WINDOW_WIDTH));
        AddRegularFieldToSchedule(vs, new ElementId(BuiltInParameter.ALL_MODEL_MARK));
        AddRegularFieldToSchedule(vs, new ElementId(BuiltInParameter.ALL_MODEL_COST));

        doc.Regenerate();

        // Group the headers in the body section using ViewSchedule methods
        vs.GroupHeaders(0, 0, 0, 1, "Size");
        vs.GroupHeaders(0, 2, 0, 3, "Other");
        vs.GroupHeaders(0, 0, 0, 3, "All");

        t.Commit();
    }
}

public static void AddRegularFieldToSchedule(ViewSchedule schedule, ElementId paramId)
{
    ScheduleDefinition definition = schedule.Definition;

    // Find a matching SchedulableField
    SchedulableField schedulableField =
        definition.GetSchedulableFields().FirstOrDefault<SchedulableField>(sf => sf.ParameterId == paramId);

    if (schedulableField != null)
    {
        // Add the found field
        definition.AddField(schedulableField);
    }
}

フィルタリング

ScheduleFilter を使用して、集計表に表示される要素をフィルタできます。フィルタは、要素を集計表に表示させるために満たす必要のある条件です。要素を集計表に表示させるには、すべてのフィルタを満たす必要があります。

集計表は、ScheduleField.IsHidden プロパティを使用してフィルタリングに使用したフィールドを非表示にすることで、集計表に表示されないデータでフィルタすることができます。

コード領域: 集計表にフィルタを追加

public static void AddFilterToSchedule(ViewSchedule schedule, ElementId levelId)
{
    // Find level field
    ScheduleDefinition definition = schedule.Definition;

    ScheduleField levelField = FindField(schedule, BuiltInParameter.ROOM_LEVEL_ID);

    // Add filter
    using (Transaction t = new Transaction(schedule.Document, "Add filter"))
    {
        t.Start();

        // If field not present, add it
        if (levelField == null)
        {
            levelField = definition.AddField(ScheduleFieldType.Instance, new ElementId(BuiltInParameter.ROOM_LEVEL_ID));
        }

        // Set field to hidden
        levelField.IsHidden = true;
        ScheduleFilter filter = new ScheduleFilter(levelField.FieldId, ScheduleFilterType.Equal, levelId);
        definition.AddFilter(filter);

        t.Commit();
    }
}

/// <summary>
/// Finds an existing ScheduleField matching the given parameter
/// </summary>
/// <param name="schedule"></param>
/// <param name="paramEnum"></param>
/// <returns></returns>
public static ScheduleField FindField(ViewSchedule schedule, BuiltInParameter paramEnum)
{
    ScheduleDefinition definition = schedule.Definition;
    ScheduleField foundField = null;
    ElementId paramId = new ElementId(paramEnum);

    foreach (ScheduleFieldId fieldId in definition.GetFieldOrder())
    {
        foundField = definition.GetField(fieldId);
        if (foundField.ParameterId == paramId)
        {
            return foundField;
        }
    }

    return null;
}

集計表データを使用して作業する

次の例は、集計表の要素のリストを決定する方法を示しています。

コード領域: 集計表のコンテンツを取得

public static void GetScheduleContents(ViewSchedule viewSchedule)
{
    // Collect types displayed in the schedule
    FilteredElementCollector typeCollector = new FilteredElementCollector(viewSchedule.Document, viewSchedule.Id);
    typeCollector.WhereElementIsElementType();

    int numberOfTypes = typeCollector.Count();

    // Collect instances displayed in the schedule
    FilteredElementCollector instCollector = new FilteredElementCollector(viewSchedule.Document, viewSchedule.Id);
    instCollector.WhereElementIsNotElementType();

    int numberOfInstances = instCollector.Count();

    TaskDialog.Show("Elements in schedule", String.Format("Types {0} instances {1}", numberOfTypes, numberOfInstances));
}

集計表の実際のデータで作業するために、ViewSchedule.GetTableData()は、表の行、列、セルのスタイルとコンテンツを記述するデータのほとんどを保持する TableData オブジェクトを返します。詳細については、「TableView と TableData」を参照してください。