返回介绍

指南

MxCAD API 文档

5. 数据库

发布于 2024-07-31 21:40:00 字数 10052 浏览 0 评论 0 收藏 0

数据库

在mxcad中, 转换后的图纸(.mxweb格式的文件)可以通过mxcad npm包得到图纸的各种数据,如图层、文字样式、图块、以及图形对象中的数据等等。

我们经常需要拿到这些数据并对它们进行修改,然后在显示的图纸上应用这些修改后的数据。

mxcad提供了数据库,专门用于处理这些数据。

数据如何获取和修改

打开的图纸都有McDbDatabase 的实例(数据库)

我们通MxCpp.App.getCurrentMxCAD()得到当前的控件, 然后调用控件实例的getDatabase()方法得到数据库实例。

在数据库实例中可以通过一些方法得到一些表,这些表可以通过一些方式得到ID对象McObjectId

这些ID对象相当于具体数据的一个引用,通过调用对应发方法我们就可以拿到具体的数据了。

以图层数据为为例:

import { McCmColor, MxCpp, createMxCad } from "mxcad"
// 获取当前的控件
const mxcad = MxCpp.App.getCurrentMxCAD();
//  得到数据库中的图层表
const layerTable = mxcad.getDatabase().getLayerTable();
//  得到所有图层的ID对象
const aryId = layerTable.getAllRecordId();

const layers = aryId.map((id) => {
    // 得到对应ID的图层数据对象
    let layerRec = id.getMcDbLayerTableRecord();
    if (layerRec === null) return;
    return layerRec
})
// 设置第一个图层的颜色
const layer = layers[0]
if (!layer) return
const color = new McCmColor()
color.setRGB(255, 0, 0)
layer.color = color
// 更新显示就可以发现图纸0层上的所有选择了颜色随层的图形都变成了红色
mxcad.updateDisplay()

可以看见我们只要拿到了数据, 修改了数据中的颜色属性, 更新显示时, 图纸属于该图层的图形就会变成红色了。

图形数据

继承了McDbObject的类实例,都是数据库的数据。

图形数据就是继承了McDbEntity的类实例。

参数化交互绘图中 所有图形 如McDbTextMcDbLine等,

都是数据库中对应的图形数据的类, 实例化后就是图形数据了。

我们只要修改对应属性,显示的图纸就会有对应变化。

选择图形中, 选中图形修改颜色的示例代码直观的演示了什么是图形数据的特性。

通常情况下数据库的数据,都是通过对象McObjectId拿到的。

图层数据增删

对图层的增删改查示例代码如下:

import { McCmColor, MxCpp, McDbLayerTableRecord, McDb } from "mxcad"
// 得到当前控件
const mxcad = MxCpp.App.getCurrentMxCAD();
// 实例化一个图层数据对象并设置这个图层的一些属性
const layer = new McDbLayerTableRecord()
layer.color = new McCmColor(0, 0, 0)
layer.isFrozen = true
layer.isLocked = true
layer.isOff = true
layer.lineWeight = McDb.LineWeight.kLnWt018
layer.name = "testLayer1"
// 拿到当前控件的数据库图层表
const layerTable = mxcad.getDatabase().getLayerTable();
// 将图层数据对象添加到图层表中会得到一个标识该图层数据的对象ID
const objId = layerTable.add(layer)
// 我们可以通过图层表的JSON序列化和反序列化来整体的增删改查一些图层
const layerJsonString = layerTable.getJson()
const layerJson = JSON.parse(layerJsonString)
// 这里我们只要保留以下几个名称的图层
const  keepLayerNames = ["0", "排水", "testLayer1"]
const keepLayers = layerJson.filter((layerJsonObj)=> {
    return keepLayerNames.includes(layerJsonObj.name)
})
const keepLayersJsonString = JSON.stringify(keepLayers)
layerTable.setJson(keepLayersJsonString)
// 最后我们可以通过has方法检查图层是否存在 get方法传入图层名来得到对应的对象ID
console.log("图层0是否存在", layerTable.has("0"))
console.log("图层0的对象ID", layerTable.get("0"))

还有其他的数据表: McDbLinetypeTable线型表、McDbTextStyleTable文字样式表、McDbBlockTable图块表...等等,

它们和图层表的使用方式大同小异,这里不一样举例, 可以直接点击对应名称详细了解对应的方法。

对应的它们的都有用于创建数据库数据的类, 比如McDbLayerTableRecord 就是创建图层数据的类,对应的还有 McDbLinetypeTableRecordMcDbTextStyleTableRecord等 点击查看了解具体属性方法

这些表的操作方法基本一致,不再一一说明, 直接看对应的方法就好。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文