BlockReference オブジェクトを作成し、AppendEntity メソッドを使って BlockTableRecord オブジェクトに追加すると、現在の図面のブロック テーブルで定義したブロックを挿入できます。新しい BlockReference を作成すると、挿入するブロック参照の原点と、ジオメトリを継承する BlockTableRecord オブジェクトの ObjectId がコンストラクタに渡されます。
また、ReadDwgFile メソッドを使用して現在の図面に図面ファイル全体を挿入し、Insert メソッドを使用して現在の図面にメモリ内の図面を挿入することもできます。図面全体を他の図面に挿入すると、AutoCAD では挿入された図面を他のブロック参照と同様に取り扱います。それ以降の挿入では、異なる位置、尺度、回転の設定を持つブロック定義(ブロック内部の図形の定義を含んだもの)を参照します。
挿入した後で元の図面を変更しても、その変更は挿入されたブロックには影響しません。挿入したブロックに元の図面に加えた変更を反映させたい場合は、元の図面を再度挿入してブロックを再定義します。
既定では、AutoCAD は図面ファイルの挿入時に、基点として座標(0, 0, 0)を使用します。図面の基点は、元の図面を開き、SetSystemVariable メソッドを指定して別の挿入基点を使用することで変更できます。AutoCAD は、図面が次回挿入されたときに新しい基点を使用します。
挿入した図面に PaperSpace オブジェクトが含まれている場合は、これらのオブジェクトは現在の図面のブロック定義には含まれません。他の図面で PaperSpace オブジェクトを使用するには、元の図面を開き、PaperSpace オブジェクトを 1 つのブロックとして定義します。ペーパー空間またはモデル空間のどちらでも、図面を他の図面に挿入することができます。
ブロック参照を繰り返して、そのブロック参照を構成する元のオブジェクトを検索することはできません。しかし、元のブロック定義を繰り返し使用したり、ブロック参照を元のコンポーネントに分解することは可能です。
また、MInsertBlock オブジェクトを使用してブロックの配列を挿入することもできます。このメソッドでは、BlockReference のように単独のブロックを図面に挿入する代わりに、指定されたブロックの配列を挿入します。
ブロックの挿入の詳細については、製品のヘルプ システムで「概要 - ブロックを挿入する」を参照してください。
次の例では、ブロックを定義し、その定義に円を追加します。その後で、ブロック参照としてブロックを図面に挿入します。
Imports Autodesk.AutoCAD.Runtime Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.Geometry <CommandMethod("InsertingABlock")> _ Public Sub InsertingABlock() ' 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() ' Open the Block table for read Dim acBlkTbl As BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) Dim blkRecId As ObjectId = ObjectId.Null If Not acBlkTbl.Has("CircleBlock") Then Using acBlkTblRec As New BlockTableRecord acBlkTblRec.Name = "CircleBlock" ' Set the insertion point for the block acBlkTblRec.Origin = New Point3d(0, 0, 0) ' Add a circle to the block Using acCirc As New Circle acCirc.Center = New Point3d(0, 0, 0) acCirc.Radius = 2 acBlkTblRec.AppendEntity(acCirc) acBlkTbl.UpgradeOpen() acBlkTbl.Add(acBlkTblRec) acTrans.AddNewlyCreatedDBObject(acBlkTblRec, True) End Using blkRecId = acBlkTblRec.Id End Using Else blkRecId = acBlkTbl("CircleBlock") End If ' Insert the block into the current space If blkRecId <> ObjectId.Null Then Using acBlkRef As New BlockReference(New Point3d(0, 0, 0), blkRecId) Dim acCurSpaceBlkTblRec As BlockTableRecord acCurSpaceBlkTblRec = acTrans.GetObject(acCurDb.CurrentSpaceId, OpenMode.ForWrite) acCurSpaceBlkTblRec.AppendEntity(acBlkRef) acTrans.AddNewlyCreatedDBObject(acBlkRef, True) End Using End If ' 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("InsertingABlock")] public void InsertingABlock() { // Get the current database and start a transaction Database acCurDb; acCurDb = Application.DocumentManager.MdiActiveDocument.Database; using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { // Open the Block table for read BlockTable acBlkTbl; acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable; ObjectId blkRecId = ObjectId.Null; if (!acBlkTbl.Has("CircleBlock")) { using (BlockTableRecord acBlkTblRec = new BlockTableRecord()) { acBlkTblRec.Name = "CircleBlock"; // Set the insertion point for the block acBlkTblRec.Origin = new Point3d(0, 0, 0); // Add a circle to the block using (Circle acCirc = new Circle()) { acCirc.Center = new Point3d(0, 0, 0); acCirc.Radius = 2; acBlkTblRec.AppendEntity(acCirc); acBlkTbl.UpgradeOpen(); acBlkTbl.Add(acBlkTblRec); acTrans.AddNewlyCreatedDBObject(acBlkTblRec, true); } blkRecId = acBlkTblRec.Id; } } else { blkRecId = acBlkTbl["CircleBlock"]; } // Insert the block into the current space if (blkRecId != ObjectId.Null) { using (BlockReference acBlkRef = new BlockReference(new Point3d(0, 0, 0), blkRecId)) { BlockTableRecord acCurSpaceBlkTblRec; acCurSpaceBlkTblRec = acTrans.GetObject(acCurDb.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord; acCurSpaceBlkTblRec.AppendEntity(acBlkRef); acTrans.AddNewlyCreatedDBObject(acBlkRef, true); } } // Save the new object to the database acTrans.Commit(); // Dispose of the transaction } }
Sub InsertingABlock() ' Define the block Dim blockObj As AcadBlock Dim insertionPnt(0 To 2) As Double insertionPnt(0) = 0 insertionPnt(1) = 0 insertionPnt(2) = 0 Set blockObj = ThisDrawing.Blocks.Add(insertionPnt, "CircleBlock") ' Add a circle to the block Dim circleObj As AcadCircle Dim center(0 To 2) As Double Dim radius As Double center(0) = 0 center(1) = 0 center(2) = 0 rad = 2 Set circleObj = blockObj.AddCircle(center, rad) ' Insert the block Dim blockRefObj As AcadBlockReference insertionPnt(0) = 0 insertionPnt(1) = 0 insertionPnt(2) = 0 Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "CircleBlock", 1, 1, 1, 0) End Sub