寸法スタイルを作成、修正、コピーする(.NET)

DimStyleTableRecord オブジェクトのインスタンスを作成し、Add メソッドを使用して DimStyleTable に追加することで、新しい寸法スタイルが作成されます。寸法スタイルをテーブルに追加する前に、Name プロパティで新しいスタイルの名前を設定します。

既存のスタイルまたは優先のスタイルをコピーすることもできます。コピー元のオブジェクトから寸法スタイルにコピーするには、CopyFrom メソッドを使用します。コピー元のオブジェクトは、別の DimStyleTableRecord オブジェクト、DimensionTolerance、または Leader オブジェクト、さらには Database オブジェクトでもかまいません。スタイル設定を別の寸法スタイルからコピーした場合、現在のスタイルが正確に複製されます。DimensionTolerance、または Leader オブジェクトからスタイル設定をコピーした場合、オブジェクトの優先設定を含む現在の設定が、スタイルにコピーされます。Database オブジェクトの現在のスタイルをコピーした場合、寸法スタイルに加えてすべての図面の優先設定が、新しいスタイルにコピーされます。

寸法スタイルと優先をコピーする

次の例では、3 つの寸法スタイルを新規作成し、現在の Database の設定、指定した寸法スタイル、および指定した寸法を、新しい寸法スタイルにコピーします。適切な設定を行ってからこの例を実行すると、異なる寸法スタイルが作成されていることが分かります。

  1. 新規図面を作成し、アクティブにします。
  2. 新規図面に長さ寸法を記入します。この寸法は図面内で唯一のオブジェクトです。
  3. 寸法線の色を黄色に変更します。
  4. システム変数 DIMCLRD[寸法線の色]を 5 (青)に変更します。
  5. 次に示すコードを実行します。

VB.NET

Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
 
<CommandMethod("CopyDimStyles")> _
Public Sub CopyDimStyles()
    '' Get the current 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 read
        Dim acBlkTblRec As BlockTableRecord
        acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
                                        OpenMode.ForRead)

        Dim acObj As Object = Nothing
        For Each acObjId As ObjectId In acBlkTblRec
            '' Get the first object in Model space
            acObj = acTrans.GetObject(acObjId, _
                                      OpenMode.ForRead)

            Exit For
        Next

        '' Open the DimStyle table for read
        Dim acDimStyleTbl As DimStyleTable
        acDimStyleTbl = acTrans.GetObject(acCurDb.DimStyleTableId, _
                                          OpenMode.ForRead)

        Dim strDimStyleNames(2) As String
        strDimStyleNames(0) = "Style 1 copied from a dim"
        strDimStyleNames(1) = "Style 2 copied from Style 1"
        strDimStyleNames(2) = "Style 3 copied from the running drawing values"

        Dim nCnt As Integer = 0

        '' Keep a reference of the first dimension style for later
        Dim acDimStyleTblRec1 As DimStyleTableRecord = Nothing

        '' Iterate the array of dimension style names
        For Each strDimStyleName As String In strDimStyleNames
            Dim acDimStyleTblRec As DimStyleTableRecord
            Dim acDimStyleTblRecCopy As DimStyleTableRecord = Nothing

            '' Check to see if the dimension style exists or not
            If acDimStyleTbl.Has(strDimStyleName) = False Then
                If acDimStyleTbl.IsWriteEnabled = False Then acDimStyleTbl.UpgradeOpen()

                acDimStyleTblRec = New DimStyleTableRecord()
                acDimStyleTblRec.Name = strDimStyleName

                acDimStyleTbl.Add(acDimStyleTblRec)
                acTrans.AddNewlyCreatedDBObject(acDimStyleTblRec, True)
            Else
                acDimStyleTblRec = acTrans.GetObject(acDimStyleTbl(strDimStyleName), _
                                                     OpenMode.ForWrite)
            End If

            '' Determine how the new dimension style is populated
            Select Case nCnt
                '' Assign the values of the dimension object to the new dimension style
                Case 0
                    Try
                        '' Cast the object to a Dimension
                        Dim acDim As RotatedDimension = acObj

                        '' Copy the dimension style data from the dimension and
                        '' set the name of the dimension style as the copied settings
                        '' are unnamed.
                        acDimStyleTblRecCopy = acDim.GetDimstyleData()
                        acDimStyleTblRec1 = acDimStyleTblRec
                    Catch
                        '' Object was not a dimension
                    End Try

                    '' Assign the values of the dimension style to the new dimension style
                Case 1
                    acDimStyleTblRecCopy = acDimStyleTblRec1

                    '' Assign the values of the current drawing to the dimension style
                Case 2
                    acDimStyleTblRecCopy = acCurDb.GetDimstyleData()
            End Select

            '' Copy the dimension settings and set the name of the dimension style
            acDimStyleTblRec.CopyFrom(acDimStyleTblRecCopy)
            acDimStyleTblRec.Name = strDimStyleName

            '' Dispose of the copied dimension style
            acDimStyleTblRecCopy.Dispose()

            nCnt = nCnt + 1
        Next

        '' Commit 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("CopyDimStyles")]
public static void CopyDimStyles()
{
    // Get the current 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 read
        BlockTableRecord acBlkTblRec;
        acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
                                        OpenMode.ForRead) as BlockTableRecord;

        object acObj = null;
        foreach (ObjectId acObjId in acBlkTblRec)
        {
            // Get the first object in Model space
            acObj = acTrans.GetObject(acObjId,
                                        OpenMode.ForRead);

            break;
        }

        // Open the DimStyle table for read
        DimStyleTable acDimStyleTbl;
        acDimStyleTbl = acTrans.GetObject(acCurDb.DimStyleTableId,
                                            OpenMode.ForRead) as DimStyleTable;

        string[] strDimStyleNames = new string[3];
        strDimStyleNames[0] = "Style 1 copied from a dim";
        strDimStyleNames[1] = "Style 2 copied from Style 1";
        strDimStyleNames[2] = "Style 3 copied from the running drawing values";

        int nCnt = 0;

        // Keep a reference of the first dimension style for later
        DimStyleTableRecord acDimStyleTblRec1 = null;

        // Iterate the array of dimension style names
        foreach (string strDimStyleName in strDimStyleNames)
        {
            DimStyleTableRecord acDimStyleTblRec;
            DimStyleTableRecord acDimStyleTblRecCopy = null;

            // Check to see if the dimension style exists or not
            if (acDimStyleTbl.Has(strDimStyleName) == false)
            {
                if (acDimStyleTbl.IsWriteEnabled == false) acDimStyleTbl.UpgradeOpen();

                acDimStyleTblRec = new DimStyleTableRecord();
                acDimStyleTblRec.Name = strDimStyleName;

                acDimStyleTbl.Add(acDimStyleTblRec);
                acTrans.AddNewlyCreatedDBObject(acDimStyleTblRec, true);
            }
            else
            {
                acDimStyleTblRec = acTrans.GetObject(acDimStyleTbl[strDimStyleName],
                                                        OpenMode.ForWrite) as DimStyleTableRecord;
            }

            // Determine how the new dimension style is populated
            switch ((int)nCnt)
            {
                // Assign the values of the dimension object to the new dimension style
                case 0:
                    try
                    {
                        // Cast the object to a Dimension
                        Dimension acDim = acObj as Dimension;

                        // Copy the dimension style data from the dimension and
                        // set the name of the dimension style as the copied settings
                        // are unnamed.
                        acDimStyleTblRecCopy = acDim.GetDimstyleData();
                        acDimStyleTblRec1 = acDimStyleTblRec;
                    }
                    catch
                    {
                        // Object was not a dimension
                    }

                    break;

                // Assign the values of the dimension style to the new dimension style
                case 1:
                    acDimStyleTblRecCopy = acDimStyleTblRec1;
                    break;
                // Assign the values of the current drawing to the dimension style
                case 2:
                    acDimStyleTblRecCopy = acCurDb.GetDimstyleData();
                    break;
            }

            // Copy the dimension settings and set the name of the dimension style
            acDimStyleTblRec.CopyFrom(acDimStyleTblRecCopy);
            acDimStyleTblRec.Name = strDimStyleName;

            // Dispose of the copied dimension style
            acDimStyleTblRecCopy.Dispose();

            nCnt = nCnt + 1;
        }

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

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

Sub CopyDimStyles()
    Dim newStyle1 As AcadDimStyle
    Dim newStyle2 As AcadDimStyle
    Dim newStyle3 As AcadDimStyle
 
    Set newStyle1 = ThisDrawing.DimStyles. _
                        Add("Style 1 copied from a dim")
    Call newStyle1.CopyFrom(ThisDrawing.ModelSpace(0))
 
    Set newStyle2 = ThisDrawing.DimStyles. _
                        Add("Style 2 copied from Style 1")
    Call newStyle2.CopyFrom(ThisDrawing.DimStyles. _
                                Item("Style 1 copied from a dim"))
 
    Set newStyle2 = ThisDrawing.DimStyles. _
                        Add("Style 3 copied from the running drawing values")
    Call newStyle2.CopyFrom(ThisDrawing)
End Sub

DIMSTYLE[寸法スタイル管理]コマンドを使用して、寸法スタイル管理を開きます。現在 3 つの寸法スタイルが表示されています。Style 1 は、黄色の寸法線です。Style 2 は Style 1 と同じです。Style 3 は青色の寸法線です。