STLアスキーファイルエクスポートの処理内容を変更しました。
以前の処理は複雑でコメント記載がないと何をやっているか理解できなかったのでリファクタリングを行いました。時間がなかったのは言い訳なのですが、その穴埋めを行いました。
以下ソースコードです。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using RedRing.Framework.Geometry.Double.Geometry3D;
namespace RedRing.Framework.IO
{
/// <summary>
/// STLファイルのIO処理を行うクラス
/// </summary>
public partial class STLFile
{
/// <summary>
/// テキスト(ASCII)形式でのSTLファイル書き込み
/// </summary>
/// <param name="triangleMeshes">三角形メッシュ</param>
/// <param name="filePath">ファイルパス</param>
/// <returns></returns>
public static async Task WriteAsciiAsync(IEnumerable<TriangleMesh> triangleMeshes, string filePath)
{
// filePath が入っていない場合はエラーとする
if (filePath == null)
throw new ArgumentNullException(nameof(filePath));
// ファセットデータが無い場合はエラー
if (triangleMeshes == null)
throw new ArgumentNullException(nameof(triangleMeshes));
try
{
// 上書きの書き込みモードでファイルを開く
using (var writer = new StreamWriter(filePath, false, Encoding.ASCII))
{
await Task.Run(() =>
{
var assembly = Assembly.GetExecutingAssembly();
var name = assembly.GetName().Name.Split('.').FirstOrDefault();
// ヘッダ書き込み
string header = name +' ' + assembly.GetName().Version;
writer.WriteLine("solid " + header);
// 全ファセットデータ書き込み
foreach (var triangleMesh in triangleMeshes)
{
int ii = 0;
foreach (var vertexIndces in triangleMesh.VertexIndices)
{
writer.WriteLine(" facet normal " + ToText(triangleMesh.VertexNormals.ElementAtOrDefault(ii).X, triangleMesh.VertexNormals.ElementAtOrDefault(ii).Y, triangleMesh.VertexNormals.ElementAtOrDefault(ii).Z));
writer.WriteLine(" outer loop");
writer.WriteLine(" vertex " + ToText(triangleMesh.Vertices.ElementAtOrDefault(vertexIndces.Item1).X, triangleMesh.Vertices.ElementAt(vertexIndces.Item1).Y, triangleMesh.Vertices.ElementAt(vertexIndces.Item1).Z));
writer.WriteLine(" vertex " + ToText(triangleMesh.Vertices.ElementAtOrDefault(vertexIndces.Item2).X, triangleMesh.Vertices.ElementAt(vertexIndces.Item2).Y, triangleMesh.Vertices.ElementAt(vertexIndces.Item2).Z));
writer.WriteLine(" vertex " + ToText(triangleMesh.Vertices.ElementAtOrDefault(vertexIndces.Item3).X, triangleMesh.Vertices.ElementAt(vertexIndces.Item3).Y, triangleMesh.Vertices.ElementAt(vertexIndces.Item3).Z));
writer.WriteLine(" endloop");
writer.WriteLine(" endfacet");
ii++;
}
// フッタ書き込み
string footer = string.Empty;
writer.WriteLine("endsolid " + footer);
// 頂点データをテキストに変換
string ToText(double x, double y, double z)
{
return
x.ToString("e") + " " +
y.ToString("e") + " " +
z.ToString("e");
}
}
});
}
}
catch (Exception)
{
throw new Exception();
}
}
}
}
ただ単純にファセットの塊を繰り返して書き込むので一応処理中に記載しているコメントも不要です。
多国語対応を考えるとコメントがあるのが違和感あるというのが昨今の見解らしい。
勿論、GitHubで更新しました。
ので詳細はそちらもご覧ください。
https://github.com/redring1979/RedRing
配布ソフトについてもこの反映をしたものに差し替えております。