[CommandMethod("getbrExtents")]
public void getBlockRefExtents()
{
var doc = Application.DocumentManager.MdiActiveDocument;
var ed = doc.Editor;
var db = doc.Database;
var peo
= new PromptEntityOptions
("\nSelect block reference"); peo.SetRejectMessage("\nNot a block reference");
peo
.AddAllowedClass(typeof(BlockReference
),
true); var pr = ed.GetEntity(peo);
if (pr.Status != PromptStatus.OK) return;
using (var tr = db.TransactionManager.StartTransaction())
{
var br = (BlockReference)tr.GetObject(pr.ObjectId, OpenMode.ForRead);
ed.WriteMessage("\n got extents: {0}", GetBlockExtents(br));
}
}
public Extents3d GetBlockExtents(BlockReference br)
{
using (var tr = br.Database.TransactionManager.StartTransaction())
{
HashSet
<Extents3d
> extents
= new HashSet
<Extents3d
>(); var btr = (BlockTableRecord)tr.GetObject(br.BlockTableRecord, OpenMode.ForRead);
foreach (ObjectId id in btr)
{
var ent = (Entity)tr.GetObject(id, OpenMode.ForRead);
if (id
.ObjectClass == RXObject
.GetClass(typeof(AttributeDefinition
))) {
var ad = (AttributeDefinition)ent;
if (ad.Constant && ad.Visible)
extents.Add(ad.GeometricExtents);
}
else if (ent.Visible)
{
extents.Add(ent.GeometricExtents);
}
}
foreach (ObjectId id in br.AttributeCollection)
{
var ent = (Entity)tr.GetObject(id, OpenMode.ForRead);
if (ent.Visible)
{
extents.Add(ent.GeometricExtents);
}
}
var minX = extents.Min(e => e.MinPoint.X);
var minY = extents.Min(e => e.MinPoint.Y);
var minZ = extents.Min(e => e.MinPoint.Z);
var maxX = extents.Max(e => e.MaxPoint.X);
var maxY = extents.Max(e => e.MaxPoint.Y);
var maxZ = extents.Max(e => e.MaxPoint.Z);
tr.Commit();
var brextents
= new Extents3d
(new Point3d
(minX, minY, minZ
),
new Point3d
(maxX, maxY, maxZ
)); brextents.TransformBy(br.BlockTransform);
return brextents;
}
}