オブジェクトを分解すると、単一のオブジェクトが構成要素に変換されます。オブジェクトを分解するには Explode 関数を使用します。この関数には、結果のオブジェクトを返すために使用される DBObjectCollection オブジェクトを渡す必要があります。たとえば、ポリラインを分解すると、複数の線分と円弧が含まれているオブジェクトのコレクションが作成されます。
ブロックを分解すると、ブロックを定義するグラフィカル オブジェクトを保持するオブジェクト コレクションが返されます。オブジェクトを分解した後、元のオブジェクトは変更されないまま残ります。返されるオブジェクトで元のオブジェクトを置き換える場合は、元のオブジェクトを削除し、返されるオブジェクトをブロック テーブル レコードに追加する必要があります。
次の例では、ライトウェイト ポリライン オブジェクトを作成した後、ポリラインを最も単純なオブジェクトに分解します。ポリラインを分解した後、元のポリラインを破棄し、返されるオブジェクトをモデル空間に追加します。
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
[CommandMethod("ExplodeObject")]
public static void ExplodeObject()
{
// 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;
// Create a lightweight polyline
using (Polyline acPoly = new Polyline())
{
acPoly.AddVertexAt(0, new Point2d(1, 1), 0, 0, 0);
acPoly.AddVertexAt(1, new Point2d(1, 2), 0, 0, 0);
acPoly.AddVertexAt(2, new Point2d(2, 2), 0, 0, 0);
acPoly.AddVertexAt(3, new Point2d(3, 2), 0, 0, 0);
acPoly.AddVertexAt(4, new Point2d(4, 4), 0, 0, 0);
acPoly.AddVertexAt(5, new Point2d(4, 1), 0, 0, 0);
// Sets the bulge at index 3
acPoly.SetBulgeAt(3, -0.5);
// Explodes the polyline
DBObjectCollection acDBObjColl = new DBObjectCollection();
acPoly.Explode(acDBObjColl);
foreach (Entity acEnt in acDBObjColl)
{
// Add the new object to the block table record and the transaction
acBlkTblRec.AppendEntity(acEnt);
acTrans.AddNewlyCreatedDBObject(acEnt, true);
}
// Dispose of the in memory polyline
}
// Save the new objects to the database
acTrans.Commit();
}
}