明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1379|回复: 6

WEB预览CAD(微信小程序公众号浏览DWG)二次开发图层表的方法

[复制链接]
发表于 2024-5-11 15:18:18 | 显示全部楼层 |阅读模式
本帖最后由 MxDraw 于 2024-5-11 15:32 编辑

前言
在DWG数据库中,图层存放在图层层表 McDbLayerTable() 当中,层表中每一条记录称为图层表记录对象McDbLayerTableRecord() 。
每一个图层表记录对象都对应一个图层,而且可以设置颜色、线型、关闭/打开、冻结等属性,其中DWG数据库默认总是有一个"0"层,该层不能被删除。


图层表操作
1. 获取当前控件的数据库图层表
我们可以通过调用 mxcad 中的`MxCpp.getCurrentMxCAD()`得到当前的控件, 然后调用控件实例的getDatabase() 方法得到数据库实例 McDbDatabase()在该数据库实例中调用getLayerTable()方法我们就能获取到层表McDbLayerTable(),参考链接如下:
查看详细属性和方法说明,参考代码如下:
  1.    import { MxCpp} from "mxcad"
  2.    // 得到当前控件
  3.    const mxcad = MxCpp.getCurrentMxCAD();
  4.    // 拿到当前控件的数据库图层表
  5.    const layerTable = mxcad.getDatabase().getLayerTable();
复制代码

2. 添加图层
我们可以通过调用 mxcad 实例对象中的addLayer()方法添加自定义图层,并设置 drawLayer 属性将添加图层为绘制图层。
点击[McObject.addLayer()]查看详细属性和方法说明,参考代码如下:
  1.    import { McApp } from "mxcad"
  2.    const mxcad = McApp.getCurrentMxCAD()
  3.    mxcad.addLayer("图层名称")
  4.    mxcad.drawLayer = "图层名称"
复制代码
我们还可以通过实例化一个图层表记录对象 McDbLayerTableRecord() ,设置该图层颜色,线型,关闭/打开,冻结等属性后调用add() 方法添加到图层层表中,代码如下:
  1. import { McCmColor, MxCpp, McDbLayerTableRecord, McDb } from "mxcad"
  2.    // 得到当前控件
  3.    const mxcad = MxCpp.getCurrentMxCAD();
  4.    // 实例化一个图层数据对象并设置这个图层的一些属性
  5.    const layer = new McDbLayerTableRecord()
  6.    layer.color = new McCmColor(0, 0, 0)
  7.    layer.isFrozen = true
  8.    layer.isLocked = true
  9.    layer.isOff = true
  10.    layer.lineWeight = McDb.LineWeight.kLnWt018
  11.    layer.name = "图层名称"
  12.    // 拿到当前控件的数据库图层表
  13.    const layerTable = mxcad.getDatabase().getLayerTable();
  14.    // 将图层数据对象添加到图层表中会得到一个标识该图层数据的对象ID
  15.    const objId = layerTable.add(layer)
  16.    // 更新显示
  17.    mxcad.updateDisplay()
复制代码

3. 遍历所有图层
我们可以通过调用数据库层表 McDbLayerTable() 中的 getAllRecordId() 方法获取所有图层id,再调用 getMcDbLayerTableRecord() 方法返回图层表记录对象 McDbLayerTableRecord() ,得到所有图层数据,代码如下:
  1.    import { MxCpp } from "mxcad"
  2.    let layerTable = MxCpp.getCurrentMxCAD().getDatabase().getLayerTable();
  3.    let aryId = layerTable.getAllRecordId();
  4.    aryId.forEach((id) => {
  5.        let layerRec = id.getMcDbLayerTableRecord();
  6.        if (layerRec === null) return;
  7.        console.log(layerRec);
  8.        console.log("layerRec.color:" + layerRec.color.getColorString());
  9.        console.log("layerRec.name:" + layerRec.name);
  10.    });
复制代码

4. 删除图层
我们得到目标图层表记录对象 McDbLayerTableRecord 后可调用该对象实例的 erase() 方法删除对象,参考代码:
  1.    import { MxCpp } from "mxcad"
  2.    let layerTable = MxCpp.getCurrentMxCAD().getDatabase().getLayerTable()
  3.    let layerId = layerTable.get("图层名字")
  4.    let layerRec = layerId.getMcDbLayerTableRecord()
  5.    layerRec.erase()
  6.    // 更新显示
  7.    mxcad.updateDisplay()
复制代码
此外,我们还可以通过图层表的JSON序列化和反序列化来删除图层,代码如下:
  1.   import { McCmColor, MxCpp, McDbLayerTableRecord, McDb } from "mxcad"
  2.    const layerTable = mxcad.getDatabase().getLayerTable();
  3.    const layerJsonString = layerTable.getJson()
  4.    const layerJson = JSON.parse(layerJsonString)
  5.    // 只要保留以下几个名称的图层
  6.    const  keepLayerNames = \["0", "排水", "testLayer1"]
  7.    const keepLayers = layerJson.filter((layerJsonObj)=> {
  8.        return keepLayerNames.includes(layerJsonObj.name)
  9.    })
  10.    const keepLayersJsonString = JSON.stringify(keepLayers)
  11.    layerTable.setJson(keepLayersJsonString)
  12.    // 最后我们可以通过has方法检查图层是否存在 get方法传入图层名来得到对应的对象ID
  13.    console.log("testLayer1", layerTable.has("testLayer1"))
  14.    console.log("testLayer1", layerTable.get("testLayer1"))
复制代码
mxcad 中修改图层的基础操作为得到数据库层表对象,然后根据层名得到层表记录对象,设置层表记录对应属性值,下面以用户在CAD图上选择一个对象,然后操作对象所在的图层为例:
获取目标图层:
  1.     import { MxCADSelectionSet, MxCADUiPrPoint } from "mxcad"  
  2.      const ss = new MxCADSelectionSet();
  3.      const getPoint = new MxCADUiPrPoint()
  4.      getPoint.setMessage("请选择目标对象")
  5.      const point = await getPoint.go()
  6.      if (!point) return
  7.      const index = ss.pointSelect(point.x, point.y)
  8.      const ent = ss.item(index).getMcDbEntity()
  9.      if(!ent) return
  10.      const layerId = ent.layerId
  11.      let layerRec = layerId.getMcDbLayerTableRecord()
  12.      console.log(layerRec)
复制代码
获取或设置图层是否被关闭:被关闭上的图层实体无法参与操作编辑,参考代码如下:
  1.      const offVal = layerRec.isOff
  2.      // 关闭图层
  3.      layerRec.isOff = true
  4.      // 更新显示
  5.      mxcad.updateDisplay()
复制代码
获取或设置图层是否被冻结:被冻结上的图层实体,不会参显示数据的生成,这样可以加快显示速度,和打开图纸的速度,它与关闭属性相比,冻结后的图层不但看不见,并且在内存中也不参加显示,代码如下:
  1.      const frozenVal = layerRec.isFrozen
  2.      // 冻结图层
  3.      layerRec.isFrozen = true
  4.      // 更新显示
  5.      mxcad.updateDisplay()
复制代码
获取或设置图层是否被锁定:锁定后的图层上的实体不能编辑,但可以选择,代码如下:
  1.      const lockVal = layerRec.isLocked
  2.      // 锁定图层
  3.      layerRec.isLocked = true
  4.      // 更新显示
  5.      mxcad.updateDisplay(
复制代码
获取或设置图层颜色,代码如下:
  1.      const colorVal = layerRec.color
  2.      // 设置图层颜色为红色
  3.      layerRec.color = new McCmColor(255,0,0)
  4.      // 更新显示
  5.      mxcad.updateDisplay()
复制代码

在线示例
示例项目地址: [在线CAD梦想画图](https://demo.mxdraw3d.com:3000/mxcad/),点击图标打开图层特性管理器,可操作当前图纸内的所有图层,如下图所示:
​

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 金钱 +15 收起 理由
qjchen + 1 + 15 赞一个!

查看全部评分

发表于 2024-5-11 21:43:44 | 显示全部楼层
网页版CAD,厉害了
发表于 2024-5-12 09:15:37 | 显示全部楼层
膜拜ing,大佬
 楼主| 发表于 2024-5-31 10:23:37 | 显示全部楼层

谢谢关注!
 楼主| 发表于 2024-5-31 10:27:54 | 显示全部楼层

谢谢关注,一起学习
发表于 2024-7-3 17:36:06 | 显示全部楼层
layerTable.has是采取什么算法?
如果考虑保存时候压缩的话,表记录应该有序结构,然后二分法搜索.
也可以用hashmap来实现,不过它通常是无序结构.
不知道你的底层是采取哪个呢?
 楼主| 发表于 2024-7-18 10:56:23 | 显示全部楼层
你有种再说一遍 发表于 2024-7-3 17:36
layerTable.has是采取什么算法?
如果考虑保存时候压缩的话,表记录应该有序结构,然后二分法搜索.
也可以用 ...

就是一个map
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 03:19 , Processed in 0.178549 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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