Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: VetalBY от 29-05-2017, 14:59:27

Название: Получение всех зависимостей в dwg файле
Отправлено: VetalBY от 29-05-2017, 14:59:27
Добрый день.
Есть ли возможность получения всех зависимостей в файле dwg с помощью API?
Что-то вроде работы команды _etransmit , но нужен только список команд.
Что за eTransmit Interfaces ? Подойдет ли он для этой задачи? Может кто решал подобную задачу?
Название: Re: Получение всех зависимостей в dwg файле
Отправлено: Александр Ривилис от 29-05-2017, 15:24:18
Что-то вроде работы команды _etransmit , но нужен только список команд.
Список каких команд?
Название: Re: Получение всех зависимостей в dwg файле
Отправлено: VetalBY от 29-05-2017, 15:28:43
Список каких команд?
Пардон, файлов
Название: Re: Получение всех зависимостей в dwg файле
Отправлено: Александр Ривилис от 29-05-2017, 18:40:14
Начни с этого: http://adn-cis.org/vklyuchenie-shriftov-i-drugix-fajlov-pri-ispolzovanii-etransmit-api.html
Название: Re: Получение всех зависимостей в dwg файле
Отправлено: VetalBY от 30-05-2017, 12:52:34
Начни с этого: http://adn-cis.org/vklyuchenie-shriftov-i-drugix-fajlov-pri-ispolzovanii-etransmit-api.html
Да, похоже то, что нужно, достает все зависимости, жаль что .net и работает не с текущим файлом, но это, я думаю, решаемо.
Как-то не нашел поиск ни эту статью ни оригинал...
Спасибо.
Название: Re: Получение всех зависимостей в dwg файле
Отправлено: Александр Ривилис от 30-05-2017, 13:10:32
жаль что .net
Это не .NET, а COM. Так что можешь и из ObjectARX свободно использовать. Да и из внешнего exe думаю тоже будет работать. Необходим:
Код - C++ [Выбрать]
  1. #import "AcETransmit19.tlb"
AcETransmit19.tlb находится в ObjectARX SDK\inc-x64 или ObjectARX SDK\inc-win32

достает все зависимости
Сивиловские тоже? Я не проверял и упоминания среди параметров TransmittalInfo про Civil 3D не увидел, хотя про Inventor есть.
Название: Re: Получение всех зависимостей в dwg файле
Отправлено: VetalBY от 30-05-2017, 13:34:02
tlb я вижу, я из неё dll делал, чтобы в References добавить. Понятно, что работает через COM, пример на .net, я это имел ввиду, это не страшно :)
Название: Re: Получение всех зависимостей в dwg файле
Отправлено: VetalBY от 30-05-2017, 13:36:05
Сивиловские тоже?
Да, достает, проверял на Civil 2016. Сейчас хочу проверить на машине, где голый акад.
Название: Re: Получение всех зависимостей в dwg файле
Отправлено: Александр Ривилис от 30-05-2017, 13:50:05
Да, достает, проверял на Civil 2016.
Интересно где же он хранит эту информацию. Небось в каких-то словарях.
Название: Re: Получение всех зависимостей в dwg файле
Отправлено: VetalBY от 30-05-2017, 14:18:09
Чуда не произошло, чистый акад не увидел зависимости Civil.
А не может быть такого, что я могу реализовать какой-то интерфейс, который акад опросит, а я ему подброшу свои зависимости? (это я про то, что может не в словарях, а Civil подкидывает акаду зависимости?)
Название: Re: Получение всех зависимостей в dwg файле
Отправлено: Александр Ривилис от 30-05-2017, 15:19:13
А не может быть такого, что я могу реализовать какой-то интерфейс, который акад опросит, а я ему подброшу свои зависимости? (это я про то, что может не в словарях, а Civil подкидывает акаду зависимости?)
Теоретически это возможно.
Название: Re: Получение всех зависимостей в dwg файле
Отправлено: Александр Ривилис от 30-05-2017, 16:04:24
Кстати, а если установить Civil 3D Object Enabler - это не помогает?
Название: Re: Получение всех зависимостей в dwg файле
Отправлено: VetalBY от 30-05-2017, 16:18:32
Кстати, а если установить Civil 3D Object Enabler - это не помогает?
Не пробовал, попозже попробую и отпишусь.
Название: Re: Получение всех зависимостей в dwg файле
Отправлено: VetalBY от 30-05-2017, 17:45:33
C Enabler работает и код, и сама команда etransmit показывает зависимости, без него ни то, ни другое не показывают зависимостей на файлы объектов Civil.
Civil создает словарь ASE_INDEX_DICTIONARY, в нем запись ASEBlockHierarchyIndexRecord, возможно там ссылка на объект Civil, в котором и хранится информация о ссылках (предположение)
Название: Re: Получение всех зависимостей в dwg файле
Отправлено: Александр Ривилис от 30-05-2017, 19:25:41
C Enabler работает и код, и сама команда etransmit показывает зависимости, без него ни то, ни другое не показывают зависимостей на файлы объектов Civil.
Это решение тебя устроит или будешь копать дальше?
Название: Re: Получение всех зависимостей в dwg файле
Отправлено: VetalBY от 31-05-2017, 09:00:10
Это решение тебя устроит или будешь копать дальше?
Остановлюсь на этом решении, хотя оно меня не совсем устраивает по двум причинам:
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
Название: Re: Получение всех зависимостей в dwg файле
Отправлено: VetalBY от 31-05-2017, 13:42:34
Возможно кому-то пригодится код примера на 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.