代码执行
大约 4 分钟
代码执行
代码执行功能允许直接运行 JavaScript 代码,适合懂 JS 的用户编写简单的自动化逻辑。
EXECJS - 执行代码
弹出代码输入对话框,执行用户输入的 JavaScript 代码。
命令名: EXECJS
用法
命令: EXECJS执行命令后会弹出代码输入对话框,在对话框中输入 JavaScript 代码,点击"执行"按钮执行代码。
对话框功能
| 按钮 | 说明 |
|---|---|
| 执行 | 执行输入的代码 |
| 取消 | 取消执行 |
| 清空 | 清空编辑区内容 |
| 示例 | 加载代码示例 |
| 保存 | 保存当前代码 |
| 加载 | 加载已保存的代码 |
执行上下文 API
执行的代码可以访问 vjcad 库导出的所有 API,包括:
核心对象
| 对象 | 说明 |
|---|---|
Engine | 核心引擎,访问文档、图层、视图等 |
Engine.currentDoc | 当前文档 |
Engine.currentSpace | 当前空间 |
几何类型
| 类 | 说明 |
|---|---|
Point2D | 二维点类 |
实体类型
| 类 | 说明 |
|---|---|
LineEnt | 直线实体 |
CircleEnt | 圆实体 |
ArcEnt | 圆弧实体 |
PolylineEnt | 多段线实体 |
TextEnt | 单行文字实体 |
MTextEnt | 多行文字实体 |
| ... | 更多实体类 |
常用函数
| 函数 | 说明 |
|---|---|
writeMessage(msg) | 输出消息到命令行(支持 HTML) |
message.info(msg) | 显示信息提示(蓝色 Toast) |
message.error(msg) | 显示错误提示(红色 Toast) |
message.warn(msg) | 显示警告提示(橙色 Toast) |
message.success(msg) | 显示成功提示(绿色 Toast) |
Engine.addEntities(...entities) | 添加实体到画布 |
Engine.zoomExtents() | 缩放到全图 |
regen() | 刷新显示 |
代码示例
绘制矩形
// 绘制矩形 (使用实体类)
const points = [
[0, 0],
[100, 0],
[100, 50],
[0, 50],
[0, 0]
];
for (let i = 0; i < points.length - 1; i++) {
const line = new LineEnt(points[i], points[i+1]);
line.setDefaults();
Engine.addEntities(line);
}
Engine.zoomExtents();
message.info("矩形绘制完成");绘制同心圆
// 绘制同心圆
const cx = 100, cy = 100;
const radii = [20, 40, 60];
for (const r of radii) {
const circle = new CircleEnt([cx, cy], r);
circle.setDefaults();
Engine.addEntities(circle);
}
Engine.zoomExtents();
message.info("同心圆绘制完成");循环同心圆
// 使用循环绘制同心圆
const cx = 200, cy = 200;
let r = 20;
for (let i = 0; i < 5; i++) {
const circle = new CircleEnt([cx, cy], r);
circle.setDefaults();
Engine.addEntities(circle);
r += 20;
}
Engine.zoomExtents();
message.info("循环同心圆绘制完成");网格点阵
// 绘制网格点阵
const rows = 4, cols = 4;
const spacing = 50;
const radius = 5;
for (let x = 0; x < cols; x++) {
for (let y = 0; y < rows; y++) {
const circle = new CircleEnt([x * spacing, y * spacing], radius);
circle.setDefaults();
Engine.addEntities(circle);
}
}
Engine.zoomExtents();
message.info(`网格点阵绘制完成: ${rows}x${cols}`);实体查询
// 查询当前空间的实体信息
const entities = Engine.currentSpace.aliveItems;
let lineCount = 0;
let circleCount = 0;
let otherCount = 0;
for (const ent of entities) {
if (ent.type === "LINE") {
lineCount++;
} else if (ent.type === "CIRCLE") {
circleCount++;
} else {
otherCount++;
}
}
writeMessage("<br/>=== 实体统计 ===");
writeMessage(`<br/>直线: ${lineCount}`);
writeMessage(`<br/>圆: ${circleCount}`);
writeMessage(`<br/>其他: ${otherCount}`);
writeMessage(`<br/>总计: ${entities.length}`);
message.info(`实体统计: 共 ${entities.length} 个`);异步支持
代码执行环境支持 async/await 语法,可以执行异步操作:
// 使用 await 执行命令
await Engine.editor.automate(`LINE
0,0
100,100
`);
await Engine.editor.automate(`CIRCLE
50,50
30
`);
message.info("绘图完成");message 消息提示
message 提供轻量级 Toast 消息提示功能:
// 简单用法
message.info("操作成功");
message.error("操作失败");
// 多参数(自动拼接)
message.info("加载完成", 100, "条数据");
// 配置对象
message.error({
content: "网络错误",
duration: 5, // 显示时长(秒),0表示不自动关闭
key: "network" // 相同key的消息会覆盖
});特性:
- 最多同时显示 3 条消息,超出时最旧的消息会以动画向上滑出
info显示蓝色提示,error显示红色提示- 默认 3 秒后自动消失
与脚本执行的区别
| 特性 | 脚本执行 (EXECSTR) | 代码执行 (EXECJS) |
|---|---|---|
| 语法 | 自定义脚本语法 | JavaScript |
| 目标用户 | 不会 JS 的用户 | 懂 JS 的用户 |
| 功能范围 | 命令序列、变量、循环 | 完整 JS 能力 |
| 异步支持 | 不支持 | 支持 async/await |
| 实体操作 | 通过命令 | 直接操作实体类 |
| 条件判断 | 有限支持 | 完整 JS 条件逻辑 |
与插件的区别
| 特性 | 代码执行 (EXECJS) | 插件系统 |
|---|---|---|
| 复杂度 | 简单脚本 | 完整应用 |
| 生命周期 | 一次性执行 | 完整生命周期管理 |
| UI 扩展 | 不支持 | 支持菜单、面板等 |
| 打包发布 | 不支持 | 支持 |
| 事件监听 | 不支持 | 支持 |
| 持久化存储 | 不支持 | 支持 |
编程接口
TypeScript 调用
import { ExecuteJsCommand, CircleEnt, Engine, message } from 'vjcad';
// 创建命令实例
const cmd = new ExecuteJsCommand();
// 执行代码字符串
await cmd.executeString(`
const circle = new CircleEnt([50, 50], 30);
circle.setDefaults();
Engine.addEntities(circle);
Engine.zoomExtents();
message.info("圆已创建");
`);注意事项
- 代码安全: 执行的代码可以访问完整的 Engine API,请确保代码来源可信
- 错误处理: 代码执行错误会显示在命令行,不会中断整个程序
- setDefaults: 创建实体后调用
setDefaults()设置默认属性(颜色、图层等) - 异步等待: 使用
Engine.editor.automate执行命令时需要使用await