Как извлечь объекты их сборки?

Автор dosart, 10.02.15, 08:52:10

« назад - далее »

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

dosart

Требуется извлечь объекты из которых состоит сборка, для дальнейшей работы с ними.
Подскажите пожалуйста, как это можно сделать.

IPart7.PartsEx - Массив SAFEARRAY компонентов.
+ Благодарностей: 1

dosart

10.02.15, 22:00:03 #2 Последнее редактирование: 10.02.15, 22:14:58 от dosart
Sabahs, можно чуть более развёрнутый ответ?  Я не нашёл внятного описания описания IPart7.

Воспользуйтесь поиском, да и в справке вроде подробно расписано.
http://forum.ascon.ru/index.php/topic,3771.msg20448.html#msg20448
+ Благодарностей: 1

dosart

Sabahs, у меня совсем глупый вопрос -  если я хочу нарисовать, скажем, квадрат средствами API КОМПАСа в среде MVS, то что мне для этого нужно сделать.

Смотрите пример Step3 и Step3a в SDK.
+ Благодарностей: 1

dosart

Sabahs, насколько я понял, любое приложение использующее API КОМПАСа должно получить  указатель на базовый интерфейс KompasObject? Так ли это? Я смотрел примеры на С++ и С#, в частности step2. В С++ не происходит получение указателя на KompasObjec. Тогда как в C# это есть.

void ExternalRunCommand([In] short command, [In] short mode, [In, MarshalAs(UnmanagedType.IDispatch)] object kompas_).
Вот это строчка не понятна - MarshalAs(UnmanagedType.IDispatch) Не могли бы вы прокаментировать её.

Так почитайте в SDK пункт "Оформление прикладных библиотек типа ActiveX", там подробно расписано про ExternalRunCommand.
Собственно там идёт приведение интерфейса к одному из интерфейсов API5 или API7, в зависимости от того, что будут указан в функции IsOnApplication7.
Если Вы имеете ввиду пример c:\Program Files\ASCON\KOMPAS-3D V15\SDK\C++\Visualc\step2\, то там используются экспортные функции из LibTool - из kAPI2D5.dll.
PS. Могу и ошибаться, т.к. я на Си не программирую.
+ Благодарностей: 1

dosart

Sabahs, если у меня в приложении используется API5,   в частности, KompasObject и ksDocument3d то существует ли способ к этим объектам использовать API7 ?

Вы в DLL можете использовать API5, API7 и экспортные функции из LibTool, как всё это получить есть в примерах SDK.
+ Благодарностей: 1

dosart

Sabahs, из сборки можно вытащить имена файлов, в которых лежат компоненты? Причём вытащить нужно в иерархическом порядке, т.е провести декомпозиция сборки на компоненты, и из компоненты узнать имя файла.

IPart7.FileName - Имя файла компонента.
+ Благодарностей: 1

dosart

Sabahs, можно как нибудь извлечь данные в иерархическом порядке?
Из того, что есть сейчас вот:
public void AssemblyDecomposition()
       {
           if (doc != null)
           {
               //получить интерфейс на верхний компонент
               IPart7 TopComponent = doc.TopPart;
               if (TopComponent != null)
               {   
                   //получить интерфейс на коллекцию компонентов
                   IParts7 comCollection = TopComponent.Parts;
                   if (comCollection != null)
                   {

                       foreach (IPart7 element in comCollection)
                       {   
                           //если элемент деталь, то получаем имя детали
                           if (element.Detail)
                           {
                               string fileName = element.FileName;
                               Console.WriteLine(fileName);
                           }
                           //иначе если элемент сборка
                           else
                           {
                               //формируем коллекцию элементов сборки
                               IParts7 NewCollection = element.Parts;
                               foreach (IPart7 item in comCollection)
                               {
                                   string fileName = element.FileName;
                                   Console.WriteLine(fileName);
                               }


                           }
                           
                       }

                   }
               }
               
           }

Вроде должна возвращать всё, вроде и иерархия сохраняется, хотя нужно проверять.
http://forum.ascon.ru/index.php/topic,27478.msg205429.html#msg205429

dosart

Sabahs, вы не знаете, как использовать SAFEARRAY в C# ?

Смотрите пример:
c:\Program Files\ASCON\KOMPAS-3D V16\SDK\C#\Automation\Step3_API7_2D\Step3_API7_2D.cs
+ Благодарностей: 1

dosart

И всё же я не понимаю, какое значение(тип) мне должно вернуться, после использования PartsEx
Делаю так:
IKompasDocument3D doc;
IPart7 TopComponent = doc.TopPart;
TopComponent.PartsEx( ksPart7CollectionTypeEnum.ksAllParts);

Пример не судьба посмотреть, я в C# полный ноль, но если верить примеру, то должно быть так:
Array arr = (Array)TopComponent.PartsEx( ksPart7CollectionTypeEnum.ksAllParts);
+ Благодарностей: 1

dosart

Sabahs, если делать через PartsEx - всё хорошо(почти). Иерархия есть, компоненты сборки есть, файлы, в которых лежат компоненты есть(почти). Нет компонентов, которые в сборку должны входять, но физически  не присутствую. Например, на компьютере нет файлов, в которых эти компоненты присутсвуют.
Как это исправить?