明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 284|回复: 0

Web cad(私有云CAD SDK)中实现插入图块的方法

[复制链接]
发表于 2023-10-7 16:25 | 显示全部楼层 |阅读模式
前言
CAD制图的过程中会有很多重复的图元需要绘制,为了节约绘制时间,我们会把部分图元保存成图块,下次就可以快速和多次的插入到相应的图纸位置中,提高绘图效率,在线CAD功能demo:https://demo.mxdraw3d.com:3000/mxcad/
网页版CAD页面中要实现插入图块功能,首先需要将这个图块dwg文件转换成mxweb文件,我们需要下载MxDraw云图开发包,根据入门文档的操作, 实现dwg文件到mxweb文件的转换, 让它支持在页面中显示。

下载试用包之后,我们按下图所示dwg文件转成mxweb文件:
更多关于图纸转换程序的使用说明可以参考入门文档或者mxcad文档-图纸转换
有了mxweb文件,就可以通过mxcad npm包实现插入图块功能。
注意:无论是图纸还是图块 最终转换后都是mxweb文件。
在阅读了mxcad文档-快速入门, 你可以自己按照步骤去实现页面加载mxweb文件显示图纸,也可以直接下载或者参考我们提供的示例源码
实现插入图块功能
我们就基于示例源码vite目录这个由vite打包工具使用mxcad的初始化示例项目为例 来开始实现一个插入图纸的功能,代码如下:
  1. import { createMxCad } from "mxcad"

  2. (async ()=> {

  3.     const mxcad = await createMxCad({

  4.         canvas: "#myCanvas",

  5.         locateFile: (fileName) => {

  6.             return new URL(`/node_modules/mxcad/dist/wasm/${mode}/${fileName}`, import.meta.url).href

  7.         },

  8.         fileUrl: new URL("../public/test2.mxweb", import.meta.url).href,

  9.         fontspath: new URL("../node_modules/mxcad/dist/fonts", import.meta.url).href,

  10.     })



  11.     // 这里用定时器是保证稳定的测试, 正常来说是在需要的时候调用就好

  12.     setTimeout(async () => {

  13.         // 加载图块转换的mxweb文件

  14.         let blkrecId = await mxcad.insertBlock(new URL("../public/tree.mxweb", import.meta.url).href, "tree");



  15.         // id是否有效

  16.         if (!blkrecId.isValid()) {

  17.             return;

  18.         }

  19.         // 实例化一个块

  20.         let blkRef = new McDbBlockReference();

  21.         // 将加载的图块ID赋值给它

  22.         blkRef.blockTableRecordId = blkrecId;

  23.         // 然后计算一下这个块的包围盒

  24.         let box = blkRef.getBoundingBox();

  25.         if (box.ret) {

  26.             let dLen = box.maxPt.distanceTo(box.minPt);

  27.             // 如果图块包围盒特别小

  28.             if (dLen > 0.00001) {

  29.                 // 则需要放大

  30.                 blkRef.setScale(mxcad.getMxDrawObject().screenCoordLong2Doc(100) / dLen);

  31.             }

  32.         }



  33.         // 这里开始做用户交互

  34.         let getPoint = new MxCADUiPrPoint();

  35.         getPoint.setMessage("\指定插入基点");



  36.         // 动态绘制这个图块

  37.         getPoint.setUserDraw((v, worldDraw) => {

  38.             blkRef.position = v;

  39.             worldDraw.drawMcDbEntity(blkRef);

  40.         });



  41.         // 用户鼠标点击时得到位置

  42.         let pt = await getPoint.go();

  43.         if (!pt) return;

  44.         blkRef.position = pt;

  45.         // 绘制这个图块

  46.         mxcad.drawEntity(blkRef);

  47.     }, 1000)

  48. })()
复制代码
效果如下图:
这样我们就完成了图块的插入。
DEMO源码:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-7 22:16 , Processed in 0.399530 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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