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

Автор Тема: Размер видимости динамического блока  (Прочитано 74 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Александр_МАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
Добрый день!

Задача такая. по координатам точки найти блок.
Вроде всё просто
Код - C# [Выбрать]
  1.  private BlockReference FindBlockAtPoint(Database db,Transaction tr, Point3d point)
  2. {
  3. BlockTableRecord modelSpace = tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead) as BlockTableRecord;
  4.  
  5.             double tolerance = 0.01;
  6.  
  7.             foreach (ObjectId id in modelSpace)
  8.             {
  9.                 if (id.ObjectClass.IsDerivedFrom(RXObject.GetClass(typeof(BlockReference))))
  10.                 {
  11.                     BlockReference blockRef = tr.GetObject(id, OpenMode.ForRead) as BlockReference;
  12.                     if (blockRef != null)
  13.                     {
  14.                        
  15.                         Extents3d extents = blockRef.GeometricExtents;
  16.                         if (point.X >= extents.MinPoint.X - tolerance && point.X <= extents.MaxPoint.X + tolerance &&
  17.                             point.Y >= extents.MinPoint.Y - tolerance && point.Y <= extents.MaxPoint.Y + tolerance)
  18.                         {
  19.                             return blockRef;
  20.                         }
  21.                     }
  22.                 }
  23.             }
  24. }

Но получается не так как хотелось.
У меня динамические блоки. у каждого блока несколько состояний видимости. В зависимости от видимости размер разный.
 blockRef.GeometricExtents возвращает размер всего блока, не только того что видимо, а вообще всего содержимого.

Если взять 2 блока с видимостью где блок маленький и поставить их рядом, то их GeometricExtents пересекаются.
выбираю точку на одном блоке, а находится 2 (в моём коде возвращается первый попавшийся).

Собственно вопрос
Как же найти границы реально отображаемой геометрии?



Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 851
  • Карма: 170
    • Мои плагины к Автокаду
Очевидно, мерить надо реально отображаемую геометрию. Берите все объекты из BTR блока (из безымянного экземпляра, конечно), проверяйте видмость, трансформируйте в модель, мерьте габариты... как-то так примерно.

Отмечено как Решение Александр_М 01-09-2025, 22:56:31

Оффлайн Александр_МАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
Поторопился с вопросом.
Нашёл ответ, может кому-то пригодится.

Код - C# [Выбрать]
  1. private static Extents3d GetGeometricExtents(BlockReference br)
  2.         {
  3.             var extents = new Extents3d();
  4.             using (var entitySet = new DBObjectCollection())
  5.             {
  6.                 br.Explode(entitySet);
  7.                 foreach (Entity entity in entitySet)
  8.                 {
  9.                     if (entity.Visible)
  10.                     {
  11.                         var bounds = entity.Bounds;
  12.                         if (bounds.HasValue)
  13.                         {
  14.                             extents.AddExtents(bounds.Value);
  15.                         }
  16.                     }
  17.                     entity.Dispose();
  18.                 }
  19.             }
  20.             return extents;
  21.         }
  22.  

Оффлайн Александр_МАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
Очевидно, мерить надо реально отображаемую геометрию. Берите все объекты из BTR блока (из безымянного экземпляра, конечно), проверяйте видмость, трансформируйте в модель, мерьте габариты... как-то так примерно.
Оказалось всё проще.
просто взорвать блок и замерить габариты геометрии.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 851
  • Карма: 170
    • Мои плагины к Автокаду
Это ровно то же самое. Только обработайте исключения - многие объекты не знают своих размеров (включая AttributeDifinition, который вы точно встретите в блоках)

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 851
  • Карма: 170
    • Мои плагины к Автокаду
BTW Еще объекты могут быть невидны на отключенных и замороженных слоях (и тут надо еще слой 0 как ПоБлоку учитывать).
и еще у AttributeDefinition есть свое свойство Invisible.
и не забудьте про рекурсию с вложенными блоками :)
Веселье только начинается :)))

Оффлайн Александр_МАвтор темы

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
BTW Еще объекты могут быть невидны на отключенных и замороженных слоях (и тут надо еще слой 0 как ПоБлоку учитывать).
и еще у AttributeDefinition есть свое свойство Invisible.
и не забудьте про рекурсию с вложенными блоками :)
Веселье только начинается :)))
Да, спасибо.
Но я планирую работу только со своими блоками.
Так что сюрпризов быть не должно.