在线CAD二次开发块表(网页预览编辑cad插件)

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
性能测试 PTS,5000VUM额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 网页CAD二次开发块表,在DWG数据库中,所有图块都存放在块表McDbBlockTable()中,块表中每一条记录称为图块记录对象McDbBlockTableRecord(),图块记录中存放着所有实体数据,用户可以通过改变图块的属性设置来修改其对应着的实体数据。

前言

在DWG数据库中,所有图块都存放在块表McDbBlockTable()中,块表中每一条记录称为图块记录对象McDbBlockTableRecord(),图块记录中存放着所有实体数据,用户可以通过改变图块的属性设置来修改其对应着的实体数据。

块表操作

1.获取当前控件的数据库块表
我们可以通过调用 mxcad 中的MxCpp.getCurrentMxCAD()得到当前的控件, 然后调用控件实例的getDatabase()方法得到数据库实例McDbDatabase(),在该数据库实例中调用getBlockTable()方法我们就能获取到块表McDbBlockTable()

[块表 McDbBlockTable()]
[图块记录对象 McDbLinetypeTableRecord()]
[数据库实例 McDbDatabase()]

查看详细属性和方法说明,参考代码如下:

import { MxCpp} from "mxcad"
   // 得到当前控件
   let mxcad = MxCpp.App.getCurrentMxCAD();
   // 获取块表
   let blockTable = mxcad.getDatabase().getBlockTable();

2.插入图块
我们可以调用 mxcad 的实例对象中的insertBlock()方法引入插件图块文件得到引用的图块ID ,最后通过McDbBlockReference()实例化一个 CAD 图块引用实体,设置该实体的blockTableRecordId属性值为引用的图块 ID ,就能实现在图纸中插入目标块。
点击[McObject.insertBlock()][McDbBlockReference()]查看详细属性和方法说明,参考代码如下:

import { MxCpp, McDbBlockReference, MxCADUiPrPoint } from "mxcad"
   async function MxTest\_InsertBlock(){
       // 目标块文件网络文件路径 且该文件为mxweb格式
       let blkFilePath = new URL("../src/assets/tree.mxweb", import.meta.url).href
       let mxcad = MxCpp.getCurrentMxCAD()
       let blkrecId = await mxcad.insertBlock(blkFilePath, "tree")
       if (!blkrecId.isValid()) return;
       let blkRef = new McDbBlockReference();
       blkRef.blockTableRecordId = blkrecId;
       // 设置块大小
       let box = blkRef.getBoundingBox();
       if (box.ret) {
         let dLen = box.maxPt.distanceTo(box.minPt);
         if (dLen > 0.00001) {
           blkRef.setScale(mxcad.getMxDrawObject().screenCoordLong2Doc(100) / dLen);
         }
       }
       // 设置块基点
       let getPoint = new MxCADUiPrPoint();
       getPoint.setMessage("\指定插入基点");
       getPoint.setUserDraw((v, worldDraw) => {
         blkRef.position = v;
         worldDraw\.drawMcDbEntity(blkRef);
       });
       let pt = await getPoint.go();
       if (!pt) return;
       blkRef.position = pt;
       mxcad.drawEntity(blkRef);
   }

示例效果如下图:
1.png

3.遍历所有图块
我们可以通过调用块表McDbBlockTable()中的getAllRecordId()方法获取所有图块的id,再调用getMcDbBlockTableRecord()方法返回图块记录对象McDbBlockTableRecord(),得到所有图块记录对象数据,参考代码如下:

   import { MxCpp } from "mxcad"
   let mxcad = MxCpp.App.getCurrentMxCAD();
   let blockTable = mxcad.getDatabase().getBlockTable();
   let aryId = blockTable.getAllRecordId();
   aryId.forEach((id) => {
   let blkRec = id.getMcDbBlockTableRecord();
   if (blkRec === null) return;
       console.log(blkRec);
       console.log("blkRec.name:" + blkRec.name);
       console.log("blkRec.origin:" + blkRec.origin);
   });

4.删除图块
我们得到图块记录对象McDbBlockTableRecord()后可调用该对象实例的erase()方法删除对象,参考代码如下:

import { MxCpp } from "mxcad"
   let blockTable = MxCpp.getCurrentMxCAD().getDatabase().getBlockTable()
   let blockId = blockTable.get("目标图块名")
   blockId.erase()
   // 更新显示
   mxcad.updateDisplay()

5.查找图块
我们可以调用McDbBlockTable块表中的has()方法判断当前数据库中,是否存在指定的块名,参考代码如下:

   import { MxCpp } from "mxcad";
   const mxcad = MxCpp.getCurrentMxCAD();
   const dataBase = mxcad.getDatabase();
   const blkTable = dataBase.getBlockTable();
   const res = blkTable.has("目标块名");
   if(res){
       console.log("存在目标块")
   }

6.遍历图块下的所有实体
由于图块中的实体可能是另外的一个图块,因此,在遍历图块下所有实体时我们还需要遍历图块中的图块。下面以选择目标图块输出图块中所有实体的id和对象类型为例,参考代码如下:

import { MxCADResbuf, MxCADUiPrEntity , McDbBlockReference, McDbBlockTableRecord} from "mxcad";
   // 遍历图块下所有实体
   async function Mx\_ForEachBlkEntity(){
       // 选择目标块
       let filter = new MxCADResbuf();
       filter.AddMcDbEntityTypes("INSERT");
       const getBlockEvent = new MxCADUiPrEntity()
       getBlockEvent.setMessage('选择目标块');
       getBlockEvent.setFilter(filter);
       const block\_id = await getBlockEvent.go();
       if (!block\_id.id) return;
       // 获取块实体
       const blkRef = block\_id.getMcDbEntity() as McDbBlockReference;
       // 获取块表记录对象
       let blkRec = blkRef.blockTableRecordId.getMcDbBlockTableRecord();
       // 遍历图块实体
       Mx\_ModyfBlockRecordEntity(blkRec)
   }
   function Mx\_ModyfBlockRecordEntity(blkRec: McDbBlockTableRecord) {
       // 获取图块中所有实体Id
       blkRec.getAllEntityId().forEach(id => {
           let ent = id.getMcDbEntity();
           // 若实体为图块,则递归遍历
           if (ent instanceof McDbBlockReference) {
               let blkref = ent as McDbBlockReference;
          Mx\_ModyfBlockRecordEntity(blkref.blockTableRecordId.getMcDbBlockTableRecord());
           }else{
              // 输出实体id、实体类名
               console.log(id.id,ent.objectName);
           }
       })
   }

7.选择实体做成块
我们可以通过MxCADSelectionSet选择集获取目标实体,再新建McDbBlockTableRecord块表记录对象,将选择的实体对象通过appendAcDbEntity()方法写入记录对象中,最后设置图块的基点、位置等,参考代码如下:

import { MxCADSelectionSet, MxCpp, McDbBlockTableRecord, McGePoint3d } from "mxcad";
   // 选择实体做成块
   async function MxTest\_SelectEntitysToBlock() {
     // 选择要做成块的对象
     let ss = new MxCADSelectionSet();
     if(!await ss.userSelect("选择要做成块的对象:") ) return;
     if(ss.count() == 0) return;
     let mxcad = MxCpp.getCurrentMxCAD();
     // 获取数据库块表
     let blkTable =  mxcad.getDatabase().getBlockTable();
     // 创建新的块表记录对象
     let blkRecId = blkTable.add(new McDbBlockTableRecord());
     let blkTableRecord:McDbBlockTableRecord = blkRecId.getMcDbBlockTableRecord() as any;
     if(blkTableRecord == null) return;
     // 定义新建图块的包围盒最大点和最小点
     let pt1x:any,pt1y:any,pt2x:any,pt2y:any;
     // 遍历选择的实体获取新建图块的包围盒最大点和最小点
     ss.forEach((id)=>{
       let ent = id.getMcDbEntity();
       if(!ent) return;
       let cent = ent.clone() as McDbEntity;
       blkTableRecord.appendAcDbEntity(cent);
       let entBox = ent.getBoundingBox();
       if(entBox.ret){
         if(!pt1x){
           pt1x = entBox.minPt.x;
           pt1y = entBox.minPt.y;
           pt2x = entBox.maxPt.x;
           pt2y = entBox.maxPt.y;
         }
         else {
           if(pt1x > entBox.minPt.x) pt1x= entBox.minPt.x;
           if(pt1y > entBox.minPt.y) pt1y= entBox.minPt.y;
           if(pt2x < entBox.maxPt.x) pt2x= entBox.maxPt.x;
           if(pt2y < entBox.maxPt.y) pt2y= entBox.maxPt.y;
         }
       }
     })
     if(pt1x === undefined){
       return;
     }
     let insertPtx =  pt1x + (pt2x - pt1x) \* 0.5;
     let insertPty =  pt1y + (pt2y - pt1y) \* 0.5;
     // 设置图块的插入基点,在图形对象的中心位置。
     blkTableRecord.origin = new McGePoint3d(insertPtx,insertPty,0);
     // 设置图块位置
     let blkRef = new McDbBlockReference();
     blkRef.blockTableRecordId = blkRecId;
     blkRef.position = new McGePoint3d(insertPtx,insertPty,0);
     // 绘制图块
     mxcad.drawEntity(blkRef);
     // 删除原实体
     ss.forEach((id)=>{
       let ent = id.getMcDbEntity();
       if(!ent) return;
       ent.erase();
     });
   }

示例效果如下:
2.png
3.png

8.把一个DWG文件插入到当前文件
我们可以调用mxcad对象的insertBlock()方法把一个DWG文件,插入到图上,指定一个块名,放在块表记录中。下面以在文件中插入一个图章为例,点击[McObject.insertBlock()]查看详细属性和方法说明,参考代码如下:

import { MxCpp, McDbBlockReference, MxCADUiPrPoint } from "mxcad";
   // 插入图章
   async function MxTest\_InsertStamp() {
     // 设置块文件地址
     let baseUrl = "<http://localhost:3000/mxcad/>"
     if (baseUrl.substring(0, 16) == "<http://localhost>") {
       baseUrl = getHostUrl() + baseUrl.substring(16);
     }
     let blkFilePath = baseUrl + "stamp.mxweb";
     let mxcad = MxCpp.App.getCurrentMxCAD();
     // 插件图块文件
     let blkrecId = await mxcad.insertBlock(blkFilePath, "stamp");
     if (!blkrecId.isValid()) {
       // 未插入图块
       return;
     }
     // 创建一个新的图块引用实体
     let blkRef = new McDbBlockReference();
     // 设置图块引用实体的图块记录id为blkrecId
     blkRef.blockTableRecordId = blkrecId;
     // 适应图块大小
     let box = blkRef.getBoundingBox();
     if (box.ret) {
       let dLen = box.maxPt.distanceTo(box.minPt);
       if (dLen > 0.00001) {
         blkRef.setScale(mxcad.getMxDrawObject().screenCoordLong2Doc(100) / dLen);
       }
     }
     // 设置图块基点
     let getPoint = new MxCADUiPrPoint();
     getPoint.setMessage("\指定插入基点");
     // 动态绘制图块
     getPoint.setUserDraw((v, worldDraw) => {
       blkRef.position = v;
       worldDraw\.drawMcDbEntity(blkRef);
     });
     // 设置图块位置
     let pt = await getPoint.go();
     if (!pt) return;
     blkRef.position = pt;
     // 绘制图块实体
     mxcad.drawEntity(blkRef);
   }

示例效果如下:
4.png

9.块属性
在AutoCAD中,块属性是将数据附着到块上的标签或标记。我们可以通过新创建一个块引用中的属性定义文字类McDbAttribute来为目标图块添加属性文字。下面以插入一个带有属性文字的图块为例,点击[McDbAttribute]查看详细属性和方法说明,参考代码如下:

// 在块中插入属性文字 ent:块实体
   let blkRef: McDbBlockReference = ent;
   const blkrecId = blkRef.blockTableRecordId
   // 获取图块记录对象
   let blkRecord: any = blkrecId.getMcDbBlockTableRecord();
   // 获取图块记录中的所有实体对象ID
   let ids = blkRecord.getAllEntityId();
   // 遍历实体类型,添加属性文字
   ids.forEach((id: any, index: any) => {
     if (!id.isKindOf("McDbAttributeDefinition")) return;
     let attribDef = id.getMcDbEntity() as McDbAttributeDefinition;
     let tag = attribDef.tag;
     // 设置属性详情
     let attrib = new McDbAttribute();
     attrib.position = attribDef.position;
     attrib.alignmentPoint = attribDef.alignmentPoint;
     attrib.height = attribDef.height;
     attrib.trueColor = attribDef.trueColor;
     attrib.widthFactor = attribDef.widthFactor;
     attrib.textString = "test" + index;
     attrib.tag = tag;
     attrib.isInvisible = attribDef.isInvisible;
     attrib.transformBy(blkRef.blockTransform);
     attrib = blkRef.appendAttribute(attrib).getMcDbEntity() as McDbAttribute;
     attrib.textStyle = attribDef.textStyle;
     attrib.layer = attribDef.layer;
   })

示例效果如下:
5.png

10.遍历块中的属性文字
我们可以调用图块引用实体McDbBlockReference对象中的getAllAttribute()方法获取图块中的所有属性文字,点击[getAllAttribute()]查看详细属性和方法说明,参考代码如下:

import { McDbBlockReference, McDbAttribute } from "mxcad"
    // 遍历块中的属性文字 ent:块实体
    let blkRef: McDbBlockReference = ent;
    let aryId = blkRef.getAllAttribute();
    aryId.forEach((id) => {
      let attribt: McDbAttribute = id.getMcDbEntity() as any;
      console.log(attribt.textString);
      console.log(attribt.tag);
    })

在线示例

示例项目地址: 在线CAD梦想画图

相关文章
|
10天前
|
存储 前端开发 搜索推荐
(前端直接编辑CAD)网页CAD二次开发中线型表的使用方法
在DWG数据库中,线型样式存储在线型样式表 `McDbLinetypeTable` 中,每个线型表记录对象 `McDbLinetypeTableRecord` 对应一种线型样式。本文介绍了如何获取、添加、遍历、删除和修改线型样式,并提供了绘制不同线型的示例代码,包括虚线、点划线和带文字的线型。通过在线示例demo,用户可以实践修改CAD图纸中的实体线型及其样式。
|
2月前
|
JavaScript 前端开发 API
在线三维CAD中创建一个三维管道模型(网页浏览编辑三维CAD)
本文介绍了如何使用mxcad3d创建三维管道模型。mxcad3d提供了丰富的API,使复杂的管道结构设计变得直观简便。首先需安装mxcad包并初始化项目。接着,通过编写JavaScript函数实现圆角方管的绘制,并将其添加到web界面中。点击绘制按钮即可生成管道模型并实时展示。这为网页CAD中的三维建模任务提供了强大支持。相关代码与项目可在[mxcad3d官方仓库](https://gitee.com/mxcadadox/mxcad_docs/tree/master/examples3D/Test3dPipe.7z)获取。
在线三维CAD中创建一个三维管道模型(网页浏览编辑三维CAD)
(在线编辑DWG)网页CAD二次开发实现多重引线功能
本章介绍如何使用 mxcad 插件在 CAD 图纸中实现箭头引注功能。用户可通过点击画布确定箭头起点和引线顶点,自定义箭头形状、上标和下标文字内容及位置,提高图纸的完整性和可读性。功能实现包括自定义箭头引注类、注册自定义类信息和调用自定义类。示例代码展示了详细的实现步骤,用户可根据需求进行二次开发。在线示例 demo 可供参考。
|
2月前
|
前端开发 API
(WEB前端编辑DWG)在线CAD如何实现图形识别功能
mxcad 提供的图形识别功能可帮助用户快速识别和提取 CAD 图纸中的各种图形,如直线、多段线、弧线、圆及图块,显著提升设计效率。此功能不仅适用于图形分类,还能进行数量统计和快速定位,减少手动操作。用户可通过 API 进行二次开发,自定义识别逻辑。具体步骤包括打开在线示例、选择识别功能、设置识别参数并开始识别。更多开发文档请关注公众号:梦想云图网页 CAD。
|
3月前
|
API 开发者
在线CAD实现图纸比较功能
MXCAD提供了一项实用的图纸比对功能,帮助设计师高效识别不同版本CAD图纸间的改动。用户只需几个简单步骤即可启动比对过程:打开MXCAD在线示例,上传目标图纸,选择“图纸比对”并加载待比对文件。系统会清晰标出所有差异,甚至支持实体定位以便更直观地查看变化细节。此外,MXCAD还开放了相关API,允许开发者根据具体需求进行定制化二次开发,如利用`McObject.loadDwgBackground()`方法加载背景图纸并通过`MxCompare`类获取差异数据等。关注“梦想云图网页CAD”公众号了解更多资讯。
在线CAD实现图纸比较功能
|
4月前
|
JavaScript
网页CAD(JS Vue 预览dwg)如何二次开发常用的CAD编辑功能
```markdown # CAD网页编程概览 - 使用mxcad库,实现CAD操作如删除、复制、镜像、移动和旋转。 - `erase()`方法删除实体,`clone()`配合`transformBy()`用于复制和编辑。 - `mirror()`和`transformBy(setMirror)`执行镜像操作,基于参考线。 - `move()`和`transformBy(setToTranslation)`实现移动功能。 - `rotate()`和`transformBy(setToRotation)`进行旋转,支持角度输入。 ```
网页CAD(JS Vue 预览dwg)如何二次开发常用的CAD编辑功能
|
6月前
|
存储 JSON 小程序
html在线预览CAD(手机小程序浏览DWG)二次开发图层表的方法
本文档介绍了DWG数据库中图层的存储结构及MxCAD库对图层的操作。图层信息存储于图层层表McDbLayerTable()中,每个记录对应一个图层,包含颜色、线型等属性,且有一个不可删除的默认"0"层。主要操作包括:通过MxCpp.getCurrentMxCAD()获取图层表,使用addLayer()添加图层,遍历图层,以及删除图层。此外,还展示了如何修改图层的关闭、冻结、锁定状态及颜色。提供了在线示例以演示这些功能。
html在线预览CAD(手机小程序浏览DWG)二次开发图层表的方法
|
6月前
|
开发工具 开发者
谷歌浏览器打开DWG图纸,实现圆转多边形功能(在线CAD开发教程)
本文介绍了如何使用在线CAD SDK实现圆转多边形功能。首先,需搭建绘图环境和添加命令行交互。接着,通过mxcad库,根据用户输入的边数实现两种转换方式:内接于圆(目标圆为多边形外接圆)和外切于圆(目标圆为多边形内切圆)。具体实现包括选中圆、获取边数、选择转换方式,然后根据用户选择绘制多边形。最终展示了转换效果。
谷歌浏览器打开DWG图纸,实现圆转多边形功能(在线CAD开发教程)
|
开发工具 UED 开发者
在微信小游戏制作工具中实现各种效果和功能的按钮
在游戏设计中有一个名词叫“反馈”,大体就是指当玩家在进行游戏时,游戏所给予玩家的一些东西,比如常见的在点击按钮时,按钮会变换颜色,或进行缩放,或播放音效等等。总之,不论玩家在游戏中进行任何的操作,游戏都应该给予玩家一个合理的反馈。让玩家能够明白他的操作所获得的结果是什么。
426 0
|
Android开发 iOS开发 计算机视觉
Polarr泼辣修图2023最新版有哪些新增功能?
泼辣修图5.11.4最新版为用户带来更多新版的修改工具,进一步优化相关的设备,可以更舒畅的使用去修改图片,还有很多贴纸,文字等等小工具使用,丰富照片情景,感兴趣的可以来试试。
276 0