Получить масштаб Block refernces из другого файла

Автор Тема: Получить масштаб Block refernces из другого файла  (Прочитано 8763 раз)

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

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

  • One Breath
  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
  • Endless possibilities
Друзья!

Столкнулся с небольшой проблемой при решении одной задачки:
Дано Есть файлы dwg с блоками, эти блоки вставлены в модель с определенными масштабами.
Надо получить масштабы этих вхождений блоков, имена я их знаю. И проделать определенные манипуляции в текущем чертеже на основе этой информации (это я тоже знаю как сделать). Главное прочитать из внешних файлов масштабы блоков.
Задачка усложняется еще и тем, что это многовидовые блоки AutoCAD Architecture.
Мне хотя бы найти образец решения по обычным блокам, а с многовидовыми я как-нибудь по аналогии.
Есть такая хорошая команда - clonehelper, но к сожалению она клонирует только определения блоков, а мне еще надод считать масштабы вхождения экземпляра этого блока в пространстве модели.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
BlockReference.ScaleFactors

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

  • One Breath
  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
  • Endless possibilities
Спасибо Андрей!

Еще такой вопросик в продолжении этой темы - я прочитал Database нужного мне внешнего чертежа, достать оттуда определение блока (сам блок) я могу, а вот как достать вхождение этого блока в модель, т.е. его экземпляр - он в моем случае один, который вставлен в чертеж, желательно по имени этого блока? Ну а дальше вроде как понятно как действовать.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
BlockTableRecord.GetBlockReferenceIds

Если блок динамический (BlockTableRecord.IsDynamicBlock), то его вхождения, по факту, зачастую будут вхождениями анонимных блоков (имена начинаются со "звёздочки"). Т.о. тебе нужно будет воспользоваться BlockTableRecord.GetAnonymousBlockIds и уже для каждого из них, в свою очередь, проверять BlockTableRecord.GetBlockReferenceIds .
« Последнее редактирование: 29-04-2014, 12:09:09 от Андрей Бушман »

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

  • One Breath
  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
  • Endless possibilities
Блок, многовидовой в терминологии AutoCAD Architecture - MultiViewBlock - состоит из нескольких обычных блоков, которые связаны с видовыми представлениями. Ну типа вид в плане - условное изображение, в 3D - объемное, на разрезе - третье и т.п. Клонировать я их научился. Сейчас вот сижу и разбираюсь почему у меня в BlockTableRecord нет метода GetBlockReferencesIds.
Полное название - Autodesk.AutoCAD.DatabaseServices.BlockTableRecord?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Полное название - Autodesk.AutoCAD.DatabaseServices.BlockTableRecord?
да

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Цитировать
Сейчас вот сижу и разбираюсь почему у меня в BlockTableRecord нет метода GetBlockReferencesIds
Происки тёмных сил :)

На всякий случай поясняю: это экземплярные методы, а не статические.

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

  • One Breath
  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
  • Endless possibilities
Ну да, конечно, затупил немного как-то, отвлекают постоянно, вот и все мысли в кучу сбились, я ее вытаскиваю tr.getObject ну а дальше - дело техники.
В принципе все получилось, прочитал масштаб, осталось только разобраться в идентификации MultiviewBlockReference по стилю DictionaryMultiViewBlockDefinition. Как вернусь выложу сюда код того, чего получилось, может кому и пригодится.
Код - C# [Выбрать]
  1.         public Scale3d getMVBScale(string MVBblockName)
  2.         {
  3.             Scale3d RetValue = new Scale3d();
  4.            
  5.             if (SourceDirectoryDWGPath == null)
  6.             {
  7.                 // Source path empty
  8.  
  9.                 return RetValue;
  10.             }
  11.             try
  12.             {
  13.                 // Путь к файлу
  14.                 string SourcePath = SourceDirectoryDWGPath + "\\" + MVBblockName + ".DWG";
  15.                 Autodesk.AutoCAD.DatabaseServices.Database dbSource = new Database(false, true);
  16.                 dbSource.ReadDwgFile(SourcePath, System.IO.FileShare.Read, true, "");
  17.                 Autodesk.AutoCAD.DatabaseServices.TransactionManager tm = dbSource.TransactionManager;
  18.                 Transaction t = tm.StartTransaction();
  19.                 BlockTable bt = tm.GetObject(dbSource.BlockTableId, OpenMode.ForRead, false) as BlockTable;
  20.                 BlockTableRecord btr = tm.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite, false) as BlockTableRecord;
  21.                 foreach (Autodesk.AutoCAD.DatabaseServices.ObjectId id in btr)
  22.                 {
  23.                     try
  24.                     {
  25.                         Entity ent1 = tm.GetObject(id, OpenMode.ForRead) as Entity;
  26.                         string entType = ent1.GetType().ToString();
  27.  
  28.                         if(entType == "Autodesk.Aec.DatabaseServices.MultiViewBlockReference")
  29.                         {
  30.                             MultiViewBlockReference MVBRef = tm.GetObject(id, OpenMode.ForRead) as MultiViewBlockReference;
  31.                             RetValue = MVBRef.Scale;
  32.                         }
  33.                     }
  34.                     catch (Autodesk.AutoCAD.Runtime.Exception ex)
  35.                     {
  36.                         MessageBox.Show("Ошибка" + ex.Message);
  37.                     }
  38.                 }
  39.  
  40.                 t.Commit();
  41.                
  42.             }
  43.             catch (Autodesk.AutoCAD.Runtime.Exception ex)
  44.             {
  45.                 MessageBox.Show("Ошибка" + ex.Message);
  46.                 return RetValue;
  47.             }
  48.  
  49.             return RetValue;
  50.         }
  51.  
« Последнее редактирование: 29-04-2014, 18:11:22 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А если вместо:
Код - C# [Выбрать]
  1. Entity ent1 = tm.GetObject(id, OpenMode.ForRead) as Entity;
  2. string entType = ent1.GetType().ToString();
  3.  
  4. if(entType == "Autodesk.Aec.DatabaseServices.MultiViewBlockReference")
  5. {
  6.     MultiViewBlockReference MVBRef = tm.GetObject(id, OpenMode.ForRead) as MultiViewBlockReference;
  7.     RetValue = MVBRef.Scale;
  8. }
  9.  
написать:
Код - C# [Выбрать]
  1. MultiViewBlockReference MVBRef = tm.GetObject(id, OpenMode.ForRead) as MultiViewBlockReference;
  2. if(MVBRef != null) RetValue = MVBRef.Scale;
  3.  
то будет и красивее и правильнее (ты дважды открываешь один и тот же примитив).

А еще я не увидел t.Dispose();
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • One Breath
  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
  • Endless possibilities
AutoCAD 2014 С таким кодом падает.
Код - C# [Выбрать]
  1. MultiViewBlockReference MVBRef = tm.GetObject(id, OpenMode.ForRead) as MultiViewBlockReference;
  2. if(MVBRef != null) RetValue = MVBRef.Scale;
  3.  
Вот и пришлось извращаться. Про t.Dispose(); забыл, спасибо за подсказку.

Единственное, что у меня пока не получается это Jigging с уже заданным масштабом MVBlock'а. В этой теме http://adn-cis.org/forum/index.php?topic=274.0 я нашел как сделать Jig, только не могу понять как сделать его сразу же с заданным масштабом. Чтобы он уже масштабированным таскался за курсором перед вставкой.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
AutoCAD 2014 С таким кодом падает.
Так быть не должно. Как падает? Какие сообщения?
По второму вопросу в той теме.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • One Breath
  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
  • Endless possibilities
Падало из-за отсутствия в цикле t.Commit(); теперь не падает. В процессе "извращения кода" по всей видимости я просто добавил t.Commit() и падать перестало. А мне почему-то показалось что падало из-за другого.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Падало из-за отсутствия в цикле t.Commit();
Сомневаюсь. В этом случае происходит откат транзакции.
Цитировать
В процессе "извращения кода"
Скорее всего ты внёс исправление в ходе этого процесса.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Андрей Бушман.
Думаю, что Антон ошибся и имел в виду отсутствие t.Dispose(), а не t.Commit()
Впрочем возможно еще что-то...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • One Breath
  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
  • Endless possibilities
да конечно t.Dispose(), транзакция откатывается если нет t.Commit, просто отвлекают постоянно, вот и мешается все в голове.