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

Редактирование 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 пользователей

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




  • Сообщения

    • mr_Voden
      @radii Пробуй.   post_29.05.24_13.42.rar
    • Killerchik
      Скорее догадки исходя из моих знаний о возможностях Фанука и примеров реализации функции поджима на различных станках. В этом разделе бал тема с разбором программ поджима, где-то в течении последнего года.
    • Stanislav
      Мне просто это выслали на отъеби... для просчета цены. Когда я поинтересовался нужны ли им действительно такие радиусы в углах 0,4мм сказали нет. Когда запросил чертеж с указанием шероховатостей и допусков, разговор был окончен. Ну бросили на шару модель, типа ,скажите за сколько сделаете вдруг за 50 000р сделаете, а если говно получиться то мы скажем что нас не устраивает.     Так как я пишу проги в основном для машиностроения, а там все круглое и квадратное, криволинейных поверхностей нет, то я решил потренироваться. И как я выше уже писал в NX не так то просто изменить радиусы скругления в модели (например на 0,5) на литейных формах, не так просто все удалить и нанести новые. Короче проще попросить конструктора на исходной модели поправить и выслать заново STEP.   Стенки там реально вертикальные в модели. Ну может их устроит, я не литейщик, может пластмассовая деталь вынется после охлаждения. А если они были бы с наклоном то радиусной фрезой катать их пришлось бы ЗЕТЛЕВОЛОМ или по УПРАВЛЯЮЩИМ ПОВЕРХНОСТЯМ.  В общем по времени стоЯть эта деталь на станке будет не мало, соответственно и стОить.    Эрозия есть, только без ЧПУ.  Стоит кокой-то    зеленый уродец. 
    • Srgwell
      Нет, там майн,майн по умолчанию стоит
    • Leon
      @Srgwell Метод запускаемый проверьте.
    • Srgwell
      Такое дело. Я не почувствовал новые изменения по одной причине. Самая последняя версия, которая запускалась это 4.4.1. Все последующие при запуске не реагируют ни как. Тут даже до создания ini не доходило. Судя по количеству байтов менялся только Коперник.swp. Естественно лишние старые файлы перед запуском удалял. Ну может у других все хорошо. Или они просто не пробуют другие версии. SW 2023 sp3.0
    • oleggreen
      Добрый. Ermak 3120. Был небольшой удар листом по стойке. Стойка погасла. При подключении доп монитора на мониторе ошибка систем мисс мач контроллер ребут. Сталкивался ли кто-нибудь с таким. 
    • Александр1979
      https://m.youtube.com/watch?v=YJFnfXLcSEY
    • HornedOwl
      И я этим вопросом задавался... но как я  понял, гравитацией заливаем только в стакан, а дальше якобы работает поршень Повторюсь: я могу ошибаться, не сам эту методу придумал...
    • ART
      Какое отношение имеет гравитация к литью под давлением.
×
×
  • Создать...