[CommandMethod("TestInsertManyDynBl")]
public static void TestInsertManyDynBl()
{
Random rnd = new Random();
Document doc = Application.DocumentManager.MdiActiveDocument;
using (var ld = doc.LockDocument())
{
Database db = doc.Database;
using (var t = db.TransactionManager.StartTransaction())
{
var bt = t.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
var ms = t.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
var btrDynBl = t.GetObject(bt["Test"], OpenMode.ForRead) as BlockTableRecord;
ObjectId idBlRefTemplate;
// Шаблон дин блока с атрибутами
using (var blRefTemplate = new BlockReference(Point3d.Origin, btrDynBl.Id))
{
ms.AppendEntity(blRefTemplate);
t.AddNewlyCreatedDBObject(blRefTemplate, true);
// установка дин параметров
setDynParam(blRefTemplate);
// добавление атрибутов и задание им значений
setAttr(blRefTemplate, btrDynBl);
idBlRefTemplate = blRefTemplate.Id;
ms.DowngradeOpen();
}
var colCopy = new ObjectIdCollection();
// добавление блока шабллона
colCopy.Add(idBlRefTemplate);
// Вставка 1000 дин блоков с изменение дин параметров.
for (int i = 0; i < 1000; i++)
{
IdMapping map = new IdMapping();
// копирование блока шаблона
db.DeepCloneObjects(colCopy, ms.Id, map, false);
var blRef = t.GetObject(map[idBlRefTemplate].Value, OpenMode.ForWrite) as BlockReference;
var newPt = new Point3d(rnd.Next(10000), rnd.Next(10000), 0);
// перенос скопированного блока внужное место
blRef.TransformBy(Matrix3d.Displacement(blRef.Position.GetVectorTo(newPt)));
}
t.Commit();
}
}
}
private static void setDynParam(BlockReference blRef)
{
foreach (DynamicBlockReferenceProperty item in blRef.DynamicBlockReferencePropertyCollection)
{
if (string.Equals(item.PropertyName, "Длина", StringComparison.InvariantCultureIgnoreCase))
item.Value = 300d;
else if (string.Equals(item.PropertyName, "Высота", StringComparison.InvariantCultureIgnoreCase))
item.Value = 100d;
}
}
private static void setAttr (BlockReference blRef, BlockTableRecord btr)
{
foreach (ObjectId idEnt in btr)
{
if (idEnt.ObjectClass.Name == "AcDbAttributeDefinition")
{
var atrDef = idEnt.GetObject(OpenMode.ForRead) as AttributeDefinition;
if (!atrDef.Constant)
{
using (var atrRef = new AttributeReference())
{
atrRef.SetAttributeFromBlock(atrDef, blRef.BlockTransform);
blRef.AttributeCollection.AppendAttribute(atrRef);
if (string.Equals(atrRef.Tag, "Test1", StringComparison.InvariantCultureIgnoreCase))
{
atrRef.TextString = "test string 1";
}
else if (string.Equals(atrRef.Tag, "Test2", StringComparison.InvariantCultureIgnoreCase))
{
atrRef.TextString = "test string 2";
}
}
}
}
}
}