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

Редактирование UDF средствами NXOpen


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

Функция UF_MODL_edit_instantiated_udf() выдает:

The UDF can not be edited. Error 875442 at line in ...

Не пойму в чем дело.

void doit()

{

	char buf[150];

	int rc;

	tag_t work_part, feature_tag=NULL_TAG, obj_tag=NULL_TAG;

	

	work_part=UF_ASSEM_ask_work_part ( );

	if (!work_part)

	{

		uc1601("No work part",1);

		return;

	}



	if(UF_OBJ_cycle_by_name("udf_rubilnik1", &obj_tag)) //Использую этот UDF: содержит 3 выражения, 4 ссылки

	{

		uc1601("\"udf_rubilnik1\" not found",1);

		return;

	}



	UF_MODL_ask_object_feat (obj_tag, &feature_tag);



	UF_MODL_udf_exp_data_t exp_data;		

	UF_MODL_udf_ref_data_t ref_data;	

	UF_CALL(UF_MODL_ask_instantiated_udf (feature_tag, &exp_data, &ref_data ));

	

	sprintf(buf,"num exps=%d\nnum_refs=%d",exp_data.num_exps, ref_data.num_refs);

	uc1601(buf,1);



	char *a[]={"1000","1000","1000"};//UDF имеет три выражения

	exp_data.new_exp_values= a;

	

	ref_data.new_refs=(tag_t *)UF_allocate_memory(ref_data.num_refs*sizeof(tag_t),&rc);

	if (rc)

	{

		uc1601("error allocate memory for new_refs",1);

		return;

	}



	ref_data.reverse_refs_dir=(UF_MODL_udf_reverse_dir_t*)UF_allocate_memory( ref_data.num_refs*sizeof(UF_MODL_udf_reverse_dir_t), &rc);

	if (rc)

	{

		uc1601("error allocate memory for reverse_refs_dir",1);

		return;

	}

	for (int i=0; i<ref_data.num_refs; ++i)

	{

		ref_data.reverse_refs_dir[i] =UF_MODL_UDF_REVERSE_DIR;

		ref_data.new_refs[i]=ref_data.old_refs[i];

	}

	

	UF_CALL(UF_MODL_edit_instantiated_udf (feature_tag, false, &exp_data, &ref_data ));

	UF_MODL_update();

	

	UF_free(ref_data.new_refs);

	UF_free(ref_data.reverse_refs_dir);	

}
Что не так? Изменено пользователем ugger
Ссылка на сообщение
Поделиться на других сайтах


Что не так?

На вскидку - лень сейчас смотреть документацию

Все поля структур переинициализировал

Посмотри в header определение UF_MODL_udf_exp_data_t

из чего оно состоит

UF_MODL_ask_instantiated_udf (feature_tag, &exp_data, &ref_data );

Распечатай все поля exp_data после вызова этой функции

Если не получиться может стоит просто получить отсюда expression и просто редактировать их напрямую без udf

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

Что не так?

На вскидку - лень сейчас смотреть документацию

Все поля структур переинициализировал

Посмотри в header определение UF_MODL_udf_exp_data_t

из чего оно состоит

UF_MODL_ask_instantiated_udf (feature_tag, &exp_data, &ref_data );

Распечатай все поля exp_data после вызова этой функции

Если не получиться может стоит просто получить отсюда expression и просто редактировать их напрямую без udf

Разумеется все структуры я изучил по документации (перечитал на несколько рядов).

Переинициализировал не все поля, а только те, которые, согласно документации, заполняются пользователем (expr_data.new_exp_values, ref_data.new_refs, ref_data.reverse_refs_dir). Не понял только насчет ref_data.mapping_data и не стал ее трогать.

Если не выделять память для массивов tag_t* new_refs и char** new_exp_values в надежде, что это сделела UF_MODL_ask_instantiated_udf(), то при их заполнении получаю ошибку доступа к памяти.

Редактирование напрямую путем редактирования выражений работает, но надо изменить направление выдавливания тела (extrude не виден вне UDF). Можно, конечно, задать для extrude ссылку при определении UDF и потом ее редактировать без UDF, но должно же все работать и "нормальным" путем.

И еще, если при вызове UF_MODL_edit_instantiated_udf (tag_t udf_insert_tag, logical explosion, UF_MODL_udf_exp_data_t * exp_data, UF_MODL_udf_ref_data_t * ref_data ) второй параметр задать true, то ошибка не появляется и UDF успешно раскрывается, но параметры старые.

Насчет распечатать поля структуры после вызова UF_MODL_edit_instantiated_udf() не додумался. Сейчас попробую.

Спасибо за участие.

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

Распечатал структуры после ошибки. Вроде все в порядке.

Пробую редактировать extrude из UDF (реверс направления выдавливания) напрямую, но пока тоже не получается.

Делаю:

1. Получаю tag_t фичеров UDF вызовом UF_MODL_ask_features_of_udf(). Получил 13 разных tag_t. Похоже на правду, хотя вызов UF_MODL_ask_feat_name() с любым из них возвращает одно имя - имя самого UDF (ладно, это можно понять). Если UDF раскрыть вызовом UF_MODL_edit_instantiated_udf() со вторым параметром равным true, то полученные тэги дают правильные фичеры и имена возвращаются правильные. Значит тэги правильные. Далее...

2. Пытаюсь изменить направление выдавливания UF_MODL_set_sweep_axis(). Получаю ошибку: "ERROR code 670357 at line 73 in .\reverse_extrude_dir.cpp: Selected feature of unknown type. UF_MODL_set_sweep_axis (tg, dir );".

3. Решил проверить работу UF_MODL_set_sweep_axis(). Создал новый файл, построил extrude. Написал новую программу

void doit1()

{

	char buf[150],*feature_type;

	double pos[3], dir[3];

	tag_t tg=NULL_TAG, feature_tag;

	int type = UF_feature_type, tp, st;

	do

	{

		UF_OBJ_cycle_objs_in_part( UF_ASSEM_ask_work_part(), type, &tg );

		UF_CALL(UF_MODL_ask_sweep_direction (tg, pos, dir));

		dir[2]=dir[2]*-1;

		UF_CALL(UF_MODL_set_sweep_axis (tg, dir ));

	} while ( tg != NULL_TAG );

	UF_free(feature_type);

}

Обе функции (UF_MODL_ask_sweep_direction() и UF_MODL_set_sweep_axis() выдают ту же ошибку: ERROR code 670357 ... Selected feature of unknown...

Думаю, что я что-то неправильно делаю с тэгами.

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

Продолжу свой диалог с самим собою :)

Получилось вот так:

tag_t *udf_features,tg=NULL_TAG;

	int udf_features_num;

	UF_MODL_ask_features_of_udf (feature_tag, &udf_features, &udf_features_num );



	Session *theSession = Session::GetSession();

	Part *workPart(theSession->Parts()->Work());

	TaggedObject *NXObj = NXOpen::NXObjectManager::Get(udf_features[2]);

	if ( NXObj )

	{

		Features::Extrude *extrude1=(dynamic_cast<Features::Extrude *>(NXObj));

				

		Features::ExtrudeBuilder *extrudeBuilder1;

		extrudeBuilder1 = workPart->Features()->CreateExtrudeBuilder(extrude1);



		Direction *direction1;

		direction1 = extrudeBuilder1->Direction();

		bool success1;

		success1 = direction1->ReverseDirection();			  

		extrudeBuilder1->SetDirection(direction1);



		Features::Feature *feature1;

		feature1 = extrudeBuilder1->CommitFeature();	  

		extrudeBuilder1->Destroy();



		UF_MODL_update();

	}

}

Интересно почему все же не сработала UF_MODL_set_sweep_axis ()?

Будет время, надо попробовать докопаться до причин.

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

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

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

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

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

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

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

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

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

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

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




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