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

Методы для новой WCS и работы со слоями NX Open C#


zu_rab

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

Здравствуйте уважаемые, профессионалы!

Подскажите пожалуйста методы в NX Open C#, с помошью коротых можно задать новую WCS и распредилить чертеж по слоям??

Перерыл весь NX Doс ничего подходящего не нашел.

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

Там предлогается

Point3d origin1 = new Point3d(10.0, 10.0, 0.0);

workPart.WCS.Origin = origin1;

Но везде где я находил описания и примеры, рабочую часть мы задаем с помощью тега

Tag workPart;

theUfSession.Part.New("Part1", 1, out workPart);

и естестественно в объекте типа Tag нет метода WCS.

В примерах UGOPEN\SampleNXOpenApplications тоже ничего подходящего не нашел.

Подскажите пожалуйста. Буду очень благодатен, если поделитесь ссылками на исходники =)

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


Подскажите пожалуйста методы в NX Open C#, с помошью коротых можно задать новую WCS

Записано с помощью журнала С#

// ----------------------------------------------

	//   Menu: Format->WCS->Dynamics...

	// ----------------------------------------------

	Point3d origin1 = new Point3d(48.6959634908276, -74.0787974579434, 0.0);

	Matrix3x3 matrix1;

	matrix1.Xx = 0.5;

	matrix1.Xy = 0.5;

	matrix1.Xz = -0.707106781186548;

	matrix1.Yx = -0.853553390593274;

	matrix1.Yy = 0.146446609406726;

	matrix1.Yz = -0.5;

	matrix1.Zx = -0.146446609406726;

	matrix1.Zy = 0.853553390593274;

	matrix1.Zz = 0.5;

	workPart.WCS.SetOriginAndMatrix(origin1, matrix1);

распредилить чертеж по слоям??

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

Записано с помощью журнала С#

// ----------------------------------------------

	//   Menu: Format->WCS->Dynamics...

	// ----------------------------------------------

	Point3d origin1 = new Point3d(48.6959634908276, -74.0787974579434, 0.0);

	Matrix3x3 matrix1;

	matrix1.Xx = 0.5;

	matrix1.Xy = 0.5;

	matrix1.Xz = -0.707106781186548;

	matrix1.Yx = -0.853553390593274;

	matrix1.Yy = 0.146446609406726;

	matrix1.Yz = -0.5;

	matrix1.Zx = -0.146446609406726;

	matrix1.Zy = 0.853553390593274;

	matrix1.Zz = 0.5;

	workPart.WCS.SetOriginAndMatrix(origin1, matrix1);

Тоже самое мне выдал журнал. А как это сделать с помощью тегов??

Нашел метод для создания новой WCS public void CreateCsys(double[] csys_origin, Tag matrix_id, out Tag csys_id)

Написал маленькую программу, которая стороит 2 окружности разного радиуса в разных СК. Почему-то на экран выводится только одна окружность =(

Подскажите где ошибка или что я делаю не так??

С NX Open C# только начал работать, так что не судите строго.

public static int Main(string[] args)

	{

		int retValue = 0;

		try

		{

			theProgram = new Program();



			Tag CsysTag;

			

			theUfSession.Part.New("CSYS", 1, out CsysTag);

			

			// Задаем теги окружности и рабочей СК

			Tag arc, wcs;

			// Создаем обект типа кривая

			UFCurve.Arc arc_coords = new UFCurve.Arc();



			arc_coords.start_angle = .0;

			arc_coords.end_angle = 2 * Math.PI;

			arc_coords.arc_center = new double[3] {.0, .0, .0};

			arc_coords.radius = 10.0;



			// Строим окрузность

			theUfSession.Csys.AskWcs(out wcs);

			theUfSession.Csys.AskMatrixOfObject(wcs, out arc_coords.matrix_tag);

			theUfSession.Curve.CreateArc(ref arc_coords, out arc);

			

			// Задаем нормированную матрицу и начальную точку новой СК

			double[] matrix_wcs1_val = new double[9] {1.0, 1.0, .0, 1.0, -1.0, .0, .0, .0, .0};

			double[] csys_origin1 = new double[3] { 5.0, 5.0, .0 };



			Tag matrix_wcs1_id, wcs1;



			// Создаем новую СК

			theUfSession.Csys.CreateMatrix(matrix_wcs1_val, out matrix_wcs1_id);

			theUfSession.Csys.CreateCsys(csys_origin1, matrix_wcs1_id, out wcs1);



			// Строим окружность в новой СК

			Tag arc1;



			UFCurve.Arc arc_coords1 = new UFCurve.Arc();



			arc_coords1.start_angle = .0;

			arc_coords1.end_angle = 2 * Math.PI;

			arc_coords1.arc_center = new double[3] { .0, .0, .0 };

			arc_coords1.radius = 5.0;



			theUfSession.Csys.AskWcs(out wcs1);

			theUfSession.Csys.AskMatrixOfObject(wcs1, out arc_coords1.matrix_tag);

			theUfSession.Curve.CreateArc(ref arc_coords1, out arc1);



			theProgram.Dispose();

		}

		catch (NXOpen.NXException ex)

		{

			// ---- Enter your exception handling code here -----



		}

		return retValue;

	}

Это как?

Если исходить из данного примера, то каждая окружность должна строится на отдельном слое. В идеале они еще должны быть разных цветов.

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

Если исходить из данного примера, то каждая окружность должна строится на отдельном слое.

Хм... А это откуда вытекает?

Надо или рабочий слой на нужный менять перед построением или после построения менять у созданной окружности слой на нужный.

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

Хм... А это откуда вытекает?

Надо или рабочий слой на нужный менять перед построением или после построения менять у созданной окружности слой на нужный.

Немного неправильно свормулировал. Имелось ввиду, что в дальнейшем необходимо добавить метод работы со слоямии с цветами.

Подскажите пожалуйста метод, с помощью которого можно изменить рабочий слой на нужный?

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

как создавать новую СК я разобрался. просто необходимо было нормировать и ортоганализировать матрицу новой СК с помошью метода theUfSession.Mtx3.OrthoNormalize( double[] mtx_new_cs);

появился другой вопрос, чтобы сделать новую СК рабочей я пользуюсь методом

theUfSession.Csys.SetWcs(Tag new_cs);

но ничего не происходит =( подскажите плз, может еще что-нибудь добавить надо??

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

Господи! Неужени никто ничего не знает??

Посмотрите пожалуйста код.

theProgram = new Program();



			Tag CsysTag;

			

			theUfSession.Part.New("CSYS", 1, out CsysTag);



			Part workPart = theSession.Parts.Work;

			Part displayPart = theSession.Parts.Display;



			workPart.ModelingViews.WorkView.Orient(NXOpen.View.Canned.Top, NXOpen.View.ScaleAdjustment.Fit);



			// Задаем теги окружности и рабочей СК

			Tag arc, wcs;

			// Создаем обект типа кривая

			UFCurve.Arc arc_coords = new UFCurve.Arc();



			arc_coords.start_angle = .0;

			arc_coords.end_angle = 2 * Math.PI;

			arc_coords.arc_center = new double[3] {.0, .0, .0};

			arc_coords.radius = 10.0;



			// Строим окружность

			theUfSession.Csys.AskWcs(out wcs);

			theUfSession.Csys.AskMatrixOfObject(wcs, out arc_coords.matrix_tag);

			theUfSession.Curve.CreateArc(ref arc_coords, out arc);

						

			// Создаем матрицу новой СК

			double[] matrix_wcs1_val = {1.0, 1.0, .0, 1.0, -1.0, .0, .0, .0, 1.0};

			// Ортонормируем матрицу

			theUfSession.Mtx3.OrthoNormalize(matrix_wcs1_val);

			// Задаем начальную точку новой СК

			double[] csys_origin1 = { 1.0, 1.0, .0 };

			

			Tag matrix_wcs1_id, wcs1;



			// Создаем новую СК

			theUfSession.Csys.CreateMatrix(matrix_wcs1_val, out matrix_wcs1_id);

			theUfSession.Csys.CreateCsys(csys_origin1, matrix_wcs1_id, out wcs1);



			// Делаем wcs1 рабочей СК

			theUfSession.Csys.SetWcs(wcs1);



			// Строим окружность в новой СК

			Tag arc1;



			UFCurve.Arc arc_coords1 = new UFCurve.Arc();



			arc_coords1.start_angle = .0;

			arc_coords1.end_angle = Math.PI;

			arc_coords1.arc_center = new double[3] { .0, .0, .0 };

			arc_coords1.radius = 3.0;

			

			theUfSession.Csys.AskMatrixOfObject(wcs1, out arc_coords1.matrix_tag);

			theUfSession.Curve.CreateArc(ref arc_coords1, out arc1);

			

			// Задаем цвет окружности

			theUfSession.Obj.SetColor(arc1, 36);

		  

			theProgram.Dispose();

Программа строит окружность и полуокружность в разных СК. Но вторая окружность не строится в новой СК (wcs1). Подскажите где ошибка??

И с помощью каких методов можно распределить окружности по разным слоям??

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

Господи! Неужени никто ничего не знает??

Те кто знают, скорее всего, достаточно сильно загружены работой. :biggrin:

И с помощью каких методов можно распределить окружности по разным слоям??

В Open C для этого есть UF_LAYER_ask_work_layer, UF_LAYER_set_status и ряд других функций из uf_layer.h (это если идти первым путём) и UF_OBJ_set_layer для второго варианта.

Думаю, что не составит труда найти аналоги в NXOpen. ;-)

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

Vovaldo, спасибо большое! =) получилось =)

theUfSession.Obj.SetLayer(arc, 1);

			

			theUfSession.Layer.SetStatus(2, 1);

			theUfSession.Obj.SetLayer(arc1, 2);

Параллельно появился другой вопрос, а как распределить слои по категориям?

Нашел метод создания категориии

theUfSession.Layer.CreateCategory(ref UFLayer.CategoryInfo cat_info, out Tag cat_tag);

у объекта cat_info есть свойство bool[] layer_mask, что это такое и как правильно его задать?

я так понимаю оно определяет количество и какое-то свойство слоя в категории.

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

Vovaldo, спасибо большое! =) получилось =)

theUfSession.Obj.SetLayer(arc, 1);

			

			theUfSession.Layer.SetStatus(2, 1);

			theUfSession.Obj.SetLayer(arc1, 2);

Параллельно появился другой вопрос, а как распределить слои по категориям?

Нашел метод создания категориии

theUfSession.Layer.CreateCategory(ref UFLayer.CategoryInfo cat_info, out Tag cat_tag);

у объекта cat_info есть свойство bool[] layer_mask, что это такое и как правильно его задать?

я так понимаю оно определяет количество и какое-то свойство слоя в категории.

Если честно, то я считаю что было бы проще и понятнее сначала выполнить какую-то операцию в "ручном" режиме непосредственно в NX, заодно ознакомиться с концепцией слоёв и их категорий, а уже потом заниматься автоматизацией. Изменено пользователем Vovaldo
Ссылка на сообщение
Поделиться на других сайтах

Vovaldo, стараюсь =)

с категориями стало тоже более ли менее понятно.

если я правльно прнял, то bool[] layer_mask определяет какие слои принадлежат к данной категории.

Попробывал реализовать, у меня всего 2 слоя объядиняю их в 1 категорию

Tag cat1_tag;



			UFLayer.CategoryInfo cat1_info = new UFLayer.CategoryInfo();

			cat1_info.name = "CIRCLES";

			cat1_info.descr = "Two different circles";

			cat1_info.layer_mask = new bool[2] { true, true };

			

			theUfSession.Layer.CreateCategory(ref cat1_info, out cat1_tag);

когда запускаю в NX выдает ошибку. Имя функции ufusr.

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

Нашел где-то на форумах, чтобы объект чертился в новой СК необходимо сделать mapping координат.

Перерыл всю NX Open .Net Api Reference Guide. Нашел метод UFTurn.MapPnt3FromAcs(Tag oper_tag, double[] acs_pnt3, double[] scs_pnt2)

Сразу появились 2 вопроса почему этот метод точку из 3D переводит в 2D?

Tag oper_tag - тег операции преобразования координат, откуда его взять?

И последний вопрос. Разве нет такого метода, который не координаты будет преобразовывать, перенесет объект из ACS в WCS?? Или чтобы объект сразу создавался в WCS, а не в ACS??

Подскажите плз, уже 3 дня мучаюсь с СК, необходимо как воздух :worthy:

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

Нашел где-то на форумах, чтобы объект чертился в новой СК необходимо сделать mapping координат.

Перерыл всю NX Open .Net Api Reference Guide. Нашел метод UFTurn.MapPnt3FromAcs(Tag oper_tag, double[] acs_pnt3, double[] scs_pnt2)

Сразу появились 2 вопроса почему этот метод точку из 3D переводит в 2D?

Tag oper_tag - тег операции преобразования координат, откуда его взять?

И последний вопрос. Разве нет такого метода, который не координаты будет преобразовывать, перенесет объект из ACS в WCS?? Или чтобы объект сразу создавался в WCS, а не в ACS??

Подскажите плз, уже 3 дня мучаюсь с СК, необходимо как воздух :worthy:

Про NXOpen не скажу не программирую, а про UGOpen скажу так. Все кривые всегда строятся в абсолютной системе координат. Для мапинга точек используется команда UF_CSYS_map_point. Как вариант самопального мапинга можно использовать операции с матрицами и векторами uf_mtx.h и uf_vec.h. Если объект построен и его надо переместить (не ассоциативно), то посмотрите uf_trns.h
Ссылка на сообщение
Поделиться на других сайтах

Про NXOpen не скажу не программирую, а про UGOpen скажу так. Все кривые всегда строятся в абсолютной системе координат. Для мапинга точек используется команда UF_CSYS_map_point. Как вариант самопального мапинга можно использовать операции с матрицами и векторами uf_mtx.h и uf_vec.h. Если объект построен и его надо переместить (не ассоциативно), то посмотрите uf_trns.h

Спасибо!

Воспользовался UF_CSYS_map_point, все получилось =)

Использую

input_csys = UF_CSYS_ROOT_WCS_COORDS;

output_csys = UF_CSYS_ROOT_COORDS;

Прямую с новой СК строит отлично, но центр откужноси переносит неизвестно куда


			// Задаем начальную точку новой СК

			double[] wcs1_origin = { 1.0, 2.0, .0 };

			// Задаем ось, вдоль которой осуществляется поворот осей

			double[] rot_axis_z = {.0, .0, 1.0};

			// Задаем начальное положение матрицы новой СК 

			double[] wcs1_mtx_val = {1.0, .0, .0, .0, 1.0, .0, .0, .0, 1.0};

			// Ортонормируем матрицу

			theUfSession.Mtx3.OrthoNormalize(wcs1_mtx_val);

			// Поворачиваем ск координат на определнной угол доль заданной оси

			theUfSession.Mtx3.RotateAboutAxis(rot_axis_z, Math.PI/5, wcs1_mtx_val);

		   

			Tag wcs1_mtx_id, wcs1;



			// Создаем новую СК

			theUfSession.Csys.CreateMatrix(wcs1_mtx_val, out wcs1_mtx_id);

			theUfSession.Csys.CreateCsys(wcs1_origin, wcs1_mtx_id, out wcs1);

			

			// Делаем новую СК рабочей

			theUfSession.Csys.SetWcs(wcs1);



			Tag arc1;



			UFCurve.Arc arc_coords1 = new UFCurve.Arc();



			arc_coords1.start_angle = .0;

			arc_coords1.end_angle = Math.PI;

			arc_coords1.radius = 3.0;

			

			// преобразуем координаты центра окружности из новой СК в АСК

			double[] arc1_center = { .0, .0, .0 };

			arc_coords1.arc_center = new double[3];

			theUfSession.Csys.MapPoint(3, arc1_center, 1, arc_coords1.arc_center);			



			theUfSession.Csys.AskMatrixOfObject(wcs1, out arc_coords1.matrix_tag);

			theUfSession.Curve.CreateArc(ref arc_coords1, out arc1);



			Tag line2_tag;



			UFCurve.Line line2 = new UFCurve.Line();

			

			// преобразуем начальную и конечную точки прямой из новой СК в АСК

			double[] line2_st_pt = { .0, .0, .0 };

			line2.start_point = new double[3];

			theUfSession.Csys.MapPoint(3, line2_st_pt, 1, line2.start_point);

			

			double[] line2_end_pt = { .0, 3.0, .0 };

			line2.end_point = new double[3];

			theUfSession.Csys.MapPoint(3, line2_end_pt, 1, line2.end_point);



			theUfSession.Curve.CreateLine(ref line2, out line2_tag);

Центр окружности получается в (1.2, .7, 0) в новой СК. С чем это может быть связано?

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

Доброго времени суток!

Уважаемые профессионалы, подскажите пожалуйста, при создании новой WCS возникли вопросы:

1. Создаю новую СК с помошью

Tag csys_cs_id, csys_mtx_id;



			double angle = 30.0 * Math.PI / 180.0;

			double[] csys_mtx_val = new double[] { 1.0, .0, .0, .0, 1.0, .0, .0, .0, 1.0 };

			double[] csys_origin = new double[] { 10.0, 5.0, .0 };

			double[] rot_axis_z = new double[] { .0, .0, 1.0 };



			theUfSession.Mtx3.OrthoNormalize(csys_mtx_val);

			theUfSession.Mtx3.RotateAboutAxis(rot_axis_z, angle, csys_mtx_val);

			theUfSession.Csys.CreateMatrix(csys_mtx_val, out csys_mtx_id);



			theUfSession.Csys.CreateCsys(csys_origin, csys_mtx_id, out csys_cs_id);



			theUfSession.Csys.SetWcs(csys_cs_id);

делаю ее рабочей. Если я хочу поменять ориентацию осей ск чтобы у меня была не xOy, yOx ск, я меняю матрицу csys_mtx_val на

double[] csys_mtx_val = new double[] { -1.0, .0, .0, .0, 1.0, .0, .0, .0, 1.0 };

я получаю yOx, но ось Oz становися (0, 0, -1). Когда применяю метод RotateAboutAxis(double[] rotation_axis, double rotation_angle, double[] mtx) к матрице yOx вдоль оси Oz, то СК поворачивается на нужный мне угол, но становится опять xOy.

Как это можно исправить? Направление оси Oz и поворот новой СК очень важны.

2. Если строю кривую UFCurve.Arc в новой СК, то центр окружности нахожу с помощью метода MapPoint(int input_csys, double[] input_point, int output_csys, double[] output_point), он находится точно. Передаю тег матрицы новой СК объекту arc.matrix_tag, применяю метод метод RotateAboutAxis,то кривая строится под нужным углом, но центр смещается.

Из-за чего это может происходить и как построить кривую в новой СК?

P.S. В Open GRIP есть функция задающая новую СК по двум прямым new_csys = CSYS/line_1, line_2. Неужели нет ничего подобного в Open API C#??

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

Появился еще 1 маленький вопрос:

Как удалить все с рабочей части

Использую

Tag myWorkPart = theUfSession.Part.AskDisplayPart();

... какой-то код

theUfSession.Clear.DeleteAll(myWorkPart);

ничего не выходит?? Подскажите плз, что я не так делаю?

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

Проблему с построением кривых в новой СК решил. необходимо было после MapPoint() центра окружности из ACS в WCS произвести умножение вектора на матрицу WCS

theUfSession.Csys.MapPoint(3, temp_val, 1, arc.arc_center);

			theUfSession.Mtx3.VecMultiply(arc.arc_center, csys_mtx_val, arc.arc_center);

По другим вопросам неужели никто не знает ответа?

черт с ней с ск, подскажите пожалуйста как очистить рабочую область?

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

theUfSession.Clear.DeleteAll(myWorkPart); - это явно не то

( это удаление Clearance Analysis data )

а объекты обычно удаляют до кучи через UF_OBJ_delete_array_of_objects

только сначала надо получить все объекты, например через UF_OBJ_cycle_all в цикле.

Как то так, мож кто знает, как быстрее...

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

theUfSession.Clear.DeleteAll(myWorkPart); - это явно не то

( это удаление Clearance Analysis data )

а объекты обычно удаляют до кучи через UF_OBJ_delete_array_of_objects

только сначала надо получить все объекты, например через UF_OBJ_cycle_all в цикле.

Как то так, мож кто знает, как быстрее...

Как вариант: если построения делаешь сам, а потом их надо удалить, то перед построениями ставишь метку отмены, строишь, а потом откатываешь на сохраненную метку. Работает очень быстро.
Ссылка на сообщение
Поделиться на других сайтах

Как вариант: если построения делаешь сам, а потом их надо удалить, то перед построениями ставишь метку отмены, строишь, а потом откатываешь на сохраненную метку. Работает очень быстро.

О, точно. Про отмены я и забыл.
Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

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

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

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

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

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

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




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