前端也能玩转 AutoCAD?Vue 3 实现浏览器直接打开 DWG/DXF 文件

IT 文章1个月前发布 小编
25 0 0

以前做项目,碰到 .dwg.dxf 文件,第一反应都是:“得用 AutoCAD 打开” 或者 “让后端去解析吧”。毕竟这类文件结构复杂,前端直接处理听起来有点不现实。

但现在,这个局面被打破了。

最近我搞了个小东西叫 MlCadViewer,用 Vue 3 写的,可以直接在浏览器里加载、查看,甚至编辑 DWG 和 DXF 文件——完全不需要后端参与,文件也不用上传,全在本地跑。

ad

程序员导航

优网导航旗下整合全网优质开发资源,一站式IT编程学习与工具大全网站

🎯 在线体验点这里试试
📘 文档地址API Docs


这玩意儿到底是什么?

简单说,MlCadViewer 是一个基于 Vue 3 的 CAD 查看组件。它能在浏览器里原生解析 AutoCAD 文件,支持缩放、平移、图层管理、命令行操作,UI 风格也尽量贴近 AutoCAD,上手基本没门槛。前端也能玩转 AutoCAD?Vue 3 实现浏览器直接打开 DWG/DXF 文件

而且它自带渲染引擎、状态管理、多语言和主题切换,集成起来特别简单,一句话就能用。


主要特点

  • 不用后端:解析、渲染全在浏览器完成
  • 性能不错:大图纸也能保持 60 帧以上
  • 🎛️ UI 可配:工具栏、命令行、坐标显示这些都能关
  • 🔒 文件安全:全程不上传,隐私有保障

怎么用?三步搞定

1. 安装

npm install @mlightcad/cad-viewer

2. 引入并使用

<template>
  <!-- 直接丢一个组件进去,指定文件地址就行 -->
  <MlCadViewer canvas-id="canvas" locale="zh" url="example.dwg" />
</template>

<script setup lang="ts">
// 引入组件
import { MlCadViewer } from '@mlightcad/cad-viewer'
</script>

就这么简单。更多例子可以看这个仓库:cad-viewer-example

ad

AI 工具导航

优网导航旗下AI工具导航,精选全球千款优质 AI 工具集


能不能自定义界面?

当然可以。组件提供了全局配置,比如你想关掉命令行或者工具栏:

import { AcApSettingManager } from '@mlightcad/cad-simple-viewer'

// 关掉命令行
AcApSettingManager.instance.isShowCommandLine = false

// 或者关掉工具栏
// AcApSettingManager.instance.isShowToolbar = false

你想怎么搭界面,基本都能实现。


都有哪些功能?

  • 文件操作:打开、保存(后续支持)
  • 视图控制:缩放、平移、重置
  • 图层管理:控制显示/隐藏
  • 命令行:支持 AutoCAD 风格命令输入
  • 状态栏:实时显示坐标、缩放比例
  • 支持拖拽上传文件
  • 中英文切换
  • 暗黑/明亮主题

操作方式

电脑上怎么用?

  • 选中图形:左键点击
  • 缩放:滚动鼠标滚轮
  • 移动视图:按住中键拖动

手机或平板?

  • 选中:手指点一下
  • 缩放:双指捏合或张开
  • 移动:双指拖动

操作逻辑和 AutoCAD 几乎一样,老用户基本不用适应。


背后是怎么实现的?

整个项目分了几层,结构还算清晰。

模型层:解析文件

  • @mlightcad/data-model 定义统一的数据结构
  • libredwg-converter 处理 DWG 文件
  • dxf-json 解析 DXF
  • 几何计算靠 geometry-engine,支持各种曲线、矩阵运算

说实话,开源的 DWG 解析工具都不太完善。我也是基于一些开源代码自己魔改的。要是谁手里有 ODA(Open Design Alliance)的源码,欢迎联系我,搞个更强的版本。


渲染层:画出来

  • 用 Three.js 做 WebGL 渲染(three-renderer
  • 也支持导出 SVG(svg-renderer
  • 统一接口,方便以后扩展

视图层:交互逻辑

  • cad-simple-viewer 负责核心逻辑,不带 UI
  • cad-viewer 在它基础上套了个 Vue 3 的壳子,加上菜单、工具栏这些,变成一个现成可用的组件

渲染难点怎么解决?

大图纸卡不卡?

关键在于减少 GPU 的绘制调用(Draw Call)。Three.js 有个 BatchedMesh 可以合批,但它不支持点和线。所以我照着它的思路,自己写了个支持点、线、面合并的批处理机制,性能提升明显。

ad

免费在线工具导航

优网导航旗下整合全网优质免费、免注册的在线工具导航大全


文字怎么还原 AutoCAD 的样子?

AutoCAD 用的是 MText 和 SHX 字体(一种用线条画的字体,渲染快)。

我的做法是:

  1. 写了个 mtext-parser 来解析富文本
  2. shx-parser 处理 SHX 字体文件
  3. mtext-renderer 把文字画出来
  4. 中文字体文件大,解析慢?那就缓存到 IndexedDB,下次打开就快了

顺便还做了个富文本编辑器 mtext-editor,调试起来方便多了。这玩意儿目前开源圈还不多见,有需要的可以拿去用。


线型和填充呢?

这部分用了 Three.js 的 Shader 来实现,比如虚线、点划线、填充图案。

不过目前还有点限制:线型里带文字的暂时还不支持,后面会逐步补上。


最后说两句

MlCadViewer 还在持续迭代中,目标是做一个真正能在生产环境用的、纯前端的 CAD 查看方案。

如果你感兴趣,欢迎去看看代码,或者提 Issue。要是遇到 Bug,最好能附个测试文件,方便我复现。

📚 项目地址:GitHub – cad-viewer

 

© 版权声明

相关文章

暂无评论

暂无评论...