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

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

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




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