リンクをクリップボードにコピー
コピー完了
お世話になります。
グループがあり、その中にパスがいくつかあります。
それを複合パス化するという挙動をスクリプトにしたいです。
var sel = app.activeDocument.selection;//選択オブジェクト
for(i=0; i<sel.length;i++){
if(sel[i].pageItems.length > 1){ //選択グループの中のアイテム数が複数だったら
cp = app.activeDocument.compoundPathItems.add(); //複合パスを新規作成
cpItems = []; //複合パスにするアイテム配列
for(w=0; w<sel[i].pageItems.length; w++){
cpItems.push(sel[i].pageItems[w]); //グループ内のアイテムを配列に追加
}
while(cpX = cpItems.shift()){
cpX.move(cp,ElementPlacement.INSIDE); //アイテムを複合パスの中に移動
}
}
}
選択しているグループが一つの場合は上記で出来ましたが、
同じようにパスをまとめたグループが複数あった場合は連続で出来ませんでした。
何がおかしいかわかる人がいたら教えてください。
よろしくお願いします。
リンクをクリップボードにコピー
コピー完了
スマホから覗いているので試すに至ってないのですが、wのループは先頭からではなく末尾から処理しないとエラーが起きるような?
リンクをクリップボードにコピー
コピー完了
ありがとうございます。
var sel = app.activeDocument.selection;//選択オブジェクト
for(i=0; i<sel.length;i++){
if(sel[i].pageItems.length > 1){ //選択グループの中のアイテム数が複数だったら
cpItems = []; //複合パスにするアイテム配列
for(w=sel[i].pageItems.length - 1 ; w>=0; w--){
cpItems.push(sel[i].pageItems[w]); //グループ内のアイテムを配列に追加
}
cp = app.activeDocument.compoundPathItems.add(); //複合パスを新規作成
while(cpX = cpItems.shift()){
cpX.move(cp,ElementPlacement.INSIDE); //アイテムを複合パスの中に移動
}
}
}
末尾から処理したのですが、エラーが出てしまいました。。
何が違うのか分からないです・・・
リンクをクリップボードにコピー
コピー完了
var sel = app.activeDocument.selection;//選択オブジェクト var item = app.activeDocument.pageItems ; //オブジェクト var selG = []; //選択グループアイテム配列 for(i=0; i<sel.length;i++){ selG.push(sel[i]);//選択オブジェクトを配列に追加 } for(q=0; q<item.length; q++){ //選択を一旦解除 if(item[q].selected == true){ item[q].selected = false ; } } for(g=0;g<selG.length;g++){ //順番に選択、処理、選択解除を繰り返す selG[g].selected = true ; if(selG[g].selected == true && selG[g].pageItems.length > 1){ exefn("compoundPath"); } else { exefn("ungroup"); } selG[g].selected = false ; } function exefn(ex) {app.executeMenuCommand(ex)}
作業中、選択グループの中のアイテムが一つだけってこともあったので、その時はただグループ解除するだけという処理を加えました。
これで出来たといえば出来たのですが、なんかすっきりしないというか、もうちょっと別のやり方があるのではないかと思います。引き続き、何か別のやり方だったりがあれば募集させてください。よろしくお願いいたします。
リンクをクリップボードにコピー
コピー完了
ちょっと回りくどい手順になっているように感じました。
。ターゲットがgroupItemsであるなら、その数でループを回して、groupItem自体にcompoundPathItemを追加した上でそれにgroupItemの childrenであるpathItemsを加えていくような手順が正攻法かと思います。
リンクをクリップボードにコピー
コピー完了
ありがとうございます。
groupItemsのループの中で、
groupList = app.activeDocument.groupItems;
for(i=0; i<groupList.length; i++){
if(groupList[i].selected == true){
newPath = app.activeDocument.compoundPathItems.add(); //複合パス作成
newPath.move(groupList[i],ElementPlacement.INSIDE); //作った複合パスをグループ内に移動
gInItem = groupList[i].pageItems; //グループ内のアイテム
for(t=gInItem.length - 1; t>=0; t--){
gInItem[t].move(newPath,ElementPlacement.PLACEATEND); //グループ内のアイテムを複合パスに移動
}
}
}
こんなふうにやってみましたが、処理が途中で止まってしまいました。
どこがおかしいのでしょうか。
リンクをクリップボードにコピー
コピー完了
いろいろ試してみたのですが、うまくいかず・・・。
もしかしてPageItemsの中にそもそも複合パスがあったらできないのでしょうか。
複合パスの中に複合パスは移動できない・・・?のか・・・?
リンクをクリップボードにコピー
コピー完了
グループ内にパスがいくつかある状態という話で進めていましたが、
実際作業しているとグループ内に複合パスが存在する状態もあって、いろいろ調べた結果、どうやらそれが問題で処理が止まっていたみたいでした。
もし複合パスがあっても出来るよ、ってことがあったら教えていただきたいです。
リンクをクリップボードにコピー
コピー完了
解除するか、その複合パスに合流させると良いのではないでしょうか。
リンクをクリップボードにコピー
コピー完了
アドバイスありがとうございます!
解除した後にpathItemsを複合パス内に移動させたら出来ました。
ちなみにですが、pageItemsを複合パス内に移動って出来ないのでしょうか?
pathItemsを移動する、という形なら出来たのですが。。