Jump to content

Связь структуры сборки в NX и Teamcenter


NDE

Recommended Posts

Предисловие: "Или я слишком глубоко копаю и не вижу ответа на поверхности, или тут что-то действительно не так".

Как организована интеграция NX и Teamcenter в части загрузки сборок и хранения информации о компонентах.

Исходные данные: NX10, Teamcenter 11.6, испоьзование SOA из поставки NX, язык C/C++.

Задача: из User Function NX читать атрибуты строк BOM и записывать их.

Как я реализовал это сейчас::

Получаю сессию, открытую NX:

            NXOpen::Session *theSession = NXOpen::Session::GetSession();
            NXOpen::PDM::PdmSession *thePdmSession = theSession->PdmSession();
            connectionHandle = thePdmSession->GetSoaConnectionHandle();
            Teamcenter::Soa::Client::Connection* tcSoaConnection = reinterpret_cast<Teamcenter::Soa::Client::Connection*>(connectionHandle->GetHandle());

Нахожу в базе ревизию сборки:

dmSrev = Teamcenter::Services::Core::DatamanagementService::getService(tcSoaConnection);
std::vector< Teamcenter::Services::Core::_2007_01::Datamanagement::GetItemFromIdInfo > query(1);
Teamcenter::Services::Core::_2007_01::Datamanagement::GetItemFromIdPref pref;
Teamcenter::Soa::Client::Model::ItemRevision *itemRevision;
Teamcenter::Soa::Client::Model::Item *item;
std::vector<  Teamcenter::Soa::Client::ModelObject * > objs(1);
query[0].itemId = object_id.GetUTF8Text();
query[0].revIds.push_back(object_rev.GetUTF8Text());
Teamcenter::Services::Core::DatamanagementService::GetItemFromIdResponse item_bom_response = dmSrev->getItemFromId(query, 1, pref);

Создаю новое окно BOMWindow:

itemRevision = item_bom_response.output[0].itemRevOutput[0].itemRevision;
item = item_bom_response.output[0].item;
bom_info[0].item = item;
bom_info[0].itemRev = itemRevision;
bom_info[0].clientId = "InfoDSERequest";
bom_info[0].bomView = nullptr;
bom_info[0].objectForConfigure = nullptr;
bom_info[0].activeAssemblyArrangement = nullptr;
bom_info[0].revRuleConfigInfo = revRuleConfigInfo;
Teamcenter::Services::Cad::StructuremanagementService *structServ = Teamcenter::Services::Cad::StructuremanagementService::getService(tcSoaConnection);
Teamcenter::Services::Cad::_2007_01::Structuremanagement::CreateBOMWindowsResponse bomWindow = structServ->createBOMWindows(bom_info);
topLine = bomWindow.output[0].bomLine;

Дальше перебираю BOMLine, ищу UG ENTITY HANDLE, совпадающие с хэндлом в NX (с отбрасыванием от хэндла версионной информации, т.е. первые 28 символов):

cur_line = dynamic_cast<Teamcenter::Soa::Client::Model::BOMLine *>(child_lines[i]);
ent_handle = cur_line->get_UG_ENTITY_HANDLE();
UF_TAG_decompose_handle	((char*)ent_handle.c_str(), &file_data, &sub_file_id, &versio);
child_file_data = file_data;
UF_free(file_data);
instance_file_data.resize(28);
child_file_data.resize(28);
if (!instance_file_data.compare(child_file_data) && instance_sub_file_id==sub_file_id) // Сравнение искомого компонента с каждой строкой BOMLine
{
	Чтение атрибутов, например, seq_no = cur_line->get_bl_occ_int_order_no();  
}

 

Считаю что это неэффективно, да и вообще неправильно.

Если посмотреть, что создаёт NX в кэше SOA с помощью

	Teamcenter::Soa::Client::ModelObjectVector all_objs;
	tcSoaConnection->getModelManager()->getObjectsFromStore(all_objs);

То мы увидим там и BOMWindow  и BOMLine и PSOccurrence и PSOccurrenceThread. Т.е. уже всё открыто и по идее надо работать именно с этими объектами. Но я, хоть убей, не могу найти связь между компонентом сборки NX и объектом TC.

Максимум, что я накопал штатными средствами:

Можно получить хэндл в БД для PendingComponents (естественно, NX Component для них ещё отсутствует). Хэндл имеет следующий вид: "wCpJ4WwyhfM7oB 0WhJ4WwyhfM7oB 2tpdxbGAhfM7oB". Это 3 UIds в Teamcenter. Первый - это UId айтема/ревизии, второй - PSBOMView, третий PSOccurrenceThread.

Не штатными средствами, если импортировать функцию UGMGR_NX_ask_db_comp_handle_uids из LIBUGMR.DLL, можно получить такой же набор UIds для любого компонента NX или только PSOccurrenceThread  с помощью UGMGR_NX_ask_occ_thread_of_instance:

HINSTANCE  lib = nullptr;
typedef int(__cdecl *INT_TAG_CHAR_PROC)(tag_t, char **);
typedef int(__cdecl *INT_TAG_CHAR3_PROC)(tag_t, char **,char ** ,char **);
INT_TAG_CHAR3_PROC UGMGR_NX_ask_db_comp_handle_uids;
INT_TAG_CHAR_PROC UGMGR_NX_ask_occ_thread_of_instance;
lib = LoadLibraryA("LIBUGMR.DLL");
UGMGR_NX_ask_db_comp_handle_uids = (INT_TAG_CHAR3_PROC)GetProcAddress(lib, "?UGMGR_NX_ask_db_comp_handle_uids@@YAHIPEAPEAD00@Z");
UGMGR_NX_ask_occ_thread_of_instance =  (INT_TAG_CHAR_PROC)GetProcAddress(lib, "?UGMGR_NX_ask_occ_thread_of_instance@@YAHIPEAPEAD@Z");

tag_t inst_tag = UF_ASSEM_ask_inst_of_part_occ(pComponent->Tag());
UGMGR_NX_ask_db_comp_handle_uids(inst_tag, &buf, &buf1, &buf2);
UGMGR_NX_ask_occ_thread_of_instance(inst_tag, &buf);

 

Эти функции написаны на C без использования ООП, поэтому мне удалось их использовать. Аналогичных функций в UGOpen я не нашёл. В принципе в LIBUGMR.DLL имеются функции для работы с BOM, но они уже на C++  с использованием классов, а лезть в это без исходной документации не лучшая идея. Да и противоречит лицензионной политике :smile:.

 

И вот собственно вопросы.

1. Как перейти от PSOccurrenceThread к PSOccurrence или BOMLine? (Для этого нужно знать, в каком BOMWindow искать).

2. Как найти нужный BOMWindow?

 

Примечания:

1. Может быть есть штатные функции получения хэндла в БД на основе instance или occurrence в NX?

2. NX создаёт BOMWindow в следующих случаях: при первом открытии сборки. отдельные BOMWindow для подсборок не создаются. Но если сначала открыть подсборку, а потом вышестоящую сборку, то в системе будет создано 2 BOMwindow.

3. NX не закрывает созданные BOMWindow до конца сессии (видимо поэтому и память потребляет как не в себя). Например, если открыть сборку, потом закрыть её и снова открыть, NX создаст 2 BOMWindow.

  • Нравится 1
Link to post
Share on other sites


UnPinned posts

Ни hrena не понял ...

Задачу бы лучше с технической/материалистичной стороны описали ...
 

Link to post
Share on other sites

Собственно доработка ПО, различные утилиты DLL (User functions), написанные с помощью UGOpen. Из NX необходимо читать (и по возможности записывать) атрибуты в BOM Teamcenter.  Ограничение версии NX - 10. А он, как известно, не умеет работать с атрибутами BOM line, с типами, отличающимися от строковых.

 

Пример, есть атрибут в BOM - номер вхождения с типом integer. При работе в NX необходимо знать, какой атрибут присвоен конкретному компоненту. Штатными средствами увидеть это невозможно (в сборку входит деталь несколько раз с разными значениями этого атрибута и просто визуально посмотреть в Менеджере структуры и потом в навигаторе сборки NX и понять, что к чему относится - невозможно). Да и каменный век это :smile:

Edited by NDE
Link to post
Share on other sites
05.12.2024 в 06:05, NDE сказал:

Собственно доработка ПО, различные утилиты DLL (User functions), написанные с помощью UGOpen. Из NX необходимо читать (и по возможности записывать) атрибуты в BOM Teamcenter.  Ограничение версии NX - 10. А он, как известно, не умеет работать с атрибутами BOM line, с типами, отличающимися от строковых.

 

Пример, есть атрибут в BOM - номер вхождения с типом integer. При работе в NX необходимо знать, какой атрибут присвоен конкретному компоненту. Штатными средствами увидеть это невозможно (в сборку входит деталь несколько раз с разными значениями этого атрибута и просто визуально посмотреть в Менеджере структуры и потом в навигаторе сборки NX и понять, что к чему относится - невозможно). Да и каменный век это :smile:

Тоже интересовался этим вопросом 2 года назад, ответа не получил, НО знаю что это реализовано на одном из предприятий. Если узнаете как в NX получить/вывести хоть как то получится добраться до порядкового номера вхождения ТС, ПНИТЕ!!!

Edited by butulec
  • Нравится 1
Link to post
Share on other sites
05.12.2024 в 06:05, NDE сказал:

Собственно доработка ПО, различные утилиты DLL (User functions), написанные с помощью UGOpen. Из NX необходимо читать (и по возможности записывать) атрибуты в BOM Teamcenter. 

 

точно не могу вспомнить , но вроде NX поддерживает написание макросов , vb или vba  - не помню конкретно , но с помощью макроса можно вызвать код в какой нибудь написанной для этого dll или отдельной программулины , для извлечения данных напрямую из БД ТС с помощью ODBC
если нужный вам параметр есть в базе данных - вы его получите или сможете добавить или изменить 

предварительно можно раскурить структуру каталогов БД с помощью утилит и наити нужные вам поля в таблицах ...
не помню в какои теме точно - но где то давал ссылку или саму такую утилиту для работы и поиска в MS SQL  базах данных ...
нужно если - посмотрю , вспомню , и наиду подобное ...

Если у вас в ТС используется MS SQL  - то примеров на learn microsoft описание ODBS -  куча 
Да, сложновато работать с этой ODBS, но описание всех методов есть на обучалке микрософта ... 


Да и дрова ODBS уже установлены в винде , нужно их только использовать ...

 

Edited by esergey
добавил текст про утилиты
Link to post
Share on other sites

вспомнил  -  Qt 563 я собирал и там есть живые примеры написания длл или екзе с использованием доступа к MS SQL с помощью ODBC
если нужны исходник Qt и как собирать - тоже где то у меня есть , и не только 563 и более поздние 5 версии , помоему до 5 12 , которая позволяет собирать Qt без имени пользователя и пароля зарегенного у них на сайте пользователя ...

Функции для работы с данными

Edited by esergey
Link to post
Share on other sites
Цитата

точно не могу вспомнить , но вроде NX поддерживает написание макросов , vb или vba  - не помню конкретно , но с помощью макроса можно вызвать код в какой нибудь написанной для этого dll или отдельной программулины , для извлечения данных напрямую из БД ТС с помощью ODBC
если нужный вам параметр есть в базе данных - вы его получите или сможете добавить или изменить 

Лезть напрямую в БД не является хорошим тоном. Все атрибуты читаются и пишутся штатными средствами SOA. Проблема именно в установлении соответствия runtime объектов SOA (BOMWindow и BOMLine), загруженных в NX с компонентами NX. Для чтения атрибутов, я могу создать новое окно BOMWindow, установить необходимую сборку в качестве TopLine, и идентифицировать компоненты со строками BOM через UG_ENTITY_HANDLE.  Но если я попытаюсь перезаписать атрибуты и сохранить BOMWindow  - произойдёт переопределение атрибутов. Я не знаю как на это отреагирует NX, скорее всего выдаст ошибку при сохранении сборки, что структура имеет более позднее сохранение и не даст её сохранить. Пока не пробовал, надо провести эксперимент :smile:. Но, если есть объекты, с которыми уже работает NX, по хорошему надо менять именно их.

Link to post
Share on other sites
  • 1 month later...
lexx174

а в чем проблема прочитать соответствующим TC SOA API свойство BOMLine? Или я не понял верно вопрос?

Выглядит вышеописанное непонятным до конца 

 

Если надо работать в обе стороны с TC BOM - для этого есть TC SOA API и возможность использовать это из NX OPEN API, что вы и делали выше.

 

Может разберем для начала какой-то частный простой пример, что нужно прочитать/записать?

Edited by lexx174
Link to post
Share on other sites

Проблем читать/писать свойства объектов - нет. Проблема в идентификации. В сессии NX уже загружена сборка с компонентами. Соответственно созданы Runtime объекты BOMLine. Как определить, какой BOMLine соответствует конкретному компоненту. Дело в том, что если создавать новый BOMWindow, то его придётся сохранять после записи, это приведёт к тому что будет невозможно сохранить сборку. Если менять свойства в соответствующих PSOccurrence - то при сохранении сборки NX перезапишет свойства из BOMLine.

И NX ведёт себя не по человечески - после закрытия сборки и повторного её открытия он не закрывает предыдущий BOMWindow, а создаёт новый, соответственно в сессии может присутствовать несколько дублей BOMLine и я не могу отличить те, которыми пользуется NX в данный момент от тех, которые уже неактуальны. А это предпосылка к ошибке.

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.



  • Сообщения

    • streamdown
      Погуглил. Карта за 300 тыщ. С такой производительностью там всё вокруг неё будет тоже в районе 300 тыщ))) Итого: нужен энтузиаст который потратится на пол-ляма чтоб в сапр2000 картинки из кривого солида-бенчмарка выложить. @ANT0N1DZE а какой вы ищете на инженерном (где люди деньги за мозги получают) форуме результат? Ну, тесты такой карты для чего? Для солида???)))
    • mamomot
      Тема публикации: первое из четырех приложений Нормали 5340 "Гибка пружин кручения". Приложение А - "Элементы типовые". 5_4_3 Нормаль ОГТ Приложение А.pdf
    • BSV1
      Повторное использование порошковой краски
    • RTYG55
      с клавишами попробовал сейчас, всё так же. привязка к сетке-то работать будет, когда включена сетка, а я её не включаю, ибо в глазах рябит. ну и шаг сетки придётся постоянно менять, это прям очень неудобно. где-то миллиметровая нужна, где-то в десятку, где-то в сотку. Я вот тоже думаю, что должна быть возможность ограничения, но ни в настройках, ни в интрнетах не нашёл. А тут, как я понял, люди в этом деле грамотные сидят, вот и спрашиваю. Можно, конечно, эскизы в автокаде чертить, потом в павершейп импортировать, но это лишние файлы, в которых путаешься. и ошибки иногда возникают, заметил. 
    • BOO07
      Технология сушки какая?
    • vik_q
      Думаю такое во flow не решить. Из подвижных объектов он допускает только вращение и движение строго вдоль потока.   Можно пожалуй только посчитать усилие срыва крышки.
    • ANT0N1DZE
      Кто угодно: производители железа, самого софта или просто энтузиасты. Подобных тестов довольно много (они же как-то сделались) в инете, но чего-то близкого не нашел пока. 
    • Maro
      Круглая кровать... Зеркала, ванная в центре - это что-то из почасовой аренды... Я уже не в том возрасте 
    • kkk
      А как Вы себе это представляете? Кто и зачем должен сделать такие тесты? И за чей счет?
    • Snake 60
      Да потому, что от одного эскиза могут быть получены сколько угодно элементов. Не нравится - отключите вложенную структуру отображения дерева элементов и ваши эскизы будут отображены в дереве без явной привязки к элементам.
×
×
  • Create New...