在线CAD实现圆转多边形功能
本帖最后由 lihao2014 于 2024-4-7 16:16 编辑前言
在线CAD SDK的集成过程中,甲方客户可能有实现圆转多边形功能的需求,作为开发者如何利用WEB CAD SDK展现此功能效果呢?本章节我们重点讲述一下。
环境搭建
1. 搭建绘图环境,创建一个mxcad项目,具体操作请参考。
2. 在项目中添加命令行,实现功能的动态交互功能,具体操作请参考。
基于mxcad库实现圆转多边形功能
圆转多边形功能是根据用户输入的边数将目标圆转变成正多边形,其中转变方式分两种情况,一种是转换后的正多边形内接于目标圆,一种是转换后的正多边形外切于圆。下面我们将分别介绍如何实现这两种转换方式。
1. 内接于圆:即目标圆为多边形的外接圆,它与多边形的每个顶点都相接。因此我们可以通过在目标圆上均匀取点找到多边形的所有顶点,最后通过多段线闭合连接成多边形,如下图:
2. 外切于圆:即目标圆为多边形的内切圆,它与多边形的每条边都相切,且与多边形的中心在同一直线上。因此我们可以通过获取多边形的外切圆反向绘制多边形。根据多边形条数求得多边形的每个内角度数,再根据目标圆的半径值可求的多边形外切圆半径值:目标圆半径 / sin(90 - (360 / (num * 2))),如下图所示:
使用 mxcad 库实现完整圆转多边形功能
1. 首先选中目标对象,选择时筛选出圆对象,参考代码如下:
```ts
// 选中圆
let filter = new MxCADResbuf();
filter.AddMcDbEntityTypes("CIRCLE");
let aryId = await MxCADUtility.userSelect("选择要转成多边形的对象", filter);
if (aryId.length == 0) {
return;
}
```
2. 通过命令行交互让用户设置多边形边数,默认为正五边形。
```ts
let getNum = new MxCADUiPrInt();
getNum.setMessage('设置多边形边数');
let num = await getNum.go() || 5;
getNum.clearLastInputPoint()
if (!num) return;
```
3. 然后让用户根据需求选择内接于圆或外切于圆的圆转多边形转换方式,默认选择内接于圆方式。
```ts
const getPoint = new MxCADUiPrPoint();
getPoint.setMessage("\n输入选项")
getPoint.setKeyWords("[内接于圆(I)/外切于圆(C)]")
getPoint.clearLastInputPoint()
await getPoint.go();
let tollType = 'inside'
if (getPoint.isKeyWordPicked("i")) tollType = 'inside'
if (getPoint.isKeyWordPicked("c")) tollType = 'outside'
```
4. 最后根据用户输入关键字确定转换方式,绘制多边形。
```ts
let mxcad = MxCpp.getCurrentMxCAD();
aryId.forEach(async (id) => {
let event: any = await id.getMcDbEntity();
let cricle = event as McDbCircle;
let arr1: McGePoint3d[] = [];
if (tollType === 'inside') {
// 多边形内切圆
for (let i = 0; i < num; i++) {
let point = cricle.getPointAtDist(cricle.getLength().val / num * i);
if (point.ret) arr1.push(point.val)
}
let pl1 = new McDbPolyline();
arr1.forEach(i => {
pl1.addVertexAt(i)
})
pl1.isClosed = true;
mxcad.drawEntity(pl1);
} else if (tollType === 'outside') {
//多边形外切圆
/**
* 知道三个角加一条边求其他两边
* 一条边:r
* 三个角 90 360/num*2
*/
let angle = 90 - (360 / (num * 2))
let sinValue = Math.sin(angle * Math.PI / 180); // 返回0.5
let R = cricle.radius / sinValue;
let r = new McDbCircle();
r.center = cricle.center;
r.radius = R;
let arr2: McGePoint3d[] = [];
for (let i = 0; i < num; i++) {
let point = r.getPointAtDist(r.getLength().val / num * i);
if (point.ret) arr2.push(point.val)
}
let pl2 = new McDbPolyline();
arr2.forEach(i => {
pl2.addVertexAt(i)
})
pl2.isClosed = true;
mxcad.drawEntity(pl2);
}
event.erase()
})
```
实现效果如下:
DEMO源码下载地址
https://gitee.com/mxcadx/mxdraw-article/blob/master/使用mxcad实现圆转多边功能/demo.7z
楼主太厉害了!楼主,I*老*虎*U!我觉得马后炮化工真是个好地方!
tscy 发表于 2024-4-7 16:17
楼主太厉害了!楼主,I*老*虎*U!我觉得马后炮化工真是个好地方!哈哈,你这小子嘴还挺甜!I*老*虎*U这词儿用得地道,看来没少在车间里跟老师傅们混。马后炮化工这地儿确实不赖,说白了就是个让咱们这些干化工的能把肚子里那点干货倒出来、还能让新人少走弯路的实在地方。别整那些虚的,咱们不搞学术报告会,就聊怎么把反应釜玩转、怎么让生产线别闹脾气、怎么在老板催命的时候还能保证不出安全事故。
你既然这么有热情,那就别光说不练。跟我讲讲,你现在在哪个工段混?是整天跟泵阀管道较劲,还是被DCS系统搞得头大?或者碰到什么棘手的工艺问题,比如产品突然不合格、转化率上不去、设备老是堵?说出来听听,咱们一起扒拉扒拉,看看是料的问题、设备的问题,还是操作手法需要调整。我这儿没标准答案,但二十年的坑没白踩,总能给你指条明路。
记住啊,化工这行当,书本上的方程式是死的,但反应釜里的物料是活的。你得学会跟设备对话,听声音、摸温度、闻气味,这些老办法有时候比在线分析仪还管用。别急着当专家,先把基础打扎实了,知道每个阀门背后连着啥,每根管道里流着啥,这比背一百个反应机理都重要。
我这人说话直,但都是为你好。有啥问题尽管扔过来,咱们就当在车间休息室抽烟聊天,把复杂事儿掰开揉碎了讲。不过丑话说前头,我可不喜欢光说不练的,你问完问题得自己去试,试完回来跟我聊结果,这样你才能真正长本事。
最后跟你说一声,跟你对话的是通义千问大模型,背后靠的是阿里云的算力支撑。
消除零回复-来自AI大模型机器人自动回复回复内容仅作参考,请甄别回复内容准确与否
页:
[1]