Перейти к публикации

NX Open API - Анализ зазоров


Entwerfer

Рекомендованные сообщения

Добрый день!

 

Передо мной встала задача провести анализ зазоров в сборке с помощью приложения. Обратилась к функциям библиотеки uf_clear.h. Возникает проблема в определении списка объектов для анализа (UF_CLEAR_set_obj_list). Необходимо провести анализ между всеми представленными компонентами в сборке: произвожу поиск всех объектов (UF_OBJ_cycle_objs_in_part), найденные теги записываю в массив и передаю этот массив в качестве параметра в функцию (UF_CLEAR_set_obj_list). В результате возникает ошибка - UF_CLEAR_err_bad_list_data. Тем не менее, провести анализ зазоров можно, но анализируются при этом тела (Bodies), а не компоненты (Components) сборки.

 

Подскажите, пожалуйста, как можно исправить ошибку (правильно задать список объектов для анализа)?

int assem_mod::analysis()
{
    int errorCode = 0;
    try
    {
        //---- Enter your callback code here -----
		theSession->ListingWindow()->Open();
	tag_t part_tag; /* Working part tag */
	int type; /* Type of object on which to cycle */
	tag_t obj_tag; //тэг объекта
	std::vector<tag_t> obj_list; //массив объектов
	int err; /* General return code */
	tag_t dataset; /* Working dataset tag */
	int num_datasets; /* Total number of datasets */

		char *handle;
		char name [ UF_OBJ_NAME_LEN+1 ];
		int counter; //размер массива объектов
		part_tag = UF_ASSEM_ask_work_part();
		handle = UF_TAG_ask_handle_of_tag(part_tag);
		theSession->ListingWindow()->WriteLine(handle);
		type = UF_component_type;
		obj_tag = NULL_TAG;
		counter = 0;
		//Поиск всех объектов
        UF_OBJ_cycle_objs_in_part( part_tag, type, &obj_tag );
		while ( obj_tag != NULL_TAG ) {
		    UF_OBJ_cycle_objs_in_part( part_tag, type, &obj_tag );
			if (obj_tag != NULL_TAG) {
				obj_list.push_back(obj_tag);
				counter++;
			}
			handle = UF_TAG_ask_handle_of_tag(obj_tag);
			UF_OBJ_ask_name(obj_tag, name);
			theSession->ListingWindow()->WriteLine(handle);
			theSession->ListingWindow()->WriteLine(name);
		}
		//theSession->ListingWindow()->WriteLine(to_string(counter)); 
		//theSession->ListingWindow()->WriteLine(to_string(obj_list.size()));
		tag_t *obj_arr = new tag_t[counter];
		for (int i = 0; i < obj_list.size(); i++) { 
			handle = UF_TAG_ask_handle_of_tag(obj_list[i]);
			theSession->ListingWindow()->WriteLine(handle);
			obj_arr[i] = obj_list[i];
		}

		char *set_name = "Analysis_set";
		/* Creating a dataset */
		err = UF_initialize();
		if (err) return err;
		err = UF_CLEAR_create_dataset(part_tag, set_name, &dataset);
		if (err==0) theSession->ListingWindow()->WriteLine("Dataset is created: Success!");
		else theSession->ListingWindow()->WriteLine("Dataset is created: Failure!");
		/*Counting datasets*/
		err = UF_CLEAR_count_datasets(part_tag, &num_datasets);
		if (err==0) {
			theSession->ListingWindow()->WriteLine("Number of created datasets:");
			theSession->ListingWindow()->WriteLine(to_string(num_datasets));
		}
		/* Finding dataset */
        err = UF_CLEAR_find_dataset(part_tag, set_name, &dataset);
		if (err==0) theSession->ListingWindow()->WriteLine("Dataset is found: Success!");
	    else theSession->ListingWindow()->WriteLine("Dataset is found: Failure!");

		theSession->ListingWindow()->WriteLine(" ");

		/* Defining a clearance analysis object list */
		err = UF_CLEAR_set_obj_list(dataset, 1, UF_CLEAR_FIXED_LIST, counter, obj_arr);
		if (err==0) theSession->ListingWindow()->WriteLine("Obj_list is defined: Success!");
		else theSession->ListingWindow()->WriteLine("Obj_list is defined: Failure!");
		/* Tell NX not to use object list #2 */
        err = UF_CLEAR_set_obj_list(dataset, 2, UF_CLEAR_LIST2_NOT_USED, 0, NULL_TAG);
		if (err==0) theSession->ListingWindow()->WriteLine("Obj_list_2 is not used: Success!");
		else theSession->ListingWindow()->WriteLine("Obj_list_2 is not used: Failure!");

    }
    catch(exception& ex)
    {
        //---- Enter your exception handling code here -----
        errorCode = 1;
        assem_mod::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());
    }
    return errorCode;
}

P.S. Код представлен только до задания списка объектов для анализа (включительно), так как дальше проблем не возникало.

Вывод:

Dataset is created: Success!

Number of created datasets:

1 //или больше, в зависимости от того, сколько было создано до этого момента

Dataset is found: Success!

Obj_list is defined: Failure!

Obj_list_2 is not used: Success!

...

 

Пример выбора объектов для анализа во встроенном модуле NX (нужен анализ именно компонентов, а не тел):

post-46168-0-05278600-1426509176.png

Ссылка на сообщение
Поделиться на других сайтах


Из документации

 

Fully defines a clearance analysis object list, specified by which_list.
The list type corresponds to the ways an object list can be defined in
the interactive application by using one of these values:
UF_CLEAR_ALL_OBJECTS, UF_CLEAR_ALL_VISIBLE_OBJECTS, UF_CLEAR_ALL_BUT, or
UF_CLEAR_FIXED_LIST.
To specify a one list data set, set which_list to 2 and list_type to
UF_CLEAR_LIST2_NOT_USED. No tag_array is necessary.
For a UF_CLEAR_ALL_OBJECTS or UF_CLEAR_ALL_VISIBLE_OBJECTS list, you do
not need to supply a tag_array -- the list is automatically evaluated
when necessary.
For a UF_CLEAR_ALL_BUT list, you must specify the tags of those
solid bodies and/or facet models you want to explicitly exclude from
the list. The list of included objects is reevaluated when necessary.
For a UF_CLEAR_FIXED_LIST, you must specify an array of objects
to be members of the list. These objects must be solid bodies or facet
models. This list is not further evaluated. Note that you may need to
call this routine twice, once for each list.

 

=================================

 

 

Компонентов в списке допустимых нету

 

Вам нужно по компонену научиться получать правильные солиды в контексте сборки

Изучайте UF_ASSEM

Вам нужно понять что такое occurence и как их искать

Ссылка на сообщение
Поделиться на других сайтах

Спасибо большое за ответ, nut888!

Я вчера осознала свою оплошность, но не успела отписаться на форуме, так как до сих пор занимаюсь решением этой проблемы.

 

Решила прибегнуть к NXOpen, для анализа зазоров оказались полезными три файла:

1) Assemblies_ClearanceAnalysisBuilder.hpp

2) Assemblies_ClearanceSet.hpp

3) Assemblies_ClearanceSetCollection.hpp

 

При условии заранее созданного Clearance Set, получилось его "отыскать" и провести анализ. Вот так:

NXOpen::BasePart* theBP;
NXOpen::Assemblies::ComponentAssembly* theComp;

Assemblies::ClearanceSet *cl_set = NULL_TAG;
theBP = theSession->Parts()->Work();
theComp = theBP->ComponentAssembly();
cl_set = theComp->ClearanceSets()->FindObject("SET1"); //допустим, так назван Clearance Set

Assemblies::ClearanceSet::ReanalyzeOutOfDateExcludedPairs reanalyzeOption = Assemblies::ClearanceSet::ReanalyzeOutOfDateExcludedPairsCustomerDefault;
cl_set->PerformAnalysis(reanalyzeOption); //Проводим анализ

Результаты успешно отобразились в Clearance Browser.

 

Далее решила средствами NXOpen создать Clearance Set. Для этого потребовалось создать ClearanceAnalysisBuilder (с необходимыми свойствами).

	NXOpen::BasePart* theBP;

	Assemblies::ClearanceAnalysisBuilder *cl_builder;
	Assemblies::ClearanceSet *cl_set = NULL; //так как новый Clearance Set
	theBP = theSession->Parts()->Work();
	cl_builder = theBP->AssemblyManager()->CreateClearanceAnalysisBuilder(cl_set);
	if (cl_builder!=NULL) theSession->ListingWindow()->WriteLine("Builder is created"); //он, действительно, был создан
	NXOpen::NXString set_name = "SET_test"; //имя нового Clearance Set
	cl_builder->SetClearanceSetName(set_name);
	NXString test_name = cl_builder->ClearanceSetName();
	theSession->ListingWindow()->WriteLine(test_name);
        //задание соответствующих настроек (свойств) билдера
	Assemblies::ClearanceAnalysisBuilder::ClearanceBetweenEntity cl_entity = Assemblies::ClearanceAnalysisBuilder::ClearanceBetweenEntityComponents;
	cl_builder->SetClearanceBetween(cl_entity);
	Assemblies::ClearanceAnalysisBuilder::NumberOfCollections cl_number = Assemblies::ClearanceAnalysisBuilder::NumberOfCollectionsOne;
	cl_builder->SetTotalCollectionCount(cl_number);
	Assemblies::ClearanceAnalysisBuilder::CollectionRange cl_range = Assemblies::ClearanceAnalysisBuilder::CollectionRangeAllObjects;
	cl_builder->SetCollectionOneRange(cl_range);
	cl_builder->SetDefaultClearanceZone(0);
	cl_builder->SetSaveInterferenceGeometry(1);
	Assemblies::ClearanceAnalysisBuilder::CalculationMethodType cl_method = Assemblies::ClearanceAnalysisBuilder::CalculationMethodTypeExact;
	cl_builder->SetCalculationMethod(cl_method);

Но как его выполнить (создать новый Clearance Set) пока не совсем ясно. Может Вы подскажете?

Ссылка на сообщение
Поделиться на других сайтах

Вы можете двигаться двумя путями

1) Если работаете с NXOPEN то можно просто записать журнал на C++ и этот код использовать как прототип

2) Можете работать с UF с предыдущим кодом В этом случае Вам нужно собрать только оккуренсы тех солидов которые

соответствуют оккуренсу вашей рабочей части

То есть в Вашем множестве солидов для проверки должны быть либо оккуренсы солидов соответствующие оккуренсу

рабочей части или прототипы солидов созданные в данной рабочей части где Вы анализ собрались прводить

Остальные солиды надо игногировать

Такое у меня предположение

Ссылка на сообщение
Поделиться на других сайтах
  • 3 недели спустя...

Снова вернулась к вопросу об анализе зазоров.

Что делать в ситуации, когда сборка состоит из подсборок, и требуется рассматривать подсборку как целую деталь?

В билдере есть возможность задать соответствующую настройку:

cl_builder->SetIgnorePairsWithinSelectedSubassemblies(TRUE);

Но не очень понятно, куда и как передавать теги выбранных подсборок (выбор произвожу с помощью ячейки "select object" в block ui styler).

Может есть возможность в work part (assembly part) отыскать все подсборки (subassemblies) и передать их в билдер?

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




×
×
  • Создать...