一、引言:什么是 MxServiceCode?
在Web CAD后台图纸处理场景中,许多开发者首先面临的核心难题是:如何在服务器端高效批量处理DWG文件?无论是格式转换、数据提取,还是批量操作,都离不开一个关键角色——MxServiceCode。
先梳理几个关键要点。MxServiceCode本质上是一个CAD后端服务层,位于云图开发包的MxDrawCloudServerBinMxServiceCode目录下。它并非一个完整的Web前端应用,而是以Node.js命令行(CLI)的形式,对底层DWG处理能力进行了轻量化封装。背后的技术支撑由三大核心模块构成:MxFun核心引擎、Native Addon(原生C++扩展插件),以及mxcad对象模型。
这种底层架构设计,确保了它在处理复杂CAD数据时兼具高效性与稳定性。在应用层面,其灵活性同样突出——所有后端功能均通过基于核心的“命令模块”来实现。这意味着,开发者可以像搭积木一样,通过编写或调用不同的命令模块,轻松定制并扩展服务器端的图纸处理逻辑。
二、MxServiceCode 项目结构详解

为了方便二次开发时快速定位,下面结合实际工程目录结构,对MxServiceCode的主要模块进行详细拆解。项目采用标准的Node.js + TypeScript工程规范,核心板块如下:
1. bin 原生依赖与资源
bin目录是整个项目的“动力核心”。它并非普通的脚本文件夹,而是包含了项目运行所必需的底层二进制文件和资源。MxServiceCode之所以能够处理复杂的DWG图纸,完全依赖于该目录提供的原生环境支持。
- Mx2DNode.node:核心的Native模块,是真正执行DWG解析与转换的底层引擎。
- fonts:DWG字体文件,确保后台转换时文字显示正常,避免乱码问题。
2. src 核心源码层
这是项目的逻辑处理中枢,包含了从底层引擎封装到具体业务功能的所有TypeScript代码。根据职责不同,可划分为以下三个部分:
(1) mxcad 数据模型层

该文件夹是对CAD对象模型的封装,将底层的Native DWG对象包装为Ja vaScript可访问的实体。其中包含大量核心类,例如:
McDbDatabase.ts:图纸数据库,用于管理图纸数据。McDbEntity.ts、McDbPolyline.ts、McDbText.ts:各类图纸实体(多段线、文字、圆等)。McDbLayerTable.ts:图层表,用于管理图纸的图层信息。
(2) sample 业务实现层

这里是编写实际业务逻辑的地方,每个文件通常对应一个特定的图纸处理功能(如格式转换、图框切割等)。
如需新增功能,只需在此添加脚本并在MxCommand.ts中注册即可,模块化设计让扩展变得非常灵活。
(3) 其他核心 TS 文件

除了上述子文件夹,src根目录下的文件构成了程序的骨架与控制中枢:
- ini.js:初始化脚本。通常在程序启动最早期执行,用于设置环境变量或加载基础配置,确保后续模块正常加载。
- MxFun.ts:底层桥梁。负责加载
bin目录下的原生C++扩展(Mx2DNode.node),初始化CAD引擎环境,并提供日志记录、路径处理等通用工具函数。 - MxProcessor.ts:命令调度中枢。负责解析外部传入的命令行参数,并将任务精准分发给对应的业务处理函数。
- MxCommand.ts:命令注册表。在此定义所有可用指令名称(如
convert、frameCut)与具体实现函数的映射关系。 - MxUtility.ts:通用工具库。提供项目中各模块复用的高频辅助方法,有效减少重复代码。
- MxBackstageConvert.ts:图纸文件后台处理接口。封装底层DWG后台处理接口,负责打开/保存图纸、生成WebGL输出并提供后台数据库访问。
3. 根目录与基础配置
这是项目的入口和配置中心,决定了程序如何启动和运行。
- mxapp.ts:程序的绝对入口。Node.js启动时首先执行此文件,负责初始化底层环境、解析命令行参数并触发命令执行。
- package.json / tsconfig.json:项目的依赖管理清单与TypeScript编译配置文件。
- test.bat / testlinux.sh:跨平台的测试脚本。分别用于Windows和Linux环境下快速验证功能是否正常。
- .dwg (A3.dwg, BT.DWG, tree.dwg 等):项目自带的测试图纸文件,用于开发调试时的输入源。
4. doc 与 public 目录
- doc:存放相关的技术文档或API说明,方便开发者查阅。
- public:静态资源目录。如果MxServiceCode启动了简单的HTTP服务,这里的文件(如HTML预览页、CSS/JS资源)可以直接被外部访问。
三、命令执行链路

理论部分介绍完毕,接下来看看实际运行流程。MxServiceCode的命令执行链路非常清晰,核心逻辑可概括为:命令行输入 → MxProcessor调度 → 业务实现 → 底层处理 → JSON输出。具体流程如下:
1. 程序启动与参数读取
在终端输入命令时,Node.js首先执行入口文件mxapp.ts。程序启动后,会立即调用MxFun.init()来初始化底层的C++运行环境。随后,它通过process.argv.slice(2)获取用户在命令行传入的所有参数。如果此时没有传入任何命令,程序会直接输出版本信息和日志路径并结束运行。
2. 命令分发与注册
检测到有效参数后,程序进入MxProcessor.do(args)进行命令分发。在分发之前,MxProcessor会先调用ReginstCommand()完成命令的注册。这个函数位于MxCommand.ts中,作用是将具体的命令名称(如convert、frameCut、margeDwg等)与sample目录下的具体实现函数一一映射。
3. 参数解析与执行
MxProcessor支持两种参数解析模式:一种是标准的命令 名称=值形式,另一种是通过fileparam filepath=...读取外部JSON文件的形式。解析出命令名和参数后,MxProcessor会在已注册的命令表中查找对应的处理函数。如果找不到,直接返回“命令没定义”的错误;如果找到,则立即执行该函数。
4. 业务逻辑与底层交互
位于sample目录下的命令实现函数被触发后,开始处理具体的业务逻辑。它们通常会调用MxBackstageConvert或Mx2DDraw等模块来操作图纸。而这些模块在接收到指令后,会将请求传递给真正的底层核心——由MxFun加载的Native模块(Mx2DNode.node)。Native模块负责执行最耗时的DWG文件打开、实体遍历、数据转换等底层操作。
5. 统一结果输出
当Native层完成所有图纸处理任务后,结果会逐层向上返回给命令实现函数。命令函数会将处理结果封装成一个标准的对象(例如包含success和message字段)。最后,MxProcessor.do()会使用console.log(JSON.stringify(...))将这个对象统一输出为JSON格式。这种标准化的输出方式,使得外部的Web服务或调用程序能够极其方便地读取和处理执行结果。
四、功能测试
在正式体验MxServiceCode强大的图纸处理能力之前,有一个关键的前置步骤。如果需要通过HTTP接口来调用这些功能,必须先启动云图开发包中的web服务,确保1337端口处于正常运行状态。
1. 启动 1337 端口服务(前置准备)

MxDraw云图开发包提供了一键启动方式,无需手动配置复杂的后台环境:
- Windows 系统:直接双击运行
MxDrawCloudServer/Mx3dServer.exe,在弹出的窗口中点击“开始Web服务”。程序会自动启动1337端口的CAD核心引擎服务(由Bin/MxDrawServer/Windows/app.js驱动)。 - Linux 系统:在终端执行启动脚本
./start_demo.sh,该脚本会自动拉起1337端口的CAD核心服务。
2. 核心功能与参数详解
(1)获取DWG文件基础数据
读取DWG图纸的实体数据、版本、范围等元信息,并输出为标准JSON文件,便于前端解析与展示。
命令行调用
./bin/node mxapp.js getcaddata file=t1.dwg outfile=t1.dwg.json
接口调用
var data = {cmd:"getcaddata", file:"t1.dwg", outfile:"t1.dwg.json"};axios({method: "post", url: "localhost:1337/users/mxservicecode", data }).then((ret) => {console.log(ret.data) alert(JSON.stringify(ret.data))// 输出文件位置:Bin/MxServiceCode/MxServiceCode/t1.dwg.json}).catch((err)=>{ alert("网络错误") })
| 参数 | 说明 |
|---|---|
| cmd | 目标命令名 |
| file | 源DWG文件名 文件路径:MxDrawCloudServerBinMxServiceCodeMxServiceCode |
| outfile | 生成的JSON数据文件名 文件保存路径:MxDrawCloudServerBinMxServiceCodeMxServiceCode |
(2)后台参数化绘图
无需人工干预,程序打开空白模板,根据预设逻辑执行绘图操作(如绘制特定图形、标注等),并生成新的DWG文件。
命令行调用
./bin/node mxapp.js testParamDraw outfile=testdraw.dwg debug=1
接口调用
var data = {cmd:"testParamDraw", //cmd:"testParamDrawTk", outfile:"testdraw.dwg",};axios({method: "post", url: "localhost:1337/users/mxservicecode", data }).then((ret) => {console.log(ret.data) alert(JSON.stringify(ret.data))// 输出文件位置:Bin/MxServiceCode/MxServiceCode/testdraw.dwg}).catch((err)=>{ alert("网络错误") })
| 参数 | 说明 |
|---|---|
| cmd | 目标命令名 |
| outfile | 生成的新DWG文件的保存路径 |
| debug | 可选,调试模式开关。值为1时表示开启调试模式(通常会输出更多日志信息) |
(3)根据图框名裁剪 DWG 到 PDF
这是非常实用的出图功能。程序会自动在图纸中搜索指定名称的图框(Block),识别其范围,并将图框内的图形内容批量导出为PDF、图片或其他格式。
命令行调用
./bin/node mxapp.js frameCut2 file=D:/Test/testcut.dwg tkname="AAA" outtype=.pdf
接口调用
var data = {cmd:"frameCut2", file:"D:/Test/testcut.dwg", tkname:"AAA", outtype:".pdf", //width:"1000" //height:"1000"};axios({method: "post", url: "localhost:1337/users/mxservicecode", data }).then((ret) => {console.log(ret.data) alert(JSON.stringify(ret.data))}).catch((err)=>{ alert("网络错误") })
| 参数 | 说明 |
|---|---|
| cmd | 目标命令名 |
| file | 源DWG文件路径 |
| tkname | 需要裁剪的图框名称(即Block的名字) |
| outtype | 指定输出文件的格式,例如.pdf、.mxweb等 |
| width / height | 指定输出pdf的宽度和高度 |
| colorPolic | 颜色策略。例如设置为mono表示输出黑白 |
(4)获取 DWG 文件图层信息
专门用于分析图纸结构,读取DWG的图层表(LayerTable),提取所有图层的名称、颜色、线型等属性,并输出图层列表,默认输出文件名为原文件名_layers.json。
命令行调用
./bin/node mxapp.js getAllLayer file="D:/Test/A.dwg"
接口调用
var data = {cmd:"getAllLayer", file:"t1.dwg",};axios({method: "post", url: "localhost:1337/users/mxservicecode", data }).then((ret) => {console.log(ret.data) alert(JSON.stringify(ret.data))// 输出文件位置:Bin/MxServiceCode/MxServiceCode/t1.dwg_layers.json}).catch((err)=>{ alert("网络错误") })
| 参数 | 说明 |
|---|---|
| cmd | 目标命令名 |
| file | 源DWG文件的路径 |
(5)合并图纸
读取多张DWG图纸的数据库,并将读取到的数据库合并到目标图纸数据库中,实现图纸的批量合并与拼接。
命令行调用
./bin/node mxapp.js margeDwg file="D:/Test/mB.dwg" marge_file="D:/Test/mA.dwg" out_file="D:/Test/mC.dwg" marge_layer="['2306','2307']" debug=1
接口调用
var data = {cmd:"margeDwg", file:"D:/Test/mB.dwg", marge_file:"['D:/Test/mA.dwg']", out_file:"D:/Test/mC.dwg", marge_layer:"['2306','2307']",};axios({method: "post", url: "localhost:1337/users/mxservicecode", data }).then((ret) => {console.log(ret.data) alert(JSON.stringify(ret.data))}).catch((err)=>{ alert("网络错误") })
| 参数 | 说明 |
|---|---|
| cmd | 目标命令名 |
| file | 目标DWG文件(被合并到的主文件) |
| marge_file | 要合并的DWG文件,支持单个路径或JSON数组 |
| out_file | 合并后输出DWG文件 |
| marge_layer | (可选)要合并的图层数组,格式类似['layer1','layer2'] |
