Как узнать на каком листе находится объект

Автор Тема: Как узнать на каком листе находится объект  (Прочитано 8052 раз)

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

Оффлайн AlexxАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Как можно проще всего узнать на каком листе находится объект?
Сейчас я делаю примерно вот так:

Код - C# [Выбрать]
  1. public static Dictionary<string, List<ObjectId>> GetLayoutObjects(this Database db)
  2. {
  3.     var result = new Dictionary<string, List<ObjectId>>();
  4.  
  5.     using(Transaction tr = db.TransactionManager.StartOpenCloseTransaction())
  6.     {
  7.         var ltDic = (DBDictionary)tr.GetObject(
  8.             db.LayoutDictionaryId, OpenMode.ForRead);
  9.  
  10.         foreach (var ltRec in ltDic)
  11.         {
  12.             var lt = (Layout)tr.GetObject(ltRec.Value,
  13.                 OpenMode.ForRead);
  14.  
  15.             result.Add(lt.LayoutName,
  16.                 new List<ObjectId>());
  17.  
  18.             var blkIds = new Stack<ObjectId>();
  19.             blkIds.Push(lt.BlockTableRecordId);
  20.  
  21.             while(blkIds.Count > 0)
  22.             {
  23.                 var blk = (BlockTableRecord)tr.GetObject(
  24.                     blkIds.Pop(), OpenMode.ForRead);
  25.  
  26.                 foreach(var objId in blk)
  27.                 {
  28.                     var obj = tr.GetObject(objId,
  29.                         OpenMode.ForRead);
  30.  
  31.                     if(obj is BlockReference)
  32.                         blkIds.Push((obj as BlockReference).BlockTableRecord);
  33.  
  34.                     result[lt.LayoutName].Add(objId);
  35.                 }
  36.             }
  37.         }
  38.     }
  39.  
  40.     return result;
  41. }

Может есть какой-то более лаконичный способ? Погуглил, но ничего полезного не нашел :(

Отмечено как Решение Александр Ривилис 23-10-2015, 14:26:28

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Что-то код не соотвествует постановке вопроса. Допустим у тебя есть примитив с известным ObjectId id и ты знаешь, что он находится непосредственно на одном из листов (а не внутри одного из описаний блоков, вставленных на лист).
Вот код:
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7.  
  8. #pragma warning disable 0618
  9.  
  10. [assembly: CommandClass(typeof(Rivilis.GetLayoutName))]
  11.  
  12. namespace Rivilis
  13. {
  14.   public class GetLayoutName
  15.   {
  16.     [CommandMethod("GetLayoutName")]
  17.     public void MyCommand()
  18.     {
  19.       Document doc = Application.DocumentManager.MdiActiveDocument;
  20.       if (doc == null) return;
  21.       Editor ed = doc.Editor;
  22.       Database db = doc.Database;
  23.       PromptEntityResult rs = ed.GetEntity("\nВыберите примитив: ");
  24.       if (rs.Status != PromptStatus.OK) return;
  25.       ObjectId id = rs.ObjectId;
  26.       using (Entity en = id.Open(OpenMode.ForRead) as Entity) {
  27.         ObjectId idBlock = en.BlockId;
  28.         using (BlockTableRecord btr = idBlock.Open(OpenMode.ForRead) as BlockTableRecord) {
  29.           if (!btr.IsLayout) {
  30.             ed.WriteMessage("\nПримитив не на листе!");
  31.             return;
  32.           } else {
  33.             ObjectId idLayout = btr.LayoutId;
  34.             using (Layout layout = idLayout.Open(OpenMode.ForRead) as Layout) {
  35.               ed.WriteMessage("\nПримитив {0} находится на листе: {1}", id, layout.LayoutName);
  36.             }
  37.           }
  38.         }
  39.       }
  40.     }
  41.   }
  42. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AlexxАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Да, код немного не в тему вопроса. Если быть точнее, то мне нужно собрать все примитивы с листа, включая примитивы в описаниях блоков, находящихся на листах (при этом транслировать координаты объектов в блоке, в координаты листа). Да, я видел примеры, где получают у примитива BlockId или OwnerId... Но мне нужны и примитивы во вложенных блоках. Еще видел примеры со "взрыванием" блоков, но это как-то слишком заморочено. Ладно, я так понял простого решения нет. Спасибо!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Если быть точнее, то мне нужно собрать все примитивы с листа, включая описания блоков, находящихся на листах (при этом транслировать координаты объектов в блоке, в координаты листа).
На листах могут быть только вставки блоков, а не их описания. Задачу я так и не понял. Постарайся формулировать её четче.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AlexxАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Попробую... Мне нужно получить все примитивы на листе, которые видит пользователь (если они есть, но их не видно по разным причинам, то они не нужны) :-)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Мне нужно получить все примитивы на листе, которые видит пользователь (если они есть, но их не видно по разным причинам, то они не нужны) :-)
Не очень понятно зачем это может понадобится. Возможно основная задача имеет более простое решение.
Как трактовать примитив, который находится в описании блока и вставлен в один (или несколько) листов, да еще и возможно несколько раз, да еще и на разные слои, часть которых выключена/заморожена???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AlexxАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Основная задача такая:

Чертеж распечатывается в файл JPEG, описание примитивов сохраняются в файл XML и все это запаковывается в архив.
Далее этот архив открывается клиентским приложением, в котором верхняя часть окна отображает изображение листа, а в нижней части находится таблица с описанием примитивов. Если пользователь выделяет строку таблицы, то на изображении в районе выделенного примитива рисуется рамка и изображение масштабируется и центрируется чтобы пользователь мог разглядеть примитив.
Если пользователь щелкает на изображении примитива, то таблица скроллится до нужной записи.

Собственно почти все уже сделано, но хотелось бы чтобы экспорт как-то пошустрее был.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
а в нижней части находится таблица с описанием примитивов
Описание AutoCAD'овских примитивов???
Ну а если серьезно, то скорее всего нужно было-бы запустить выбор всего видимого на экране (Editor.SelectWindow), потом его рекурсивно расчленить до примитивов, ну и выводить в файл. Думаю, что это простейший способ.

P.S.: Я отмечу мой ответ как решение, так он (IMHO) в точности соотвествует заголовку темы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AlexxАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 1
Да, описание AutoCAD-овских примитивов (не всех).

Ну а если серьезно, то скорее всего нужно было-бы запустить выбор всего видимого на экране (Editor.SelectWindow), потом его рекурсивно расчленить до примитивов, ну и выводить в файл. Думаю, что это простейший способ.

Да, такой вариант я рассматривал, но потом решил использовать DWG True View, а не AutoCAD для экспорта (в силу финансовых ограничений) и этот вариант отпал :)

В любом случае, спасибо Вам за ответы. Много нового узнал :)