1 行文字を位置合わせする(.NET)

1 行文字を左右および上下に位置合わせすることができます。既定では、左寄せに設定されています。左右および上下の位置合わせオプションを設定するには、HorizontalMode および VerticalMode プロパティを使用します。

通常、文字オブジェクトを閉じると、文字オブジェクトの位置と位置合わせ点は、その位置合わせと文字スタイルに従って調整されます。しかし、メモリ内の文字オブジェクトの位置合わせは自動的に更新されません。現在のプロパティ値に基づいて文字オブジェクトの位置合わせを更新するには、AdjustAlignment メソッドを呼び出します。

1 行文字を位置合わせする

次の例では、1 行文字(DBText)オブジェクトと点(DBPoint)オブジェクトを作成します。点オブジェクトを文字の位置合わせ点に設定し、見やすくなるよう赤の十字形に変更します。文字の位置合わせを変更し、マクロの実行が中止されるようにメッセージ ボックスを表示します。このようにすることで、文字の位置合わせの変更による影響を確認することができます。

VB.NET

Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
 
<CommandMethod("TextAlignment")> _
Public Sub TextAlignment()
    '' Get the current document and database
    Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
    Dim acCurDb As Database = acDoc.Database

    '' Start a transaction
    Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()

        '' Open the Block table for read
        Dim acBlkTbl As BlockTable
        acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, _
                                     OpenMode.ForRead)

        '' Open the Block table record Model space for write
        Dim acBlkTblRec As BlockTableRecord
        acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
                                        OpenMode.ForWrite)

        Dim textString(0 To 2) As String
        textString(0) = "Left"
        textString(1) = "Center"
        textString(2) = "Right"

        Dim textAlign(0 To 2) As Integer
        textAlign(0) = TextHorizontalMode.TextLeft
        textAlign(1) = TextHorizontalMode.TextCenter
        textAlign(2) = TextHorizontalMode.TextRight

        Dim acPtIns As Point3d = New Point3d(3, 3, 0)
        Dim acPtAlign As Point3d = New Point3d(3, 3, 0)

        Dim nCnt As Integer = 0

        For Each strVal As String In textString
            '' Create a single-line text object
            Using acText As DBText = New DBText()
                acText.Position = acPtIns
                acText.Height = 0.5
                acText.TextString = strVal

                '' Set the alignment for the text
                acText.HorizontalMode = textAlign(nCnt)

                If acText.HorizontalMode <> TextHorizontalMode.TextLeft Then
                    acText.AlignmentPoint = acPtAlign
                End If

                acBlkTblRec.AppendEntity(acText)
                acTrans.AddNewlyCreatedDBObject(acText, True)
            End Using

            '' Create a point over the alignment point of the text
            Using acPoint As DBPoint = New DBPoint(acPtAlign)
                acPoint.ColorIndex = 1

                acBlkTblRec.AppendEntity(acPoint)
                acTrans.AddNewlyCreatedDBObject(acPoint, True)

                '' Adjust the insertion and alignment points
                acPtIns = New Point3d(acPtIns.X, acPtIns.Y + 3, 0)
                acPtAlign = acPtIns
            End Using

            nCnt = nCnt + 1
        Next

        '' Set the point style to crosshair
        Application.SetSystemVariable("PDMODE", 2)

        '' Save the changes and dispose of the transaction
        acTrans.Commit()
    End Using
End Sub

C#

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
 
[CommandMethod("TextAlignment")]
public static void TextAlignment()
{
    // Get the current document and database
    Document acDoc = Application.DocumentManager.MdiActiveDocument;
    Database acCurDb = acDoc.Database;

    // Start a transaction
    using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
    {
        // Open the Block table for read
        BlockTable acBlkTbl;
        acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
                                        OpenMode.ForRead) as BlockTable;

        // Open the Block table record Model space for write
        BlockTableRecord acBlkTblRec;
        acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
                                        OpenMode.ForWrite) as BlockTableRecord;

        string[] textString = new string[3];
        textString[0] = "Left";
        textString[1] = "Center";
        textString[2] = "Right";

        int[] textAlign = new int[3];
        textAlign[0] = (int)TextHorizontalMode.TextLeft;
        textAlign[1] = (int)TextHorizontalMode.TextCenter;
        textAlign[2] = (int)TextHorizontalMode.TextRight;

        Point3d acPtIns = new Point3d(3, 3, 0);
        Point3d acPtAlign = new Point3d(3, 3, 0);

        int nCnt = 0;

        foreach (string strVal in textString)
        {
            // Create a single-line text object
            using (DBText acText = new DBText())
            {
                acText.Position = acPtIns;
                acText.Height = 0.5;
                acText.TextString = strVal;

                // Set the alignment for the text
                acText.HorizontalMode = (TextHorizontalMode)textAlign[nCnt];

                if (acText.HorizontalMode != TextHorizontalMode.TextLeft)
                {
                    acText.AlignmentPoint = acPtAlign;
                }

                acBlkTblRec.AppendEntity(acText);
                acTrans.AddNewlyCreatedDBObject(acText, true);
            }

            // Create a point over the alignment point of the text
            using (DBPoint acPoint = new DBPoint(acPtAlign))
            {
                acPoint.ColorIndex = 1;

                acBlkTblRec.AppendEntity(acPoint);
                acTrans.AddNewlyCreatedDBObject(acPoint, true);

                // Adjust the insertion and alignment points
                acPtIns = new Point3d(acPtIns.X, acPtIns.Y + 3, 0);
                acPtAlign = acPtIns;
            }

            nCnt = nCnt + 1;
        }

        // Set the point style to crosshair
        Application.SetSystemVariable("PDMODE", 2);

        // Save the changes and dispose of the transaction
        acTrans.Commit();
    }
}

VBA/ActiveX コード リファレンス

Sub TextAlignment()
    ' Set the point style to crosshair
    ThisDrawing.SetVariable "PDMODE", 2
 
    Dim textObj As AcadText
    Dim pointObj As AcadPoint
 
    ' Define the text strings and insertion point for the text objects
    Dim textString(0 To 2) As String
    textString(0) = "Left"
    textString(1) = "Center"
    textString(2) = "Right"
 
    Dim textAlign(0 To 2) As Integer
    textAlign(0) = acAlignmentLeft
    textAlign(1) = acAlignmentCenter
    textAlign(2) = acAlignmentRight
 
    Dim insertionPoint(0 To 2) As Double
    insertionPoint(0) = 3: insertionPoint(1) = 0: insertionPoint(2) = 0
 
    Dim alignmentPoint(0 To 2) As Double
    alignmentPoint(0) = 3: alignmentPoint(1) = 0: alignmentPoint(2) = 0
 
    Dim nCnt As Integer
    For Each strVal In textString
        ' Create the Text object in model space
        Set textObj = ThisDrawing.ModelSpace. _
                        AddText(strVal, insertionPoint, 0.5)
 
        ' Set the alignment for the text
        textObj.Alignment = textAlign(nCnt)
 
        On Error Resume Next
        textObj.TextAlignmentPoint = alignmentPoint
 
        ' Create a point over the alignment point of the text
        Set pointObj = ThisDrawing.ModelSpace.AddPoint(alignmentPoint)
        pointObj.color = acRed
 
        ' Adjust the insertion and alignment points
        insertionPoint(1) = insertionPoint(1) + 3
        alignmentPoint(1) = insertionPoint(1)
 
        nCnt = nCnt + 1
    Next
End Sub