Официальный форум российского программного комплекса T-FLEX PLM


Поиск  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1 2 След.
Переменные во вложенных фрагментах, Получение значений переменных во вложенных фрагментах
 
Вопрос знатокам работы с API (использую TFlex v.15):
имеется:
файл (detail.grb) с 3D-деталью "Деталь_1", содержащей в себе:
|--- вложенный 3D-фрагмент "Фрагмент" (фактически реализован в файле fragment.grb), который в свою очередь состоит из:
......... |---- другого 3D-фрагмента - "Подфрагмент" (который фактически реализован в файле subfragment.grb).

В файле fragment.grb у "Подфрагмента" изначально задана внешняя переменная "$Порядковый_номер" = "00000".
В файле detail.grb у этого же "Подфрагмента" внешней переменной вручную задано новое значение: "$Порядковый_номер" = "12345".

Задача: с помощью API получить значение переменной "$Порядковый_номер" у "Подфрагмента"(а именно, добраться до значения "12345").
Проблема в том, что обход переменных из документа detail.grb в подфрагментах возвращает значение "$Порядковый_номер" = "00000" т.е. то, которое задано в файле fragment.grb, но не то, что мы задали в файле detail.grb.
Самое интересное, что для первого уровня вложенности (т.е. для переменных заданных у "Фрагмент") значения считываются корректные.
Иными словами, как сделать обход всех вложенных фрагментов и подфрагментов активного документа и получить значения переменных заданных в текущем документе для них?

Я пробовал так:
Код
Document doc = TFlex.Application.ActiveDocument;

// Обрабатываем все фрагменты активного документа:
foreach(Fragment3D frag in doc.GetFragments3D())
       {
        this.ProcessFragment3D(frag);
       }
...

private void ProcessFragment3D(Fragment3D fragment)
{
 // Получаем значения всех переменных:
 foreach(FragmentVariableValue var in fragment.GetVariables())
        {
    var type  = var.IsReal;
    var value = var.TextValue;
    if (type == true) value = var.RealValue.Value.ToString();
         // Отображаем имена переменных и их значения:
         this.textBox1.Text += String.Format("Variable {0}: {1} \r\n", var.Name, value );
        }
 
 // Пытаемся получить подфрагменты текущего фрагмента (видимо, здесь надо как-то подругому?)
 Document subdoc = fragment.GetFragmentDocument(true);
 foreach(Fragment3D frag in subdoc.GetFragments3D())
              {// рекурсивно выводим и переменные вложенных подфрагментов:
                 this.ProcessFragment3D(frag);
                        }
}
Ваши идеи, знатоки!
 
-=LEXX=- -=LEXX=-,

Код
using System.Windows.Forms;
using TFlex.Model;
using TFlex.Model.Model3D;

namespace Test
{
    public class Class15
    {
        public static void Run()
        {
            Document document = TFlex.Application.ActiveDocument; // asm_1.grb

            foreach (var i in document.GetFragments3D())
            {
                if (i.FilePath == "asm_2.grb") // 1 level
                {
                    foreach (var j in i.GetFragmentDocument(true).GetFragments3D())
                    {
                        if (j.FilePath == "part_1.grb") // 2 level
                        {
                            MessageBox.Show(j.GetVariableValue("P1", false).RealValue.Value.ToString(), "Variable value");
                            break;
                        }
                    }
                }
            }
        }
    }
}
T-FLEX CAD 17.1.6.0
 
Цитата
Vite написал:
-=LEXX=- -=LEXX=- ,
Код
 using System.Windows.Forms;
using TFlex.Model;
using TFlex.Model.Model3D;

namespace Test
{
    public class Class15
    {
        public static void Run()
        {
            Document document = TFlex.Application.ActiveDocument; // asm_1.grb

            foreach (var i in document.GetFragments3D())
            {
                if (i.FilePath == "asm_2.grb") // 1 level
                {
                    foreach (var j in i.GetFragmentDocument(true).GetFragments3D())
                    {
                        if (j.FilePath == "part_1.grb") // 2 level
                        {
                            MessageBox.Show(j.GetVariableValue("P1", false).RealValue.Value.ToString(), "Variable value");
                            break;
                        }
                    }
                }
            }
        }
    }
}
 
Это фактически то же, что написано выше у меня. Так не работает: выводит значения переменных более низкого уровня, но не те, что заданы в активном файле.
 
Цитата
-=LEXX=- -=LEXX=- написал:
Это фактически то же, что написано выше у меня. Так не работает: выводит значения переменных более низкого уровня, но не те, что заданы в активном файле.
точно, я не правильно вас понял. можно было проще сформулировать вопрос: как получить значение переменной активного документа?
Код
document.FindVariable("$Порядковый_номер").TextValue;
T-FLEX CAD 17.1.6.0
 
Цитата
Vite написал:
Цитата
-=LEXX=- -=LEXX=- написал:
Это фактически то же, что написано выше у меня. Так не работает: выводит значения переменных более низкого уровня, но не те, что заданы в активном файле.
точно, я не правильно вас понял. можно было проще сформулировать вопрос: как получить значение переменной активного документа?
Код
 document.FindVariable("$Порядковый_номер").TextValue;
 
Доброго времени! К сожалению и FindVariable() тоже находит для вложенных фрагментов лишь значение, которое задано у этих фрагментов в другом файле, но не в текущем (
 
Цитата
-=LEXX=- -=LEXX=- написал:
К сожалению и FindVariable() тоже находит для вложенных фрагментов лишь значение, которое задано у этих фрагментов в другом файле, но не в текущем (
используйте рабочий пример:
1. скачайте архив (см. вложение)
2. поместите файл "Test Macro.grb" в директорию:
Код
C:\Program Files\T-FLEX CAD 15 x64\Program\Macros

3. откройте документ "part_1.grb"
4. выполните макрос "Test Macro" в окне "Макросы"
T-FLEX CAD 17.1.6.0
 
Vite, в вашем файле поиск переменных на первом уровне вложенности. Он да проходит успешно. Я же пытаюсь добраться до переменных заданных в текущем документе, но для вложенных фрагментов. Вот посмотрите, пожалуйста, в приложенном файле:
- как обычно скопируйте мою версию макроса Test Macro.grb в C:\Program Files\T-FLEX CAD 15 x64\Program\Macros
- откройте файл detail_1.grb
- запустите макрос
- кнопка "Старт"
в итоге P1 будет равна 51 и 52 для двух вложенных фрагментов. Но я в текущем файле задал ей значения 151 и 152. И не могу их получить!
 
Цитата
-=LEXX=- -=LEXX=- написал:
Я же пытаюсь добраться до переменных заданных в текущем документе, но для вложенных фрагментов.

Код
using System.Windows.Forms;
using TFlex.Model;
using TFlex.Model.Model3D;

namespace Test
{
    public class TestMacro
    {
        public static void Run()
        {
            Document document = TFlex.Application.ActiveDocument;

            foreach (var i in document.GetFragments3D())
            {
                if (i.FilePath == "asm_2.grb")
                {
                    MessageBox.Show(i.GetFragmentDocument(true).FindVariable("P1").RealValue.ToString(), "Variable value");
                }
            }
        }
    }
}
T-FLEX CAD 17.1.6.0
 
Цитата
Vite написал:
Цитата
-=LEXX=- -=LEXX=- написал:
Я же пытаюсь добраться до переменных заданных в текущем документе, но для вложенных фрагментов.
Код
 using System.Windows.Forms;
using TFlex.Model;
using TFlex.Model.Model3D;

namespace Test
{
    public class TestMacro
    {
        public static void Run()
        {
            Document document = TFlex.Application.ActiveDocument;

            foreach (var i in document.GetFragments3D())
            {
                if (i.FilePath == "asm_2.grb")
                {
                    MessageBox.Show(i.GetFragmentDocument(true).FindVariable("P1").RealValue.ToString(), "Variable value");
                }
            }
        }
    }
}
 
У меня в коде так и сделано. Я же говорю - не работает так! %) Считываются значения, заданные в другом файле, но не те что заданы в текущем и которые мне нужны...
 
Цитата
-=LEXX=- -=LEXX=- написал:
У меня в коде так и сделано. Я же говорю - не работает так! %) Считываются значения, заданные в другом файле, но не те что заданы в текущем и которые мне нужны...
проблема на вашей стороне. данный пример вполне рабочий.
T-FLEX CAD 17.1.6.0
 
Цитата
Vite написал:
Цитата
-=LEXX=- -=LEXX=- написал:
У меня в коде так и сделано. Я же говорю - не работает так! %) Считываются значения, заданные в другом файле, но не те что заданы в текущем и которые мне нужны...
проблема на вашей стороне. данный пример вполне рабочий.
Я вам уже несколько раз сказал - ваши ответы не соответствуют контексту вопроса - вы с самого первого ответа перепечатываете по сути одно и тоже, то что у меня в примерах. Если ваши примеры рабочие - это не значит, что они выдают то, что нужно )) Вы хотя бы смотрели, приложенный мной пример? Суть-то поняли?
 
Цитата
-=LEXX=- -=LEXX=- написал:
Я вам уже несколько раз сказал - ваши ответы не соответствуют контексту вопроса - вы с самого первого ответа перепечатываете по сути одно и тоже, то что у меня в примерах.
если бы можно было понять, что конкретно вас интересует, возможно, я бы смог вам помочь.
T-FLEX CAD 17.1.6.0
 
Vite,Очень конкретно написано выше и в комментариях файла, который я приложил ранее.
 
Цитата
Vite написал:
если бы можно было понять, что конкретно вас интересует, возможно, я бы смог вам помочь.
Помоги человеку))

У него есть детали. В деталях есть внешние переменные, которые имеют первый вариант значений.

Из них сделана подсборка. В подсборке этим внешним переменным даны вторые значения(которые и выдаются макросом).

Потом эту подсборку он вставил в сборку. И дал значения переменным из деталей прям в сборке(которые и хочет получить),т.е. 3-ий вариант значений.



Конечно сделано так, что концов не найдёт и человек...не то что макрос. Но это не отменяет вопрос топикстартера.
 
-=LEXX=- -=LEXX=-,

Код
using System;
using System.Windows.Forms;

using TFlex;
using TFlex.Model;
using TFlex.Model.Model3D;


namespace Form1Namespace
{
    public partial class Form1
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, System.EventArgs e)
        {
            this.textBox1.Clear();

            Document doc = TFlex.Application.ActiveDocument;
            if (doc == null)
                return;

            // detail_1.grb
            this.GetVariablesInfo(doc, "P1_asm1");
            this.GetVariablesInfo(doc, "P2_asm1");

            // sborka_1.grb
            foreach (var i in doc.GetFragments3D())
            {
                this.GetVariablesInfo(i.GetFragmentDocument(true), "P1_asm2");
                this.GetVariablesInfo(i.GetFragmentDocument(true), "P2_asm2");

                // part_1.grb
                foreach (var j in i.GetFragmentDocument(true).GetFragments3D())
                {
                    this.GetVariablesInfo(j.GetFragmentDocument(true), "P1");
                    this.GetVariablesInfo(j.GetFragmentDocument(true), "P2");
                }
            }
        }

        private void GetVariablesInfo(Document doc, string variableName)
        {
            string val = "";
            foreach (var i in doc.GetVariables())
            {
                if (i.Name == variableName)
                {
                    val = i.IsText ? i.TextValue : i.RealValue.ToString();
                    this.textBox1.Text += string.Format("[{0}] : {1} = {2}\r\n", doc.Title, i.Name, val);
                    break;
                }
            }
        }
    }
}
Изменено: Vite - 11.10.2017 23:46:16
T-FLEX CAD 17.1.6.0
 
Sila Musli, все верно, по этому результат был не однозначный.
T-FLEX CAD 17.1.6.0
 
Цитата
Vite написал:
Sila Musli , все верно, по этому результат был не однозначный.
Ну всё равно результат не тот что нужно выдаёт макрос.
 
Цитата
Sila Musli написал:
Цитата
Vite написал:
Sila Musli , все верно, по этому результат был не однозначный.
Ну всё равно результат не тот что нужно выдаёт макрос.
Код
using System;
using System.Windows.Forms;
using TFlex;
using TFlex.Model;
using TFlex.Model.Model3D;


namespace Form1Namespace
{
    public partial class Form1
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, System.EventArgs e)
        {
            this.textBox1.Clear();

            Document doc = TFlex.Application.ActiveDocument;
            if (doc == null)
                return;

            // detail_1.grb
            this.GetVariablesInfo(doc, "P1_asm1");
            this.GetVariablesInfo(doc, "P2_asm1");

            // sborka_1.grb
            foreach (var i in doc.GetFragments3D())
            {
                this.GetVariablesInfo(i.GetFragmentDocument(true), "P1_asm2");
                this.GetVariablesInfo(i.GetFragmentDocument(true), "P2_asm2");

                // part_1.grb
                foreach (var j in i.GetFragmentDocument(true).GetFragments3D())
                {
                    this.GetVariablesInfo(j.GetFragmentDocument(true), "P1");
                    this.GetVariablesInfo(j.GetFragmentDocument(true), "P2");
                }
            }
        }

        private void GetVariablesInfo(Document doc, string variableName)
        {
            string val = "";
            foreach (var i in doc.GetVariables())
            {
                if (i.Name == variableName)
                {
                    val = i.IsText ? i.TextValue : i.RealValue.ToString();
                    this.textBox1.Text += string.Format("[{0}] : {1} = {2}\r\n", doc.Title, i.Name, val);
                    break;
                }
            }
           }


      private void textBox1_TextChanged(object sender, System.EventArgs e)
      {
         
      }
 }
}
        
    
Это выдаёт следующее:


А значения 151 нету в списке.
 
Sila Musli, поправил вложение.
T-FLEX CAD 17.1.6.0
 
Цитата
Vite написал:
Sila Musli , поправил вложение.
Если в сборке у детали переменная "Р1" будет числом задана, а не привязана через переменную "P1_asm1" к сборке, то всё равно не работает. Даже если оставить связь через переменную "P1_asm1" к подсборке. Просто убери всё переменный в сборке и в подсборке и оперируй только числами, чтоб не путаться.
Страницы: 1 2 След.