HarmonyOS鸿蒙Next中WEB预览CAD(手机小程序浏览DWG)二次开发图层表的方法
HarmonyOS鸿蒙Next中WEB预览CAD(手机小程序浏览DWG)二次开发图层表的方法
前言
在DWG数据库中,图层存放在图层层表 McDbLayerTable() 当中,层表中每一条记录称为图层表记录对象 McDbLayerTableRecord() 。每一个图层表记录对象都对应一个图层,而且可以设置颜色、线型、关闭/打开、冻结等属性,其中DWG数据库默认总是有一个"0"层,该层不能被删除。
图层表操作
1. 获取当前控件的数据库图层表
我们可以通过调用 mxcad 中的 MxCpp.getCurrentMxCAD()
得到当前的控件, 然后调用控件实例的 getDatabase() 方法得到数据库实例 McDbDatabase() ,在该数据库实例中调用 getLayerTable() 方法我们就能获取到层表 McDbLayerTable()。
点击MxCpp.getCurrentMxCAD、McDbLayerTableRecord、McDbDatabase查看详细属性和方法说明。
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梦想画图,点击图标打开图层特性管理器,可操作当前图纸内的所有图层。
更多关于HarmonyOS鸿蒙Next中WEB预览CAD(手机小程序浏览DWG)二次开发图层表的方法的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,实现WEB预览CAD(手机小程序浏览DWG)并进行二次开发图层表的方法,主要涉及以下几个步骤:
-
CAD文件解析:使用第三方库或工具解析DWG文件,提取图层信息。常见的解析库包括Teigha、LibreDWG等。这些库可以将DWG文件转换为JSON或其他可处理的数据格式。
-
WEB预览:将解析后的CAD数据通过WebGL或Canvas等技术在网页中渲染。可以使用Three.js、Babylon.js等3D渲染库来实现CAD模型的展示。确保在HarmonyOS环境下,这些库能够正常运行。
-
图层表管理:在WEB界面中,通过JavaScript或TypeScript实现图层表的展示与交互。可以创建一个图层列表,允许用户选择、隐藏或显示特定图层。通过事件监听,动态更新CAD模型的显示状态。
-
HarmonyOS集成:将上述WEB预览功能嵌入到HarmonyOS的小程序中。使用HarmonyOS提供的Web组件(如
<web>
标签)加载WEB页面,并通过JavaScript Bridge实现与HarmonyOS原生功能的交互。 -
性能优化:由于移动设备性能有限,需对CAD模型进行简化处理,减少渲染负担。可以通过LOD(Level of Detail)技术,根据缩放级别动态调整模型细节。
-
测试与调试:在HarmonyOS设备上进行充分测试,确保WEB预览和图层表功能在不同设备上均能稳定运行。使用HarmonyOS提供的调试工具进行性能分析和问题排查。
通过以上步骤,可以在HarmonyOS鸿蒙Next中实现WEB预览CAD并进行图层表的二次开发。
更多关于HarmonyOS鸿蒙Next中WEB预览CAD(手机小程序浏览DWG)二次开发图层表的方法的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,通过Web预览CAD文件(如DWG格式)并进行二次开发,可以通过以下步骤实现图层表的管理:
-
集成CAD预览库:使用支持DWG格式的Web预览库,如AutoCAD Web Viewer或第三方库,确保能在小程序中加载和显示CAD文件。
-
解析图层信息:通过库提供的API或自定义解析逻辑,提取DWG文件中的图层信息,包括图层名称、颜色、线型等。
-
构建图层表:将解析出的图层信息以表格形式展示在小程序界面中,支持用户查看和操作。
-
交互功能开发:实现图层显示/隐藏、颜色修改等交互功能,通过调用库的API或修改图层属性实现。
-
优化性能:针对移动端优化CAD文件加载和渲染性能,确保流畅的用户体验。
通过这些步骤,可以在鸿蒙Next中实现CAD文件的Web预览和图层表管理。