找回密码
 立即注册

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 790|回复: 2

[图文教程] 网页版CAD(WEB CAD SDK)绘制的批注信息如何保存到图纸上

[复制链接]

299

主题

20

回帖

3984

积分

中尉

积分
3984

活跃会员

发表于 2023-12-22 16:32:47 | 显示全部楼层 |阅读模式
前言
用户在网页中浏览编辑DWG图纸之后,会在图纸上进行审图批注,批注的内容会保存到服务器或原图纸中,本章节我们讲一下保存批注信息的方法,如果你还不会创建一个在线浏览编辑CAD图纸的前端应用,请参考使用:
MxDraw云图开发包的文档:https://help.mxdraw.com/?pid=32
mxcad库: https://mxcadx.gitee.io/mxcad_docs/zh/
操作界面如下:
微信图片_20231218143700.png
实现步骤
用mxdraw绘制的批注图形,要保存到图纸上, 需要使用MxDraw云图开发包中对应服务进行保存 下面将详细讲解保存图纸批注的每一步。
首先下载MxDraw云图开发包开发包, 然后解压。可得到一个解压后的目录MxDrawCloudServer, 进入该目录, 运行Mx3dServer.exe软件。
点击按钮开始服务,再点击按钮VueBrowse 会加载一个网页,这个网页加载了一个在线浏览的图纸。            
该网页的源码在开发包的MxDrawCloudServer\SRC\sample\Browse\2d\Browse目录, 在该目录下找到 src\test\SaveDwg.ts文件, 代码如下:
  1. let mxobj = MxFun.getCurrentDraw();

  2.   let saveData:any = mxobj.saveMxEntityToObject(true);

  3.   saveData.savefile = "../../SRC/TsWeb/public/demo/hhhhnew.dwg";

  4.   saveData.filename = "../../SRC/TsWeb/public/demo/hhhh.dwg";



  5.   console.log(saveData);

  6.   //前端附带身份凭证的请求,服务器Access-Control-Allow-Origin 设为*不会生效.

  7.   //所以需要  $api.defaults.withCredentials = false

  8.   $api.defaults.withCredentials = false

  9.     //$api.post("http://localhost:1337/savecomment", {

  10.     $api.post(MxFun.getHostUrl() + ":1337/savecomment", {

  11.     param: saveData

  12.   }).then((response: any) => {

  13.     if(response.data.ret == 0)

  14.     {

  15.       // 后台程序TsWebNodejs\routes\savedwg.js,它会调用MxFileConvert.exe使用MxDrawNode\src\mxconvert\SaveCommentToDwg.ts把批注数据,保存到demo目录下的hhhhnew.dwg文件中.

  16.       const sSaveUrl = MxFun.getHostUrl() + ":3000/demo/hhhhnew.dwg";

  17.       alert("保存成功,新文件下载地址:" + sSaveUrl);

  18.     }

  19.     else{

  20.       alert("保存失败,错误码:" + response.data.ret);

  21.       console.log(response.data);

  22.     }

  23.   })

  24.   .catch((error: any)=> {

  25.     alert("保存失败")

  26.   });
复制代码
保存批注使用mxdraw提供的方法MxFun.getCurrentDraw().saveMxEntityToObject() 得到一个JSON对象, 包含了页面中绘制的所有批注数据。
保存的两种方式
第一种方式是将这个数据保存在服务器的数据库中,再次打开这张图纸的时候,再去请求得到对应的批注数据,通过MxFun.getCurrentDraw().loadMxEntityFromJson(jsonString)在前端页面中直接恢复对应的批注。
第二种方式是直接保存到图纸上, 从上面代码得知,我们得到了所有批注数据的对象,在这个对象上设置了savefile 表示保存了包含了批注的新图纸服务器上的地址。而filename就是现在网页上打开的图纸的原图纸在服务器上的地址。
然后发起了一个post请求, 下面我们看看在服务器中是如何处理的。
首先我们在开发包中找到MxDrawCloudServer\Bin\MxDrawServer\Windows\routes\savecomment.js
里就是这个post请求接口定义的位置:
  1. param.cmd = "savecomment";

  2. (0, convert_1.callMxNodeJS)(param, (ret) => {

  3.     res.json(ret);

  4. });
复制代码
接下来我们找到callMxNodeJS这个函数, 在同目录下的convert.js文件中:
  1. function callMxNodeJS(param, retcall) {

  2.     if (!param["cmd"]) {

  3.         retcall({ code: 6, message: "param.cmd empty" });

  4.         return;

  5.     }

  6.     let converparamFile;

  7.     if (param["file"]) {

  8.         if (mxconfig_1.default.isAbsolutePath(param.file)) {

  9.             converparamFile = param.file + "_param.json";

  10.         }

  11.         else {

  12.             converparamFile = mxconfig_1.default.getUploadPath() + param.file + "_param.json";

  13.         }

  14.     }

  15.     else {

  16.         converparamFile = mxconfig_1.default.getUploadPath() + createUuid() + "_param.json";

  17.     }

  18.     converparamFile = converparamFile.replace(/\\/g, '/');

  19.     param = JSON.stringify(param);

  20.     fs.writeFile(converparamFile, param, function (error) {

  21.         if (error) {

  22.             retcall({ code: 2, message: "write param file error" });

  23.             //fs.unlink(converparamFile);

  24.             return;

  25.         }

  26.         var pathConvertExt = '"' + mxconfig_1.default.getMxNodeAppPath() + '"';

  27.         var pathMxconvertJs = mxconfig_1.default.getMxBinPath() + "mxconvert.js";

  28.         //var cmdparam = '"' + pathMxconvertJs + '"' + ' "{\"paramfile\":\"' + converparamFile + '\"}"';

  29.         var cmdparam = '"' + pathMxconvertJs + '"' + ' fileparam filepath="' + converparamFile + '"';

  30.         var cmd = pathConvertExt + " " + cmdparam;

  31.         const exec = child_process.exec;

  32.         exec(cmd, (err, stdout, stderr) => {

  33.             if (err) {

  34.                 retcall({ code: 3, message: "exec cmd failed" });

  35.             }

  36.             else {

  37.                 try {

  38.                     let index = stdout.lastIndexOf("{");

  39.                     if (index != -1) {

  40.                         stdout = stdout.substr(index);

  41.                     }

  42.                     let retCmd = JSON.parse(stdout);

  43.                     retCmd.code = 0;

  44.                     if (retCmd["resultfile"]) {

  45.                         let strparam = fs.readFileSync(retCmd["resultfile"]);

  46.                         if (strparam) {

  47.                             let paramobj = JSON.parse(strparam);

  48.                             retCmd.resultfile = paramobj;

  49.                         }

  50.                     }

  51.                     if (retCmd["ret"] && retCmd["ret"] != 0)

  52.                         retCmd.code = 7;

  53.                     retcall(retCmd);

  54.                 }

  55.                 catch (err) {

  56.                     console.log(err);

  57.                     retcall({ code: 5, message: "exec cmd return error" });

  58.                 }

  59.             }

  60.         });

  61.     });

  62. }
复制代码
可以看见,这里在组装参数, 然后运行mxconvert.js这个文件, 要找到这个文件的位置,我们要看mxconfig_1.default.getMxBinPath()这个函数的返回值。
这个方法在MxDrawCloudServer\Bin\MxDrawServer\Windows\mxconfig.js中,最终我们可用的返回值是在同目录下的ini.js中配置的:
  1. function MxINI() {

  2.     this.uploadPath = "./public/file/";

  3.     this.mxbinPath = "../../Release/";

  4.     //    ...

  5. };

  6. var mxIni = new MxINI();

  7. module.exports = mxIni;
复制代码
如上所知, callMxNodeJS函数运行的就是这个文件MxDrawCloudServer\Bin\Release\mxconvert.js
  1. // 加载梦想控件服务程序

  2. var mxweb = require('./MxNode.node');

  3. var Mx2D = require('./Mx2DNode.node');

  4. // 加载消息处理程序

  5. var mxFun = require('./mxfun');



  6. try{

  7.     const mxDraw_1 = require("./mxdraw/MxDraw");

  8.     mxDraw_1.init(mxFun, Mx2D);



  9.     var MxConvert_1 = require('./mxconvert/MxConvert');



  10.     const args = process.argv.slice(2);



  11.     if(args.length == 0){

  12.         console.log(mxweb.getVersionInformation());

  13.     }

  14.     else

  15.     {

  16.         MxConvert_1.Call(args);

  17.     }

  18. }

  19. catch(err)

  20. {

  21. console.log(err);

  22. }

  23. mxweb.stopAll();
复制代码
篇幅限制,更多的内容请查询梦想CAD控件
注意以上代码为代码片段,请自行下载MxDraw云图开发包按照上文步骤了解保存批注的整个实现流程和实现细节。

6

主题

2520

回帖

8298

积分

少校

积分
8298
发表于 2024-2-1 14:57:25 | 显示全部楼层
感谢大佬啊!

1

主题

2352

回帖

6579

积分

上尉

积分
6579
发表于 2024-3-23 18:03:42 | 显示全部楼层
感谢分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

咨询QQ:1359218528|发帖须知!|Archiver|手机版|小黑屋|UG爱好者论坛 ( 京ICP备10217105号-2 )

GMT+8, 2024-12-29 01:49

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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