Files
wg_cpso/CPSO/Forms/92_Knowledge/FrmAnalysisEx.cs
2026-03-25 18:20:24 +08:00

182 lines
5.8 KiB
C#

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<ViewJob>();
Text = @"切削力仿真";
// 计算任务数
numericUpDown2.Value = 2;
}
public void PrepareForm()
{
if (Self.CompletedJobs.Count > 0 && dataGridView1.DataSource is BindingList<ViewJob> 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<ViewJob> 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;
}
}
}