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

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 пользователей

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




  • Сообщения

    • kkk
      Решения не знаю, знаю костыль - переключить вид в режим "в цвете", тогда штриховку видно. После оформления переключить обратно.
    • Сержи
      Так научитесь сначала понимать! (с)   Если спрашивают значит нужно, мне тоже нужна такая функция
    • clavr
    • gudstartup
      вот вам поменьше для пробы https://disk.yandex.ru/d/o3CMRExu2M7J9Q залейте winhex или hddrawcopy.    пока карту не откроете их и не будет
    • MagicNight
      Поищу образы. Нашел, там образ для 512 мгб, а у меня 256. Как быть? Со станком карты не было! Карту купили на Авито. Фирма Wintec на 256 мегабайт. Industrial Grade Made in USA. А у меня таких опция (которые вы указали стрелкой) нет!
    • gudstartup
      заходите в каталог карты жмете выбираете параметры и создаете контейнер нужного вам размера   найдите тут образы выкладывали и вылечите вашу карту карта со станком шла?
    • Alexey8107
      Вобщем 0166 150А погонял. На +30 амперах +0,3 вольта, на -30 уже -0,3(при нуле 2.58, датчик битый однозначно). На 165 150А тоже замерил при тех же условиях +30 здесь +0.33 вольта, -30 это -0.33(что несколько расходится с вашими замерами, на нуле 2.5). Видимо оба датчика подбиты. Первый по смещению, второй с виду нормальный(точно такой же как у вас), но показания завышает относительно ваших замеров. Либо могли сказаться какие то условия, например лишний виток, хотя пересчитывал. Либо провод навит был чуть по другому или уложен не совсем так. Больше похоже на лишний виток, видимо профукал. Для обоих датчиков выбирал значения 1 ампер, 10 ампер, 20, 30 и -30. Оба датчика в этом диапазоне линейны. В итоге вместо 0166 150А решил таки подкинуть 0165 150А. Принципиальной разницы я в них не увидел. Теперь поведение шпинделя изменилось кардинально, разгон и торможение стали более менее адекватные 2-3 секунды(при старом датчике было секунд 15). Вобщем оператор сейчас загрузит вал-шестерню и попробует под нагрузкой. Будет держать обороты, значит все норм...
    • MagicNight
      Не отображается.
    • gudstartup
      содержимое карты должно отображаться
    • Kelny
      Слева чуть ниже есть раздел ПАРАМЕТРЫ, где имеется галочка ОТОБРАЗИТЬ ВСПЛЫВАЮЩЕЕ ДИАЛОГОВОЕ ОКНО, но оно как раз сделано для удобства, что бы не бегать в левую панельку, а сразу перед носом можно было выбрать нужное сопряжение.
×
×
  • Создать...