Tekla Macro Custom Inquire подписка на события.

Tekla Custom Inquire Macro TeklaAPITekla Structures содержит исчерпывающий объем информации о каждом элементе модели — графическом, или текстовом. Чтобы получить данные используют следующие инструменты:

  • Inquire — не слишком интерактивен, выдаёт исчерпывающую информацию — но только об одном объекте.
  • Custom Inquire выводит информацию мгновенно, но тоже только один элемент. И нельзя добраться до пользовательских свойств (UDA) элементов.
  • Reports —  отличный, только сначала надо в Template Editore написать подходящий репорт. Написать его довольно просто, но опять же никакой тебе интерактивности.

Ниже представлен макрос который представляет частный случай подписки на событие SelectionChange из TeklaAPI. Будем извлекать информацию о выделенных элементах, согласно заданному списку свойств.

Список задается в виде отдельных переменных. Впрочем, если приходилось разрабатывать репорты в Текле, то понять принцип будет легко. Макрос качаем тут:

CADSUPPORT_CustomInquireTool.cs

подробнее о том как это работает

Cкрипт вышел довольно объемным, но большая часть носит скорее описательный характер (инициализация и свойства  окна с текстом). Основные функции сведены в один метод Events_SelectionChangeEvent().

Работает всё следующим образом — макрос при запуске вызывает форму, форма подписывается на событие теклы SelectionChange. И вызывает метод Events_SelectionChangeEvent() если пользователь что-то выбрал, (чуть подробнее про Events в модели ) то внутри метода, обращаемся к выделенному элементу, и опрашиваем свойства. По результату формируем список, который выталкиваем в окно.

В виде кода это выглядит так:

        void Events_SelectionChangeEvent()
        {
            lock (_selectionEventHandlerLock)
            {
                Tekla.Structures.Model.UI.ModelObjectSelector selected = new Tekla.Structures.Model.UI.ModelObjectSelector();
                Tekla.Structures.Model.ModelObjectEnumerator manyO = (selected.GetSelectedObjects() as ModelObjectEnumerator);
                string txt = string.Empty;
                while (manyO.MoveNext())
                {
                            string GUID = string.Empty;
                            string POS = string.Empty;
                            string UDA = string.Empty; 
                    if ((manyO.Current as Part) != null) //change for Assembly, Bolt, or whatever. 
                    {
                        var pp = (manyO.Current as Part); 

                            pp.GetReportProperty("ASSEMBLY.GUID", ref GUID);
                            pp.GetReportProperty("ASSEMBLY_POS", ref POS);
                            pp.GetReportProperty("ASSEMBLY.MAINPART.USERDEFINED.SOME_UDA", ref UDA);
                        txt += GUID + "; " + POS +"; "+UDA+Environment.NewLine; 
                    }
                    else if ((manyO.Current as Assembly)!= null)
                        {
                            var pp = (manyO.Current as Assembly); 

                            pp.GetReportProperty("GUID", ref GUID);
                            pp.GetReportProperty("ASSEMBLY_POS", ref POS);
                            pp.GetReportProperty("MAINPART.USERDEFINED.SOME_UDA", ref UDA);
                            txt += GUID + "; " + POS +"; "+UDA+Environment.NewLine; 
                        }
                }
                SetText(txt.ToString());
            }
        }

Где SetText() — отдельный метод, в котором данные отправляются в форму после синхронизации потоков.

Для пользователя это просто еще одно окошко, которое просто работает во всех версиях теклы. А логику работы можно быстро поменять текстовом редакторе например Notepad++. Добавить вызов новых атрибутов, или произвести сложные действия с уже полученной информацией.

А тут небольшой пример как можно обратится вообще к любому объекту в модели

// here we can check any object which inherite ModelObject interface
                if ((manyO.Current as ModelObject) != null)
                {
                    var pp = manyO.Current as ModelObject;
                        string GUID = string.Empty;
                        string POS = string.Empty;
                        string UDA = string.Empty;
                        string DP = string.Empty;
                        pp.GetReportProperty("GUID", ref GUID);
                        pp.GetReportProperty("STANDARD", ref POS);
                        pp.GetReportProperty("ASSEMBLY.MAINPART.USERDEFINED.UDA", ref UDA);
                        txt += GUID + "\t " + POS + "\t " + UDA + Environment.NewLine;

                }

Еще по теме