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

Передать выражения деформации в сборку


Ростислав

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

Существует компонент(файл .prt) в котором реализована деформация, этот компонент добавляется в сборку функцией:

 

 NXOpen.Assemblies.Component component1;

 component1 = workPart.ComponentAssembly.AddComponent(…);

С учетом программной реализации механизма вставки компонентов (деталей) в сборку, выражения деформации, определенные в детали, не передаются. Как в сборку передать параметры деформации и их задать программно при вставке?

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


      //функция деформации компонента
        private void deform_comp(Tag instance_tag)
        {  
            try
            {
                Tag part1=0;
                Tag[] p_ocs=new Tag[1];//получим оккуренсы для сборки в.ур. (ins_part-это прототип)
                if (ins_part == 0 || ins_part == Program.theUfSession.Assem.AskWorkPart())//а то ошибка
                    p_ocs[0] = 0;
                else
                    Program.assm.AskOccsOfPart(0, ins_part, out p_ocs);//один оккуренс д.б.
                //так осс определяется без смены раб/дисп. части
                Tag occ = Program.assm.AskPartOccOfInst(/*parent*//*0*/p_ocs[0]/*ins_part*/, instance_tag);
                //исходная часть
                part1 =  Program.assm.AskChildOfInstance(instance_tag);
                Program.theSession.LogFile.WriteLine("part1=" + part1.ToString());
                if (part1 != 0)
                {   //если часть (компонент) деформируемый
                    if (Program.assm.IsPartDeformable(part1))
                    {
                        Program.theSession.LogFile.WriteLine("Deform_comp!");
                        string ppp;
                        Program.ufpart.AskPartName(part1, out ppp);
                        int l=Program.ufpart.IsLoaded(ppp);
                        if (l == 0) Program.theSession.LogFile.WriteLine("\nPart not loaded");
                        UFPart.LoadStatus ll;
                        if (l == 2)
                        {
                            Program.theSession.LogFile.WriteLine("\nLoad");
                            Program.ufpart.OpenQuiet(ppp, out part1, out ll);//тихо откр.
                            l = Program.ufpart.IsLoaded(ppp);
                        }
                        if (l != 1) Program.theSession.LogFile.WriteLine("\nError load");
                        Tag def_feature=0;//пусто- нету деформed. фичи или не тот осс?
                        Program.assm.AskDeformableDefinition(part1, out def_feature);
                        Program.theSession.LogFile.WriteLine("def_feature=" + def_feature.ToString());
                        if(def_feature !=0)//получили фичу деформируемую
                        {   //получим её данные
                            UFAssem.DeformData def_data;//=new UFAssem.DeformData ();
                            UFAssem.DeformedDefinitionData deff_data;
                            Program.assm.AskDeformedDefinitionData(def_feature, out deff_data);
                            Program.theSession.LogFile.WriteLine(deff_data.num_expressions.ToString()); //1
                            Program.theSession.LogFile.WriteLine(deff_data.expression_prompts[0].ToString()); //S
                            Program.theSession.LogFile.WriteLine(deff_data.expressions[0].ToString());
                            Program.theSession.LogFile.WriteLine("num_parents: "+deff_data.num_parents.ToString());
                            Program.theSession.LogFile.WriteLine("deff_data.part_occ: " + deff_data.part_occ.ToString());
                            Program.theSession.LogFile.WriteLine("occ: "+occ.ToString());
 
                            //проинициализируем данные части
                            UFAssem.DeformPartData def_part_data = new UFAssem.DeformPartData();
                            Program.assm.InitDeformPartData(ref def_part_data);
                            //теперь надо поменять параметр деформации: def_data->def_part_data
                            def_part_data.part_occ_to_deform = occ;
                            def_part_data.num_parents = 0;// deff_data.num_parents;
                            def_part_data.num_expressions = 1;/// deff_data.num_expressions;
                            string[] val = new string[1];
                            val[0]=tol.ToString().Replace(",",".");//"10";//толщина
                            def_part_data.new_expression_values = val;
                            def_part_data.old_expressions = /*ss;*/deff_data.expressions;
                            def_part_data.convert_units_on_modified_parts = false;
                            def_part_data.convert_units_on_read_only_modified_parts = false;
                            def_part_data.deformed_feature_tag = 0;
                            Tag[] tt = new Tag[9];
                            def_part_data.old_parents =  null;
                            Tag[] tt1 = new Tag[9];
                            def_part_data.new_parents =  null;
                            //выполним деформацию по измененному параметру (s=10)
                            UFAssem.DeformPartWarnings def_warn;
                            def_warn.num_warnings = 0;
                            def_warn.warning_codes = null;
                            def_warn.warning_strings = null;
                            //переход в Сборку вер. уровня- чтобы деформир.фича в ней создалась
                            Tag pr = 0;//, ins_part1=0;     //т.к. надо чтоб в одной части компоненты и деф. фичи
                            if (ins_part != 0 && ins_part != Program.theUfSession.Assem.AskWorkPart())//а то ошибка
                            {
                                //если тихо раб.часть менять-не загружена говорит
                                string ppp1;//приходится грузить для деформации-а для вставки не надо...
                                Program.ufpart.AskPartName(ins_part, out ppp1);
                                int l1 = Program.ufpart.IsLoaded(ppp1);
                                if (l1 == 0) Program.theSession.LogFile.WriteLine("\nIns_Part not loaded");
                                UFPart.LoadStatus ll1;
                                if (l1 == 2)
                                {
                                    Program.theSession.LogFile.WriteLine("\nLoad1");
                                    Tag part11;
                                    Program.ufpart.OpenQuiet(ppp1, out part11, out ll1);//тихо откр.
                                    l1 = Program.ufpart.IsLoaded(ppp1);
                                }//if
                                if (l1 != 1) Program.theSession.LogFile.WriteLine("\nError load1");
                                Program.theUfSession.Assem.SetWorkPartQuietly(ins_part, out pr);
                            }//if
                            try
                            {Program.assm.DeformPart(ref def_part_data, out def_warn);}
                            catch (NXOpen.NXException ex)
                            { Program.theSession.LogFile.WriteLine(ex.Message);}
                            if(pr!=0)
                                Program.theUfSession.Assem.SetWorkPartQuietly(pr, out pr);
                        }//if(def_feature !=0)
                    }//if IsPartDeformable
                    else Program.theSession.LogFile.WriteLine("Not Deform_comp!");
                }//if(part1 != 0)
            }//try
            catch (NXOpen.NXException ex)
            { Program.theSession.LogFile.WriteLine(ex.Message); /*Program.ufdisp.SetDisplay(1);*/ }
            catch (Exception ex)//обходим ошибку и работаем
            { Program.theSession.LogFile.WriteLine(ex.Message); /*Program.ufdisp.SetDisplay(1); */}
        }//deform_comp

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

Кроме примера, есть какая то описаловка. В примере есть непонятные моменты.

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

Нету описаловки - код писался несколько лет назад на C# - сам уже плохо помню.

 

  public double tol = 0;

в зависимости от толщины меняется длина вставляемого болта короче

а передается в функцию тэг добавленного компонента

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

public Tag ins_part=0; //тэг части (вместо рабочей), куда вставляем компонент

 

Это помнится, если вставляем не в рабочую часть, а если в рабочую вроде можно просто оставить =0

и упростить код...

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

Извините пожалуйста подскажите пожалуйста назначение функций

 Tag occ =  theUfSession.Assem.AskPartOccOfInst(/*parent*//*0*/p_ocs[0]/*ins_part*/, instance_tag);           
  part1 = theUfSession.Assem.AskChildOfInstance(instance_tag);
Ссылка на сообщение
Поделиться на других сайтах

Ну тут смысл в том, что надо добраться до исходной части вставляемого компонента...

В документации (в старой точно было) на функции работы со сборкой есть описание с картинками (деревьями).


потом значит  if (Program.assm.IsPartDeformable(part1)) - если она деформируемая, мы ее грузим и получаем данные деформации

Program.assm.AskDeformableDefinition(part1, out def_feature);

 

создаем структуру для деформации, заполняем ее данными...

а потом выполняем деформацию.

 

ну как то так

post-16475-0-23994900-1475750932.jpg

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

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

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

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

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

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

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

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

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

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

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




  • Сообщения

    • Turgenev
      Не, греться будет, конкретно, потому что разъем будет прямо на стенке "стакана", а сам "стакан" будет нагреваться от нагревателя до 300 градусов. 3Д модель в процессе. погуглил, это разъемы типа таких: У них все круто, но нет фланца, чтобы хоть как-то закрепить разъем на стенке "стакана". По вашей наводке нагуглил еще разъемов, стоят дорого и очень большой габарит: Есть интересные варианты, но я не смог найти к ним ответную часть:   Это что-то типа такого: Мне не подходит по форм-фактору. Нагреватель должен быть в форме диска- плоский цилиндр диаметром 75мм и высотой около 10-20мм То есть запах идет от обгорания металла нагревателя? Вариант с заливкой нагреватель термостойким бетоном был, я даже его опробовал, но очень уж трудозатратно выходит. Любой металл будет иметь запах при нагреве, если его никуда не засовывать?
    • FROST_R6
      Здравствуй, ты можешь свой дискорд дать и показать?
    • Guhl
      У вас питание силовое на привод приходит? Е09 - отсутствие силового питания
    • Максим604
      В мануале написано что подача при Резьбофрезеровании считается по центру инструмента. Ок. Тогда почему когда пишешь в кам системе, то выдает подачу для движение  по траектории.      Перефразирую.  Нужно нарезать внутреннюю резьбу М20х2.  Фреза 3 зуба ∅12. Скорость резания 50. (Оборотов 1326)  Подача на зуб 0.05   Когда пишу в джи кодах, то выдаётся подача 198.9 мм/мин. С этой подачей станок и режет.    А если написать через шопмилл, то при тех же условиях( скорость резания и подача на зуб), он подачу пересчитывает для центра фрезы.  И выходит подача 80 мм/мин.   И выходит что при одних и тех же условиях меняется время обработки.    Когда пишешь через кам, то подача считается по траектории, а шопмилл считает для центра.    И я не понимаю как правильно считать. И почему именно так.  И в мануалах не нашёл ответа. 
    • maxx2000
      Да вот так ему хочется. Вот такие гады разработчики. Небось и в мануале всё это описали. Я негодую вместе с тобой.
    • Максим604
      Поэтому и вопрос. почему шопмилл подачу меняет, когда пишешь через него(макропеременые), а когда через G код не меняется. как шопмилл просчитывает новую подачу я понимаю, но не понимаю как прравильно и почему именно так правильно, а не наоброт. почему шопмилл переводит подачу с движения по траектории на движение по центру?     
    • Snake 60
      Так а зачем, если вот эта кнопка  сохраняет все детали и подсборки входящие в нее: При желании можно повесить на горячую кнопку через Настройка-Клавиатура Или пересохранить имеется ввиду создать копию с новым именем? Если да, то для этих целей я бы посоветовал крутой макрос с именем Коперник от @tompsongun См. пост выше.
    • maxx2000
      ну хотя бы то что одна написана через макропеременные, вторая в джи кодах. Ты считаешь что при одинаковом результате у них одинаковые алгоритмы?  
    • Максим604
      А что должно смущать?
    • maxx2000
      Ничего не смущает?
×
×
  • Создать...