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#


Для розробки програми в C# в цьому прикладі ми використовуватимемо Microsoft Visual Studio. Їі безкоштовну версію, Microsoft Visual Studio Community Edition, можна завантажити з вебсайту microsoft.com.

  1. Створення нового проєкту

    Рис.1

    Рис.1

    Запустіть Visual Studio, оберіть пункт меню File --> New --> Project, оберіть тип проєкту Visual C# Console App. Як ім'я Name проєкту вкажіть LiraFemResApiTest1, а як розташування Location вкажіть, наприклад, C:\Projects\ і натисніть OK.

  2. Додавання посилання на бібліотеку типів LIRA-FEM RES API

    Перейдіть у вікно Solution Explorer і клацніть правою кнопкою миші на елементі Dependencies. У відкритому контекстному меню оберіть пункт Add COM Reference... Далі оберіть рядок LiraFemRes і натисніть OK.

    Рис.2

    Рис.2

    Якщо ви не бачите рядка LiraFemRes в списку, це означає що ця бібліотека типів не зареєстрована. Перевстановіть LIRA-FEM чи запустіть regsvr32.exe LiraResApi.dll від імені адміністратора.

  3. Виконання розрахунку тестової задачі

    Відкрийте в LIRA-FEM тестову задачу 05_вежа МК.lir і поставте її на розрахунок.

  4. Поверніться в середовище розробки 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();
    }
    
  5. Компіляція програми

    Оберіть пункт меню Build --> Build Solution.

  6. Запуск програми

    Оберіть пункт меню Debug --> Start Debugging.

    При виконанні цього прикладу в консолі виведуться переміщення вузлів: 2, 3, 4, 5, 6 від завантаження №1.

    Рис.3

    Рис.3
  7. Висновок

    В цьому прикладі ми розглянули механізм отримання даних результатів розрахунку. Цей процес можна умовно розбити на три кроки.

    1. Створення запиту.

      Заповнюємо поля об'єкта Request (назва документа, перелік вузлів, ... ).

    2. Опрацювання запиту.

      Викликаємо у об'єкта Result метод LoadCaseDisplacements, результат передаємо в об'єкт Response.

    3. Отримання даних.

      У об'єкта Response викликаємо методи (GetNodeX, GetNodeY, GetNodeZ).


    Гнучкий запит: приклад використання LIRA-FEM RES API, що демонструє як зекономити обчислювальні ресурси


    В попередньому прикладі з розділу Швидкий старт при формуванні запиту ми заповнили поля: назва документа (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).

    Рис.4

    Рис.4

    У нас виникла помилка при спробі отримати дані про переміщення вузла 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).

    Рис.5

    Рис.5

    Висновок

    У випадках, коли достовірно невідома наявність запитуваних даних в результатах розрахунку, потрібно використовувати оператори обробки винятків try-catch.


    LoadCaseDisplacements: доступ до переміщень вузлів від завантажень


    Як отримати переміщення вузлів від завантажень, розглядалося у розділі Швидкий старт. В цьому розділі розглянемо випадок деформованої схеми, коли завантаження має форми переміщень (складові). В 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).

    Рис.6

    Рис.6

    LoadCaseForces: доступ до зусиль, що виникають в елементах від завантажень


    Для отримання доступу до зусиль, що виникають в елементах від завантажень, знадобляться інтерфейси 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).

    Рис.7

    Рис.7

    LoadCombinationDisplacements: доступ до переміщень вузлів від РСН


    Для отримання даних про переміщення вузлів від РСН знадобляться інтерфейси 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).

    Рис.8

    Рис.8

    LoadCombinationForces: доступ до зусиль, що виникають в елементах від РСН


    Для отримання даних про зусилля від РСН знадобляться інтерфейси 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).

    Рис.9

    Рис.9

    FragmLoads: доступ до навантажень на фрагмент


    Для отримання доступу до навантажень на фрагмент знадобляться інтерфейси 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).

    Рис.10

    Рис.10

    PunchLoads: доступ до навантажень на контури продавлювання


    Для отримання доступу до навантажень на контури продавлювання знадобляться інтерфейси 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).

    Рис.11

    Рис.11

    DesignCombinationForces: доступ до зусиль, що виникають в елементах від РСЗ


    Для отримання доступу до зусиль, що виникають в елементах від РСЗ, знадобляться інтерфейси 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).

    Рис.12

    Рис.12

    PeriodsOfVibrations: отримання частот динамічних завантажень


    Для отримання частот динамічних завантажень знадобляться інтерфейси 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).

    Рис.13

    Рис.13

    SelectedReinforcement: доступ до даних армування елементів


    Для отримання даних про армування елементів знадобляться інтерфейси 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).

    Рис.14

    Рис.14

    Таблиця інтерфейсів


    В таблиці наведений список інтерфейсів, що надають змогу отримати доступ до результатів розрахунку. Умовно інтерфейси можна розділити на групи: базові, допоміжні, інформаційні, інтерфейси запиту та інтерфейси доступу (відповіді).

    Базові інтерфейси (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, щоб повідомити нам.



Коментарі

Написати