refactor: stl->3mf
This commit is contained in:
+17
-17
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user