文字

文字や関連付けられた引出線には TextNote クラスからアクセスすることができます。

TextNote

TextNote の値にはプレーン テキストか書式付きテキストを設定できます。オーバーロードされた TextNote.Create() メソッドは、折り返しのない文字注記要素と行の折り返しつき文字注記要素を作成するためのオプションを提供します。文字内容の領域幅は作成時に指定できます。ただしその値は、文字のプロパティと文字のタイプに基づく最短の幅と最長の幅によって制限されます。オーバーロードされた GetMinimumAllowedWidth() メソッドと GetMaximumAllowedWidth() メソッドは、TextElement 要素から継承され、固有の TextNote の拘束を返すか、または指定されたドキュメントと文字タイプ ID の拘束を返します。

次の例では、ユーザ指定のポイントに、任意の幅の新しい TextNote を TextNoteOptions 付きで作成します。

コード領域: TextNote を作成

public TextNote AddNewTextNote(UIDocument uiDoc)
{
    Document doc = uiDoc.Document;
    XYZ textLoc = uiDoc.Selection.PickPoint("Pick a point for sample text.");
    ElementId defaultTextTypeId = doc.GetDefaultElementTypeId(ElementTypeGroup.TextNoteType);
    double noteWidth = .2;

    // make sure note width works for the text type
    double minWidth = TextNote.GetMinimumAllowedWidth(doc, defaultTextTypeId);
    double maxWidth = TextNote.GetMaximumAllowedWidth(doc, defaultTextTypeId);
    if (noteWidth < minWidth)
    {
        noteWidth = minWidth;
    }
    else if (noteWidth > maxWidth)
    {
        noteWidth = maxWidth;
    }

    TextNoteOptions opts = new TextNoteOptions(defaultTextTypeId);
    opts.HorizontalAlignment = HorizontalTextAlignment.Left;
    opts.Rotation = Math.PI / 4;
           
    TextNote textNote = TextNote.Create(doc, doc.ActiveView.Id, textLoc, noteWidth, "New sample text", opts);

    return textNote;
}

TextNote がプレーン テキストと書式付きテキストのどちらを取るかにかかわらず、書式なしテキストは TextNote.Text プロパティからいつでも取得できます。

FormattedText

作成時点の初期設定では、TextNote はプレーン テキストを取ることになっています。TextNote 用に FormattedText オブジェクトを取得するには、TextNote.GetFormattedText() メソッドを使用します。FormattedText クラスは、[太字]、[下線]、[上付き文字]、[すべて大文字]などのさまざまな書式を文字に適用するために使用されます。TextNote は、SetFormattedText() が修正された FormattedText とともに呼び出されない限りは、更新されません。

TextRange を使用すると、FormattedText 内の文字の全体または一部に書式を付けることができます。TextRange は、FormattedText オブジェクト内の文字に基づいて、インデックスの開始位置と長さを指定します。SetItalicStatus() や SetAllCapsStatus() などの書式設定メソッドのオーバーロードで TextRange を使用すると、範囲内の文字のみが修正されます。指定された検索文字列の範囲を取得するには、TextRange をそのコンストラクタによって明示的に定義するか、FormattedText.Find() メソッドによって取得します。Find() メソッドは、検索用の開始インデックスに加えて、検索文字列の大文字と小文字の一致判定や、完全一致検索を有効にするかどうかを指定します。検索文字列が見つからない場合や、指定された開始インデックスが文字列全体の末端を超えている場合は、空の TextRange が返されます。例外の発生を避けるには、返された範囲を使用して文字の書式を設定する前に、TextRange が空でないことを確認してください。

次の例では、TextNote から取得した文字に書式を設定し、それを TextNote に設定し直す方法を紹介しています。Find() メソッドを使用して、文字列中の特定の単語に太字や下線を設定しています。

コード領域: TextNote の文字に書式を設定

public void FormatText(TextNote textNote)
{
    // TextNote created with "New sample text"
    FormattedText formatText = textNote.GetFormattedText();

    // italicize "New"
    TextRange range = new TextRange(0, 3);
    formatText.SetItalicStatus(range, true);

    // make "sample" bold
    range = formatText.Find("sample", 0, false, true);
    if (range.Length > 0)
        formatText.SetBoldStatus(range, true);

    // make "text" underlined
    range = formatText.Find("text", 0, false, true);
    if (range.Length > 0)
        formatText.SetUnderlineStatus(range, true);

    // make all text uppercase
    formatText.SetAllCapsStatus(true);

    textNote.SetFormattedText(formatText);
}

新しい文字を、FormattedText オブジェクトに含まれる既存の文字に追加することができます。SetPlainText() メソッドは、TextRange パラメータを含むオーバーロードが使用されている場合には、既存の文字列の一部を置き換えます。そうでない場合には、文字列全体を置き換えます。既存の文字を置き換えずに文字を挿入するには、TextRange を使用する際に Length の値を 0 に設定します。新しい文字は TextRange.Start property によって指定されたインデックス位置に挿入されます。文字を挿入すると、隣接する文字の書式がその文字に適用される場合があります。これは書式設定していない文字を Word ドキュメントに貼り付けると、挿入箇所の現在の書式が挿入した文字に適用されるのと同様です。前掲の例で SetAllCapsStatus(true) を呼び出している箇所のように、書式が FormattedText 全体に適用された場合は、挿入する新しい文字すべてにその書式が適用されます。

次の例では、まず現在の文字列の末端を見つけて、この末端を追加する範囲の Start として設定することで、既存の文字列の末端に新しい文字列を追加します。また、リスト(箇条書き、番号付き、行頭文字付き)の作成方法についても紹介しています。ここでは新しい文字の範囲で GetAllCapsStatus() も呼び出し、ステータスが FormatStatus.None でない(他のオプションが All または Mixed である)場合は、[Caps Lock]を無効にしています。

コード領域: 新しい文字を挿入

public void AppendText(TextNote textNote)
{
    FormattedText formatText = textNote.GetFormattedText();

    TextRange range = formatText.AsTextRange();
                
    range.Start = range.End - 1;
    // set Length to 0 to insert
    range.Length = 0;
    string someNewText = "\rThis is a new paragraph\vThis is a new line without a paragraph break\r";
    formatText.SetPlainText(range, someNewText);

    // get range for entire text
    range = formatText.AsTextRange();
    range.Start = range.End - 1;
    range.Length = 0;
    string someListText = "\rBulleted List item 1\rItem 2\vSecond line for Item 2\rThird bullet point";
    formatText.SetPlainText(range, someListText);
    range.Start++;
    range.Length = someListText.Length;
    formatText.SetListType(range, ListType.Bullet);

    if (formatText.GetAllCapsStatus(range) != FormatStatus.None)
    {
        formatText.SetAllCapsStatus(range, false);
    }

    textNote.SetFormattedText(formatText);
}

前掲のコードでは、\r で改行を設定する方法や、\v で段落を改めない垂直タブを設定する方法を示しています。箇条書きのリスト用の文字で \v を使用すると、2 行に対して 1 つの箇条書きの点が作成されます。新しい箇条書きの行は、\r を使用した場合にのみ挿入されます。

テキスト エディタ

TextEditorOptions クラスは、Revit のテキスト エディタの外観と機能を制御するのに使用できます。これらの設定は Revit.ini ファイルに保存され、ドキュメントには関連付けられません。

コード領域: テキスト エディタのオプションを設定

public void SetEditorOptions()
{
    TextEditorOptions editorOptions = TextEditorOptions.GetTextEditorOptions();
    editorOptions.ShowBorder = false;
    editorOptions.ShowOpaqueBackground = true;
}

引出線

Revit では、2 種類の引出線(直線引出線と円弧引出線)をサポートしています。引出線を TextNote に追加するには、AddLeader() メソッドを使用し、TextNoteLeaderType 列挙型を使用して引出線タイプを次のように指定します。

表 39: 引出線のタイプ

機能

メンバー名

- 右円弧引出線を追加します

TNLT_ARC_R

- 左円弧引出線を追加します

TNLT_ARC_L

- 右引出線を追加します。

TNLT_STRAIGHT_R

- 左引出線を追加します。

TNLT_STRAIGHT_L

注: 直線の引出線と円弧の引出線を、同時に 1 つの Text タイプに追加することはできません。

TextNote.LeaderCount プロパティは、引出線の数を返します。また GetLeaders() メソッドは、文字コンポーネントに現在アタッチされているすべての引出線を返します。LeaderLeftAttachment と LeaderRightAttachment は、TextNote の左右にある引出線のアタッチ ポイントを示します。LeaderAttachment のオプションは、TopLine、MidPoint、BottomLine です。TextNote からすべての引出線を削除するには、RemoveLeaders() メソッドを使用します。