网易首页 > 网易号 > 正文 申请入驻

在线CAD的图纸保存与数据持久化使用方法

0
分享至

一、引言:从临时绘图到数据归档

在完成了环境搭建、视图控制、命令行驱动及图纸编辑的全流程探索后,数据持久化成为构建完整工程设计系统的关键一环。在工程实践中,图纸不仅需要在浏览器中实时渲染,更需要将修改后的数据安全回传服务器,或转换为通用格式(如 DWG、PDF)进行归档。

MxCAD 的保存机制并非简单的“文件下载”,而是一个基于“前端-后端”协同的复杂过程。本文将深入解析这一过程,帮助开发者构建完整的云端设计闭环。

二、核心原理:云图开发包架构逻辑



在深入代码前,必须明确 MxCAD 的文件架构逻辑。为了实现 Web 端的高性能渲染,MxCAD 采用了专有的mxweb格式作为核心数据载体。

核心逻辑:浏览器中的 JavaScript 无法直接将图形数据转换为复杂的 AutoCAD DWG格式。因此,保存图纸的实质是:将前端的mxweb数据上传至服务器,由服务器端的转换引擎(云图开发包)将其还原并转码为标准格式。

这一过程遵循“前端负责交互与展示,后端负责存储与转码”的架构思想。

三、实战步骤详解



完整的图纸保存流程分为四个标准步骤:前端序列化、数据上传、后端转码、前端下载。

3.1 步骤一:前端序列化(生成 mxweb)

在 MxCAD 的架构中,前端是用户交互的入口,所有绘图、编辑、图层管理等操作都在浏览器内存中进行。为了将这些动态数据持久化,第一步必须将当前绘图环境“快照”下来。

MxCpp.getCurrentMxCAD().saveFile()方法是MxCAD提供的核心 API,用于将当前绘图区的所有图形数据、图层状态、视图配置等信息序列化为 mxweb 格式的二进制数据。mxweb 是 MxCAD 为 Web 环境优化的专有格式,它轻量、高效,能够被浏览器快速解析和渲染。

saveFile(
filename?: string,
call?: (data: any) => void,
isDownland?: boolean,
isShowSaveFileDialog?: boolean,
parameter?: object
): boolean;

API 参数说明:

**filename**:可选参数,指定保存文件的名称。如果不提供,系统将使用当前文件名或默认名称。
**call**:可选回调函数。当文件保存完成后,该函数会被调用,参数 data 包含序列化后的文件数据(通常是 ArrayBuffer 或 Blob)。
**isDownland**:布尔值,默认为 true。如果为 true,则保存后会自动触发浏览器下载;如果为 false,则仅生成数据,不触发下载,适合后续上传到服务器。
**isShowSaveFileDialog**:布尔值,默认为 true。如果为 true,会弹出系统保存对话框让用户选择保存位置;如果为 false,则静默保存,适合自动化流程。
**parameter**:可选对象,用于传递额外的参数,如自定义元数据、版本号等。

代码示例一:直接在当前界面下载图纸文件

import { MxCpp } from "mxcad"
const btn = document.createElement("button")
btn.addEventListener("click",()=>{
MxCpp.getCurrentMxCAD().saveFile(void 0, void 0, true, true, { compression: 0 })
})
document.body.appendChild(btn)

代码示例二:获取图纸 Blob 对象

import { MxCpp } from "mxcad";
MxCpp.getCurrentMxCAD().saveFile(
void 0,
(data) => {
// 处理 Safari 兼容性
let isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
let blob = new Blob([data.buffer], {
type: isSafari ? "application/octet-stream" : "application/octet-binary"
});
// 调用上传函数
uploadFileToServer(blob);
},
false, // 不触发下载
false, // 静默保存
{ compression: 0 } // 不压缩
);

3.2 步骤二:上传至后端(数据传输)

前端获取到Blob后,需通过协议传输至服务端。

传输逻辑:使用FormData封装文件数据,通过fetch或axios发送 POST请求。

代码示例:标准上传逻辑

const uploadFileToServer = async (fileData, fileName) => {
const formData = new FormData();
formData.append("file", fileData, fileName); // 封装文件
formData.append("bizId", "project_12345"); // 携带业务参数
try {
const response = await fetch("http://localhost:1337/api/upload", {
method: "POST",
body: formData,
});
const result = await response.json();
console.log("上传成功,服务器返回路径:", result.filePath);
return result.filePath;
} catch (error) {
console.error("上传失败:", error);
}
};

3.3 步骤三:后端转码(格式转换)

后端接收到.mxweb文件后,需调用本地 MxCAD 转换服务(如mxcadassembly)进行“无头”转换。

核心转换流程如下:

定位文件:获取前端上传的 .mxweb 文件在服务器上的临时存储路径。
构建命令:组装转换指令,指定输入文件(源)和输出文件(目标),以及目标格式(如 DWG, PDF)。
执行转换:通过子进程调用转换引擎。

下面以转换 dwg 图纸格式为例:

命令格式为 ./mxcadassembly '{"srcpath":"输入路径","outpath":"输出目录", "outname":"文件名"}'。

Node.js 后端核心片段:

const { exec } = require('child_process');
const path = require('path');
function convertMxWebToDwg(mxwebFilePath, outputDwgPath, response) {
const converterPath = '/path/to/mxcadassembly'; // 转换工具路径
// 构建参数对象
const params = {
srcpath: mxwebFilePath,
outpath: path.dirname(outputDwgPath),
outname: path.basename(outputDwgPath, '.dwg'),
compression: 0
};
// 组装命令 (注意 JSON 字符串外层的单引号)
const command = `"${converterPath}" '${JSON.stringify(params)}'`;
console.log("执行命令:", command);
// 执行转换
exec(command, (error, stdout, stderr) => {
if (error) {
return response.json({ ret: 'ConvertFailed', error: error.message });
}
try {
const result = JSON.parse(stdout.trim());
if (result.code === 0) {
response.json({
ret: 'Ok',
file: `/mxcad/file/${path.basename(outputDwgPath)}`
});
}
} catch (e) {
response.json({ ret: 'Error', message: '解析失败' });
}
});
}

注意:后端转码服务通常依赖于 Windows 环境或特定的 Linux 容器环境,且需要安装对应的 MxCAD 服务端组件。

3.4 步骤四:前端下载(本地归档)

当后端完成转换,文件已变为用户熟悉的 .dwg 或 .pdf 格式。此时,前端只需要提供一个文件访问入口,让用户将这些标准文件下载到本地进行归档就完成了操作闭环。

虽然 saveFile 方法本身支持直接下载(isDownland: true),但在上述“上传-转码”流程中,下载通常是一个独立的后续操作,因此需要配合整体流程共同完成。

四、基于 Node 服务的快速实现

若不想从零搭建后端,可直接使用 MxCAD 云图开发包预置的转换服务。

4.1 快速启动



下载并解压 MxCAD 云图开发包。

进入目录:MxDrawCloudServer/Bin/MxDrawServer/Windows。
启动服务:在终端执行 node app.js。
端口:服务默认监听 1337 端口。

4.2 核心接口速查

启动服务后,只需要调用服务内置的接口配合 saveFileToUrl 方法来完成保存,无需手动处理上传和转码的繁琐细节,接口示例如下:



4.3 核心 API:saveFileToUrl

saveFileToUrl 是 MxCAD 云图开发包中封装的核心 API,用于将当前图纸数据异步传输至指定的后端服务地址。该接口的强大之处在于其通用性:用户无需编写复杂的上传逻辑,只需根据需求传入不同的后端接口 URL,即可实现保存为 DWG、MXWEB 或 PDF 等不同格式。

saveFileToUrl(
sSaveProgramUrl: string,
call: (iResult: number, sServerResult: string) => void,
filename?: string,
param?: any
): boolean;

API 参数说明:

sSaveProgramUrl:目标后端接口地址。这是决定文件保存格式的关键
call:回调函数。用于接收服务端的响应。
filename:指定保存的文件名(可选)。
param:额外的 JSON 参数(如 PDF 的宽高设置)。

调用示例一:保存为 DWG

import { MxCpp } from "mxcad"
// 1. 获取当前 MxCAD 对象
const mxcad = MxCpp.getCurrentMxCAD()
// 2. 调用接口,传入保存 DWG 的后端地址
mxcad.saveFileToUrl("http://localhost:1337/mxcad/savedwg", (iResult, sServerResult) => {
// 3. 处理服务端返回结果
if (iResult === 0) {
// sServerResult 是服务端返回的 JSON 字符串
// 结构示例: { "ret": "ok", "file": "test.dwg" }
const retData = JSON.parse(sServerResult);
if (retData.ret === "ok") {
console.log("文件保存成功,服务器路径:",
`http://localhost:1337/mxcad/file/${retData.file}`);
// 此时 retData.file 即为保存后的文件访问路径(相对路径或完整URL)
// 开发者可将其用于后续的文件下载或归档逻辑
}
} else {
console.error("文件上传失败");
}
});

调用示例二:保存为 PDF 并带参数

如果需要保存为 PDF 并指定图纸尺寸,可以通过第四个参数 param 传递配置:

import { MxCpp } from "mxcad"
const mxcad = MxCpp.getCurrentMxCAD()
// 传入第四个参数 JSON.stringify({ width: "2000", height: "2000" }) 设置 PDF 尺寸
mxcad.saveFileToUrl(
"http://localhost:1337/mxcad/savepdf",
(iResult, sServerResult) => {
const ret = JSON.parse(sServerResult);
if (ret.ret === "ok") {
// 获取生成的 PDF 下载链接
const pdfUrl = "http://localhost:1337/mxcad/file/" + ret.file;
console.log("PDF生成成功:", pdfUrl);
}
},
"my_drawing", // 文件名
JSON.stringify({ width: "2000", height: "2000" }) // 额外参数
);

4.4 文件存储路径管理

默认情况下,转换后的文件会被存储在云图开发包的 public/mxcad/file/ 目录下。

访问地址:localhost:1337/mxcad/file/文件名

路径修改:如需更改存储位置,请编辑 ini.js 配置文件中的 uploadPath 字段。

// 修改 MxDrawCloudServer\Bin\MxDrawServer\Windows 下的 ini.js 文件
this.mxcad = {
uploadPath: "./public/mxcad/file/", // 修改此处为你自定义的路径
mxbinPath: "../../MxCAD/Release/"
};
五、总结

本文详细阐述了 MxCAD 图纸保存的“四步走”策略。

核心在于理解:

前端负责交互与展示,生成轻量级的mxweb数据。
后端负责存储与转码,利用引擎将mxweb还原为标准格式。

通过利用云图开发包提供的 Node 服务,开发者可以跳过复杂的底层转换逻辑,快速实现 DWG、PDF 等格式的导出。至此,我们已涵盖了从“看图”、“编辑”到“保存”的完整生命周期。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
昨夜A股4家公司爆雷:2家立案1家被罚1家存退市风险

昨夜A股4家公司爆雷:2家立案1家被罚1家存退市风险

慧眼看世界哈哈
2026-07-11 09:15:21
CBA三队顶薪续约球员,辽宁稳,天津变数最大

CBA三队顶薪续约球员,辽宁稳,天津变数最大

纵横之策
2026-07-10 16:49:28
特朗普没想到,中国刚要加购美国大豆,就有“内鬼”给美国使绊子

特朗普没想到,中国刚要加购美国大豆,就有“内鬼”给美国使绊子

老嫅尾声体育解说
2026-07-11 18:29:24
周末疯狂发酵!顶级巨佬炸裂发言,这个板块要爆了!

周末疯狂发酵!顶级巨佬炸裂发言,这个板块要爆了!

星图金融研究院
2026-07-11 15:08:04
张本父亲赛后语出惊人:研究孙颖莎王曼昱多年,王曼昱爆冷如天亮了

张本父亲赛后语出惊人:研究孙颖莎王曼昱多年,王曼昱爆冷如天亮了

天光破云来
2026-07-11 07:04:19
巴丹群岛不属于菲律宾,如果失去巴丹群岛,对菲律宾有什么影响?

巴丹群岛不属于菲律宾,如果失去巴丹群岛,对菲律宾有什么影响?

世界纵横说
2026-07-10 10:16:05
重磅|炸桥只是幌子!美国6年供应链杀局落地,十大高危供应链完整曝光

重磅|炸桥只是幌子!美国6年供应链杀局落地,十大高危供应链完整曝光

环球策论
2026-07-11 13:39:44
长沙体育局调查“工作人员占他人车位”最新进展:当事人称涉事车主已道歉并给予经济补偿,双方签署调解协议

长沙体育局调查“工作人员占他人车位”最新进展:当事人称涉事车主已道歉并给予经济补偿,双方签署调解协议

红星新闻
2026-07-10 21:31:42
离开11年后,央视名嘴低调隐居北京,如今二婚21年无儿无女很潇洒

离开11年后,央视名嘴低调隐居北京,如今二婚21年无儿无女很潇洒

素衣读史
2026-06-25 21:56:52
打破7年纪录!巴威路径再北调,要直扑台州?

打破7年纪录!巴威路径再北调,要直扑台州?

天气观察站
2026-07-11 13:17:46
冬奥冠军刘少林娶了金发碧眼大美女,刘少昂见证哥哥幸福一刻

冬奥冠军刘少林娶了金发碧眼大美女,刘少昂见证哥哥幸福一刻

赏心悦目的我
2026-07-11 15:48:04
医院态度不好就举报!一地卫健委将“服务态度”纳入举报重点

医院态度不好就举报!一地卫健委将“服务态度”纳入举报重点

新浪财经
2026-07-11 18:40:28
上海市气象台:台风“巴威”对上海的风雨影响量级略微上调

上海市气象台:台风“巴威”对上海的风雨影响量级略微上调

澎湃新闻
2026-07-11 17:46:28
菲律宾与广东同是1亿多人口,菲律宾创造3.3万亿,广东是多少呢?

菲律宾与广东同是1亿多人口,菲律宾创造3.3万亿,广东是多少呢?

混沌录
2026-06-03 23:37:06
官方通报来了!彭某某确为副处长,人已被停职,可选拔并无违规

官方通报来了!彭某某确为副处长,人已被停职,可选拔并无违规

谭谈社会
2026-07-11 18:15:28
取消上海冠军资格?篮协、CBA、上海三方表态,处罚结果即将公布

取消上海冠军资格?篮协、CBA、上海三方表态,处罚结果即将公布

多特体育说
2026-07-11 15:08:10
霸车位副处长处罚结果公布,6部门组织双方多次调解

霸车位副处长处罚结果公布,6部门组织双方多次调解

映射生活的身影
2026-07-11 18:30:44
市政府副秘书长、市发展改革委主任刘健同志调研虹桥国际中央商务区

市政府副秘书长、市发展改革委主任刘健同志调研虹桥国际中央商务区

新浪财经
2026-07-10 17:06:20
40岁还在逼自己!亨利坦言:C罗最可怕的不是进球,而是永不满足

40岁还在逼自己!亨利坦言:C罗最可怕的不是进球,而是永不满足

体育闲话说
2026-05-13 08:48:32
斯基拉:两家英超俱乐部有意CDK,亚特兰大要价5000万欧元

斯基拉:两家英超俱乐部有意CDK,亚特兰大要价5000万欧元

懂球帝
2026-07-11 08:00:11
2026-07-11 19:43:00
CAD梦想画图
CAD梦想画图
是一款极速轻量级的CAD软件
611文章数 123关注度
往期回顾 全部

科技要闻

苹果起诉OpenAI系统性窃密,挖超400前员工

头条要闻

鞋厂重大火灾致28死 知情人:有老乡曾逃至顶层后坠亡

头条要闻

鞋厂重大火灾致28死 知情人:有老乡曾逃至顶层后坠亡

体育要闻

燃尽的比利时黄金一代,逃不过厄运诅咒

娱乐要闻

周星驰官宣星女郎 纯素人无拍戏经验

财经要闻

一封举报信 引发小红书IPO合规考验

汽车要闻

预售权益价11.78万起 五菱星光L将于7月16日上市

态度原创

亲子
艺术
家居
数码
公开课

亲子要闻

“别绿茶了,你就是个普通中年妇女”,家长会过度打扮,成了小丑

艺术要闻

他是米芾的“头号粉丝”,临摹其字以假乱真

家居要闻

2026建博会(广州) 公装联探展交流活动

数码要闻

BW暴走一万六千步:我看到硬件厂商正在疯抢二次元年轻人

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版