イメージをクリップすることで、表示および印刷する領域を指定することができます。クリップ境界では、頂点がイメージの境界内にある矩形または 2D ポリゴンを使用する必要があります。同一イメージのインスタンスが複数ある場合は、それぞれ異なる境界を設定することができます。
イメージ境界の表示/非表示を切り替えるには IsClipped プロパティを使用し、クリップ境界が矩形またはポリゴンとして定義されているかどうかを調べるには ClipBoundaryType プロパティを使用します。
また、イメージのクリップ境界を取得または設定するには、次のメソッドを使用します。
この例として、モデル空間にラスター イメージを追加し、クリップ境界に基づいてイメージをクリップします。この例では、VBA Sample フォルダにある WorldMap.tif ファイルを使用します。このイメージが存在しない場合や、別のフォルダにある場合は、有効なパスおよびファイル名を使用するようにコードを変更してください。
Imports Autodesk.AutoCAD.Runtime Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.Geometry <CommandMethod("ClippingRasterBoundary")> _ Public Sub ClippingRasterBoundary() ' 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 ' Define the clipping boundary in drawing units Dim acPt2dColl As New Point2dCollection Dim acMat3d As Matrix3d = acRaster.PixelToModelTransform.Inverse() acPt2dColl.Add(New Point3d(5.5, 15, 0).TransformBy(acMat3d).Convert2d(New Plane())) acPt2dColl.Add(New Point3d(12.5, 15, 0).TransformBy(acMat3d).Convert2d(New Plane())) acPt2dColl.Add(New Point3d(12.5, 10.5, 0).TransformBy(acMat3d).Convert2d(New Plane())) acPt2dColl.Add(New Point3d(5.5, 10.5, 0).TransformBy(acMat3d).Convert2d(New Plane())) acPt2dColl.Add(New Point3d(5.5, 15, 0).TransformBy(acMat3d).Convert2d(New Plane())) ' Clip the image acRaster.SetClipBoundary(ClipBoundaryType.Rectangle, acPt2dColl) ' Enable the display of the clip acRaster.IsClipped = True ' 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
using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; [CommandMethod("ClippingRasterBoundary")] public void ClippingRasterBoundary() { // 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; // Define the clipping boundary in drawing units Point2dCollection acPt2dColl = new Point2dCollection(); Matrix3d acMat3d = acRaster.PixelToModelTransform.Inverse(); acPt2dColl.Add(new Point3d(5.5, 15, 0).TransformBy(acMat3d).Convert2d(new Plane())); acPt2dColl.Add(new Point3d(12.5, 15, 0).TransformBy(acMat3d).Convert2d(new Plane())); acPt2dColl.Add(new Point3d(12.5, 10.5, 0).TransformBy(acMat3d).Convert2d(new Plane())); acPt2dColl.Add(new Point3d(5.5, 10.5, 0).TransformBy(acMat3d).Convert2d(new Plane())); acPt2dColl.Add(new Point3d(5.5, 15, 0).TransformBy(acMat3d).Convert2d(new Plane())); // Clip the image acRaster.SetClipBoundary(ClipBoundaryType.Rectangle, acPt2dColl); // Enable the display of the clip acRaster.IsClipped = true; // 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 } }
Sub ClippingRasterBoundary() 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 ' Creates a raster image in model space Set rasterObj = ThisDrawing.ModelSpace.AddRaster(imageName, insertionPoint, _ scalefactor, rotationAngle) ' Establish the clip boundary with an array of points Dim clipPoints(0 To 9) As Double clipPoints(0) = 5.5: clipPoints(1) = 15 clipPoints(2) =12.5: clipPoints(3) = 15 clipPoints(4) = 12.5: clipPoints(5) = 10.5 clipPoints(6) = 5.5: clipPoints(7) = 10.5 clipPoints(8) = 5.5: clipPoints(9) = 15 ' Clip the image rasterObj.ClipBoundary clipPoints ' Enable the display of the clip rasterObj.ClippingEnabled = True ThisDrawing.Regen acActiveViewport End Sub