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

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 пользователей

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




  • Сообщения

    • Guhl
      Вот подтверждение того, что ты чмо лживое Что ты, кстати, сказать-то хотел там?  
    • Андрей67
      В моём случае передаточное 1:2. Смотрел каталог Contitech - вообще не нашел такого параметра.
    • Guhl
      В концевиках "магазин втянут" и "магазин у шпинделя" Проверяйте их корректную работу 
    • Metal_Cutter
      Всем доброго дня. Станок токарно-карусельный фирмы Accuway модель UV-100 стойка Fanuc Series 0i-TD. Магазин зонтик. При выполнении смены инструмента, подъезжает к магазину, ждет. Появляется сообщение: EX1030 M.S.T. FUNCTION TIME OVER. В руководстве комментарии: 1. Время функции M.S.T. окончено 2. Интерфейс ПЛК: A3.5. Где искать причину ошибки?
    • Ninja
      в Канаде не скучно! Эпическая погоня всей полиции округа и арест с утоплением в сугробе простого канадского парня - дитя природы...     Человек просто собрался в баню, а тут такое! Произвол и насилие! Ставьте лайки, подписывайтесь и всё такое Ёу...
    • mmaag
      Косвенно ограничивается максимальным передаточным отношением. Непосредственно - в расчёте. В разных каталогах называют по разному: "Wrap angle" или "arc of contact". Иногда ограничивают числом зубьев в обхвате.
    • Guhl
      Пиздишь, постоянно лезешь Вот ты хyйло лживое.  
    • lem_on
      Федора ответ )) даа, память 8 MB и то сыпется .  В отличие от тебя, я не лезу где не понимаю. 
    • Ahito
      Настроил уведомления в потоке работы через базу данных. Тестировал на своём ПК, всё работает идеально(поднял сервер PDM на своём ПК). Перенёс всё это на сервер, уведомления не работают. Может кто сталкивался и знает решения, подскажите, пожалуйста.  
    • Cas
      @roiman Ну Вы серьезно? Вы сомневаетесь, что производственник посмотрев на чертеж и не увидев параметры шестерни начнет делать и не спросит - где взять параметры зацепления? Или что? Разнервничается и не станет выполнять заказ - если заказ ему интересен? Проблема только в том, что фирма, в которой я работаю - не РЖД и не Газпром и нам нужно изготовить всего 50 комплектов деталей в год. А не 50 тысяч комплектов. Вначале и был чертеж с таблицей. Проблем сделать таблицу с греческими буковками - тоже никаких. Но я лично сказал ему убрать и сделать сноску в т.т. на таблицу из Компаса. Все эти гигантские проблемы моего конструктора, на которые мне ВСЕ наперебой начали справедливо указывать - решаются за 2-3 минуты разговора с производственником - если на производстве, хоть раз изготавливали подобные шестерни и точили оси. "Веселые картинки", как вы сказали - превратить в чертеж - дело 10 минут. Причем в эти 10 минут входит пробежка по оформительскому ГОСТу.  Единственное здесь дельное  предложение прозвучало от Вас - разделить вал шестерню. Т.к. кроме как с помощью электроэрозии - я нигде не найду производство в РФ, которое бы взялось за выполнение моего заказа (с учетом количества и бюджета) 
×
×
  • Создать...