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

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

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




  • Сообщения

    • Alexandr97
      В сборке необходимо было создать массив нескольких деталей на линейном расстоянии друг от друга. При создании сопряжения между отдельной деталью и одним из объектов массива, объект массива ломается, свободно перемещается и расстояние, которое было задано при массиве, уже не актуально. При том, когда я к родительской детали пытаюсь крепиться, то все нормально. Подскажите, это недочет программы, или так и должно быть?
    • Shura762
      Кто нить пробовал ТФ18? ну там типа бета тестирование? или все это коммерческая тайна
    • Alexey8107
      Ну не знаю. У нас в свое время было таких ИС-800 8 шт. Один из них самый первый был с круглым магазином на 32 инструмента, привода сименс, ЧПУ балт систем. Если к чпу и приводам претензий не было, то к механике были серьезные вопросы. А вот остальные 7 все как один, 64 инструмента, фанук везде и вся, датчики, линейки, энкодеры ханденхайн, к механике особых претензий уже нет, да, бывают поломки, периодически по мере необходимости меняем опоры качения и прочее... Да, есть слабые места, например упорный подшипник ШВП оси Z, периодически дохнет из за попадания сож и Z начинает дергаться как эпилептик, приходится менять. Все эти станки работают с 2007-2010 годов в три смены без остановок. Из крупных поломок за все это время, материнка в одном УЧПУ померла, на одном стол вырвало, на одном PSM смачно взорвался и вот сейчас похоже этот же восстановленный PSM взбрыкнул. Мелочовку типа порванных РВД и ремонтов по причине естественного износа, типа замены опор качения я не считаю. Бывает индуктивные датчики летят, приходится менять, но это еще мельче и устраняются в течение часа со всеми перекурами когда карта сигналов и мест установки датчиков есть. К тому же эти станки до сих пор держат свою геометрическую точность, периодически проверяем их. Точнее сначала оператор начинает замечать что то не то, потом мы смотрим что не то, ремонтируем и проверяем  Но у нас преимущество, у нас есть очень грамотный и опытный станочник, он с закрытыми глазами находит неисправности, да и станки эти знает вплоть до каждого винтика. Ну и само собой по мере необходимости и шпиндели отправляем в ремонт. Правда последний раз эта организация нам так восстановила шпиндель на токарный LEADWELL, что точил вместо круга непонятно что. Разобрали и ужаснулись, подшипники стоят неправильно, кольца вообще не там где должны быть, какие то медные проставки, которых там сроду не должно быть... Пришлось самим в срочном порядке пересобирать правильно и каким то чудом шпиндель заработал как и должен. Каким чудом я не знаю, но тем не менее работает уже год. Претензий нет. В те времена, когда их было 8 шт, а токарных LEADWELLов больше 20, еще некоторые и с барфидерами, так я чаще ремонтировал барфидеры, чем ИС-800. Да, сейчас настал кризис, часть станков продали, часть работников сократили, и их осталось всего 3 штуки.
    • Tad
      Это коэффициент, определяющий соотношение усилия при свободной (воздушной - air bending) гибке и штамповке/чеканке (bottoming). Соотношение усилий между этими операциями 3-40 раз в зависимости от  условий. Кто использует метод чеканки, не спрашивает, какой конкретно должен быть этот коэффициент
    • zwg
      Тут не поспоришь... Кто не использует - тот и не знает как (в сущностях или без)... Вопрос к знатокам: на что влияет значение BOTTOMING PRESSUE FACTOR на Странице МАТЕРИАЛЫ в настройках CYBELEC?
    • gudstartup
      это к вашему производству не относится просто товарищ написал а я откомментировал!   я быне завидывал особенно это касается ис800 - ужасно ненадежные станочки наследники ир800 хоть и собраны на фанук но механика полный отстой.
    • AlexKaz
      Выбрать в дереве Define type -> Components, затем для X, Y, Z-компонент выбрать Tabular Data.
    • Борман
    • Fedor
    • Alexey8107
      Ох, и представляю же я такой гараж, где три обрабатывающих центра ИС-800 поместятся, это не считая еще десятка токарных с ЧПУ, 2 ДИП-300, 1 ДИП-400 и 1 ДИП-500, плюс система регенерации песка, сталеплавильная печь ДСП-1.5 с печным трансформатором 2 мегаватта, огромная печь отжига, шахтные печи, муфельные печи, дробеочистные машины и даже станок плазменного раскроя ванад, линия порошковой окраски, не говоря уже о вспомогательных мелочах Завидую я тем многим с таким гаражным производством 
×
×
  • Создать...