明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 269|回复: 1

(在线编辑DWG)在线CAD二次开发中线型表的使用方法

[复制链接]
发表于 2024-11-12 10:23:45 | 显示全部楼层 |阅读模式
本帖最后由 MxDraw 于 2024-11-12 10:26 编辑


前言
在DWG数据库中,线型样式存放在线型样式表McDbLinetypeTable()中,线型样式表中每一条记录称为线型表记录对象McDbLinetypeTableRecord()。每一个线型表记录对象都对应着一种线型样式,其中线型样式是随图纸保存,不同的图纸使用的线型样式都可能不一样。


线型表操作
1.获取当前控件的线型样式表
通过调用mxcad中的`MxCpp.getCurrentMxCAD()`得到当前的控件, 然后调用控件实例的getDatabase()方法得到数据库实例McDbDatabase(),在该数据库实例中调用getLinetypeTable()方法我们就能获取到当前控件的线型样式表McDbLinetypeTable()。
依次点击[线型样式表[线型表记录对象[数据库实例查看详细属性和方法说明。
  1. <font face="微软雅黑">   import { MxCpp} from "mxcad"
  2.    // 得到当前控件
  3.    const mxcad = MxCpp.getCurrentMxCAD();
  4.    // 拿到当前线型样式表
  5.    const lineTypeTable = mxcad.getDatabase().getLinetypeTable();</font>
复制代码

2. 添加线型
我们可以直接调用mxcad实例对象中的addLinetype()方法或addLinetypeEx()方法添加线型样式,再设置 drawLinetype 属性将添加的线型样式设置为当前绘制线型样式。
点击[McObject.addLinetype()][McObject.addLinetypeEx()]查看详细属性和方法说明。
  1. <font face="微软雅黑">   import { McApp } from "mxcad"
  2.    const mxcad = McApp.getCurrentMxCAD()
  3.    //定义虚线数据据,"MyLineType"是线型名,"6,-8"是虚线的一个单位定义,6是实线长,-8是空格长。
  4.    mxcad.addLinetype("MyLineType", "6,-10");
  5.    mxcad.addLinetypeEx("TestMyLine", '.5,-.2,["HW",STANDARD,S=.1,R=0.0,X=-0.1,Y=-.05],-.2',"");
  6.    //设计当前线型为"MyLineType"
  7.    mxcad.drawLinetype = "MyLineType";</font>
复制代码
此外,我们还可以通过得到当前数据库中的线型样式表McDbLinetypeTable(),然后向样式表中添加一个线型表记录对象McDbLinetypeTableRecord()
  1. <font face="微软雅黑">   import { McCmColor, MxCpp, McDbLinetypeTableRecord, McDb } from "mxcad"
  2.    const mxcad = MxCpp.getCurrentMxCAD();
  3.    // 拿到当前线型样式表
  4.    let linetypeTable = mxcad.getDatabase().getLinetypeTable();
  5.    // 创建一个线型记录对象
  6.    let newLinetypeRecord = new McDbLinetypeTableRecord();
  7.    // 设置线型虚线数量
  8.    newLinetypeRecord.numDashes = 2;
  9.    // 设置线型名
  10.    newLinetypeRecord.name = "TestMyLine"
  11.    // 添加线型
  12.    if (linetypeTable.add(newLinetypeRecord).isValid()) {
  13.    console.log("add ok");
  14.    }
  15. </font>
复制代码

3. 遍历所有线型
我们可以通过调用线型样式表McDbLinetypeTable()中的getAllRecordId()方法获取所有线型样式的id,再调用getMcDbLinetypeTableRecord() 方法返回线型表记录对象 McDbLinetypeTableRecord() ,得到所有线型样式数据。
  1. <font face="微软雅黑">   import { MxCpp } from "mxcad"
  2.    // 得到当前cad对象
  3.    let mxcad = MxCpp.getCurrentMxCAD();
  4.    // 获取线型表
  5.    let linetypeTable = mxcad.getDatabase().getLinetypeTable();
  6.    // 获取线型表中的所有记录对象id
  7.    let aryId = linetypeTable.getAllRecordId();
  8.    // 遍历线型记录对象id
  9.    aryId.forEach((id) => {
  10.        let linetypeRec = id.getMcDbLinetypeTableRecord();
  11.        if (linetypeRec === null) return;
  12.        console.log(linetypeRec);
  13.        console.log("linetypeRec.name:" + linetypeRec.name);
  14.    });
  15. </font>
复制代码

4. 删除线型
我们得到目标线型表记录对象McDbLinetypeTableRecord()后可调用该对象实例的erase()方法删除对象。
  1. <font face="微软雅黑">   import { MxCpp } from "mxcad"
  2.    // 获取线型表
  3.    let linetypeTable = MxCpp.getCurrentMxCAD().getDatabase().getLinetypeTable()
  4.    let linetypeId = linetypeTable.get("目标线型样式名")
  5.    linetypeId.erase()
  6.    // 更新显示
  7.    mxcad.updateDisplay()
  8. </font>
复制代码

5. 修改线型
mxcad 中修改线型的基础操作为删除原有线型,再重新添加定义线型,最后将目标对象新型设置为新增的线型,下面以让用户在CAD图上选择一个文字对象,然后操作对象所应用线型样式为例:
  1. <font face="微软雅黑">   import { MxCADSelectionSet, MxCADUiPrPoint, MxCADResbuf } from "mxcad"
  2.    let mxcad = MxCpp.getCurrentMxCAD();
  3.    // 把当图上,已经存的"TestMyLine"线型删除,为了mxcad.addLinetypeEx重新添加定义线型.
  4.    let linetypeRecord = mxcad.database.getLinetypeTable().get("TestMyLine");
  5.    if(!linetypeRecord.isErase()){
  6.    linetypeRecord.erase();
  7.    }
  8.    // 添加线型定义TestMyLine
  9.    let lintype = mxcad.addLinetypeEx("TestMyLine", '.5,-.2,["HW",STANDARD,S=.1,R=0.0,X=-0.1,Y=-.05],-.2',"");
  10.    if(!lintype.isValid() )return;
  11.    // 修改目标对象线型
  12.    let getEnt = new MxCADUiPrEntity();
  13.    let entId = await getEnt.go();
  14.    let ent = entId.getMcDbEntity();
  15.    if(!ent) return;
  16.    ent.linetypeId = lintype;
  17. </font>
复制代码

实践操作
1. 绘制不同线型的直线
1.1. 绘制虚线的方法:
  1. <font face="微软雅黑">       let mxcad = MxCpp.getCurrentMxCAD();
  2.        //绘制一个虚线
  3.        //定义虚线数据据,"MyLineType"是线型名,"10,-6"是虚线的一个单位定义,10是实线长,-6是空格长。
  4.        mxcad.addLinetype("MyLineType", "10,-6");
  5.        //设计当前线型为"MyLineType"
  6.        mxcad.drawLinetype = "MyLineType";
  7.        // 绘制一个虚线
  8.        mxcad.drawLine(0, 30, 100, 30);
  9.        // 绘制一个带宽度的斜虚线
  10.        mxcad.drawLineWidth = 5;
  11.        mxcad.drawLine(200, 30, 300, 130);
  12. </font>
复制代码
效果如下图:

1.2. 点划线的方法:
  1. <font face="微软雅黑">  //绘制一个点划线虚线,"15,-5,3,-5"是虚线的一个单位定义,15,3是实线长,-5是空格长,虚线按照上面的顺序间隔为一个单位绘制。
  2.        mxcad.addLinetype("MyLineType2", "15,-5,3,-5");
  3.        //把线型改点划线
  4.        mxcad.drawLinetype = "MyLineType2";
  5.        // 修改绘线的颜色为 255(红色),  255转成16进制是0x0000FF,其中,00是蓝色,第个二00是绿色,FF是红色。

  6.        mxcad.drawColor = new McCmColor(255, 0, 0);
  7.        //绘制一个红色点划线。
  8.        mxcad.drawLine(0, 120, 100, 120);
  9.        // 绘制一个带宽度红色点划斜线
  10.        mxcad.drawLineWidth = 4;
  11.        mxcad.drawLine(200, 120, 300, 220);
  12. </font>
复制代码
效果如下图:

1.3. 带文字的线性:
  1. <font face="微软雅黑">       //增加一个带有形的线型
  2.        mxcad.addTextStyle("MyLineTypeTextStyle", "txt.shx", "hztxt.shx", 1);
  3.        mxcad.addLinetypeEx("MyLineType3", "(12.7,("T=MxDraw","S=2.54","L=-5.08","R=0.0","X=-2.54","Y=-1.27"),-10.08)", "MyLineTypeTextStyle");
  4.        mxcad.drawLinetype = "MyLineType3";
  5.        mxcad.drawLineWidth = 0;
  6.        //绘制一个带文字。
  7.        mxcad.drawLine(350, 120, 600, 120);</font>
复制代码
效果如下图:
2. 项目实践
我们提供了在线示例demo:https://demo.mxdraw3d.com:3000/mxcad/。通过该demo在线修改CAD内图纸的实体线型,以及个性化设置每个实体的线型样式。其中,在修改线型比例前需要先确定实体的线型是否是虚线类,只有虚线类的线型才能支持修改线型,如果目标实体的线型是实线则需要先将修改实体的线型为虚线类再去修改线型比例,如下图:


本帖子中包含更多资源

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

x
发表于 2024-11-12 20:48:34 | 显示全部楼层
牛啊!!!!!!!!开源的吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-22 21:16 , Processed in 0.197197 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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