Получение всех зависимостей в dwg файле

Автор Тема: Получение всех зависимостей в dwg файле  (Прочитано 8206 раз)

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

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

  • ADN Club
  • Сообщений: 44
  • Карма: 3
Добрый день.
Есть ли возможность получения всех зависимостей в файле dwg с помощью API?
Что-то вроде работы команды _etransmit , но нужен только список команд.
Что за eTransmit Interfaces ? Подойдет ли он для этой задачи? Может кто решал подобную задачу?

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

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

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

  • ADN Club
  • Сообщений: 44
  • Карма: 3
Список каких команд?
Пардон, файлов

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

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

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

  • ADN Club
  • Сообщений: 44
  • Карма: 3
Начни с этого: http://adn-cis.org/vklyuchenie-shriftov-i-drugix-fajlov-pri-ispolzovanii-etransmit-api.html
Да, похоже то, что нужно, достает все зависимости, жаль что .net и работает не с текущим файлом, но это, я думаю, решаемо.
Как-то не нашел поиск ни эту статью ни оригинал...
Спасибо.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
жаль что .net
Это не .NET, а COM. Так что можешь и из ObjectARX свободно использовать. Да и из внешнего exe думаю тоже будет работать. Необходим:
Код - C++ [Выбрать]
  1. #import "AcETransmit19.tlb"
AcETransmit19.tlb находится в ObjectARX SDK\inc-x64 или ObjectARX SDK\inc-win32

достает все зависимости
Сивиловские тоже? Я не проверял и упоминания среди параметров TransmittalInfo про Civil 3D не увидел, хотя про Inventor есть.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 44
  • Карма: 3
tlb я вижу, я из неё dll делал, чтобы в References добавить. Понятно, что работает через COM, пример на .net, я это имел ввиду, это не страшно :)

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

  • ADN Club
  • Сообщений: 44
  • Карма: 3
Сивиловские тоже?
Да, достает, проверял на Civil 2016. Сейчас хочу проверить на машине, где голый акад.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Да, достает, проверял на Civil 2016.
Интересно где же он хранит эту информацию. Небось в каких-то словарях.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 44
  • Карма: 3
Чуда не произошло, чистый акад не увидел зависимости Civil.
А не может быть такого, что я могу реализовать какой-то интерфейс, который акад опросит, а я ему подброшу свои зависимости? (это я про то, что может не в словарях, а Civil подкидывает акаду зависимости?)

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

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Кстати, а если установить Civil 3D Object Enabler - это не помогает?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 44
  • Карма: 3
Кстати, а если установить Civil 3D Object Enabler - это не помогает?
Не пробовал, попозже попробую и отпишусь.

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

  • ADN Club
  • Сообщений: 44
  • Карма: 3
C Enabler работает и код, и сама команда etransmit показывает зависимости, без него ни то, ни другое не показывают зависимостей на файлы объектов Civil.
Civil создает словарь ASE_INDEX_DICTIONARY, в нем запись ASEBlockHierarchyIndexRecord, возможно там ссылка на объект Civil, в котором и хранится информация о ссылках (предположение)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
C Enabler работает и код, и сама команда etransmit показывает зависимости, без него ни то, ни другое не показывают зависимостей на файлы объектов Civil.
Это решение тебя устроит или будешь копать дальше?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 44
  • Карма: 3
Это решение тебя устроит или будешь копать дальше?
Остановлюсь на этом решении, хотя оно меня не совсем устраивает по двум причинам:
1. Происходит повторное открытие документа, это время, но от этого, похоже, не уйти, если использовать эту библиотеку.
2. Нужен как минимум enabler, из словаря поднять информацию было бы гораздо интереснее, но по-моему это не реально. Да и не факт, что эта информация там есть.
Возможно все-таки приложения сами подкидывают зависимости для etransmit:
While working with a transmittal set, you can register event handlers that allow the Transmittal engine to communicate with a custom program. The ITransmittalDatabaseNotificationHandler and ITransmittalAddFileNotificationHandler interfaces provide notifications to third-party applications whenever a transmittal set is created or a file is added to a transmittal set, respectively.
https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2016/ENU/AutoCAD-ActiveX/files/GUID-25638F6D-D65B-4538-95D0-8B21D300107B-htm.html

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

  • ADN Club
  • Сообщений: 44
  • Карма: 3
Возможно кому-то пригодится код примера на C++ (без обработки ошибок).
Потребуется #import библиотеки типов AcETransmit*.tlb (находится в ObjectARX SDK\inc-x64 или ObjectARX SDK\inc-win32)

Код - C++ [Выбрать]
  1. void DependentFiles()
  2. {
  3.         ITransmittalOperationPtr to;
  4.  
  5.         HRESULT hRes = CoCreateInstance(CLSID_TransmittalOperation, NULL, CLSCTX_INPROC_SERVER, IID_ITransmittalOperation, (void **)&to);
  6.  
  7.         ITransmittalFilePtr tf;
  8.         ITransmittalInfoPtr ti;
  9.         to->getTransmittalInfoInterface(&ti);
  10.  
  11.         ti->put_includeDataLinkFile(1);
  12.         ti->put_includeDGNUnderlay(1);
  13.         ti->put_includeDWFUnderlay(1);
  14.         ti->put_includeFontFile(1);
  15.         ti->put_includeImageFile(1);
  16.         ti->put_includeInventorProjectFile(1);
  17.         ti->put_includeInventorReferences(1);
  18.         ti->put_includeMaterialTextureFile(1);
  19.         ti->put_includeNestedOverlayXrefDwg(1);
  20.         ti->put_includePDFUnderlay(1);
  21.         ti->put_includePhotometricWebFile(1);
  22.         ti->put_includePlotFile(1);
  23.         ti->put_includeUnloadedXrefDwg(1);
  24.         ti->put_includeXrefDwg(1);
  25.  
  26.  
  27.         _bstr_t dwgFile = _T("C:\\Temp\\Sample.dwg");
  28.         AddFileReturnVal retVal;
  29.         to->addDrawingFile(dwgFile, &tf, &retVal);
  30.         if (retVal == eFileAdded)
  31.         {
  32.                 ITransmittalFilesGraphPtr tfg;
  33.                 to->graphInterfacePtr(&tfg);
  34.  
  35.                 ITransmittalFilePtr rootTF;
  36.                 tfg->getRoot(&rootTF);
  37.  
  38.                 DisplayDependent(rootTF);
  39.         }
  40. }
  41.  
  42. void DisplayDependent(ITransmittalFilePtr tf)
  43. {
  44.         int numberOfDependents;
  45.         tf->get_numberOfDependents(&numberOfDependents);
  46.         for (int i = 0; i < numberOfDependents; ++i)
  47.         {
  48.                 ITransmittalFilePtr childTF;
  49.                 tf->getDependent(i, &childTF);
  50.  
  51.                 FileType ft;
  52.                 childTF->get_FileType(&ft);
  53.  
  54.                 _bstr_t sourcePath;
  55.                 childTF->get_sourcePath(sourcePath.GetAddress());
  56.  
  57.                 acutPrintf(_T("\n зависит %d - %s"), ft, (LPTSTR)sourcePath);
  58.  
  59.                 DisplayDependent(childTF);
  60.         }
  61. }
  62.  
« Последнее редактирование: 31-05-2017, 13:43:43 от Александр Ривилис »