Как написать программу для nx

Для разработки прикладных пользовательских программ для NX 7.5 SIEMENS рекомендует использовать среду разработку Microsoft Visual Studio 2008. Допускается (но при этом не гарантируется работоспособность) использование более поздних версий.

В составе установленного NX 7.5 присутствуют файлы мастеров для Visual Studio 2008, которые позволяют создавать под него прикладные программы. Поддерживаются 3 языка: C++, C#, Visual Basic. Для получения доступа к мастерам Visual Studio необходимо выполнить следующую инструкцию:

  1. Открыть папку “vs_files”, которая находится в папке установленного NX. По умолчанию путь к ней: C:Program FilesUGSNX7.5UGOPENvs_files
  2. Скопировать содержимое папки “vs_files” в рабочий каталог Visual Studio. Путь к каталогу по умолчанию: C:Program FilesMicrosoft Visual Studio 9.0. В процессе копирования необходимо подтвердить желание при копировании заменить папки и файлы с совпадающими именами. Внимание: в процессе копирования Visual Studio должна быть выгружена из памяти.

При запуске Visual Studio после выполнения представленной выше инструкции в диалоге создания проектов будут включены соответствующие мастера (3 штуки: по одному для каждого языка). Рассмотрим работу с мастером под C# . В качестве типа проектов выберете C# (рис. 1.1). В открывшемся справа меню выберете NX7 Open C# Wizard. Далее задайте имя и расположение проекта, затем нажмите кнопку ОК. Рисунок 1.1 — Мастер создания проекта В открывшемся окне мастера нажмите кнопку Next. В следующем диалоговом окне (рис. 1.2) предлагается выбрать тип создаваемого приложения и типы используемых API. Выберем An internal application that can be activated from an NX session (DLL), что соответствует созданию прикладной подпрограммы в виде динамической библиотеки. В пункте “Use APIs” установите галочки напротив двух предлагаемых вариантов. Нажмите кнопку Next.

Рисунок 1.2 — Настройка типа приложения и используемых API В открывшемся диалоговом окне (рис. 1.3) необходимо выбрать опции загрузки и выгрузки разрабатываемой библиотеки. Выберем в качестве опции загрузки “Explicitly (Main)”, что соответствует загрузке приложения через вызываемый пользователем диалог. Также доступны следующие варианты: при загрузке NX и согласно установленному событию. В качестве опции выгрузки выберем “Automatically, when the application completes”. В данном случае библиотека будет выгружена вместе с NX. Другие доступные варианты позволяют выгружать библиотеку по завершению работы NX или через специальный диалог. По завершению настройки нажмите кнопку Finish, после чего среда разработки автоматически переместит вас в окно написания программного кода.
Рисунок 1.3 — Настройка загрузки и выгрузки библиотеки Найдите следующую процедуру: //———————————————————— //Explicit Activation //This entry point is used to activate the application explicitly //———————————————————— public static int Main(string[] args) < int retValue = 0; try < theProgram = new Program(); //TODO: Add your application code here theProgram.Dispose(); >catch (NXOpen.NXException ex) < // —- Enter your exception handling code here — >return retValue; > Вместо строки комментария “//TODO: Add your application code here” введите программный код разрабатываемого приложения. В качестве первой программы предлагается вывести типовое сообщение NX. Для этого введите следующую строку: UI.GetUI().NXMessageBox.Show(«Message»,XMessageBox.DialogType.Information, » NXOpen/API»); Здесь “Message” – заголовок сообщения, NXMessageBox.DialogType.Information – тип окна сообщения (в данном случае информационный), “Изучаем NXOpen/API” – текст сообщения. Далее необходимо изменить исходящий путь для сборки программы. Зайдите в настройки проекта. Выберите вкладку “Build”. И выберите пусть для сохранения файлов. Пример: “D:NXProject”. Далее необходимо откомпилировать проект. Для этого можно воспользоваться клавишей F6. Если все проделано верно в окне ошибок и предупреждений будет выведено сообщение о 0 ошибок. Вероятно вам будет сделано несколько предупреждений. Обычно они не препятствуют нормальной работе приложения, однако рекомендуется тщательно с ними ознакомиться и по возможности их устранить. Результатом компиляции является файл с расширением “.dll” и именем, которое Вы задали при создании проекта. Файл следует искать в каталоге “Debug”, который в свою очередь лежит в папке “Bin”. Пример пути: C:ProjectsMyProjectMyProject binDebug. Внимание: NX 7.5 не поддерживает работу с кириллическими файловыми именами, поэтому все пути и имена, с которыми работает NX должны быть выполнены исключительно латиницей. Для запуска библиотеки необходимо загрузить NX, после чего в главном меню выбрать последовательность команд Файл – Выполнить – NX функция пользователя или воспользоваться сочетанием клавиш Ctrl-U. В запустившемся диалоге открытия файла следует указать требуемую библиотеку и нажать ОК. Внимание: в NX 7.5 существует понятие “Роль”. В зависимости от выбора роли интерфейс пользователя системы значительно изменяется. Возможность запуска пользовательских прикладных подпрограмм доступна не во всех ролях. Рекомендуем выбирать роль “Расширенные с полным меню”. Результат выполнения созданной ранее библиотеки показан на рисунке 1.4. Рисунок 1.4 — Результат работы учебной библиотеки Более сложный вариант создание программы для замысловатой кривой, заданной параметрическим способом (х = x(t), у = y(t)). Формулы, определяющие эту кривую, позаимствованы из рубрики «Занимательный Компьютер» журнала Scientific American (№ 3, 1985). Кривая задается достаточно простыми формулами в полярной форме:
x = sin(0.99t) — 0.7cos(3.01t); у = cos(l.0lt) + 0.l sin(15.03t), где переменная t — угол по отношению к положительному направлению оси X, радиус-вектор совершает 100 полных оборотов (что соответствует значению t=36000), прежде чем кривая замкнется, а полученная «осциллограмма» напоминает сеть, наброшенную на некий трехмерный объект. Алгоритм работы приложения по построению параметрической кривой:

  1. Запрос параметров кривой (габариты прямоугольной области, в которую будет вписана кривая, глубина гравировки, максимальное значение параметра!);
  2. Вывод на экран габаритного прямоугольника и изменение масштаба изображения (Fit);
  3. Расчет в цикле с заданным шагом по параметру t всех точек кривой, соединение точек отрезками прямых, вывод информации в CLS-файл.
Читайте также:
Как узнать какая программа грузит видеокарту

Для упрощения приложения предположим, что оно запускается после создания пользователем нового файла модели Unigraphics. Прежде всего создадим новый файл модели детали (part), в котором будет создаваться кривая. Пример создание нового файла выглядит следующим образом: FileNew fileNew1; fileNew1 = theSession.Parts.FileNew(); fileNew1.TemplateFileName = «model-plain-1-mm-template.prt»; fileNew1.Application = FileNewApplication.Modeling; fileNew1.Units = NXOpen.Part.Units.Millimeters; fileNew1.NewFileName = «C:\Program Files\UGS\NX 7.5\UGII\model1.prt»; fileNew1.MasterFileName = «»; fileNew1.UseBlankTemplate = false; fileNew1.MakeDisplayedPart = true; NXObject nXObject1; nXObject1 = fileNew1.Commit(); Part workPart = theSession.Parts.Work; Part displayPart = theSession.Parts.Display; theSession.DeleteUndoMark(markId2, null); fileNew1.Destroy(); Для создания меню ввода параметров кривой используем встроенный инструмент NX “Разработчик блока UI”.

В разделе “Block Catalog” Вы можете найти раздел “Кол-во”. Перетащите компонент “Двойной точности” на экран 5 раз подряд В итоге у Вас должно получиться меню следующего вида: Зайдите в Меню настроек и задайте имя и значение каждому блоку согласно таблице

Group Maximum Value Minimum Value Label Value
Double0 100000 Ширина 200
Double01 100000 Высота 100
Double02 100000 Z гравировки 0.1
Double03 100000 t max 3600
Double04 100000 Delta t 1

Переключение между блоками осуществляется в меню “Блоки” Задайте имя «Меню кривой» для Вашей формы. Далее перейдите в раздел «Генерация кода» и правой кнопкой мыши переключите язык программирования на «C#» В результате Вы должны получить следующую форму Сохраните меню в папку с Вашим проектом с именем «Curve». Автоматически создадуться файлы «Curve.cs» и «Curve.dlx». Файл «Curve.dlx» всегда должен сопровождать сборку проекта. Теперь Вам необходимо добавить меню в проект. Для этого правой кнопкой мыш щелкните по проекту и выберите пункт «Existing Item». Найдите файл «Curve.cs» и добавте его в проект.

Для построения линий в NX используется следующий код: UFCurve.Line line1 = new UFCurve.Line(); // объвление и инициализация экземпляра линии; line1.start_point = new double[3]; // инициализация начальной точки линии; line1.end_point = new double[3]; // инициализация конечной точки линии; //начальные координаты линии; line1.start_point[0] = 1; line1.start_point[1] = 1; line1.start_point[2] = 1; //конечные координаты линии; line1.end_point[0] = 2; line1.end_point[0] = 2; line1.end_point[0] = 2; Tag[] objarray1 = new Tag[7]; //создание линии theUfSession.Curve.CreateLine(ref line1, out objarray1[0]); Теперь в классе Program (файл «Program.cs») необходимо создать статический метод «RunAlgorithm»: //объвление функции static public void RunAlgorithm(double W, double H, double Z_eng, double t_max, double delta_t) < double t = 0; // объвление экземпляра линии UFCurve.Line line1 = new UFCurve.Line(); line1.start_point = new double[3]; line1.end_point = new double[3]; // формулы нахождения начальной точки линии для X,Y,Z координат line1.start_point[0] = (W / 3.4) * (Math.Sin(0.99 * t) — 0.7 * Math.Cos(3.01 * t)); line1.start_point[1] = (W / 2.2) * (Math.Cos(1.01 * t) — 0.1 * Math.Cos(15.03 * t)); line1.start_point[2] = 0.0; Tag[] objarray1 = new Tag[7]; //Цикл для создания последовательности линий согласно уравнению кривой for (t = delta_t; t < t_max; t = t + delta_t) < // формулы нахождения конечных точек линии line1.end_point[0] = (W / 3.4) * (Math.Sin(0.99 * (t * Math.PI / 180)) — 0.7 * Math.Cos(3.01 * (t * Math.PI / 180))); line1.end_point[1] = (W / 2.2) * (Math.Sin(1.01 * (t * Math.PI / 180)) — 0.1 * Math.Cos(15.03 * (t * Math.PI / 180))); line1.end_point[2] = 0.0; // создание линии theUfSession.Curve.CreateLine(ref line1, out objarray1[0]); // присваение значений координат конечной точки текущей линии начальной точке следующей линии. line1.start_point[0] = line1.end_point[0]; line1.start_point[1] = line1.end_point[1]; line1.start_point[2] = line1.end_point[2]; >> Далее необходимо создать вызов метода «RunAlgorithm» из созданного Вами меню в NX “Разработчик блока UI”. Для этого зайдите в файл «Curve.cs» Вашего проекта. Найдите констрруктор «Curve()» и измените строку theDialogName = «Curve.dlx»; на theDialogName = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + «\Curve.dlx»; Данное дествие позволит Вам производить поиск меню «Curve.dlx» в директории запуска сборки программы. Теперь найдите метод «ok_cb()», который будет вызывается при нажатии кнопки «ОК» в созданном Вами меню, и добвте код вызова метода «RunAlgorithm». Program.RunAlgorithm(Convert.ToDouble(double0.GetProperties().GetDouble(«Value»)), Convert.ToDouble(double01.GetProperties().GetDouble(«Value»)), Convert.ToDouble(double02.GetProperties().GetDouble(«Value»)), Convert.ToDouble(double03.GetProperties().GetDouble(«Value»)), Convert.ToDouble(double04.GetProperties().GetDouble(«Value»))); Вызов меню будет осуществлять из файла Program.cs. Вернитесь в метод Main() и удалите строку вывода первого сообщения. UI.GetUI().NXMessageBox.Show(«Message»,XMessageBox.DialogType.Information, » NXOpen/API»); Вместо нее ведите строку создания экземпляра Вашего меню. Curve newobject = new Curve(); newobject.Show(); Теперь запустите сборку проекта (F6) в Visual Studio 2008. Скопируйте файл «Curve.dlx» в сборку проекта (Выбранный ранее путь «D:NXProject».) Запустите проект в NX сочетанеием клавиш «Ctrl+U», вызвав Ваш «.dll»-файл сборки проекта. Должно выйти меню ввода параметров: Нажмите «Ок». На экране должна появиться кривая Индивидуальное задание: Задайте собственное уравнение построения кривой и отобразите ее в CAD-системе NX

Как быстро написать управляющую программу для ЧПУ в SIEMENS NX 8.5 CAM (Unigraphics)

Обработка простой детали в Siemens NX CAM

Источник: studfile.net

Пример создания утилиты для Unigraphics NX с помощью библиотеки NXOpen на языке Java

Решил рассказать, кому интересно, как можно создавать любые утилиты для Unigraphics NX с помощью библиотеки NXOpen и языка программирования Java.В качестве примера моя утилита будет строить 2d сетку на все свободных телах и гранях(это может быть полезно для задачи оптимизации).

Необходимую информацию по библиотеке NXOpen можно найти на официальном сайте.

В корневой папки NX лежат необходимые нам библиотеки по умолчанию, а так же примеры:

  • C:Program FilesSiemensNX 12.0NXBIN с расширением jar
  • C:Program FilesSiemensNX 12.0UGOPEN с расширением jar
  • C:Program FilesSiemensNX 12.0UGOPENSampleNXOpenApplicationsJava.

Вот пример записи журнала в текстовый файл.

Листинг кода

// NX 12.0.1.7 // Journal created by Aleksandr on Sun Nov 3 19:49:32 2019 RTZ 2 (зима) // import nxopen.*; public class journalTT < public static void main(String [] args) throws NXException, java.rmi.RemoteException < nxopen.Session theSession = (nxopen.Session)nxopen.SessionFactory.get(«Session»); nxopen.cae.FemPart workFemPart = ((nxopen.cae.FemPart)theSession.parts().baseWork()); nxopen.cae.FemPart displayFemPart = ((nxopen.cae.FemPart)theSession.parts().baseDisplay()); // ———————————————- // Меню: Вставить->Сетка->2D сетка. // ———————————————- int markId1; markId1 = theSession.setUndoMark(nxopen.Session.MarkVisibility.VISIBLE, «Начало»); nxopen.cae.FEModel fEModel1 = ((nxopen.cae.FEModel)workFemPart.findObject(«FEModel»)); nxopen.cae.MeshManager meshManager1 = ((nxopen.cae.MeshManager)fEModel1.find(«MeshManager»)); nxopen.cae.Mesh2d nullNXOpen_CAE_Mesh2d = null; nxopen.cae.Mesh2dBuilder mesh2dBuilder1; mesh2dBuilder1 = meshManager1.createMesh2dBuilder(nullNXOpen_CAE_Mesh2d); nxopen.cae.MeshCollector nullNXOpen_CAE_MeshCollector = null; mesh2dBuilder1.elementType().destinationCollector().setElementContainer(nullNXOpen_CAE_MeshCollector); mesh2dBuilder1.elementType().setElementTypeName(«CQUAD4»); nxopen.Unit unit1 = ((nxopen.Unit)workFemPart.unitCollection().findObject(«MilliMeter»)); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«quad mesh overall edge size», «10», unit1); mesh2dBuilder1.propertyTable().setBooleanPropertyValue(«target minimum element edge length», false); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«surface curvature threshold», «5.05», unit1); nxopen.Unit nullNXOpen_Unit = null; mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«small feature value», «1», nullNXOpen_Unit); theSession.setUndoMarkName(markId1, «Диалоговое окно 2D сетка»); nxopen.DisplayableObject [] objects1 = new nxopen.DisplayableObject[1]; nxopen.cae.CAEBody cAEBody1 = ((nxopen.cae.CAEBody)workFemPart.findObject(«CAE_Body(14)»)); nxopen.cae.CAEFace cAEFace1 = ((nxopen.cae.CAEFace)cAEBody1.findObject(«CAE_Face(14)»)); objects1[0] = cAEFace1; boolean added1; added1 = mesh2dBuilder1.selectionList().add(objects1); nxopen.DisplayableObject [] objects2 = new nxopen.DisplayableObject[1]; nxopen.cae.CAEBody cAEBody2 = ((nxopen.cae.CAEBody)workFemPart.findObject(«CAE_Body(3)»)); nxopen.cae.CAEFace cAEFace2 = ((nxopen.cae.CAEFace)cAEBody2.findObject(«CAE_Face(3)»)); objects2[0] = cAEFace2; boolean added2; added2 = mesh2dBuilder1.selectionList().add(objects2); nxopen.DisplayableObject [] objects3 = new nxopen.DisplayableObject[1]; nxopen.cae.CAEBody cAEBody3 = ((nxopen.cae.CAEBody)workFemPart.findObject(«CAE_Body(2)»)); nxopen.cae.CAEFace cAEFace3 = ((nxopen.cae.CAEFace)cAEBody3.findObject(«CAE_Face(2)»)); objects3[0] = cAEFace3; boolean added3; added3 = mesh2dBuilder1.selectionList().add(objects3); nxopen.DisplayableObject [] objects4 = new nxopen.DisplayableObject[1]; nxopen.cae.CAEBody cAEBody4 = ((nxopen.cae.CAEBody)workFemPart.findObject(«CAE_Body(1)»)); nxopen.cae.CAEFace cAEFace4 = ((nxopen.cae.CAEFace)cAEBody4.findObject(«CAE_Face(1)»)); objects4[0] = cAEFace4; boolean added4; added4 = mesh2dBuilder1.selectionList().add(objects4); int markId2; markId2 = theSession.setUndoMark(nxopen.Session.MarkVisibility.INVISIBLE, «2D сетка»); theSession.deleteUndoMark(markId2, null); int markId3; markId3 = theSession.setUndoMark(nxopen.Session.MarkVisibility.INVISIBLE, «2D сетка»); mesh2dBuilder1.setAutoResetOption(false); mesh2dBuilder1.elementType().setElementDimension(nxopen.cae.ElementTypeBuilder.ElementType.SHELL); mesh2dBuilder1.elementType().setElementTypeName(«CQUAD4»); nxopen.cae.DestinationCollectorBuilder destinationCollectorBuilder1; destinationCollectorBuilder1 = mesh2dBuilder1.elementType().destinationCollector(); destinationCollectorBuilder1.setElementContainer(nullNXOpen_CAE_MeshCollector); destinationCollectorBuilder1.setAutomaticMode(true); mesh2dBuilder1.propertyTable().setIntegerPropertyValue(«meshing method», 0); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«quad mesh overall edge size», «10», unit1); mesh2dBuilder1.propertyTable().setBooleanPropertyValue(«block decomposition option bool», false); mesh2dBuilder1.propertyTable().setBooleanPropertyValue(«mapped mesh option bool», false); mesh2dBuilder1.propertyTable().setIntegerPropertyValue(«fillet num elements», 3); mesh2dBuilder1.propertyTable().setIntegerPropertyValue(«num elements on cylinder circumference», 6); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«element size on cylinder height», «1», unit1); mesh2dBuilder1.propertyTable().setIntegerPropertyValue(«quad only option», 0); mesh2dBuilder1.propertyTable().setBooleanPropertyValue(«mesh individual faces option bool», false); mesh2dBuilder1.propertyTable().setIntegerPropertyValue(«midnodes», 0); mesh2dBuilder1.propertyTable().setBooleanPropertyValue(«geometry tolerance option bool», false); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«geometry tolerance», «0», unit1); mesh2dBuilder1.propertyTable().setBooleanPropertyValue(«target maximum element edge length bool», false); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«maximum element edge length», «1», unit1); mesh2dBuilder1.propertyTable().setBooleanPropertyValue(«target minimum element edge length», false); mesh2dBuilder1.propertyTable().setBooleanPropertyValue(«split poor quads bool», false); mesh2dBuilder1.propertyTable().setBooleanPropertyValue(«move nodes off geometry bool», false); mesh2dBuilder1.propertyTable().setBooleanPropertyValue(«max quad warp option bool», false); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«max quad warp», «5», nullNXOpen_Unit); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«max jacobian», «5», nullNXOpen_Unit); mesh2dBuilder1.propertyTable().setBooleanPropertyValue(«target element skew bool», false); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«element skew», «30», nullNXOpen_Unit); mesh2dBuilder1.propertyTable().setBooleanPropertyValue(«max included angle quad option bool», false); nxopen.Unit unit2 = ((nxopen.Unit)workFemPart.unitCollection().findObject(«Degrees»)); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«max included angle quad», «150», unit2); mesh2dBuilder1.propertyTable().setBooleanPropertyValue(«min included angle quad option bool», false); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«min included angle quad», «30», unit2); mesh2dBuilder1.propertyTable().setBooleanPropertyValue(«max included angle tria option bool», false); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«max included angle tria», «150», unit2); mesh2dBuilder1.propertyTable().setBooleanPropertyValue(«min included angle tria option bool», false); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«min included angle tria», «30», unit2); mesh2dBuilder1.propertyTable().setBooleanPropertyValue(«mesh transition bool», false); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«mesh size variation», «50», nullNXOpen_Unit); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«surface curvature threshold», «5.05», unit1); mesh2dBuilder1.propertyTable().setBooleanPropertyValue(«alternate feature abstraction bool», false); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«minimum feature element size», «0.001», unit1); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«small feature tolerance», «10», nullNXOpen_Unit); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«small feature value», «1», nullNXOpen_Unit); mesh2dBuilder1.propertyTable().setBooleanPropertyValue(«suppress hole option bool», false); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«hole diameter tolerance», «0», unit1); mesh2dBuilder1.propertyTable().setIntegerPropertyValue(«hole suppresion point type», 0); mesh2dBuilder1.propertyTable().setBooleanPropertyValue(«merge edge toggle bool», false); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«edge angle», «15», unit2); mesh2dBuilder1.propertyTable().setBooleanPropertyValue(«quad mesh edge match toggle», false); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«quad mesh edge match tolerance», «0.02», unit1); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«quad mesh smoothness tolerance», «0.01», unit1); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«quad mesh surface match tolerance», «0.001», unit1); mesh2dBuilder1.propertyTable().setIntegerPropertyValue(«quad mesh transitional rows», 3); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«min face angle», «20», unit2); mesh2dBuilder1.propertyTable().setIntegerPropertyValue(«mesh time stamp», 0); mesh2dBuilder1.propertyTable().setBaseScalarWithDataPropertyValue(«quad mesh node coincidence tolerance», «0.0001», unit1); mesh2dBuilder1.propertyTable().setIntegerPropertyValue(«mesh edit allowed», 0); mesh2dBuilder1.propertyTable().setIntegerPropertyValue(«transition edge seeding», 0); mesh2dBuilder1.propertyTable().setIntegerPropertyValue(«cylinder curved end num elements», 6); int id1; id1 = theSession.newestVisibleUndoMark(); int nErrs1; nErrs1 = theSession.updateManager().doUpdate(id1); nxopen.cae.Mesh [] meshes1 ; meshes1 = mesh2dBuilder1.commitMesh(); theSession.deleteUndoMark(markId3, null); theSession.setUndoMarkName(id1, «2D сетка»); mesh2dBuilder1.destroy(); // ———————————————- // Меню: Инструменты->Повторить команду->3 Остановка записи журнала // ———————————————- // ———————————————- // Меню: Инструменты->Журнал->Остановка записи // ———————————————- > public static final int getUnloadOption() < return nxopen.BaseSession.LibraryUnloadOption.IMMEDIATELY; >> >

Читайте также:
Программы которые загружаются при запуске компьютера

Сейчас он строит сетку только на тех поверхностях, которые указаны в коде, а если их меньше или больше будет, а также отличатся будут их названия, то nx выдаст ошибку при запуске нашего кода. Поэтому нам нужно доработать код добавив в него исключения try/catch и придумать способ, чтобы мы не привязывались к количеству полигональных граней.

Я сделал это так:

try < for (int i = 1; i < 20; i++) < obj=»object»+i; cAEB=»cAEBody»+i; cAEF=»cAEFace»+i; adde=»added»+i; //Object objects = new Object(); nxopen.DisplayableObject [] obj = new nxopen.DisplayableObject[1]; nxopen.cae.CAEBody cAEB = ((nxopen.cae.CAEBody)workFemPart.findObject((«CAE_Body»+»(«+i+»)»))); nxopen.cae.CAEFace cAEF = ((nxopen.cae.CAEFace)cAEB.findObject(«CAE_Face»+»(«+i+»)»)); obj[0] = cAEF; boolean adde; adde = mesh2dBuilder1.selectionList().add(obj); >> catch (Exception ex)

Вот конечный результат исполненный в программе:

Источник: habr.com

NX Open: установка атрибута

Одним из способов автоматизации работы в Siemens NX является написание программ или журнала при помощи библиотеки NX Open. Часто бывает так: сначала записывается файл журнала, а затем из него убирается все лишнее и оставшийся код копируется в приложение. Можно просто запустить журнал, записанный ранее и ничего не компилировать. Рассмотрим создание атрибута детали в NX.

NX Open - Создание атрибута детали

NX Open: журнал

Записать журнал: Меню — Инструменты — Журнал — Запись

При записи журнала, на кнопках и меню NX отображаются зеленые и желтые маркеры. Не все действия могут быть записаны в журнал. То, что записывается полностью, отмечено зелеными маркерами.

Установить язык записи журнала (перед созданием): Меню — Настройки — Интерфейс пользователя — Инструменты — Журнал

Приведенный ниже журнал записан на C#. Есть варианты: С++, Java, Python и Visual Basic.

Запустить журнал: Alt+F8, либо Меню — Инструменты — Журнал — Воспроизведение

Файл журнала — это обычный текстовый файл, лучше его открывать редактором с подсветкой синтаксиса (например, Notepad++).

Справка по 10, 11 и 12 версии NX доступна на официальном сайте Siemens PLM (русский, английский). По программированию для NX 10 информация здесь (английский). В системе онлайн-справки некоторые ссылки завязаны на всплывающие окна, которые у большинства нормальных пользователей заблокированы. Иногда приходится единично допускать открытие окон (в Mozilla можно).

Кроме того, справка по составу API распространяется в формате chm. При скачивании этого файла, в Windows 7 может потребоваться его разблокировать: ПКМ на файле — Свойства — Вкладка «Общие» — нажать кнопку «Разблокировать». Иначе пишет «Переход на веб-страницу отменен».

Читайте также:
Гречка с курицей в мультиварке редмонд на какой программе

Дополнительно, материал по программированию в NX Open есть в пособии Getting Started with NX Open здесь (английский). Пособие новое, поэтому пространства имен Guide с функциями-помощниками в 10 версии NX нет. Для вывода информации в текстовое окно можно воспользоваться стандартным ListingWindow.

Журнал для установки атрибута «АТР» со значением 23

Приводится журнал, из которого удалены лишние строки, возникающие при записи интерактивной сессии. Для запуска, скопировать в текстовый файл, сохранить с расширением cs, далее создать в NX новую модель и запустить журнал при помощи комбинации Alt+F8 (выбрать тип файла cs, по дефолту всегда vb). Щелкнув ПКМ на модели в дереве навигатора сборки, в свойствах можно найти созданный атрибут.

using System; using NXOpen; public class NXJournal < public static void Main(string[] args) < NXOpen.Session theSession = NXOpen.Session.GetSession(); NXOpen.Part workPart = theSession.Parts.Work; NXOpen.Part displayPart = theSession.Parts.Display; // Целевые объекты для задания атрибута с именем «АТР». NXOpen.NXObject[] objects1 = new NXOpen.NXObject[1]; objects1[0] = workPart; // Объявление переменной и вызов конструктора для объекта AttributePropertiesBuilder NXOpen.AttributePropertiesBuilder attributePropertiesBuilder1; attributePropertiesBuilder1 = theSession.AttributeManager.

CreateAttributePropertiesBuilder(workPart, objects1, NXOpen.AttributePropertiesBuilder.OperationType.None); // Общие параметры конструктора атрибутов. attributePropertiesBuilder1.IsArray = false; attributePropertiesBuilder1.DataType = NXOpen.AttributePropertiesBaseBuilder. DataTypeOptions.String; attributePropertiesBuilder1.Units = «MilliMeter»; attributePropertiesBuilder1.SetAttributeObjects(objects1); attributePropertiesBuilder1.Title = «АТР»; attributePropertiesBuilder1.StringValue = «23»; // Создание атрибута. bool changed1; changed1 = attributePropertiesBuilder1.CreateAttribute(); NXOpen.NXObject nXObject1; nXObject1 = attributePropertiesBuilder1.Commit(); // Деструктор объекта. attributePropertiesBuilder1.Destroy(); >public static int GetUnloadOption(string dummy) < return (int)NXOpen.Session.LibraryUnloadOption.Immediately; >>

Объектная модель NX Open

Оригинал документа здесь (английский).

TaggedObject — базовый класс для элементов модели NX (линия, вытягивание, рабочая деталь). Теговый объект. Класс определяет т.н. persistent entities, т.е. такие объекты, которые сохраняются после завершения работы c NX (при сохранении измененной модели). В некоторых случаях, объекты этого класса представляют собой несохраняемые элементы. У объектов TaggedObject есть тег, используемый при взаимодействии с UF API.

В противовес этому типу есть класс TransientObject не сохраняемые объекты. У них нет тега и для них есть метод-деструктор Dispose(). При программировании на языках со сборщиками мусора, для таких объектов деструктор вызывается автоматически.

NXObject — наследник TaggedObject. Класс определяет методы и свойства для установки и чтения имен и атрибутов элементов модели NX.

TaggedObjectCollection — базовый класс для классов, представляющих коллекцию объектов TaggedObject. Как правило, в состав этих классов дополнительно входят методы по созданию новых теговых объектов. В приведенном коде, из коллекции деталей в сессии происходит выбор рабочей детали и детали отображаемой:

NXOpen.Part workPart = theSession.Parts.Work; NXOpen.Part displayPart = theSession.Parts.Display;

Классы Session и UI служат шлюзом для классов API. Ссылки на все объекты в составе API берутся напрямую или посредством методов или свойств этих двух классов. Класс UI доступен только в случае работы программы в пределах интерфейса NX, в пакетном режиме не доступен.

Part является классом детали NX. Содержит множество коллекций TaggedObjectCollection. Элемент построения модели в NX называется feature. Коллекции таких элементов содержатся в каждом экземпляре TaggedObjectCollection внутри объекта класса Part. Коллекции используются для получения объектов класса FeatureBuilder при создании или изменении элементов построения.

В нашем случае, Builder создается менеджером атрибутов, а не коллекцией.

Builder. Элементы построения модели и другие объекты создаются и редактируются при помощи объектов класса Builder. Для создания объекта, вызывается метод Commit(). По завершении работы объекта Builder следует вызывать метод Destroy().

Атрибуты детали и атрибуты компонента

Как известно, в NX атрибуты можно задавать для детали и для компонента (которые есть только в рамках сборки). Приведенный код устанавливает атрибут детали. Применимость атрибута определяется тем, какой аргумент передается в качестве целевого массива экземпляров NXObject в функцию CreateAttributePropertiesBuilder. Это второй аргумент. Если в приведенном коде строки 10,11 и 12 заменить на следующие, то будет задан атрибут для компонента, а именно для первого компонента сборки:

NXOpen.Assemblies.Component[] allComps = workPart. ComponentAssembly.RootComponent.GetChildren(); // Целевые объекты для задания атрибута с именем «АТР». NXOpen.NXObject[] objects1 = new NXOpen.NXObject[1]; objects1[0] = allComps[0];
Рубрики NX Метки C# в Siemens NX, NX Open, Журнал NX

NX Open: установка атрибута: 4 комментария

У Вас очень хорошии статьи.
Меня интересует, есть ли доступная обучающая литература по nxopen для новичков? Какими рессурсами Вы пользовались при изучении nxopen, кроме документации от сименса?

Добрый вечер, Денис.
Книг по NX Open я не встречал. Что касается других общедоступных сведений, то есть ресурс nxjournaling.com. Там можно посмотреть некоторые полезные вещи. Основным же источником информации, кроме официальной справки, является запись журналов при работе в NX. Ещё, NX в комплекте содержит примеры NX Open на разных языках (C#, Java, VB, C++, Python).

Они находятся где-то в C:Program FilesSiemensNX 11.0UGOPENSample… Если у Вас на работе есть NX c установленными кастомными инструментами журнального типа (не dll), то Вы можете посмотреть запускаемый при нажатии на кнопку файл. Для этого нужно войти в режим настройки панели инструментов и открыть настройки выбранной кнопки, найти путь и имя файла и открыть его в текстовом редакторе.

Евгений :

Скажи пожалуйста, у тебя есть какая-нибудь деталь NX, построенная с помощью nx open api c#. Буду очень благодарен

Добрый вечер. Таких деталей у меня, к сожалению, нет. Дело в том, что для автоматизации процесса моделирования в NX, как правило применяют семейства деталей или User Defined Features (элементы пользователя).

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru