当前位置: 首页 > news >正文

cad文件在线查看

项目地址:YQisme/cad_view

我的主页:Ean7的小站


基于ezdxf解析 AutoCAD DXF 图纸,FastAPI提供几何 JSON 数据,Vue 3 + Canvas 2D在浏览器中渲染,并通过眼睛图标控制图层与块的显示/隐藏。

适用于建筑、机电、弱电等 CAD 图纸的快速预览与图层筛选,无需安装 AutoCAD;在 CAD 中导出 DXF 后放入dxf/目录即可使用。

应用场景

场景说明
机电 / 弱电审图打开会所、楼宇等强弱电、给排水施工图,按图层单独显示配电、照明、网络、水位等系统,快速核对走向与点位,无需在 AutoCAD 中反复开关图层。
装修与土建配合预览餐厅、商铺等装修施工图,隐藏结构或机电图层,只保留天花、地面、家具布置,便于设计师与施工方对齐界面与尺寸。
现场交底与巡检将 DXF 部署在内网或笔记本上,现场用浏览器缩放、平移查看细部;不依赖 CAD 授权,适合项目部、监理、甲方临时查阅。
多方协作沟通导出 DXF 后发给无 AutoCAD 的同事或外包单位,通过图层 / 块开关说明「只看这一块」「这一层先别画」,减少截图来回与版本误解。
历史图纸归档把历年 DWG 批量转为 DXF 存入dxf/,统一用本工具检索、预览;二次打开命中缓存,大图纸重复查阅更快。
数字孪生 / 智慧楼宇将建筑、机电 DXF 作为数字孪生平台的二维底图或孪生视图:按图层区分强弱电、暖通、给排水、消防等系统,与监控大屏、BIM 模型切片、IoT 设备点位对照,核对管线走向与机房/井道位置;浏览器轻量预览,适合运维、数据中台团队在不部署重型三维引擎时快速查阅与交底。
BIM 协同与交付Revit、ArchiCAD、Tekla、广联达等 BIM 工具导出平面、剖面、系统图 DXF,用于设计交圈、施工深化与竣工图比对;按专业图层开关审图,便于建筑/结构/机电多专业叠图核对,降低对 Revit、Navisworks 等客户端与许可证的依赖;也可作为 IFC 全模浏览前的二维快速验图环节。
BIM + 孪生数据挂接以 DXF 图层、块名作为语义索引(如配电柜块、风机图层),与 BIM 构件 ID、孪生体编码、传感器台账关联;现场或大屏侧按图层筛选定位,辅助「图—模—数」一致校验与运维工单定位,无需每次打开完整 BIM 套件。

典型工作流:在 CAD / BIM 中导出 DXF(或上传 DWG 自动转换)→ 放入dxf/→ 启动本查看器 → 按任务隐藏无关图层 / 块 → 缩放定位到关心区域 → 与孪生大屏、BIM 交付包或截图一并用于交底与归档。

效果展示

启动前后端后,在浏览器中可完成:

  • 左侧切换 DXF 文件、按图层/块显示或隐藏、搜索与批量操作
  • 右侧 Canvas 预览:滚轮缩放、拖拽平移、「适应窗口」复位
  • 支持中文文件名与大体量图纸(解析结果带磁盘缓存,二次打开更快)

功能特性

  • DXF 解析:后端读取dxf/目录下的.dxf,导出图层、块定义、模型空间实体与包围盒
  • DWG 支持:上传.dwg可勾选自动转换;提供scripts/dwg_to_dxf.py批量转 DXF
  • 多级缓存:内存缓存 +backend/.cache/dxf/磁盘缓存,大文件二次加载显著加速
  • Canvas 渲染:线段、多段线、圆、弧、填充、文字、块引用(含嵌套块展开)等
  • 图层 / 块控制:左侧列表切换可见性,支持搜索与批量显示/隐藏
  • 交互操作:滚轮缩放(以鼠标为中心)、拖拽平移、「适应窗口」一键复位
  • 性能优化:Web Worker 块展开、视口空间网格索引、requestAnimationFrame合并重绘、GZip 压缩 API 响应

技术栈

层级技术
后端Python 3 · FastAPI · ezdxf · uvicorn
前端Vue 3 · Vite · Canvas 2D · Web Worker
通信REST JSON;开发环境 Vite 将/api代理到127.0.0.1:8000

项目结构

test/ ├── dxf/# DXF 图纸目录(放置或导出到此)│ ├── Drawing1.dxf │ ├── Drawing2.dxf │ ├── 会所强弱电、水位图.dxf │ └── 餐厅装修施工图.dxf ├── scripts/ │ └── dwg_to_dxf.py# 批量 DWG → DXF(需 ODA File Converter)├── backend/ │ ├── app.py# FastAPI 路由、上传、CORS、GZip│ ├── dwg_convert.py# DWG→DXF(ezdxf odafc / ODA)│ ├── dxf_parser.py# ezdxf 解析 → JSON(PARSER_VERSION)│ ├── dxf_cache.py# 解析结果磁盘缓存│ ├── requirements.txt │ └── .cache/dxf/# 自动生成,已加入 .gitignore└── frontend/ ├── index.html ├── vite.config.js# 开发代理 /api → 后端├── package.json └── src/ ├── App.vue# 侧边栏、文件选择、图层/块列表├── api/dxf.js# 后端 API 封装├── utils/geometry.js# 块展开、包围盒、空间索引├── workers/ │ └── dxfPrepare.worker.js# Worker:块展开与 bbox 预计算└── components/ ├── DxfCanvas.vue# Canvas 渲染与交互└── EyeToggle.vue# 眼睛图标切换

说明:查看器解析.dxf。项目支持.dwg上传并自动转为 DXF(需安装免费的 ODA File Converter),也可在 CAD 中手动导出 DXF,或使用命令行脚本scripts/dwg_to_dxf.py批量转换。

环境要求

依赖版本
Python3.10+
Node.js18+
包管理Yarn 1.x / 4.x,或 npm

快速启动

同时启动后端与前端。

1. 后端

cdbackend pipinstall-rrequirements.txt python app.py

默认地址:http://127.0.0.1:8000

健康检查:http://127.0.0.1:8000/api/health →{"ok":true}

也可使用:

cdbackend uvicorn app:app--reload--host127.0.0.1--port8000

请在backend/目录下执行上述命令,确保能正确导入dxf_parserdxf_cache等模块。

2. 前端

cdfrontendyarn# 或 npm installyarndev# 或 npm run dev

浏览器打开:http://localhost:5173

前端通过 Vite 将/api代理到后端,必须先启动后端再访问页面。

请通过Vite 开发地址(5173)访问,不要直接双击打开frontend/dist/index.html,否则/api无法代理,文件列表与解析请求会失败。

3. 验证图纸是否可用

# 列出 dxf/ 下文件curlhttp://127.0.0.1:8000/api/files# 解析指定文件(将文件名换成你的)curl"http://127.0.0.1:8000/api/dxf/parse?file=Drawing1.dxf"

返回 JSON 且含boundslayersentities即表示导出与解析正常。首次解析大文件可能需数十秒,之后会命中磁盘缓存。

使用说明

操作说明
选择文件左侧下拉框切换dxf/目录中的 DXF
上传图纸点击「上传 DXF / DWG」;DWG 可勾选「自动转为 DXF」(需 ODA File Converter)
刷新列表点击「刷新列表」;页面也会每 4 秒自动检测dxf/目录变化
图层 / 块切换 Tab,点击眼睛图标显示或隐藏
搜索在列表上方输入关键字过滤名称
全部显示 / 全部隐藏批量操作当前 Tab 下的所有项
滚轮以鼠标位置为中心缩放
拖拽按住左键平移画布
适应窗口右上角按钮,将图纸缩放至适合视口

显示逻辑

  • 图层:隐藏后,该图层上的实体(含块内同图层几何)不再绘制
  • :隐藏后,该块的所有INSERT实例及其展开几何不再绘制
  • 图层与块规则同时生效(例如块已显示但所在图层被隐藏,仍不绘制)
  • 加载 DXF 时,CAD 中关闭的图层(on: false)会默认在查看器中隐藏

DWG 转 DXF(无需打开 CAD)

安装 ODA File Converter

  1. 打开 ODA File Converter 下载页 安装(Windows / macOS / Linux)。
  2. Windows 默认路径:C:\Program Files\ODA\ODAFileConverter\ODAFileConverter.exe
  3. 若安装在其他位置,可设置环境变量ODAFC_WIN_EXEC_PATH指向该 exe(或在 ezdxf 配置中设置odafc-addonwin_exec_path)。
  4. 启动后端后访问GET /api/converter/statusavailable: true表示可自动转换。

方式一:页面上传(推荐)

  1. 左侧上传 DXF / DWG,选择本地.dwg.dxf
  2. 勾选DWG 自动转为 DXF(默认开启);上传成功后下拉框会出现同名.dxf并自动加载。
  3. 若未安装转换器,仍可上传DXF;DWG 可先保存,再用下方脚本转换。

方式二:命令行批量转换

# 转换 dxf/ 目录下全部 .dwgpython scripts/dwg_to_dxf.py# 转换单个文件python scripts/dwg_to_dxf.py"dxf/某图纸.dwg"# 指定 DXF 版本(默认 ACAD2010,可用环境变量 DXF_DWG_VERSION)python scripts/dwg_to_dxf.py--versionACAD2007

方式三:在 CAD 中手动导出

见下文「从 CAD 导出 DXF」。


从 CAD 导出 DXF

导出前须知

项目建议
文件格式优先DXF.dxf);或使用本项目的DWG 上传/脚本转换
DXF 版本AutoCAD 2007 / 2010 / 2018 DXF均可;优先2010 或 2007(兼容性好)
编码优先ASCII DXF;二进制 DXF 一般也能解析,但排查问题较难
导出空间导出模型空间(Model)中的内容;仅布局/图纸空间的内容可能看不到
图层与块保留图层、块定义,无需全部炸开;本查看器支持INSERT与图层筛选
外部参照导出前建议绑定(Bind)插入(Insert)外部参照,避免缺图
文件大小超大平面图可先在 CAD 中关闭无关图层再导出,或按楼栋/楼层拆分多个 DXF

Autodesk AutoCAD

方法一:另存为(常用)

  1. 打开 DWG 图纸,确认在模型选项卡(Model)。
  2. 文件 → 另存为(或SAVEAS)。
  3. 文件类型选择AutoCAD DXF (*.dxf)
  4. 点击工具选项(因版本而异):
    • 格式选ASCII(若有);
    • 版本选2010 DXF2007 DXF
  5. 保存到本项目的dxf/目录(或先存到桌面再复制进去)。

方法二:导出(部分版本)

  1. 输出选项卡 →导出其他格式
  2. 文件类型选DXF,按向导选择模型空间、版本后保存。

AutoCAD 命令行(可选)

SAVEAS;在对话框中选择 DXF,版本2010

中望 CAD(ZWCAD)

  1. 文件 → 另存为
  2. 类型选DXF (*.dxf)
  3. 在版本下拉框中选择20102007
  4. 若有ASCII / 二进制选项,选ASCII
  5. 保存至dxf/目录。

浩辰 CAD(GstarCAD)

  1. 文件 → 另存为→ 文件类型DXF
  2. 版本建议2010 DXF2004/2007 DXF
  3. 确认当前为模型空间再保存。

天正建筑 / 天正机电等(基于 AutoCAD 平台)

  1. 在天正或 AutoCAD 中打开项目图,执行天正相关图层整理 / 图块清理(按需)。
  2. 使用底层AutoCAD 的「另存为 → DXF」流程导出(不要只留天正自定义对象而不转换)。
  3. 若导出后在本查看器中缺少管线或标注,可在 CAD 中执行炸开(Explode)对象转换后再导出(会增大文件、丢失部分块结构,仅作兜底)。

BricsCAD / LibreCAD / DraftSight

  • BricsCAD:与 AutoCAD 类似,另存为 → DXF 2010
  • LibreCAD文件 → 另存为,格式选DXF R27R24
  • DraftSight文件 → 另存为 → DXF,版本选20102018

推荐导出检查清单

导出完成后,建议逐项确认:

  • 扩展名为.dxf,且已放入项目dxf/文件夹
  • 用本查看器或curl能成功解析(见 快速启动 §3)
  • 主要建筑/机电图层、图块在左侧列表中可见
  • 文字、填充、块引用显示正常(异常时见 常见问题)
  • 文件名尽量简短;中文文件名支持,但跨机器拷贝时注意编码一致

导出常见问题(CAD 侧)

现象可能原因与处理
查看器空白内容在布局空间;改在模型空间导出
缺块、缺图外部参照未绑定;在 CAD 中绑定参照后重导
文字乱码或方框CAD 中改用宋体、仿宋TrueType字体;避免仅依赖 SHX 特殊字体
填充不显示图案填充过于复杂;可在 CAD 中简化 HATCH 或转为 SOLID
文件极大、加载慢关闭无关图层、删除未使用块、按区域拆分 DXF
解析报错尝试降低 DXF 版本(如改为2007)或另存为 ASCII DXF后重试

添加与管理图纸

  1. .dxf放入项目根目录下的dxf/文件夹(目录不存在时,后端首次列出文件时会自动创建)。
  2. 刷新浏览器页面,或在左侧点击刷新列表(页面也会定时扫描新文件)。
  3. 默认优先加载Drawing1.dxf(若存在);也可通过GET /api/filesdefault字段获知默认文件。

命名建议

  • 支持中文与空格,例如会所强弱电、水位图.dxf
  • API 会对文件名做 URL 编码,无需手动处理。
  • 请勿将 DXF 放在dxf/以外的路径;后端仅允许读取dxf/内文件,防止路径穿越。
  • 避免将 CAD 临时锁文件(如.dwl.dwl2)当作图纸使用。

API

接口说明
GET /api/health健康检查
GET /api/files列出dxf/.dxf;含dwgFilesconverterAvailable
GET /api/converter/statusODA File Converter 是否可用
POST /api/upload?convert=true上传.dxf/.dwg(multipartfile);DWG 可自动转 DXF
GET /api/dxf/parse?file=Drawing1.dxf解析指定 DXF(仅文件名,不含路径)

GET /api/files示例

{"files":["Drawing1.dxf","Drawing2.dxf","会所强弱电、水位图.dxf"],"default":"Drawing1.dxf","dxfDir":"E:/.../test/dxf","scannedAt":"2026-05-28T02:00:00+00:00"}

解析结果主要字段

{"bounds":{"min":[x, y],"max":[x, y]},"layers":[{"name":"...","color":"#RRGGBB","aci":7,"on":true}],"blocks":["块名","..."],"blockDefinitions":{"块名":[/* 块内实体 */]},"entities":[/* 模型空间实体 */],"stats":{"entityCount":0,"layerCount":0,"blockCount":0}}

缓存机制

为加快大图纸重复打开速度,解析结果有两级缓存:

层级位置失效条件
内存后端进程内DXF 文件mtime/size变化,或进程重启
磁盘backend/.cache/dxf/*.json同上,或dxf_parser.PARSER_VERSION升级
  • 修改 DXF 源文件后,缓存会自动失效并重新解析。
  • 升级解析逻辑后,请删除backend/.cache/dxf/或等待版本号变更触发失效。
  • 缓存目录已写入.gitignore,无需提交到 Git。

前端在 Worker 中完成块展开与包围盒计算;Worker 不可用时自动回退到主线程同步处理。

支持的实体类型

DXF 类型前端渲染
LINE线段
LWPOLYLINE / POLYLINE多段线(含 bulge 弧段折线近似)
CIRCLE
ARC弧(折线近似)
ELLIPSE椭圆(折线近似)
SOLID / TRACE / 3DFACE实心填充面
INSERT块引用(含嵌套块展开)
TEXT / MTEXT文字(含中文,依赖系统字体)
DIMENSION尺寸标注(展开为线、箭头块、标注文字,归属原图层如PUB_DIM
LEADER / MLEADER引线(展开为线/多段线,归属原图层)
HATCH边界填充与图案线(如 AR-CONC、ANSI31)

未列入上表的实体类型(如部分自定义对象、光栅图像)可能不会显示;请在 CAD 中转换为基本几何后再导出。

生产构建

# 前端静态资源cdfrontendyarnbuild# 或 npm run build,输出到 frontend/dist# 后端 API(示例:监听所有网卡)cdbackend uvicorn app:app--host0.0.0.0--port8000

部署时注意:

  • dxf/与后端一同部署到服务器,或挂载为数据卷。
  • 若前端静态资源与 API 不同域,需配置 CORS 或反向代理(开发环境已启用 CORS*)。
  • 生产环境可将 Nginx 等反向代理:/api→ 后端,/frontend/dist
  • 大图纸首次解析仍可能较慢,建议在部署机预留backend/.cache/磁盘空间。

Nginx 反向代理示例(片段)

location /api/{proxy_pass http://127.0.0.1:8000/api/;}location /{root /path/to/frontend/dist;try_files$uri$uri/ /index.html;}

架构说明

dxf/*.dxf │ ▼ dxf_parser.py ──→ JSON(图层 / 块 / 实体 / 包围盒) │ ▲ │ dxf_cache.py(磁盘) │ ▲ │ app.py 内存缓存 ▼ FastAPI /api/dxf/parse (GZip) │ ▼ Vue App.vue ──→ DxfCanvas.vue ├── dxfPrepare.worker.js 块展开 + bbox(toRaw 后 postMessage) ├── expandInserts()Worker 失败时主线程回退 ├── SpatialGrid 视口空间索引 └── Canvas 2D 绘制可见实体

渲染性能策略

  1. 块展开与包围盒在数据加载时一次性计算(Worker 或主线程)
  2. 缩放/平移通过 CanvassetTransform统一变换,避免逐点坐标换算
  3. requestAnimationFrame合并同一帧内的多次滚轮/拖拽事件
  4. 视口裁剪:仅绘制当前可见区域内的实体,放大局部时减少绘制量

常见问题

页面显示「无法获取文件列表」或加载失败

  • 确认后端已启动:http://127.0.0.1:8000/api/health返回{"ok":true}
  • 确认 DXF 位于dxf/目录,而非项目根目录或其他路径
  • 确认前端 dev 服务已启动,且浏览器访问的是Vite 地址(5173),以便/api代理生效
  • 终端若出现ECONNREFUSED 127.0.0.1:8000,说明后端未运行或已崩溃,请先启动python app.py

后端启动报错No module named 'dxf_cache'

  • backend/目录执行python app.py,不要从项目根目录直接运行
  • 确认存在backend/dxf_cache.py

侧边栏有数据,但画布一片空白

  • 打开浏览器开发者工具(F12)→ Console,查看是否有红色报错
  • 确认未直接打开dist/index.html,应通过yarn dev或配置好反向代理后访问
  • 点击右上角适应窗口;尝试滚轮缩放或拖拽,排除视图在图纸范围外
  • 检查是否误将图层/块全部隐藏

下拉框没有新放入的文件

  • 刷新页面或点击「刷新列表」;后端会扫描dxf/*.dxf
  • 确认扩展名为小写.dxf

解析返回 404

  • 检查file参数是否仅为文件名(如Drawing1.dxf),不要带dxf/前缀
  • 确认文件确实存在于dxf/目录

解析返回 500

  • 查看响应detail字段;常见原因为 DXF 损坏、版本过新或含不支持对象
  • 在 CAD 中另存为DXF 2007/2010 ASCII后重试

上传 DWG 失败或提示未安装转换器

  • 安装 ODA File Converter 后重启后端
  • 检查GET /api/converter/statusavailable是否为true
  • 或取消勾选自动转换,仅保存 DWG,再运行python scripts/dwg_to_dxf.py

文字显示异常

  • 依赖系统已安装中文字体(如 Microsoft YaHei、PingFang SC、SimSun)
  • CAD 导出时尽量使用 TrueType 或常见 SHX 字体

图纸很大时仍然较慢

  • 首次解析会写入磁盘缓存,第二次打开同一文件会快很多
  • 在查看器中隐藏不需要的图层/块
  • 在 CAD 导出前精简图层与块
  • 当前为全量 JSON 加载,超大图纸可考虑后续做分块或后端预处理

修改 DXF 后查看器仍显示旧内容

  • 保存 DXF 后刷新页面;磁盘缓存会按文件修改时间自动失效
  • 若仍异常,可手动删除backend/.cache/dxf/后重试

从 CAD 导出后与本机 AutoCAD 显示不一致

  • 本查看器为2D 预览,不执行 AutoCAD 全部渲染规则
  • 复杂线型、渐变、部分代理对象可能简化或忽略
  • 以「图层/块是否可辨、主要几何是否完整」为验收标准即可
http://www.jsqmd.com/news/908397/

相关文章:

  • 从开源PCV到自研工具:一个嵌入式工程师的点云软件实战复盘(含完整CMake配置)
  • 从DBC文件到AUTOSAR COM信号映射:手把手教你用ISOLAR实现自动化配置与集成
  • 一个人在长沙,怎么过一个有质感的周末?
  • 50行Python手搓一个原生AI Agent:彻底看懂智能体的本质
  • 高强度螺栓怎么选?从强度等级到应用场景,六月上海紧固件专业展
  • Smoothieware固件配置项探秘:手把手教你通过Code Review定位隐藏参数(如mm_per_arc_segment)
  • 搞定7nm DRC收敛:一份给Innovus和ICC2用户的联合调试备忘录
  • AI时代数据管道设计:从ETL到MLOps的现代化实践
  • MATLAB机器人控制器仿真代码包:从建模、设计到响应验证的一站式实现
  • 从关键词匹配到任务理解:Agent 意图识别的五代技术演进
  • 如何快速掌握BepInEx:Unity游戏模组开发的终极框架指南
  • 26个摄影实战故事:从新手到高手的避坑指南与创作心法
  • 开源语音识别模型:媲美谷歌级性能的本地化部署方案
  • 2026年4月目前靠谱的变压器定制推荐,龙门架电力构架/四管塔避雷塔/独立避雷针/三柱塔避雷针,变压器来图加工厂家销售 - 品牌推荐师
  • BepInEx终极指南:Unity游戏插件框架的完整安装与配置
  • 从抓包看本质:Wireshark深度解读TCP报文头每个字段的含义与实战作用
  • SVG 参考手册
  • 别再靠猜了!用SystemView+FreeRTOS实时‘看透’你的任务调度(保姆级配置避坑)
  • 【YFIOs】用C#开发硬件之GPIO操作
  • 基于Whisper、Llama 2与Bark构建本地离线语音助手实战指南
  • AI应用的用户体验设计:从用户研究到迭代
  • 术语俗话 --- 什么是类C代码
  • Uber 4 个月烧光 2026 全年 AI 预算:人均月账单 $500-$2000,企业 token 计费失控的第一个公开样本
  • 如何用 ChatGPT 提升学习指导效率?完整实现指南
  • 体育科技革命:从数据采集到AI分析,技术如何重塑竞技体育
  • Gemini多语言翻译质量深度拆解(中/日/阿/印地语实测盲区大曝光)
  • NVIDIA Profile Inspector终极指南:5个步骤解决显卡驱动兼容性难题
  • 微服务间的远程接口调用:OpenFeign 的使用
  • GAMP程序太老了?手把手教你修改源码,让北斗三号PPP定位精度起飞
  • 华硕笔记本终极优化指南:5个G-Helper核心功能让电脑重获新生