using CaeGlobals; using CaeJob; using CaeKnowledge.View; using CaeMesh; using CaeModel; using System; using System.ComponentModel; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; // ReSharper disable InlineTemporaryVariable namespace CPSO.Forms._92_Knowledge { public sealed partial class FrmAnalysisEx : Form { private readonly Controller Self; public FrmAnalysisEx(Controller controller) { InitializeComponent(); Self = controller; dataGridView1.DataSource = new BindingList(); Text = @"切削力仿真"; // 计算任务数 numericUpDown2.Value = 2; } public void PrepareForm() { if (Self.CompletedJobs.Count > 0 && dataGridView1.DataSource is BindingList jobs) { jobs.Clear(); foreach (var vj in Self.CompletedJobs) { jobs.Add(vj); } } } private void FrmAnalysisEx_Load(object sender, EventArgs e) { dataGridView1.AllowUserToAddRows = false; dataGridView1.AllowUserToDeleteRows = false; dataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically; dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; dataGridView1.RowHeadersVisible = false; dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; } private async void btnRun_Click(object sender, EventArgs e) { try { if (Self.ProcessingJobs.Count <= 0) return; int BeginIndex = (int)numericUpDown1.Value; int EndIndex = BeginIndex + (int)numericUpDown2.Value; if (BeginIndex >= EndIndex) throw new CaeException("开始索引小于结束索引!"); Self.Form.SetStateWorking(@"进行切削力分析..."); if (dataGridView1.DataSource is BindingList jobs) { for (int i = BeginIndex; i < EndIndex; ++i) { // 作业基础信息 var processingJob = Self.ProcessingJobs[i]; var jobName = AddTaskAndRun(processingJob, out var stepName, out var surfaceName); var job = Self.GetJob(jobName); if (job != null) { await Task.Run(() => { Self.PrepareAndRunJob(job.Name, false, false); }); jobs.Add(new ViewJob(job) { StepName = stepName, SurfaceName = surfaceName, }); } } foreach (var job in jobs) { Self.CompletedJobs.Add(job); } } Self.Form.SetStateReady(@"进行切削力分析..."); } catch (Exception ex) { ExceptionTools.Show(this, ex); } } private string AddTaskAndRun(ViewProcessingJob processingJob, out string stepName, out string surfaceName) { // 1. 先把所有计算步反激活 var stepList = Self.GetAllSteps().ToList(); stepList.ForEach(x => { Self.ActivateDeactivateStep(x.Name, false); }); // 2. 新建一个计算步并激活 // 复制一分模板计算步 var newStep = Self.GetStep(processingJob.StepName).DeepClone(); newStep.Name = NamedClass.GetNameWithoutLastValue(newStep.Name); newStep.Name = Self.GetStepNames().GetNextNumberedKey(newStep.Name); Self.AddStep(newStep, false); stepName = newStep.Name; // 激活计算步 Self.ActivateDeactivateStep(newStep.Name, true); // 2.1 新建用于施加载荷的曲面Surface // 新建Surface var surface = new FeSurface(Self.Model.Mesh.Surfaces.GetNextNumberedKey("UserSurface")) { CreatedFrom = FeSurfaceCreatedFrom.Selection, // ToDo: 未来修改 FaceIds = processingJob.Base.Faces.Select(x => x.Id).ToArray() }; surfaceName = surface.Name; Self.AddSurface(surface); // 2.2 定义载荷 bool twoD = Self.Model.Properties.ModelSpace.IsTwoD(); bool complex = newStep is SteadyStateDynamicsStep; var loadName = newStep.Loads.GetNextNumberedKey("Load"); double area = surface.Area; if(area <= 0) area = 1.0; double fx = -1.0 * processingJob.Fx / area; double fy = -1.0 * processingJob.Fy / area; double fz = -1.0 * processingJob.Fz / area; var stLoad = new STLoad(loadName, surface.Name, RegionTypeEnum.SurfaceName, fx, fy, fz, twoD, complex, 0); Self.AddLoad(newStep.Name, stLoad); // 3. 新建一个Analysis Job var name = Self.GetJobNames().GetNextNumberedKey("Analysis"); var executable = Self.Settings.Calculix.CalculixExe; // 可执行文件路径 var argument = name; // 参数 var workDirectory = Self.Settings.GetWorkDirectory(); // 工作目录 var job = new AnalysisJob(name, executable, argument, workDirectory); Self.AddJob(job); return job.Name; } } }