一、逻辑架构解析

/**
 * 获取或创建指定名称的图层
 * @param {string} layerName - 要查找或创建的图层名称
 * @param {boolean} [makeActive=true] - 是否将图层设为活动状态
 * @returns {Layer} 找到或创建的图层对象
 */
function getOrCreateLayer(layerName, makeActive) {
    // 参数默认值处理
    if (makeActive === undefined) makeActive = true;

    var doc = app.activeDocument;
    var targetLayer = null;

    // 遍历所有图层查找匹配项
    for (var i = 0; i < doc.layers.length; i++) {
        if (doc.layers[i].name === layerName) {
            targetLayer = doc.layers[i];
            break;
        }
    }

    // 如果未找到,创建新图层
    if (!targetLayer) {
        targetLayer = doc.layers.add();
        targetLayer.name = layerName;
        // $.writeln("已创建新图层: " + layerName);
    } else {
        // $.writeln("找到现有图层: " + layerName);
    }

    // 如果需要,将图层设为活动状态
    if (makeActive) {
        targetLayer.visible = true;
        targetLayer.locked = false;
        doc.activeLayer = targetLayer;
    }

    return targetLayer;
}

function CreateLX(){
    var layerObj = getOrCreateLayer("螺旋图层");

    // 等距螺旋(阿基米德螺旋)脚本 - 稳定版
    var doc = app.activeDocument;

    // --- 可调参数 ---
    var centerX = 200;
    var centerY = 200;
    var turns = 5;          // 圈数
    var pointsPerTurn = 120; // 每圈点数(数值越大,曲线越平滑,建议 60~180)
    var gap = 10;           // 圈间距
    // -----------------

    var totalPoints = turns * pointsPerTurn;
    var coords = []; // 用来存放所有点的坐标数组

    // 1. 循环计算所有点的坐标
    for (var i = 0; i <= totalPoints; i++) {
        var t = (i / pointsPerTurn) * 2 * Math.PI; // 当前角度(弧度)
        var r = (i / totalPoints) * turns * gap;    // 当前半径(等距增加)

        var x = centerX + r * Math.cos(t);
        var y = centerY + r * Math.sin(t);

        coords.push([x, y]); // 把坐标点存入数组
    }

    // 2. 一次性将坐标数组生成路径(这一步替代了容易报错的 pathPoints.add())
    var path = layerObj.pathItems.add();
    path.setEntirePath(coords);

    // 3. 设置路径样式
    path.stroked = true;
    path.strokeWidth = 1;
    path.filled = false;
}

CreateLX();


1. 整体架构

脚本系统
├── 主控制函数 (CreateLX)
│   ├── 图层管理模块 (getOrCreateLayer)
│   │   ├── 图层查找逻辑
│   │   ├── 图层创建逻辑
│   │   └── 图层激活逻辑
│   ├── 参数配置模块
│   │   ├── 中心点坐标 (centerX, centerY)
│   │   ├── 螺旋参数 (turns, pointsPerTurn, gap)
│   │   └── 计算参数 (totalPoints)
│   ├── 数学计算模块
│   │   ├── 角度计算 (弧度制)
│   │   ├── 半径计算 (等距递增)
│   │   └── 坐标转换 (极坐标→直角坐标)
│   └── 路径绘制模块
│       ├── 批量坐标数组构建
│       ├── 路径对象创建
│       └── 样式属性设置
└── 执行入口 (CreateLX调用)

2. 模块功能分解

2.1 图层管理模块 (getOrCreateLayer)
功能:智能图层管理,避免重复创建
输入:图层名称、是否激活标志
处理流程:
  ① 参数默认值处理 (makeActive默认为true)
  ② 获取当前活动文档对象
  ③ 遍历文档所有图层,按名称匹配查找
  ④ 若未找到则创建新图层并命名
  ⑤ 若找到则直接引用
  ⑥ 条件性激活图层(显示、解锁、设为活动层)
输出:目标图层对象
2.2 主控制函数 (CreateLX)
功能:协调各模块生成等距螺旋路径
处理流程:
  ① 调用图层管理模块获取"螺旋图层"
  ② 定义螺旋参数(中心点、圈数、精度、间距)
  ③ 计算总点数 (圈数×每圈点数)
  ④ 循环生成所有路径点坐标
  ⑤ 批量设置路径点(避免逐点添加导致的报错)
  ⑥ 配置路径样式(描边、粗细、填充)

二、函数指令分析

1. getOrCreateLayer(layerName, makeActive)

指令/函数 作用 参数说明
app.activeDocument 获取当前激活的文档对象 无参数
doc.layers[i].name 读取图层名称 图层对象属性
doc.layers.add() 创建新图层 无参数,返回新图层对象
targetLayer.visible = true 设置图层可见性 布尔值
targetLayer.locked = false 解锁图层 布尔值
doc.activeLayer = targetLayer 设置活动图层 图层对象

2. CreateLX() 函数

指令/函数 作用 参数说明
Math.PI 圆周率常量 无参数,值≈3.14159
Math.cos(t) 计算余弦值 t:弧度角度
Math.sin(t) 计算正弦值 t:弧度角度
layerObj.pathItems.add() 在图层中创建路径 无参数,返回路径对象
path.setEntirePath(coords) 批量设置路径点 coords:二维坐标数组 [[x,y],…]
path.stroked = true 启用描边 布尔值
path.strokeWidth = 1 设置描边宽度 数值(像素)
path.filled = false 禁用填充 布尔值

3. 核心算法指令解析

// 极坐标→直角坐标转换公式
var t = (i / pointsPerTurn) * 2 * Math.PI;  // 角度计算
var r = (i / totalPoints) * turns * gap;    // 半径等距增长
var x = centerX + r * Math.cos(t);          // X坐标
var y = centerY + r * Math.sin(t);          // Y坐标

算法特点:

  • 等距螺旋:半径随角度线性增加,即 r = a·θ
  • 精度控制:通过 pointsPerTurn 参数调节曲线平滑度
  • 稳定优化:使用 setEntirePath() 批量写入,避免逐点添加导致脚本错误

三、数据流图

[用户执行] 
    ↓
[CreateLX() 主函数启动]
    ↓
[getOrCreateLayer("螺旋图层")] ← 返回/创建图层对象
    ↓
[参数配置] (centerX, centerY, turns, pointsPerTurn, gap)
    ↓
[循环计算坐标点] (totalPoints+1 次迭代)
    ├── 计算角度 t = (i/pointsPerTurn)×2π
    ├── 计算半径 r = (i/totalPoints)×turns×gap
    ├── 计算 X = centerX + r·cos(t)
    └── 计算 Y = centerY + r·sin(t)
    ↓
[构建坐标数组] coords = [[x0,y0], [x1,y1], ...]
    ↓
[创建路径] layerObj.pathItems.add()
    ↓
[批量导入坐标] path.setEntirePath(coords)
    ↓
[设置样式] stroke=1, stroked=true, filled=false
    ↓
[输出结果] 在Illustrator中显示等距螺旋路径

四、优化建议

  1. 参数界面化:可将硬编码参数改为对话框输入
  2. 错误处理:添加文档存在性检查 (if(!doc) return)
  3. 撤销支持:包装成可撤销操作 (app.activeDocument.suspendHistory())
  4. 性能优化:对超大数据量可考虑分批处理

五、生成效果图

在这里插入图片描述


该脚本通过清晰的模块分层和稳定的API调用,实现了在Adobe Illustrator中自动生成等距螺旋路径的功能,具有较好的可维护性和扩展性。

更多推荐