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, щоб повідомити нам.
Коментарі