終了

【JavaScript】グループの中の複数のパスを複合パスにする

積極的な参加者 ,
Nov 19, 2022 Nov 19, 2022

リンクをクリップボードにコピー

コピー完了

お世話になります。

 

グループがあり、その中にパスがいくつかあります。

それを複合パス化するという挙動をスクリプトにしたいです。

 

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); //アイテムを複合パスの中に移動
	}
    }
}

 

選択しているグループが一つの場合は上記で出来ましたが、

同じようにパスをまとめたグループが複数あった場合は連続で出来ませんでした。

 

何がおかしいかわかる人がいたら教えてください。

よろしくお願いします。

キーワード
スクリプティング

表示

671

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines

correct answers 1 件の正解

Community Expert , Nov 21, 2022 Nov 21, 2022

ちょっと回りくどい手順になっているように感じました。

。ターゲットがgroupItemsであるなら、その数でループを回して、groupItem自体にcompoundPathItemを追加した上でそれにgroupItemの childrenであるpathItemsを加えていくような手順が正攻法かと思います。

投票

翻訳

翻訳
Community Expert ,
Nov 19, 2022 Nov 19, 2022

リンクをクリップボードにコピー

コピー完了

スマホから覗いているので試すに至ってないのですが、wのループは先頭からではなく末尾から処理しないとエラーが起きるような?

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Nov 19, 2022 Nov 19, 2022

リンクをクリップボードにコピー

コピー完了

ありがとうございます。

 

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); //アイテムを複合パスの中に移動
	}

    }
}

 

末尾から処理したのですが、エラーが出てしまいました。。

何が違うのか分からないです・・・

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Nov 19, 2022 Nov 19, 2022

リンクをクリップボードにコピー

コピー完了

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)}

 

作業中、選択グループの中のアイテムが一つだけってこともあったので、その時はただグループ解除するだけという処理を加えました。

 

これで出来たといえば出来たのですが、なんかすっきりしないというか、もうちょっと別のやり方があるのではないかと思います。引き続き、何か別のやり方だったりがあれば募集させてください。よろしくお願いいたします。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Nov 21, 2022 Nov 21, 2022

リンクをクリップボードにコピー

コピー完了

ちょっと回りくどい手順になっているように感じました。

。ターゲットがgroupItemsであるなら、その数でループを回して、groupItem自体にcompoundPathItemを追加した上でそれにgroupItemの childrenであるpathItemsを加えていくような手順が正攻法かと思います。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Nov 22, 2022 Nov 22, 2022

リンクをクリップボードにコピー

コピー完了

ありがとうございます。

 

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); //グループ内のアイテムを複合パスに移動
        }
 }
}

 

こんなふうにやってみましたが、処理が途中で止まってしまいました。

どこがおかしいのでしょうか。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Nov 22, 2022 Nov 22, 2022

リンクをクリップボードにコピー

コピー完了

いろいろ試してみたのですが、うまくいかず・・・。

もしかしてPageItemsの中にそもそも複合パスがあったらできないのでしょうか。

複合パスの中に複合パスは移動できない・・・?のか・・・?

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Nov 22, 2022 Nov 22, 2022

リンクをクリップボードにコピー

コピー完了

グループ内にパスがいくつかある状態という話で進めていましたが、

実際作業しているとグループ内に複合パスが存在する状態もあって、いろいろ調べた結果、どうやらそれが問題で処理が止まっていたみたいでした。

 

もし複合パスがあっても出来るよ、ってことがあったら教えていただきたいです。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Nov 22, 2022 Nov 22, 2022

リンクをクリップボードにコピー

コピー完了

解除するか、その複合パスに合流させると良いのではないでしょうか。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Nov 22, 2022 Nov 22, 2022

リンクをクリップボードにコピー

コピー完了

最新

アドバイスありがとうございます!

解除した後にpathItemsを複合パス内に移動させたら出来ました。

 

ちなみにですが、pageItemsを複合パス内に移動って出来ないのでしょうか?

pathItemsを移動する、という形なら出来たのですが。。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines