[CommandMethod("Test")]
public void Test()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
Database db = doc.Database;
// выбор объектов для создания блока
var selRes = ed.GetSelection();
Point3d location = ed.GetPoint("Точка вставки блока").Value.TransformBy(ed.CurrentUserCoordinateSystem);
if (selRes.Status == PromptStatus.OK)
{
using (var t = db.TransactionManager.StartTransaction())
{
var bt = t.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
ObjectId idBtr;
// создание определения блока
BlockTableRecord btr;
using (btr = new BlockTableRecord())
{
btr.Name = "Test";
idBtr = bt.Add(btr);
t.AddNewlyCreatedDBObject(btr, true);
}
// копирование выбранных объектов в блок
ObjectIdCollection ids = new ObjectIdCollection(selRes.Value.GetObjectIds());
IdMapping mapping = new IdMapping();
db.DeepCloneObjects(ids, idBtr, mapping, false);
// перемещение объектов в блоке
btr = t.GetObject(idBtr, OpenMode.ForRead) as BlockTableRecord;
var moveMatrix = Matrix3d.Displacement(Point3d.Origin - location);
foreach (ObjectId idEnt in btr)
{
var ent = t.GetObject(idEnt, OpenMode.ForWrite) as Entity;
ent.TransformBy(moveMatrix);
}
// удаление выбранных объектов
foreach (ObjectId idEnt in ids)
{
var ent = t.GetObject(idEnt, OpenMode.ForWrite) as Entity;
ent.Erase();
}
// вставка блока
using (var blRef = new BlockReference(location, idBtr))
{
blRef.SetDatabaseDefaults(db);
var ms = t.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
ms.AppendEntity(blRef);
t.AddNewlyCreatedDBObject(blRef, true);
}
t.Commit();
}
}
}