Skip to content
On this page

中心矩形

下面我们将介绍如何利用 mxcad 插件实现在CAD图纸中绘制中心矩形的功能,该功能中用户自主设定矩形的宽高,并通过矩形中心点设置矩形位置。

功能实现

  1. 设置中心矩形的宽度与高度

我们可以调用 MxCADUiPrDist 分别动态设置中心矩形的宽度与高度,在设置过程中我们也可以为其设置默认值。

ts
// 设置矩形宽度默认设置为5
let width = 5;
const getWidth = new MxCADUiPrDist();
getWidth.setMessage("\n请输入矩形宽度<5>");
const widthVal = await getWidth.go();
if (widthVal) {
    width = getWidth.value()
}

// 设置矩形高度默认设置为10
let height = 10;
const getHeight = new MxCADUiPrDist();
getHeight.setMessage("\n请输入矩形高度<10>");
const heightVal = await getHeight.go();
if (heightVal) {
    height = getHeight.value()
}
  1. 设置矩形的位置

我们通过调用 MxCADUiPrPoint 取点对象来确定矩形中心点的位置,并根据上述步骤中获取到的矩形宽高通过 McDbPolyline 多段线来绘制中心矩形。

ts
// 设置矩形中心点位置
const getCenterPt = new MxCADUiPrPoint();
getCenterPt.setMessage("请点击确定矩形中心");
const centerPt = await getCenterPt.go();
if (!centerPt) return;
// 获取矩形四个顶点位置
let pt1 = new McGePoint3d(centerPt.x + width / 2, centerPt.y + height / 2, centerPt.z)
let pt2 = new McGePoint3d(centerPt.x - width / 2, centerPt.y + height / 2, centerPt.z)
let pt3 = new McGePoint3d(centerPt.x - width / 2, centerPt.y - height / 2, centerPt.z)
let pt4 = new McGePoint3d(centerPt.x + width / 2, centerPt.y - height / 2, centerPt.z)
// 绘制中心矩形
let pl = new McDbPolyline;
pl.addVertexAt(pt1)
pl.addVertexAt(pt2)
pl.addVertexAt(pt3)
pl.addVertexAt(pt4)
const mxcad = MxCpp.App.getCurrentMxCAD();
pl.isClosed = true;
mxcad.drawEntity(pl);

功能扩展

  1. 实现自定义中心矩形类

为了方便后期管理与修改实体,我们可以通过继承 McDbCustomEntity 自定义实体类来扩展实现中心矩形类。

ts
// 自定义中心矩形类
class McDbTestCenterReact extends McDbCustomEntity {
    // 定义McDbTestCenterReact内部的点对象 
    // 矩形中心点
    private center: McGePoint3d = new McGePoint3d();
    // 矩形宽
    private width: number = 10;
    // 矩形高
    private height: number = 20;

    // 构造函数
    constructor(imp?: any) {
        super(imp);
    }
    // 创建函数
    public create(imp: any) {
        return new McDbTestCenterReact(imp)
    }
    // 获取类名
    public getTypeName(): string {
        return "McDbTestCenterReact";
    }
    //设置或获取矩形宽
    public set cWidth(val: number) {
        this.width = val;
    }
    public get cWidth(): number {
        return this.width;
    }
    // 设置矩形高
    public set cHeight(val: number) {
        this.height = val;
    }
    public get cHeight(): number {
        return this.height;
    }
    // 读取自定义实体数据center、 width、height
    public dwgInFields(filter: IMcDbDwgFiler): boolean {
        this.center = filter.readPoint("center").val;
        this.width = filter.readDouble("width").val;
        this.height = filter.readDouble("height").val;
        return true;
    }
    // 写入自定义实体数据centert、 width、height
    public dwgOutFields(filter: IMcDbDwgFiler): boolean {
        filter.writePoint("center", this.center);
        filter.writeDouble("width", this.width);
        filter.writeDouble("height", this.height);
        return true;
    }

    // 移动自定义对象的夹点
    public moveGripPointsAt(iIndex: number, dXOffset: number, dYOffset: number, dZOffset: number) {
        this.assertWrite();
        this.center.x += dXOffset;
        this.center.y += dYOffset;
        this.center.z += dZOffset;

    };
    // 获取自定义对象的夹点
    public getGripPoints(): McGePoint3dArray {
        let ret = new McGePoint3dArray()
        ret.append(this.center);
        return ret;
    };
    // 绘制实体
    public worldDraw(draw: MxCADWorldDraw): void {
        let pt1 = new McGePoint3d(this.center.x + this.width / 2, this.center.y + this.height / 2, this.center.z)
        let pt2 = new McGePoint3d(this.center.x - this.width / 2, this.center.y + this.height / 2, this.center.z)
        let pt3 = new McGePoint3d(this.center.x - this.width / 2, this.center.y - this.height / 2, this.center.z)
        let pt4 = new McGePoint3d(this.center.x + this.width / 2, this.center.y - this.height / 2, this.center.z)
        let pl = new McDbPolyline;
        pl.addVertexAt(pt1)
        pl.addVertexAt(pt2)
        pl.addVertexAt(pt3)
        pl.addVertexAt(pt4)
        pl.isClosed = true;
        draw.drawEntity(pl);
    }
    // 设置矩形中心点
    public setCenterPoint(pt: McGePoint3d) {
        this.assertWrite();
        this.center = pt.clone();
    }
    // 获取矩形中心点
    public getCenterPoint() {
        return this.center;
    }
}

功能实践

实践效果如下:

  • 点击中心矩形按钮,执行绘制中心矩形方法
  • 根据命令行提示步骤完成设置矩形的宽高
  • 点击画布设置矩形中心点位置
  • 成功绘制中心矩形