第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脚本编程的基础知识:

  1. 脚本系统概述

    • ECMAScript/JavaScript基础
    • 脚本类型和位置
  2. 脚本Shell

    • Shell使用方法
    • 常用命令
  3. 基础API

    • 全局绘图函数
    • 文档和选择操作
  4. 核心类

    • RVector向量
    • RLine, RCircle, RArc几何类
    • RBox包围盒
  5. 实体操作

    • 创建、修改、删除实体
    • 变换操作
  6. 图层操作

    • 创建和修改图层
  7. 简单示例

    • 网格绘制
    • 齿轮轮廓
    • 批量修改

这些基础知识为后续的高级脚本开发打下基础。


下一章预告:第十二章将介绍QCAD脚本编程进阶,包括创建交互式工具和命令。

posted @ 2026-01-11 01:40  我才是银古  阅读(4)  评论(0)    收藏  举报