LIRA-FEM RES API предоставляет доступ к результатам расчета задач LIRA-FEM с использованием языков программирования, поддерживающих технологию ActiveX или COM, таких как Visual Basic Script, JavaScript, C#, Java, Visual Basic, Visual Basic.NET, C++, Delphi и т.д.
- Быстрый старт: простой пример использования LIRA-FEM RES API в C#
- Гибкий запрос: пример использования LIRA-FEM RES API, демонстрирующий как сэкономить вычислительные ресурсы
- Обработка исключений: пример, демонстрирующий как избежать падения программы при попытке получить несуществующие данные
- LoadCaseDisplacements: доступ к перемещениям узлов от загружений
- LoadCaseForces: доступ к усилиям, возникающим в элементах от загружений
- LoadCombinationDisplacements: доступ к перемещениям узлов от РСН
- LoadCombinationForces: доступ к усилиям, возникающим в элементах от РСН
- FragmLoads: доступ к нагрузкам на фрагмент
- PunchLoads: доступ к нагрузкам на контуры продавливания
- DesignCombinationForces: доступ к усилиям, возникающим в элементах от РСУ
- PeriodsOfVibrations: получение частот динамических загружений
- SelectedReinforcement: доступ к данным армирования элементов
- Таблица интерфейсов
Для разработки программы на C# в этом примере мы будем использовать Microsoft Visual Studio. Ее бесплатную версию, Microsoft Visual Studio Community Edition, можно скачать с веб-сайта microsoft.com.
Создание нового проекта
Запустите Visual Studio, выберите пункт меню File --> New --> Project, выберите тип проекта Visual C# Console App. В качестве имени Name проекта укажите LiraFemResApiTest1, а в качестве расположения Location укажите, например, C:\Projects\ и нажмите OK.
Добавление ссылки на библиотеку типов LIRA-FEM RES API
Перейдите в окно Solution Explorer и щелкните правой кнопкой мыши на элементе Dependencies. В открывшемся контекстном меню выберите пункт Add COM Reference... Далее выберите строку LiraFemRes и нажмите OK.
Если вы не видите строки LiraFemRes в списке, это означает что эта библиотека типов не зарегистрирована. Переустановите LIRA-FEM или запустите regsvr32.exe LiraResApi.dll от имени администратора.
Выполнение расчета тестовой задачи
Откройте в LIRA-FEM тестовую задачу 05_вежа МК.lir и поставьте ее на расчет.
Вернитесь в среду разработки Microsoft Visual Studio, откройте файл Program.cs и замените его содержимое следующим:
// подключение библиотеки LiraFemRes using LiraFemRes; var Result = new LiraResultsAccess(); // объявление и инициализация интерфейса Request (запрос) LiraLoadCaseDisplacementsRequest Request = Result.CreateNewRequest(LiraRequestEnum.kLiraRequest_LoadCaseDisplacement) as LiraLoadCaseDisplacementsRequest; // объявление интерфейса Response (ответ) LiraLoadCaseDisplacementsResponse Response; // инициализация поля DocumentName (имя задачи) Request.DocumentName = "05_вежа МК"; // заполнение массива Nodes номерами узлов, перемещения которых мы хотим получить Request.Nodes.AddFromString("2-6"); Response = Result.LoadCaseDisplacements(Request); // номер загружения, от которого мы хотим получить перемещения в узлах int lc = 1; for (int i = 0; i < Request.Nodes.Count; i++) { double X, Y, Z; int node = Request.Nodes.Item[i]; // получение данных о перемещении узла node от загружения lc X = Response.GetNodeX(node, lc); Y = Response.GetNodeY(node, lc); Z = Response.GetNodeZ(node, lc); // вывод результатов на консоль Console.WriteLine("Node: " + node); Console.WriteLine("X: " + X); Console.WriteLine("Y: " + Y); Console.WriteLine("Z: " + Z); Console.WriteLine(); }
Компиляция программы
Выберите пункт меню Build --> Build Solution.
Запуск программы
Выберите пункт меню Debug --> Start Debugging.
При выполнении этого примера в консоли выведутся перемещения узлов: 2, 3, 4, 5, 6 от загружения №1.
Вывод
В этом примере мы рассмотрели механизм получения данных результатов расчета. Этот процесс можно условно разбить на три шага.
Создание запроса.
Заполняем поля объекта Request (имя документа, перечень узлов, ... ).
Обработка запроса.
Вызываем у объекта Result метод LoadCaseDisplacements, результат передаем в объект Response.
Получение данных.
У объекта Response вызываем методы (GetNodeX, GetNodeY, GetNodeZ).
В предыдущем примере из раздела Быстрый старт при формировании запроса мы заполнили поля: имя документа (DocumentName) и перечень узлов (Nodes), далее программа вывела на консоль координаты перемещений узлов от первого загружения. В объекте Response остались данные, которые нам не понадобились, а именно, перемещения узлов от загружений 2, 3 и 4, а также данные, связанные с кручением в узлах (Ux, Uy, Uz), депланацией B и температурой T. Мы неэффективно использовали ресурсы нашего компьютера, следовательно время, затраченное на обработку запроса, могло быть меньше. Для больших задач разница в скорости обработки запросов может оказаться существенной.
Оптимизируем код из предыдущего раздела, для этого заполним поля LoadCases и Directions, перечислив только те загружения и направления, которые нас интересуют. Добавим в наш код следующие строки:
// заполнение массива LoadCases номерами загружений Request.LoadCases.AddFromString("1"); // заполнение массива Directions номерами направлений (X, Y, Z), по которым мы хотим получить перемещения Request.Directions.Count = 3; Request.Directions.set_Item(0, (int)LiraDirectionEnum.kLiraDirection_X); Request.Directions.set_Item(1, (int)LiraDirectionEnum.kLiraDirection_Y); Request.Directions.set_Item(2, (int)LiraDirectionEnum.kLiraDirection_Z);
Вывод
В LIRA-FEM RES API заполнение необязательных полей объекта Request может ускорить процесс обработки запроса и уменьшить объем используемой оперативной памяти.
В примере из раздела Быстрый старт при формировании запроса мы заполнили поле Nodes диапазоном номеров узлов от 2 до 6. Давайте расширим этот диапазон и запросим узлы с номерами от 1 до 6. Заменим строку в файле Program.cs:
Request.Nodes.AddFromString("2-6");
на
Request.Nodes.AddFromString("1-6");
Откомпилируйте программу (Build --> Build Solution) и запустите ее (Debug --> Start Debugging).
У нас возникла ошибка при попытке получить данные о перемещении узла 1 от загружения 1 вдоль оси X. Почему это произошло? В расчетной схеме 05_вежа МК отсутствует узел с номером 1, мы пытались получить данные, которых не существует. Для избежания подобных проблем нужно использовать операторы обработки исключений try-catch. Ниже приведен безопасный вариант кода из раздела Быстрый старт:
// подключение библиотеки LiraFemRes using LiraFemRes; var Result = new LiraResultsAccess(); // объявление и инициализация интерфейса Request (запрос) LiraLoadCaseDisplacementsRequest Request = Result.CreateNewRequest(LiraRequestEnum.kLiraRequest_LoadCaseDisplacement) as LiraLoadCaseDisplacementsRequest; // объявление интерфейса Response (ответ) LiraLoadCaseDisplacementsResponse Response; // инициализация поля DocumentName (имя задачи) Request.DocumentName = "05_вежа МК"; // заполнение массива Nodes номерами узлов, перемещения которых мы хотим получить Request.Nodes.AddFromString("1-6"); Response = Result.LoadCaseDisplacements(Request); // номер загружения, от которого мы хотим получить перемещения в узлах int lc = 1; for (int i = 0; i < Request.Nodes.Count; i++) { double X, Y, Z; int node = Request.Nodes.Item[i]; // получение данных о перемещении узла node от загружения lc try { X = Response.GetNodeX(node, lc); Y = Response.GetNodeY(node, lc); Z = Response.GetNodeZ(node, lc); } catch (Exception e) { Console.WriteLine("Node: " + node); Console.WriteLine("Error: " + e.HResult); Console.WriteLine(); continue; } // вывод результатов на консоль Console.WriteLine("Node: " + node); Console.WriteLine("X: " + X); Console.WriteLine("Y: " + Y); Console.WriteLine("Z: " + Z); Console.WriteLine(); }
Откомпилируйте программу (Build --> Build Solution) и запустите ее (Debug --> Start Debugging).
Вывод
В случаях, когда достоверно неизвестно наличие запрашиваемых данных в результатах расчета, нужно использовать операторы обработки исключений try-catch.
Как получить перемещения узлов от загружений, рассматривалось в разделе Быстрый старт. В этом разделе рассмотрим случай деформированной схемы, когда загружение имеет формы перемещений (составляющие). В LIRA-FEM RES API существует возможность получить подробную информацию о загружении. Для этого нужно использовать интерфейс LiraLoadCaseInfos (все загружения) и LiraLoadCaseInfo (конкретное загружение). Приведенный ниже пример выведет на консоль подробную информацию о всех загружениях задачи 05_вежа МК.lir, а также перемещения узла №37 от загружения №4 для всех составляющих.
// подключение библиотеки LiraFemRes using LiraFemRes; var Result = new LiraResultsAccess(); // объявление и инициализация интерфейса Request (запрос) LiraLoadCaseDisplacementsRequest Request = Result.CreateNewRequest(LiraRequestEnum.kLiraRequest_LoadCaseDisplacement) as LiraLoadCaseDisplacementsRequest; // объявление интерфейса Response (ответ) LiraLoadCaseDisplacementsResponse Response; // инициализация поля DocumentName (имя задачи) Request.DocumentName = "05_вежа МК"; // заполнение массива Nodes номерами узлов Request.Nodes.AddFromString("2-37"); // запрос составляющих Request.Deformation = LiraDeformationEnum.kLiraDeformation_DeformedShape; // обработка запроса try { Response = Result.LoadCaseDisplacements(Request); } catch (Exception e) { Console.WriteLine("Error: " + e.HResult); return; } // получение данных о загружениях LiraLoadCaseInfos LoadCases = Response.LoadCases; for (int i = 0; i < LoadCases.Count; i++) { LiraLoadCaseInfo LoadCase = LoadCases.Item[i]; // вывод номера загружения Console.WriteLine("Load case number: " + LoadCase.Number); // вывод количества форм Console.WriteLine("Number of dynamic mode shapes: " + LoadCase.DynamicModeShapeCount); // вывод количества составляющих Console.WriteLine("Number of deformed shapes: " + LoadCase.DeformedShapeCount); // вывод номеров составляющих var DynamicModeShapesArray = new LiraLongsArray(); DynamicModeShapesArray = LoadCase.DeformedShapes; Console.Write("Deformed shapes: "); for (int j = 0; j < DynamicModeShapesArray.Count; j++) Console.Write(DynamicModeShapesArray.Item[j] + " "); Console.WriteLine("\n------------------------------------"); } // объявление массива ShapesArray var ShapesArray = new LiraLongsArray(); // заполнение массива ShapesArray номерами составляющих ShapesArray = LoadCases.Item[3].DeformedShapes; // номер загружения int lc = LoadCases.Item[3].Number; // номер узла int node = 37; // вывод перемещений узла №37 от загружения №4 для всех составляющих for (int i = 0; i < ShapesArray.Count; i++) { // номер составляющей int shape = ShapesArray.Item[i]; Console.WriteLine("Shape: " + shape); Console.WriteLine("X: " + Response.GetNodeX(node, lc, shape)); Console.WriteLine("Y: " + Response.GetNodeY(node, lc, shape)); Console.WriteLine("Z: " + Response.GetNodeZ(node, lc, shape)); Console.WriteLine(); }
Откомпилируйте программу (Build --> Build Solution) и запустите ее (Debug --> Start Debugging).
Для получения доступа к усилиям, возникающим в элементах от загружений, потребуются интерфейсы LiraLoadCaseInfos (информация о всех загружениях), LiraLoadCaseInfo (информация о конкретном загружении), LiraLoadCaseForcesRequest (формирование запроса) и LiraLoadCaseForcesResponse (получение данных о конечных элементах). Приведенный ниже пример выведет на консоль подробную информацию о всех загружениях задачи 05_вежа МК.lir, а также данные об элементе №37 (вид конечного элемента, количество сечений, перечень и значения усилий от загружения №1).
// подключение библиотеки LiraFemRes using LiraFemRes; var Result = new LiraResultsAccess(); // объявление и инициализация интерфейса Request (запрос) LiraLoadCaseForcesRequest Request = Result.CreateNewRequest(LiraRequestEnum.kLiraRequest_LoadCaseForces) as LiraLoadCaseForcesRequest; // объявление интерфейса Response (ответ) LiraLoadCaseForcesResponse Response; // инициализация поля DocumentName (имя задачи) Request.DocumentName = "05_вежа МК"; // заполнение массива Elements номерами конечных элементов Request.Elements.AddFromString("1-144"); // обработка запроса try { Response = Result.LoadCaseForces(Request); } catch (Exception e) { Console.WriteLine("Error: " + e.HResult); return; } // получение данных о всех загружениях LiraLoadCaseInfos LoadCases = Response.LoadCases; for (int i = 0; i < LoadCases.Count; i++) { LiraLoadCaseInfo LoadCase = LoadCases.Item[i]; // вывод номера загружения Console.WriteLine("Load case number: " + LoadCase.Number); // вывод количества форм Console.WriteLine("Number of dynamic mode shapes: " + LoadCase.DynamicModeShapeCount); // вывод количества составляющих Console.WriteLine("Number of deformed shapes: " + LoadCase.DeformedShapeCount); // вывод номеров составляющих var DynamicModeShapesArray = new LiraLongsArray(); DynamicModeShapesArray = LoadCase.DeformedShapes; Console.Write("Deformed shapes: "); for (int j = 0; j < DynamicModeShapesArray.Count; j++) Console.Write(DynamicModeShapesArray.Item[j] + " "); Console.WriteLine("\n------------------------------------"); } // номер загружения int LC = LoadCases.Item[0].Number; // номер элемента int Element = 37; // вывод на консоль номера конечного элемента Console.WriteLine("Element number: " + Element); // вывод на консоль номера загружения Console.WriteLine("Load cases number: " + LC); // перечень наименований семейств конечных элементов (LiraElementFamilyEnum) string[] ElementFamilyes = { "Undefined", "Bar", "Plate", "Solid", "SpecElement", "Spec_58_5", "Spec_310", "Spec_264" }; // получение семейства (вида) конечного элемента int ElementFamily = (int)Response.GetFamily(Element); // вывод на консоль названия семейства, к которому принадлежит конечный элемент Console.WriteLine("Element family: " + ElementFamilyes[ElementFamily]); // инициализация перечня внутренних усилий (LiraForceEnum) string[] StringElementForces = { "Undefined", "BarN", "BarMx", "BarMy", "BarQz", "BarMz", "BarQy", "BarRy", "BarRz", "BarBw", "BarTw", "PlateNx", "PlateNy", "PlateNz", "PlateTxy", "PlateTxz", "PlateMx", "PlateMy", "PlateMxy", "PlateQx", "PlateQy", "PlateRz", "SolidNx", "SolidNy", "SolidNz", "SolidTxy", "SolidTxz", "SolidTyz", "SpecElementRx", "SpecElementRy", "SpecElementRz", "SpecElementRux", "SpecElementRuy", "SpecElementRuz", "Spec_58_59_Qz", "Spec_58_59_Ny", "Spec_58_59_Qx", "Spec_310_N", "Spec_310_My", "Spec_310_Qz", "Spec_310_Mx", "Spec_310_Mz", "Spec_310_Qy", "Spec_264_N", "Spec_264_Qz", "Spec_264_Qy" }; // получение усилий в конечном элементе LiraLongsArray ElementForces = Response.GetForces(Element); // вывод на консоль перечня усилий в конечном элементе Console.Write("Forces: "); for (int i = 0; i < ElementForces.Count; i++) Console.Write(StringElementForces[ElementForces.Item[i]] + " "); Console.WriteLine("\n------------------------------------"); // количество сечений в элементе int SectionCount = Response.GetSectionCount(Element); // вывод значений усилий в элементе Element от загружения LC для всех сечений for (int i = 1; i <= SectionCount; i++) { Console.WriteLine("Section: " + i); Console.WriteLine("BarN: " + Response.GetBarN(Element, i, LC)); Console.WriteLine("BarMx: " + Response.GetBarMx(Element, i, LC)); Console.WriteLine("BarMy: " + Response.GetBarMy(Element, i, LC)); Console.WriteLine("BarQz: " + Response.GetBarQz(Element, i, LC)); Console.WriteLine("BarMz: " + Response.GetBarMz(Element, i, LC)); Console.WriteLine("BarQy: " + Response.GetBarQy(Element, i, LC)); Console.WriteLine(""); }
Откомпилируйте программу (Build --> Build Solution) и запустите ее (Debug --> Start Debugging).
Для получения данных о перемещениях узлов от РСН потребуются интерфейсы LiraLoadCombinationInfos (информация о всех РСН), LiraLoadCombinationInfo (информация о конкретном РСН), LiraLoadCombinationDisplacementsRequest (формирование запроса) и LiraLoadCombinationDisplacementsResponse (получение перемещений). Откройте в LIRA-FEM тестовую задачу 05_tower_MK_RSN.lir, поставьте ее на расчет. Далее скопируйте приведенный пример кода и вставьте его в ваш проект C#. О том, как создать проект в Visual Studio, написано здесь.
// подключение библиотеки LiraFemRes using LiraFemRes; var Result = new LiraResultsAccess(); // объявление и инициализация интерфейса Request (запрос) LiraLoadCombinationDisplacementsRequest Request = Result.CreateNewRequest(LiraRequestEnum.kLiraRequest_LoadCombinationDisplacements) as LiraLoadCombinationDisplacementsRequest; // объявление интерфейса Response (ответ) LiraLoadCombinationDisplacementsResponse Response; // инициализация поля DocumentName (имя задачи) Request.DocumentName = "05_tower_MK_RSN"; // заполнение массива Nodes номерами узлов Request.Nodes.AddFromString("2-37"); // инициализация номера таблицы РСН Request.LoadCombinationTable = 1; // обработка запроса try { Response = Result.LoadCombinationDisplacements(Request); } catch (Exception e) { Console.WriteLine("Error: " + e.HResult); return; } // получение данных о всех РСН LiraLoadCombinationInfos LoadCombinations = Response.LoadCombinations; // предельные состояния эксплуатационной надежности РСН (LiraLoadCombinationUseEnum) string[] LoadCombinationUsed = { "All", "Cracks", "Deflections" }; for (int i = 0; i < LoadCombinations.Count; i++) { LiraLoadCombinationInfo LoadCombination = LoadCombinations.Item[i]; // вывод номера РСН Console.WriteLine("Load combination number: " + LoadCombination.Number); // вывод названия РСН Console.WriteLine("Load combination name: " + LoadCombination.Name); // вывод номера формулы Console.WriteLine("Formula number: " + LoadCombination.FormulaNumber); // вывод предельного состояния эксплуатационной надежности РСН Console.WriteLine("Load combination used: " + LoadCombinationUsed[(int)LoadCombination.LoadCombinationUsed]); // является ли РСН особым Console.Write("Is special: "); if (LoadCombination.IsSpecial != 0) Console.WriteLine("Yes"); else Console.WriteLine("No"); // является ли РСН сейсмическим Console.Write("Is seismic: "); if (LoadCombination.IsSeismic != 0) Console.WriteLine("Yes"); else Console.WriteLine("No"); Console.WriteLine("\n------------------------------------"); } // номер узла int node = 37; // вывод перемещений для узла node от всех РСН Console.WriteLine("Node: "+ node); for (int i = 0; i < LoadCombinations.Count; i++) { // номер РСН int lc = LoadCombinations.Item[i].Number; Console.WriteLine("\nLoad combination: " + lc); Console.WriteLine(); Console.WriteLine("X: " + Response.GetNodeX(node, lc)); Console.WriteLine("Y: " + Response.GetNodeY(node, lc)); Console.WriteLine("Z: " + Response.GetNodeZ(node, lc)); }
Откомпилируйте программу (Build --> Build Solution) и запустите ее (Debug --> Start Debugging).
Для получения данных об усилиях от РСН потребуются интерфейсы LiraLoadCombinationInfos (информация о всех РСН), LiraLoadCombinationInfo (информация о конкретном РСН), LiraLoadCombinationForcesRequest (формирование запроса) и LiraLoadCombinationForcesResponse (получение усилий). Откройте в LIRA-FEM тестовую задачу 05_tower_MK_RSN.lir, поставьте ее на расчет. Далее скопируйте приведенный пример кода и вставьте его в ваш проект C#. О том, как создать проект в Visual Studio, написано здесь.
// подключение библиотеки LiraFemRes using LiraFemRes; var Result = new LiraResultsAccess(); // объявление и инициализация интерфейса Request (запрос) LiraLoadCombinationForcesRequest Request = Result.CreateNewRequest(LiraRequestEnum.kLiraRequest_LoadCombinationForces) as LiraLoadCombinationForcesRequest; // объявление интерфейса Response (ответ) LiraLoadCombinationForcesResponse Response; // инициализация поля DocumentName (имя задачи) Request.DocumentName = "05_tower_MK_RSN"; // заполнение массива Elements номерами конечных элементов Request.Elements.AddFromString("1-144"); // инициализация номера таблицы РСН Request.LoadCombinationTable = 1; // инициализация массива, содержащего перечень предельных состояний внутренних усилий (РСН расчетные и РСН нормативные) // для получения всех предельных состояний нужно оставить поле LoadCombinationLimitState пустым либо перечислить все виды предельных состояний Request.LoadCombinationLimitState.Count = 2; // РСН расчетные Request.LoadCombinationLimitState.Item[0] = (int)LiraLimitStateForcesEnum.kLiraLimitStateForces_UltimateFull; // РСН нормативные Request.LoadCombinationLimitState.Item[1] = (int)LiraLimitStateForcesEnum.kLiraLimitStateForces_ServiceabilityFull; // обработка запроса try { Response = Result.LoadCombinationForces(Request); } catch (Exception e) { Console.WriteLine("Error: " + e.HResult); return; } // получение данных о всех РСН LiraLoadCombinationInfos LoadCombinations = Response.LoadCombinations; // предельные состояния эксплуатационной надежности РСН (LiraLoadCombinationUseEnum) string[] LoadCombinationUsed = { "All", "Cracks", "Deflections" }; for (int i = 0; i < LoadCombinations.Count; i++) { LiraLoadCombinationInfo LoadCombination = LoadCombinations.Item[i]; // вывод номера РСН Console.WriteLine("Load combination number: " + LoadCombination.Number); // вывод номера формулы Console.WriteLine("Formula number: " + LoadCombination.FormulaNumber); // вывод предельного состояния эксплуатационной надежности РСН Console.WriteLine("Load combination used: " + LoadCombinationUsed[(int)LoadCombination.LoadCombinationUsed]); // является ли РСН особым Console.Write("Is special: "); if (LoadCombination.IsSpecial != 0) Console.WriteLine("Yes"); else Console.WriteLine("No"); // является ли РСН сейсмическим Console.Write("Is seismic: "); if (LoadCombination.IsSeismic != 0) Console.WriteLine("Yes"); else Console.WriteLine("No"); Console.WriteLine("\n------------------------------------"); } // номер элемента int Element = 37; // номер РСН int LC = LoadCombinations.Item[0].Number; // вывод на консоль номера конечного элемента Console.WriteLine("Element number: " + Element); // вывод на консоль номера РСН Console.WriteLine("Load combination number: " + LC); // перечень наименований семейств конечных элементов (LiraElementFamilyEnum) string[] ElementFamilyes = { "Undefined", "Bar", "Plate", "Solid", "SpecElement", "Spec_58_5", "Spec_310", "Spec_264" }; // получение семейства (вида) конечного элемента int ElementFamily = (int)Response.GetFamily(Element); // вывод на консоль названия семейства, к которому принадлежит конечный элемент Console.WriteLine("Element family: " + ElementFamilyes[ElementFamily]); // инициализация перечня внутренних усилий (LiraForceEnum) string[] StringElementForces = { "Undefined", "BarN", "BarMx", "BarMy", "BarQz", "BarMz", "BarQy", "BarRy", "BarRz", "BarBw", "BarTw", "PlateNx", "PlateNy", "PlateNz", "PlateTxy", "PlateTxz", "PlateMx", "PlateMy", "PlateMxy", "PlateQx", "PlateQy", "PlateRz", "SolidNx", "SolidNy", "SolidNz", "SolidTxy", "SolidTxz", "SolidTyz", "SpecElementRx", "SpecElementRy", "SpecElementRz", "SpecElementRux", "SpecElementRuy", "SpecElementRuz", "Spec_58_59_Qz", "Spec_58_59_Ny", "Spec_58_59_Qx", "Spec_310_N", "Spec_310_My", "Spec_310_Qz", "Spec_310_Mx", "Spec_310_Mz", "Spec_310_Qy", "Spec_264_N", "Spec_264_Qz", "Spec_264_Qy" }; // получение усилий в конечном элементе LiraLongsArray ElementForces = Response.GetForces(Element); // вывод на консоль перечня усилий в конечном элементе Console.Write("Forces: "); for (int i = 0; i < ElementForces.Count; i++) Console.Write(StringElementForces[ElementForces.Item[i]] + " "); Console.WriteLine("\n------------------------------------"); // количество сечений в элементе int SectionCount = Response.GetSectionCount(Element); // вывод значений усилий в элементе Element от РСН LC для всех сечений // РСН расчетные int LS = (int)LiraLimitStateForcesEnum.kLiraLimitStateForces_UltimateFull; Console.WriteLine("Ultimate full\n"); for (int i = 1; i <= SectionCount; i++) { Console.WriteLine("Section: " + i); Console.WriteLine("BarN: " + Response.GetBarN(Element, i, LC, LS)); Console.WriteLine("BarMx: " + Response.GetBarMx(Element, i, LC, LS)); Console.WriteLine("BarMy: " + Response.GetBarMy(Element, i, LC, LS)); Console.WriteLine("BarQz: " + Response.GetBarQz(Element, i, LC, LS)); Console.WriteLine("BarMz: " + Response.GetBarMz(Element, i, LC, LS)); Console.WriteLine("BarQy: " + Response.GetBarQy(Element, i, LC, LS)); Console.WriteLine(""); } Console.WriteLine("\n------------------------------------"); // РСН нормативные LS = (int)LiraLimitStateForcesEnum.kLiraLimitStateForces_ServiceabilityFull; Console.WriteLine("Serviceability full\n"); for (int i = 1; i <= SectionCount; i++) { Console.WriteLine("Section: " + i); Console.WriteLine("BarN: " + Response.GetBarN(Element, i, LC, LS)); Console.WriteLine("BarMx: " + Response.GetBarMx(Element, i, LC, LS)); Console.WriteLine("BarMy: " + Response.GetBarMy(Element, i, LC, LS)); Console.WriteLine("BarQz: " + Response.GetBarQz(Element, i, LC, LS)); Console.WriteLine("BarMz: " + Response.GetBarMz(Element, i, LC, LS)); Console.WriteLine("BarQy: " + Response.GetBarQy(Element, i, LC, LS)); Console.WriteLine(""); }
Откомпилируйте программу (Build --> Build Solution) и запустите ее (Debug --> Start Debugging).
Для получения доступа к нагрузкам на фрагмент потребуются интерфейсы LiraLoadCaseInfos (информация о всех загружениях), LiraLoadCaseInfo (информация о конкретном загружении), LiraFragmLoadsRequest (формирование запроса) и LiraFragmLoadsResponse (получение нагрузок). Откройте в LIRA-FEM тестовую задачу 05_tower_MK.lir, поставьте ее на расчет. Далее скопируйте приведенный пример кода и вставьте его в ваш проект C#. О том, как создать проект в Visual Studio, написано здесь.
// подключение библиотеки LiraFemRes using LiraFemRes; var Result = new LiraResultsAccess(); // объявление и инициализация интерфейса Request (запрос) LiraFragmLoadsRequest Request = Result.CreateNewRequest(LiraRequestEnum.kLiraRequest_FragmLoadForces) as LiraFragmLoadsRequest; // объявление интерфейса Response (ответ) LiraFragmLoadsResponse Response; // инициализация поля DocumentName (имя задачи) Request.DocumentName = "05_tower_MK"; // заполнение массива Nodes номерами узлов Request.Nodes.AddFromString("1-37"); // обработка запроса try { Response = Result.FragmLoads(Request); } catch (Exception e) { Console.WriteLine("Error: " + e.HResult); return; } // получение данных о всех загружениях LiraLoadCaseInfos LoadCases = Response.LoadCases; for (int i = 0; i < LoadCases.Count; i++) { LiraLoadCaseInfo LoadCase = LoadCases.Item[i]; // вывод номера загружения Console.WriteLine("Load case number: " + LoadCase.Number); // вывод количества составляющих Console.WriteLine("Number of deformed shapes: " + LoadCase.DeformedShapeCount); // вывод номеров составляющих var DynamicModeShapesArray = new LiraLongsArray(); DynamicModeShapesArray = LoadCase.DeformedShapes; Console.Write("Deformed shapes: "); for (int j = 0; j < DynamicModeShapesArray.Count; j++) Console.Write(DynamicModeShapesArray.Item[j] + " "); Console.WriteLine("\n------------------------------------"); } // объявление массива ShapesArray var ShapesArray = new LiraLongsArray(); // заполнение массива ShapesArray номерами составляющих ShapesArray = LoadCases.Item[3].DeformedShapes; // номер загружения int LC = LoadCases.Item[3].Number; // номер узла int Node = 11; // вывод на консоль номера узла Console.WriteLine("Node: " + Node); // вывод на консоль номера загружения Console.WriteLine("Load cases number: " + LC); // инициализация перечня внутренних усилий (LiraFragmLoadForceEnum) string[] StringFragmForces = { "Undefined", "RX", "RY", "RZ", "RUX", "RUY", "RUZ", "RBW" }; // получение усилий на фрагмент LiraLongsArray Forces = Response.Forces; // вывод на консоль перечня усилий на фрагмент Console.Write("Forces: "); for (int i = 0; i < Forces.Count; i++) Console.Write(StringFragmForces[Forces.Item[i]] + " "); Console.WriteLine("\n------------------------------------"); // вывод значений усилий в узле Node от загружения LC для всех составляющих for (int i = 0; i < LoadCases.Item[3].DeformedShapeCount; i++) { // номер составляющей int shape = ShapesArray.Item[i]; Console.WriteLine("Deformed shape: " + shape); Console.WriteLine("RX: " + Response.GetNodeRX(Node, LC, shape)); Console.WriteLine("RY: " + Response.GetNodeRY(Node, LC, shape)); Console.WriteLine("RZ: " + Response.GetNodeRZ(Node, LC, shape)); Console.WriteLine(""); }
Откомпилируйте программу (Build --> Build Solution) и запустите ее (Debug --> Start Debugging).
Для получения доступа к нагрузкам на контуры продавливания потребуются интерфейсы LiraLoadCaseInfos (информация о всех загружениях), LiraLoadCaseInfo (информация о конкретном загружении), LiraPunchLoadsRequest (формирование запроса) и LiraPunchLoadsResponse (получение нагрузок). Откройте в LIRA-FEM тестовую задачу Punching_Emergency_Dynamic_Load_Cases.lir, поставьте ее на расчет. Далее скопируйте приведенный пример кода и вставьте его в ваш проект C#. О том, как создать проект в Visual Studio, написано здесь.
// подключение библиотеки LiraFemRes using LiraFemRes; var Result = new LiraResultsAccess(); // объявление и инициализация интерфейса Request (запрос) LiraPunchLoadsRequest Request = Result.CreateNewRequest(LiraRequestEnum.kLiraRequest_PunchLoadForces) as LiraPunchLoadsRequest; // объявление интерфейса Response (ответ) LiraPunchLoadsResponse Response; // инициализация поля DocumentName (имя задачи) Request.DocumentName = "Punching_Emergency_Dynamic_Load_Cases"; // заполнение массива Nodes номерами узлов Request.Nodes.AddFromString("1-999"); // обработка запроса try { Response = Result.PunchLoads(Request); } catch (Exception e) { Console.WriteLine("Error: " + e.HResult); return; } // получение данных о всех загружениях LiraLoadCaseInfos LoadCases = Response.LoadCases; for (int i = 0; i < LoadCases.Count; i++) { LiraLoadCaseInfo LoadCase = LoadCases.Item[i]; // вывод номера загружения Console.WriteLine("Load case number: " + LoadCase.Number); // вывод количества составляющих Console.WriteLine("Number of deformed shapes: " + LoadCase.DeformedShapeCount); // вывод номеров составляющих var DynamicModeShapesArray = new LiraLongsArray(); DynamicModeShapesArray = LoadCase.DeformedShapes; Console.Write("Deformed shapes: "); for (int j = 0; j < DynamicModeShapesArray.Count; j++) Console.Write(DynamicModeShapesArray.Item[j] + " "); Console.WriteLine("\n------------------------------------"); } // объявление массива ShapesArray var ShapesArray = new LiraLongsArray(); // заполнение массива ShapesArray номерами составляющих ShapesArray = LoadCases.Item[3].DeformedShapes; // номер загружения int LC = LoadCases.Item[3].Number; // номер узла int Node = 145; // вывод на консоль номера узла Console.WriteLine("Node: " + Node); // вывод на консоль номера загружения Console.WriteLine("Load cases number: " + LC); // инициализация перечня внутренних усилий (LiraPunchLoadForceEnum) string[] StringElementForces = { "Undefined", "N", "MX", "MY", "QX", "QY", "MZ" }; // получение усилий на элемент LiraLongsArray Forces = Response.Forces; // вывод на консоль перечня усилий на элемент Console.Write("Forces: "); for (int i = 0; i < Forces.Count; i++) Console.Write(StringElementForces[Forces.Item[i]] + " "); Console.WriteLine("\n------------------------------------"); // вывод значений усилий в узле Node от загружения LC для всех составляющих for (int i = 0; i < LoadCases.Item[3].DeformedShapeCount; i++) { // номер составляющей int shape = ShapesArray.Item[i]; Console.WriteLine("Deformed shape: " + shape); Console.WriteLine("N: " + Response.GetNodeN(Node, LC, shape)); Console.WriteLine("MX: " + Response.GetNodeMX(Node, LC, shape)); Console.WriteLine("MY: " + Response.GetNodeMY(Node, LC, shape)); Console.WriteLine("QX: " + Response.GetNodeQX(Node, LC, shape)); Console.WriteLine("QY: " + Response.GetNodeQY(Node, LC, shape)); Console.WriteLine("MZ: " + Response.GetNodeMZ(Node, LC, shape)); Console.WriteLine(""); }
Откомпилируйте программу (Build --> Build Solution) и запустите ее (Debug --> Start Debugging).
Для получения доступа к усилиям, возникающим в элементах от РСУ, потребуются интерфейсы LiraDesignCombinationForcesRequest (формирование запроса) и LiraDesignCombinationForcesResponse (получение нагрузок). Откройте в LIRA-FEM тестовую задачу 05_tower_MK_RSU.lir, поставьте ее на расчет. Далее скопируйте приведенный пример кода и вставьте его в ваш проект C#. О том, как создать проект в Visual Studio, написано здесь.
// подключение библиотеки LiraFemRes using LiraFemRes; var Result = new LiraResultsAccess(); // объявление и инициализация интерфейса Request (запрос) LiraDesignCombinationForcesRequest Request = Result.CreateNewRequest(LiraRequestEnum.kLiraRequest_DesignCombinationForces) as LiraDesignCombinationForcesRequest; // объявление интерфейса Response (ответ) LiraDesignCombinationForcesResponse Response; // инициализация поля DocumentName (имя задачи) Request.DocumentName = "05_tower_MK_RSU"; // заполнение массива Elements номерами конечных элементов Request.Elements.AddFromString("1-99"); // номер таблицы Request.DesignCombinationTable = 1; // обработка запроса try { Response = Result.DesignCombinationForces(Request); } catch (Exception e) { Console.WriteLine("Error: " + e.HResult); return; } // флаги наличия в сочетаниях кранового и/или сейсмического загружения (LiraCraneEarthquakeFlagsEnum) string[] Flags = { "---", "Cr.", "EQ.", "Both" }; // внутренние группы расчетного сочетания усилий (LiraInternalGroupsEnum) string[] InternalGroups = { "Undefined", "A1", "B1", "C1", "D1", "A2", "B2", "C2", "D2", "E1" }; int Element = 1; int DC = 1; // вывод на консоль номера РСУ Console.WriteLine("Design combination number: " + DC); // перечень семейств конечных элементов (LiraElementFamilyEnum) string[] ElementFamilyes = { "Undefined", "Bar", "Plate", "Solid", "SpecElement", "Spec_58_5", "Spec_310", "Spec_264" }; // вывод на консоль номера элемента Console.WriteLine("Element: " + Element); // получение семейства конечного элемента int ElementFamily = (int)Response.GetFamily(Element); // вывод на консоль названия семейства, к которому принадлежит конечный элемент Console.WriteLine("Element family: " + ElementFamilyes[ElementFamily]); // инициализация перечня внутренних усилий (LiraForceEnum) string[] StringElementForces = { "Undefined", "BarN", "BarMx", "BarMy", "BarQz", "BarMz", "BarQy", "BarRy", "BarRz", "BarBw", "BarTw", "PlateNx", "PlateNy", "PlateNz", "PlateTxy", "PlateTxz", "PlateMx", "PlateMy", "PlateMxy", "PlateQx", "PlateQy", "PlateRz", "SolidNx", "SolidNy", "SolidNz", "SolidTxy", "SolidTxz", "SolidTyz", "SpecElementRx", "SpecElementRy", "SpecElementRz", "SpecElementRux", "SpecElementRuy", "SpecElementRuz", "Spec_58_59_Qz", "Spec_58_59_Ny", "Spec_58_59_Qx", "Spec_310_N", "Spec_310_My", "Spec_310_Qz", "Spec_310_Mx", "Spec_310_Mz", "Spec_310_Qy", "Spec_264_N", "Spec_264_Qz", "Spec_264_Qy" }; // получение усилий в конечном элементе LiraLongsArray ElementForces = Response.GetForces(Element); // вывод на консоль перечня усилий в конечном элементе Console.Write("Forces: "); for (int i = 0; i < ElementForces.Count; i++) Console.Write(StringElementForces[ElementForces.Item[i]] + " "); Console.WriteLine(); // вывод данных РСУ расчетных для элемента Element int LS = (int)LiraLimitStateForcesEnum.kLiraLimitStateForces_UltimateFull; Console.WriteLine("+------+-------+------+------+-------+---------+---------+---------+---------+---------+---------+------------+"); Console.WriteLine("| Sec. | Crit. | Col. | Flag | Group | N | Mx | My | Qz | Mz | Qy | Load Cases |"); Console.WriteLine("+------+-------+------+------+-------+---------+---------+---------+---------+---------+---------+------------+"); for (int CS = 1; CS <= Response.GetSectionCount(Element); CS++) { // количество расчетных комбинаций сил в расчетном сечении CS элемента Element int DCLCount = Response.GetDCLCount(Element, CS, LS); for (int DCF = 1; DCF <= DCLCount; DCF++) { // номер критерия int Crit = Response.GetCriterionNumber(Element, CS, LS, DCF); // номер столбца коэффициентов сочетаний int Col = Response.GetColumnNumber(Element, CS, LS, DCF); // флаг наличия в сочетаниях кранового и/или сейсмического загружения int Flag = (int)Response.GetCraneEarthquakeFlag(Element, CS, LS, DCF); // индекс внутренней группы int Group = (int)Response.GetInternalGroup(Element, CS, LS, DCF); // усилия (получение и округление) double N = Math.Round(Response.GetBarN(Element, CS, LS, DCF), 3); double Mx = Math.Round(Response.GetBarMx(Element, CS, LS, DCF), 3); double My = Math.Round(Response.GetBarMy(Element, CS, LS, DCF), 3); double Qz = Math.Round(Response.GetBarQz(Element, CS, LS, DCF), 3); double Mz = Math.Round(Response.GetBarMz(Element, CS, LS, DCF), 3); double Qy = Math.Round(Response.GetBarQy(Element, CS, LS, DCF), 3); string LoadCasesStr = ""; // массив загружений ILiraLongsArray LoadCasesArr = Response.GetLoadCases(Element, CS, LS, DCF); for (int j = 0; j < LoadCasesArr.Count; j++) LoadCasesStr = string.Concat(LoadCasesStr, LoadCasesArr.Item[j].ToString() + " "); Console.Write("| {0,-4} | {1,-5} | {2,-4} | {3,-4} | {4,-5} ", CS, Crit, Col, Flags[Flag], InternalGroups[Group]); Console.WriteLine("| {0,-7} | {1,-7} | {2,-7} | {3,-7} | {4,-7} | {5,-7} | {6,-10} |", N, Mx, My, Qz, Mz, Qy, LoadCasesStr); } Console.WriteLine("+------+-------+------+------+-------+---------+---------+---------+---------+---------+---------+------------+"); }
Откомпилируйте программу (Build --> Build Solution) и запустите ее (Debug --> Start Debugging).
Для получения частот динамических загружений потребуются интерфейсы LiraPeriodsOfVibrationsRequest (формирование запроса) и LiraPeriodsOfVibrationsResponse (получение частот). Откройте в LIRA-FEM тестовую задачу PK_rama-GB.lir, поставьте ее на расчет. Далее скопируйте приведенный пример кода и вставьте его в ваш проект C#. О том, как создать проект в Visual Studio, написано здесь.
// подключение библиотеки LiraFemRes using LiraFemRes; // объявление интерфейса Response (ответ) LiraPeriodsOfVibrationsResponse Response; var Result = new LiraResultsAccess(); // объявление и инициализация интерфейса Request (запрос) LiraPeriodsOfVibrationsRequest Request = Result.CreateNewRequest(LiraRequestEnum.kLiraRequest_PeriodsOfVibrations) as LiraPeriodsOfVibrationsRequest; // инициализация поля DocumentName (имя задачи) Request.DocumentName = "PK_rama-GB"; // обработка запроса try { Response = Result.PeriodsOfVibrations(Request); } catch (Exception e) { Console.WriteLine("Error: " + e.HResult); return; } // перечень типов динамических загружений в виде строк string[] LoadCaseTypes = { "Undefined dynamic load case", "Earthquake (SNIP II-7-81*)", "Pulsation", "Impulse", "Impact", "Harmonic", "Accelerogram", "Three-component accelerogram", "Earthquake (SNIP II - 7 - 81 * modif.1996)", "Earthquake (SNRA II - 6.02 - 2006)", "Earthquake (KMK 2.01.03-2019)", "Earthquake (MGSN 4.19 - 05)", "Earthquake / 01.01.2000 / SP 14.13330.2011 /", "Earthquake (DBN B.1.1-12:2006)", "Earthquake (DBN B.1.1-12:2006, App.B)", "Earthquake (with torsion)", "Earthquake (SNT 2.01.08-99*)", "Earthquake (NF P 06-013)", "Earthquake (response spectrum)", "Earthquake (IBC-2006)", "Earthquake (SNIP RK 2.03-30-2006)", "Earthquake (EN 1998 - 1:2004)", "Earthquake (RPA 99 (2003))", "Earthquake (DBN B.1.1-12:2006, App.G)", "Earthquake (NP-031-01 for nuclear plants)", "Earthquake (MKC 22-07-2007)", "Earthquake (DBN B.2.2-24:2009)", "Earthquake (AzDTN 2.3-1-2010, with modif. of Jan 01,2014)", "Earthquake (PN 01.01.-09)", "Earthquake (SP 14.13330.2014/2018, modif.No.2,3)", "Earthquake (DBN B.1.1-12:2014)", "Earthquake (SNIP KP 20-02:2009)", "Earthquake (SP RK 2.03-30-2017, SN KR 20-02:2018)", "Earthquake (SP RK EN 1998-1:2004/2012, NTP RK 08-01.1-2017)", "Earthquake (SP 14.13330.2018, with Modif. No.1)", "Earthquake (TBEC-2018)", "Earthquake (three-component response spectrum)", "Modal analysis (100)" }; // перечень типов динамических загружений в виде LiraDynamicLoadCaseTypesEnum LiraFemRes.LiraDynamicLoadCaseTypesEnum[] LoadCaseTypesEnums = { LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Undefined, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_20, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Pulsation, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Impulse, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Impact, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Harmonic, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Accelerogram, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Three_component_accelerogram, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_30, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_32, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_33, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_34, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_35, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_36, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_37, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_38, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_39, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_40, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_41, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_42, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_43, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_44, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_45, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_46, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_47, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_48, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_49, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_50, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_53, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_56, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_57, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_58, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_60, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_61, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_62, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_63, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Earthquake_64, LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Modal_analysis_100 }; // создание словаря соответствий между LiraDynamicLoadCaseTypesEnum и LoadCaseTypes SortedDictionary < LiraFemRes.LiraDynamicLoadCaseTypesEnum, string > LoadCaseTypeDictionary = new SortedDictionary < LiraFemRes.LiraDynamicLoadCaseTypesEnum, string > (); for (int i = 0; i < LoadCaseTypesEnums.Count(); i++) LoadCaseTypeDictionary.Add(LoadCaseTypesEnums[i], LoadCaseTypes[i]); // объявление массива, в котором будут храниться номера динамических загружений var DynamicLoadCases = new LiraLongsArray(); // получение номеров динамических загружений DynamicLoadCases = Response.LoadCaseNumbers; Console.WriteLine("+-----------+----------------------------------------------------+"); Console.WriteLine("| Load Case | Type |"); Console.WriteLine("+-----------+----------------------------------------------------+"); for (int i = 0; i < DynamicLoadCases.Count; i++) { string LoadCaseType = LoadCaseTypeDictionary[Response.GetDynamicLoadCaseType(DynamicLoadCases.Item[i])]; Console.WriteLine("| {0,-9} | {1,-50} |", DynamicLoadCases.Item[i], LoadCaseType); } Console.WriteLine("+-----------+----------------------------------------------------+"); // вывод данных акселерограммы Console.WriteLine("\nAccelerogram"); for (int i = 0; i < DynamicLoadCases.Count; i++) { if (Response.GetDynamicLoadCaseType(DynamicLoadCases.Item[i]) == LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Accelerogram) { Console.WriteLine("+-----------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+"); Console.WriteLine("| Load Case | Eigenvalues | Rad/sec | Hz | Periods | Factors | Masses | Acc. Masses |"); Console.WriteLine("+-----------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+"); var Eigenvalues = Response.GetEigenvalues(DynamicLoadCases.Item[i]); var FreqRadSec = Response.GetFrequenciesRadPerSec(DynamicLoadCases.Item[i]); var FreqHz = Response.GetFrequenciesHz(DynamicLoadCases.Item[i]); var Periods = Response.GetPeriods(DynamicLoadCases.Item[i]); var Factors = Response.GetParticipFactors(DynamicLoadCases.Item[i]); var Masses = Response.GetModalMasses(DynamicLoadCases.Item[i]); var AccMasses = Response.GetAccumulatedModalMasses(DynamicLoadCases.Item[i]); for (int j = 0; j < Eigenvalues.Count; j++) { Console.Write("| {0,-9:##} | {1,-11:##.######} | {2,-11:##.######} ", DynamicLoadCases.Item[i], Eigenvalues.Item[j], FreqRadSec.Item[j]); Console.Write("| {0,-11:##.######} | {1,-11:##.######} | {2,-11:##.######} ", FreqHz.Item[j], Periods.Item[j], Factors.Item[j]); Console.WriteLine("| {0,-11:##.#####} | {1,-11:##.#####} |", Masses.Item[j], AccMasses.Item[j]); } } } Console.WriteLine("+-----------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+"); // вывод ударных нагрузок Console.WriteLine("\nImpact"); for (int i = 0; i < DynamicLoadCases.Count; i++) { if (Response.GetDynamicLoadCaseType(DynamicLoadCases.Item[i]) == LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Impact) { Console.WriteLine("+-----------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+"); Console.WriteLine("| Load Case | Eigenvalues | Rad/sec | Hz | Periods | Factors | Masses | Acc. Masses |"); Console.WriteLine("+-----------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+"); var Eigenvalues = Response.GetEigenvalues(DynamicLoadCases.Item[i]); var FreqRadSec = Response.GetFrequenciesRadPerSec(DynamicLoadCases.Item[i]); var FreqHz = Response.GetFrequenciesHz(DynamicLoadCases.Item[i]); var Periods = Response.GetPeriods(DynamicLoadCases.Item[i]); var Factors = Response.GetParticipFactors(DynamicLoadCases.Item[i]); var Masses = Response.GetModalMasses(DynamicLoadCases.Item[i]); var AccMasses = Response.GetAccumulatedModalMasses(DynamicLoadCases.Item[i]); for (int j = 0; j < Eigenvalues.Count; j++) { Console.Write("| {0,-9:##} | {1,-11:##.######} | {2,-11:##.######} ", DynamicLoadCases.Item[i], Eigenvalues.Item[j], FreqRadSec.Item[j]); Console.Write("| {0,-11:##.######} | {1,-11:##.######} | {2,-11:##.######} ", FreqHz.Item[j], Periods.Item[j], Factors.Item[j]); Console.WriteLine("| {0,-11:##.#####} | {1,-11:##.#####} |", Masses.Item[j], AccMasses.Item[j]); } } } Console.WriteLine("+-----------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+"); // вывод данных модального анализа Console.WriteLine("\nModal analysis"); for (int i = 0; i < DynamicLoadCases.Count; i++) { if (Response.GetDynamicLoadCaseType(DynamicLoadCases.Item[i]) == LiraDynamicLoadCaseTypesEnum.kLiraLoadCaseType_Modal_analysis_100) { Console.WriteLine("+-----------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+"); Console.WriteLine("| Load Case | Eigenvalues | Rad/sec | Hz | Periods | Factors | Masses | Acc. Masses |"); Console.WriteLine("+-----------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+"); var Eigenvalues = Response.GetEigenvalues(DynamicLoadCases.Item[i]); var FreqRadSec = Response.GetFrequenciesRadPerSec(DynamicLoadCases.Item[i]); var FreqHz = Response.GetFrequenciesHz(DynamicLoadCases.Item[i]); var Periods = Response.GetPeriods(DynamicLoadCases.Item[i]); var Factors = Response.GetParticipFactors(DynamicLoadCases.Item[i]); var Masses = Response.GetModalMasses(DynamicLoadCases.Item[i]); var AccMasses = Response.GetAccumulatedModalMasses(DynamicLoadCases.Item[i]); for (int j = 0; j < Eigenvalues.Count; j++) { Console.Write("| {0,-9:##} | {1,-11:##.######} | {2,-11:##.######} ", DynamicLoadCases.Item[i], Eigenvalues.Item[j], FreqRadSec.Item[j]); Console.Write("| {0,-11:##.######} | {1,-11:##.######} | {2,-11:##.######} ", FreqHz.Item[j], Periods.Item[j], Factors.Item[j]); Console.WriteLine("| {0,-11:##.#####} | {1,-11:##.#####} |", Masses.Item[j], AccMasses.Item[j]); } } } Console.WriteLine("+-----------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+");
Откомпилируйте программу (Build --> Build Solution) и запустите ее (Debug --> Start Debugging).
Для получения данных об армировании элементов потребуются интерфейсы LiraSelectedReinforcementRequest (формирование запроса) и LiraSelectedReinforcementResponse (получение данных). Откройте в LIRA-FEM тестовую задачу example18_fire.lir, поставьте ее на расчет. Далее скопируйте приведенный пример кода и вставьте его в ваш проект C#. О том, как создать проект в Visual Studio, написано здесь.
// подключение библиотеки LiraFemRes using LiraFemRes; // объявление интерфейса Response (ответ) LiraSelectedReinforcementResponse Response; var Result = new LiraResultsAccess(); // объявление и инициализация интерфейса Request (запрос) LiraSelectedReinforcementRequest Request = Result.CreateNewRequest(LiraRequestEnum.kLiraRequest_SelectedReinforcement) as LiraSelectedReinforcementRequest; // инициализация поля DocumentName (имя задачи) Request.DocumentName = "example18_fire"; // инициализация поля, отвечающего за номер варианта подбора арматуры Request.DesignOption = 1; // инициализация списка элементов Request.Elements.AddFromString("1611,75,96"); // инициализация массива категорий данных армирования LiraReinforcementDataEnum[] RD = { LiraReinforcementDataEnum.kLiraReinforcementData_Total, LiraReinforcementDataEnum.kLiraReinforcementData_Strength, LiraReinforcementDataEnum.kLiraReinforcementData_Torsion }; // строковое представление элементов RD string[] RDstr = { "Total", "Strn.", "Tors." }; Request.ReinforcementData.Count = RD.Length; // заполнение массива категорией данных армирования в запросе for (int i = 0; i < RD.Length; i++) Request.ReinforcementData.Item[i] = (int)RD[i]; // обработка запроса try { Response = Result.SelectedReinforcement(Request); } catch (Exception e) { Console.WriteLine("Error: " + e.HResult); return; } // массив произвольных элементов, для которых будут выведены на консоль данные армирования int[] Elements = { 1611, 75, 96 }; for (int i = 0; i < Elements.Length; i++) { Console.WriteLine("+-------+------+-------+---+-------+-------+-------+-------+-------+-------+-------+-------+-----+------+------+-------+------+"); Console.WriteLine("| Elem. | Sec. | Type. |S/A| AU1 | AU2 | AU3 | AU4 | AS1 | AS2 | AS3 | AS4 | % | ASW1 | ASW2 | Short | Long |"); Console.WriteLine("+-------+------+-------+---+-------+-------+-------+-------+-------+-------+-------+-------+-----+------+------+-------+------+"); int SecCount = Response.GetSectionCount(Elements[i]); for (int CS = 1; CS <= SecCount; CS++) { for (int s = 1; s >= 0; s--) { for (int k = 0; k < RD.Length; k++) { // симметрия / асимметрия string SA = "S"; if (s == 0) SA = "A"; // код ошибок int Err = 0; // получение данных армирования float AU1 = Response.GetBarAU1(Elements[i], CS, RD[k], s, 0, out Err); float AU2 = Response.GetBarAU2(Elements[i], CS, RD[k], s, 0, out Err); float AU3 = Response.GetBarAU3(Elements[i], CS, RD[k], s, 0, out Err); float AU4 = Response.GetBarAU4(Elements[i], CS, RD[k], s, 0, out Err); float AS1 = Response.GetBarAS1(Elements[i], CS, RD[k], s, 0, out Err); float AS2 = Response.GetBarAS2(Elements[i], CS, RD[k], s, 0, out Err); float AS3 = Response.GetBarAS3(Elements[i], CS, RD[k], s, 0, out Err); float AS4 = Response.GetBarAS4(Elements[i], CS, RD[k], s, 0, out Err); float Pre = Response.GetBarPERC(Elements[i], CS, RD[k], s, 0, out Err); float ASW1 = Response.GetBarASW1(Elements[i], CS, RD[k], s, 0, out Err); float ASW2 = Response.GetBarASW2(Elements[i], CS, RD[k], s, 0, out Err); float CrShrt = Response.GetBarCrackSHORT(Elements[i], CS, s, 0, out Err); float CrLong = Response.GetBarCrackLONG(Elements[i], CS, s, 0, out Err); // вывод на консоль данных армирования Console.Write("| {0,-5} | {1,-4} | {2,-5} | {3,-1} ", Elements[i], CS, RDstr[k], SA); Console.Write("| {0,-5:#.##} | {1,-5:#.##} | {2,-5:#.##} | {3,-5:#.##} ", AU1, AU2, AU3, AU4); Console.Write("| {0,-5:#.##} | {1,-5:#.##} | {2,-5:#.##} | {3,-5:#.##} ", AS1, AS2, AS3, AS4); Console.Write("| {0,-3:#.##} | {1,-4:#.##} | {2,-4:#.##} ", Pre, ASW1, ASW2); Console.WriteLine("| {0,-5:#.##} | {1,-4:#.##} |", CrShrt, CrLong); } } } } Console.WriteLine("+-------+------+-------+---+-------+-------+-------+-------+-------+-------+-------+-------+-----+------+------+-------+------+");
Откомпилируйте программу (Build --> Build Solution) и запустите ее (Debug --> Start Debugging).
В таблице приведен список интерфейсов, предоставляющих доступ к результатам расчета. Условно интерфейсы можно разделить на группы: базовые, вспомогательные, информационные, интерфейсы запроса и интерфейсы доступа (ответа).
Базовые интерфейсы (ILiraResultRequestBase, ILiraResultsAccess) предназначены для создания объектов запрос и ответ.
Вспомогательные интерфейсы (ILiraLongsArray, ILiraDoublesArray) используются для взаимодействия с массивами чисел.
Информационные интерфейсы имеют в конце своего названия ключевое слово Info, предназначены для доступа к информации о загружениях, к информации об истории нелинейных загружений, к данным РСН и РСУ.
Интерфейсы запроса имеют в конце своего названия ключевое слово Request, предназначены для формирования запроса.
Интерфейсы доступа имеют в конце своего названия ключевое слово Response, предназначены для доступа к запрашиваемым данным.
| Название интерфейса | Краткое описание |
|---|---|
| ILiraLongsArray | Вспомогательный интерфейс для массива чисел типа long |
| ILiraDoublesArray | Вспомогательный интерфейс для массива чисел типа double |
| ILiraResultRequestBase | Базовый интерфейс запроса результатов расчета LIRA-FEM |
| ILiraLoadCaseDisplacementsRequest | Интерфейс запроса перемещений узлов от загружений |
| ILiraLoadCaseForcesRequest | Интерфейс запроса усилий от загружений |
| ILiraLoadCombinationDisplacementsRequest | Интерфейс запроса перемещений узлов от РСН |
| ILiraLoadCombinationForcesRequest | Интерфейс запроса усилий от РСН |
| ILiraFragmLoadsRequest | Интерфейс запроса нагрузок на фрагмент |
| ILiraPunchLoadsRequest | Интерфейс запроса нагрузок на контуры продавливания |
| ILiraDesignCombinationForcesRequest | Интерфейс запроса усилий от РСУ |
| ILiraPeriodsOfVibrationsRequest | Интерфейс запроса частот динамических загружений |
| ILiraSelectedReinforcementRequest | Интерфейс запроса данных армирования в элементах |
| ILiraLoadCaseInfo | Интерфейс доступа к свойствам загружений |
| ILiraLoadCaseInfos | Интерфейс доступа к массиву свойств загружений |
| ILiraLoadHistoryInfo | Интерфейс доступа к свойствам истории нелинейных загружений |
| ILiraLoadHistoryInfos | Интерфейс доступа к массиву свойств истории нелинейных загружений |
| ILiraLoadCombinationInfo | Интерфейс доступа к свойствам РСН |
| ILiraLoadCombinationInfos | Интерфейс доступа к массиву свойств РСН |
| ILiraLoadCaseDisplacementsResponse | Интерфейс получения перемещений узлов от загружений |
| ILiraLoadCombinationDisplacementsResponse | Интерфейс получения перемещений узлов от РСН |
| ILiraLoadCaseForcesResponse | Интерфейс получения усилий, возникающих в конечных элементах от загружений |
| ILiraLoadCombinationForcesResponse | Интерфейс получения усилий, возникающих в конечных элементах от РСН |
| ILiraFragmLoadsResponse | Интерфейс получения нагрузок на фрагмент |
| ILiraPunchLoadsResponse | Интерфейс получения нагрузок на контуры продавливания |
| ILiraDesignCombinationForcesResponse | Интерфейс получения усилий, возникающих в элементах от РСУ |
| ILiraPeriodsOfVibrationsResponse | Интерфейс доступа к периодам колебаний динамических загружений |
| ILiraSelectedReinforcementResponse | Интерфейс получения данных армирования в элементах |
| ILiraResultsAccess | Базовый интерфейс доступа к результатам |
Заметили ошибку? Выделите ее и нажмите Ctrl+Enter, чтобы сообщить нам.
Комментарии