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

Вопрос по NX Open API


metallic

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

Мне надо написать на C# библиотеку(dll) для юниграфикса(дипломная работа), которая будет генерить ступенчатый болт

post-31110-1301826599_thumb.jpg

Мне удалось уже сделать контур болта, фаски и скругления, осталось лыски (обрезать шляпку болта с двух сторон) и резьбу.

Как это сделать вручную - разобрался, вод смоделено вручную:

post-31110-1301826606_thumb.png

Как с помощью NX Open API - пока не понимаю, не могу найти подходящих функций.

Подскажите пожалуйста. Или где можно найти доки с примерами по NX Open API ?

Гугл ничего толкового не выдает.

Могу выложить код, что уже написано.

Програмно пока остановился на этом:

post-31110-1301826614.png

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


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

theProgram = new Program();



			//Объявляем типовой объект NX

			Tag UFBolt;

			//Создаем объект с именем bolt и метрической системой (1)

			theUfSession.Part.New("bolt", 1, out UFBolt);



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

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

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

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

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

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

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



			segment0.start_point = new double[3];

			segment0.start_point[0] = 0.00;

			segment0.start_point[1] = 0.00;

			segment0.start_point[2] = 0.00;

			segment0.end_point = new double[3];

			segment0.end_point[0] = 0.00;

			segment0.end_point[1] = 20.00;

			segment0.end_point[2] = 0.00;



			segment1.start_point = new double[3];

			segment1.start_point[0] = 0.00;

			segment1.start_point[1] = 20.00;

			segment1.start_point[2] = 0.00;

			segment1.end_point = new double[3];

			segment1.end_point[0] = 10.00;

			segment1.end_point[1] = 20.00;

			segment1.end_point[2] = 0.00;



			segment2.start_point = new double[3];

			segment2.start_point[0] = 10.00;

			segment2.start_point[1] = 20.00;

			segment2.start_point[2] = 0.00;

			segment2.end_point = new double[3];

			segment2.end_point[0] = 10.00;

			segment2.end_point[1] = 10.00;

			segment2.end_point[2] = 0.00;



			segment3.start_point = new double[3];

			segment3.start_point[0] = 10.00;

			segment3.start_point[1] = 10.00;

			segment3.start_point[2] = 0.00;

			segment3.end_point = new double[3];

			segment3.end_point[0] = 40.00;

			segment3.end_point[1] = 10.00;

			segment3.end_point[2] = 0.00;



			segment4.start_point = new double[3];

			segment4.start_point[0] = 40.00;

			segment4.start_point[1] = 10.00;

			segment4.start_point[2] = 0.00;

			segment4.end_point = new double[3];

			segment4.end_point[0] = 40.00;

			segment4.end_point[1] = 0.00;

			segment4.end_point[2] = 0.00;



			segment5.start_point = new double[3];

			segment5.start_point[0] = 40.00;

			segment5.start_point[1] = 00.00;

			segment5.start_point[2] = 0.00;

			segment5.end_point = new double[3];

			segment5.end_point[0] = 0.00;

			segment5.end_point[1] = 0.00;

			segment5.end_point[2] = 0.00;



			Tag[] BoltArray = new Tag[7];

			theUfSession.Curve.CreateLine(ref segment0, out BoltArray[0]);

			theUfSession.Curve.CreateLine(ref segment1, out BoltArray[1]);

			theUfSession.Curve.CreateLine(ref segment2, out BoltArray[2]);

			theUfSession.Curve.CreateLine(ref segment3, out BoltArray[3]);

			theUfSession.Curve.CreateLine(ref segment4, out BoltArray[4]);

			theUfSession.Curve.CreateLine(ref segment5, out BoltArray[5]);



			double[] ref_pt1 = new double[3];

			ref_pt1[0] = 0.00;

			ref_pt1[1] = 0.00;

			ref_pt1[2] = 0.00;



			double[] direction1 = { 1.00, 0.00, 0.00 };

			string[] limit1 = { "0", "360" };

			Tag[] features1;



			theUfSession.Modl.CreateRevolved(BoltArray, limit1, ref_pt1, direction1, FeatureSigns.Nullsign, out features1);



			//Сохраняем болт из массива деталей в отдельную переменную

			Tag feat = features1[0];

Этот код генерит вот такую деталь:

post-31110-1301914294_thumb.png

Вот как на ней нарезать резьбу?(на втором цилиндре меньшего диаметра).

Я так понимаю, в переменной feat хранится сама 3Д деталь, вот ее как-то надо передать в нужную ф-ию? Или надо как-то найти плоскость на которой резать резьбу?

В приложении также целиком файл Program.cs переименованный в Program.txt

Program.txt

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

УРРААААААААААААААААА!!!!!!!!!!!!!!!

Я все же разобрался!

Осталось прикрутить резьбу к основному проекту

theProgram = new Program();



			//Объявляем типовой объект NX

			Tag UFBolt;

			//Создаем объект с именем bolt и метрической системой (1)

			theUfSession.Part.New("bolt_t", 1, out UFBolt);



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

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

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

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



			segment0.start_point = new double[3];

			segment0.start_point[0] = 0.00;

			segment0.start_point[1] = 0.00;

			segment0.start_point[2] = 0.00;

			segment0.end_point = new double[3];

			segment0.end_point[0] = 0.00;

			segment0.end_point[1] = 0.00;

			segment0.end_point[2] = 50.00;



			segment1.start_point = new double[3];

			segment1.start_point[0] = 0.00;

			segment1.start_point[1] = 0.00;

			segment1.start_point[2] = 50.00;

			segment1.end_point = new double[3];

			segment1.end_point[0] = 7.866;

			segment1.end_point[1] = 0.00;

			segment1.end_point[2] = 50.00;



			segment2.start_point = new double[3];

			segment2.start_point[0] = 7.866;

			segment2.start_point[1] = 0.00;

			segment2.start_point[2] = 50.00;

			segment2.end_point = new double[3];

			segment2.end_point[0] = 7.866;

			segment2.end_point[1] = 0.00;

			segment2.end_point[2] = 0.00;



			segment3.start_point = new double[3];

			segment3.start_point[0] = 7.866;

			segment3.start_point[1] = 0.00;

			segment3.start_point[2] = 0.00;

			segment3.end_point = new double[3];

			segment3.end_point[0] = 0.00;

			segment3.end_point[1] = 0.00;

			segment3.end_point[2] = 0.00;		  



			Tag[] BoltArray = new Tag[5];

			theUfSession.Curve.CreateLine(ref segment0, out BoltArray[0]);

			theUfSession.Curve.CreateLine(ref segment1, out BoltArray[1]);

			theUfSession.Curve.CreateLine(ref segment2, out BoltArray[2]);

			theUfSession.Curve.CreateLine(ref segment3, out BoltArray[3]);



			double[] ref_pt1 = new double[3];

			ref_pt1[0] = 0.00;

			ref_pt1[1] = 0.00;

			ref_pt1[2] = 0.00;



			double[] direction1 = { 0.00, 0.00, 1.00 };

			string[] limit1 = { "0", "360" };

			Tag[] features1;



			theUfSession.Modl.CreateRevolved(BoltArray, limit1, ref_pt1, direction1, FeatureSigns.Nullsign, out features1);



			//Сохраняем цилиндр из массива деталей в отдельную переменную

			Tag feat = features1[0];

			

			Tag[] FeatFaces;

			int FacesCount, FaceType, FaceNormDir;

			Tag face, s_face, c_face, feature_eid;

			double[] point = new double[3];

			double[] dir = new double[3];

			double[] box = new double[6];

			double radius, rad;



			s_face = new Tag();

			c_face = new Tag();

			

			theUfSession.Modl.AskFeatFaces(feat, out FeatFaces);

			theUfSession.Modl.AskListCount(FeatFaces, out FacesCount);



			UFModl.SymbThreadData thread = new UFModl.SymbThreadData();



			for (int i = 0; i < FacesCount; i++)

			{

				theUfSession.Modl.AskListItem(FeatFaces, i, out face);

				theUfSession.Modl.AskFaceData(face, out FaceType, point, dir, box, out radius, out rad, out FaceNormDir);



				if (FaceType == 22)

				{

					s_face = face;

					//UI.GetUI().NXMessageBox.Show("Message", NXMessageBox.DialogType.Information, "Planar face");

				}

				if (FaceType == 16)

				{

					c_face = face;

					//UI.GetUI().NXMessageBox.Show("Message", NXMessageBox.DialogType.Information, "Cylindrical face");

				}

			}



			double[] thread_direction = { 0.00, 0.00, 1.00 };



			thread.cyl_face = c_face;

			thread.start_face = s_face;

			thread.axis_direction = thread_direction;		   

			thread.rotation = 1;

			thread.num_starts = 1;

			thread.length = "50";

			thread.form = "Metric";

			thread.method = "CUT";

			thread.callout = "M16_X_1.5";

			thread.major_dia = "15.732";

			thread.minor_dia = "14.344";

			thread.tapped_dia = "15.732";

			thread.pitch = "1";

			thread.angle = "60";			

						

			try

			{

				theUfSession.Modl.CreateSymbThread(ref thread, out feat);	

			}

			catch (NXOpen.NXException ex)

			{

				UI.GetUI().NXMessageBox.Show("Message", NXMessageBox.DialogType.Error, ex.Message);

			}

			

			theProgram.Dispose();

post-31110-1302855002_thumb.png

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

Все получилось, финальный результат:

post-31110-1302863978_thumb.png

Примерно так выглядит интерфейс работы с БД(добавление/удаление ступенчатых болтов):

post-31110-1302868190_thumb.png

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

а с внутренньей резьбой не пробовали?

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

а с внутренньей резьбой не пробовали?

Нет, слава богу, нет необходимости, я с этой-то намучился, без примеров и документации методом тыка сделал.
Ссылка на сообщение
Поделиться на других сайтах
  • 2 недели спустя...

Помогите сделать резьбу!

С произвольными размерами

Код программы

theProgram = new Program();

Tag UFPart1;

string name1 = "model_k";

int units1 = 1;

theUfSession.Part.New(name1, units1, out UFPart1);

int L = 550;

int D = 80;

double D2 = 67.5;

int L5 = 16;

int L2 = 405;

double C = 5.5;

double C1 = 2.5;

int d1 = 10;

int L4 = 35;

int L3 = 70;

int d = 40;

int t = 68;

int b = 24;

int L1 = 470;

int F1 = L2 - L5;

double N = D / 2 - D2 / 2;

double[] l1_endpt1 = { 0, 0, 0 };

double[] l1_endpt2 = { 0, -(D / 2 - C), 0 };

double[] l2_endpt1 = { 0, -(D / 2 - C), 0 };

double[] l2_endpt2 = { -C, -D / 2, 0 };

double[] l3_endpt1 = { -C, -D / 2, 0 };

double[] l3_endpt2 = { -(F1 - N), -D / 2, 0 };

double[] l4_endpt1 = { -(F1 - N), -D / 2, 0 };

double[] l4_endpt2 = { -(L2 - L5), -D2 / 2, 0 };

double[] l5_endpt1 = { -(L2 - L5), -D2 / 2, 0 };

double[] l5_endpt2 = { -L2, -D2 / 2, 0 };

double[] l6_endpt1 = { -L2, -D2 / 2, 0 };

double[] l6_endpt2 = { -(L2 + N), -D / 2, 0 };

double[] l7_endpt1 = { -(L2 + N), -D / 2, 0 };

double[] l7_endpt2 = { -(L - C1), -D / 2, 0 };

double[] l8_endpt1 = { -(L - C1), -D / 2, 0 };

double[] l8_endpt2 = { -L, -(D / 2 - C1), 0 };

double[] l20_endpt1 = { -L, -(D / 2 - C1), 0 };

double[] l20_endpt2 = { -L, 0, 0 };

double[] l21_endpt1 = { -L, 0, 0 };

double[] l21_endpt2 = { 0, 0, 0 };

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

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

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

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

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

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

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

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

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

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

line1.start_point = new double[3];

line1.start_point[0] = l1_endpt1[0];

line1.start_point[1] = l1_endpt1[1];

line1.start_point[2] = l1_endpt1[2];

line1.end_point = new double[3];

line1.end_point[0] = l1_endpt2[0];

line1.end_point[1] = l1_endpt2[1];

line1.end_point[2] = l1_endpt2[2];

line2.start_point = new double[3];

line2.start_point[0] = l2_endpt1[0];

line2.start_point[1] = l2_endpt1[1];

line2.start_point[2] = l2_endpt1[2];

line2.end_point = new double[3];

line2.end_point[0] = l2_endpt2[0];

line2.end_point[1] = l2_endpt2[1];

line2.end_point[2] = l2_endpt2[2];

line3.start_point = new double[3];

line3.start_point[0] = l3_endpt1[0];

line3.start_point[1] = l3_endpt1[1];

line3.start_point[2] = l3_endpt1[2];

line3.end_point = new double[3];

line3.end_point[0] = l3_endpt2[0];

line3.end_point[1] = l3_endpt2[1];

line3.end_point[2] = l3_endpt2[2];

line4.start_point = new double[3];

line4.start_point[0] = l4_endpt1[0];

line4.start_point[1] = l4_endpt1[1];

line4.start_point[2] = l4_endpt1[2];

line4.end_point = new double[3];

line4.end_point[0] = l4_endpt2[0];

line4.end_point[1] = l4_endpt2[1];

line4.end_point[2] = l4_endpt2[2];

line5.start_point = new double[3];

line5.start_point[0] = l5_endpt1[0];

line5.start_point[1] = l5_endpt1[1];

line5.start_point[2] = l5_endpt1[2];

line5.end_point = new double[3];

line5.end_point[0] = l5_endpt2[0];

line5.end_point[1] = l5_endpt2[1];

line5.end_point[2] = l5_endpt2[2];

line6.start_point = new double[3];

line6.start_point[0] = l6_endpt1[0];

line6.start_point[1] = l6_endpt1[1];

line6.start_point[2] = l6_endpt1[2];

line6.end_point = new double[3];

line6.end_point[0] = l6_endpt2[0];

line6.end_point[1] = l6_endpt2[1];

line6.end_point[2] = l6_endpt2[2];

line7.start_point = new double[3];

line7.start_point[0] = l7_endpt1[0];

line7.start_point[1] = l7_endpt1[1];

line7.start_point[2] = l7_endpt1[2];

line7.end_point = new double[3];

line7.end_point[0] = l7_endpt2[0];

line7.end_point[1] = l7_endpt2[1];

line7.end_point[2] = l7_endpt2[2];

line8.start_point = new double[3];

line8.start_point[0] = l8_endpt1[0];

line8.start_point[1] = l8_endpt1[1];

line8.start_point[2] = l8_endpt1[2];

line8.end_point = new double[3];

line8.end_point[0] = l8_endpt2[0];

line8.end_point[1] = l8_endpt2[1];

line8.end_point[2] = l8_endpt2[2];

line20.start_point = new double[3];

line20.start_point[0] = l20_endpt1[0];

line20.start_point[1] = l20_endpt1[1];

line20.start_point[2] = l20_endpt1[2];

line20.end_point = new double[3];

line20.end_point[0] = l20_endpt2[0];

line20.end_point[1] = l20_endpt2[1];

line20.end_point[2] = l20_endpt2[2];

line21.start_point = new double[3];

line21.start_point[0] = l21_endpt1[0];

line21.start_point[1] = l21_endpt1[1];

line21.start_point[2] = l21_endpt1[2];

line21.end_point = new double[3];

line21.end_point[0] = l21_endpt2[0];

line21.end_point[1] = l21_endpt2[1];

line21.end_point[2] = l21_endpt2[2];

Tag[] objarray1 = new Tag[10];

theUfSession.Curve.CreateLine(ref line1, out objarray1[0]);

theUfSession.Curve.CreateLine(ref line2, out objarray1[1]);

theUfSession.Curve.CreateLine(ref line3, out objarray1[2]);

theUfSession.Curve.CreateLine(ref line4, out objarray1[3]);

theUfSession.Curve.CreateLine(ref line5, out objarray1[4]);

theUfSession.Curve.CreateLine(ref line6, out objarray1[5]);

theUfSession.Curve.CreateLine(ref line7, out objarray1[6]);

theUfSession.Curve.CreateLine(ref line8, out objarray1[7]);

theUfSession.Curve.CreateLine(ref line20, out objarray1[8]);

theUfSession.Curve.CreateLine(ref line21, out objarray1[9]);

double[] ref_pt1 = new double[3];

ref_pt1[0] = 0.00;

ref_pt1[1] = 0.00;

ref_pt1[2] = 0.00;

double[] direction1 = { 1.00, 0.00, 0.00 };

string[] limit1 = { "0", "360" };

Tag[] features1;

theUfSession.Modl.CreateRevolved(objarray1, limit1, ref_pt1, direction1, FeatureSigns.Nullsign, out features1);

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

Не хочется плодить тем, вопрос задам в этой (хотя и задавал в поднятых темах, но туда видимо не часто кто заходит).

Вопрос по NXOpen для c# (.NET)

Есть код:

static Session s = Session.GetSession();static ListingWindow lw = s.ListingWindow;    public static void Main()    {        lw.Open();        Component root = s.Parts.Display.ComponentAssembly.RootComponent;        listComponent(root);    }    public static void listComponent(Component comp)    {        Part c_part = null;        foreach (Component child in comp.GetChildren())        {                c_part = (Part)child.Prototype;                ...                listComponent(child);        }    }

Метод обрабатывает компоненты из массива comp.GetChildren(). Если в сборке какой-то компонент закрыт (выгружен), то появляется ошибка при выполнении программы

<noindex>Изображение</noindex>

Можно конечно заключить в try - catch, но выгруженные компоненты тоже нужно обработать (т.е. загрузить и обработать)

ЗАранее спасибо!

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

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

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

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

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

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

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

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

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

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

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




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