首页 > 编程语言 >WEB预览CAD(手机小程序浏览DWG)二次开发图层表的方法

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

时间:2024-05-11 13:55:31浏览次数:11  
标签:WEB const MxCpp layerTable mxcad DWG 二次开发 图层 layerRec

前言

在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梦想画图],点击图标打开图层特性管理器,可操作当前图纸内的所有图层,如下图所示:

 

标签:WEB,const,MxCpp,layerTable,mxcad,DWG,二次开发,图层,layerRec
From: https://www.cnblogs.com/yzy0224/p/18186348

相关文章

  • WebGL:使用着色器进行几何造型
    前言本文将介绍如何使用着色器来进行几何造型,说到几何图形大家一定都不陌生,比如说三角形、圆形,接触过WebGL基础使用的小伙伴一定都知道怎么去在画布上绘制一个三角形,只要传入三个顶点坐标,并选择绘图模式,我们就能在WebGL的画布上画出一个三角形。但是除了这种形式之外,我们还可以......
  • 在Linux中,如何设计一个高性能的Web服务器?
    设计一个高性能的Web服务器需要考虑多个方面,包括硬件选择、操作系统优化、Web服务器软件配置、数据库优化、以及使用负载均衡和缓存策略等。以下是一些设计高性能Web服务器的步骤和建议:1.硬件选择CPU:选择快速的多核处理器,以便处理大量的并发请求。内存:足够的内存可以提高处理......
  • 实时行情数据源接口websocket接入方法
    ​支持如下产品对接:外汇、国际期货、国内期货、国际金银、数字货币、股指期货、美股、印度股、港股、台股、A股产品代码获取地址:http://39.107.99.235:1008/market/market.php产品代码:比特币btcusdt以太坊ethusdt恒指期货HSI德指期货DAX英镑美元fx_sgbpusd欧......
  • 分享一个使用python调用websocket获取实时行情数据的方法
    这个站点可以获取:外汇、国际期货、国内期货、贵金属、能源、虚拟货币、股指期货、美股、台股、港股、印度股、A股、ETF等以下是Python的连接demo,可以参考下。同时也支持其他后端语言的连接,PHP、Java等。获取品种地址:http://39.107.99.235:1008/market/market.phpimportj......
  • Java web基础
    1、理解Jsp的page指令JSP(JavaServerPages)中的<%@page%>指令用于设置整个JSP页面的属性。它通常位于JSP页面的顶部,用于指定页面的一些配置信息。生存周期仅限制在本页面。2、理解Jsp的include指令在JSP中,<%@include%>指令用于在一个JSP页面中包含另一个文件的内容。这个指......
  • How-to-install-NetSuite-SuiteCloud-plug-in-to-WebStorm-Updated2021-11-CarlZeng
    Install/upgradeNetSuiteSuiteCloudIDEPlug-inSuiteCloudIDEplug-inSuiteCloudIDEplug-inforWebStormisanintegrateddevelopmentenvironmentforNetSuiteplatformdevelopment.ItprovidesauserinterfaceforSuiteCloudDevelopmentFramework(SDF),......
  • 传统互联网和 Web 3.0 在客户隐私和安全防护上的区别
    传统互联网和Web3.0在客户隐私和安全防护上的区别主要体现在数据管理和处理的方式上。下面详细解释这两种模型的区别:**传统互联网(Web1.0和Web2.0): 中心化数据存储:用户数据通常存储在中心化的服务器上,由服务提供商管理。这种模式存在数据被非法访问或黑客攻击的风险。......
  • react中使用craco,针对路径转换,修改webpack别名路径配置
    1.0首先下载craco依赖包npminstall@craco/craco-D2.0在项目根目录下面新建craco.config.js文件,里面内容配置为constpath=require('path')module.exports={webpack:{alias:{'@':path.resolve(__dirname,'src')}......
  • 使用selenium时,用webdriver初始化浏览器时间过久并伴随报错 operation timed out 的处
    我使用的系统是archlinux,在日常更新软件包时系统自动将selenium更新到目前(2024年5月)最新的版本,即:python-selenium4.20.0-1。在运行我的爬虫时报错缺少依赖包,经过一番查询得知现在的驱动由webdriver_manger统一接管了。webdrivermanger来对浏览器驱动和浏览器版本进行管理,但aur......
  • win10不通过RaiDrive直接连接webDev的方式
    此方法适用于输入输入域名+端口号填写完账号密码总是连接不上的情况修改服务此电脑右键-管理-服务-WebClient设为自动,停止服务修改注册表修改注册表使得WIN同时支持http和https:定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters把BasicAuthLe......