Files
VirtualChemistry.Demo/Scenes/MainControlPanel.cs
2024-06-27 22:58:30 +08:00

154 lines
4.0 KiB
C#

using Godot;
using System.Linq;
using VirtualChemistry.Chemistry.Compounds.Implements;
using VirtualChemistry.Chemistry.Mixtures.Implements;
public partial class MainControlPanel : HBoxContainer
{
private HSlider EnvTemperature { get; set; }
private HSlider ContainerVolume { get; set; }
private HomogeneousMixture SelectedMixture { get; set; }
private Label Density { get; set; }
private Label Volume { get; set; }
private Label HeatConductivity { get; set; }
private Label Amount { get; set; }
private Label Temperature { get; set; }
private Label FreeVolume { get; set; }
private Label Stiffness { get; set; }
private Tree Compounds { get; set; }
public override void _Ready()
{
EnvTemperature = GetNode<HSlider>("V1/EnvTemperature");
ContainerVolume = GetNode<HSlider>("V1/ContainerVolume");
Density = GetNode<Label>("V2/HDensity/Density");
Volume = GetNode<Label>("V2/HVolume/Volume");
HeatConductivity = GetNode<Label>("V2/HHeatConductivity/HeatConductivity");
Amount = GetNode<Label>("V2/HAmount/Amount");
Temperature = GetNode<Label>("V2/HTemperature/Temperature");
FreeVolume = GetNode<Label>("V2/HFreeVolume/FreeVolume");
Stiffness = GetNode<Label>("V2/HStiffnesss/Stiffness");
Compounds = GetNode<Tree>("V3/Compounds");
GlobalScene.MainControlPanel = this;
}
public void Update(HomogeneousMixture mixture)
{
SelectedMixture = mixture;
Update();
}
public void Update()
{
if (SelectedMixture == HomogeneousMixture.Null)
return;
Density.Text = $"{SelectedMixture.Density}";
Volume.Text = $"{SelectedMixture.Volume}";
HeatConductivity.Text = $"{SelectedMixture.HeatConductivity.Get}";
Amount.Text = $"{SelectedMixture.Amount}";
Temperature.Text = $"{SelectedMixture.Temperature}";
FreeVolume.Text = $"{SelectedMixture.FreeVolume}";
Stiffness.Text = $"{SelectedMixture.CompressionStiffness}";
BuildTree();
}
public void BuildAllTree()
{
Compounds.Clear();
TreeItem root = Compounds.CreateItem();
root.SetText(0, $"Mixtures({GlobalScene.Flask.Content.Layers.Count}): ");
root.SetMeta("isoExp", GlobalScene.Flask.Content.Dump());
int i = 1;
foreach (HomogeneousMixture h in GlobalScene.Flask.Content.LayerOrder)
{
TreeItem sRoot = Compounds.CreateItem(root);
sRoot.SetText(0,$"Mixture{i} Amt{h.Amount}");
sRoot.SetMeta("isoExp", h.Dump());
foreach (var group in h.Compounds.GroupBy(x => x.Expression))
{
TreeItem t = Compounds.CreateItem(sRoot);
t.SetText(0, group.Key);
t.SetSelectable(0, false);
int j = 1;
foreach (Compound c in group)
{
TreeItem x = Compounds.CreateItem(t);
x.SetText(0, $"{j}th isomer");
x.SetMeta("isoExp", c.IsoRepresentation);
j++;
}
i++;
}
}
}
private void BuildTree()
{
Compounds.Clear();
var groups = SelectedMixture.Compounds.GroupBy(x => x.Expression);
TreeItem root = Compounds.CreateItem(null);
root.SetText(0, "Compounds: ");
foreach (var group in groups)
{
TreeItem t = Compounds.CreateItem(root);
t.SetText(0, group.Key);
t.SetSelectable(0, false);
int i = 1;
foreach (Compound c in group)
{
TreeItem x = Compounds.CreateItem(t);
x.SetText(0, $"{i}th isomer");
x.SetMeta("isoExp", c.IsoRepresentation);
}
}
}
private void IsomerSelectedHandler()
{
GlobalScene.Demo.FullRepr.Text = Compounds
.GetSelected()
.GetMeta("isoExp")
.AsString();
}
private void OneStep()
{
GlobalScene.Flask.Content.OneStep();
GlobalScene.Flask.Update();
}
private void RemoveTop()
{
GlobalScene.Flask.Content.RemoveTop();
GlobalScene.Flask.Update();
}
private void RemoveBottom()
{
GlobalScene.Flask.Content.RemoveBottom();
GlobalScene.Flask.Update();
}
private void SetTemperature(float temp)
{
GlobalScene.Flask.EnvironmentTemperature = temp;
}
private void SetVolume(float vol)
{
GlobalScene.Flask.ContainerVolume = vol;
GlobalScene.Flask.Update();
}
private void SetElasticContainer(bool on)
{
GlobalScene.ElasticContainer = on;
if (on)
ContainerVolume.Editable = false;
else
ContainerVolume.Editable = true;
}
}