二维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的日志
  • 服务端日志在控制台输出

协作流程:

  1. 用户A在AutoCAD中打开要协作的dwg文件(需要先保存)
  2. 输入 COLLABSTART,输入用户名(如 “userA”)
  3. 用户B在另一台机器(或另一AutoCAD实例)打开同一个文件名的dwg文件
  4. 用户B也输入 COLLABSTART,输入用户名(如 “userB”)
  5. 系统自动识别相同文件名并加入同一协作会话
  6. 用户A绘制直线、圆等图形,用户B的AutoCAD中会自动同步显示

4.4 注意事项

  1. 文件一致性: 协作前确保所有用户使用相同的基础dwg文件
  2. 对象Handle: 修改操作(MOVE/ERASE/ROTATE/SCALE)依赖对象Handle,不同文件可能Handle不同
  3. 冲突处理: 目前无自动冲突解决机制,建议用户分工协作不同区域
  4. 网络要求: 服务端需要可被所有客户端访问
  5. autocad出现弹窗“此图形中的一个或多个对象无法保存为指定格式。操作未完成,因此未创建任何文件。”:新建的图纸可以了
  6. 当无法保存文件时:说明某个实例未完成操作。可以全选,将内容拷贝到新cad文件里试试保存。
  7. 插件多个日志文件所在地: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 或更高版本

编译步骤:

  1. 安装 ObjectARX SDK 到 D:\Program Files\Autodesk\ObjectARX_for_AutoCAD_2024_Win_64bit_dlm
  2. 打开 Visual Studio
  3. 加载 autocad-plugin/AcadCmdIntercept/AcadCmdIntercept.sln
  4. 选择 Release|x64 配置
  5. 编译生成 ARX 文件

生成的文件:

  • autocad-plugin/AcadCmdIntercept/bin/x64/Release/AcadCmdIntercept.arx
  • autocad-plugin/AcadCmdIntercept/bin/x64/Release/collab_config.json(配置文件)

ObjectARX开发最佳实践

  1. 事务管理

    • 使用acdbTransactionManager->startTransaction()开始事务
    • 使用pTr->getObject()在事务中打开对象
    • 使用acdbTransactionManager->endTransaction()提交事务
    • 使用acdbTransactionManager->abortTransaction()回滚事务
  2. 新对象创建

    • 创建新对象后,先设置属性(包括GUID)
    • 使用appendAcDbEntity()添加到模型空间
    • 使用acdbTransactionManager->addNewlyCreatedDBRObject()管理对象所有权
  3. XData设置

    • 使用acutNewString()正确分配字符串内存
    • 使用acutNewRb()创建resbuf
    • 使用acutRelRb()释放resbuf
    • 不要直接使用wcscpy_s到resbuf的字符串字段
  4. 属性同步

    • 所有属性都要显式设置,不要跳过特殊值
    • 检查图层、线型是否存在后再设置
    • 使用正确的线宽枚举值

这个计划了很久,就像我那个go-mapus地图协作一样,自己觉得挺有意思的一些尝试,然后也就会路线出现不少同种类的实现方式,越多越好,很多人做才会更加趋熟。

最开始TRAE solo用C#写,花了2个晚上跑通了几个CAD绘图命令的协作同步,后面进入到编辑命令组开发时,说C#无法获取用户鼠标操作反馈……那我问它C++能否做到,它查询一番,说可以,然后为了减少开发量,就沿用C#调用C++的方案,因为舍不得已经编写和调试了的C#嘛,但是CAD要加载2个文件,我感觉麻烦,还是下决心直接全部改为C++来开发了。这个仅编译为ARX,添加到加载启动组里,效果也最好。
bilibili视频展示autocad2024协作平台开发
autocad2024协作之夹点拖动、阵列命令同步

作者:秦晓川  创建时间:2026-05-21 09:19
最后编辑:秦晓川  更新时间:2026-06-20 21:29
上一篇:
下一篇: