增加版本转换接口

This commit is contained in:
ww-rm
2025-03-18 12:15:07 +08:00
parent 58071e1de1
commit 4d68b48367
5 changed files with 81 additions and 49 deletions

View File

@@ -37,7 +37,7 @@
label1 = new Label(); label1 = new Label();
label4 = new Label(); label4 = new Label();
label3 = new Label(); label3 = new Label();
comboBox_Version = new ComboBox(); comboBox_SourceVersion = new ComboBox();
tableLayoutPanel2 = new TableLayoutPanel(); tableLayoutPanel2 = new TableLayoutPanel();
button_Ok = new Button(); button_Ok = new Button();
button_Cancel = new Button(); button_Cancel = new Button();
@@ -75,7 +75,7 @@
tableLayoutPanel1.Controls.Add(label1, 0, 4); tableLayoutPanel1.Controls.Add(label1, 0, 4);
tableLayoutPanel1.Controls.Add(label4, 0, 0); tableLayoutPanel1.Controls.Add(label4, 0, 0);
tableLayoutPanel1.Controls.Add(label3, 0, 3); tableLayoutPanel1.Controls.Add(label3, 0, 3);
tableLayoutPanel1.Controls.Add(comboBox_Version, 1, 3); tableLayoutPanel1.Controls.Add(comboBox_SourceVersion, 1, 3);
tableLayoutPanel1.Controls.Add(tableLayoutPanel2, 0, 6); tableLayoutPanel1.Controls.Add(tableLayoutPanel2, 0, 6);
tableLayoutPanel1.Controls.Add(listBox_FilePath, 0, 2); tableLayoutPanel1.Controls.Add(listBox_FilePath, 0, 2);
tableLayoutPanel1.Controls.Add(button_SelectSkel, 0, 1); tableLayoutPanel1.Controls.Add(button_SelectSkel, 0, 1);
@@ -166,14 +166,14 @@
// //
// comboBox_Version // comboBox_Version
// //
comboBox_Version.Anchor = AnchorStyles.Left; comboBox_SourceVersion.Anchor = AnchorStyles.Left;
comboBox_Version.DropDownStyle = ComboBoxStyle.DropDownList; comboBox_SourceVersion.DropDownStyle = ComboBoxStyle.DropDownList;
comboBox_Version.FormattingEnabled = true; comboBox_SourceVersion.FormattingEnabled = true;
comboBox_Version.Location = new Point(146, 303); comboBox_SourceVersion.Location = new Point(146, 303);
comboBox_Version.Name = "comboBox_Version"; comboBox_SourceVersion.Name = "comboBox_Version";
comboBox_Version.Size = new Size(182, 32); comboBox_SourceVersion.Size = new Size(182, 32);
comboBox_Version.Sorted = true; comboBox_SourceVersion.Sorted = true;
comboBox_Version.TabIndex = 13; comboBox_SourceVersion.TabIndex = 13;
// //
// tableLayoutPanel2 // tableLayoutPanel2
// //
@@ -338,7 +338,7 @@
private TableLayoutPanel tableLayoutPanel1; private TableLayoutPanel tableLayoutPanel1;
private Label label4; private Label label4;
private Label label3; private Label label3;
private ComboBox comboBox_Version; private ComboBox comboBox_SourceVersion;
private TableLayoutPanel tableLayoutPanel2; private TableLayoutPanel tableLayoutPanel2;
private Button button_Ok; private Button button_Ok;
private Button button_Cancel; private Button button_Cancel;

View File

@@ -14,16 +14,22 @@ namespace SpineViewer.Dialogs
public partial class ConvertFileFormatDialog : Form public partial class ConvertFileFormatDialog : Form
{ {
public string[] SkelPaths { get; private set; } public string[] SkelPaths { get; private set; }
public Spine.Version Version { get; private set; } public Spine.Version SourceVersion { get; private set; }
public bool ConvertToJson { get; private set; } public Spine.Version TargetVersion { get; private set; }
public bool JsonSource { get; private set; }
public bool JsonTarget { get; private set; }
public ConvertFileFormatDialog() public ConvertFileFormatDialog()
{ {
InitializeComponent(); InitializeComponent();
comboBox_Version.DataSource = VersionHelper.Versions.ToList(); comboBox_SourceVersion.DataSource = VersionHelper.Versions.ToList();
comboBox_Version.DisplayMember = "Value"; comboBox_SourceVersion.DisplayMember = "Value";
comboBox_Version.ValueMember = "Key"; comboBox_SourceVersion.ValueMember = "Key";
comboBox_Version.SelectedValue = Spine.Version.V38; comboBox_SourceVersion.SelectedValue = Spine.Version.V38;
//comboBox_TargetVersion.DataSource = VersionHelper.Versions.ToList();
//comboBox_TargetVersion.DisplayMember = "Value";
//comboBox_TargetVersion.ValueMember = "Key";
//comboBox_TargetVersion.SelectedValue = Spine.Version.V38;
} }
private void ConvertFileFormatDialog_Load(object sender, EventArgs e) private void ConvertFileFormatDialog_Load(object sender, EventArgs e)
@@ -44,7 +50,10 @@ namespace SpineViewer.Dialogs
private void button_Ok_Click(object sender, EventArgs e) private void button_Ok_Click(object sender, EventArgs e)
{ {
var version = (Spine.Version)comboBox_Version.SelectedValue; var sourceVersion = (Spine.Version)comboBox_SourceVersion.SelectedValue;
var targetVersion = (Spine.Version)comboBox_SourceVersion.SelectedValue; // TODO: 增加目标版本
var jsonSource = radioButton_JsonSource.Checked;
var jsonTarget = radioButton_JsonTarget.Checked;
if (listBox_FilePath.Items.Count <= 0) if (listBox_FilePath.Items.Count <= 0)
{ {
@@ -61,15 +70,29 @@ namespace SpineViewer.Dialogs
} }
} }
if (!SkeletonConverter.ImplementedVersions.Contains(version)) if (!SkeletonConverter.ImplementedVersions.Contains(sourceVersion))
{ {
MessageBox.Show($"{version.String()} 版本尚未实现(咕咕咕~", "错误信息", MessageBoxButtons.OK, MessageBoxIcon.Information); MessageBox.Show($"{sourceVersion.String()} 版本尚未实现(咕咕咕~", "错误信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
if (!SkeletonConverter.ImplementedVersions.Contains(targetVersion))
{
MessageBox.Show($"{targetVersion.String()} 版本尚未实现(咕咕咕~", "错误信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
if (jsonSource == jsonTarget && sourceVersion == targetVersion)
{
MessageBox.Show($"不需要转换相同的格式和版本", "错误信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
return; return;
} }
SkelPaths = listBox_FilePath.Items.Cast<string>().ToArray(); SkelPaths = listBox_FilePath.Items.Cast<string>().ToArray();
Version = version; SourceVersion = sourceVersion;
ConvertToJson = radioButton_BinarySource.Checked; TargetVersion = targetVersion;
JsonSource = jsonSource;
JsonTarget = jsonTarget;
DialogResult = DialogResult.OK; DialogResult = DialogResult.OK;
} }

View File

@@ -175,15 +175,26 @@ namespace SpineViewer
var worker = sender as BackgroundWorker; var worker = sender as BackgroundWorker;
var arguments = e.Argument as Dialogs.ConvertFileFormatDialog; var arguments = e.Argument as Dialogs.ConvertFileFormatDialog;
var skelPaths = arguments.SkelPaths; var skelPaths = arguments.SkelPaths;
var version = arguments.Version; var srcVersion = arguments.SourceVersion;
var convertToJson = arguments.ConvertToJson; var tgtVersion = arguments.TargetVersion;
var newSuffix = convertToJson ? ".json" : ".skel"; var jsonSource = arguments.JsonSource;
var jsonTarget = arguments.JsonTarget;
var newSuffix = jsonTarget ? ".json" : ".skel";
if (jsonTarget == jsonSource)
{
if (tgtVersion == srcVersion)
return;
else
newSuffix += $".{tgtVersion.ToString().ToLower()}"; // TODO: 仅转换版本的情况下考虑文件覆盖问题
}
int totalCount = skelPaths.Length; int totalCount = skelPaths.Length;
int success = 0; int success = 0;
int error = 0; int error = 0;
SkeletonConverter cvter = SkeletonConverter.New(version); SkeletonConverter srcCvter = SkeletonConverter.New(srcVersion);
SkeletonConverter tgtCvter = tgtVersion == srcVersion ? srcCvter : SkeletonConverter.New(tgtVersion);
worker.ReportProgress(0, $"已处理 0/{totalCount}"); worker.ReportProgress(0, $"已处理 0/{totalCount}");
for (int i = 0; i < totalCount; i++) for (int i = 0; i < totalCount; i++)
@@ -199,10 +210,9 @@ namespace SpineViewer
try try
{ {
if (convertToJson) var root = jsonSource ? srcCvter.ReadJson(skelPath) : srcCvter.ReadBinary(skelPath);
cvter.BinaryToJson(skelPath, newPath); if (tgtVersion != srcVersion) root = srcCvter.ToVersion(root, tgtVersion);
else if (jsonTarget) tgtCvter.WriteJson(root, newPath); else tgtCvter.WriteBinary(root, newPath);
cvter.JsonToBinary(skelPath, newPath);
success++; success++;
} }
catch (Exception ex) catch (Exception ex)

View File

@@ -19,7 +19,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
private readonly List<JsonObject> idx2event = []; private readonly List<JsonObject> idx2event = [];
protected override JsonObject ReadBinary(string binPath) public override JsonObject ReadBinary(string binPath)
{ {
var root = new JsonObject(); var root = new JsonObject();
using var input = File.OpenRead(binPath); using var input = File.OpenRead(binPath);
@@ -809,7 +809,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
private readonly Dictionary<string, int> path2idx = []; private readonly Dictionary<string, int> path2idx = [];
private readonly Dictionary<string, int> event2idx = []; private readonly Dictionary<string, int> event2idx = [];
protected override void WriteBinary(JsonObject root, string binPath, bool nonessential = false) public override void WriteBinary(JsonObject root, string binPath, bool nonessential = false)
{ {
this.nonessential = nonessential; this.nonessential = nonessential;
this.root = root; this.root = root;
@@ -902,6 +902,16 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
} }
public override JsonObject ToVersion(JsonObject root, Version version)
{
root = version switch
{
Version.V38 => root.DeepClone().AsObject(),
_ => throw new NotImplementedException(),
};
return root;
}
//public void WriteFloatArray(float[] array) //public void WriteFloatArray(float[] array)
//{ //{
// foreach (var i in array) // foreach (var i in array)

View File

@@ -82,17 +82,17 @@ namespace SpineViewer.Spine
/// <summary> /// <summary>
/// 读取二进制骨骼文件并构造 Json 对象 /// 读取二进制骨骼文件并构造 Json 对象
/// </summary> /// </summary>
protected abstract JsonObject ReadBinary(string binPath); public abstract JsonObject ReadBinary(string binPath);
/// <summary> /// <summary>
/// 将 Json 对象写入二进制骨骼文件 /// 将 Json 对象写入二进制骨骼文件
/// </summary> /// </summary>
protected abstract void WriteBinary(JsonObject root, string binPath, bool nonessential = false); public abstract void WriteBinary(JsonObject root, string binPath, bool nonessential = false);
/// <summary> /// <summary>
/// 读取 Json 对象 /// 读取 Json 对象
/// </summary> /// </summary>
private JsonObject ReadJson(string jsonPath) public JsonObject ReadJson(string jsonPath)
{ {
using var input = File.OpenRead(jsonPath); using var input = File.OpenRead(jsonPath);
if (JsonNode.Parse(input) is JsonObject root) if (JsonNode.Parse(input) is JsonObject root)
@@ -104,7 +104,7 @@ namespace SpineViewer.Spine
/// <summary> /// <summary>
/// 写入 Json 对象 /// 写入 Json 对象
/// </summary> /// </summary>
private void WriteJson(JsonObject root, string jsonPath) public void WriteJson(JsonObject root, string jsonPath)
{ {
using var output = File.Create(jsonPath); using var output = File.Create(jsonPath);
using var writer = new Utf8JsonWriter(output, jsonWriterOptions); using var writer = new Utf8JsonWriter(output, jsonWriterOptions);
@@ -112,20 +112,9 @@ namespace SpineViewer.Spine
} }
/// <summary> /// <summary>
/// 二进制转 Json 格式 /// 转换到目标版本
/// </summary> /// </summary>
public void BinaryToJson(string binPath, string jsonPath) public abstract JsonObject ToVersion(JsonObject root, Version version);
{
WriteJson(ReadBinary(binPath), jsonPath);
}
/// <summary>
/// Json 转二进制格式
/// </summary>
public void JsonToBinary(string jsonPath, string binPath)
{
WriteBinary(ReadJson(jsonPath), binPath);
}
protected class SkeletonReader protected class SkeletonReader
{ {