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

NXOpen 8.0 .NET Перебрать оснастку (инструмент и патроны) из файла


KlimTV1987

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

Всем доброго времени суток.

 

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

    NXOpen.CAM.NCGroup nCGroup1 = (NXOpen.CAM.NCGroup)workPart.CAMSetup.CAMGroupCollection.FindObject("HERMLE_C20U");
    NXOpen.CAM.NCGroup nCGroup2;
    nCGroup2 = workPart.CAMSetup.CAMGroupCollection.CreateTool(nCGroup1, "mill_planar", "CHAMFER_MILL", NXOpen.CAM.NCGroupCollection.UseDefaultName.True, "CHAMFER_MILL");

В приведённом коде на первой строке получаю NullReferenceException. Значение свойства CAMSetup объекта workPart возвращает null.

 

В журнале всё прекрасно работает.

 

Кто сталкивался с такой проблемой, подскажите как решили. Или у меня случай уникальный?  :sad:

 

З.Ы. Если есть рабочий пример решения подобной задачи, поделитесь, люди добрые.

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


Возможно CAMSetup=null если вы не зашли в модуль Обработки


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

private List<Tag> GetToolList()
        {

            List<Tag> TList = new List<Tag>();
            Tag SetupTag = Tag.Null;
            Tag ToolRootTag = Tag.Null;
            Tag ToolNullTag = Tag.Null;
            try
            {
                theUFSession.Setup.AskSetup(out SetupTag);
                theUFSession.Setup.AskMctRoot(SetupTag, out ToolRootTag);
                theUFSession.Setup.AskMctNull(SetupTag, out ToolNullTag);
            }
            catch { return TList; }

            int count = 0;
            Tag[] ListTag;
            theUFSession.Ncgroup.AskMemberList(ToolRootTag, out count, out ListTag);
            REC_GetToolList(ListTag, ref TList, ToolNullTag);

            return TList;
        }

        //для рекурсии
        private void REC_GetToolList(Tag[] ListTag, ref List<Tag> TList, Tag ToolNullTag)
        {
            for (int i = 0; i < ListTag.Length; i++)
            {
                int type = 0, subtype = 0;
                theUFSession.Obj.AskTypeAndSubtype(ListTag[i], out type, out subtype);
                if ((type == 109) && (subtype == 0)) if (!ListTag[i].Equals(ToolNullTag)) TList.Add(ListTag[i]);

                int count = 0;
                Tag[] ListTagRec;
                theUFSession.Ncgroup.AskMemberList(ListTag[i], out count, out ListTagRec);
                REC_GetToolList(ListTagRec, ref TList, ToolNullTag);

            }

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

Когда-то требовалось вывести общие атрибуты CAM-проекта: Имя симулятора, Наименование, Имя магазина станка, а также перечень РИ с позициями, может чем-то помочь:

try
{
//Ищем имя симулятора ИСПРАВИТЬ НА ОБЪЕКТ ИЗ ДЕРЕВА
simName = workPart.camsetup().getMachineLibref();

//Цикл сортировки и записи объектов по типам
//******************************************
//Коллекция для хранения перечня режущего инструмента
List toolList = new ArrayList();
int toolCount = 0; //счетчик количества инструментов
Iterator iter = workPart.camsetup().camgroupCollection().iterator();

while (iter.hasNext()){

NXObject obj = (NXObject) iter.next();

//Сортировка объектов по типам
//****************************
//Инструмент
if (obj instanceof Tool) {
//writeToTextFile.writeToTextFile(Integer.toString(i) + "." + obj.name() + "\r\n", true, logInstance+"tools_list.txt");
toolList.add((Tool) obj);
toolCount++;
}
}

//Ищем пары инструмент-позиция в магазине
Map toolPocketPair = new HashMap();//здесь храним строки вида: Имя инструмента + Имя кармана
for (int j = 0; j < toolList.size(); j++)
{
if (toolList.get(j) != null)
{
toolPocketPair.put(toolList.get(j), toolList.get(j).getParent());//получили коллекцию Инструмент-Карман
//theUI.nxmessageBox().show("Завершено", nxopen.NXMessageBox.DialogType.INFORMATION, toolList.get(j).name() + " " + toolList.get(j).getParent().name());

}


else theUI.nxmessageBox().show("Info", nxopen.NXMessageBox.DialogType.WARNING, "Не удалось найти инструмент");

}

//Идем вверх по дереву
List treeIerarchy = new ArrayList(); //здесь храним дерево структуры где корневым элементом является первый найденный инструмент
if (toolList.get(0) != null)
{
NCGroup treeToolIter = toolList.get(0);
while (!treeToolIter.equals(workPart.camsetup()))
{
treeIerarchy.add(treeToolIter);
treeToolIter = treeToolIter.getParent();

}
}
else theUI.nxmessageBox().show("Info", nxopen.NXMessageBox.DialogType.ERROR, "Нельзя искать родителей у пустого объекта");
theUI.nxmessageBox().show("Завершено", nxopen.NXMessageBox.DialogType.INFORMATION, treeIerarchy.get(treeIerarchy.size()-1).name());

Если выгрузить коллекции в TXT, то вывод будет примерно таким:

 

Общие атрибуты проекта:
Загруженный симулятор.
Обозначение: SC250_asm_sim/A
Наименование: ТОКАРНО-ФРЕЗЕРНЫЙ_СТАНОК
Имя магазина станка: TURRET
-------------------------


Имя инструмента: 005111_A
Позиция: POCKET_04


Имя инструмента: 005250_A_1
Позиция: POCKET_03


Имя инструмента: 005250_A
Позиция: POCKET_02


Имя инструмента: 005839_A
Позиция: POCKET_01

 

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

Спасибо что откликнулись.

 

Возможно CAMSetup=null если вы не зашли в модуль Обработки

 

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

 

По коду: у меня срабатывает catch на строке кода 

theUFSession.Setup.AskMctRoot(SetupTag, out ToolRootTag);

Ошибка NX error status 13450004. А до этого была ошибка в строке

theUFSession.Setup.AskSetup(out SetupTag);

Но с ней разобрался открыв файл не через Session, а через UFSession. Может быть требуются ещё какие-то предварительные действия?

Ссылка на сообщение
Поделиться на других сайтах
Можно чуть по подробнее, как в него "зайти". Можете поделиться кусочком кода? 

Я имел ввиду, когда программу запускаете, чтобы в nx был в модуле обработке. 

По коду: у меня срабатывает catch на строке кода 

может быть  SetupTag =null или 0, тогда эта аналог вашей ошибки.

Вот что мне журнал записал, пи переходе в модуль обработки.
Там и setup сразу берется
 

    NXOpen.Session theSession = NXOpen.Session.GetSession();
    NXOpen.Part workPart = theSession.Parts.Work;
    NXOpen.Part displayPart = theSession.Parts.Display;
    // ----------------------------------------------
    //   Menu: Application->Manufacturing...
    // ----------------------------------------------
    theSession.ApplicationSwitchImmediate("UG_APP_MANUFACTURING");
    
    bool result1;
    result1 = theSession.IsCamSessionInitialized();
    
    theSession.CreateCamSession();
    
    NXOpen.CAM.CAMSetup cAMSetup1;
    cAMSetup1 = workPart.CreateCamSetup("mill_planar");
Ссылка на сообщение
Поделиться на других сайтах
theSession.CreateCamSession();

 

Да, видимо в этом всё дело. Я попробовал записать журнал и из него вставить код в пустой проект. Работает. theSession.IsCamSessionInitialized() возвращает true. 

Однако, при использовании в моём проекте theSession.CreateCamSession() вызывает NXException Invalid part tag

 

Подозреваю, что это происходит потому, что 

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

в случае с журналом ссылаются на только что созданную, активную деталь. А я в своем проекте открываю деталь по средством theSession.Parts.Open(), а theSession.Parts.Work остаётся null. В описании написано, что функция Open не делает деталь активной. Но не написано, как мне её таковой сделать, если это нужно. В справочнике пока ничего не нашел.

 

Знаете такую функцию? Или, если я размышляю в неверном направлении, причина другая?

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

Да, видимо в этом всё дело. Я попробовал записать журнал и из него вставить код в пустой проект. Работает. theSession.IsCamSessionInitialized() возвращает true. 

Однако, при использовании в моём проекте theSession.CreateCamSession() вызывает NXException Invalid part tag

 

Подозреваю, что это происходит потому, что 

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

в случае с журналом ссылаются на только что созданную, активную деталь. А я в своем проекте открываю деталь по средством theSession.Parts.Open(), а theSession.Parts.Work остаётся null. В описании написано, что функция Open не делает деталь активной. Но не написано, как мне её таковой сделать, если это нужно. В справочнике пока ничего не нашел.

 

Знаете такую функцию? Или, если я размышляю в неверном направлении, причина другая?

Попробуйте перед созданием CAM сессии убедиться, что Part tag != null. Вы дебаггер jdb подключали к проекту?

Изменено пользователем Lockdain
Ссылка на сообщение
Поделиться на других сайтах
А я в своем проекте открываю деталь по средством theSession.Parts.Open(), а theSession.Parts.Work остаётся null

Там кроме метода Open() есть и другие, например OpenDisplay.
 
Ссылка на сообщение
Поделиться на других сайтах
Попробуйте перед созданием CAM сессии убедиться, что Part tag != null. Вы дебаггер jdb подключали к проекту?
 

Нет. Что за дебаггер jdb? Не знаком с таким.

 

Там кроме метода Open() есть и другие, например OpenDisplay.

Спасибо, помогло.

 

На данный момент есть такой код. Считывает имена инструментов из навигатора операций

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using NXOpen;

namespace ConsoleApplication3
{
    class Program
    {
        // Сессия NX
        private static Session theSession;

        [STAThreadAttribute]
        static void Main(string[] args)
        {
            // выбор файла пользователем
            System.Windows.Forms.OpenFileDialog fileDialog = new System.Windows.Forms.OpenFileDialog();
            fileDialog.CheckFileExists = true;
            fileDialog.CheckPathExists = true;
            fileDialog.Filter = "NX models|*.prt";
            fileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            System.Windows.Forms.DialogResult dialogResult = fileDialog.ShowDialog();
            // если файл успешно выбран
            if (dialogResult == System.Windows.Forms.DialogResult.OK)
            {
                // файл для обработки
                string file = fileDialog.FileName;
                // Получаем сессию NX
                theSession = Session.GetSession();
                // открываем файл в NX как активный
                PartLoadStatus pLS;
                Part workPart = theSession.Parts.OpenDisplay(file, out pLS);
                pLS.Dispose();
                // подключаем CAM
                theSession.CreateCamSession();
                // если подключилось успешно, приступаем к считыванию инструмента
                if (theSession.IsCamSessionInitialized())
                {
                    ReadCAMTools(workPart);
                }
		// сообщаем о завершении
		Console.WriteLine(Environment.NewLine + "Нажмите Enter для завершения...");
		Console.ReadLine();
            }
        }


        private static void ReadCAMTools(Part part)
        {
            // коллекция групп
            NXOpen.CAM.NCGroup[] nxGroup = part.CAMSetup.CAMGroupCollection.ToArray();
	    // перебираем группы
            foreach (NXOpen.CAM.NCGroup nxG in nxGroup)
            {
                // отбираем только те, которые являются инструментом
                if (nxG.GetType().ToString() == "NXOpen.CAM.Tool")
                {
		    // имя инструмента
                    Console.WriteLine(nxG.Name);
                    Console.WriteLine(Environment.NewLine + "-------------------------------------");
                }
            }
        }
    }
}

Теперь вопрос в том, как из этого дополнительно получить описание инструмента, номер инструмента, хвостовик (всё отображается в навигаторе операций). Кто-нибудь знает, как с этими параметрами работать?

 

Пробовал записать журнал, команда "Изменить" навигатора операций. Создаётся объект NXOpen.Cam.MilltoolBuilder и через него ведётся работа. Нашел в описании API его свойства, там есть подходящие. Только не совсем понятны следующие моменты:

1. ToolBuilder'ов в part.CAMSetup.CAMGroupCollection великое множество. Как понять, какой именно мне нужен в данный конкретный момент?

2. Для создания ToolBuilder нужно в аргумент функции передать объект NXOpen.CAM.Tool. Как превратить NXOpen.CAM.NCGroup в NXOpen.CAM.Tool ?

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

смотрите uf_param.h
у всех cam объектов (инструмент, операция, метод, геометрия) есть параметры.
У каждого параметра есть свой индекс uf_param_indices.h (но там не все описаны).
Почти все геометрические параметры инструмента можно вытащить через этот функционал, исключение это держатель, точки трасировки (может и еще что то есть),
для этого есть отдельные функции в uf_cam.h.
 

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

@@KlimTV1987, извиняюсь, не обратил внимание на то, что вы используете .NET, это дебагер для java. 

Ссылка на сообщение
Поделиться на других сайтах
смотрите uf_param.h у всех cam объектов (инструмент, операция, метод, геометрия) есть параметры. У каждого параметра есть свой индекс uf_param_indices.h (но там не все описаны). Почти все геометрические параметры инструмента можно вытащить через этот функционал, исключение это держатель, точки трассировки (может и еще что то есть), для этого есть отдельные функции в uf_cam.h.

 

Геометрия пока что не нужна, но буду иметь в виду, спасибо.

 

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using NXOpen;

namespace ConsoleApplication3
{
    class Program
    {
        // Сессия NX
        private static Session theSession;

        [STAThreadAttribute]
        static void Main(string[] args)
        {
            // выбор файла пользователем
            System.Windows.Forms.OpenFileDialog fileDialog = new System.Windows.Forms.OpenFileDialog();
            fileDialog.CheckFileExists = true;
            fileDialog.CheckPathExists = true;
            fileDialog.Filter = "NX models|*.prt";
            fileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            System.Windows.Forms.DialogResult dialogResult = fileDialog.ShowDialog();
            // если файл успешно выбран
            if (dialogResult == System.Windows.Forms.DialogResult.OK)
            {
                // файл для обработки
                string file = fileDialog.FileName;
                // Получаем сессию NX
                theSession = Session.GetSession();
                // открываем файл в NX как активный
                PartLoadStatus pLS;
                Part workPart = theSession.Parts.OpenDisplay(file, out pLS);
                pLS.Dispose();
                // подключаем CAM
                theSession.CreateCamSession();
                // если подключилось успешно, приступаем к считыванию инструмента
                if (theSession.IsCamSessionInitialized())
                {
                    ReadCAMTools(workPart);
                }
		// сообщаем о завершении
		Console.WriteLine(Environment.NewLine + "Нажмите Enter для завершения...");
		Console.ReadLine();
            }
        }


        private static void ReadCAMTools(ref Part part)
        {
            // коллекция групп
            NXOpen.CAM.NCGroup[] nxGroup = part.CAMSetup.CAMGroupCollection.ToArray();
            // перебираем
            foreach (NXOpen.CAM.NCGroup nxG in nxGroup)
            {
                // отбираем только те группы, которые являются инструментами
                if (nxG.GetType().ToString() == "NXOpen.CAM.Tool")
                {
                    // Имя из навигатора операций
                    string toolName = nxG.Name;
                    Console.WriteLine(toolName);
                    // преобразуем элемент группы в инструмент
                    NXOpen.CAM.Tool tool = (NXOpen.CAM.Tool)nxG;
                    // открываем инструмент
                    NXOpen.CAM.MillToolBuilder millToolBuilder1;
                    millToolBuilder1 = part.CAMSetup.CAMGroupCollection.CreateMillToolBuilder(tool);
                    // считываем параметры
                    Console.WriteLine("Описание = " + millToolBuilder1.TlDescription);
                    Console.WriteLine("Хвостовик = " + millToolBuilder1.TlHolderDescription);
                    Console.WriteLine("Номер инструмента = " + millToolBuilder1.TlNumberBuilder.Value);
                    Console.WriteLine("Номер по каталогу = " + millToolBuilder1.TlCtlgNum);
                    Console.WriteLine(Environment.NewLine + "-------------------------------------");
                }
            }
        }
    }
}

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

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

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

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

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

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

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

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

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

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

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




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