二维CAD协作(同步命令)应用场景除了多专业协同外,还可以作为本专业同步三级校审。
毕竟office协作已成为基本,除了性能差点外,其他方面完全替代单机操作。
我们利用office协作代替了很多管理平台——例如人员管理,合同管理,成果登记,交付管理,同理,CAD协作也必将能在更多场景中应用,成为设计师习惯。
持续开发中,目前支持同步命令的有:
1. 已实现同步的命令
绘图命令
| 命令名 | 描述 | 同步状态 |
|---|---|---|
| LINE | 直线 | ✅ 完整同步(含图层、颜色、线型、线型比例(全局比例因子,线型比例)、线宽、标高等属性,下同) |
| CIRCLE | 圆 | ✅ |
| ARC | 圙弧 | ✅ |
| RECTANG | 矩形 | ✅ |
| POLYGON | 正多边形 | ✅ |
| SPLINE | 样条曲线 | ✅ |
| POINT | 点 | ✅ |
| MTEXT | 多行文本 | ✅ |
| TEXT | 单行文字 | ✅ |
| XLINE | 构造线(双向无限延伸) | ✅ |
| RAY | 射线(单向无限延伸) | ✅ |
| ELLIPSE | 椭圆 | ✅ (难度大) |
| PLINE | 多段线 | ✅ |
| REVCLOUD | 修订云线 | ✅ |
修改命令
| 命令名 | 描述 | 同步状态 |
|---|---|---|
| MOVE | 移动对象 | ✅ 含图层、颜色、线型、线型比例(全局比例因子,线型比例)、线宽、标高等属性,下同 |
| ERASE | 删除对象 | ✅ |
| ROTATE | 旋转对象 | ✅ |
| SCALE | 缩放对象 | ✅ |
| COPY | 复制对象 | ✅ |
| MIRROR | 镜像 | ✅ |
| STRETCH | 拉伸 | ✅ |
| ARRAYRECT | 矩形阵列 | ✅ 关联阵列同步(难度大) |
| ARRAYPATH | 路径阵列 | ✅ |
| ARRAYPOLAR | 环形阵列 | ✅ |
| OFFSET | 偏移 | ✅ |
| BREAK | 打断 | ✅ |
| CHAMFER | 倒角 | ✅ |
| FILLET | 圆角 | ✅ |
| TRIM | 修剪 | ✅ |
| EXTEND | 延伸 | ✅ |
| EXPLODE | 分解 | ✅ |
| JOIN | 合并 | ✅ |
| PEDIT | 多段线编辑 | ✅ |
| OVERKILL | 删除重复对象 | ✅ |
| 夹点拖曳 | ✅(难度大) |
块
| 命令名 | 描述 | 同步状态 |
|---|---|---|
| INSERT | 将块和图形插入到当前图形中 | |
| block | 创建块 | ✅(难度大) |
组
| 命令名 | 描述 | 同步状态 |
|---|---|---|
| GROUP | 创建和管理已保存的对象集(称为编组) |
注释
| 命令名 | 描述 | 同步状态 |
|---|---|---|
| MTEXT | 多行文字 | ✅ 含图层、颜色、线型、线型比例(全局比例因子,线型比例)、线宽、标高等属性,下同 |
| TEXT | 单行文字 | ✅ |
| DIMLINEAR | 创建线性标注 | ✅ (难度大) |
| DIMALIGNED | 创建对齐线性标注 | ✅ |
| DIMANGULAR | 创建角度标注 | ✅ |
| DIMARC | 创建圆弧长度标注 | ✅ |
| DIMRADIUS | 为圆或圆弧创建半径标注 | ✅ |
| DIMDIAMETER | 为圆或圆弧创建直径标注 | ✅ |
| DIMORDINATE | 创建坐标标注 | ✅ |
| DIMJOGGED | 为圆和圆弧创建折弯标注 | ✅ |
点击展开
绘图命令
- LINE(直线)
- CIRCLE(圆)
- ARC(圆弧)
- DONUT(DO):圆环
- ELLIPSE(EL):椭圆
- RECTANG(矩形)
- POLYGON(正多边形)
- SPLINE(样条曲线)
- POINT(点)
- XLINE(XL):构造线
- PLINE(PL):多段线
- MLINE(ML):多线
revcloud:云线
REGION(REG):面域
MTEXT(MT):多行文本 - BLOCK(B):块定义
INSERT(I):插入块
WBLOCK(W):定义块文件
DIVIDE(DIV):定数等分
MEASURE(ME):定距等分 - BHATCH(H):填充
TABLE(TB):表格
CAD修改命令
- 实例对象夹点拖曳同步
- COPY(CO):复制
- MIRROR(MI):镜像
- ARRAY(AR):阵列
OFFSET(O):偏移 - ROTATE(RO):旋转
- MOVE(M):移动
- ERASE(E):删除
EXPLODE(X):分解
TRIM(TR):修剪
EXTEND(EX):延伸
STRETCH(S):拉伸
LENGTHEN(LEN):直线拉长
SCALE(SC):比例缩放
BREAK(BR):打断CHAMFER(CHA):倒角
FILLET(F):倒圆角
PEDIT(PE):多段线编辑
DDEDIT(ED):修改文本
CAD尺寸标注命令
- DIMLINEAR(DLI):直线标注
- DIMALIGNED(DAL):对齐标注
- DIMRADIUS(DRA):半径标注
- DIMDIAMETER(DDI):直径标注
- DIMANGULAR(DAN):角度标注
DIMCENTER(DCE):圆心标注 - DIMORDINATE(DOR):坐标标注
- DIMARC(DAR):弧长标注
- DIMJOGGED(DJO):半径折弯标注
QLEADER(LE):快速引出标注
DIMBASELINE(DBA):基线标注
DIMCONTINUE(DCO):连续标注
DIMSTYLE(D):标注样式
DIMEDIT(DED):编辑标注
DIMOVERRIDE(DOV):替换标注系统变量
QDIM:快速标注
2. 项目结构
autocad-collab/
├── server/ # Go服务端 (Beego v2 + GORM + WebSocket)
│ ├── conf/
│ │ └── app.conf # 服务端配置文件
│ ├── controllers/ # 控制器
│ │ ├── default.go # 默认控制器
│ │ ├── ws.go # WebSocket控制器
│ │ ├── commands.go # 命令API控制器
│ │ └── sessions.go # 会话API控制器
│ ├── models/ # 数据库模型
│ │ └── models.go # GORM模型定义
│ ├── routers/ # 路由配置
│ │ └── router.go # Beego路由
│ ├── services/ # 业务服务
│ │ └── hub.go # WebSocket连接管理与广播
│ ├── main.go # 程序入口
│ ├── go.mod # Go模块定义
│ └── go.sum # 依赖版本锁
│
└── autocad-plugin/ # AutoCAD ObjectARX插件 (C++)
└── AcadCmdIntercept/
├── AcadCmdIntercept.sln # Visual Studio解决方案
├── AcadCmdIntercept.vcxproj # 项目文件
├── CollabConfig.h # 统一配置常量
├── AcadCollabPlugin.cpp # 插件主实现(核心逻辑、命令注册)
├── AcadCollabPlugin.h # 插件头文件(CollabPlugin类定义)
├── CollabUtils.cpp # 工具函数实现(日志、GUID、JSON、字符串转换)
├── CollabUtils.h # 工具函数声明
├── CollabEntityHelper.h # 实体创建辅助(预留)
├── CollabReactors.h # 反应器声明(预留)
├── Resource.rc # 资源文件
└── bin/x64/Release/ # 编译输出目录
└── AcadCmdIntercept.arx # 生成的ARX插件3. 功能特性
- 实时协作: 多用户同时编辑同一个AutoCAD文件
- 命令同步: 用户操作通过WebSocket实时广播到所有连接的客户端
- 会话管理: 基于文件名自动创建或加入协作会话
- 命令历史: 所有协作命令记录在数据库中,新加入的用户会自动追加历史命令
4. 快速开始
4.1 启动服务端
打开cmd窗口,切换到server文件夹
autocad-collab/
├── server/
cd server
server服务端将在 http://localhost:8080 启动。——可修改app.conf中服务端口号
服务端API端点:
GET /- 服务状态检查GET /ws- WebSocket连接 (需要query参数: session_id, user_id, user_name)GET /api/sessions- 获取所有会话POST /api/sessions- 创建会话 (body: {file_name: “xxx.dwg”})GET /api/sessions/:id- 获取特定会话DELETE /api/sessions/:id- 删除会话GET /api/commands?session_id=xxx- 获取命令历史POST /api/commands- 创建命令
4.2 加载插件到AutoCAD
- 修改配置文件
collab_config.json{ "server": { "host": "localhost", "port": 8081 }, "websocket": { "ping_interval_ms": 30000, "handshake_timeout_ms": 5000, "recv_buffer_size": 8192 }, "log": { "file_name": "acad_collab_plugin.log", "buffer_size": 4096 } } - 启动AutoCAD
- 输入命令
APPLOAD——启动组——内容——添加:
- 选择编译生成的
AcadCmdIntercept.arx文件
- 信任该插件
4.3 使用插件
插件命令:
| 命令 | 功能 |
|---|---|
| COLLABSTART | 启动协作,输入用户名后自动加入会话 |
| COLLABSTOP | 停止协作 |
| COLLABSTATUS | 查看当前协作状态 |
| COLLABVALIDATE | 遍历图形中的所有实体,检查并删除无效实体,帮助解决因同步命令未执行完导致的文件无法保存问题 |
日志文件
插件日志文件位置:C:\Users\Administrator\AppData\Local\Temp
日志文件名:
acad_collab_plugin_userA.log- 用户A的日志acad_collab_plugin_userB.log- 用户B的日志- 服务端日志在控制台输出
协作流程:
- 用户A在AutoCAD中打开要协作的dwg文件(需要先保存)
- 输入
COLLABSTART,输入用户名(如 “userA”) - 用户B在另一台机器(或另一AutoCAD实例)打开同一个文件名的dwg文件
- 用户B也输入
COLLABSTART,输入用户名(如 “userB”) - 系统自动识别相同文件名并加入同一协作会话
- 用户A绘制直线、圆等图形,用户B的AutoCAD中会自动同步显示
4.4 注意事项
- 文件一致性: 协作前确保所有用户使用相同的基础dwg文件
- 对象Handle: 修改操作(MOVE/ERASE/ROTATE/SCALE)依赖对象Handle,不同文件可能Handle不同
- 冲突处理: 目前无自动冲突解决机制,建议用户分工协作不同区域
- 网络要求: 服务端需要可被所有客户端访问
- autocad出现弹窗“此图形中的一个或多个对象无法保存为指定格式。操作未完成,因此未创建任何文件。”:新建的图纸可以了
- 当无法保存文件时:说明某个实例未完成操作。可以全选,将内容拷贝到新cad文件里试试保存。
- 插件多个日志文件所在地:C:\Users\Administrator\AppData\Local\Temp
4.5 后续改进建议
- 支持更多AutoCAD命令(HATCH等)
- 添加操作撤销/重做支持
- 实现冲突检测和自动解决
- 添加用户光标位置实时显示
- 添加权限管理
- 实现文件自动合并功能
- 携带图层、颜色、线型、线型比例、(绝对)线宽1、(相对)线宽2等信息
autocad2024安装注意事项
autocad2024安装到win11上必须鼠标右键单击setup.exe后弹框里选择以管理员身份运行
5. 技术栈
服务端
- 语言: Go 1.21+
- Web框架: Beego v2
- ORM: GORM
- 数据库: SQLite(可替换为MySQL/PostgreSQL)
- 实时通信: WebSocket (gorilla/websocket)
客户端
- 语言: C++ / .NET Framework 4.8
- 平台: AutoCAD .NET API
- WebSocket: WebSocketSharp
- JSON序列化: Newtonsoft.Json
配置说明
服务端配置 (server/conf/app.conf)
appname = autocad-collab
httpport = 8080
runmode = dev
db_type = sqlite3
db_path = ./data/collab.db客户端配置
在 collab_config.json 中修改服务端地址:
{
"server": {
"host": "localhost",
"port": 8081
},
"websocket": {
"ping_interval_ms": 30000,
"handshake_timeout_ms": 5000,
"recv_buffer_size": 8192
},
"log": {
"file_name": "acad_collab_plugin.log",
"buffer_size": 4096
}
}数据模型
会话 (CollabSession)
- ID: 会话唯一标识
- FileName: 关联的AutoCAD文件名
- CreatedAt/UpdatedAt: 时间戳
命令 (Command)
- ID: 命令ID
- SessionID: 所属会话ID
- UserID: 操作用户ID
- CommandName: 命令名称(如LINE, CIRCLE)
- CommandData: 命令参数(JSON格式)
- Timestamp: 执行时间
消息协议
WebSocket消息格式(JSON):
{
"type": "command",
"command": "LINE_COMMAND",
"user": "userA",
"data": {
"entity_guid": "XXX-XXX-XXX",
"entity_type": "AcDbLine",
"start_point": {"X": 0, "Y": 0, "Z": 0},
"end_point": {"X": 100, "Y": 100, "Z": 0},
"properties": {
"Layer": "0",
"Color": 1,
"Linetype": "ByLayer",
"LinetypeScale": 1.0,
"LineWeight": 100
}
}
}GUID映射机制
系统使用GUID(全局唯一标识符)来关联不同用户AutoCAD中的实体:
用户A 用户B
| |
v v
创建实体 → handle=2B1, guid=XXX → 创建实体 → handle=3C5, guid=XXX
| |
v v
修改实体 → 发送guid=XXX → 接收 → 通过guid查找 → handle=3C5
| |
v v
发送修改参数 应用修改日志文件
插件日志文件位置:C:\Users\Administrator\AppData\Local\Temp
日志文件名:
acad_collab_plugin_userA.log- 用户A的日志acad_collab_plugin_userB.log- 用户B的日志- 服务端日志在控制台输出
编译服务端
cd server
go run main.go编译AutoCAD插件
前置条件:
- AutoCAD 2024 或更高版本(修改.csproj中的HintPath适配你的AutoCAD版本)
- .NET Framework 4.8 SDK
- Visual Studio 2022 或更高版本
编译步骤:
- 安装 ObjectARX SDK 到
D:\Program Files\Autodesk\ObjectARX_for_AutoCAD_2024_Win_64bit_dlm - 打开 Visual Studio
- 加载
autocad-plugin/AcadCmdIntercept/AcadCmdIntercept.sln - 选择 Release|x64 配置
- 编译生成 ARX 文件
生成的文件:
autocad-plugin/AcadCmdIntercept/bin/x64/Release/AcadCmdIntercept.arxautocad-plugin/AcadCmdIntercept/bin/x64/Release/collab_config.json(配置文件)
ObjectARX开发最佳实践
事务管理:
- 使用
acdbTransactionManager->startTransaction()开始事务 - 使用
pTr->getObject()在事务中打开对象 - 使用
acdbTransactionManager->endTransaction()提交事务 - 使用
acdbTransactionManager->abortTransaction()回滚事务
- 使用
新对象创建:
- 创建新对象后,先设置属性(包括GUID)
- 使用
appendAcDbEntity()添加到模型空间 - 使用
acdbTransactionManager->addNewlyCreatedDBRObject()管理对象所有权
XData设置:
- 使用
acutNewString()正确分配字符串内存 - 使用
acutNewRb()创建resbuf - 使用
acutRelRb()释放resbuf - 不要直接使用
wcscpy_s到resbuf的字符串字段
- 使用
属性同步:
- 所有属性都要显式设置,不要跳过特殊值
- 检查图层、线型是否存在后再设置
- 使用正确的线宽枚举值
这个计划了很久,就像我那个go-mapus地图协作一样,自己觉得挺有意思的一些尝试,然后也就会路线出现不少同种类的实现方式,越多越好,很多人做才会更加趋熟。
最开始TRAE solo用C#写,花了2个晚上跑通了几个CAD绘图命令的协作同步,后面进入到编辑命令组开发时,说C#无法获取用户鼠标操作反馈……那我问它C++能否做到,它查询一番,说可以,然后为了减少开发量,就沿用C#调用C++的方案,因为舍不得已经编写和调试了的C#嘛,但是CAD要加载2个文件,我感觉麻烦,还是下决心直接全部改为C++来开发了。这个仅编译为ARX,添加到加载启动组里,效果也最好。
bilibili视频展示autocad2024协作平台开发
autocad2024协作之夹点拖动、阵列命令同步
最后编辑:秦晓川 更新时间:2026-06-20 21:29