鉄筋カプラー

鉄筋カプラーは、隣接する鉄筋の接合に使用されます。

カプラーを作成する

カプラーを使用すると、2 つの隣接する鉄筋を接合したり、単独の鉄筋の末端に取り付けることができます。カプラーは RebarCoupler クラスによって表されます。静的な Create () メソッドは、新しいカプラーの作成に使用できます。

次の例では、カプラーを作成して、隣接する 2 本のそれぞれ独立した鉄筋を接合しています。Create() メソッドは、カプラー タイプの ElementId と、接合する 2 本の鉄筋の RebarReinforcementData を必要とします。

コード領域: 鉄筋カプラーを作成

private RebarCoupler CreateCoupler(Document doc, List<Rebar> bars)
{
    RebarCoupler coupler = null;
    // if we have at least 2 bars, create a coupler between them
    if (bars.Count > 1)
    {
        // get a type id for the Coupler
        ElementId defaultTypeId = doc.GetDefaultFamilyTypeId(new ElementId(BuiltInCategory.OST_Coupler));

        if (defaultTypeId != ElementId.InvalidElementId)
        {
            // Specify the rebar and ends to couple
            RebarReinforcementData rebarData1 = RebarReinforcementData.Create(bars[0].Id, 0);
            RebarReinforcementData rebarData2 = RebarReinforcementData.Create(bars[1].Id, 1);

            RebarCouplerError error;
            coupler = RebarCoupler.Create(doc, defaultTypeId, rebarData1, rebarData2, out error);
            if (error != RebarCouplerError.ValidationSuccessfuly)
            {
                TaskDialog.Show("Revit", "Create Coupler failed: " + error.ToString());
            }

            // Use a coupler to cap the other end of the first bar
            RebarReinforcementData rebarData = RebarReinforcementData.Create(bars[0].Id, 1);
            RebarCoupler.Create(doc, defaultTypeId, rebarData, null, out error);
            if (error != RebarCouplerError.ValidationSuccessfuly)
            {
                TaskDialog.Show("Revit", "Create Coupler failed: " + error.ToString());
            }
        }
    }

    return coupler;
}

カプラーが作成できない場合は、RebarCouplerError 列挙値が返されます。作成に失敗する原因としては、鉄筋が接触していない、鉄筋セット同士のレイアウトが異なっている、鉄筋の直径がカプラーに適合していないなどの可能性があります。

CouplerLinkTwoBars() メソッドは、カプラーが 2 本の鉄筋を接合している場合は true を返し、1 本の鉄筋だけに取り付けられている場合は false を返します。

Rebar クラスに用意されている GetCouplerId() メソッドを使用すると、鉄筋のいずれかの末端にアタッチされたカプラーの ID を取得することができます。

カプラーの位置

1 つの位置ポイントまたは(鉄筋セットの場合は)複数の位置ポイントを取得するには、GetPointsForPlacement() メソッドを呼び出します。このメソッドは、1 つまたは複数のカプラーが配置される場所を示す XYZ 点のリストを返します。GetCouplerPositionTransform() メソッドは、セット内の指定されたインデックスでカプラーの相対位置を表す変換を返します。インデックスは、0 とカプラーの数量 - 1 の間である必要があります。GetCouplerQuantity() は、セット内のカプラーの数量を返します。

番号付け

RebarCoupler は、Revit API によって番号付けを制御することができる要素カテゴリの 1 つです。NumberingSchema クラスと NumberingSchemaType クラスは、カプラー要素に番号やタグを付ける目的でカプラー要素の整理方法を設定するために使用できます。各 NumberingSchema は、特定のタイプの要素の番号付けをコントロールします。また、NumberingSchema のインスタンスも要素であり、各 Revit ドキュメント内に常時いずれかのタイプのうち 1 つのみが存在します。すべての組み込みの番号付けスキーマのうちで、使用可能なタイプが NumberingSchemaTypes クラスに列挙されます。

特定のスキーマ(NumberingSchemaTypes.StructuralNumberingSchemas.Rebar など)に属している要素(RebarCoupler など)が、順番に整理され、番号付けされます。順番は、同じ番号付けパーティションを共有する要素の集合です。パーティションは、それぞれの Partition パラメータ(NUMBER_PARTITION_PARAM)の値によって設定されます。番号付けの順番には少なくとも 1 つの要素が含まれている必要があります。すなわち、(同じ番号付けスキーマの)他の要素と異なるパーティション パラメータの値を持つ要素がある場合に、順番が作られることになります。最後の要素が除外されると(削除された、または別の順番に移動された)、空になった順番は存在しなくなります。

端部処理

鉄筋の端部処理は、鉄筋にアタッチされたカプラーに由来します。カプラーの両端の処理タイプは、カプラー ファミリ タイプによって指定されます。

オーバーロードした EndTreatmentType.Create() メソッドは、新しい EndTreatmentType を作成するのに使用できます。この場合、端部処理名の文字列を指定することも、指定しないこともできます。CreateDefaultEndTreatmentType() メソッドは、既定の名前を持つ新しい EndTreatmentType を作成します。

RebarCoupler の端部処理タイプにアクセスするには、鉄筋カプラー タイプを表す FamilySymbol のために、BuiltInParameter の COUPLER_MAIN_ENDTREATMENT を使用して End Treatment 1 を設定し、COUPLER_COUPLED_ENDTREATMENT を使用して End Treatment 2 を設定します。下記の例では、新しい EndTreatmentType を作成し、それをカプラー タイプの End Treatment 1 に割り当てます。既存の EndTreatmentType も使用することができます。

コード領域: RebarCoupler の EndTreatmentType を変更

private void NewEndTreatmentForCouplerType(Document doc, ElementId couplerTypeId)
{
    EndTreatmentType treatmentType = EndTreatmentType.Create(doc, "Custom");
    FamilySymbol couplerType = doc.GetElement(couplerTypeId) as FamilySymbol;
    Parameter param = couplerType.get_Parameter(BuiltInParameter.COUPLER_MAIN_ENDTREATMENT);
    param.Set(treatmentType.Id);
}

指定の処理を両端に施した形状を定義するには、端部処理を RebarShape で定義するとよいでしょう。RebarShape の端部処理は、形状の認識に使用されます。ReinforcementSettings.RebarShapeDefinesEndTreatments プロパティが true に設定されている場合は、ユーザが仕様にしたがって形状を定義し、カプラーを鉄筋に取り付けると、適切な RebarShape が自動的に検索されます。なお、このプロパティを設定できるのは、鉄筋または配筋がドキュメントに追加される前に限られます。

コード領域: RebarShape の EndTreatmentType を設定

private bool SetEndTreatmentType(Document doc, RebarShape rebarShape)
{
    bool set = false;
    // check if end treatments are defined by rebar shape
    ReinforcementSettings settings = ReinforcementSettings.GetReinforcementSettings(doc);
    if (!settings.RebarShapeDefinesEndTreatments)
    {
        try
        {
            // can only be changed if document contains no rebars, area reinforcement or path reinforcement
            settings.RebarShapeDefinesEndTreatments = true;
        }
        catch (Exception e)
        {
            // cannot change the settings value
            TaskDialog.Show("Revit", e.Message);
        }
    }
    if (settings.RebarShapeDefinesEndTreatments)
    {
        EndTreatmentType treatmentType = EndTreatmentType.Create(doc, "Flame Cut");
        rebarShape.SetEndTreatmentTypeId(treatmentType.Id, 0);

        ElementId treatmentTypeId = EndTreatmentType.CreateDefaultEndTreatmentType(doc);
        rebarShape.SetEndTreatmentTypeId(treatmentTypeId, 1);

        set = true;
    }

    return set;
}

RebarShape クラスには、鉄筋に端部処理を施すかどうかを決定するメソッドや、RebarShape の両端の EndTreatmentType を取得、設定するメソッドが複数用意されています。

なお、次のメソッドは、RebarShape に端部処理を適用しないことを要求します。

  • RebarContainer.AppendItemFromRebar()
  • RebarContainer.AppendItemFromRebarShape()
  • RebarContainer.AppendItemFromCurvesAndShape()
  • RebarContainerItem.SetFromRebar()
  • RebarContainerItem.SetFromRebarShape()
  • RebarContainerItem.SetFromCurvesAndShape()
  • RebarContainerItem.RebarShapeId

また、鉄筋の両端に適用される処理の ID を取得するメソッドとしての Rebar クラスも上記に含まれます。端部処理はアタッチされたカプラーに基づきます。したがって、Rebar には、カプラーにアタッチされていない端部の EndTreatmentTypeId は存在しません。

コード領域: Rebar の端部処理を取得

private void ListEndTreatments(Document doc, List<Rebar> bars)
{
    StringBuilder info = new StringBuilder();
    for (int n = 0; n < bars.Count; n++)
    {
        // get end treatment for both ends of bar
        for (int i = 0; i < 2; i++)
        {
            ElementId treatmentTypeId = bars[n].GetEndTreatmentTypeId(i);
            if (treatmentTypeId != ElementId.InvalidElementId)
            {
                EndTreatmentType treatmentType = doc.GetElement(treatmentTypeId) as EndTreatmentType;
                info.AppendLine(string.Format("End treatment for bar {0} end {1}: {2}", n, i, treatmentType.EndTreatment));
            }
        }
    }

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