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

Ассоциативный отрезок средствами UG Open


jREj

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

Здравствуйте! Нужно построить ассоциативный отрезок (набор отрезков) программным методом из точек. Точки уже построены вручную. В справке нашел функцию UF_CURVE_create_line_arc. Ей надо передать указатель на структуру.... В этом проблема. Структура показана ниже:

struct UF_CURVE_line_arc_s

{ 

   UF_CURVE_line_arc_type_t		curve_type;	 /* Type of curve to create i.e. line/arc */ 

  

   UF_CURVE_asso_arc_subtype_t  arc_constraint_subtype; /* The subtype of curve */

 

   UF_CURVE_constraint_t		constraints[3];		/* Array of constraint to be satisfied. 

																				 * Two constraints in case of line. 

																				 * Two constraints in case of arc by center. 

																				 * Three constraints in case of arc. 

																							*/ 

   UF_CURVE_limit_t			 limits[2];					   /* The start and end limits of the curve */ 

  

   tag_t						plane_of_curve;					 /* Plane on which curve must lie. 

																				   * If NULL_TAG, plane will be infered. 

																				   * Else all the object in the constraints 

																				   * array above will be projected on the plane. 

																										 */ 

   logical						complement;							  /* False - Default arc will be created. 

																						 * True  - Complement of default arc will be   

																						 * Used only in ARC. 

																						   */ 

   logical						closed;		  /* False - Arc bounded by limits above will be 

												* True  - Full circle will be created. 

												* Used only in ARC. 

												*/ 

   logical					 is_associative; /* true if associative, false if not associative */ 

}; 



typedef struct UF_CURVE_line_arc_s UF_CURVE_line_arc_t, *UF_CURVE_line_arc_p_t;

1-й вопрос: Третий и четвертый члены структуры: вложенные структуры или массивы структур???

Сами структуры показаны ниже. Для третьего члена:

struct UF_CURVE_constraint_s 

{ 

   UF_CURVE_constraint_type_t	constraint_type;  /* The type of constraint */ 



   UF_CURVE_end_type_t			end_type;		 /* The end to which this constraint must be applied*/ 

  

  tag_t						object_tag;	   /* Object with which the constraint is to be applied. */

												  

												   

   double						 value;			/* If constraint needs a value then 

															   * use this field, ex. UF_CURVE_angle 

																* UF_CURVE_radius type constraints. 

																													 */ 

   UF_CURVE_help_data_t		help_data;		/* help data when constraint is tangent / normal */ 

}; 



typedef struct UF_CURVE_constraint_s UF_CURVE_constraint_t, *UF_CURVE_constraint_p_t;

Для четвертого:

struct UF_CURVE_limit_s 

{ 

   UF_CURVE_limit_type_t		limit_type;  /* Type of limit */ 

   double								   value;	   /* Value by which to extend 

																  * in case of UF_CURVE_limit_value. 

																  * In case of arc/circle the value 

																  * should be in degrees. 

																			   */ 

   tag_t									   limiting_obj;				/* The object upto which the end must be extended 

 

   UF_CURVE_help_data_t		help_data;	/* help data when limit is up to an object */ 

}; 



typedef struct UF_CURVE_limit_s UF_CURVE_limit_t, *UF_CURVE_limit_p_t;

Вот часть кода:

static void do_ugopen_api(void)

{

char cue[] = "Выберите точки";

	char title[] = "Выберите точки";

	int response, count, i;

	

	tag_p_t objects; //адресса точек

	

	tag_t line1;  // тег линии.

	

	UF_CURVE_line_arc_t line_parameters[MAX_POINTS];	//создаю массив структур 

	

	if((UF_CALL(UF_UI_select_with_class_dialog(

		  cue, title, UF_UI_SEL_SCOPE_WORK_PART_AND_OCC,

		  init_proc, NULL , &response, &count, &objects))) == 0)   //выбираю объекты, в частности точки

 {

		 if (response == UF_UI_OK && count > 0)

		 {

			 

			 for (i=0; i<count; i++)  // исходя из количества точек строю нужное количество отрезков.

			 {



		



				 line_parameters[i].curve_type = UF_CURVE_asso_line;



				 line_parameters[i].constraints[0].constraint_type = UF_CURVE_coincident;



				 line_parameters[i].constraints[0].end_type = UF_CURVE_start;



				 line_parameters[i].constraints[1].constraint_type = UF_CURVE_along_x;



				 line_parameters[i].constraints[1].end_type = UF_CURVE_end;



				 line_parameters[i].limits[0].limit_type = UF_CURVE_limit_value;



				 line_parameters[i].limits[0].value = -100.00;



				 line_parameters[i].limits[1].limit_type = UF_CURVE_limit_value;



				 line_parameters[i].limits[1].value = 100.00;



				 line_parameters[i].plane_of_curve = NULL_TAG;



				 line_parameters[i].is_associative = TRUE;

					 



				 UF_CALL(UF_CURVE_create_line_arc (&line_parameters[i], &line1));

		

		UF_DISP_set_highlight(objects[i], 0);		 

			 }

			UF_free(objects);

		 

		 }

	

	}



}

Код компилируется , при запуске в ЮГ выходит меню, точки выбираются и далее ошибка, которую выводит UF_CALL. Что то вроде: "memory access violation" в функции UF_CURVE_create_line_arc.

Пробовал отдельно создавать структуры для третьего и четвертого членов.

Типа такого:

UF_CURVE_constraint_t  constraint_X_start = { UF_CURVE_coincident,UF_CURVE_start};
И обращаться:


 line_parameters[i].constraints[0] = constraint_X_start
Если делать так, то Вижуалка ругается, говорит : "левый операнд должен быть левосторонним значением"

Покажите как правильно обращаться к членам подструктур третьего и четвертого членов структуры UF_CURVE_line_arc_s, чтобы задать им нужные значения.

Читал книги по Си/Си++, но там примеры не совсем похожи на то что здесь.

Или может кто подскажет как соорентировать неассоциативный отрезок относительно РСК. В функции UF_CURVE_create_line нет таких параметров :(

Всем заранее спасибо!!!

P.S. Может посоветуйте дельную книгу, где есть что-то похожее.

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


Коллеги! Можете прояснить из-за чего выходит такая ошибка?

*** ERROR code 11 at line 130 in c:\work\nx open and grip\x86\uf_curve_line_arc\uf_curve_line_arc\uf_curve_line_arc.c:

+++ Internal error: memory access violation

UF_CURVE_create_line_arc (&line_parameters, &line1);

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

Обычно, неправильная работа с указателями...

Спасибо, будем разбираться с указателями...

Изменено пользователем jREj
Ссылка на сообщение
Поделиться на других сайтах
  • 2 недели спустя...

Вроде разобрался с указателями и получилось задать нужные значения членам структуры UF_CURVE_line_arc_s. Кроме двух членов вложенной структуры UF_CURVE_constraint_s. Эти члены - object_tag для начала и конца отрезка. Я правильно понимаю, что если мне необходимо построить ассоциативный отрезок из ассоциативной точки вдоль оси X РСК, то я для начала отрезка должен записать в структуру тег точки, а для конца - тег РСК???

Тег точки я выдергиваю при помощи функции UF_UI_select_with_class_dialog. Тег РСК при помощи UF_CSYS_ask_wcs. Записываю их в структуру. Но при вызове функции UF_CURVE_create_line_arc выходит ошибка:

*** ERROR code 660008 at line 239

+++ Object supplied is of the wrong type.

UF_CURVE_create_line_arc(line_data_p, &line2);

Я так понимаю что с объектами что-то не так. Пробовал определять тип и подтип объектов функцией UF_OBJ_ask_type_and_subtype, все нормально объекты соответствуют типам (целым числам), которые описаны в uf_object_types.h.

При выводе членов структуры в листинг, при помощи таких инструкций:

UF_CALL(UF_UI_open_listing_window());

sprintf(buffer,"тег %d constraints[0].object_tag = %d\n\n",i,line_data_p->constraints[1].object_tag);

UF_CALL(UF_UI_write_listing_window(buffer));

Значения объектов адекватные, например 29600, а не миллиардные....

Значения перечислимых типов данных тоже нормальные, как в справке к NX.

Подскажите, что не так....

Вот часть кода:

if((UF_CALL(UF_UI_select_with_class_dialog(

		  cue, title, UF_UI_SEL_SCOPE_WORK_PART_AND_OCC,

		  init_proc, NULL , &response, &count, &objects))) == 0)



	{





	

		 if (response == UF_UI_OK && count > 0 && count <= MAX_POINTS)

		 {

			 

	UF_CALL(UF_CSYS_ask_wcs(&wcs_tag));				 //определяем тег РСК



	



			 for (i=0; i<count; i++)

			 {



//Присваиваем членам структуры нужные значения

	

		 line_data_p[i] = &line_data[i];				   // инициализирую указатель на структуру



	line_data_p[i]->curve_type = UF_CURVE_asso_line;

	line_data_p[i]->constraints[0].constraint_type = UF_CURVE_coincident;

	line_data_p[i]->constraints[0].end_type = UF_CURVE_start;

	

	line_data_p[i]->constraints[0].object_tag = objects[i];	 // Присваиваем тег точки члену object_tag структуры 

	

	



	line_data_p[i]->constraints[1].constraint_type = UF_CURVE_along_x;

	line_data_p[i]->constraints[1].end_type = UF_CURVE_end;

	

	line_data_p[i]->constraints[1].object_tag = wcs_tag;	  // Присваиваем тег РСК члену object_tag структуры 

	



	line_data_p[i]->limits[0].limit_type = UF_CURVE_limit_to_constraint;

	//line_data_p[i]->limits[0].value = -100.0;

	line_data_p[i]->limits[1].limit_type = UF_CURVE_limit_value;

	line_data_p[i]->limits[1].value = 100.0;

	

	line_data_p[i]->plane_of_curve = NULL_TAG;

	line_data_p[i]->is_associative = TRUE;



		UF_CALL(UF_CURVE_create_line_arc(line_data_p[i], &line2));



		

		UF_DISP_set_highlight(objects[i], 0);	 

			 }

			 

			

		 UF_free(objects);

		 }



 

	   }

  }

Может перед записью тега в структуру нужно с ним что-то сделать??? Может функция sprintf проводит форматирование и в листинг выходит нужное число, а в структуру тот же объект но значение у него не то...

Помогите пожалуйста, никак не могу понять в чем дело, в справке ничего не нашел по этому поводу... :sad::cry_1:

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

Вроде разобрался с указателями и получилось задать нужные значения членам структуры UF_CURVE_line_arc_s. Кроме двух членов вложенной структуры UF_CURVE_constraint_s. Эти члены - object_tag для начала и конца отрезка. Я правильно понимаю, что если мне необходимо построить ассоциативный отрезок из ассоциативной точки вдоль оси X РСК, то я для начала отрезка должен записать в структуру тег точки, а для конца - тег РСК???

Тег точки я выдергиваю при помощи функции UF_UI_select_with_class_dialog. Тег РСК при помощи UF_CSYS_ask_wcs. Записываю их в структуру. Но при вызове функции UF_CURVE_create_line_arc выходит ошибка:

*** ERROR code 660008 at line 239

+++ Object supplied is of the wrong type.

UF_CURVE_create_line_arc(line_data_p, &line2);

Я так понимаю что с объектами что-то не так. Пробовал определять тип и подтип объектов функцией UF_OBJ_ask_type_and_subtype, все нормально объекты соответствуют типам (целым числам), которые описаны в uf_object_types.h.

При выводе членов структуры в листинг, при помощи таких инструкций:

UF_CALL(UF_UI_open_listing_window());

sprintf(buffer,"тег %d constraints[0].object_tag = %d\n\n",i,line_data_p->constraints[1].object_tag);

UF_CALL(UF_UI_write_listing_window(buffer));

Значения объектов адекватные, например 29600, а не миллиардные....

Значения перечислимых типов данных тоже нормальные, как в справке к NX.

Подскажите, что не так....

Вот часть кода:

if((UF_CALL(UF_UI_select_with_class_dialog(

		  cue, title, UF_UI_SEL_SCOPE_WORK_PART_AND_OCC,

		  init_proc, NULL , &response, &count, &objects))) == 0)



	{





	

		 if (response == UF_UI_OK && count > 0 && count <= MAX_POINTS)

		 {

			 

	UF_CALL(UF_CSYS_ask_wcs(&wcs_tag));				 //определяем тег РСК



	



			 for (i=0; i<count; i++)

			 {



//Присваиваем членам структуры нужные значения

	

		 line_data_p[i] = &line_data[i];				   // инициализирую указатель на структуру



	line_data_p[i]->curve_type = UF_CURVE_asso_line;

	line_data_p[i]->constraints[0].constraint_type = UF_CURVE_coincident;

	line_data_p[i]->constraints[0].end_type = UF_CURVE_start;

	

	line_data_p[i]->constraints[0].object_tag = objects[i];	 // Присваиваем тег точки члену object_tag структуры 

	

	



	line_data_p[i]->constraints[1].constraint_type = UF_CURVE_along_x;

	line_data_p[i]->constraints[1].end_type = UF_CURVE_end;

	

	line_data_p[i]->constraints[1].object_tag = wcs_tag;	  // Присваиваем тег РСК члену object_tag структуры 

	



	line_data_p[i]->limits[0].limit_type = UF_CURVE_limit_to_constraint;

	//line_data_p[i]->limits[0].value = -100.0;

	line_data_p[i]->limits[1].limit_type = UF_CURVE_limit_value;

	line_data_p[i]->limits[1].value = 100.0;

	

	line_data_p[i]->plane_of_curve = NULL_TAG;

	line_data_p[i]->is_associative = TRUE;



		UF_CALL(UF_CURVE_create_line_arc(line_data_p[i], &line2));



		

		UF_DISP_set_highlight(objects[i], 0);	 

			 }

			 

			

		 UF_free(objects);

		 }



 

	   }

  }

Может перед записью тега в структуру нужно с ним что-то сделать??? Может функция sprintf проводит форматирование и в листинг выходит нужное число, а в структуру тот же объект но значение у него не то...

Помогите пожалуйста, никак не могу понять в чем дело, в справке ничего не нашел по этому поводу... :sad::cry_1:

Мой совет

Постройте руками свой отрезок и с помощью программирования и NXDegaber посмотрите как он устроен

Анализ по типам как Вы привели недостаточен

Точка кроме всего прочего может быть смартом - У Вас это не проверяется (UF_SO)

Объект может иметь статус (UF_OBJ)

Вообще сомнительный способ создания ассоциативного отрезка

Делается это все не так а с помощью UF_UDOBJ

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

Всем спасибо за советы. Построил набор ассоциативных отрезков :smile:

Проблема была в следующем: вместо тега РСК нужно было отправить тег направления. (Пояснили на форуме программистов). Это сделал при помощи функции из группы UF_SO. Тема закрыта.

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

какая принципиальная разница между смарт-объектом и ассоциативным объектом???

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

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

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

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

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

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

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

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

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

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

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




  • Сообщения

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