利用linq获取在两点确定的矩形内的块参照
Query syntax:
private ObjectId[] FindBlockReferencesInRectangle(Point3d pt1, Point3d pt2, Database db) { using (Transaction tr = db.TransactionManager.StartOpenCloseTransaction()) using (Line line = new Line(pt1, pt2)) { Extents3d bound = line.GeometricExtents; BlockTableRecord modelSpace = (BlockTableRecord)tr.GetObject( SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead); Func<ObjectId, bool> isBlockReference = (id => id.ObjectClass == RXClass.GetClass(typeof(BlockReference))); Func<ObjectId, bool> isInside = (id => { BlockReference br = (BlockReference)tr.GetObject(id, OpenMode.ForRead); Extents3d exts = new Extents3d(bound.MinPoint, bound.MaxPoint); exts.AddExtents(br.GeometricExtents); return bound.IsEqualTo(exts); }); ; var blocks = from ObjectId id in modelSpace where isBlockReference(id) && isInside(id) select id; return blocks.ToArray(); } }
Extension methods syntax:
private ObjectId[] FindBlockReferencesInRectangle(Point3d pt1, Point3d pt2, Database db) { using (Transaction tr = db.TransactionManager.StartOpenCloseTransaction()) using (Line line = new Line(pt1, pt2)) { Extents3d bound = line.GeometricExtents; BlockTableRecord modelSpace = (BlockTableRecord)tr.GetObject( SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead); Func<ObjectId, bool> isBlockReference = (id => id.ObjectClass == RXClass.GetClass(typeof(BlockReference))); Func<ObjectId, bool> isInside = (id => { BlockReference br = (BlockReference)tr.GetObject(id, OpenMode.ForRead); Extents3d exts = new Extents3d(bound.MinPoint, bound.MaxPoint); exts.AddExtents(br.GeometricExtents); return bound.IsEqualTo(exts); }); return modelSpace .Cast<ObjectId>() .Where(isBlockReference) .Where(isInside) .ToArray(); } }