ADN Club > AutoCAD .NET API

Размер видимости динамического блока

(1/2) > >>

Александр_М:
Добрый день!

Задача такая. по координатам точки найти блок.
Вроде всё просто

--- Код - 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, который вы точно встретите в блоках)

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии