Tekla API, вызываем скрипт из программы.
Если внимательно изучать Tekla API, то довольно скоро можно заметить, что описанный там функционал не исчерпывает реальных возможностей Tekla Structures. Если у вас есть доступ к Tekla Extranet то, на соответствующих форумах, можно узнать, что дело именно так и обстоит.
Однако возможность использовать все функции есть. Заключается она в работе со скриптами.
Документации по скрипто-писанию как таковой обнаружить не удалось. Впрочем тут, тут и здесь я касался этого вопроса. Собственно создание, запись и анализ скриптов в текле — задача на первый взгляд непростая, но на самом деле тривиальная. Остается не раскрытым вопрос, а как встроить скриптовый функционал в ваше приложение?
Tekla Open API C# пример вызова макроса приложения
Ниже приведен листинг кода который вешается на кнопку интерфейса в приложении. Сама функция создает и вызывает скрипт который меняет масштаб выбранных в чертеже видов на значение которое установлено в тексте кнопки. Скрипт вызывает стандартный диалог, сбрасывает там все чек-боксы, устанавливает новый масштаб, отмечает его чек-бокс, применяет новую настройку и закрывает окно диалога.
//изменяем масштаб видов на чертеже // эта функция вешается на onClick event кнопок для изменения масштаба видового окна private void btViewScale_Click(object sender, EventArgs e) { string Name = GetMacroFileName(); //имя файла, темповое. string MacrosPath = string.Empty; //тут будет путь к файлу макроса Tekla.Structures.TeklaStructuresSettings.GetAdvancedOption("XS_MACRO_DIRECTORY", ref MacrosPath); //узнаем где нам собственно сохранить макрос чтобы можно было его запустить. if (MacrosPath.IndexOf(';') > 0) { MacrosPath = MacrosPath.Remove(MacrosPath.IndexOf(';')); } //А дальше сам скрипт. До этого он был записан в текле, нашей программой мы делаем //его генерируемым добавляя тексте из выбранной кнопки. string script2 = "namespace Tekla.Technology.Akit.UserScript" + "{" + " public class Script" + "{" + " public static void Run(Tekla.Technology.Akit.IScript akit)" + " {" + @"akit.Callback(""acmd_display_attr_dialog"", ""view_dial"", ""main_frame"");" + @"akit.PushButton(""view_on_off"", ""view_dial"");" + @"akit.ValueChange(""view_dial"", ""gr_view_scale_en"", ""1"");" + @"akit.ValueChange(""view_dial"", ""gr_view_scale"", """ + (sender as Button).Text + @""");" + @"akit.PushButton(""view_modify"", ""view_dial"");" + @"akit.PushButton(""view_ok"", ""view_dial"");" + "}}}"; //записываем наш скрипт в файл File.WriteAllText(Path.Combine(MacrosPath, Name), script2); //и запускаем скрипт в Tekla Tekla.Structures.Model.Operations.Operation.RunMacro("..\\" + Name); } //дополнительная функция. private string GetMacroFileName() { lock (Random) { if (_TempFileIndex < 0) { _TempFileIndex = Random.Next(0, MaxTempFiles); } else { _TempFileIndex = (_TempFileIndex + 1) % MaxTempFiles; } return string.Format(FileNameFormat, _TempFileIndex); } }
Большое спасибо! Очень полезная статья!