Skip to content
On this page

块表

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

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

点击 块表 McDbBlockTable()图块记录对象 McDbLinetypeTableRecord()数据库实例 McDbDatabase() 查看详细属性和方法说明。

ts
import { MxCpp} from "mxcad"

let mxcad = MxCpp.App.getCurrentMxCAD();
// 获取块表
let blockTable = mxcad.getDatabase().getBlockTable();

插入图块

我们可以调用 mxcad 的实例对象中的 insertBlock() 方法引入插件图块文件得到引用的图块 ID ,最后通过 McDbBlockReference() 实例化一个 CAD 图块引用实体,设置该实体的 blockTableRecordId 属性值为引用的图块 ID ,就能实现在图纸中插入目标块。

点击 McObject.insertBlock() 查看详细属性和方法说明。 点击 McDbBlockReference() 查看详细属性和方法说明。

ts
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);
}

提示

insertBlock() 方法中的块文件路径必须为网络文件路径且该文件为mxweb格式。

添加图块

我们可以通过实例化一个图块记录对象 McDbBlockTableRecord() ,再调用 add() 方法添加到块表中。其中图块记录对象可通过调用 appendAcDbEntity() 方法向目标对象中添加实体,实现自定义块功能。

ts
import { MxCpp, McDbBlockTableRecord, McDbBlockReference, McDbLine, McCmColor } from "mxcad"

let mxcad = MxCpp.getCurrentMxCAD();
let blkTable =  mxcad.getDatabase().getBlockTable();
let blkRecId = blkTable.add(new McDbBlockTableRecord());

// 根据ObjectId再次得到刚刚添加的图块记录
let blkTableRecord:McDbBlockTableRecord = blkRecId.getMcDbBlockTableRecord()

// 添加两条线段再图块记录中 这里每条线段的具体属性比如开始点和结束点自行赋值
const line = new McDbLine(80, 80, 0, -80, -80, 0)
line.trueColor = new McCmColor(255, 0, 0)
const line1 = new McDbLine(-80, 80, 0, 80, -80, 0)
blkTableRecord.appendAcDbEntity(line);
blkTableRecord.appendAcDbEntity(line1);

// 设置图块的基点 一般是包围盒内的点, 可以任意指定
blkTableRecord.origin = new McGePoint3d(0,0,0);

// 实例化块参照 这里需要设置我们刚刚添加图块记录得到的ObjectId
let blkRef = new McDbBlockReference();
blkRef.blockTableRecordId = blkRecId;
// 最后设置位置 渲染图块
blkRef.position = new McGePoint3d(0,0,0);

mxcad.drawEntity(blkRef);

遍历所有图块

我们可以通过调用块表 McDbBlockTable() 中的 getAllRecordId() 方法获取所有图块的id,再调用 getMcDbBlockTableRecord() 方法返回图块记录对象 McDbBlockTableRecord() ,得到所有线型样式数据。

ts
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);
});

删除图块

我们得到图块记录对象 McDbBlockTableRecord() 后可调用该对象实例的 erase() 方法删除对象。

ts
import { MxCpp } from "mxcad"

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