リンクをクリップボードにコピー
コピー完了
お世話になっております。
とあるスクリプトに、パスに名前をつけるという動作をいれたのですが、複合パスには名前はつけられるのに、ただのパスには名前をつけられない場合がありました。
chatGPTに聞いてみたら、
-----------------------------------------------------------------
通常のパスに名前を設定できない理由の一つとして、通常のパスが通常のパスであり、その性質が単純なベクトルデータを表現することにある可能性があります。通常のパスは、例えば線や曲線のセグメントなど、単純な図形を構成するために使用されます。このようなパスは、通常は名前が設定されないことが多いため、名前を変更できないことがあります。
一方、複合パスは、複数のパス要素が組み合わさったもので、通常のパスよりも複雑な形状を表現するために使用されます。複合パスに名前を設定できる理由の一つは、それがより複雑な構造を持つため、名前を設定して識別しやすくする必要性があるからです。
-----------------------------------------------------------------
と言われました。こういうことってあり得るのでしょうか?
var sel = app.activeDocument.selection;
var nameArr = ['りんご', 'ごりら', 'ラッパ', 'パセリ'];
for (var i = 0; i < sel.length; i++) {
sel[i].name = nameArr[i];
}
これならパスでも変更は出来るけど、
var sel = app.activeDocument.selection;
var nameArr = ['りんご', 'ごりら', 'ラッパ', 'パセリ'];
var changeArr = [];
for(w=0; w<sel.length; w++){
changeArr.push(sel[w]);
}
for (var i = 0; i < changeArr.length; i++) {
changeArr[i].name = nameArr[i];
}
例えば上記のように一旦配列にいれたものに対してつけようとすると出来ない、みたいなイメージです。
(ちなみに上記のコードは複合パスでもパスでもちゃんと名前は変更できます。)
同じ作りなんですが、このコードの前後にいろいろな動作が組み合わさっている時、なぜかよく分からないけどパスのものだけ名前が変更できない場面があります。
上のコードは動くので、単純に私が書いたスクリプトのどこかがおかしい可能性が大きいのですが、全部のコードを載せるといろいろ問題があるので載せられません・・・。
実際のコードじゃないと分からないと思うんですが、
可能性として何がおかしいとかってわかりますでしょうか・・・。
ふわっとした質問で申し訳ございません。
〈元〉selection配列をそのまま使用
〈後〉リネーム対象を配列化して使用
ということですね。なっとくなっとく。
リンクをクリップボードにコピー
コピー完了
最初に言うことですが、ChatGPTを頼るのはきっぱりおすすめしません…
注文の付け方が上手だったりでたまたま正解が出ることはありますが、スクリプティングって調査力も必要だと思うので…
今回の件は、ループ内で名前を付ける直前にchangeArr[i]とnameArr[i] 双方の値を出力してみるなどしてデバッグしてみましょう。
開発環境は何を使っていますか?(前に聞いたかもしれません…)
リンクをクリップボードにコピー
コピー完了
ありがとうございます。
この前ChatGPTにコードを聞いたら絶対動かないようなものを頂いたのでさすがにコードはやめときましたが、ちょっとした知識なら正しいの教えてくれるかと思っていました。
やっぱりダメですよね・・・。
開発環境はVisual Studio Codeです。ExtendScript Debuggerっていうのを使ってます。
名前をつける直前、changeArr[i]がCompoundPathItemやPathItemではなくGroupItemとして出力されていました。名前をつけた後も「GroupItem 名前」って感じで出力されています。関係ありそうですが、どう直して良いのか分からないです・・・。
リンクをクリップボードにコピー
コピー完了
↑を書いた後にいろいろやってみました。
コードでは元々グループアイテムだったものを複合パスやパスにした後に名前を変更しているので、おかしな感じになっていたのかもです。
複合パスやパスにした後のものを空配列に突っ込んで、それに同じように名前をつけたら普通に複合パスもパスもちゃんと変更ができました!
スマートなやり方じゃないと思うんですが、ちゃんと出来ました(涙)
リンクをクリップボードにコピー
コピー完了
配列に入れてからリネームするほう走らせてみました。
単独パス、複合パス、グループ、すべて正常に名前つきますね。
仮に、グループの子オブジェクト(<長方形>2つ)に名前をつけたい、という話であれば
だいぶ直すところがあるんですが。
リンクをクリップボードにコピー
コピー完了
激しく入れ違いましたが…
>コードでは元々グループアイテムだったものを複合パスやパスにした後に名前を変更している
グループ解除したという意味ですかね?
リンクをクリップボードにコピー
コピー完了
すみません・・・
元々グループにパスが入っているものを、パスが複数だったら複合パスにして、一つだけならグループ解除するだけという動作をします。
その後に出来たパスや複合パスに名前をつけるって感じです。
リンクをクリップボードにコピー
コピー完了
別のアカウントでコメントしてしまいましたが・・・。
リンクをクリップボードにコピー
コピー完了
〈元〉selection配列をそのまま使用
〈後〉リネーム対象を配列化して使用
ということですね。なっとくなっとく。
リンクをクリップボードにコピー
コピー完了
回答書いて戻ったら被ったのでやめますけど、こと、ExtendScriptに関してはChatGTP-3.5に聞いてはいけません。ほぼ正しい回答が出てきません。
パスアイテムであってもnameプロパティが存在し、正しく扱えば取得できます。
ChatGTPに聞くよりPropertyExplorerでオブジェクトやメソッドを洗い出す方が効率は良いように思います。
リンクをクリップボードにコピー
コピー完了
ありがとうございます。
chatGPTは使っていて、デザインの提案とかそっち方面ならまだ面白いなって思うことはありましたが、こういうことは聞くのやめた方がいいみたいですね。
パスアイテムにグループアイテムとして名前をつけてしまってるのかもしれません。
それぐらいしか可能性がありそうな問題が見つかりませんでした・・・。