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


Поиск  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Макрос для создания узлов
 
При работе часто приходится создавать одни и те же элементы: узел в точке (0,0), узлы привязки, узел относительно существующего узла. Один хороший человек помог - написал макрос. Может кому еще пригодится
Страницы: Пред. 1 2
Ответы
 
Добрый день, форумчане.
У меня возникла такая задача:
Есть файлы (достаточно большое кол-во) в них необходимо создать новые переменные или обновить выражения в существующих переменных. Сама по себе напрашивается некоторая автоматизация этого процесса.
Т.е. необходимо из файла прототипа (файл .grb со списком переменных) загрузить переменные в предварительно выбранные файлы. Опять же несколько вариантов:
1. В диалоге выбирать файлы и папки в которые необходимо загрузить(обновить) переменные
2. В открытый документ загрузить переменные из выбранного прототипа.
Файлы прототипов переменных должны храниться в папке путь на которую настраивается в плагине.
 
Для решения подобной задачи лучше подходит Control, а не Plugin.

P.S. Как мне подсказали, Control - штука малоизвестная. Тем не менее использование Control для пакетных обработок, на мой взгляд, более удобный способ нежели написание макроса или плагина. Писал под Control, более 6 лет назад, но как раз для пакетной обработки файлов T-Flex Cad. Например, на Control написан T-Flex Viewer. Как создать свое приложение на Control можно посмотреть на нашем древнем сайте http://www.tflex-nord.ru в разделе Главная / API / Примеры приложений на API
Изменено: Сергей Максимов - 07.07.2017 16:11:29
 
DenStudy,

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

namespace Test
{
    public class DocumentTask
    {
        public static void Run()
        {
            Document document = TFlex.Application.ActiveDocument;
            if (document != null)
            {
                OpenFileDialog ofd = new OpenFileDialog();
                ofd.Filter = "T-FLEX CAD Document | *.grb";
                ofd.ShowDialog();
                InsertVariablesOfPrototype(document, ofd.FileName);
            }
        }

        public static void InsertVariablesOfPrototype(Document document, string prototypePath)
        {
            Document prototype = TFlex.Application.OpenDocument(prototypePath, false);

            if (prototype != null)
            {
                foreach (var i in prototype.GetVariables())
                {
                    if (document.FindVariable(i.Name) == null)
                    {
                        document.BeginChanges("Insert Variable");
                        CreateVariableOfPrototype(document, i);
                        document.EndChanges();
                    }
                }
            }
            else
            {
                MessageBox.Show("Прототип не определен...");
            }
        }

        public static Variable CreateVariableOfPrototype(Document document, Variable v)
        {
            Variable variable = null;

            if (v.IsReal)
            {
                variable = new Variable(document, v.Name, v.RealValue, v.External);
            }
            else if (v.IsText)
            {
                variable = new Variable(document, v.Name, v.TextValue, v.External);
            }

            if (variable != null)
            {
                variable.GroupName = v.GroupName;
                variable.Hidden = v.Hidden;
                variable.Comment = v.Comment;
                variable.Expression = v.Expression;

                for (int i = 0; i < v.ValueListCount; i++)
                {
                    variable.AddValueListString(v.GetValueListString(i));
                }
            }

            return variable;
        }
    }
}
Изменено: Vite - 07.07.2017 19:00:31
T-FLEX CAD 17.0.21.0
 
Наверное все таки так:
Код
using System;
using TFlex.Model;
using TFlex.Model.Model2D;
using TFlex.Model.Model3D;
using System.Windows.Forms;

namespace Test
{
    public class DocumentTask
    {
        public static void Run()
        {
            Document document = TFlex.Application.ActiveDocument;
            if (document != null)
            {
                OpenFileDialog ofd = new OpenFileDialog();
                ofd.Filter = "T-FLEX CAD Document | *.grb";
                ofd.ShowDialog();
                InsertVariablesOfPrototype(document, ofd.FileName);
            }
        }

        public static void InsertVariablesOfPrototype(Document document, string prototypePath)
        {
            Document prototype = TFlex.Application.OpenDocument(prototypePath, false);

            if (prototype != null)
            {
                foreach (var i in prototype.GetVariables())
                {
                    if (document.FindVariable(i.Name) == null)
                    {
                        document.BeginChanges("Insert Variable");
                        CreateVariableOfPrototype(document, i);
                        document.EndChanges();
                    }
          
                    else
                    {
                        document.BeginChanges("Update Variable");
                        Variable var = document.FindVariable(i.Name);
                        UpdateVariableOfPrototype(document, var, i);
                        document.EndChanges();
                    }
                }
            }
            else
            {
                MessageBox.Show("Прототип не определен...");
            }
        }

        public static void CreateVariableOfPrototype(Document document, Variable v)
        {
            Variable variable = null;

            if (v.IsReal)
            {
                variable = new Variable(document, v.Name, v.RealValue, v.External);
            }
            else if (v.IsText)
            {
                variable = new Variable(document, v.Name, v.TextValue, v.External);
            }

            if (variable != null)
            {
                variable.GroupName = v.GroupName;
                variable.Hidden = v.Hidden;
                variable.Comment = v.Comment;
                variable.Expression = v.Expression;

                for (int i = 0; i < v.ValueListCount; i++)
                {
                    variable.AddValueListString(v.GetValueListString(i));
                }
            }

            //return variable; // Возврат не нужен
        }

      public static void UpdateVariableOfPrototype(Document document, Variable var, Variable v)
      {
         if (v.IsReal)
            {
                var.RealValue = v.RealValue;
            }
            else if (v.IsText)
            {
                var.TextValue = v.TextValue;
            }

         var.External = v.External;
         var.GroupName = v.GroupName;
            var.Hidden = v.Hidden;
            var.Comment = v.Comment;
            var.Expression = v.Expression;

            for (int i = 0; i < v.ValueListCount; i++)
            {
               var.AddValueListString(v.GetValueListString(i));
            }

   }
    }
}
 
Vite, Сергей Максимов,огромное спасибо за макрос. Опробовал, работает. Очень хорошее подспорье при создании и особенно редактировании библиотек. Но идея плагина всё равно не отпала.
Изменено: DenStudy - 08.07.2017 15:10:45
 
Параллельно возникла ещё одна задача. Необходимо загружать в выбранный коннектор список значений коннектора, значения с выражениями из шаблона (прототипа) коннектора.
 
Почитав тему, пришла следующая мысль.
Большинство используют свои прототипы довольно активно. Но при переходе на новую версию прототипы лучше бы сделать заново на основе прототипов, поставляемых с новой версией, т.к. простое пересохранение файла под новой версией не учитывает все новые изменения, в т.ч. и дополнительных переменных. Возможно, часть ошибок при работе с системой происходит в т.ч. и по этой причине. Создание прототипа заново - вещь довольно утомительная и затратная по времени. В этом случае, представленный Vite макрос частично решает проблему. Но его стоит доработать, чтобы помимо переменных макрос считывал бы со старого прототипа и различные настройки слоев, размеров, текстов, параметров статуса документа.
Макрос для создания узлов - как раз первая попытка решить проблему, которую прототипы решают ограниченно - в пределах трех рабочих плоскостей.
 
Цитата
DenStudy написал:
Необходимо загружать в выбранный коннектор список значений коннектора, значения с выражениями из шаблона (прототипа) коннектора.
если я правильно понял вопрос, вам нужно заполнить "Значения коннектора" для выделенного ЛСК активного документа, из прототипа. так?

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

namespace Test
{
    public class ConnectorTask
    {
        public static void Run()
        {
            Document document = TFlex.Application.ActiveDocument;
            if (document != null)
            {
                OpenFileDialog ofd = new OpenFileDialog();
                ofd.Filter = "T-FLEX CAD Document | *.grb";
                ofd.ShowDialog();

                bool IsChanges = false;
                foreach (var i in document.Selection.GetAllObjects())
                {
                    if (i.GroupType == ObjectType.LCS)
                    {
                        LCS docLCS = (LCS)i;
                        document.BeginChanges("Create connector values");

                        if (docLCS.ConnectorParameters == null)
                            IsChanges = CreateConnectorValuesOfPrototype(docLCS, ofd.FileName);

                        if (IsChanges)
                            document.EndChanges();
                        else
                            document.CancelChanges();
                        break;
                    }
                }
            }
        }

        static bool CreateConnectorValuesOfPrototype(LCS docLCS, string prototypePath)
        {
            Document prototype = TFlex.Application.OpenDocument(prototypePath, false);
            if (prototype != null)
            {
                foreach (LCS i in prototype.GetLCSs())
                {
                    if (i.IsConnector())
                    {
                        for (int j = 0; j < i.ConnectorParameters.Count; j++)
                        {
                            if (i.ConnectorParameters.IsReal(j))
                            {
                                docLCS.ChangeConnectorParameters().SetRealValue(
                                    i.ConnectorParameters.GetParameter(j), 
                                    i.ConnectorParameters.GetRealValue(j));
                            }
                            else
                            {
                                docLCS.ChangeConnectorParameters().SetTextValue(
                                    i.ConnectorParameters.GetParameter(j),
                                    i.ConnectorParameters.GetTextValue(j));
                            }
                        }
                    }
                }

                if (docLCS.ConnectorParameters != null)
                    return true;
            }
            else
                MessageBox.Show("Прототип не определен...");

            return false;
        }
    }
}
T-FLEX CAD 17.0.21.0
 
Да, но значения коннектора нужны не только для 3D лск, но и для 2D коннекторов. Попробовал скомпилировать ваш макрос - не получилось.
 
Цитата
DenStudy написал:
Попробовал скомпилировать ваш макрос - не получилось.
исправьте ошибку в первой строке. что такое 2D коннектор?
T-FLEX CAD 17.0.21.0
 
Ошибку исправил. Макрос запустил, с 2D коннектором не работает. С 3D коннектором не тестировал, чуть позже опробую.
 
DenStudy,

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

namespace Test
{
    public class ConnectorTask
    {
        public static void Run()
        {
            Document document = TFlex.Application.ActiveDocument;
            if (document != null)
            {
                OpenFileDialog ofd = new OpenFileDialog();
                ofd.Filter = "T-FLEX CAD Document | *.grb";
                ofd.ShowDialog();

                bool IsChanges = false;
                foreach (var i in document.Selection.GetAllObjects())
                {
                    switch (i.GroupType)
                    {
                        case ObjectType.FixingVector:
                            Connector connector = (Connector)i;
                            document.BeginChanges("Create connector values");

                            if (connector.Parameters.Count == 0)
                                IsChanges = CreateConnectorValuesOfPrototype(connector, ofd.FileName);

                            if (IsChanges)
                                document.EndChanges();
                            else
                                document.CancelChanges();
                            break;
                        case ObjectType.LCS:
                            LCS lcs = (LCS)i;
                            document.BeginChanges("Create connector values");

                            if (lcs.ConnectorParameters.Count == 0)
                                IsChanges = CreateConnectorLCSValuesOfPrototype(lcs, ofd.FileName);

                            if (IsChanges)
                                document.EndChanges();
                            else
                                document.CancelChanges();
                            break;
                    }
                }
            }
        }

        static bool CreateConnectorValuesOfPrototype(Connector connector, string prototypePath)
        {
            Document prototype = TFlex.Application.OpenDocument(prototypePath, false);
            if (prototype != null)
            {
                foreach (Object2D i in prototype.Get2DObjects())
                {
                    if (i.GroupType == ObjectType.FixingVector)
                    {
                        Connector c = (Connector)i;
                        for (int j = 0; j < c.Parameters.Count; j++)
                        {
                            if (c.Parameters.IsReal(j))
                            {
                                connector.ChangeParameters().SetRealValue(
                                    c.Parameters.GetParameter(j),
                                    c.Parameters.GetRealValue(j));
                            }
                            else
                            {
                                connector.ChangeParameters().SetTextValue(
                                    c.Parameters.GetParameter(j),
                                    c.Parameters.GetTextValue(j));
                            }
                        }
                    }
                }
            }
            else
                MessageBox.Show("Прототип не определен...");

            if (connector.Parameters.Count > 0)
                return true;

            return false;
        }

        static bool CreateConnectorLCSValuesOfPrototype(LCS lcs, string prototypePath)
        {
            Document prototype = TFlex.Application.OpenDocument(prototypePath, false);
            if (prototype != null)
            {
                foreach (LCS i in prototype.GetLCSs())
                {
                    if (i.IsConnector())
                    {
                        for (int j = 0; j < i.ConnectorParameters.Count; j++)
                        {
                            if (i.ConnectorParameters.IsReal(j))
                            {
                                lcs.ChangeConnectorParameters().SetRealValue(
                                    i.ConnectorParameters.GetParameter(j), 
                                    i.ConnectorParameters.GetRealValue(j));
                            }
                            else
                            {
                                lcs.ChangeConnectorParameters().SetTextValue(
                                    i.ConnectorParameters.GetParameter(j),
                                    i.ConnectorParameters.GetTextValue(j));
                            }
                        }
                    }
                }

                if (lcs.ConnectorParameters.Count > 0)
                    return true;
            }
            else
                MessageBox.Show("Прототип не определен...");

            return false;
        }
    }
}
T-FLEX CAD 17.0.21.0
 
Vite,опробовал последний вариант макроса, ни в 2D ни в 3D не работает, выдаёт ошибку во время выполнения макроса "Test.Connector.Task.Run ссылка на объек не указывает на экземпляр объекта"
 
DenStudy, проверьте ссылки (см. вложение). отлаживаемый метод должен быть: "Test.ConnectorTask.Run"
Изменено: Vite - 11.07.2017 19:06:43
T-FLEX CAD 17.0.21.0
 
При выборе метода "Test.ConnectorTask.Run" выдаётся ошибка.
 
Цитата
DenStudy написал:
При выборе метода "Test.ConnectorTask.Run" выдаётся ошибка.
последовательность действий:
- поместите документ (Test Macro.grb) в директорию:
Код
"C:\Program Files\T-FLEX CAD 15 x64\Program\Macros"

- создайте новый документ;
- создайте пустой коннектор и выделите его;
- выполните макрос;
T-FLEX CAD 17.0.21.0
 
В значения коннектора загружает имена, но без выражений. после того как нажимаешь ок на свойствах коннекотра всё значения пропадают. Тестировал в 14 версии.
 
Цитата
DenStudy написал:
В значения коннектора загружает имена, но без выражений.
ну в этом плане API ограничен. все что я могу получить: имя параметра и его значение. по аналогии с переменными, должен быть тип данных "Expression", но я не вижу ничего подобного для коннекторов.
Цитата
DenStudy написал:
после того как нажимаешь ок на свойствах коннекотра всё значения пропадают.
не повторяется.
Изменено: Vite - 12.07.2017 16:58:20
T-FLEX CAD 17.0.21.0
Страницы: Пред. 1 2