четверг, 4 апреля 2019 г.

Выполнение программ NX Open внутри NX и снаружи

Решил проверить, как работает внешнее приложение написанное на Си++ с использованием NX Open.

Хочу сравнить, как работают внешнее и внутреннее приложения. Внешнее - это обычное консольное приложение, а внутреннее - это приложение NX.

У обычного приложения точка входа - функция main, а у приложения NX - функция ufusr.



Код консольного внешнего приложения:
#include <iostream>

#include <NXOpen/Session.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/ListingWindow.hxx>
#include <NXOpen/NXException.hxx>

#include <uf_ugopenint.h>

int main(int argc, char* argv[]) {
int retCode = 0;
NXOpen::Session *theSession = NXOpen::Session::GetSession();

if (theSession != NULL) {
NXOpen::BasePart *basePart1 = NULL;
NXOpen::PartLoadStatus *partLoadStatus1 = NULL;

try {
basePart1 = theSession->Parts()->OpenActiveDisplay("D:\\temp\\model.prt", NXOpen::DisplayPartOptionAllowAdditional, &partLoadStatus1);
std::cout << "Name: " << basePart1->Name().GetLocaleText() << std::endl;
} catch (NXOpen::NXException nxEx) {
retCode = 1;
}

NXOpen::ListingWindow *lw = theSession->ListingWindow();

if (lw != NULL) {
if (!lw->IsOpen()) {
lw->Open();
}

lw->WriteLine("Hello!");
}
}

return retCode;
}

Также понадобится внутреннее приложение с таким же кодом:

#include <NXOpen/Session.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/ListingWindow.hxx>
#include <NXOpen/NXException.hxx>

#include <uf_ugopenint.h>

void ufusr(char *param, int *retcode, int paramLen) {
NXOpen::Session *theSession = NXOpen::Session::GetSession();

if (theSession != NULL) {
NXOpen::BasePart *basePart1 = NULL;
NXOpen::PartLoadStatus *partLoadStatus1 = NULL;

try {
basePart1 = theSession->Parts()->OpenActiveDisplay("D:\\temp\\model.prt", NXOpen::DisplayPartOptionAllowAdditional, &partLoadStatus1);
} catch (NXOpen::NXException nxEx) {

}

NXOpen::ListingWindow *lw = theSession->ListingWindow();

if (lw != NULL) {
if (!lw->IsOpen()) {
lw->Open();
}

lw->WriteLine("Hello!");
}
}
}

int ufusr_ask_unload(void) {
return (NXOpen::Session::LibraryUnloadOption::LibraryUnloadOptionImmediately);
}


Начнём с приложения NX. После компиляции и сборки в dll библиотеку, создаём кнопку в NX для её запуска (Тип - NX Open, действие - наша dll библиотека). При нажатии на кнопку открывается файл model.prt и окно со строкой "Hello!".
Предсказуемо, ничего необычно.

Интересно, как поведёт себя внешняя программа.
При запуске внешнего приложения необходимо, как минимум, указать путь в переменной окружения PATH до папки с динамическими библиотеками NX Open.
Можно запустить приложение из командной строки NX. Там уже всё настроено. 

NX открыт и ждёт.
Запуск консольного приложения проходит обычно, в окне NX ничего не происходит, зато в консоли появляются строки "Name: model" и "Hello!". Кстати, если не выполнить функцию Open у ListingWindow, то надписи "Hello!" не будет.

Из этого напрашивается вывод, что функция GetSession во внешнем приложении создаёт какую-то свою сессию, а не получает её у NX'а. Программа открывает файл, т.к. нормально выводит его имя (basePart1->Name()) и даже есть ListingWindow (правда это сама консоль, а не отдельное окно), но это всё не связано с открытым NX.

Приложения NX на Java или C# работают точно так же, т.к. используют за основу библиотеки NX Open.

Попробовал запускать NX из консольного приложения, но это не дало положительных результатов.

В общем, кроме того что знал, ничего нового. Пока мне известен только один способ. Для управления запущенным NX'ом сторонней программой необходимо использовать удалённое управление. Серверная часть в виде приложения NX и клиентская часть в виде внешнего приложения, которое связывается с серверной частью и управляет NX'ом с её помощью.

Комментариев нет:

Отправить комментарий

Определение параметров CHS (Cylinder, Head, Sector) карт CF с помощью утилиты IDEINFO

 Столкнулся с проблемкой подключения карт CF к материнской плате LTC-SL REV-B и WD386SX-LPX. В БИОС этих плат нет автоопределения накопителе...