using Hi.Cbtr;
using Hi.Common;
using Hi.Common.XmlUtils;
using Hi.MachiningSteps;
using Hi.NcMech.Fixtures;
using Hi.NcMech.Workpieces;
using System.Collections.Generic;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
namespace Sample.Common;
///
/// User Configuration.
///
///
/// Sample-owned copy of the per-GUI user configuration, kept so the
/// step-present demo still compiles. Each
/// GUI/APP keeps its own version; the core engine package (HiNc) no longer
/// carries any GUI configuration type.
///
public class UserConfig : IMakeXmlSource
{
///
/// Registers this type's deserializer with the given
/// (or when is
/// null). Idempotent.
///
public static void Reg(XFactory factory = null)
{
factory ??= XFactory.Default;
factory.Generators.TryAdd(XName, (xml, baseDirectory, relFile, progress, res)
=> new UserConfig(xml, baseDirectory));
}
#region XML IO
///
/// Name for XML IO.
///
public static string XName => nameof(UserConfig);
///
/// Initializes a new instance of the class from XML data.
///
/// XML element containing configuration data
/// Base directory for resolving relative paths
public UserConfig(XElement src, string baseDirectory)
{
if (src == null) return;
src.Element(nameof(ShowPhysicsOptions))?.Value?.SelfInvoke(
v => ShowPhysicsOptions = XmlConvert.ToBoolean(v));
src.Element(nameof(LanguageCode))?.Value?.SelfInvoke(v => LanguageCode = v);
src.Element(nameof(EnableFullControl))?.Value?.SelfInvoke(
v => EnableFullControl = XmlConvert.ToBoolean(v));
src.Element(nameof(GraphicCacheLowerLimitMb))?.Value?.SelfInvoke(
v => GraphicCacheLowerLimitMb = XmlConvert.ToDouble(v));
src.Element(nameof(GraphicCacheUpperLimitMb))?.Value?.SelfInvoke(
v => GraphicCacheUpperLimitMb = XmlConvert.ToDouble(v));
src.Element(nameof(GraphicCacheMb))?.Value?.SelfInvoke(
v => GraphicCacheMb = XmlConvert.ToInt64(v));
src.Element(nameof(DisplayedStepPresentKeyList))?.SelfInvoke(ee =>
{
DisplayedStepPresentKeyList = ee.Elements("Item").Select(e => e.Value).ToList();
});
// Load FixtureSetupDisplayeeConfig
src.Element(nameof(FixtureSetupDisplayeeConfig))?.SelfInvoke(e =>
{
FixtureSetupDisplayeeConfig = new FixtureEditorDisplayeeConfig(e);
});
// Load EquipmentWorkpieceSetupDisplayeeConfig
src.Element(nameof(EquipmentWorkpieceSetupDisplayeeConfig))?.SelfInvoke(e =>
{
EquipmentWorkpieceSetupDisplayeeConfig = new WorkpieceEditorDisplayeeConfig(e);
});
// Load PlayerDivConfig
src.Element(nameof(PlayerDivConfig))?.SelfInvoke(e =>
{
PlayerDivConfig = new PlayerDivConfig(e);
});
}
///
public XElement MakeXmlSource(string baseDirectory, string relFile, bool exhibitionOnly)
{
XElement dst = new XElement(XName,
new XElement(nameof(ShowPhysicsOptions), ShowPhysicsOptions),
new XElement(nameof(LanguageCode), LanguageCode),
new XElement(nameof(EnableFullControl), EnableFullControl),
new XElement(nameof(GraphicCacheLowerLimitMb), GraphicCacheLowerLimitMb),
new XElement(nameof(GraphicCacheUpperLimitMb), GraphicCacheUpperLimitMb),
new XElement(nameof(GraphicCacheMb), GraphicCacheMb),
new XElement(nameof(DisplayedStepPresentKeyList),
DisplayedStepPresentKeyList.Select(v => new XElement("Item", v))),
new XElement(nameof(FixtureSetupDisplayeeConfig),
FixtureSetupDisplayeeConfig?.MakeXmlSource(baseDirectory, relFile, exhibitionOnly)),
new XElement(nameof(EquipmentWorkpieceSetupDisplayeeConfig),
EquipmentWorkpieceSetupDisplayeeConfig?.MakeXmlSource(baseDirectory, relFile, exhibitionOnly)),
PlayerDivConfig?.MakeXmlSource(baseDirectory, relFile, exhibitionOnly)
);
return dst;
}
#endregion
///
/// Gets or sets whether to show physics options in the UI.
///
public bool ShowPhysicsOptions { get; set; } = false;
///
/// Gets or sets the language code for the application UI.
///
public string LanguageCode { get; set; } = "en";
///
/// Enable Full control of the application.
/// Eanble System.Diagnostics.Process in GUI Script Command.
/// Not used yet.
///
public bool EnableFullControl { get; set; }
///
/// Gets or sets the lower limit of graphic cache in megabytes.
///
public double GraphicCacheLowerLimitMb { get; set; } = 10;
///
/// Gets or sets the upper limit of graphic cache in megabytes.
///
public double GraphicCacheUpperLimitMb { get; set; } = 1200;
///
/// Gets or sets the graphic cache size in megabytes.
///
public long GraphicCacheMb
{
get => CubeTree.DispCacheMb;
set => CubeTree.DispCacheMb = value;
}
///
/// Step infomation key list to show.
///
public List DisplayedStepPresentKeyList { get; set; } = new List([
nameof(MachiningStep.StepIndex),
nameof(MachiningStep.FileNo), nameof(MachiningStep.LineNo),
nameof(MachiningStep.FilePath),nameof(MachiningStep.EndTimecode),
nameof(MachiningStep.LineText),nameof(MachiningStep.FlagsText),
nameof(MachiningStep.ToolId),
nameof(MachiningStep.SpindleSpeed_rpm),nameof(MachiningStep.Feedrate_mmdmin),
nameof(MachiningStep.Mrr_mm3ds),
nameof(MachiningStep.AvgAbsTorque_Nm),
]);
///
/// Configuration for FixtureSetupDisplayee
///
public FixtureEditorDisplayeeConfig FixtureSetupDisplayeeConfig { get; set; } = new FixtureEditorDisplayeeConfig();
///
/// Configuration for EquipmentWorkpieceSetupDisplayee
///
public WorkpieceEditorDisplayeeConfig EquipmentWorkpieceSetupDisplayeeConfig { get; set; } = new WorkpieceEditorDisplayeeConfig();
///
/// Per-user visibility flags for the Player page's divisions (charts and info panels).
/// Persisted alongside the rest of this .
///
public PlayerDivConfig PlayerDivConfig { get; set; } = new PlayerDivConfig();
///
/// Default constructor
///
public UserConfig() { }
}