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

NXOpen C# для начинающих


pegasus

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

И еще вопрос. У меня 64-х винда семерка. Я никак не могу создать проект в том же вижуале для языка Си/Си++. Все делаю по книге "юниграфикс для профессионалов" Чебышева (по моему) и когда жму кнопку Finish он выдает такую ошибку

"Недопустимый вызов или аргумент процедуры"

Не знаю может это из-за платформы, но в хелпе NX решают эту проблему (если конечно дело в совместимости платформ) через менеджер конфигурации в вижуале. Но вот не задача нету там строки с надписью 64х. И обновления SP1 для вижуала стоят. Может кто сталкивался?

А VS ставилась с опциями "по умолчанию"? Я так интуитивно предполагаю, что для разработки x64 приложений надо добавить нужные опции?

З.Ы. Хотелось бы на си, си плюс плюс писать приложение, говорят лучше они си шарпа (по основам), сам не знаю потому что мои познания в программировании ограничиваются турбопаскалем (лабы в универе)))) и парочкой постпроцессоров на тикле...

На шарпе, безусловно, на порядок проще и легче будет делать, особенно, если ГУЁвые приложения нужны. Если нет опыта и наработанных С и С++ проектов для NXа, то не имеет смысла с этими языками завязываться.
Ссылка на сообщение
Поделиться на других сайтах


А VS ставилась с опциями "по умолчанию"? Я так интуитивно предполагаю, что для разработки x64 приложений надо добавить нужные опции?

На шарпе, безусловно, на порядок проще и легче будет делать, особенно, если ГУЁвые приложения нужны. Если нет опыта и наработанных С и С++ проектов для NXа, то не имеет смысла с этими языками завязываться.

Кстати, да - если при инсталяции VS не поставил галочку у 64-битного компилятора, то и не будет 64 бит...
Ссылка на сообщение
Поделиться на других сайтах

А VS ставилась с опциями "по умолчанию"? Я так интуитивно предполагаю, что для разработки x64 приложений надо добавить нужные опции?

Да, ставил по умолчанию, попробую вручную, спасибо!

На шарпе, безусловно, на порядок проще и легче будет делать, особенно, если ГУЁвые приложения нужны.

ГУЁвые приложения не нужны...

Если нет опыта и наработанных С и С++ проектов для NXа, то не имеет смысла с этими языками завязываться.

Опыта вообще никакого, только огромное желание... конкретно скажите почему не стоит связываться???

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

ГУЁвые приложения не нужны...

Это поначалу так кажется. ;-)

Опыта вообще никакого, только огромное желание... конкретно скажите почему не стоит связываться???

Потому что на шарпе (точнее, .NET) практически всё будет делать гораздо проще. Хотя... Если с ООП не знакомы, то могут быть определённые сложности.
Ссылка на сообщение
Поделиться на других сайтах
  • 4 года спустя...

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

 

Нашел в документации очень приятное для меня описание использование Linq в snap.   вот  здесь  есть такой фрагмент кода:

Dim partList = From comp In root.Leaves
 Group By partTag = comp.Prototype.NXOpenTag
 Into partGroups = Group, Count()

For Each item In partList
 InfoWindow.Write("Count = " & item.Count & " ; ")
 Dim part As Snap.NX.Part = Snap.NX.Part.Wrap(item.partTag)
 InfoWindow.WriteLine("Part = " & part.Name)
Next

по описанию код должен выбрать все компоненты в сборке сгруппировав их по их прототипу. Вроде как включая вложенные, Вроде как подсчитав количество их вхождения. Т.е. по факту я могу подсчитать например количество болтов в сборке которые хоть в 10 колене если болт изначально от одного и того же part'а.

 

если все так то как это можно реализовать на С#? Пробовал следующую конструкцию:

            Component rootComp = theSession.Parts.Display.ComponentAssembly.RootComponent;
            
            var queryAllParts = from comp in rootComp.GetChildren()
                                group comp by comp.Prototype into ComponentGroup
                                orderby ComponentGroup.Key
                                select ComponentGroup;

            
            foreach (var proto in queryAllParts)
                {
                
                foreach (var cmp in proto)
                {
                    theSession.ListingWindow.WriteLine(cmp.Prototype.ToString());
                }

                }

но вывод единичный типа part 51112  (я так понял тэг прототипа. только чей? и почему один если сборка со списком компонентов 20+)  и я так понимаю что GetChildren() в C# и root.leaves в snap существенно отличаются. 

 

Кто нить может сказать куда копать?

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

UPD:  попробовал на другой сборке вообще начало выбивать приложение. Судя по всему мой запрос Linq не корректен, или не правильно преобразовывается. Очень нужен тот кто уже имеет положительный опыт Linq в NXOpen|C#

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

Добрый день!

Подскажите, почему вот так theUFSession.Curve.CreateIntObject(1, Faces1, 1, Faces2, out IntCurv) работает,

а вот так theUFSession.Curve.CreateIntObject(Faces1.Length, Faces1, Faces2.Length, Faces2, out IntCurv) выдает ошибку "The first parameter passed in was invalid", если в Faces1 больше чем один элемент.

Faces1, Faces2 - массивы линкованных граней.

используется NX5

 

Ссылка на сообщение
Поделиться на других сайтах
В 07.07.2017 в 09:48, Laykon сказал:

Добрый день!

Подскажите, почему вот так theUFSession.Curve.CreateIntObject(1, Faces1, 1, Faces2, out IntCurv) работает,

а вот так theUFSession.Curve.CreateIntObject(Faces1.Length, Faces1, Faces2.Length, Faces2, out IntCurv) выдает ошибку "The first parameter passed in was invalid", если в Faces1 больше чем один элемент.

Faces1, Faces2 - массивы линкованных граней.

используется NX5

 

Выкладывайте уж тогда весь класс, а не только метод. Это тоже может помочь.

Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Lockdain сказал:

Выкладывайте уж тогда весь класс, а не только метод. Это тоже может помочь.

Вот код который я использую

    private static Tag CreateLinkedFace(Tag faceTag)
    {
        UFAssem Asm = theUFSession.Assem;
        UFSo So = theUFSession.So;
        UFWave Wv = theUFSession.Wave;
        Tag wpocc = Asm.AskWorkOccurrence();
        Tag pocc = Asm.AskPartOccurrence(faceTag);
        Tag feat = 0;
        Tag xform = 0;
        Tag LinkedFace;
        if (pocc != wpocc)
        {
            Tag FaceProto = Asm.AskPrototypeOfOcc(faceTag);
            So.CreateXformAssyCtxt(WorkPart.Tag, pocc, wpocc, out xform);
            Wv.CreateLinkedFace(FaceProto, xform, WorkPart.Tag, false, out feat);
            Wv.MapSourceToLinkGeom(feat, faceTag, out LinkedFace);
            return LinkedFace;
        }
        return faceTag;
    }


public static void Main()
{
    Session theSession = Session.GetSession();
    UFSession theUFSession = UFSession.GetUFSession();
    UFCurve CURVE = theUFSession.Curve;
    
    UFUi.Mask[] msk = new UFUi.Mask[1];
    msk[0].object_type = UFConstants.UF_solid_type;
    msk[0].solid_type = UFConstants.UF_UI_SEL_FEATURE_ANY_FACE;
    UFUi.SelectionOption opt;
    opt.mask_triples = msk;
    opt.num_mask_triples = 1;
    opt.scope = UFConstants.UF_UI_SEL_SCOPE_ANY_IN_ASSEMBLY;
    Tag[] Face1, Faces2;
    int resp;
    int count1, coutn2;
    theUFSession.Ui.SelectByClass("Выберите поверхности первого тела",ref opt,out resp, out count1, out Faces1); // Faces1 << два теги двух поверхностей
    theUFSession.Ui.SelectByClass("Выберите поверхности второго тела",ref opt,out resp, out count2, out Faces2); // Faces2 << тег одной поверхности

    Tag[] LinkedFaces1 = new Tag[count1],
          LinkedFaces2 = new Tag[count2];    
    for(int i = 0; i < count1; ++i)
        LinkedFaces1 = CreateLinkedFace(Faces1);
    for(int i = 0; i < count2; ++i)
        LinkedFaces2 = CreateLinkedFace(Faces2);
    Tag IntCurv;
    // CURVE.CreateIntObject(count1, LinkedFaces1, count2, LinkedFaces2, out IntCurv); -- ошибка: The second parameter passed in was invalid
    CURVE.CreateIntObject(1, LinkedFaces1, 1, LinkedFaces2, out IntCurv);    // ok        
}

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

можно попробовать выполнить эту функцию из Си, бывали случаи что мостики в C# неправильно работают.
А может, NX не нравится ваши фэйсы. 

Ссылка на сообщение
Поделиться на других сайтах
Только что, koner сказал:

можно попробовать выполнить эту функцию из Си, бывали случаи что мостики в C# неправильно работают.
А может, NX не нравится ваши фэйсы. 

пробовал из Си, та же самая ошибка.

Интересно, что, если передовать не линкованные поверхности, а те что выбрал пользователь, то функция отрабатывает нормально. Кривая строится, но со смещением и не ассоциативно (что понятно)

Если делать руками в NX, никаких проблем не возникает

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

Мне кажется проблема в том, что вы работаете с prototype-кривыми выбранного компонента вместо того, чтобы использовать кривые на уровне сборки. Но это только предположение. Если я не ошибаюсь, в GTAC'е, в разделе WAVE есть примеры подобного функционала. Сейчас к сожалению нет возможности посмотреть.

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

Мне кажется проблема в том, что вы работаете с prototype-кривыми выбранного компонента вместо того, чтобы использовать кривые на уровне сборки. Но это только предположение. Если я не ошибаюсь, в GTAC'е, в разделе WAVE есть примеры подобного функционала. Сейчас к сожалению нет возможности посмотреть.

В GTAC, к сожалению, нет доступа.

Грани, которые выбирает пользователь как раз и есть prototype-грани, на базе которых я строю linked-грани. Или я ошибаюсь?

 

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

Вот, у меня есть метод создание вейв  копии цепочки граней, вдруг поможет
 

        private void CreateFaceWave()
        {
            WaveLinkBuilder waveLinkBuilder1 = workPart.BaseFeatures.CreateWaveLinkBuilder(null);
            waveLinkBuilder1.Type = NXOpen.Features.WaveLinkBuilder.Types.FaceLink;
            
            ExtractFaceBuilder extractFaceBuilder = waveLinkBuilder1.ExtractFaceBuilder;
 
            extractFaceBuilder.Associative = true;
            extractFaceBuilder.FixAtCurrentTimestamp = true;
            extractFaceBuilder.Type = ExtractFaceBuilder.ExtractType.Face;
            extractFaceBuilder.FaceOption = ExtractFaceBuilder.FaceOptionType.FaceChain;
            extractFaceBuilder.ParentPart = NXOpen.Features.ExtractFaceBuilder.ParentPartType.OtherPart;

            List<Face> faceList = new List<Face>();
            foreach (Tag t in DetFaceList)
            {
                Face face = (Face)NXOpen.Utilities.NXObjectManager.Get(t);
                faceList.Add(face);

                Part componentPart = (Part)face.OwningComponent.Prototype;
                if (!componentPart.IsFullyLoaded) componentPart.LoadThisPartFully();
            }

            FaceDumbRule faceDumbRule = workPart.ScRuleFactory.CreateRuleFaceDumb(faceList.ToArray());
            extractFaceBuilder.FaceChain.ReplaceRules(new SelectionIntentRule[] { faceDumbRule }, false);

            waveDetFace = (ExtractFace)waveLinkBuilder1.Commit();
            waveLinkBuilder1.Destroy();
        }
 

Ссылка на сообщение
Поделиться на других сайтах
В 10.07.2017 в 15:49, koner сказал:

Вот, у меня есть метод создание вейв  копии цепочки граней, вдруг поможет
 

        private void CreateFaceWave()
        {
            WaveLinkBuilder waveLinkBuilder1 = workPart.BaseFeatures.CreateWaveLinkBuilder(null);
            waveLinkBuilder1.Type = NXOpen.Features.WaveLinkBuilder.Types.FaceLink;
            
            ExtractFaceBuilder extractFaceBuilder = waveLinkBuilder1.ExtractFaceBuilder;
 
            extractFaceBuilder.Associative = true;
            extractFaceBuilder.FixAtCurrentTimestamp = true;
            extractFaceBuilder.Type = ExtractFaceBuilder.ExtractType.Face;
            extractFaceBuilder.FaceOption = ExtractFaceBuilder.FaceOptionType.FaceChain;
            extractFaceBuilder.ParentPart = NXOpen.Features.ExtractFaceBuilder.ParentPartType.OtherPart;

            List<Face> faceList = new List<Face>();
            foreach (Tag t in DetFaceList)
            {
                Face face = (Face)NXOpen.Utilities.NXObjectManager.Get(t);
                faceList.Add(face);

                Part componentPart = (Part)face.OwningComponent.Prototype;
                if (!componentPart.IsFullyLoaded) componentPart.LoadThisPartFully();
            }

            FaceDumbRule faceDumbRule = workPart.ScRuleFactory.CreateRuleFaceDumb(faceList.ToArray());
            extractFaceBuilder.FaceChain.ReplaceRules(new SelectionIntentRule[] { faceDumbRule }, false);

            waveDetFace = (ExtractFace)waveLinkBuilder1.Commit();
            waveLinkBuilder1.Destroy();
        }
 

Попробовал. У меня в ExtractFaceBuilder отсутствует свойство FaceChain. Так что сделать как у вас не представляется возможным

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

да уж nx старенький у вас.
это выжимка из журнала. Попробуйте журнал сами записать.

Ссылка на сообщение
Поделиться на других сайтах
30 минут назад, koner сказал:

да уж nx старенький у вас.
это выжимка из журнала. Попробуйте журнал сами записать.

очень старенький

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

Добрый день!

Хочу проверить возможна-ли к реализации задача: Мне необходимо найти объекты в NX по идентификаторам Guid (например, свойство в классе NXOpen.Routing.Electrical). Выделить их (если это возможно) + выполнить опцию "Оптимизировать вид по выбору" для этих изделий.

 

В связи с этим имеются вопросы:

1. Подскажите, пожалуйста, возможно-ли подключится к NX из внешнего приложения, выполнить некоторые действия, отключиться. Или же требуется обязательного участия пользователя для загрузки "руками" модуля в NX (библиотеки/приложения через Файл-Выполнить.. или с участием журнала/макроса)?

Если это не возможно, то возможно-ли запустить на выполнение журнал через какую-то внешнюю функцию (например, run_journal [filename] -args [string arguments])?

2. Если есть возможность подключиться из-вне к NX, существует ли какой-то диспетчер процессов/сессий NX, чтобы знать к какому процессу или сессии можно подключиться?

3. Объект NXOpen.Routing.Wire не имеет такого свойства Guid. Но, при экспорте данных в PLMXML-файла, найти соответствие атрибута Guid для провода возможно. Как обойтись без экспорта в PLMXML-файл и найти Guid для провода?

 

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

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

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

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

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

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

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

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

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

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

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




  • Сообщения

    • gudstartup
      да у вас очень древний чемоданчик думаю из 90-х ну его ломать не жалко но если все уже заменили с рабочего то тут даже не знаю что и посоветовать....
    • stanislavz
      Спасибо за ответ. Так этот и был заказан на запас. В машине живой рабочий. Носителя нету, все в памяти hm628128-10 + ээпром.
    • gudstartup
      @stanislavz вы уж сразу еще один контроллер закажите а потом этот доламывайте. а со старым комбинировать не пробовали? у вас там диск или ssd в качестве носителя? может hdd загибается а вы сразу в мат.плату полезли. дисковые операции тоже ввод вывод тормозят...
    • maxx2000
      Подушную малость. Чё там. Уже в упор научились резьбу резать без выходной канавки?
    • ispite
      Здравствуйте, не могу построить стандартную сетку, что не позволяет дальше провести расчёт. Получается сделать сетку "на основе кривизны", но солид отказывается считать, после нажатия кнопки "запустить исследование" происходит сбой. https://disk.yandex.ru/d/D8wvRbYMW1lWjQ
    • ddm
      изготовить по чертежу с последующим покрытием,цинкование ,по 1000 шт каждой позиции ,предложение отправить на почту qwer463@yandex.ru
    • sklide008
      И еще можно ли задать горчие клавиши на кнопки открыть, скрыть и тд?
    • sklide008
      Подскажите, пожалуйста, в инвенторе есть такой пункт упорядочи по алфавиту дерево. Здесь найти такого не могу, пытался treesorter ставить но он добавляет просто в папку а не сортирует в дереве. Есть ли такой макрос чтобы все детали в дереве по порядку и алфавиту шли?
    • stanislavz
      Есть станок с данным контроллером. Все работает. Недавно была проблема с передачей данных - установил запасной контроллер. А запасной контроллер сказал нет работе. Проблема была в программе компьютера для передачи данных. Грустно, досадно, контроллер был куплен как рабочий. Как бы и не горит, но необходимо поправить. Плата управления с процессором mc68020, память hm628128-10. Память буферным питанием от 3 батареек + 0,5 Фарада на плате как буфер для замены батареек на 1 сутки. Лежало долго, без батареек. Симптомы: После первого включения, в памяти были и программы и параметры (0 странность). Честно, удивило. Но - система жутко тормозит, отклик на нажатие кнопки 3-5 секунд. В таком режиме сумел закачать машинные параметры под свой станок. Но это заняло час.. 4 строки и ждет секунд 10 итд. Есть видео. Перекинул с рабочего контроллера, БП, плату плц, ээпром плц - все то же. Проверил осциллографом кварцы живые , частота есть, амплитуда хорошая. 1 странность - после манипуляций по замене батарейки, старые записи из памяти исчезли. Ничего не коротнул. Возможно 0,5 Ф был не заряжен. Там тоже необходимы сутки для зарядки. Но как оно было запечатоно до этого - мистика. 2 странность. Если плата лежит ночь без питания, только с буфером - потом 2-3 минуты работает хорошо. 3 аналогично работает 2-3 минуты если питание отключить и очистить питание памяти (выпаял 0,5 Ф буфер с платы) Проверка памяти на старте есть. Проходит хорошо. На зависает, на холодную пайку не похоже. Шевелил / двигал все. Да и не виснет, именно тормозит. При том если оставить на час - тоже все стабильно плохо. Если набрать быстро 5 символей- экран сразу пуст, но после задержки символы будут на экране. Заказал второй процессор и память. 10 штук. Подавал прямо 5 вольт на память - все так же. Токи потребления между плохой и хорошей платой смогу проверит.    
    • brigval
×
×
  • Создать...