//MAIN FUNCTION public void Compute(double[,] array, int counterStart, int kForNodes) { //model.stampAngle = array[i, 0]; //model.stampAngle = Math.Round(model.stampAngle); model.stampAngle = model.startAngle; model.blankRadius = array[counterStart, 0]; model.blankRadius = Math.Round(model.blankRadius, 2); model.friction = array[counterStart, 1]; model.friction = Math.Round(model.friction, 2); model.dieRadius = (Math.Tan(model.stampAngle * Math.PI / 180) * 60) + 10; model.dieRadius = Math.Round(model.dieRadius, 1); //объём усеченного конуса (верхний радиус 10, нижний может меняться) 60 - высота усеченного конуса model.dieVolume = (Math.PI * 60 * (Math.Pow(model.dieRadius, 2) + model.dieRadius * 10 + Math.Pow(10, 2))) / 3; #region необходимо для вычесления облоя //3 - радиус скругления, 90 - градус double filletLength = Math.Tan((180 - (((90 + model.stampAngle) / 2) + 90)) * Math.PI / 180) * 3; double upperRadius = model.dieRadius + filletLength + 10; double angle30X = upperRadius - 5; double lowerVolume = Math.Pow((angle30X - 5), 2) * Math.PI * 1; model.dieVolume += lowerVolume; double shave = Math.Pow(angle30X, 2) * Math.PI * 1; shave -= lowerVolume; model.dieVolume = Math.Round(model.dieVolume, 1); #endregion model.blankUpperRadius = model.blankRadius - (Math.Tan(model.stampAngle * Math.PI / 180) * 2); model.blankPosition = (Math.PI * 2 * (Math.Pow(model.blankRadius, 2) + model.blankRadius * (model.blankUpperRadius) + Math.Pow((model.blankUpperRadius), 2))) / 3; model.blankPosition = Math.Round(model.blankPosition, 2); //объем цилиндра, не считая фаску (как будто её нет,а заготовка имеет форму просто цилиндра) double abstractRadiusVolume = Math.PI * Math.Pow(model.blankRadius, 2) * 2; double blankVolume = model.dieVolume + (abstractRadiusVolume - model.blankPosition); //объём зазора между матрицей и площадкой blankVolume += shave; model.blankHeight = blankVolume / (Math.PI * Math.Pow(model.blankRadius, 2)); model.blankHeight = Math.Round(model.blankHeight, 2); double radiusAfterLowerFillet = angle30X - 5; double radiusHeightInStamp; radiusHeightInStamp = 60 * ((radiusAfterLowerFillet - model.blankRadius) / (radiusAfterLowerFillet - 10)); //необходимо для вычесления объёма от пуансона до конца матрицы model.lowerFilletRadius = radiusAfterLowerFillet; if (model.blankRadius > 10) { model.blankPosition = model.blankHeight - radiusHeightInStamp; model.blankPosition = Math.Round(model.blankPosition, 1); model.blankPosition += 5; } else { double tempHeight = model.blankHeight - 60; model.blankPosition = tempHeight * ((model.dieRadius - 10) / (model.dieRadius - 10)); model.blankPosition = Math.Round(model.blankPosition, 1); //допуск +2мм на всякий пожарный случай model.blankPosition += 2; } model.stampDisplacement = model.blankPosition; //оставляем зазор 1мм model.stampDisplacement -= 1; #region Создание общей папки с название радиуса заготовки genReport.folderName = Convert.ToString(model.blankRadius); if (!Directory.Exists(genReport.folderName)) { Directory.CreateDirectory(genReport.folderName); } #endregion string abaqusOutputFolder = Convert.ToString(model.blankRadius) + "r" + Convert.ToString(model.friction) + "f"; file.outputFolder = Path.Combine(genReport.folderName, abaqusOutputFolder); if (!Directory.Exists(file.outputFolder)) { Directory.CreateDirectory(file.outputFolder); } #region Пути для солида file.caeFolder = Path.Combine(Environment.CurrentDirectory, file.outputFolder, add.jobName + ".cae"); file.caeFolder = file.caeFolder.Replace(@"\", "/"); file.stampFolder = Path.Combine(Environment.CurrentDirectory, file.outputFolder, file.stampName); file.stampFolder = file.stampFolder.Replace(@"\", "/"); file.blankFolder = Path.Combine(Environment.CurrentDirectory, file.outputFolder, file.blankName); file.blankFolder = file.blankFolder.Replace(@"\", "/"); file.platformFolder = Path.Combine(Environment.CurrentDirectory, file.outputFolder, file.platformName); file.platformFolder = file.platformFolder.Replace(@"\", "/"); #endregion var solid = new CAD(); solid.UseSolid(file, model); rout.pathIn = "abaqusMacros.py"; rout.workingDirectory = file.outputFolder; rout.pathOut = rout.workingDirectory + @"\abaqusMacros.py"; var change = new Change(); change.Output(rout, model, material, add, file); var abaqus = new CAE(); abaqus.runAbaqus(rout, cmd); var processData = new ProcessData(rout, cmd); processData.Processing(model, file, filesForVolume, genReport); finalReport.AddData(model); genReport.AddFrictionToChart(model); genReport.AddRadiusToChart(model); #region проверка симплекса string fileName = "SimplexNodes"; var str = new StringBuilder(); str.Append(kForNodes); str.Append(";"); str.Append(model.blankRadius); str.Append(";"); str.Append(model.friction); str.Append(";"); str.Append(model.pctOfDieFilling); str.Append(";"); str.Append((model.reactionForceToBlank * Math.Pow(10, -6))); str.Append(";"); str.Append(Environment.NewLine); var fileCreate = new FileCreation(); fileCreate.CreateFile("", fileName, ".csv", str.ToString()); #endregion }