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

在线CAD(html预览cad插件)二次开发块表

0
分享至

前言

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

块表操作

1. 获取当前控件的数据库块表

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

点击 [块表 McDbBlockTable()]查看详细属性和方法说明
(https://www.mxdraw3d.com/mxcad_docs/api/classes/2d.McDbBlockTable.html)

点击[图块记录对象 McDbLinetypeTableRecord()]查看详细属性和方法说明
(https://www.mxdraw3d.com/mxcad_docs/api/classes/2d.McDbLayerTable.html)

点击[数据库实例 McDbDatabase()]查看详细属性和方法说明

(https://www.mxdraw3d.com/mxcad_docs/api/classes/2d.McDbDatabase.html)

参考代码如下:

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

2. 插入图块

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

点击 [McObject.insertBlock()]查看详细属性和方法说明
(https://www.mxdraw3d.com/mxcad_docs/api/classes/2d.McObject.html#insertblock) 、

点击 [McDbBlockReference()]查看详细属性和方法说明

(https://www.mxdraw3d.com/mxcad_docs/api/classes/2d.McDbBlockReference.html)

参考代码如下:

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

示例效果如下图:

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();

示例效果如下:

8. 把一个DWG文件插入到当前文件

我们可以调用 mxcad 对象的 insertBlock()方法把一个DWG文件,插入到图上,指定一个块名,放在块表记录中。下面以在文件中插入一个图章为例。

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

(https://www.mxdraw3d.com/mxcad_docs/api/classes/2d.McObject.html#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);

示例效果如下:

9. 块属性

在AutoCAD中,块属性是将数据附着到块上的标签或标记。我们可以通过新创建一个块引用中的属性定义文字类McDbAttribute来为目标图块添加属性文字。下面以插入一个带有属性文字的图块为例。

点击[McDbAttribute]查看详细属性和方法说明

(https://www.mxdraw3d.com/mxcad_docs/api/classes/2d.McDbAttribute.html#class-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;

示例效果如下:

10. 遍历块中的属性文字

我们可以调用图块引用实体McDbBlockReference对象中的getAllAttribute()方法获取图块中的所有属性文字。

点击[getAllAttribute()]查看详细属性和方法说明
(https://www.mxdraw3d.com/mxcad_docs/api/classes/2d.McDbBlockReference.html#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梦想画图](https://demo.mxdraw3d.com:3000/mxcad/)

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

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.

相关推荐
热点推荐
比日本还嚣张!为支持台湾与中国断交后,又要求中国主动低头求和

比日本还嚣张!为支持台湾与中国断交后,又要求中国主动低头求和

杰丝聊古今
2026-05-02 11:06:33
悬挂22年无人察觉!四川阆中张飞庙知名对联被书法家抄错 官方回应:将重撰重刻

悬挂22年无人察觉!四川阆中张飞庙知名对联被书法家抄错 官方回应:将重撰重刻

封面新闻
2026-05-18 20:56:03
瓜帅去哪儿?五大联赛豪门帅位盘点:多队主帅已定,多人明年约满

瓜帅去哪儿?五大联赛豪门帅位盘点:多队主帅已定,多人明年约满

兰亭墨未干
2026-05-19 12:17:12
人类史上最大IPO诞生!马斯克是最大赢家

人类史上最大IPO诞生!马斯克是最大赢家

技术领导力
2026-05-19 09:22:58
菲律宾马杜两家决战全面打响,杜特尔特家族只许胜不许败

菲律宾马杜两家决战全面打响,杜特尔特家族只许胜不许败

吃货的分享
2026-05-19 11:32:35
被禁多年的云南鸵鸟肉事件:20多名青少年被杀,凶手曾多次杀人

被禁多年的云南鸵鸟肉事件:20多名青少年被杀,凶手曾多次杀人

年代回忆
2026-05-18 20:56:44
大S年轻时房间曝光,太过诡异引人不适,难怪有人曾说活不过50岁

大S年轻时房间曝光,太过诡异引人不适,难怪有人曾说活不过50岁

草莓解说体育
2026-05-11 20:49:33
叶珂生女后不再隐忍!挑明与黄晓明分手真相,原来baby才是天花板

叶珂生女后不再隐忍!挑明与黄晓明分手真相,原来baby才是天花板

橙星文娱
2026-05-14 10:26:46
天降横财,世界杯补贴砸中浙江队:至少进账170万人民币

天降横财,世界杯补贴砸中浙江队:至少进账170万人民币

姜大叔侃球
2026-05-18 11:03:51
狗爬山累瘫了坐个轿子,主人和轿夫都没意见,有些人却不乐意了

狗爬山累瘫了坐个轿子,主人和轿夫都没意见,有些人却不乐意了

爱宠物
2026-05-19 12:16:20
万台交付全球第一!天机智能,撕开人形机器人量产的终局 | 前沿在线

万台交付全球第一!天机智能,撕开人形机器人量产的终局 | 前沿在线

前沿在线
2026-04-29 08:38:10
广东全面清理挖抢县中优质生源政策

广东全面清理挖抢县中优质生源政策

南方都市报
2026-05-19 07:06:18
长征路上,女兵救下一濒死的战士,22年后再相遇,他已是省委书记

长征路上,女兵救下一濒死的战士,22年后再相遇,他已是省委书记

兴趣知识
2026-05-18 01:13:40
曝古德温离开山西内幕:经纪人拒绝优先续约 上海赛季没结束就开谈

曝古德温离开山西内幕:经纪人拒绝优先续约 上海赛季没结束就开谈

狼叔评论
2026-05-18 20:34:13
太牛!成都蓉城胸前广告卖出超1000万欧:排进意甲前5位

太牛!成都蓉城胸前广告卖出超1000万欧:排进意甲前5位

邱泽云
2026-05-18 15:02:52
本赛季MVP公布后,最佳一阵也基本出炉,榜单前五,入选实至名归

本赛季MVP公布后,最佳一阵也基本出炉,榜单前五,入选实至名归

你的篮球频道
2026-05-18 14:06:52
歌手2026官宣,首发阵容正式曝光,我难掩激动,期待的都来了!

歌手2026官宣,首发阵容正式曝光,我难掩激动,期待的都来了!

娱乐圈笔娱君
2026-05-18 16:24:35
亏4239亿、销量跌72%!日系车教父赴比亚迪,日媒:至暗时刻来临

亏4239亿、销量跌72%!日系车教父赴比亚迪,日媒:至暗时刻来临

胖福的小木屋
2026-05-18 11:47:28
院士忧心青年择业观:年轻人应该多想着为国家做贡献

院士忧心青年择业观:年轻人应该多想着为国家做贡献

映射生活的身影
2026-05-17 21:45:58
拒绝承诺是否对台湾军售,不想看到“任何人走向独立”,美总统涉台“四不”示警“台独”

拒绝承诺是否对台湾军售,不想看到“任何人走向独立”,美总统涉台“四不”示警“台独”

环球网资讯
2026-05-18 06:46:12
2026-05-19 13:08:49
CAD梦想画图
CAD梦想画图
是一款极速轻量级的CAD软件
607文章数 123关注度
往期回顾 全部

科技要闻

苹果WWDC26定档6月9日凌晨:iOS27将亮相

头条要闻

美两电子战机相撞在空中互相卡住 美军目前仅有几十架

头条要闻

美两电子战机相撞在空中互相卡住 美军目前仅有几十架

体育要闻

58顺位的保罗,最强第三中锋

娱乐要闻

张雪峰42岁冥诞,学生家长自发缅怀

财经要闻

从卖流量到卖Token,运营商算力生意破局

汽车要闻

40.98万起!充电5分钟纯电续航420km 腾势N9闪充版胜算有多少?

态度原创

房产
家居
艺术
健康
军事航空

房产要闻

7516元/㎡,161套一次全甩!海口住宅最低价出现了!

家居要闻

观山隐秀 心灵沉淀

艺术要闻

蒋万安手写贺卡成焦点!网友:字软人弱!练书法3年,该如何提高

专家揭秘干细胞回输的安全风险

军事要闻

莫斯科遭一年多来最大规模无人机袭击 3死18伤

无障碍浏览 进入关怀版