Решил проверить, как работает внешнее приложение написанное на Си++ с использованием NX Open.
Хочу сравнить, как работают внешнее и внутреннее приложения. Внешнее - это обычное консольное приложение, а внутреннее - это приложение NX.
У обычного приложения точка входа - функция main, а у приложения NX - функция ufusr.
Код консольного внешнего приложения:
Хочу сравнить, как работают внешнее и внутреннее приложения. Внешнее - это обычное консольное приложение, а внутреннее - это приложение 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);
}
#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'ом с её помощью.
Комментариев нет:
Отправить комментарий