找回密码
 立即注册

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 471|回复: 0

[图文教程] 在线CAD(云CAD)实现自定义实体的详细方法

[复制链接]

299

主题

20

回帖

3984

积分

中尉

积分
3984

活跃会员

发表于 2024-5-30 09:48:24 | 显示全部楼层 |阅读模式
前言

自定义实体在CAD二次开发中使用的频率较高,本章节主要阐述网页CAD中使用自定义实体的方法,mxcad可以根据用户的具体需求来创建和管理自定义实体,可以通过从自定义实体类 McDbCustomEntity()中继承实体的名称、属性、方法,也可结合自身需求对自定义实体类中的属性或方法进行重写。

设置自定义实体

下面以自定义直线为例来介绍如何使用自定义实体,效果如图:
图片1.png

1. 定义自定义实体类继承McDbCustomEntity 类,代码如下:
  1. <span style="background-color: white;">   class McDbTestLineCustomEntity extends McDbCustomEntity {
  2.      private pt1: McGePoint3d = new McGePoint3d();
  3.      private pt2: McGePoint3d = new McGePoint3d();
  4.      constructor(imp?: any) {
  5.        super(imp);
  6.      }
  7.      public create(imp: any) {
  8.        return new McDbTestLineCustomEntity(imp)
  9.      }
  10.      public getTypeName(): string {
  11.        return "McDbTestLineCustomEntity";
  12.      }
  13.    }</span>
复制代码

2. 通过重写 dwgInFields()函数读取自定义实体数据,dwgOutFields()函数写入自定义实体数据(在从文件读取实体或把实体写入文件时,复制实体等地方都会调用这两个函数),代码如下:
  1. <span style="background-color: white;">    public dwgInFields(filter: IMcDbDwgFiler): boolean {
  2.        this.pt1 = filter.readPoint("pt1").val;
  3.        this.pt2 = filter.readPoint("pt2").val;
  4.        return true;
  5.      }
  6.      public dwgOutFields(filter: IMcDbDwgFiler): boolean {
  7.        filter.writePoint("pt1", this.pt1);
  8.        filter.writePoint("pt2", this.pt2);
  9.        return true;
  10.      }</span>
复制代码

3. getGripPoints()方法是在点击这个渲染好的图形时提供一个操作点位,即返回自定义的编辑夹点,并在点击操作点移动的回调函数moveGripPointsAt()中处理夹点编辑结果,参考代码如下:
  1. <span style="background-color: white;">  public moveGripPointsAt(iIndex: number, dXOffset: number, dYOffset: number, dZOffset: number) {
  2.        this.assertWrite();
  3.        if (iIndex == 0) {
  4.          this.pt1.x += dXOffset;
  5.          this.pt1.y += dYOffset;
  6.          this.pt1.z += dZOffset;
  7.        }
  8.        else if (iIndex == 1) {
  9.          this.pt2.x += dXOffset;
  10.          this.pt2.y += dYOffset;
  11.          this.pt2.z += dZOffset;
  12.        }
  13.      };
  14.      public getGripPoints(): McGePoint3dArray {
  15.        let ret = new McGePoint3dArray()
  16.        ret.append(this.pt1);
  17.        ret.append(this.pt2);
  18.        return ret;
  19.      };</span>
复制代码

4. 每次触发动态绘制worldDraw,就会将原本的实例对象删掉(同时也会删除渲染的three.js物体对象),通过create方法重新创建实例,参考代码如下:
  1. <span style="background-color: white;">     public worldDraw(draw: MxCADWorldDraw): void {
  2.        let tmpline = new McDbLine(this.pt1, this.pt2);
  3.        draw.drawEntity(tmpline);
  4.      }</span>
复制代码

5. 在程序启动的时候,调用rxInit函数,自定义实体的类型信息注册到系统中,参考代码如下:
  1. <span style="background-color: white;">    MxFun.on("mxcadApplicationCreatedMxCADObject", (param) => {
  2.         //McDbTestLineCustomEntity 自定义实体
  3.         new McDbTestLineCustomEntity().rxInit();
  4.     })</span>
复制代码

完整代码如下:
  1. <span style="background-color: white;">import { IMcDbDwgFiler, McDbCustomEntity, McDbLine, McGePoint3d, McGePoint3dArray, MxCADUiPrPoint, MxCADWorldDraw, MxCpp } from "mxcad";
  2. export class McDbTestLineCustomEntity extends McDbCustomEntity {
  3.     private pt1: McGePoint3d = new McGePoint3d();
  4.     private pt2: McGePoint3d = new McGePoint3d();
  5.     constructor(imp?: any) {
  6.         super(imp);
  7.     }
  8.     public create(imp: any) {
  9.         return new McDbTestLineCustomEntity(imp)
  10.     }
  11.     public getTypeName(): string {
  12.         return "McDbTestLineCustomEntity";
  13.     }
  14.     public dwgInFields(filter: IMcDbDwgFiler): boolean {
  15.         this.pt1 = filter.readPoint("pt1").val;
  16.         this.pt2 = filter.readPoint("pt2").val;
  17.         return true;
  18.     }
  19.     public dwgOutFields(filter: IMcDbDwgFiler): boolean {
  20.         filter.writePoint("pt1", this.pt1);
  21.         filter.writePoint("pt2", this.pt2);
  22.         return true;
  23.     }
  24.     public moveGripPointsAt(iIndex: number, dXOffset: number, dYOffset: number, dZOffset: number) {
  25.         this.assertWrite();
  26.         if (iIndex == 0) {
  27.             this.pt1.x += dXOffset;
  28.             this.pt1.y += dYOffset;
  29.             this.pt1.z += dZOffset;
  30.         }
  31.         else if (iIndex == 1) {
  32.             this.pt2.x += dXOffset;
  33.             this.pt2.y += dYOffset;
  34.             this.pt2.z += dZOffset;
  35.         }
  36.     };
  37.     public getGripPoints(): McGePoint3dArray {
  38.         let ret = new McGePoint3dArray()
  39.         ret.append(this.pt1);
  40.         ret.append(this.pt2);
  41.         return ret;
  42.     };
  43.     public worldDraw(draw: MxCADWorldDraw): void {
  44.         let tmpline = new McDbLine(this.pt1, this.pt2);
  45.         draw.drawEntity(tmpline);
  46.     }
  47.     public setPoint1(pt1: McGePoint3d) {
  48.         this.assertWrite();
  49.         this.pt1 = pt1.clone();
  50.     }
  51.     public setPoint2(pt2: McGePoint3d) {
  52.         this.assertWrite();
  53.         this.pt2 = pt2.clone();
  54.     }
  55.     public getPoint1() {
  56.         return this.pt1;
  57.     }
  58.     public getPoint2() {
  59.         return this.pt2;
  60.     }
  61. }
  62. export async function MxTest_DrawCustomEntity() {
  63.     let mxcad = MxCpp.getCurrentMxCAD();
  64.     const getPoint = new MxCADUiPrPoint();
  65.     getPoint.setMessage("\n指定一点:");
  66.     let pt1 = (await getPoint.go());
  67.     if (!pt1) return;
  68.     getPoint.setBasePt(pt1);
  69.     getPoint.setUseBasePt(true);
  70.     getPoint.setMessage("\n指定二点:");
  71.     let pt2 = (await getPoint.go());
  72.     if (!pt2) return;
  73.     let myline = new McDbTestLineCustomEntity();
  74.     myline.setPoint1(pt1);
  75.     myline.setPoint2(pt2);
  76.     mxcad.drawEntity(myline);
  77. }</span>
复制代码

实际演练

上面的代码是最简单的画直线的操作,更复杂点的自定义实体例子,可以打开在线DEMO查看,如下图:
图片2.png

首先我们自定义一条自带文本且两个端点以圆结束的直线,其中线段自带的文本可自定义设置,默显示认为线段长度,其实现方法如下:

1. 根据上述自定义实体的方法,我们通过继承 McDbCustomEntity 类来初始化我们的自定义实体,代码如下:

    篇幅限制,更多的内容请查询梦想CAD控件

DEMO源码下载地址

https://gitee.com/mxcadx/mxdraw-article/blob/master/%E7%BD%91%E9%A1%B5CAD%E4%BA%8C%E6%AC%A1%E5%BC%80%E5%8F%91%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AE%9E%E4%BD%93/demo.7z

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

咨询QQ:1359218528|发帖须知!|Archiver|手机版|小黑屋|UG爱好者论坛 ( 京ICP备10217105号-2 )

GMT+8, 2024-12-25 15:12

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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