• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Получить список внешних файлов IKompasDocument::GetExternalFilesNamesEx

Автор Екатерина11111, 31.05.20, 11:52:17

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

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

Екатерина11111

Всем здравствуйте!
Хочу получить список внешних файлов с помощью IKompasDocument1::GetExternalFilesNamesEx, но примеров использования на C++ не нашла, а руководство SDK не внесло ясности. Буду очень благодарна за помощь!
И ещё такой вопрос, как правильно подключать интерфейсы к проекту?  При подключении интерфейса IKompasDocument1 не определяется метод GetExternalFilesNamesEx, файла описывающего этот интерфейс в примерах КОМПАСа я тоже не нашла.

Екатерина11111

04.06.20, 14:27:43 #1 Последнее редактирование: 04.06.20, 15:02:49 от Екатерина11111
С подключением интерфейсов вроде разобралась,  но при вызове IKompasDocument1::GetExternalFilesNamesEx вылетает КОМПАС v18, пробовала переопределять виртуальную ф-цию raw_GetExternalFilesNamesEx, но при вызове та же история. Пробовала использовать свойство IKompasDocument1::ExternalFilesNames для вывода внешних файлов,
но ничего не происходит. Помогите новичку разобраться, где ошибка и что я делаю не так??
Файл Step_API.h
#include "resource.h"     
extern ksAPI7::IApplicationPtr newKompasAPI;
extern ksAPI7::IKompasDocument1;
extern ksExternalFilesTypesEnum;

// Создаем дочерний класс для переопределения метода
class KompasDocTest : public ksAPI7::IKompasDocument1 {
BOOL allFiles = true;
VARIANT * Files;
VARIANT * FilesTypes;
VARIANT_BOOL * Result = 0;

public: HRESULT __stdcall raw_GetExternalFilesNamesEx(
VARIANT_BOOL allFiles,
VARIANT * Files,
VARIANT * FilesTypes,
VARIANT_BOOL * Result) override {
    //вызываем метод базового класса         
    //ksAPI7::IKompasDocument1::GetExternalFilesNamesEx(true, Files, FilesTypes);
    }
};
#endif


Файл Step_API.cpp
//функция получения внешних ссылок
void GetExternal(ksAPI7::IKompasDocument3DPtr & doc) {

// Получить активный документ
doc = newKompasAPI->GetActiveDocument();
//если открыта 3д модель или сборка, вызываем метод GetExternalFilesNamesEx
if (doc && docType == lt_DocAssemble3D || docType == lt_DocPart3D)
{
BOOL allFiles = true;
VARIANT * Files;
VARIANT * FilesTypes;
VARIANT_BOOL * Result = 0;
VT_ARRAY; VT_BSTR; VT_I4;

ksAPI7::IKompasDocument1 * test;
KompasDocTest * test1;

test->GetExternalFilesNamesEx(true, Files, FilesTypes); // Получить  список внешних файлов
//test->GetExternalFilesNames(true);  //свой-во Получить список внешних файлов

return;
// Результат отработки метода
TCHAR buf[255];
_stprintf_s(buf, _T(" files = %s, types = %s"),
          Files, FilesTypes);
  MessageT(buf);
}
  else {
MessageT(_T("Откройте файл сборки или 3D-детали"));
}
}

Вы, считаете, как Вы предоставили код, его можно читать?

Екатерина11111

Цитата: Sabahs от 04.06.20, 14:34:48Вы, считаете, как Вы предоставили код, его можно читать?
Исправила

Vi2

Чтобы использовать интерфейс, его нужно сначала получить. И память для параметров тоже нужно выделять, хотя бы в локальных переменных.
//функция получения внешних ссылок
void GetExternal(ksAPI7::IKompasDocument3DPtr & doc) {

// Получить активный документ          //Vi2 наверное, он сюда передаётся?
if (!doc)                              //Vi2 Если нет, то можно и получить
doc = newKompasAPI->GetActiveDocument();

//если открыта 3д модель или сборка, вызываем метод GetExternalFilesNamesEx
if (doc && docType == lt_DocAssemble3D || docType == lt_DocPart3D)
{
BOOL allFiles = true;
_variant_t Files;                    //Vi2 здесь должна быть выделена память под приём массива
_variant_t FilesTypes;

ksAPI7::IKompasDocument1Ptr test = doc; //Vi2 здесь получаем нужный интерфейс

test->GetExternalFilesNamesEx(true, &Files, &FilesTypes); // Получить  список внешних файлов

return;
}
  else {
MessageT(_T("Откройте файл сборки или 3D-детали"));
}
}

Екатерина11111

Цитата: Vi2 от 07.06.20, 21:39:11Чтобы использовать интерфейс, его нужно сначала получить. И память для параметров тоже нужно выделять, хотя бы в локальных переменных.
//функция получения внешних ссылок
void GetExternal(ksAPI7::IKompasDocument3DPtr & doc) {

// Получить активный документ          //Vi2 наверное, он сюда передаётся?
if (!doc)                              //Vi2 Если нет, то можно и получить
doc = newKompasAPI->GetActiveDocument();

//если открыта 3д модель или сборка, вызываем метод GetExternalFilesNamesEx
if (doc && docType == lt_DocAssemble3D || docType == lt_DocPart3D)
{
BOOL allFiles = true;
_variant_t Files;                    //Vi2 здесь должна быть выделена память под приём массива
_variant_t FilesTypes;

ksAPI7::IKompasDocument1Ptr test = doc; //Vi2 здесь получаем нужный интерфейс

test->GetExternalFilesNamesEx(true, &Files, &FilesTypes); // Получить  список внешних файлов

return;
}
  else {
MessageT(_T("Откройте файл сборки или 3D-детали"));
}
}
Компас теперь не вылетает, но внешние ссылки по прежнему не выводит :(