refactor: stl->3mf

This commit is contained in:
hyper
2026-03-15 23:17:16 +08:00
parent 7be206581d
commit 2476659fc6
5 changed files with 464 additions and 52 deletions
+17 -17
View File
@@ -9,7 +9,7 @@ import {
} from "solid-js";
import { resolvePath } from "./utils/path";
import { traceImage, type TracedLayer } from "./utils/image-tracer";
import { generateSTL, type ExtrusionSettings } from "./utils/stl-generator";
import { generate3MF, type ExtrusionSettings } from "./utils/3mf-generator";
import MdTokenViewer from "./md-token-viewer";
export interface TokenProps {
@@ -30,7 +30,7 @@ customElement("md-token", { size: 50, defaultThickness: 2 }, (props, { element }
const [showEditor, setShowEditor] = createSignal(false);
const [layers, setLayers] = createSignal<LayerSettings[]>([]);
const [stlUrl, setStlUrl] = createSignal<string | null>(null);
const [modelUrl, setModelUrl] = createSignal<string | null>(null);
const [isGenerating, setIsGenerating] = createSignal(false);
const [error, setError] = createSignal<string | null>(null);
@@ -91,7 +91,7 @@ customElement("md-token", { size: 50, defaultThickness: 2 }, (props, { element }
}
});
// 生成 STL 模型
// 生成 3MF 模型
const generateModel = async () => {
if (!image()) return;
@@ -114,9 +114,9 @@ customElement("md-token", { size: 50, defaultThickness: 2 }, (props, { element }
})),
};
const stlBlob = await generateSTL(image()!, traceResult()!, settings);
const url = URL.createObjectURL(stlBlob);
setStlUrl(url);
const modelBlob = await generate3MF(image()!, traceResult()!, settings);
const url = URL.createObjectURL(modelBlob);
setModelUrl(url);
} catch (e) {
setError(e instanceof Error ? e.message : "生成模型失败");
} finally {
@@ -138,20 +138,20 @@ customElement("md-token", { size: 50, defaultThickness: 2 }, (props, { element }
);
};
// 下载 STL 文件
const downloadSTL = () => {
const url = stlUrl();
// 下载 3MF 文件
const downloadModel = () => {
const url = modelUrl();
if (!url) return;
const a = document.createElement("a");
a.href = url;
a.download = `token-${Date.now()}.stl`;
a.download = `token-${Date.now()}.3mf`;
a.click();
};
// 清理 URL
onCleanup(() => {
const url = stlUrl();
const url = modelUrl();
if (url) {
URL.revokeObjectURL(url);
}
@@ -177,13 +177,13 @@ customElement("md-token", { size: 50, defaultThickness: 2 }, (props, { element }
</div>
</div>
{/* STL 预览 (如果有) */}
<Show when={stlUrl()}>
{/* 3D 模型预览 */}
<Show when={modelUrl()}>
<div class="flex-1 min-w-[200px]">
<h4 class="text-sm font-semibold mb-2 text-gray-700">
3D
</h4>
<MdTokenViewer stlUrl={stlUrl()}/>
<MdTokenViewer stlUrl={modelUrl()}/>
</div>
</Show>
</div>
@@ -286,12 +286,12 @@ customElement("md-token", { size: 50, defaultThickness: 2 }, (props, { element }
>
{isGenerating() ? "生成中..." : "🔄 生成 3D 模型"}
</button>
<Show when={stlUrl()}>
<Show when={modelUrl()}>
<button
onClick={downloadSTL}
onClick={downloadModel}
class="bg-green-600 hover:bg-green-700 text-white px-4 py-2 rounded font-medium transition-colors"
>
📥 STL
📥 3MF
</button>
</Show>
</div>