网易首页 > 网易号 > 正文 申请入驻

在线CAD利用AI实现多行文本扩展功能

0
分享至

前言

在最新版本的mxcad插件中,我们提供了一个名为MxCADMText的自定义编辑器实体类,用于在CAD中渲染和管理富文本编辑器。基于该类,我们可以将富文本编辑器中的强大功能转移实现在我们的MxCAD项目中。

在原本的富文本编辑器功能上,我们将文本与CAD功能相结合实现了多行文本的扩展,用户可以根据自己项目的需求将实体以文本内容的形式插入到我们的多行文本内,接下来我们将详细讲述如何在MxCAD项目的多行文本编辑功能中插入自定义文本实体,富文本编辑功能示例:

注册同心圆实体文本

下面我们将以在多行文本编辑器中插入一个同心圆实体文本作为示例,介绍基础的扩展步骤。

1. 实现自定义文本类

MxCADMText类中注册的所有自定义文本实体都需要继承MxCADBaseCustomText这个自定义文本基类,否则多行文本实体内部将无法识别你的自定义文本。

/**
* 同心圆自定义文本类
* 用于在MxCAD多行文本中插入同心圆
*/
class MxCADConcentricCircles extends MxCADBaseCustomText {
// 自定义文本的类型唯一标识
type = "MxCADConcentricCircles";
/**
* 计算同心圆的尺寸
* @param entity MxCAD多行文本实体
* @param textNode 文本节点
* @returns 计算数据,包含宽度和高度
*/
calculate(entity: MxCADMText, textNode: MarksStyleText): MxCADCustomTextCalculateData {
// 获取外圆半径
const outerRadius = this.getOuterRadius(entity, textNode);
// 计算同心圆占用的空间大小
const width = outerRadius * 2;
const height = outerRadius * 2;
return {
width,
height
};
}
/**
* 创建同心圆实体
* @param entity MxCAD多行文本实体
* @param textNode 文本节点
* @param calculateData 计算数据
* @param renderData 渲染数据
* @returns 创建的实体数组
*/
create(
entity: MxCADMText,
textNode: MarksStyleText,
calculateData: MxCADCustomTextCalculateData,
renderData: CreateData
): (McDbEntity | McDbCustomEntity)[] {
// 获取外圆半径
const outerRadius = this.getOuterRadius(entity, textNode);
// 计算中圆半径
const middleRadius = outerRadius * 0.7;
// 计算内圆半径
const innerRadius = outerRadius * 0.4;
// 创建同心圆实体
const circles: McDbEntity[] = [];
// 计算圆心位置
// renderData.position是左上角的位置
const leftTopPosition = renderData.position.clone();
// 将圆心位置从左上角偏移一个半径的距离,使同心圆左上角与renderData.position对齐
// 圆心坐标 = 左上角坐标 + 圆半径
const centerX = leftTopPosition.x + outerRadius;
const centerY = leftTopPosition.y - outerRadius;
// 创建最终圆心坐标
const centerPosition = new McGePoint3d(centerX, centerY, leftTopPosition.z);
// 创建外圆
const outerCircle = new McDbCircle();
outerCircle.radius = outerRadius;
outerCircle.center = centerPosition;
circles.push(outerCircle);
// 创建中圆
const middleCircle = new McDbCircle();
middleCircle.radius = middleRadius;
middleCircle.center = centerPosition;
circles.push(middleCircle);
// 创建内圆
const innerCircle = new McDbCircle();
innerCircle.radius = innerRadius;
innerCircle.center = centerPosition;
circles.push(innerCircle);
return circles;
}
/**
* 获取外圆半径
* @param entity MxCAD多行文本实体
* @param textNode 文本节点
* @returns 外圆半径
*/
private getOuterRadius(entity: MxCADMText, textNode: MarksStyleText): number {
// 根据文本字体大小动态计算圆的半径
const fontSize = textNode?.fontSize || 1;
// 调整半径计算,使圆的大小合适
return fontSize * entity.textBaseHeight / 2.5;
}
constructor() {
super();
}
}

注意:

`create()`方法用于创建实际的图形实体。

`calculate()`方法用于计算自定义文本在多行文本中占用的空间。

`type`属性用于定义自定义文本的类型标识,该type将在MxCADMText类中作为唯一标识。

2. 注册自定义文本

在MxCAD项目内的MxPluginContext上下文对象中我们已经暴露出了`registerEditorCustomTextPlugin()`注册方法,将上述已经写好的类放入该方法中就可以在自定义文本中插入同心圆实体了。

/**
* 注册同心圆自定义文本插件
*/
const insertConcentricCircles = MxPluginContext.registerEditorCustomTextPlugin(
new MxCADConcentricCircles(),
{
// 双击图形时的回调函数
onDbClick: (node) => {
console.log("双击了同心圆:", node);
},
// UI数据
uiData: {
// 图标
icon: "yuan",
// 文本
text: "同心圆",
// 提示文本
tip: "插入同心圆",
// 点击事件
onClick: () => {
// 插入同心圆
insertConcentricCircles({
// 这里可以传入自定义参数
});
}
}
}
);

`insertConcentricCircles(props: any, isUpdate?: boolean)`方法中的 props 为外部传入的参数对象,可以用于设置实体的参数绘制,设置后通过 `MxCADConcentricCircles ` 类内部 `calculate()`或`create()`方法内的 `textNode.props`中获取;isUpdate 参数是用于已经插入了实体对象并处于文本编辑状态时,单击或双击实体进行修改操作后通知多行文本修改节点内容。

// 插入同心圆并传入自定义参数
insertConcentricCircles({
// 例如,可以传入不同的半径比例
radiusRatio: {
outer: 1,
middle: 0.7,
inner: 0.4
}
});
/**
*更新
onDbClick: (node) => {
// ... 处理node数据,更新params
insertConcentricCircles(params, true);
}
*/

// 在create方法中使用这些参数:
create(entity, textNode, calculateData, renderData) {
// 获取自定义参数
const radiusRatio = renderData.props?.radiusRatio || {
outer: 1,
middle: 0.7,
inner: 0.4
};
const outerRadius = this.getOuterRadius(entity, textNode);
const middleRadius = outerRadius * radiusRatio.middle;
const innerRadius = outerRadius * radiusRatio.inner;
// 其他代码...
}

onDbClick:双击文本时的回调函数,该回调函数内有一个node回调参数,该参数内部包含了文本节点的数据,即`MxCADConcentricCircles ` 类内部的`textNode`。利用该函数可实现交互式自定义文本,例如在双击时显示一个对话框来修改参数。

MxPluginContext.registerEditorCustomTextPlugin(
new MxCADConcentricCircles(),
{
onDbClick: (node) => {
// 显示一个对话框来修改参数
showDialog(node, (newParams) => {
// 更新自定义文本
updateCustomText(node, newParams);
});
},
// 其他配置...
}
);

uiData:设置插入实体在编辑器中的ui配置,其中icon值可以设置为iconfont字体图标。

3. 在项目初始时执行注册事件

function rxInitCircle() {
/**
...params
设置初始参数
*/
insertConcentricCircles(params)
}

// MxCAD创建成功,相当于mxcad init\_mxcad事件.
MxFun.on("mxcadApplicationCreatedMxCADObject", (param) => {
rxInitCircle()
}

4. 运行效果演示:

扩展实践(注册粗糙度实体文本)

1. 构造粗糙度自定义实体文本注册类

// 绘制最初始的文本实体
const getEntity = (entity: MxCADMText, textNode: MarksStyleText) => {
const roughness = new McDbTestRoughness();
roughness.setPos(new McGePoint3d(0, 0, 0));
roughness.rouDimHeight = (textNode?.fontSize ? textNode.fontSize : 1) * entity.textBaseHeight;
const form = textNode.props;
roughness.rougMarkType = form.selectSymbolNum;
roughness.textLeftStr = form.textLeftStr;
roughness.rougCornerType = form.rougCornerType === "无" ? "" : form.rougCornerType;
roughness.isRoungSameRequire = form.isRoungSameRequire;
roughness.isShowMostSymbols = form.isShowMostSymbols;
const dataArr = form.textUpStr.filter((item) => item != "");
roughness.textUpStr = JSON.parse(JSON.stringify(dataArr)).reverse();
roughness.textDownStr = form.textDownStr.filter((item) => item != "");
roughness.isAddRougLongLine = form.isAddLongLine;
return roughness
}
// 构建文本注册类
class MxCADTestRoughnessText extends MxCADBaseCustomText {
// type为后续多行文本插入的唯一标识
type = "MxCADTestRoughnessText"
calculate(entity: MxCADMText, textNode: MarksStyleText): MxCADCustomTextCalculateData {
const roughness = getEntity(entity, textNode);
const box = roughness.getBoundingBox();
const width = box.maxPt.x - box.minPt.x
const height = box.maxPt.y - box.minPt.y;
return {
width,
height
}
}
create(entity: MxCADMText, textNode: MarksStyleText, calculateData: MxCADCustomTextCalculateData, renderData: CreateData): (McDbEntity | McDbCustomEntity)[] {
const roughness = getEntity(entity, textNode);
const pos = roughness.getPos();
//设置粗糙度在文本中的位置
const { minPt, maxPt } = roughness.getBoundingBox();
const basePt = new McGePoint3d(minPt.x, maxPt.y);
const v = pos.sub(basePt)
const pt = renderData.position.clone().addvec(v)
roughness.setPos(pt);
if (entity.getMTextImp().entityType == 'mtext' && !entity.getMTextImp().isEditState) {
return [roughness]
} else {
const entityArr = roughness.getAllEntity();
return [...entityArr]
}
}
constructor() {
super()
}
}

2. 注册粗糙度文本

粗糙度弹框的具体实现可以具体参考在云图开发包中MxCAD项目内的`extools`目录下的实现源码。

// 注册粗糙度文本
function rxInitRoughnessText() {
// 使用插件上下文中的函数
const insertCustomText = MxPluginContext.registerEditorCustomTextPlugin(
new MxCADTestRoughnessText(),
{
// 双击文本时的回调函数
onDbClick: (node) => {
showRoughnessDialog(true, node as MarksStyleText)
},
uiData: {
icon: 'icon-a-1',
tip: '粗糙度',
onClick: () => {
// 插入自定义公式
showRoughnessDialog(false)
}
}
}
)
const showRoughnessDialog = (isUpdate: boolean = false, textNode?: MarksStyleText) => {
if (isUpdate) {
const roughness = new McDbTestRoughness();
const form = textNode.props;
roughness.rougMarkType = form.selectSymbolNum;
roughness.textLeftStr = form.textLeftStr;
roughness.rougCornerType = form.rougCornerType === "无" ? "" : form.rougCornerType;
roughness.isRoungSameRequire = form.isRoungSameRequire;
roughness.isShowMostSymbols = form.isShowMostSymbols;
roughnessHandle.value = roughness;
const dataArr = form.textUpStr.filter((item) => item != "");
roughness.textUpStr = JSON.parse(JSON.stringify(dataArr)).reverse();
roughness.textDownStr = form.textDownStr.filter((item) => item != "");
roughness.isAddRougLongLine = form.isAddLongLine;
}
dialog.showDialog(true, { title: t("表面粗糙度") }).then(async ({ data, isCanceled }) => {
// 需要等待cancel或者confirm调用才会触发
if (!isCanceled) {
insertCustomText(data.roughnessData, isUpdate)
}
});
}
}

3. 初始化粗糙度自定义文本

// MxCAD创建成功,相当于mxcad init\_mxcad事件.
MxFun.on("mxcadApplicationCreatedMxCADObject", (param) => {
rxInitRoughnessText()
}

4. 实践效果演示

初始插入,如下图:

双击修改,如下图:

修改后最终以多行文本形式绘制在图纸中,如下图:

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
当着120国面!王毅正告高市:敢踏足台湾,中国会让日本输得更惨

当着120国面!王毅正告高市:敢踏足台湾,中国会让日本输得更惨

福建平子
2026-02-16 07:05:49
史上首次!说唱歌手公开致敬吴亦凡

史上首次!说唱歌手公开致敬吴亦凡

嘻笑堂
2026-02-09 01:30:41
赵光义登基后,面对兄长赵匡胤留下的24岁皇后,他是如何对待的?

赵光义登基后,面对兄长赵匡胤留下的24岁皇后,他是如何对待的?

马蹄烫嘴说美食
2026-02-15 16:58:38
揪心!谷爱凌脑出血休克,癫痫发作濒死边缘,母亲泪崩曝细节

揪心!谷爱凌脑出血休克,癫痫发作濒死边缘,母亲泪崩曝细节

古事寻踪记
2026-02-06 07:13:45
米兰冬奥会自由式滑雪女子大跳台决赛 谷爱凌领衔双姝出击

米兰冬奥会自由式滑雪女子大跳台决赛 谷爱凌领衔双姝出击

环球体坛啄木鸟
2026-02-16 20:05:19
真的难!2026年B级车市场开启“大降价”,最大降幅52%,合资霸榜

真的难!2026年B级车市场开启“大降价”,最大降幅52%,合资霸榜

芭比衣橱
2026-02-15 20:02:16
2026年央视春晚节目单发布,合作伙伴超20家知名公司,宇树机器人今年将表演武术

2026年央视春晚节目单发布,合作伙伴超20家知名公司,宇树机器人今年将表演武术

金融界
2026-02-16 15:56:23
这3种手术不需要做!存活率接近98%,常做反而会伤身体!

这3种手术不需要做!存活率接近98%,常做反而会伤身体!

今日养生之道
2026-02-16 10:44:19
大年三十晚上,要记得在枕头下面放些钱,早知道,早准备!

大年三十晚上,要记得在枕头下面放些钱,早知道,早准备!

阿天爱旅行
2026-02-16 19:58:27
听说闫学晶炫富导致中央戏剧学院的管理层都被团灭了!

听说闫学晶炫富导致中央戏剧学院的管理层都被团灭了!

达文西看世界
2026-02-15 20:25:40
恒生科技指数跌超1%,阿里巴巴跌2.7%,小米集团跌3.09%

恒生科技指数跌超1%,阿里巴巴跌2.7%,小米集团跌3.09%

金融界
2026-02-16 09:56:32
在日华人直言:如今中国要是再和日本发生冲突,根本撑不过14年!

在日华人直言:如今中国要是再和日本发生冲突,根本撑不过14年!

南权先生
2026-02-12 15:39:07
女老师与学生同居:使用道具助兴,高颜值照流出,下流细节披露

女老师与学生同居:使用道具助兴,高颜值照流出,下流细节披露

博士观察
2026-02-14 18:29:19
全红婵回家过年:贴春联,骑电鸡搭老爸飞驰,哥哥放鞭炮,年味满

全红婵回家过年:贴春联,骑电鸡搭老爸飞驰,哥哥放鞭炮,年味满

微风轻拂面
2026-02-16 18:51:56
林彪未能指挥抗美援朝战争,既非身体不好,更非怯战,而是另有隐情

林彪未能指挥抗美援朝战争,既非身体不好,更非怯战,而是另有隐情

霹雳炮
2025-12-21 20:46:18
马筱梅除夕晒幸福!汪小菲打高尔夫,全家吃高定菜,张兰做法费解

马筱梅除夕晒幸福!汪小菲打高尔夫,全家吃高定菜,张兰做法费解

鱼语昱雨轩
2026-02-16 19:17:28
第一个面临消失的职业,不是幼师,不是快递员,而是这三种工作?

第一个面临消失的职业,不是幼师,不是快递员,而是这三种工作?

来科点谱
2026-02-11 08:51:30
穆里尼奥欧冠对阵皇家马德里前发出严厉警告:他们受伤了

穆里尼奥欧冠对阵皇家马德里前发出严厉警告:他们受伤了

本泽体育
2026-02-16 16:13:37
马英九摊牌:两岸开战在所难免,台成不了乌克兰,只因有致命死穴

马英九摊牌:两岸开战在所难免,台成不了乌克兰,只因有致命死穴

一叶禅林
2026-02-16 20:39:14
带娃上班被停职,我把娃扔董事长桌上:你孙子我不要了!

带娃上班被停职,我把娃扔董事长桌上:你孙子我不要了!

极品小牛肉
2026-01-21 09:48:29
2026-02-16 22:24:49
CAD梦想画图
CAD梦想画图
是一款极速轻量级的CAD软件
603文章数 123关注度
往期回顾 全部

科技要闻

OpenAI拿下OpenClaw之父 承诺开源绝不动摇

头条要闻

女子徒步3000公里后去看病结果生了个娃:全程不知怀孕

头条要闻

女子徒步3000公里后去看病结果生了个娃:全程不知怀孕

体育要闻

遭针对?谷爱凌炮轰国际雪联安排

娱乐要闻

2026春晚开始 蔡明和机器人蔡明同框

财经要闻

2025,中国商业十大意外,黄金只排第九

汽车要闻

叫停纯屏操作 工信部拟推车内实体操作件强制国标

态度原创

健康
教育
亲子
时尚
军事航空

转头就晕的耳石症,能开车上班吗?

教育要闻

目前违规办班的中小学老师是越来越少了!

亲子要闻

娃晚上不睡、早上不起?是大脑这项功能滞后

记录最近收获很大的一次深度链接

军事要闻

慕安会美国角色逆转 中国议题"打满全场"

无障碍浏览 进入关怀版