初始化项目:规划文档 + FFU 洁净室流场实时仿真 Demo
- 规划文档 01-07:愿景 / 架构 / 路线图 / 数据与AI / 风险 / 参考 / FFU Demo - 演示图:系统架构、数据流水线、里程碑路线图(SVG + PNG) - FFU Demo:D2Q9 LBM 高保真(360x270, 76s)+ 粗网格快速代理(120x90, 7.3s, 16-27x 加速) - 趋势验证:速度 r=0.95 / 粒子 r=0.83 / 温度 r=0.68 - 工具链:仿真脚本、快速代理、图表生成器、SVG->PNG 转换
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
/**
|
||||
* SVG -> PNG 批量转换 (resvg, 支持中文系统字体)
|
||||
*
|
||||
* npm install # 首次安装依赖
|
||||
* node tools/svg2png.js # 转换 docs/assets 下全部 svg
|
||||
* node tools/svg2png.js foo.svg # 只转换指定文件
|
||||
*/
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
|
||||
let Resvg;
|
||||
try {
|
||||
({ Resvg } = require("@resvg/resvg-js"));
|
||||
} catch (e) {
|
||||
console.error("缺少依赖 @resvg/resvg-js,请先执行: npm install");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const dir = path.join(__dirname, "..", "docs", "assets");
|
||||
const args = process.argv.slice(2);
|
||||
const files = args.length
|
||||
? args
|
||||
: fs.readdirSync(dir).filter((f) => f.toLowerCase().endsWith(".svg"));
|
||||
|
||||
let ok = 0;
|
||||
for (const f of files) {
|
||||
const src = path.join(dir, f);
|
||||
const dst = src.replace(/\.svg$/i, ".png");
|
||||
const svg = fs.readFileSync(src, "utf8");
|
||||
const r = new Resvg(svg, {
|
||||
fitTo: { mode: "zoom", value: 2 },
|
||||
font: { loadSystemFonts: true },
|
||||
background: "#0d1117",
|
||||
});
|
||||
fs.writeFileSync(dst, r.render().asPng());
|
||||
console.log(` ${f} -> ${path.basename(dst)}`);
|
||||
ok++;
|
||||
}
|
||||
console.log(`converted ${ok} file(s)`);
|
||||
Reference in New Issue
Block a user