182 lines
5.8 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|