html在线预览CAD(手机小程序浏览DWG)二次开发图层表的方法

本文涉及的产品
应用实时监控服务-应用监控,每月50GB免费额度
云原生网关 MSE Higress,422元/月
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: 本文档介绍了DWG数据库中图层的存储结构及MxCAD库对图层的操作。图层信息存储于图层层表McDbLayerTable()中,每个记录对应一个图层,包含颜色、线型等属性,且有一个不可删除的默认"0"层。主要操作包括:通过MxCpp.getCurrentMxCAD()获取图层表,使用addLayer()添加图层,遍历图层,以及删除图层。此外,还展示了如何修改图层的关闭、冻结、锁定状态及颜色。提供了在线示例以演示这些功能。

前言

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

图层表操作

1. 获取当前控件的数据库图层表
我们可以通过调用 mxcad 中的 MxCpp.getCurrentMxCAD() 得到当前的控件, 然后调用控件实例的 getDatabase() 方法得到数据库实例 McDbDatabase() ,在该数据库实例中调用 getLayerTable() 方法我们就能获取到层表 McDbLayerTable(),参考链接如下:
[数据库层表 McDbLayerTable()]
图层表记录对象McDbLayerTableRecord
数据库实例 McDbDatabase()
查看详细属性和方法说明,参考代码如下:

import{
   MxCpp} from "mxcad"
   // 得到当前控件
   const mxcad = MxCpp.getCurrentMxCAD();
   // 拿到当前控件的数据库图层表
   const layerTable = mxcad.getDatabase().getLayerTable();

2. 添加图层
我们可以通过调用mxcad实例对象中的addLayer()方法添加自定义图层,并设置drawLayer属性将添加图层为绘制图层。
点击McObject.addLayer()查看详细属性和方法说明,参考代码如下:

import{
   McApp} from "mxcad"
   const mxcad = McApp.getCurrentMxCAD()
   mxcad.addLayer("图层名称")
   mxcad.drawLayer = "图层名称"

我们还可以通过实例化一个图层表记录对象 McDbLayerTableRecord() ,设置该图层颜色,线型,关闭/打开,冻结等属性后调用 add() 方法添加到图层层表中,代码如下:

import{
   McCmColor, MxCpp, McDbLayerTableRecord, McDb} from "mxcad"
   // 得到当前控件
   const mxcad = MxCpp.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 = "图层名称"
   // 拿到当前控件的数据库图层表
   const layerTable = mxcad.getDatabase().getLayerTable();
   // 将图层数据对象添加到图层表中会得到一个标识该图层数据的对象ID
   const objId = layerTable.add(layer)
   // 更新显示
   mxcad.updateDisplay()

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

import{
   MxCpp} from "mxcad"
   let layerTable = MxCpp.getCurrentMxCAD().getDatabase().getLayerTable();
   let aryId = layerTable.getAllRecordId();
   aryId.forEach((id) => {
   
       let layerRec = id.getMcDbLayerTableRecord();
       if (layerRec === null) return;
       console.log(layerRec);
       console.log("layerRec.color:" + layerRec.color.getColorString());
       console.log("layerRec.name:" + layerRec.name);
   });

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

import{
   MxCpp} from "mxcad"
   let layerTable = MxCpp.getCurrentMxCAD().getDatabase().getLayerTable()
   let layerId = layerTable.get("图层名字")
   let layerRec = layerId.getMcDbLayerTableRecord()
   layerRec.erase()
   // 更新显示
   mxcad.updateDisplay()

此外,我们还可以通过图层表的JSON序列化和反序列化来删除图层,代码如下:

import{
   McCmColor, MxCpp, McDbLayerTableRecord, McDb} from "mxcad"
   const layerTable = mxcad.getDatabase().getLayerTable();
   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("testLayer1", layerTable.has("testLayer1"))
   console.log("testLayer1", layerTable.get("testLayer1"))

mxcad 中修改图层的基础操作为得到数据库层表对象,然后根据层名得到层表记录对象,设置层表记录对应属性值,下面以用户在CAD图上选择一个对象,然后操作对象所在的图层为例:
获取目标图层:

import{
   MxCADSelectionSet, MxCADUiPrPoint} from "mxcad"  
     const ss = new MxCADSelectionSet();
     const getPoint = new MxCADUiPrPoint()
     getPoint.setMessage("请选择目标对象")
     const point = await getPoint.go()
     if (!point) return
     const index = ss.pointSelect(point.x, point.y)
     const ent = ss.item(index).getMcDbEntity()
     if(!ent) return
     const layerId = ent.layerId
     let layerRec = layerId.getMcDbLayerTableRecord()
     console.log(layerRec)

获取或设置图层是否被关闭:被关闭上的图层实体无法参与操作编辑,参考代码如下:

const offVal = layerRec.isOff
     // 关闭图层
     layerRec.isOff = true
     // 更新显示
     mxcad.updateDisplay()

获取或设置图层是否被冻结:被冻结上的图层实体,不会参显示数据的生成,这样可以加快显示速度,和打开图纸的速度,它与关闭属性相比,冻结后的图层不但看不见,并且在内存中也不参加显示,代码如下:

const frozenVal = layerRec.isFrozen
     // 冻结图层
     layerRec.isFrozen = true
     // 更新显示
     mxcad.updateDisplay()

获取或设置图层是否被锁定:锁定后的图层上的实体不能编辑,但可以选择,代码如下:

const lockVal = layerRec.isLocked
     // 锁定图层
     layerRec.isLocked = true
     // 更新显示
     mxcad.updateDisplay(

获取或设置图层颜色,代码如下:

const colorVal = layerRec.color
     // 设置图层颜色为红色
     layerRec.color = new McCmColor(255,0,0)
     // 更新显示
     mxcad.updateDisplay()

在线示例

示例项目地址: 在线CAD梦想画图,点击图标打开图层特性管理器,可操作当前图纸内的所有图层,如下图所示:

image-20240507144328740.png

相关文章
|
27天前
|
存储 JavaScript 算法
(html在线预览cad图纸插件)网页CAD绘制条形码、二维码的教程
本文介绍了如何在mxcad中绘制条形码和二维码。对于条形码,首先根据应用场景选择合适的编码标准(如CODE39、EAN13等),通过编码规则将数据转换为二进制,并利用`McDbHatch`绘制条和空的组合,同时支持自定义实体及属性管理。 对于二维码,因其能存储更多信息且具备更强纠错能力,采用开源库QRCode.js进行编码处理,再通过`McDbHatch`绘制黑白矩阵,同样封装成自定义实体以便管理和扩展。文中还给出了完整的绘制流程与效果展示,包括创建二维码对象、设置参数、调用绘制方法以及最终的效果图。整个过程体现了灵活运用API与第三方库来实现复杂图形绘制的能力。
|
6月前
|
小程序
|
6月前
|
编解码 小程序
微信小程序11177版本开启控制台方法
微信小程序11177版本开启控制台方法
|
5月前
|
小程序
小程序消除图片下边距的三个方法
小程序消除图片下边距的三个方法
138 69
|
3月前
|
移动开发 HTML5
HTML5熊猫弹跳手机小游戏源码
一款html5手机端小游戏源码,熊猫跳跃小游戏源码下载。熊猫脚底有弹簧,长按变化力度跳跃,计分游戏,html5手机熊猫也疯狂小游戏源代码。
69 5
家政服务小程序APP开发,做好上门家政最快的方法是什么?
在家政服务领域,打造成功的平台并非易事。本文分享了三个关键步骤:避免初期盲目投入、采用低成本获客方式、建立有效的阿姨筛选机制。遵循这些方法,可助你避开常见陷阱,成为行业头部平台。
|
4月前
|
小程序 JavaScript API
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
这篇文章介绍了如何在uni-app和微信小程序中实现将图片保存到用户手机相册的功能。
1707 0
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
|
6月前
|
小程序 JavaScript
微信小程序中的页面跳转(通过点击按钮、调用方法的形式)
这篇文章讲解了微信小程序中页面跳转的方法,包括使用按钮点击事件和调用方法实现跳转,以及推荐使用`this.pageRouter.navigateTo`代替`wx.navigateTo`的方式。
微信小程序中的页面跳转(通过点击按钮、调用方法的形式)
|
4月前
|
小程序
如何将CCBUPT全能墙小程序添加到手机桌面
如何将CCBUPT全能墙小程序添加到手机桌面
52 0
|
4月前
|
小程序 数据可视化 开发工具
HTML我帮您打造拖拽可视化的WEUI小程序工具
HTML我帮您打造拖拽可视化的WEUI小程序工具
63 0