第11章-脚本编程入门
第十一章:脚本编程入门
11.1 QCAD脚本概述
11.1.1 脚本系统介绍
QCAD提供了强大的脚本系统,基于ECMAScript(JavaScript):
特点:
- 几乎完整的QCAD API访问
- Qt框架的部分API可用
- 无需编译,即时运行
- 跨平台兼容
脚本能力:
- 自动化重复操作
- 创建自定义工具
- 扩展用户界面
- 批量处理文件
- 实现复杂算法
11.1.2 脚本类型
| 类型 | 说明 | 示例 |
|---|---|---|
| 简单脚本 | 直接执行的操作脚本 | 批量修改、计算 |
| 命令脚本 | 实现CAD命令的脚本 | 绘图工具、编辑工具 |
| 工具脚本 | 交互式工具 | 需要用户输入的工具 |
| 附加模块 | 扩展功能模块 | 新功能、新界面 |
11.1.3 脚本位置
QCAD脚本位于以下目录:
QCAD安装目录/
└── scripts/
├── Draw/ # 绘图工具
├── Edit/ # 编辑工具
├── File/ # 文件操作
├── Modify/ # 修改工具
├── View/ # 视图控制
├── Misc/ # 其他工具
│ ├── Development/ # 开发工具
│ └── Tutorials/ # 教程示例
├── Pro/ # 专业版功能
└── autostart.js # 启动脚本
11.2 脚本Shell
11.2.1 打开脚本Shell
路径:菜单 "杂项" → "开发" → "脚本Shell"
脚本Shell是一个交互式环境,用于:
- 执行JavaScript代码
- 测试API功能
- 学习脚本编程
- 调试脚本
11.2.2 基本使用
输入代码:
// 在Shell中输入
1 + 1
// 输出: 2
// 多行代码
var x = 10;
var y = 20;
x + y
// 输出: 30
绘图示例:
// 在当前文档中添加一条直线
addLine(0, 0, 100, 100);
11.2.3 常用Shell命令
| 命令 | 功能 |
|---|---|
clear() |
清空Shell |
help() |
显示帮助 |
include("path") |
加载外部脚本 |
print(msg) |
输出信息 |
11.2.4 Shell快捷键
| 按键 | 功能 |
|---|---|
| Enter | 执行代码 |
| Shift+Enter | 换行(多行输入) |
| ↑ / ↓ | 历史命令 |
| Tab | 自动补全 |
11.3 基础API
11.3.1 全局函数
绘图函数:
// 添加直线
addLine(x1, y1, x2, y2);
// 添加圆
addCircle(centerX, centerY, radius);
// 添加圆弧
addArc(centerX, centerY, radius, startAngle, endAngle);
// 添加点
addPoint(x, y);
// 添加文本
addSimpleText(text, x, y, height, angle);
示例:
// 绘制一个正方形
addLine(0, 0, 100, 0);
addLine(100, 0, 100, 100);
addLine(100, 100, 0, 100);
addLine(0, 100, 0, 0);
// 绘制一个圆
addCircle(50, 50, 30);
// 添加文本
addSimpleText("Hello QCAD", 0, -20, 10, 0);
11.3.2 文档相关
// 获取当前文档
var doc = getDocument();
// 获取文档接口
var di = getDocumentInterface();
// 创建新文档
createNewDocument();
// 打开文档
openDocument("path/to/file.dxf");
// 保存文档
saveDocument("path/to/file.dxf");
11.3.3 选择相关
// 获取选中的实体ID
var ids = getSelectedIds();
// 选择所有实体
selectAll();
// 取消选择
deselectAll();
// 选择特定实体
selectEntity(entityId);
// 按图层选择
selectByLayer("图层名");
11.3.4 视图控制
// 缩放到全图
autoZoom();
// 缩放到指定区域
zoomTo(x1, y1, x2, y2);
// 设置视图缩放因子
setZoomFactor(factor);
// 平移视图
panView(dx, dy);
11.4 核心类介绍
11.4.1 RVector - 向量类
// 创建向量
var v1 = new RVector(10, 20);
var v2 = new RVector(30, 40);
// 向量属性
print(v1.x); // 10
print(v1.y); // 20
// 向量操作
var v3 = v1.operator_add(v2); // 加法
var v4 = v1.operator_subtract(v2); // 减法
var v5 = v1.operator_multiply(2); // 数乘
// 向量方法
var length = v1.getMagnitude(); // 长度
var angle = v1.getAngle(); // 角度
var normalized = v1.getNormalized(); // 单位向量
var distance = v1.getDistanceTo(v2); // 两点距离
11.4.2 RLine - 直线类
// 创建直线
var line = new RLine(
new RVector(0, 0), // 起点
new RVector(100, 50) // 终点
);
// 直线属性
var start = line.getStartPoint();
var end = line.getEndPoint();
var length = line.getLength();
var angle = line.getAngle();
var middle = line.getMiddlePoint();
// 直线方法
var closestPoint = line.getClosestPointOnShape(somePoint);
var distance = line.getDistanceTo(somePoint);
11.4.3 RCircle - 圆类
// 创建圆
var circle = new RCircle(
new RVector(50, 50), // 圆心
30 // 半径
);
// 圆属性
var center = circle.getCenter();
var radius = circle.getRadius();
var diameter = circle.getDiameter();
var circumference = circle.getLength(); // 周长
var area = circle.getArea();
11.4.4 RArc - 圆弧类
// 创建圆弧
var arc = new RArc(
new RVector(50, 50), // 圆心
30, // 半径
0, // 起始角度(弧度)
Math.PI / 2, // 终止角度(弧度)
false // 方向:false=逆时针
);
// 圆弧属性
var startPoint = arc.getStartPoint();
var endPoint = arc.getEndPoint();
var arcLength = arc.getLength();
var sweepAngle = arc.getSweepAngle();
11.4.5 RBox - 包围盒类
// 创建包围盒
var box = new RBox(
new RVector(0, 0), // 最小点
new RVector(100, 100) // 最大点
);
// 包围盒方法
var center = box.getCenter();
var width = box.getWidth();
var height = box.getHeight();
var contains = box.contains(somePoint);
var intersects = box.intersects(otherBox);
11.5 实体操作
11.5.1 创建实体
// 创建直线实体
var lineEntity = new RLineEntity(
document,
new RLineData(
new RVector(0, 0),
new RVector(100, 100)
)
);
// 创建圆实体
var circleEntity = new RCircleEntity(
document,
new RCircleData(
new RVector(50, 50),
30
)
);
// 创建圆弧实体
var arcEntity = new RArcEntity(
document,
new RArcData(
new RVector(50, 50),
30,
0,
Math.PI / 2,
false
)
);
11.5.2 添加实体到文档
// 方法1:使用全局函数
addLine(0, 0, 100, 100);
// 方法2:使用操作
var di = getDocumentInterface();
var doc = di.getDocument();
var lineEntity = new RLineEntity(
doc,
new RLineData(
new RVector(0, 0),
new RVector(100, 100)
)
);
var operation = new RAddObjectOperation(lineEntity);
di.applyOperation(operation);
11.5.3 修改实体
// 获取实体
var entity = doc.queryEntity(entityId);
// 修改属性
entity.setColor(new RColor("red"));
entity.setLayerId(layerId);
entity.setLinetypeId(linetypeId);
// 应用修改
var operation = new RModifyObjectOperation(entity);
di.applyOperation(operation);
11.5.4 删除实体
// 删除单个实体
var operation = new RDeleteObjectOperation(entityId);
di.applyOperation(operation);
// 删除多个实体
var ids = [id1, id2, id3];
for (var i = 0; i < ids.length; i++) {
var op = new RDeleteObjectOperation(ids[i]);
di.applyOperation(op);
}
11.5.5 变换实体
// 移动
var moveVector = new RVector(50, 50);
entity.move(moveVector);
// 旋转
var center = new RVector(0, 0);
var angle = Math.PI / 4; // 45度
entity.rotate(angle, center);
// 缩放
entity.scale(2, center);
// 镜像
var axisPoint1 = new RVector(0, 0);
var axisPoint2 = new RVector(0, 100);
entity.mirror(new RLine(axisPoint1, axisPoint2));
11.6 图层操作
11.6.1 创建图层
var doc = getDocument();
// 创建图层
var layer = new RLayer(doc, "新图层");
// 设置图层属性
layer.setColor(new RColor("blue"));
layer.setLinetypeId(linetypeId);
layer.setLineweight(RLineweight.Weight025);
// 添加到文档
var operation = new RAddObjectOperation(layer);
di.applyOperation(operation);
11.6.2 获取和修改图层
// 获取图层
var layer = doc.queryLayer("图层名");
// 修改图层属性
layer.setColor(new RColor("green"));
layer.setLocked(true);
layer.setFrozen(false);
// 应用修改
var operation = new RModifyObjectOperation(layer);
di.applyOperation(operation);
11.6.3 设置当前图层
// 获取图层ID
var layerId = doc.getLayerId("墙体");
// 设置为当前图层
doc.setCurrentLayer(layerId);
11.7 简单脚本示例
11.7.1 绘制网格
// 绘制10x10网格
var spacing = 10;
var count = 10;
for (var i = 0; i <= count; i++) {
// 横线
addLine(0, i * spacing, count * spacing, i * spacing);
// 竖线
addLine(i * spacing, 0, i * spacing, count * spacing);
}
11.7.2 绘制齿轮轮廓
// 简化的齿轮绘制
var centerX = 0;
var centerY = 0;
var outerRadius = 50;
var innerRadius = 40;
var teeth = 12;
var angleStep = 2 * Math.PI / teeth;
for (var i = 0; i < teeth; i++) {
var a1 = i * angleStep;
var a2 = a1 + angleStep * 0.4;
var a3 = a1 + angleStep * 0.5;
var a4 = a1 + angleStep * 0.9;
var a5 = (i + 1) * angleStep;
var p1 = new RVector(centerX + innerRadius * Math.cos(a1),
centerY + innerRadius * Math.sin(a1));
var p2 = new RVector(centerX + outerRadius * Math.cos(a2),
centerY + outerRadius * Math.sin(a2));
var p3 = new RVector(centerX + outerRadius * Math.cos(a3),
centerY + outerRadius * Math.sin(a3));
var p4 = new RVector(centerX + innerRadius * Math.cos(a4),
centerY + innerRadius * Math.sin(a4));
addLine(p1.x, p1.y, p2.x, p2.y);
addArc(centerX, centerY, outerRadius, a2, a3);
addLine(p3.x, p3.y, p4.x, p4.y);
addArc(centerX, centerY, innerRadius, a4, a5);
}
11.7.3 批量修改实体颜色
// 将所有选中实体改为红色
var ids = getSelectedIds();
var doc = getDocument();
var di = getDocumentInterface();
for (var i = 0; i < ids.length; i++) {
var entity = doc.queryEntity(ids[i]);
entity.setColor(new RColor("red"));
var op = new RModifyObjectOperation(entity);
di.applyOperation(op);
}
print("已修改 " + ids.length + " 个实体");
11.7.4 计算总长度
// 计算选中直线的总长度
var ids = getSelectedIds();
var doc = getDocument();
var totalLength = 0;
for (var i = 0; i < ids.length; i++) {
var entity = doc.queryEntity(ids[i]);
if (isLineEntity(entity)) {
var lineData = entity.getData();
totalLength += lineData.getLength();
}
}
print("总长度: " + totalLength.toFixed(2));
11.8 本章小结
本章介绍了QCAD脚本编程的基础知识:
-
脚本系统概述:
- ECMAScript/JavaScript基础
- 脚本类型和位置
-
脚本Shell:
- Shell使用方法
- 常用命令
-
基础API:
- 全局绘图函数
- 文档和选择操作
-
核心类:
- RVector向量
- RLine, RCircle, RArc几何类
- RBox包围盒
-
实体操作:
- 创建、修改、删除实体
- 变换操作
-
图层操作:
- 创建和修改图层
-
简单示例:
- 网格绘制
- 齿轮轮廓
- 批量修改
这些基础知识为后续的高级脚本开发打下基础。
下一章预告:第十二章将介绍QCAD脚本编程进阶,包括创建交互式工具和命令。

浙公网安备 33010602011771号