网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

前言

用户在网页中浏览编辑DWG图纸之后,会在图纸上进行审图批注,批注的内容会保存到服务器或原图纸中,本章节我们讲一下保存批注信息的方法,如果你还不会创建一个在线浏览编辑CAD图纸的前端应用,请参考使用:
MxDraw云图开发包的文档:https://help.mxdraw.com/?pid=32
mxcad库:https://mxcadx.gitee.io/mxcad_docs/zh/

在线功能测试:https://demo.mxdraw3d.com:3000/mxcad/

操作界面如下:



实现步骤

用mxdraw绘制的批注图形,要保存到图纸上, 需要使用MxDraw云图开发包中对应服务进行保存 下面将详细讲解保存图纸批注的每一步。

首先下载MxDraw云图开发包(https://gitee.com/link?target=https%3A%2F%2Fwww.mxdraw.com%2Fdownload.html)开发包, 然后解压。可得到一个解压后的目录MxDrawCloudServer, 进入该目录, 运行Mx3dServer.exe软件。

点击按钮开始服务,再点击按钮VueBrowse 会加载一个网页,这个网页加载了一个在线浏览的图纸。

该网页的源码在开发包的MxDrawCloudServer\SRC\sample\Browse\2d\Browse目录, 在该目录下找到src\test\SaveDwg.ts文件, 代码如下:

  • let mxobj = MxFun.getCurrentDraw();
  • let saveData:any = mxobj.saveMxEntityToObject(true);
  • saveData.savefile = "../../SRC/TsWeb/public/demo/hhhhnew.dwg";
  • saveData.filename = "../../SRC/TsWeb/public/demo/hhhh.dwg";

  • console.log(saveData);
  • //前端附带身份凭证的请求,服务器Access-Control-Allow-Origin 设为*不会生效.
  • //所以需要 $api.defaults.withCredentials = false
  • $api.defaults.withCredentials = false
  • //$api.post("http://localhost:1337/savecomment", {
  • $api.post(MxFun.getHostUrl() + ":1337/savecomment", {
  • param: saveData
  • }).then((response: any) => {
  • if(response.data.ret == 0)
  • // 后台程序TsWebNodejs\routes\savedwg.js,它会调用MxFileConvert.exe使用MxDrawNode\src\mxconvert\SaveCommentToDwg.ts把批注数据,保存到demo目录下的hhhhnew.dwg文件中.
  • const sSaveUrl = MxFun.getHostUrl() + ":3000/demo/hhhhnew.dwg";
  • alert("保存成功,新文件下载地址:" + sSaveUrl);
  • else{
  • alert("保存失败,错误码:" + response.data.ret);
  • console.log(response.data);
  • .catch((error: any)=> {
  • alert("保存失败")

保存批注使用mxdraw提供的方法MxFun.getCurrentDraw().saveMxEntityToObject()得到一个JSON对象, 包含了页面中绘制的所有批注数据。

保存的两种方式

第一种方式是将这个数据保存在服务器的数据库中,再次打开这张图纸的时候,再去请求得到对应的批注数据,通过MxFun.getCurrentDraw().loadMxEntityFromJson(jsonString)在前端页面中直接恢复对应的批注。

第二种方式是直接保存到图纸上, 从上面代码得知,我们得到了所有批注数据的对象,在这个对象上设置了savefile表示保存了包含了批注的新图纸服务器上的地址。而filename就是现在网页上打开的图纸的原图纸在服务器上的地址。

然后发起了一个post请求, 下面我们看看在服务器中是如何处理的。

首先我们在开发包中找到MxDrawCloudServer\Bin\MxDrawServer\Windows\routes\savecomment.js

这里就是这个post请求接口定义的位置:

  • param.cmd = "savecomment";
  • (0, convert_1.callMxNodeJS)(param, (ret) => {
  • res.json(ret);

接下来我们找到callMxNodeJS这个函数, 在同目录下的convert.js文件中:

  • function callMxNodeJS(param, retcall) {
  • if (!param["cmd"]) {
  • retcall({ code: 6, message: "param.cmd empty" });
  • return;
  • let converparamFile;
  • if (param["file"]) {
  • if (mxconfig_1.default.isAbsolutePath(param.file)) {
  • converparamFile = param.file + "_param.json";
  • else {
  • converparamFile = mxconfig_1.default.getUploadPath() + param.file + "_param.json";
  • else {
  • converparamFile = mxconfig_1.default.getUploadPath() + createUuid() + "_param.json";
  • converparamFile = converparamFile.replace(/\\/g, '/');
  • param = JSON.stringify(param);
  • fs.writeFile(converparamFile, param, function (error) {
  • if (error) {
  • retcall({ code: 2, message: "write param file error" });
  • //fs.unlink(converparamFile);
  • return;
  • var pathConvertExt = '"' + mxconfig_1.default.getMxNodeAppPath() + '"';
  • var pathMxconvertJs = mxconfig_1.default.getMxBinPath() + "mxconvert.js";
  • //var cmdparam = '"' + pathMxconvertJs + '"' + ' "{\\"paramfile\\":\\"' + converparamFile + '\\"}"';
  • var cmdparam = '"' + pathMxconvertJs + '"' + ' fileparam filepath="' + converparamFile + '"';
  • var cmd = pathConvertExt + " " + cmdparam;
  • const exec = child_process.exec;
  • exec(cmd, (err, stdout, stderr) => {
  • if (err) {
  • retcall({ code: 3, message: "exec cmd failed" });
  • else {
  • try {
  • let index = stdout.lastIndexOf("{");
  • if (index != -1) {
  • stdout = stdout.substr(index);
  • let retCmd = JSON.parse(stdout);
  • retCmd.code = 0;
  • if (retCmd["resultfile"]) {
  • let strparam = fs.readFileSync(retCmd["resultfile"]);
  • if (strparam) {
  • let paramobj = JSON.parse(strparam);
  • retCmd.resultfile = paramobj;
  • if (retCmd["ret"] && retCmd["ret"] != 0)
  • retCmd.code = 7;
  • retcall(retCmd);
  • catch (err) {
  • console.log(err);
  • retcall({ code: 5, message: "exec cmd return error" });

可以看见,这里在组装参数, 然后运行mxconvert.js这个文件, 要找到这个文件的位置,我们要看mxconfig_1.default.getMxBinPath()这个函数的返回值。

这个方法在MxDrawCloudServer\Bin\MxDrawServer\Windows\mxconfig.js中,最终我们可用的返回值是在同目录下的ini.js中配置的:

  • function MxINI() {
  • this.uploadPath = "./public/file/";
  • this.mxbinPath = "../../Release/";
  • var mxIni = new MxINI();
  • module.exports = mxIni;

如上所知,callMxNodeJS函数运行的就是这个文件MxDrawCloudServer\Bin\Release\mxconvert.js

  • // 加载梦想控件服务程序
  • var mxweb = require('./MxNode.node');
  • var Mx2D = require('./Mx2DNode.node');
  • // 加载消息处理程序
  • var mxFun = require('./mxfun');

  • try{
  • const mxDraw_1 = require("./mxdraw/MxDraw");
  • mxDraw_1.init(mxFun, Mx2D);

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

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

  • if(args.length == 0){
  • console.log(mxweb.getVersionInformation());
  • else
  • MxConvert_1.Call(args);
  • catch(err)
  • console.log(err);
  • mxweb.stopAll();

同理,在同目录下找到mxconvert/MxConvert.js

  • function saveComment(param) {
  • let save = new SaveCommentToDWG_1.SaveCommentToDWG();
  • return save.Do(param);
  • function Call(aryParam) {
  • aryCmd["savecomment"] = saveComment;
  • aryCmd[sCmd](cmdParam)

如上,最终我们要在aryParam参数中找到cmd字符串调用对应命令,这里的字符串就是savecomment然后调用new SaveCommentToDWG_1.SaveCommentToDWG().DO()我们可用在同目录下找到SaveCommentToDWG.js

  • class SaveCommentToDWG {
  • Do(param) {
  • if (!param.filename) {
  • return { ret: 1 };
  • if (!param.savefile) {
  • return { ret: 4 };
  • let curPath = Mx2DDraw.getCurrentPath();
  • if (param.userConvertPath) {
  • curPath = Mx2DDraw.getConvertPath();
  • let dwgFilePath = curPath + "/" + param.filename;
  • // 打开dwg文件。
  • if (!mxConvert.openFile(dwgFilePath)) {
  • return { ret: 2 };
  • Mx2DDraw.makeBackgroundToCurrent();
  • this.matDocToCad = new MxMath_1.MathMatrix4d;
  • if (param["matDoc2Cad"]) {
  • this.matDocToCad.fromArray(param.matDoc2Cad.elements);
  • let saveFilePath = curPath + "/" + param.savefile;
  • let entitys = param["entitys"];
  • let i = 0;
  • for (i = 0; i < entitys.length; i++) {
  • // 绘制对象.
  • let ent = entitys[i];
  • if (ent.TypeName == "MxDbLine") {
  • let pt1 = new Mx.McGePoint3dClass();
  • this.DocPt2DCoordToCAD(ent.pt1);
  • pt1.x = ent.pt1.x;
  • pt1.y = ent.pt1.y;
  • let pt2 = new Mx.McGePoint3dClass();
  • this.DocPt2DCoordToCAD(ent.pt2);
  • pt2.x = ent.pt2.x;
  • pt2.y = ent.pt2.y;
  • //Mx2DDraw.setColor([255, 200, 0]);
  • Mx2DDraw.drawLine(pt1, pt2);
  • else if (ent.TypeName == "MxDbLeadComment") {
  • this.DrawMxDbLeadComment(ent, this);
  • else if (ent.TypeName == "MxDbAnyLine") {
  • MxDbAnyLine_1.DrawMxDbAnyline(ent, this);
  • else if (ent.TypeName == "MxDbSplineCurve") {
  • MxDbSplineCurve_1.DrawMxDbSplineCurve(ent, this);
  • else if (ent.TypeName == "MxDbCloudLine") {
  • MxDbCloudLine_1.DrawMxDbCloudLine(ent, this);
  • else if (ent.TypeName == "MxDbRectBoxLeadComment") {
  • MxDbRectBoxLeadComment_1.DrawMxDbRectBoxLeadComment(ent, this);
  • else if (ent.TypeName == "MxDbRect") {
  • MxDbRect_1.DrawMxDbRect(ent, this);
  • else if (ent.TypeName == "MxDbCircle") {
  • MxDbCircle_1.DrawMxDbCircle(ent, this);
  • else if (ent.TypeName == "MxDbEllipse") {
  • MxDbEllipse_1.DrawMxDbEllipse(ent, this);
  • else if (ent.TypeName == "MxDbText") {
  • MxDbText_1.DrawMxDbText(ent, this);
  • else if (ent.TypeName == "MxDbRegularPolygon") {
  • MxDbRegularPolygon_1.DrawMxDbRegularPolygon(ent, this);
  • // 保存图纸
  • if (!mxConvert.writeFile(saveFilePath)) {
  • return { ret: 3 };
  • return { ret: 0 };

如上代码中,将各种不同的批注都绘制到图纸中, 最后将图纸保存在参数提供的savefile中。

我们发现将这些图形绘制在图纸上是通过MxDrawCloudServer\Bin\Release\
MxNode.node和MxDrawCloudServer\Bin\Release\Mx2DNode.node提供的方法调用的, 你可以根据源码中使用方式,完善绘制更多自定义的图形到图纸中。

mxdraw实现自定义批注:点击查看对应文档(https://mxcadx.gitee.io/mxdraw_docs/previewAnnotation/bases.html#%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AA%E8%87%AA%E5%AE%9A%E4%B9%89%E6%89%B9%E6%B3%A8)

查看文档后, 这些批注中的getTypeName方式就是服务端得到的参数TypeName, 其他参数数据就是dwgOut返回的对应的这个图形需要的一些数据, 最终组成这样一个个的批注数据上传到服务器中。服务器根据这些批注数据, 绘制出对应图形到图纸中。

根据上文所述,我们知道了保存批注到图纸中的整个实现,可用参考代码或者直接使用这个接口。

注意以上代码为代码片段,请自行下载MxDraw云图开发包(https://gitee.com/link?target=https%3A%2F%2Fwww.mxdraw.com%2Fdownload.html)按照上文步骤了解保存批注的整个实现流程和实现细节。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
明日五月初一,记得:1不留,2不采,做3事,安康顺利度长夏

明日五月初一,记得:1不留,2不采,做3事,安康顺利度长夏

神牛
2024-06-05 11:13:31
肇庆市原副市长叶锐被查 曾任市公安局长

肇庆市原副市长叶锐被查 曾任市公安局长

南方都市报
2024-06-05 16:11:13
明日五月初一,记得:4事不做,2样不喝,家人少生病,平安过长夏

明日五月初一,记得:4事不做,2样不喝,家人少生病,平安过长夏

牛锅巴小钒
2024-06-05 12:53:58
梁荣业被公诉,曾任东莞多镇“一把手”!

梁荣业被公诉,曾任东莞多镇“一把手”!

正义网
2024-06-05 16:03:58
圆润的小姐姐

圆润的小姐姐

娱乐八卦木木子
2024-06-05 14:14:22
记者谈阿根廷名单:斯卡洛尼对阿库尼亚身体状况有疑虑

记者谈阿根廷名单:斯卡洛尼对阿库尼亚身体状况有疑虑

直播吧
2024-06-05 18:04:18
他率庞大经贸团访华:历史已经驳斥了对中国模式的一切质疑

他率庞大经贸团访华:历史已经驳斥了对中国模式的一切质疑

观察者网
2024-06-05 16:28:30
福建舰有麻烦,美媒:第10艘055刚刚下水

福建舰有麻烦,美媒:第10艘055刚刚下水

良探长娱乐
2024-06-01 19:47:37
妈呀!宋春丽怎么老成这样了呢?

妈呀!宋春丽怎么老成这样了呢?

牛叨小史
2024-06-04 15:43:07
超值!17亿美元换个出海口,柬埔寨不顾美国和越南反对坚持开工

超值!17亿美元换个出海口,柬埔寨不顾美国和越南反对坚持开工

谈芯说科技
2024-06-05 07:46:55
同样是“珍珠妆”,《墨雨云间》与《清平乐》对比,差距一目了然

同样是“珍珠妆”,《墨雨云间》与《清平乐》对比,差距一目了然

室内设计师阿喇
2024-06-05 13:33:51
英媒:在华外企外籍员工不足

英媒:在华外企外籍员工不足

环球时报国际
2024-06-05 06:50:17
原来有钱人下场这么惨!网友:有钱就是噩梦的开始!提前预防一下

原来有钱人下场这么惨!网友:有钱就是噩梦的开始!提前预防一下

侃故事的阿蚌
2024-06-05 13:40:46
马斯克的X现在正式允许出现成人内容

马斯克的X现在正式允许出现成人内容

3DMGAME官方号
2024-06-04 09:11:12
女排3消息:总局回应严查蔡斌,朱婷替身遭网暴,赖亚文意外离队

女排3消息:总局回应严查蔡斌,朱婷替身遭网暴,赖亚文意外离队

排球评论员
2024-06-05 18:06:18
大陆这招比军演更有效,台各界纷纷喊疼,就应该这样收拾“台独”

大陆这招比军演更有效,台各界纷纷喊疼,就应该这样收拾“台独”

青年的背包
2024-06-04 13:11:06
太恐怖!邹雨宸延续自律,暴瘦+形成完美体型,旅游都带训练装备

太恐怖!邹雨宸延续自律,暴瘦+形成完美体型,旅游都带训练装备

篮球资讯达人
2024-06-05 13:45:28
无语!女子拒绝领导潜规则后被踢出工作群,当事人:已经睡了两人

无语!女子拒绝领导潜规则后被踢出工作群,当事人:已经睡了两人

小陆搞笑日常
2024-06-05 12:54:37
5个月后,曼城迎生死判决:或被剥夺3个英超冠军!9年115项违规!

5个月后,曼城迎生死判决:或被剥夺3个英超冠军!9年115项违规!

风过乡
2024-06-05 17:40:49
曾志伟与乔妹合影惹争议!眼神扫过胸部还伸舌头,紧贴肩膀笑意浓

曾志伟与乔妹合影惹争议!眼神扫过胸部还伸舌头,紧贴肩膀笑意浓

娱乐贴士站
2024-06-05 17:43:53
2024-06-05 19:04:49
CAD梦想画图
CAD梦想画图
是一款极速轻量级的CAD软件
573文章数 121关注度
往期回顾 全部

科技要闻

9家车企拿到自动驾驶落地入场券,没特斯拉

头条要闻

菲总统在"香会"批中国言辞激烈 上演"气到说不出话"

头条要闻

菲总统在"香会"批中国言辞激烈 上演"气到说不出话"

体育要闻

赴美试训的崔永熙,表现究竟怎么样?

娱乐要闻

《青春有你》胡文煊被曝孕期出轨

财经要闻

员工证实周大福关闭深圳工厂

汽车要闻

又一个水桶车 试驾新“卷王”极狐阿尔法S5

态度原创

教育
时尚
家居
本地
公开课

教育要闻

“你的名字那么好听”一定要出现在新学校录取通知书上.

眼“屎”妆很上镜,咱悟了!

家居要闻

温室余闲 平仄之间雅趣浓

本地新闻

我和我的家乡|踏浪营口,心动不止一夏!

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版