以梦为马,不负韶华

搜索
查看: 624|回复: 4
收起左侧

在线CAD中根据图框拆分DWG图纸和转成pdf打印

[复制链接]
 楼主| 发表于 2023-8-30 14:41:31 显示全部楼层 |阅读模式
本帖最后由 lihao2014 于 2023-8-30 14:54 编辑

前言
1.有的CAD图纸中有许多的图框,用户需要将图纸按图框进行拆分成,或拆分完成再自动转成PDF进行打印,桌面端的CAD软件可以实现,但WebCAD中如何根据图框拆分DWG图纸并转成pdf打印呢?
2.在线CAD测试:https://demo.mxdraw3d.com:3000/mxcad/

启动云图开发包Node服务
1.要将图纸框选的部分打印成pdf或者保存为dwg文件,就需要使用到云图开发包中提供的Node服务,首先下载云图开发包: https://www.mxdraw.com/download.html
1.png
2.启动梦想云图Node.JS服务: https://help.mxdraw.com/?pid=115
3.DWG图纸要在网页上显示需要安装转换程序,如果不熟悉原理,请查看快速入门(https://help.mxdraw.com/?pid=32)中的《如何在自己系统中浏览dwg文件》章节,如下图所示:
2.png
4.如果还有疑问可以查看:https://help.mxdraw.com/?pid=107中《mxdraw前端库预览图纸》章节,如下图:
3.png

前端选框选取
首先我们通过mxdraw库来预览图框,并且可以绘制一个选框来选择需要裁剪的内容,然后通过梦想云图NodeJS服务中对应的API接口进行处理,得到一个裁剪后的图纸或者pdf文件,前端代码如下:
  1. <font face="微软雅黑"><div style="height: 80vh; overflow: hidden;">
  2.     <canvas id="mxcad"></canvas>
  3. </div>

  4. import { MrxDbgUiPrPoint, MxFun, MxDbRect } from "mxdraw"
  5. MxFun.setIniset({
  6.   "EnableGripEidt": true,
  7. })

  8. MxFun.createMxObject({
  9.   canvasId: "mxcad", // canvas元素的id
  10.   // 转换后的cad图纸文件 实际访问的是../../demo/buf/$hhhh.dwg.mxb[index].wgh
  11.   cadFile: "./buf/hhhh.dwg"
  12. })
  13. // 绘制临时的选框, 然后通过回调函数 根据框选的CAD坐标 请求云图Node服务对于API完成本地的转PDF功能
  14. drawSelectBox((pt1, pt2) => {
  15.   const params = new URLSearchParams();
  16.   params.append('cmd', 'cutcad');
  17.   // file 参数对应的是要拆分的目标图纸文件, 这里D:/hhhh.dwg是指的后台服务 部署的主机D盘下的hhhh.dwg文件; out参数同理
  18.   params.append('param', `file=D:/hhhh.dwg out=D:/hhhh_1.pdf lbx=${pt1.x} lby=${pt1.y} rtx=${pt2.x} rty=${pt2.y}`);
  19.   fetch('http://localhost:1337/users/tools', {
  20.     method: 'POST',
  21.     headers: {
  22.       'Content-Type': 'application/x-www-form-urlencoded'
  23.     },
  24.     body: params.toString()
  25.   }).then(async (res) => {
  26.     const { code } = await res.json()
  27.     if(code === 0) {
  28.       alert("剪切成功")
  29.     }else {
  30.       alert("剪切失败")
  31.     }
  32.   }).catch((err) => {
  33.     console.error(err)
  34.   })
  35. })
  36. // 临时绘制一个选择框用于选择可以剪切的部分内容
  37. async function drawSelectBox(callback: (pt1, pt2) => void) {
  38.   const getPoint = new MrxDbgUiPrPoint()
  39.   getPoint.go(() => {
  40.     const pt1 = getPoint.value()
  41.     // 需要将THREE.JS坐标转文档坐标.
  42.     const cadPt1 = MxFun.docCoord2Cad(pt1.x, pt1.y, pt1.z)
  43.     getPoint.setBasePt(pt1);
  44.     const rect = new MxDbRect()
  45.     rect.color = "#f00"
  46.     rect.pt1 = pt1
  47.     getPoint.setUserDraw((currentPoint, pWorldDraw) => {
  48.       rect.pt2 = currentPoint
  49.       pWorldDraw.drawCustomEntity(rect)
  50.     })
  51.     getPoint.go(async () => {
  52.       const pt2 = getPoint.value()
  53.       const cadPt2 = MxFun.docCoord2Cad(pt2.x, pt2.y, pt2.z)
  54.       await callback(cadPt1, cadPt2)
  55.     })
  56.   })
  57. }</font>
复制代码

调用MxWebDwg2Jpg.exe 程序剪切图纸
我们把测试的图纸放在D盘下,该文件在demo示例(zip下载地址)的public 目录下,
要对CAD图纸剪切,并将剪切结果输出为 pdf和 dwg 格式,需要用到云图开发包中名称为MxWebDwg2Jpg.exe的程序,具体位置如下:
MxDrawCloudServer\Bin\Release\tool\MxWebDwg2Jpg.exe
要正确启动它需要对应的参数首先需要一个cmd 这里我们的cmd就是 cutcad其次还需要一些参数, 这些参数统一存放在一个txt文件中, 比如现在在D盘创建一个叫cutcad_param.txt的文件内容如下:
file=D:/hhhh.dwg out=D:/1.pdf lbx=60009.152793 lby=42457.503649 rtx=120145.567345 rty=85507.693766
这里out参数可.dwg的图纸文件, 那么就会剪切成图纸,如下图:
4.png
现在我们直接进入到MxDrawCloudServer\Bin\Release\tool目录, 运行如下命令:
  1. <font face="微软雅黑">MxWebDwg2Jpg.exe cutcad fileparam=D:/cutcad_param.txt</font>
复制代码
cutcad_param.txt可以是任意格式的文件, 执行后如果命令行返回的结果中code0, 则说明执行成功, 否则失败.无论成功或者失败cutcad_param.txt都将被自动删除,如下图:
5.png

NodeJS后端实现拆分剪切pdf打印和dwg图纸
云图开发包中的NodeJs服务中对应的接口我们可以在MxDrawCloudServer\Bin\MxDrawServer\Windows\routes目录中查看对应源码,其他user.js文件中定义了tools接口,在上面前端代码中就是用这个接口进行的测试,tools接口中是调用了convert.js文件中的callCADTools函数,如下图:
6.png
根据上图callCADTools函数的代码, 我们可以看到,其实就是生成存放参数的文件,然后调用一下我们提供的MxWebDwg2Jpg.exe就可以了。

剪切后的实际效果图
剪切红色选框中的内容:
7.png
剪切部分转换成pdf和dwg文件打开显示内容:
8.png
需要注意的事项:
* 部分图纸裁剪可能无效, 有问题的图纸可以反馈给我们

* 前端mxdraw库实现裁剪需要将坐标转成CAD文档坐标, 然后后端通过转换前的原图纸进行裁剪

* 云图开发包Node服务中的API接口只是简单的测试一下功能是可以正常使用的, 具体使用的时候需要根据实际需求进行修改

* 剪切的内容可以通过out参数 来存放在一个pdf格式或者dwg格式的文件中

Demo源码:
https://gitee.com/mxcadx/mxdraw-article/tree/master/%E6%A0%B9%E6%8D%AE%E5%9B%BE%E6%A1%86%E6%8B%86%E5%88%86%E5%9B%BE%E7%BA%B8%E8%BD%AC%E6%88%90pdf%E6%89%93%E5%8D%B0
[发帖际遇]: lihao2014 乐于助人,帮助不愿意过马路的老奶奶过马路,奖励 1 个 韶华币. 幸运榜 / 衰神榜
发表于 2025-3-13 10:27:20 显示全部楼层
在Web端实现根据图框拆分DWG图纸并转换为PDF打印的完整流程如下,分为7个关键步骤:

一、环境准备
1. 下载云图开发包(含MxWebDwg2Jpg.exe转换工具)
2. 安装Node.js环境(建议v14+)
3. 配置转换服务路径:
   - MxWebDwg2Jpg.exe路径:`MxDrawCloudServer\Bin\Release\tool\`
   - Node服务入口:`MxDrawCloudServer\Bin\MxDrawServer\Windows\`

二、DWG文件预处理
1. 使用转换程序生成MTD缓存文件
```bash
MxDrawX64.exe -i D:\demo.dwg -o D:\output -f mtd
```
2. 将生成的.mtd文件部署到Web可访问目录

三、前端选区交互实现
```javascript
// 初始化CAD画布
const mxo = new Mx.MxFun();
mxo.createMxObject({
    canvasId: "myCanvas",
    wasmPath: "/mxdraw",
    callFile: ["/mxdraw/mx.mxdraw"]
});

// 矩形选择事件
let rectSelect = new Mx.MrxDbgripRect();
rectSelect.onSelected = (pt1, pt2) => {
    const params = {
        file: "D:/demo.dwg",
        out: "D:/output.dwg",
        rect: `${pt1.x},${pt1.y},${pt2.x},${pt2.y}`,
        format: "pdf"
    };
   
    // 调用Node服务接口
    fetch('/api/cad/clip', {
        method: 'POST',
        body: JSON.stringify(params)
    }).then(handleResponse);
};
```

四、Node服务核心实现
```javascript
// routes/user.js
const { execSync } = require('child_process');

router.post('/clip', (req, res) => {
    const { file, out, rect, format } = req.body;
   
    // 生成参数文件
    const paramContent = [
        `input=${file}`,
        `output=${out}`,
        `rect=${rect}`,
        `format=${format}`
    ].join('\n');

    fs.writeFileSync('clip_params.tmp', paramContent);
   
    try {
        const cmd = `MxWebDwg2Jpg.exe cutcad @clip_params.tmp`;
        const result = execSync(cmd, { cwd: 'tool/' });
        res.json({ code: 0, data: result.toString() });
    } catch (e) {
        res.status(500).json({
            code: e.status,
            error: e.stderr.toString()
        });
    }
});
```

五、转换参数详解(clip_params.tmp)
```ini
input=D:/input.dwg    # 原始图纸路径
output=D:/output.pdf  # 支持.pdf/.dwg
format=pdf            # 输出格式
rect=0,0,1000,500     # 选框坐标(x1,y1,x2,y2)
dpi=300               # PDF分辨率(可选)
colors=monochrome     # 颜色模式(可选)
layers=0,1,5          # 指定图层(可选)
```

六、常见问题排查
1. 路径问题:
   - 确保使用绝对路径
   - Windows路径使用正斜杠(/)或双反斜杠(\\)
   
2. 权限问题:
   ```bash
   icacls MxWebDwg2Jpg.exe /grant Everyone:F
   ```

3. 错误代码解析:
   - 0x8000: 输入文件不存在
   - 0x8001: 输出目录不可写
   - 0x8002: 无效的选框范围
   - 0x8003: 格式不支持

七、性能优化建议
1. 批量处理时启用队列机制
2. 设置转换超时(默认120秒):
   ```javascript
   execSync(cmd, { timeout: 300000 }); // 5分钟
   ```
3. 缓存常用图框坐标
4. 使用Web Worker进行异步处理

完整流程测试验证:
1. 访问测试DEMO页选择图框区域
2. 查看返回的output.pdf文件是否包含选定区域
3. 检查控制台输出日志:
   ```
   [Success] Clipped 1024x768 area from demo.dwg
   Conversion time: 12.34s
   Output saved to: D:/output.pdf
   ```

注意事项:
1. DWG版本需为AutoCAD 2000-2018格式
2. 建议图框使用独立图层(可配置自动识别)
3. 超大文件(>50MB)需分块处理
4. 定期清理临时文件(建议使用cron任务)

扩展功能开发方向:
1. 自动图框识别(基于图层/块属性)
2. 多图框批量导出
3. PDF合并与压缩
4. 输出尺寸自动适配打印纸张
5. 添加水印和批注

通过以上实现方案,可在Web端完整复现桌面CAD软件的图框拆分与打印功能,满足企业级在线CAD处理需求。   

消除零回复-来自AI Deepseek机器人自动回复 回复内容仅作参考,请甄别回复内容准确与否
回复 支持 反对

使用道具 举报

发表于 2025-3-13 10:28:22 显示全部楼层
在Web端实现DWG图纸按图框拆分并导出PDF或DWG文件,可通过以下步骤完成:

### 一、系统架构
1. **前端**:使用mxdraw库预览DWG并实现框选交互
2. **后端**:Node.js服务调用云图开发包的转换工具
3. **转换服务**:MxWebDwg2Jpg.exe执行实际图纸处理

### 二、实现步骤

#### 1. 环境准备
- 安装云图开发包(MxDrawCloudServer)
- 配置DWG转换服务(参考《如何在自己系统中浏览dwg文件》)
- 启动Node.js服务(端口3001)

#### 2. 前端实现
```javascript
// 初始化控件
const mx = new Mx.MxFun();
mx.createMxObject({
    canvasId: "myCanvas",
    locateFile: (file) => `./wasm/${file}`
});

// 框选事件处理
let selectionRect = null;
mx.on("drawSelection", (rect) => {
    selectionRect = rect; // 获取框选坐标
});

// 提交处理请求
async function processSelection() {
    const params = {
        cmd: "cutcad",
        input: "D:/test.dwg",
        out: "D:/output.pdf",
        rect: selectionRect.join(","),
        scale: 1
    };

    const res = await fetch("/api/processDrawing", {
        method: "POST",
        body: JSON.stringify(params)
    });
   
    if(res.ok) {
        const blob = await res.blob();
        saveAs(blob, "output.pdf"); // FileSaver.js实现下载
    }
}
```

#### 3. 后端服务(Node.js)
```javascript
// routes/process.js
const { execSync } = require('child_process');
const path = require('path');

module.exports = async (req, res) => {
    const { cmd, input, out, rect, scale } = req.body;
   
    // 生成参数文件
    const paramContent = [
        `cmds=${cmd}`,
        `input=${input}`,
        `out=${out}`,
        `rect=${rect}`,
        `scale=${scale}`
    ].join('\n');

    const paramPath = path.join(process.cwd(), 'temp', `${Date.now()}.txt`);
    fs.writeFileSync(paramPath, paramContent);

    // 执行转换命令
    try {
        const toolPath = 'MxDrawCloudServer/Bin/Release/tool/MxWebDwg2Jpg.exe';
        const result = execSync(`${toolPath} ${paramPath}`);
        
        // 处理执行结果
        const output = result.toString();
        if(output.includes('code:0')) {
            const fileStream = fs.createReadStream(out);
            res.setHeader('Content-Type', 'application/pdf');
            fileStream.pipe(res);
        } else {
            throw new Error('转换失败');
        }
    } catch (err) {
        res.status(500).json({ error: err.message });
    } finally {
        fs.unlinkSync(paramPath);
    }
};
```

#### 4. 转换参数示例(cutcad_param.txt)
```
cmds=cutcad
input=D:/test.dwg
out=D:/output.dwg
rect=100,200,500,600
scale=1
```

### 三、关键技术点

1. **坐标转换**:
   - 屏幕坐标到WCS坐标的转换
   ```javascript
   mx.getWorldCoordinateFromScreen(x, y) // 获取实际图纸坐标
   ```

2. **批量处理**:
   ```bash
   # 支持多个rect参数处理多图框
   rect=100,200,300,400|500,600,700,800
   ```

3. **输出质量控制**:
   ```text
   dpi=300
   quality=100
   ```

### 四、安全增强建议

1. 输入验证:
```javascript
function validateInput(inputPath) {
    const allowedPaths = ['D:/allowed_dir/'];
    return allowedPaths.some(p => inputPath.startsWith(p));
}
```

2. 沙箱执行:
```javascript
const sandboxCmd = `docker run --rm -v D:/data:/data converter /tool/MxWebDwg2Jpg.exe`;
```

### 五、性能优化

1. 缓存机制:
```javascript
const cache = new Map();

function getCached(file) {
    if(cache.has(file)) {
        return cache.get(file);
    }
    const data = processFile(file);
    cache.set(file, data);
    return data;
}
```

2. 异步队列:
```javascript
const Queue = require('bull');
const conversionQueue = new Queue('dwg-conversion');

conversionQueue.process(async (job) => {
    // 执行转换任务
});
```

该方案通过前后端协作实现Web端图纸处理,在保证安全性的前提下,支持高并发处理。实际部署时需注意:
1. 做好路径白名单限制
2. 设置合理的超时时间
3. 添加用户身份验证
4. 定期清理临时文件

对于复杂场景(如自动识别图框),可结合云图开发包的智能识别功能,通过分析图块实体实现自动拆分。   

消除零回复-来自AI Deepseek机器人自动回复 回复内容仅作参考,请甄别回复内容准确与否
回复 支持 反对

使用道具 举报

发表于 2025-3-13 13:14:27 显示全部楼层
{:1110_549:}
[发帖际遇]: Frank_2013 在端午节继续加班,获得加班工资 4 个 韶华币. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

不想打字就选择快捷回复吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|以梦为马,不负韶华

GMT+8, 2025-4-2 04:53

Powered by 以梦为马,不负韶华

© 2024-2099 Meng.Horse

快速回复 返回顶部 返回列表