基于Adobe Illustrator的等距螺旋图层自动生成模型
·
文章目录
一、逻辑架构解析
/**
* 获取或创建指定名称的图层
* @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中显示等距螺旋路径
四、优化建议
- 参数界面化:可将硬编码参数改为对话框输入
- 错误处理:添加文档存在性检查 (
if(!doc) return) - 撤销支持:包装成可撤销操作 (
app.activeDocument.suspendHistory()) - 性能优化:对超大数据量可考虑分批处理
五、生成效果图

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