Содержание:
- Исходные данные
- Построение расчетной модели
- Статический расчет
- Поверочный расчет ПКМ
- API ЛИРА 10.12
- Разработка пользовательского расширения
- Регистрация пользовательского расширения
- Пользовательское расширение для расчета ПКМ
- Вывод результатов расчета
В практике строительства инженерных сооружений нашли широкое применение конструкции изготавливаемые из полимерных композиционных материалов (далее ПКМ). Данные материалы используются и при производстве всевозможных технологических емкостей. Высокая прочность ПКМ позволяет размещать емкости ниже поверхности земли, и они способны воспринимать значительные нагрузки.
Последовательность расчета и конструирования емкостей из ПКМ в ЛИРА 10 состоит из нескольких основных этапов:
- Определение усилий / напряжений в элементах конструкции. Для вычисления, как правило, используются расчетные схемы, состоящие из пластинчатых КЭ;
- Проверка общей и локальной устойчивости элементов емкости;
- Расчет емкости на всплытие;
- Проверка несущей способности стенок из ПКМ по соответствующей теории прочности.
В заметке мы рассмотрим расчет подземной технологической емкости, устанавливаемой в составе локальных очистных сооружений, и познакомимся с возможностями открытого API (Application Programming Interface) ЛИРА 10 применительно к автоматизации проверки прочности ПКМ.
Функционал API позволяет пользователям ЛИРА 10.12 выполнить экспорт исходных данных или результатов расчета в нестандартный формат или произвести дополнительные расчеты, используя существующие данные.
Исходные данные:
Выполнить поверочный расчет вертикальной технологической емкости для жидкости с рабочим объемом 35м3. Глубина заглубления – 6м, обратная засыпка песком средней крупности. Стенки толщиной 10мм выполнены из полимерного композиционного материала, полученного двумя методами – методом намотки однонаправленного ровинга и методом контактного формования ткани. Для предотвращения всплытия в основании емкости устраивается фундамент балластного типа.
Построение расчетной модели:
Расчетная модель емкости представлена на рис. 1. Диаметр емкости 3.1м, высота 6м. Выполняем триангуляцию модели, назначаем граничные условия (условия сопряжения элементов, грунтовые условия и т.д.). Для учета направления волокна ПКМ предварительно делаем ориентирование локальных осей (рис. 2).
Рисунок 1. Конечно-элементная модель емкости
Рисунок 2. Конечно-элементная модель емкости. Локальные оси, ось X направлена по направлению волокон ПКМ
Далее прикладываем действующие нагрузки на расчетную схему – собственный вес конструкций, эксплуатационные нагрузки (давление жидкости в резервуаре), нагрузки от засыпки грунтом, нагрузки на поверхности грунта.
Нагрузку на стенки резервуара от обратной засыпки определяем согласно приложения В (СП 43.13330.2012 Сооружения промышленных предприятий. Актуализированная редакция СНиП 2.09.03-85, далее [1]). Характеристики грунта обратной засыпки принимаем с учетом п.п. В.1-В.3 [1]. Выполним вычисление нагрузки:
, угол наклона плоскости скольжения к вертикали
, коэффициент горизонтального давления грунта
, горизонтальное давление грунта на глубине y
Вычисленную нагрузку от обратной засыпки грунтом можно задать при помощи функции «Трапециевидная нагрузка на группу».
Также подобную вычисляемую нагрузку можно приложить инструментом задания нагрузки по функции. Для назначения распределенной нагрузки по функции в диалоговом окне задается значение нагрузки (в виде определенной функции). Синтаксис формульного задания линий и поверхностей должен полностью соответствовать синтаксису и правилам использования языка программирования C Sharp (С#). То есть допускается создание пользовательских переменных любых типов данных, доступных в С#, использование любых видов циклов, написание различных условий и ограничений на параметры функций и т. д. На рис. 3 продемонстрирован пример скрипта для автоматического вычисления давления грунта и приложения нагрузки на схему.
var fi = 33; //угол внутреннего трения
var g = 18000; //плотность грунта, Н/м.куб.
var c = 0; //удельное сцепление, н/м.кв.
var theta = 45-fi/2; //ф.В.3 [1]
var lambdaH = tan(theta*0.017)*tan(theta*0.017); //ф.В.4 [1]
f = g*(-z)*lambdaH-2*c*sqrt(lambdaH); //ф.В.5 [1]. Прикладываемая нагрузка, Н/м.кв.
Рисунок 3. Загружение расчетной схемы. Нагрузка от обратной засыпки емкости
На следующем шаге нам необходимо определить параметры применяемых материалов и назначить их элементам модели. Деформационные и прочностные параметры определены по результатам натурных испытаний и представлены в таблицах 1,2.
Таблица 1. Прочностные характеристики ПКМ
Таблица 2. Упругие характеристики ПКМ
Статический расчет:
После задания всех необходимых характеристик расчетной модели производим статический расчет, определяем расчетные усилия. В результате численного моделирования в каждой точке интегрирования элементов емкости определились все компоненты тензора напряжения. Далее представлены различные варианты визуализации внутренних усилий. В ЛИРА 10 возможен вывод значений усилий и напряжений в пластинах, в том числе главных и эквивалентных напряжений.
Рисунок 4. Продольные напряжения в матрице ПКМ
Рисунок 5. Изополя касательных напряжений в ПКМ.
Проверку резервуара на общую устойчивость выполняем с применением подсистемы «Устойчивость», подробнее в заметке. Для решения задачи общей устойчивости применяется метод итерации подпространств (QR–метод), аналогичный методу вычисления частот и форм собственных колебаний в задачах динамики. Этот метод позволяет определить не только первую, но и высшие формы потери устойчивости и соответствующую им критическую нагрузку. Результат проверки для первой формы потери устойчивости изображен на рис. 6.
Рисунок 6. Поля амплитуд смещений точек емкости для случая первой формы потери устойчивости. Коэффициент запаса по устойчивости – 2.4.
Поверочный расчет ПКМ:
После того, как в элементах КЭ сетки определены действующие напряжения, необходимо выполнить проверку конструкции по прочности или по 1 предельному состоянию. В качестве критерия прочности подобных решаемой нами системе применяют множество различных теорий. В данном случае задача осложняется тем, что ПКМ является анизотропным материалом, то есть материал имеет различные характеристики прочности, жесткости вдоль и поперек волокон. Существует около 15 основных теорий прочности для проверки прочности ПКМ (Хоффмана, Цай-Хилла, Норриса, Пака и др.), и выбор применяемой для анализа теории производит инженер-конструктор, опираясь на особенности конкретной конструкции из ПКМ. В данной заметки мы с вами рассмотрим и применим теорию, которую предложил Цви Хашин [Hashin, Z., “Failure Criteria for Unidirectional Fiber Composites,” Journal of Applied Mechanics, vol. 47, pp. 329–334, 1980.]
Данный критерий позволяет сделать оценку зарождения разрушения армированного ПКМ для разных мод: разрыв волокна, разрушение волокна при сжатии, а также разрушения связующего при растяжении или сжатии.
Для оценки возникновения разрушения ПКМ при растяжении армирования используется величина:
, при наличии растягивающих напряжений σ11 > 0 в направлении армирования.
Разрушение при сжатии армирования оценивается величиной:
, при наличии сжимающих напряжений σ11 < 0 в направлении армирования.
Разрушение матрицы при растяжении определяется величиной:
, при наличии растягивающего напряжения в направлении перпендикулярном армированию σ22 > 0.
Разрушение матрицы при сжатии определяется величиной:
, при наличии сжимающего напряжения в направлении перпендикулярном армированию σ22 < 0.
В приведенных формулах используются следующие обозначения:
XT – прочность ПКМ при растяжении в направлении армирования;
XС – прочность ПКМ при сжатии в направлении армирования;
YT – прочность ПКМ при растяжении в направлении, перпендикулярном направлению армирования;
YС – прочность ПКМ при сжатии в направлении, перпендикулярном направлению армирования;
ST – трансверсальная сдвиговая прочность;
α - коэффициент, определяющий влияние сдвигового напряжения в плоскости 12 на разрушение армирования ПКМ при растяжении.
Таким образом для дальнейшего поверочного расчета необходимо на основе полученных напряжений в ЛИРА 10 выполнить дополнительные вычисления и проверить все критерии прочности, которые приведены выше. В общем случае данную проверку необходимо проделать для всех КЭ расчетной схемы, что при практических расчетах довольно трудозатратно, но безусловно необходимо.
API ЛИРА 10.12:
Для автоматизации проверки элемента по специфической теории прочности пользователь ЛИРА 10 может самостоятельно разработать расширение с использованием открытого API. В версии ЛИРА 10.12 доступна работа API в режиме просмотра результатов. Дальнейшая часть заметки будет посвящена подробностям разработки пользовательских расширений с использованием API ЛИРА 10 и в большей мере предназначена для пользователей программы, которые имеют навыки программирования. Но даже если вы никогда ранее не сталкивались с программированием, вам тоже могут быть интересны возможности, открывающиеся при владении навыками разработки плагинов.
Вначале мы с вами пошагово рассмотрим последовательность действий для создания простого плагина, который будет выводить на экран количество выбранных в модели объектов. А далее перейдем к созданию плагина для проверки конструкции из ПКМ. Пример создания плагина на языке С++ описан в документе "C:\Program Files\Lira Soft\Lira10.12\LiraAPI\LiraAPIHelp.pdf", в данной заметке будет разработан плагин с использованием библиотек .Net, а именно языка С#. В качестве упрощения в заметке будет продемонстрирована разработка в среде SharpDevelop, но рекомендуем в своей дальнейшей работе использовать Microsoft Visual Studio.
Для добавления расширения ЛИРА 10.12 потребуется выполнить два основных действия:
а) разработать расширение *.dll, опираясь на возможности API ЛИРА 10
б) зарегистрировать разработанное расширение в среде ЛИРА 10.12
А) Разработка пользовательского расширения
Создаем новый проект в SharpDevelop – библиотека классов C#, .NET Framework 4.5. В свойствах проекта указываем работу с 64-разрядными системами.
Рисунок 7. Окно создания проекта SharpDevelop
Для корректной работы плагина в проект необходимо добавить минимальный набор ссылок: System, System.Data, System.Windows.Forms и библиотеки Лира "..\Lira Soft\Lira10.12\bin64\FEModel.dll", "..\Lira Soft\Lira10.12\bin64\LiraAPI.dll".
Рисунок 8. SharpDevelop. Дерево проекта
Реализуем в проекте класс TestClass наследованный от интерфейса ILiraAPI, который описан в LiraAPI.dll. Внутри данного класса мы выстраиваем основную логику программы. Далее будет приведен код программы с необходимыми комментариями.
Рисунок 9. SharpDevelop. Рабочее окно проекта
public class ClassStress : ILiraAPI //класс наследованный от ILiraAPI
{
LiraAPI.ReturnCodes LiraAPI.ILiraAPI.ExecuteProgram_Result(IResultLiraAPI result, int nodesCount, int elemCount, List<List<FEModel.Results_Key>> allLoadCases, FEModel.Results_Key loadCase)
{
List<int> elementArray = new List<int>(); //массив индексов узлов или элементов (начиная от 0)
for (int i = 0; i < elemCount; i++) {elementArray.Add(i);}
List<FEModel.Results_Key> pKeyArr = new List<Results_Key>(); //объект, описывающий загружение
pKeyArr.Add(loadCase);
FEModel.e_Results_ColumnType[] pColumnArr = null; //имена столбцов таблицы результатов
string[] pNameColumns = null; //названия столбцов таблицы результатов
System.Data.DataTable allElements = result.get_TableResult(e_Results_TableType.RTT_ELEMENTS, elementArray, pKeyArr, ref pColumnArr, ref pNameColumns);
int count=0; //счетчик отмеченных элементов
foreach (System.Data.DataRow currentElement in allElements.Rows)
{
Рисунок 10. Работа в режиме отладки, просмотр значений переменных
if ((bool)currentElement[16] == true)
{
count++; //если текущий элемент является выбранным, то увеличиваем значение счетчика
}
}
MessageBox.Show("Отмечено элементов: "+count.ToString()); //выводим сообщение
return ReturnCodes.RC_OK;
}
Запускаем проект на выполнение, в результате чего в папке проекта будет скомпилирована библиотека test.dll – пользовательское расширение. Размещаем библиотеку по следующему пути "C:\Users\Имя пользователя\AppData\Roaming\Lira Soft\Lira10.12\Addins\test.dll".
Б) Регистрация пользовательского расширения
На следующем этапе нам необходимо зарегистрировать созданное нами расширение в ЛИРА 10, чтобы его можно было запустить на выполнение.
При первом запуске ЛИРА 10.12 создает файл с глобальными настройками:
[ApplicationData]+"\\Lira Soft\\Lira10.12\\VariableEnvironment_x86.xml"
[ApplicationData]+"\\Lira Soft\\Lira10.12\\VariableEnvironment_x64.xml"
Среди прочих настроек в этом файле есть параметр AddinsPath, содержащий путь к папке, в которой должны находиться xml-файлы регистрации расширений. По умолчанию это [ApplicationData]+"\\Lira Soft\\Lira10.12\\Addins".
На примере нашего расширения файл регистрации расширения ([ApplicationData]+"\\Lira Soft\\Lira10.12\\Addins\\test.xml") должен иметь следующую структуру:
AddIn содержит атрибут Type, который может принимать одно из трех значений: PRIME, PROLONGATION или ALL. Этот атрибут указывает, в каком режиме будет доступна команда этого расширения: в режиме редактирования исходных данных, в режиме анализа результатов расчета или в обоих режимах. В текущей версии доступно только значение PROLONGATION.
AssemblyPath — абсолютный путь к файлу расширения *.dll.
ImagePath — абсолютный путь к файлу, содержащему изображение для иконки в меню (стандартный размер Width=24, Height=20).
CommandName — имя команды в меню ЛИРА 10.12.
Vendor и VendorDescription — информация о разработчике расширения.
При запуске ЛИРА 10.12 добавляет пункт меню для каждого найденного и удачно прочитанного xml-файла регистрации расширений (рис. 11).
Рисунок 11. Запуск пользовательского расширения
Для тестирования разработанного расширения мы выбираем один элемент в расчетной схеме и запускаем наш плагин на вкладке «Расширения». Запуск необходимо выполнять в режиме просмотра результатов. В результате работы получим на экране сообщение о том, что в схеме отмечен 1 элемент.
В данной части заметки мы разработали небольшое приложение, которое может обращаться к базе данных ЛИРА 10 и получать запрашиваемые данные. Таким образом вы можете разрабатывать достаточно сложные приложения, которые автоматизируют вашу проектную деятельность, например при работе с BIM платформами. Перечень доступных таблиц для запроса вы можете изучить в справке программы по данному пути: "C:\Program Files\Lira Soft\Lira10.12\LiraAPI\LiraAPIHelp.pdf". Через данные запросы вы можете получить доступ к конечным элементам, архитектурным элементам, усилиям, напряжениям в элементах, результатам армирования, проверки стальных элементов и многое другое.
Пользовательское расширение для расчета ПКМ:
С учетом полученных выше знаний разработаем расширение, которое будет выполнять проверку прочности конструкции из ПКМ по критериям Хашина. Создаем новый проект библиотеки C# в Visual Studio и добавляем следующий код:
Показать код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LiraAPI;
using FEModel;
using System.Windows.Forms;
namespace hashin
{
public class ClassStress : ILiraAPI
{
LiraAPI.ReturnCodes LiraAPI.ILiraAPI.ExecuteProgram_Result(IResultLiraAPI result, int nodesCount, int elemCount, List> allLoadCases, FEModel.Results_Key loadCase)
{
//если результат фукции вернулся с ошибкой
if (result.Equals(false))
{
MessageBox.Show("IResultLiraAPI return False\n" + ReturnCodes.RC_FAILED.ToString());
return ReturnCodes.RC_FAILED;
}
List elementArray = new List(); //пустой массив с номерами узлов
for (int i = 0; i < elemCount; i++) {elementArray.Add(i);}
List pKeyArr = new List(); //список активных РСН
pKeyArr.Add(loadCase); //выбор текущего загружения/сочетания
FEModel.e_Results_ColumnType[] pColumnArr = null; //массив с именами столбцов
string[] pNameColumns = null; //массив с названием столбцов
System.Data.DataTable allElements = result.get_TableResult(e_Results_TableType.RTT_ELEMENTS,
elementArray, pKeyArr, ref pColumnArr, ref pNameColumns); //получение всех элементов
string appDatafile =
System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData) + "//Lira Soft//Lira10.12//Addins//hashin.csv"; //файл для записи результатов
//очищаем файл с результатами
using (System.IO.StreamWriter file = new System.IO.StreamWriter(appDatafile, false)) {file.Write("");}
foreach (System.Data.DataRow сurrentElement in allElements.Rows) //сортировка элементов
{
float safetyFactor = 0; //начальное значение коэф. использования элемента
if ((bool)сurrentElement[17] == true) //если текущий элемент является фрагментом в рабочем окне
{
Calculate calculate = new Calculate();
float thikness = calculate.Thikness((string)сurrentElement[4]); //вычисляем толщину пластины
int number = (int)сurrentElement[0]; //определяем номер элемента
List numberElement = new List();
numberElement.Add(number-1);
//получаем усилия в элементе
result.get_TableResult(e_Results_TableType.RTT_ELEMENTS_PLATE_RSN_C, numberElement, pKeyArr, ref pColumnArr, ref pNameColumns); //получение усилий для текущего РСН
float Txy; float Nx; float Ny; float Mxy; float Mx; float My;
try {Txy = (float)stressElements.Rows[0][4];} catch {Txy = 0;}
try {Nx = (float)stressElements.Rows[0][1];} catch {Nx = 0;}
try {Ny = (float)stressElements.Rows[0][2];} catch {Ny = 0;}
try {Mxy = (float)stressElements.Rows[0][8];} catch {Mxy = 0;}
try {Mx = (float)stressElements.Rows[0][6];} catch {Mx = 0;}
try {My = (float)stressElements.Rows[0][7];} catch {My = 0;}
float[] stress = calculate.GetStress(thikness, Txy, Nx, Ny, Mxy, Mx, My); //вычисление напряжений по усилиям, Па
float[] ultimateStrength = calculate.GetUltimateStress(); //допускаемые напряжения по результатам испытаний, Па
safetyFactor = calculate.HashinSafetyFactor(stress, ultimateStrength); //вычисление коэф. использования
}
//запись строки с результатом в файл результатов
string str = ((int)сurrentElement[0]).ToString() + ";" + safetyFactor.ToString();
using (System.IO.StreamWriter file = new System.IO.StreamWriter(appDatafile, true))
{
file.WriteLine(str);
}
}
MessageBox.Show("Коэф. использования вычислен!"); //вывод информационного сообщения
return ReturnCodes.RC_OK;
}
public class Calculate //для вспомогательных функций и вычислений
{
public Calculate()
{
}
public float Thikness(string line) //определение толщины пластины, чтение информации о профиле
{
string[] strs = line.Split(new[] {'(',')'}, StringSplitOptions.RemoveEmptyEntries);
float thik = ((float)Convert.ToDouble(strs[1]));
return thik;
}
public float[] GetStress(float t, float Txy, float Nx, float Ny, float Mxy, float Mx, float My) //вычисление напряжений
{
float tauXY1 = Txy + 6 * Mxy / (t*t); //нижний
float tauXY2 = Txy; //средний
float tauXY3 = Txy - 6 * Mxy / (t * t); //верхний
float sigmaY1 = Ny + 6 * My / (t * t); //нижний
float sigmaY2 = Ny; //средний
float sigmaY3 = Ny - 6 * My / (t * t); //верхний
float sigmaX1 = Nx + 6 * Mx / (t * t); //нижний
float sigmaX2 = Nx; //средний
float sigmaX3 = Nx - 6 * Mx / (t * t); //верхний
float[] stress = new float[]{tauXY1,tauXY2,tauXY3,sigmaY1,sigmaY2,sigmaY3,sigmaX1,sigmaX2,sigmaX3};
return stress;
}
public float[] GetUltimateStress() //получение характеристик материала
{
string fileUltimateStress = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData) + "//Lira Soft//Lira10.12//Addins//hashinUltimateStress.csv"; //файл c прочностными параметрами ПКМ (рис. 12)
Рисунок 12. Файл с прочностными характеристиками ПКМ, Па
string[] arrLine = System.IO.File.ReadAllLines(fileUltimateStress, System.Text.Encoding.GetEncoding("windows-1251")); //чтение файла с параметрами прочности, Па
List<float> listStrength = new List<float>(); //лист для хранения информации о прочности
for (int i = 0; i < arrLine.Length; i++)
{
string[] strs; //массив для хранения строки
strs = arrLine[i].Split(new char[] { ';' }); //запись строки в массив
float strength = (float)Convert.ToDouble(strs[1]); //допускаемое напряжение
listStrength.Add(strength);
}
float[] stress = listStrength.ToArray(); //0 strength1+; 1 strength1-; 2 strength2+; 3 strength2-; 4 strength12, Па
return stress;
}
public float HashinSafetyFactor(float[] stress, float[] strength) //коэф. использования по теории Хашина
{
float safetyFactor=0;
//проверка волокна
for (int i = 0; i < 2; i++)
{
if (stress[i+3]>=0)
{
}
else
{
}
}
//проверка матрицы
for (int i = 0; i < 2; i++)
{
if (stress[i + 6] >= 0)
{
}
else
{
}
}
return safetyFactor;
}
public float FiberTensile(float sigma11, float strength1t, float tau12, float strength12) //проверка прочности волокна при растяжении
{
float fiberTensile = (sigma11 / strength1t) * (sigma11 / strength1t) + (tau12 / strength12) * (tau12 / strength12);
return fiberTensile;
}
public float FiberCompression(float sigma11, float strength1c) //проверка прочности волокна при сжатии
{
float fiberCompression = Math.Abs(sigma11 / strength1c);
return fiberCompression;
}
public float MatrixTensile(float sigma22, float strength2t, float tau12, float strength12) //проверка прочности матрицы при растяжении
{
float matrixTensile = (sigma22 / strength2t) * (sigma22 / strength2t) + (tau12 / strength12) * (tau12 / strength12);
return matrixTensile;
}
public float MatrixCompression(float si22, float st2с, float tau12, float st12) //проверка прочности матрицы при сжатии
{
float matrixCompression = Math.Abs(si22/(2*st12)* si22/(2*st12)+(st2с/(2*st12)*st2с/(2*st12)-1)*si22/st2с+tau12/st12*tau12/st12);
return matrixCompression;
}
}
}
Далее компилируем библиотеку dll и регистрируем ее по аналогии с тестовым примером, если все действия выполнены корректно, то в ЛИРА 10 на вкладке расширения появится дополнительная функция. Перейдем в результаты расчета по РСН №1 и запустим расширение (рис.13).
Рисунок 13. Запуск пользовательского расширения
В результате работы программы будет создан файл результатов "C:\Users\User1\AppData\Roaming\Lira Soft\Lira10.12\Addins\hashin.csv", который в каждой строке содержит номер элемента и долю использования по максимальному из критериев Хашина (рис. 14). Данный файл можно открыть для просмотра и анализа в программе Excel.
Рисунок 14. Файл в формате csv, результаты проверки элементов из ПКМ
Вывод результатов расчета:
Если необходимо визуализировать результаты расчета на схеме в ЛИРА 10, которые получены с применением пользовательского расширения и API, то можно воспользоваться возможностями функции «Пользовательские результаты», подробнее о данной функции Вы можете прочитать в разделе 3.9.1 «Руководства пользователя ЛИРА 10» и в заметке по ссылке Расчет каменных конструкций. Использование скриптов пользовательских результатов
Перейдем в специальные результаты и добавим скрипт для вывода результатов из файла csv (рис.15).
Рисунок 15. Окно создания скрипта пользовательских результатов. Скрипт для чтения результатов из файла
Запускаем скрипт командой «Отобразить». В результате работы в окне модели будут выведены все результаты проверки в виде мозаики (рис. 16). Также на мозаике можно отобразить числовые значения полученного коэффициента использования элементов из ПКМ по теории Хашина. Как видим из результатов, что несущая способность элементов резервуара обеспечена.
Рисунок 16. Пользовательские результаты. Мозаика коэф. использования элементов
В данной заметке мы с вами рассмотрели основы создания пользовательских расширений с использованием открытого API ЛИРА 10, в том числе разработали прикладную программу для проверки конструкции из ПКМ.
Данный пример иллюстрирует, как использование API ПК ЛИРА 10.12 может повысить эффективность выполняемых вами задач, решить специфические задачи проверки прочности элементов, решить задачи связки ЛИРА 10 с BIM платформами, электронными таблицами, задачи, связанные с поиском оптимального решения конструкции, определения объемов материалов.
Как вам материал? Задать вопрос или обсудить заметку можно на нашем форуме
Перейти на форум