ラスター イメージをアタッチ、尺度変更する(.NET)

イメージは図面ファイルにアタッチして配置することができますが、実際には図面ファイルの一部ではありません。イメージは、パス名またはデータ管理ドキュメント ID によって、図面ファイルにリンクされます。リンクされたイメージのパスは、いつでも変更したり削除することができます。イメージをアタッチするには、最初に参照されているディスクに保存されているイメージ ファイルに関する定義情報を含む RasterImageDef オブジェクトを作成し、次に RasterImage オブジェクトを作成します。

RasterImageDef オブジェクトを作成したら、RasterImage オブジェクトに割り当てます。RasterImage は、図面ウィンドウ内で操作するオブジェクトを表し、挿入位置、尺度、方向、およびその他のプロパティの中で特にイメージの外観をコントロールすることができます。1 つの RasterImageDef オブジェクトを使用して、イメージを複数回アタッチすることができます。アタッチごとに、専用のクリップ境界、明るさ、コントラスト、フェード、透過性が設定されます。

RasterImage オブジェクトを作成した後で、イメージのジオメトリの尺度が AudoCAD の図面で作成されたジオメトリの尺度と一致するように、Scale プロパティを使用してラスター イメージの尺度係数を設定できます。イメージをアタッチする場合、イメージの単位=AutoCAD の単位という尺度係数でイメージが挿入されます。イメージの尺度係数を設定するには、イメージのジオメトリの尺度と、AutoCAD の 1 単位を定義するために使用する尺度単位(インチ、フィートなど)を確認する必要があります。イメージ ファイルには、DPI を定義する解像度およびイメージ内のピクセル数の情報が含まれている必要があります。

イメージに解像度情報が含まれている場合は、AutoCAD はその情報と、尺度係数、および図面でのイメージの尺度を定義する AutoCAD 単位を組み合わせます。たとえば、ラスター イメージが青写真をスキャンしたもので、その尺度が 1 インチ=50 フィート(1:600)であり、AutoCAD の図面では 1 単位が 1 インチである場合は、イメージの尺度係数を 600 に設定します。AutoCAD は、イメージ内のジオメトリが図面のベクトル ジオメトリと同じサイズになるようにイメージの尺度を変更します。

注: 解像度情報がアタッチしたイメージ ファイルで定義されていない場合、AutoCAD はイメージの元の幅を 1 単位として計算します。挿入後は、AutoCAD 単位でのイメージの幅が尺度係数と等しくなります。

ラスター イメージをアタッチする

次の例では、ラスター イメージをモデル空間に追加します。この例では、VBA Sample フォルダにある WorldMap.tif ファイルを使用します。このイメージが存在しない場合や、別のフォルダにある場合は、有効なパスおよびファイル名を使用するようにコードを変更してください。

VB.NET

Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry

<CommandMethod("AttachRasterImage")> _
Public Sub AttachRasterImage()
    ' Get the current database and start a transaction
    Dim acCurDb As Autodesk.AutoCAD.DatabaseServices.Database
    acCurDb = Application.DocumentManager.MdiActiveDocument.Database

    Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()

        ' Define the name and image to use
        Dim strImgName As String = "WorldMap"
        Dim strFileName As String = "C:\AutoCAD\Sample\VBA\WorldMap.TIF"

        Dim acRasterDef As RasterImageDef
        Dim bRasterDefCreated As Boolean = False
        Dim acImgDefId As ObjectId

        ' Get the image dictionary
        Dim acImgDctID As ObjectId = RasterImageDef.GetImageDictionary(acCurDb)

        ' Check to see if the dictionary does not exist, it not then create it
        If acImgDctID.IsNull Then
            acImgDctID = RasterImageDef.CreateImageDictionary(acCurDb)
        End If

        ' Open the image dictionary
        Dim acImgDict As DBDictionary = acTrans.GetObject(acImgDctID, OpenMode.ForRead)

        ' Check to see if the image definition already exists
        If acImgDict.Contains(strImgName) Then
            acImgDefId = acImgDict.GetAt(strImgName)

            acRasterDef = acTrans.GetObject(acImgDefId, OpenMode.ForWrite)
        Else
            ' Create a raster image definition
            Dim acRasterDefNew As New RasterImageDef

            ' Set the source for the image file
            acRasterDefNew.SourceFileName = strFileName

            ' Load the image into memory
            acRasterDefNew.Load()

            ' Add the image definition to the dictionary
            acImgDict.UpgradeOpen()
            acImgDefId = acImgDict.SetAt(strImgName, acRasterDefNew)

            acTrans.AddNewlyCreatedDBObject(acRasterDefNew, True)

            acRasterDef = acRasterDefNew

            bRasterDefCreated = True
        End If

        ' 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)

        ' Create the new image and assign it the image definition
        Using acRaster As New RasterImage
            acRaster.ImageDefId = acImgDefId

            ' Use ImageWidth and ImageHeight to get the size of the image in pixels (1024 x 768).
            ' Use ResolutionMMPerPixel to determine the number of millimeters in a pixel so you 
            ' can convert the size of the drawing into other units or millimeters based on the 
            ' drawing units used in the current drawing.

            ' Define the width and height of the image
            Dim width As Vector3d
            Dim height As Vector3d

            ' Check to see if the measurement is set to English (Imperial) or Metric units
            If acCurDb.Measurement = MeasurementValue.English Then
                width = New Vector3d((acRasterDef.ResolutionMMPerPixel.X * acRaster.ImageWidth) / 25.4, 0, 0)
                height = New Vector3d(0, (acRasterDef.ResolutionMMPerPixel.Y * acRaster.ImageHeight) / 25.4, 0)
            Else
                width = New Vector3d(acRasterDef.ResolutionMMPerPixel.X * acRaster.ImageWidth, 0, 0)
                height = New Vector3d(0, acRasterDef.ResolutionMMPerPixel.Y * acRaster.ImageHeight, 0)
            End If

            ' Define the position for the image 
            Dim insPt As New Point3d(5.0, 5.0, 0.0)

            ' Define and assign a coordinate system for the image's orientation
            Dim coordinateSystem As New CoordinateSystem3d(insPt, width * 2, height * 2)
            acRaster.Orientation = coordinateSystem

            ' Set the rotation angle for the image
            acRaster.Rotation = 0

            ' Add the new object to the block table record and the transaction
            acBlkTblRec.AppendEntity(acRaster)
            acTrans.AddNewlyCreatedDBObject(acRaster, True)

            ' Connect the raster definition and image together so the definition
            ' does not appear as "unreferenced" in the External References palette.
            RasterImage.EnableReactors(True)
            acRaster.AssociateRasterDef(acRasterDef)

            If bRasterDefCreated Then
                acRasterDef.Dispose()
            End If
        End Using

        ' Save the new object to the database
        acTrans.Commit()

        ' Dispose of the transaction
    End Using
End Sub

C#

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;

[CommandMethod("AttachRasterImage")]
public void AttachRasterImage()
{
    // Get the current database and start a transaction
    Database acCurDb;
    acCurDb = Application.DocumentManager.MdiActiveDocument.Database;

    using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
    {
        // Define the name and image to use
        string strImgName = "WorldMap";
        string strFileName = "C:\\AutoCAD\\Sample\\VBA\\WorldMap.TIF";

        RasterImageDef acRasterDef;
        bool bRasterDefCreated = false;
        ObjectId acImgDefId;

        // Get the image dictionary
        ObjectId acImgDctID = RasterImageDef.GetImageDictionary(acCurDb);

        // Check to see if the dictionary does not exist, it not then create it
        if (acImgDctID.IsNull)
        {
            acImgDctID = RasterImageDef.CreateImageDictionary(acCurDb);
        }

        // Open the image dictionary
        DBDictionary acImgDict = acTrans.GetObject(acImgDctID, OpenMode.ForRead) as DBDictionary;

        // Check to see if the image definition already exists
        if (acImgDict.Contains(strImgName))
        {
            acImgDefId = acImgDict.GetAt(strImgName);

            acRasterDef = acTrans.GetObject(acImgDefId, OpenMode.ForWrite) as RasterImageDef;
        }
        else
        {
            // Create a raster image definition
            RasterImageDef acRasterDefNew = new RasterImageDef();

            // Set the source for the image file
            acRasterDefNew.SourceFileName = strFileName;

            // Load the image into memory
            acRasterDefNew.Load();

            // Add the image definition to the dictionary
            acImgDict.UpgradeOpen();
            acImgDefId = acImgDict.SetAt(strImgName, acRasterDefNew);

            acTrans.AddNewlyCreatedDBObject(acRasterDefNew, true);

            acRasterDef = acRasterDefNew;

            bRasterDefCreated = true;
        }

        // 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;

        // Create the new image and assign it the image definition
        using (RasterImage acRaster = new RasterImage())
        {
            acRaster.ImageDefId = acImgDefId;

            // Use ImageWidth and ImageHeight to get the size of the image in pixels (1024 x 768).
            // Use ResolutionMMPerPixel to determine the number of millimeters in a pixel so you 
            // can convert the size of the drawing into other units or millimeters based on the 
            // drawing units used in the current drawing.

            // Define the width and height of the image
            Vector3d width;
            Vector3d height;

            // Check to see if the measurement is set to English (Imperial) or Metric units
            if (acCurDb.Measurement == MeasurementValue.English)
            {
                width = new Vector3d((acRasterDef.ResolutionMMPerPixel.X * acRaster.ImageWidth) / 25.4, 0, 0);
                height = new Vector3d(0, (acRasterDef.ResolutionMMPerPixel.Y * acRaster.ImageHeight) / 25.4, 0);
            }
            else
            {
                width = new Vector3d(acRasterDef.ResolutionMMPerPixel.X * acRaster.ImageWidth, 0, 0);
                height = new Vector3d(0, acRasterDef.ResolutionMMPerPixel.Y * acRaster.ImageHeight, 0);
            }

            // Define the position for the image 
            Point3d insPt = new Point3d(5.0, 5.0, 0.0);

            // Define and assign a coordinate system for the image's orientation
            CoordinateSystem3d coordinateSystem = new CoordinateSystem3d(insPt, width * 2, height * 2);
            acRaster.Orientation = coordinateSystem;

            // Set the rotation angle for the image
            acRaster.Rotation = 0;

            // Add the new object to the block table record and the transaction
            acBlkTblRec.AppendEntity(acRaster);
            acTrans.AddNewlyCreatedDBObject(acRaster, true);

            // Connect the raster definition and image together so the definition
            // does not appear as "unreferenced" in the External References palette.
            RasterImage.EnableReactors(true);
            acRaster.AssociateRasterDef(acRasterDef);

            if (bRasterDefCreated)
            {
                acRasterDef.Dispose();
            }
        }

        // Save the new object to the database
        acTrans.Commit();

        // Dispose of the transaction
    }
}

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

Sub AttachRasterImage()
    Dim insertionPoint(0 To 2) As Double
    Dim scalefactor As Double
    Dim rotationAngle As Double
    Dim imageName As String
    Dim rasterObj As AcadRasterImage
    imageName = "C:/AutoCAD/sample/VBA/WorldMap.TIF"
    insertionPoint(0) = 5
    insertionPoint(1) = 5
    insertionPoint(2) = 0
    scalefactor = 2
    rotationAngle = 0

    On Error GoTo ERRORHANDLER
    ' Attach the raster image in model space
    Set rasterObj = ThisDrawing.ModelSpace.AddRaster(imageName, insertionPoint, _
                                                     scalefactor, rotationAngle)
    ZoomAll
 Exit Sub

ERRORHANDLER:
    MsgBox Err.Description
End Sub