Closer to your request (No User Input):
private static void MakeBlock(Database db, ObjectIdCollection ids, Point3d insertionPoint, bool eraseSourceEntities)
{
using (var tr = db.TransactionManager.StartTransaction())
{
var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
if (bt.Has("NEW_BLOCK"))
return;
// create a new block definition
tr.GetObject(db.BlockTableId, OpenMode.ForWrite);
var btr = new BlockTableRecord();
btr.Name = "NEW_BLOCK";
var btrId = bt.Add(btr);
tr.AddNewlyCreatedDBObject(btr, true);
// add copies of selected entities to the block definition
var mapping = new IdMapping();
db.DeepCloneObjects(ids, btrId, mapping, false);
// displace the clones within the block definition
var xform = Matrix3d.Displacement(insertionPoint.GetAsVector().Negate());
foreach (ObjectId id in ids)
{
var pair = mapping[id];
if (pair.IsCloned)
{
var clone = (Entity)tr.GetObject(pair.Value, OpenMode.ForWrite);
clone.TransformBy(xform);
}
var entity = (Entity)tr.GetObject(id, OpenMode.ForWrite);
entity.Erase();
}
// insert the newly created block
ObjectId ownerId = ((Entity)tr.GetObject(ids[0], OpenMode.ForRead)).OwnerId;
var space = (BlockTableRecord)tr.GetObject(ownerId, OpenMode.ForWrite);
var br = new BlockReference(insertionPoint, btrId);
space.AppendEntity(br);
tr.AddNewlyCreatedDBObject(br, true);
// erase source entities
if (eraseSourceEntities)
{
foreach (ObjectId id in ids)
{
var entity = (Entity)tr.GetObject(id, OpenMode.ForWrite);
entity.Erase();
}
}
tr.Commit();
}
}