Hi,
Here's a quick and dirty C# command example that mimics the BLOCK native command.
[CommandMethod("Test")]
public void Test()
{
Document doc = AcAp.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
// User inputs
PromptStringOptions pso = new PromptStringOptions("\nBlock name: ");
pso.AllowSpaces = false;
PromptResult pr = ed.GetString(pso);
if (pr.Status != PromptStatus.OK) return;
PromptPointResult ppr = ed.GetPoint("\nInsertion point: ");
if (ppr.Status != PromptStatus.OK) return;
PromptSelectionResult psr = ed.GetSelection();
if (psr.Status != PromptStatus.OK) return;
// Datas
ObjectIdCollection oid = new ObjectIdCollection(psr.Value.GetObjectIds());
Point3d pt = ppr.Value.TransformBy(ed.CurrentUserCoordinateSystem);
using (Transaction tr = db.TransactionManager.StartTransaction())
{
// Create a new block record
BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite);
BlockTableRecord btr = new BlockTableRecord();
bt.Add(btr);
tr.AddNewlyCreatedDBObject(btr, true);
btr.Name = pr.StringResult;
// Displace all selected entities from picked point to origin
Vector3d disp = pt.GetVectorTo(Point3d.Origin);
foreach (ObjectId id in oid)
{
Entity ent = (Entity)tr.GetObject(id, OpenMode.ForWrite);
ent.TransformBy(Matrix3d.Displacement(disp));
}
// Add entities to the block record
btr.AssumeOwnershipOf(oid);
// Insert the newly created block at picked point
BlockTableRecord space = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
BlockReference br = new BlockReference(pt, btr.ObjectId);
space.AppendEntity(br);
tr.AddNewlyCreatedDBObject(br, true);
tr.Commit();
}
}