中心矩形
下面我们将介绍如何利用 mxcad 插件实现在CAD图纸中绘制中心矩形的功能,该功能中用户自主设定矩形的宽高,并通过矩形中心点设置矩形位置。
功能实现
- 设置中心矩形的宽度与高度
我们可以调用 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()
}
- 设置矩形的位置
我们通过调用 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);
功能扩展
- 实现自定义中心矩形类
为了方便后期管理与修改实体,我们可以通过继承 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;
}
}
功能实践
实践效果如下:
- 点击中心矩形按钮,执行绘制中心矩形方法
- 根据命令行提示步骤完成设置矩形的宽高
- 点击画布设置矩形中心点位置
- 成功绘制中心矩形