ADN Club > AutoCAD .NET API
Размер видимости динамического блока
Александр_М:
Добрый день!
Задача такая. по координатам точки найти блок.
Вроде всё просто
--- Код - C# [Выбрать] --- private BlockReference FindBlockAtPoint(Database db,Transaction tr, Point3d point){BlockTableRecord modelSpace = tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead) as BlockTableRecord; double tolerance = 0.01; foreach (ObjectId id in modelSpace) { if (id.ObjectClass.IsDerivedFrom(RXObject.GetClass(typeof(BlockReference)))) { BlockReference blockRef = tr.GetObject(id, OpenMode.ForRead) as BlockReference; if (blockRef != null) { Extents3d extents = blockRef.GeometricExtents; if (point.X >= extents.MinPoint.X - tolerance && point.X <= extents.MaxPoint.X + tolerance && point.Y >= extents.MinPoint.Y - tolerance && point.Y <= extents.MaxPoint.Y + tolerance) { return blockRef; } } } }}
Но получается не так как хотелось.
У меня динамические блоки. у каждого блока несколько состояний видимости. В зависимости от видимости размер разный.
blockRef.GeometricExtents возвращает размер всего блока, не только того что видимо, а вообще всего содержимого.
Если взять 2 блока с видимостью где блок маленький и поставить их рядом, то их GeometricExtents пересекаются.
выбираю точку на одном блоке, а находится 2 (в моём коде возвращается первый попавшийся).
Собственно вопрос
Как же найти границы реально отображаемой геометрии?
avc:
Очевидно, мерить надо реально отображаемую геометрию. Берите все объекты из BTR блока (из безымянного экземпляра, конечно), проверяйте видмость, трансформируйте в модель, мерьте габариты... как-то так примерно.
Александр_М:
Поторопился с вопросом.
Нашёл ответ, может кому-то пригодится.
--- Код - C# [Выбрать] ---private static Extents3d GetGeometricExtents(BlockReference br) { var extents = new Extents3d(); using (var entitySet = new DBObjectCollection()) { br.Explode(entitySet); foreach (Entity entity in entitySet) { if (entity.Visible) { var bounds = entity.Bounds; if (bounds.HasValue) { extents.AddExtents(bounds.Value); } } entity.Dispose(); } } return extents; }
Александр_М:
--- Цитата: avc от 01-09-2025, 22:55:27 ---Очевидно, мерить надо реально отображаемую геометрию. Берите все объекты из BTR блока (из безымянного экземпляра, конечно), проверяйте видмость, трансформируйте в модель, мерьте габариты... как-то так примерно.
--- Конец цитаты ---
Оказалось всё проще.
просто взорвать блок и замерить габариты геометрии.
avc:
Это ровно то же самое. Только обработайте исключения - многие объекты не знают своих размеров (включая AttributeDifinition, который вы точно встретите в блоках)
Навигация
Перейти к полной версии