寸法と拘束

標準寸法と寸法に関連する拘束です。

寸法と拘束

Dimension クラスは、標準寸法と寸法に関連する拘束要素を表します。UI での要素の編集中に作成される仮寸法にはアクセスできません。指定点高さと指定点座標は SpotDimension クラスによって表されます。

次のコード サンプルは、末尾付近で標準寸法と拘束要素を区別する方法を示しています。

コード領域 16-1: 標準寸法と拘束を区別

public void GetInfo_Dimension(Dimension dimension)
{
    string message = "Dimension : ";
    // Get Dimension name
    message += "\nDimension name is : " + dimension.Name;

    // Get Dimension Curve
    Autodesk.Revit.DB.Curve curve = dimension.Curve;
    if (curve != null && curve.IsBound)
    {
        // Get curve start point
        message += "\nCurve start point:(" + curve.GetEndPoint(0).X + ", "
                + curve.GetEndPoint(0).Y + ", " + curve.GetEndPoint(0).Z + ")";
        // Get curve end point
        message += "; Curve end point:(" + curve.GetEndPoint(1).X + ", "
                + curve.GetEndPoint(1).Y + ", " + curve.GetEndPoint(1).Z + ")";
    }

    // Get Dimension type name
    message += "\nDimension type name is : " + dimension.DimensionType.Name;

    // Get Dimension view name
    message += "\nDimension view name is : " + dimension.View.Name;

    // Get Dimension reference count
    message += "\nDimension references count is " + dimension.References.Size;

    if ((int)BuiltInCategory.OST_Dimensions == dimension.Category.Id.IntegerValue)
    {
        message += "\nDimension is a permanent dimension.";
    }
    else if ((int)BuiltInCategory.OST_Constraints == dimension.Category.Id.IntegerValue)
    {
        message += "\nDimension is a constraint element.";
    }


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

寸法

標準寸法には次の 5 つの種類があります。

  • 長さ寸法
  • 半径寸法
  • 直径寸法
  • 角度寸法
  • 弧長寸法

図 66: 標準寸法

すべての標準寸法の BuiltInCategory は OST_Dimensions です。API を使用して 4 つの寸法を区別する簡単な方法はありません。

半径寸法および直径寸法を除き、それぞれの寸法には寸法線が 1 つあります。寸法線は、常時バインド解除されている Dimension.Curve プロパティから使用できます。言い換えると、寸法線は始点と終点を持ちません。前の図に基づくと、次のようになります。

  • 長さ寸法には線分オブジェクトが返されます。
  • 半径寸法や角度寸法には円弧オブジェクトが返されます。
  • 半径寸法は null を返します。
  • 直径寸法は null を返します。

図 67: 寸法参照

前の図にあるように、寸法はジオメトリ参照を選択することによって作成されます。API ではジオメトリ参照は Reference クラスとして表されます。参照プロパティでは次の寸法参照を使用することができます。参照の詳細は、「ジオメトリ」セクションの「参照」を参照してください。

  • 半径寸法と直径寸法 - 曲線に対して 1 つの参照オブジェクトが返されます。
  • 角度寸法と弧長寸法 - 2 つの参照オブジェクトが返されます。
  • 長さ寸法 - 複数の参照オブジェクトが返されます。次の図では、長さ寸法に 5 つの参照オブジェクトがあります。

図 68: 長さ寸法の参照

寸法は、他の注釈要素と同様、ビュー固有の要素です。寸法はこれを追加したビューのみで表示されます。Dimension.View プロパティは固有のビューを返します。

拘束要素

カテゴリ拘束(BuitInCategory.OST_Constraints)のある寸法オブジェクトは次の 2 つの寸法関連の拘束を表します。

  • 長さ寸法拘束と半径寸法拘束
  • 均等拘束

次の図では、2 種類のロックされた拘束が長さ寸法と半径寸法に対応しています。アプリケーションでは、緑色の破線の付いたロック アイコンとして表示されます(緑色の破線は Dimension.Curve プロパティから使用できます)。長さ寸法拘束と半径寸法拘束の両方とも、Dimension.References プロパティからの 2 つの参照オブジェクトを返します。

図 69: 長さ寸法拘束と半径寸法拘束

拘束要素はビューに固有のものではなく、さまざまなビューで表示することができます。したがって、ビュー プロパティは常時 null を返します。次の図では、前の図の拘束要素が 3D ビューで表示されています。

図 70: 3D ビューにおける長さ寸法拘束と半径寸法拘束

均等拘束は寸法に基づいていますが、Dimension クラスとして表すこともできます。API には、カテゴリや DimensionType を使用して、長さ寸法拘束と均等拘束を区別する直接的な方法はありません。均等拘束は 3 つ以上の参照を返しますが、長さ寸法拘束は 2 つ以上の参照を返します。

図 71: 均等拘束

注: 拘束要素がすべて Dimension クラスによって表されるわけではありませんが、すべて位置合わせ拘束などの拘束(OST_Constraints)カテゴリに属します。

指定点情報

指定点座標と指定点高さは SpotDimension クラスによって表され、カテゴリによって区別されます。標準寸法と同じように、指定点情報はビュー固有です。それぞれの指定点情報のタイプおよびカテゴリは次の表のとおりです。

表 35: 指定点情報のタイプとカテゴリ

タイプ

カテゴリ

指定点座標

OST_SpotCoordinates

指定点高さ

OST_SpotElevations

図 72: SpotCoordinates と SpotElevations

指定点情報が示す点座標を LocationPoint.Point プロパティから使用できるように、SpotDimension 位置を LocationPoint にダウンキャストすることができます。

  • SpotDimensions は寸法曲線を持たないため、Curve プロパティは常時 null を返します。
  • SpotDimension References プロパティは、点を表す参照や、指定点情報によって参照されるエッジを 1 つ返します。
  • 文字やタグの表示スタイルをコントロールするには、SpotDimension と SpotDimensionType パラメータを修正します。

比較

次の表は、API におけるさまざまな種類の寸法と拘束を比較しています。

表 36: 寸法カテゴリの比較

寸法または拘束 寸法または拘束 API クラス BuiltInCategory 曲線 参照 ビュー 場所
標準寸法 長さ寸法 Dimension OST_Dimensions 線分 =2 特定のビュー null
標準寸法 半径寸法 Dimension OST_Dimensions NULL 1 特定のビュー null
標準寸法 直径寸法 Dimension OST_Dimensions NULL 1 特定のビュー null
標準寸法 角度寸法 Dimension OST_Dimensions 円弧 2 特定のビュー null
標準寸法 弧長寸法 Dimension OST_Dimensions 円弧 2 特定のビュー null
寸法拘束 長さ寸法拘束 Dimension OST_Constraints 円弧 2   null
寸法拘束 角度寸法 Dimension OST_Constraints 円弧 2   null
均等拘束 均等拘束 Dimension OST_Constraints 線分 =3   null

作成、削除する

NewDimension()メソッドは Creation.Document クラスで使用できます。このメソッドは長さ寸法のみを作成することができます。

コード領域 16-2: NewDimension()

public Dimension NewDimension (View view, Line line, ReferenceArray references)
public Dimension NewDimension (View view, Line line, ReferenceArray references, 
DimensionType dimensionType)

NewDimension()メソッドの入力パラメータを使用すると、表示可能なビュー、寸法線、参照(複数)を設定できます。ただし、長さ寸法 DimensionType を他のタイプと区別する簡単な方法はありません。オーバーロードされた NewDimension()メソッドが DimensionType パラメータとともに使用されることはまれです。

次のコードは、NewDimension()メソッドを使用して寸法を複製する方法を説明しています。

コード領域 16-3: NewDimension()を使用して寸法を複製

public void DuplicateDimension(Document document, Dimension dimension)
{
        Line line = dimension.Curve as Line;
        if (null != line)
        {
                Autodesk.Revit.DB.View view = dimension.View;
                ReferenceArray references = dimension.References;
                Dimension newDimension = document.Create.NewDimension(view, line, references);
        }
}

長さ寸法のみが作成されますが、Document.Delete()メソッドを使用すると、Dimension と SpotDimension で表されるすべての寸法と拘束を削除できます。

寸法文字を操作する

Dimension および DimensionSegment クラスには、寸法曲線に対して文字の位置を照会、調整するための、類似するプロパティとメソッドがあります。

Dimension.Origin は寸法曲線の中点の XYZ 値を返し、DimensionSegment.Origin とともに使用すると、セグメントを構成する線の中点を返します。

Dimension や DimensionSegment の文字の位置が調整可能かどうかを判断するには、メソッド IsTextPositionAdjustable()を呼び出します。このメソッドは文字と引出し線の位置を調整できるかどうかを示します。

文字や引出し線(寸法や寸法セグメント)の位置を照会、変更するには、プロパティ TextPosition と LeaderEndPosition を使用します。

文字を寸法の既定の位置にリセットするには、メソッド ResetTextPosition()を呼び出します。

注: TextPosition と LeaderEndPosition は必ずしもすべての寸法に適用できるわけではありません(たとえば、指定点情報、均等拘束を使用した複数セグメントの寸法、寸法スタイルが標準の場合)。これらの値を適用できない場合は Null が返され、値を設定できません。

コード領域: 寸法文字の位置を変更

// Moves all of the text in this dimension one unit in the Y direction
public bool DimensionTextReposition(Dimension dimToModify)
{
    bool modified = false;
    if (dimToModify == null)
        return false;

    // Check to see if we have a non-multisegment dimension and if text position is adjustable
    if (dimToModify.NumberOfSegments == 0 && dimToModify.IsTextPositionAdjustable())
    {
        // Get the current text XYZ position
        XYZ currentTextPosition = dimToModify.TextPosition;
        // Calculate a new XYZ position by transforming the current text position
        XYZ newTextPosition = Transform.CreateTranslation(new XYZ(0.0, 1.0, 0.0)).OfPoint(currentTextPosition);
        // Set the new text position
        dimToModify.TextPosition = newTextPosition;

        modified = true;
    }
    else if (dimToModify.NumberOfSegments > 0)
    {
        foreach (DimensionSegment currentSegment in dimToModify.Segments)
        {
            if (currentSegment != null && currentSegment.IsTextPositionAdjustable())
            {
                modified = true;
                // Get the current text XYZ position
                XYZ currentTextPosition = currentSegment.TextPosition;
                // Calculate a new XYZ position by transforming the current text position
                XYZ newTextPosition = Transform.CreateTranslation(new XYZ(0, 1, 0)).OfPoint(currentTextPosition);
                // Set the new text position for the segment's text
                currentSegment.TextPosition = newTextPosition;
            }
        }
    }
    return modified;
}