Обход (перечисление) компонентов может понадобиться по разным причинам. Например, для назначения атрибутов компонентам или для чтения каких-то атрибутов. Может быть для составления отчета или перечня. Рассмотрим обход компонентов сборки в NXOpen.
Обход компонентов сборки в NXOpen: Код
Подобная задача рассматривается в пособии Getting Started with NXOpen (стр.87). Однако, там рассмотрен обход всех компонентов сборки, включая вложенные, при помощи рекурсии и вспомогательной функции вывода на экран Guide.InfoWriteLine(), которой нет в NX10. Кроме того, не на С#, а на Visual Basic, который впрочем, кроме синтаксиса ничем от C# не отличается. В конце статьи рассмотрим ещё один важный момент, связанный с реализацией сложных алгоритмов обработки компонентов при обходе. Обо всем по порядку.
Код обхода компонентов первого уровня сборки таков:
using System;
using NXOpen;
public partial class NXJournal
{
// Информационное окно.
static ListingWindow lw;
//Основная рабочая функция журнала.
public static void Main(string[] args)
{
NXOpen.Session theSession = Session.GetSession();
NXOpen.Part workPart = theSession.Parts.Work;
NXOpen.Part displayPart = theSession.Parts.Display;
// Конструктор и конфигурация объекта для поля окна вывода lw.
lw = theSession.ListingWindow;
String outputFile = @"C:\Users\user\Desktop\nxTest.txt";
lw.SelectDevice(ListingWindow.DeviceType.FileAndWindow, outputFile);
lw.Open();
// Вызов перечисления компонентов сборки (отображаемой детали).
AssemblyList(displayPart);
// Освобождение информационного окна.
lw.Close();
lw.SelectDevice(ListingWindow.DeviceType.Window, "");
}
//Вывод списка компонентов сборки и их типа в информационное окно NX.
public static void AssemblyList(Part inputPart)
{
// Взять имя детали целевой сборки. Вывести его в информационное окно.
String inputPartName = System.IO.Path.GetFileNameWithoutExtension(inputPart.FullPath);
lw.WriteLine(inputPartName);
// Создать массив компонентов из всех потомков первого уровня у целевой сборки.
NXOpen.Assemblies.Component[] allComps = inputPart.
ComponentAssembly.RootComponent.GetChildren();
// Для каждого потомка вывести имя в информационное окно.
foreach (NXOpen.Assemblies.Component child in allComps)
{
String childName = System.IO.Path.GetFileNameWithoutExtension(child.
Prototype.OwningPart.FullPath);
lw.WriteLine(childName);
}
}
public static int GetUnloadOption(string dummy)
{
return (int)Session.LibraryUnloadOption.Immediately;
}
}
Журнал или dll?
Есть разница между разработкой журнала и разработкой dll на NXOpen (в Visual Studio). При разработке журнала весь код должен быть в одном файле, т.к. при запуске мы выбираем лишь один файл. Если логика работы журнала сложная и требует создания дополнительных классов, то они конечно могут быть описаны в том же файле журнала, но это приведет к потере читабельности — файл станет очень большим. Кроме того, упомянутая сложная логика может потребовать для работы более продвинутых функций системы .Net, например Linq. В таких случаях, к проекту в Visual Studio может быть добавлена ссылка на dll. Над процессом компиляции журнала внутри NX пользователь не имеет такого контроля, как в Visual Studio. Поэтому сложные проекты, где классы распределяются по разным файлам и добавляются дополнительные ссылки, обычно реализуют не в виде журнала, а в виде скомпилированного приложения. Самым существенным недостатком разработки в Visual Studio является то, что для запуска dll нужна более продвинутая лицензия NX (dotnet_author), в то время как для запуска журнала никаких дополнительных лицензий не нужно.
Журнал запускается комбинацией «Alt+F8» (Меню — Инструменты журнал — Воспроизведение), нужно выбрать правильный тип файла, а dll запускается по «Ctrl+U» (Файл — Выполнить — NXOpen).

