●Photoshopを便利にするスクリプト関連まとめ

2013年12月10日    

PhotoshopをJavascriptで自動操作するスクリプトをいくらか書いてきましたが
一覧を作っておきます

●Photoshopのアンドゥをちょっとだけ便利にする方法
人気のTips
Photoshopでアンドゥした時に意図しないレイヤーに移動する事への対処法です

●レイヤーセットの描画モードを一括変換
SaiやClip Studio Paint でPSDを書き出すと
レイヤーセット(グループ)の描画モードが「通常」になるので 「通過」に自動変換

●Photoshopスクリプト2種
スクリプトを実行した時に レイヤー名に含まれている文字を判別して「アクション」を実行する
トリミング枠の内側が指定した解像度になるようにリサイズするスクリプト

●Photoshopでグループ毎にJPEG出力する
レイヤーセット(グループ)を別々の画像として書き出します

●Photoshop書捨てスクリプト
画像のリサイズをせずに「解像度」のみを変更
現在のレイヤの下に新規レイヤを作成する

●Photoshopで不要なチャンネルを削除する2
データの受け渡し等で 不必要なαチャンネルを消してしまいたい場合に

●Photoshopのレイヤー表示状態を操作するスクリプトあれこれ
全てのレイヤーを「表示」にするスクリプトと
選択中のレイヤーの上に重なっているレイヤーを全て非表示にするスクリプト

●Photoshopのベクトルマスクをちょっと便利に

ベクトルマスク切り替えとツール選択を一度に実行するスクリプトです
ショートカット登録で結構便利になるかと。


最後に有償配布になりますが、
イラストレーター等の御仕事をしている方には、必要になってくるはず
●Photoshopでパース線を自動生成!
パスで四角形を指定することで、パースの基準線になるパスを作成します

●Photoshopのベクトルマスクをちょっと便利に

最近、自分の仕事の方で
フォトショップの作業でベクトルマスクを使うことが多くなったのですが、
レイヤーを選択>ベクトルマスクを選択>ペンツールやパス選択ツールに切り替え
といった一連の動作が煩わしく感じたので 省力化のスクリプトを作成してみました。

select_vectorMask.zip
スクリプトを実行すると
レイヤに設定されているベクトルマスクを選択状態にして ペンツールを選択状態にします。
(パス選択ツール又はパスコンポーネント選択ツールの時はそのまま)

ちなみに私はPhotoshopのショートカットのCtrl+*にこのスクリプト実行を割り当てて
左手用のショートカットデバイスを下のように割り当てています。
13121001.png

Ctrl+右クリックでカーソル下にあるレイヤー一覧を表示/選択して
左手コントローラー操作でマスクを選択というスムーズな操作が可能になります
お試しあれ。

いつもの繰り返しになりますが
プリセットへの登録の仕方は続きに

続きを読む "Photoshopのベクトルマスクをちょっと便利に"

●Photoshopでパース線を自動生成!

2012年12月 9日    

Photoshopでイラストの背景等を描く時に使えるスクリプトプラグインを作りました メロンブックスDLで販売しています。 Photoshopでパース線を自動生成!スクリプトをダウンロード 12102901.jpg Photoshopのパスで基準になる四角形を作ると 辺の延長線から消失点を計算して 放射状の基準線をパスで作成します。 12120903.jpg 下絵の床のタイル面や窓枠を基準に四角を指定するとこんな感じになります。 奥行きにで線が詰まる具合も計算するようにしてあります。

続きを読む "Photoshopでパース線を自動生成!"

●Photoshopのレイヤー表示状態を操作するスクリプトあれこれ

2012年11月26日    

以前の記事のスクリプトを使ってくださって人から
全てのレイヤーを「表示」状態にするスクリプトをリクエスト頂いたので書いてみた

Show_all_layers.jsx
#target photoshop
//レイヤーセットを辿るための関数
function follw_LayerSets(parent){
	var ChildLyaers= parent.layers;
	for (var i = 0; i < ChildLyaers.length; i++){
		if (ChildLyaers[i].typename == "LayerSet"){
			//レイヤーセットの場合の処理
			//再帰処理
			follw_LayerSets(ChildLyaers[i]);
		}
		ChildLyaers[i].visible= true
	}
}
app.bringToFront();
//ドキュメントが開かれているかどうか判別
if (app.documents.length ==0){
	//ドキュメントが開かれていない場合処理なし
}else{
 	var parent = activeDocument;//作業するドキュメントの参照
	follw_LayerSets(parent);
}
前回のレイヤーセットの描画モードを変更するスクリプトの関数を作り直しただけですね

これだけではつまらないので
自分で作ろうと思っていて後回しにしていたものを書いてみた
選択中のレイヤーの上に重なってるレイヤーを全て「非表示」にするスクリプト

続きを読む "Photoshopのレイヤー表示状態を操作するスクリプトあれこれ"

●レイヤーセットの描画モードを一括変換

2012年11月 5日    

SaiやClip Studio Paint でPSDを書き出すと
レイヤーセット(グループ)の描画モードが「通常」になってしまうので
それを一括して「通過」にできるといいという声があったので作ってみました

//#target photoshop
//レイヤーセットを辿るための関数
function follw_LayerSets(parent){
	var ChildLyaers= parent.layers;
	for (var i = 0; i < ChildLyaers.length; i++){
		if (ChildLyaers[i].typename == "LayerSet"){
			//レイヤーセットの場合の処理
			set_PassThrough(ChildLyaers[i]);
			//再帰処理
			//arguments.callee(ChildLyaers[i])
			follw_LayerSets(ChildLyaers[i]);
		}else{
			//レイヤーセット以外に処理をしたい場合はここに記述
		}
	}
}
//描画モードが通常のレイヤーセットを通過に設定
function set_PassThrough(targetLayer){
	if (targetLayer.typename == "LayerSet"){
		if (targetLayer.allLocked == false){
			if (targetLayer.blendMode == BlendMode.NORMAL){
				targetLayer.blendMode = BlendMode.PASSTHROUGH;
			}
		}
	}
}
//main
// in case we double clicked the file
app.bringToFront();
//ドキュメントが開かれているかどうか判別
if (app.documents.length ==0){
	//ドキュメントが開かれていない場合処理なし
}else{
 	var parent = activeDocument;//作業するドキュメントの参照
	follw_LayerSets(parent);
}

通常モード以外のレイヤーセット(グループ)は影響を受けません
また「通常」のままにしたいレイヤーセット(グループ)がある場合はレイヤーをロックしておいてください。

続きを読む "レイヤーセットの描画モードを一括変換"

●Photoshopスクリプト2種

2012年4月 9日    

Photoshopのちょっとしたスクリプトを2つ

1つ目はレイヤのタイプによってアクションを振り分けたい場合に使うアイデアです
レイヤ名にキーワードを設定してそれによって実行するアクションを振り分けます

#target photoshop
activeLayerName = app.activeDocument.activeLayer.name;
//レイヤ名キーワードが含まれている場合に指定したアクションを実行
//1が含まれている場合 
if (activeLayerName.indexOf("1") != -1){doAction("溶けた鉛","初期設定のアクション")}
//2が含まれている場合
else if (activeLayerName.indexOf("2") != -1){doAction("木製 (50 pixel)","初期設定のアクション")}

indexOf(" ")の" "の部分にキーワードを設定することで条件分岐内の処理させます
doActionはdoAction("アクション名","アクションセット名")という風にアクションパレットにあるコマンドを実行させることができます
else if の文の部分を書き足すことで振り分ける処理を増やせます

12040901.jpg
このテキストを拡張子.jsxで保存してPhotoshopのファイル>スクリプト>参照
で開くことで実行できますし 『参照』で実行する操作をアクションに記録することもできます
他の使い方や他のスクリプト類はこちら を参照してください
http://yukimi.moemoe.gr.jp/MT/archives/photoshop/


2つ目は画像の拡大縮小に使えるアイデア
Photoshopで画像を作る時に大きめに画像を作って 下図のように枠のレイヤを作ることも多いわけですが
枠内の部分の大きさを指定して拡大縮小したい場合もでてきます
そんな時に使えるスクリプト

12040902.jpg

#target photoshop
//幅の初期値を設定
output_width = 1024
//ドキュメントの単位設定を保存
var strtRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits= Units.PIXELS;
var active_doc = app.activeDocument
var doc_width = active_doc.width
//リサイズ幅を指定
output_width = input_dialog(output_width)
//リサイズ処理
if (output_width){resize_with_frame(output_width)}
//ドキュメントの単位設定を戻す
app.preferences.rulerUnits = strtRulerUnits
//サイズ入力ダイアログ
function input_dialog(width)
{
    dialog1 = new Window("dialog","幅を入力")
    dialog1.bounds = [400,400,600,500]
    dialog1.cancelButton = dialog1.add("button", [40,60,110,60+25], "Cancel", {name: "cancel"})
    dialog1.okButton = dialog1.add("button",[120,60,170,60+25], "OK", { name:"ok"})
    dialog1.sizetxt = dialog1.add("edittext",[10,10,110,10+25], width)
    if (dialog1.show() ==  1){
        return dialog1.sizetxt.text
        }
    }
function resize_with_frame(output_width)
{
    Trsp_to_mask()//透明度から選択範囲を作成
    //選択範囲の拡大縮小で意図しない範囲を消去
    active_doc.selection.expand(2)
    active_doc.selection.contract (2)
    active_doc.selection.invert()
    //範囲を取得
    selection_bound = active_doc.selection.bounds
    selsction_width = selection_bound[2] - selection_bound[0]
    //リサイズ
    active_doc.resizeImage (output_width * doc_width / selsction_width)
    }
//透明部分を選択範囲に
function Trsp_to_mask()
{
var id21 = charIDToTypeID( "setd" );
    var desc4 = new ActionDescriptor();
    var id22 = charIDToTypeID( "null" );
        var ref2 = new ActionReference();
        var id23 = charIDToTypeID( "Chnl" );
        var id24 = charIDToTypeID( "fsel" );
        ref2.putProperty( id23, id24 );
    desc4.putReference( id22, ref2 );
    var id25 = charIDToTypeID( "T   " );
        var ref3 = new ActionReference();
        var id26 = charIDToTypeID( "Chnl" );
        var id27 = charIDToTypeID( "Chnl" );
        var id28 = charIDToTypeID( "Trsp" );
        ref3.putEnumerated( id26, id27, id28 );
    desc4.putReference( id25, ref3 );
executeAction( id21, desc4, DialogModes.NO );
}

枠のレイヤを選択した状態で枠の透明部分を基準が指定した幅になるように拡大縮小します
ただし計算の誤差があるので少し大きさに差が出るようです

●Photoshopのアンドゥをちょっとだけ便利にする方法

2012年3月28日    

PhotoshopCS6のパブリックベータが始まっていますが
古くから絵を描くのに使っている人にとってCS3になった頃からの問題がひとつ
『レイヤを移動した後の操作を戻る操作をするとレイヤが前に使用しているレイヤに戻ってしまう』
というもの(長い...)
標準の取り消し/やり直し(Ctrl+Z)のショートカットを変更してヒストリを戻る操作がCtrl+Zにしている方も少なくないかと思います

PhoroshopCS6でもそのままの仕様のようです
パブリックベータ期間にレポートを受け付けるということなので
過去のフォーラム等でどういう扱いを受けてたのか調べていたら
変化球的な解決策が提示されているのを見つけたのでメモ

http://www.polycount.com/forum/showthread.php?p=1251347#post1251347

英語の読める方にはそのままですが 以下日本語で解説

続きを読む "Photoshopのアンドゥをちょっとだけ便利にする方法"

●ComicStudio下絵一括読み込み

2011年12月 2日    

twitterでぱにぽに等の作者の氷川へきる先生が
コミスタでネーム画像を一括して読み込めたら とつぶやいていたのをみて開発していたソフトが完成しました
フォルダに入っている画像を1枚1ページで一括してComicStudioに読み込ませます
また 読み込んだ画像はComicStudioのページに合わせてリサイズされます

(最初に公開したバージョンではWindows環境でJPEGを読み込めない問題があったので修正しました)

CS_Rough_Importer2_m.zip(MacOSX)
CS_Rough_Importer2_w.zip(Windows)

(Windows版は解凍したフォルダの中のCS_Rough_Importer2.exeを実行してください)

11120103.jpg

元々はコミスタのファイルを直に吐き出す方式の予定で色々やっていたのですが
最近のアップデートでCLIP WEB PAINTというサービスとの連携で
新しいファイルフォーマットを採用したので そのファイルを利用することにしました

よってComicStudio 4.6以降必須となります

詳しい使い方は続きで

続きを読む "ComicStudio下絵一括読み込み"

●AppleScriptでコミスタの書き出しを自動制御してみたよ

2011年11月17日    

以前にもAppleScript使ってComicStudioで自動保存をするスクリプトを作ってみましたが

今回は書き出し設定の切り換えを自動制御でやってみました
書き出し方式をプリセットで切り替えれれば苦労はないんですけどね
とりあえず動画

実行のボタンを押してからはマシンを一切操作していません

時々考え事をしているように止まるのはご愛嬌といったところ

まだ使いやすい状態になってませんが参考までにスクリプト置いておきます

#操作対象を指定 EXの場合は "ComicStudio EX"

property ComicStudio : "ComicStudio Pro"

#保存場所を指定:例ではデスクトップ上

property SavePath : "~/Desktop/"


tell application "System Events"

set process_CS to application process ComicStudio of application "System Events"

tell process "ComicStudio Pro"

set frontmost to true #操作対象をアクティブにしておく

#書き出しダイアログの呼び出し

tell menu bar 1's menu bar item "ファイル"

tell menu "ファイル"'s menu item "書き出し"

click menu item "画像ファイル(寸法指定)..." of menu "書き出し"

end tell

end tell

#「画像のエクスポート」ウィンドウへの参照を設定

delay 0.5

set Exp_Window to window "画像のエクスポート" of process_CS

##グレースケールで縮小画像の書き出しをする設定

#縮小率を設定

click radio button 2 of radio group 1 of group "出力サイズ" of Exp_Window

#縮小率の数値

set value of text field 3 of group "出力サイズ" of Exp_Window to "25%"

#グレースケールモードに

click pop up button 1 of Exp_Window

click menu item "グレースケール" of menu 1 of pop up button 1 of Exp_Window

##ラスター化の詳細設定

click UI element "ラスター設定..." of group "仕上げ情報" of Exp_Window

#『ラスター詳細設定』ウィンドウへの参照を設定

set raster_Window to window "ラスター詳細設定" of process_CS

#『下記の設定で減色する』を選択

click radio button "下記の設定で減色する" of radio group 1 of group "出力設定" of raster_Window

#ポップアップの中身を選択

click pop up button 1 of group 1 of raster_Window

click menu item "減色しない" of menu 1 of pop up button 1 of group 1 of raster_Window

click button "OK" of raster_Window

##トーンの書き出し設定

click UI element "トーン設定..." of group "仕上げ情報" of Exp_Window

#『トーン詳細設定』ウィンドウへの参照を設定

set tone_Window to window "トーン詳細設定" of process_CS

click radio button "すべてグレーで出力" of group "出力設定" of tone_Window

click button "OK" of tone_Window

##ファイルの設定

#書き出しフォーマットをPNG

click pop up button 1 of group "ファイルの設定" of Exp_Window

click menu item "PNG" of menu 1 of pop up button 1 of group 5 of Exp_Window

#ファイルパスの設定

click UI element "..." of group "ファイルの設定" of Exp_Window

#セーブダイアログでファイルパスをテキスト指定するシートを表示

keystroke "g" using {command down, shift down}

#ファイルパスの設定

set value of text field 1 of sheet 1 of window "フォルダの選択" to SavePath

click button "移動" of sheet 1 of window "フォルダの選択"

click button "開く" of window "フォルダの選択"

#書き出しの実行

click button "OK" of Exp_Window

end tell

end tell

●Photoshopでグループ毎にJPEG出力する

2011年10月16日    

Twitter上でグループ毎に画像を出力できるスクリプトはないものか
という話題が出てたので作ってみました。
Photoshop用javascriptなのでWin/Mac両対応です
これ自体は使いどころが限られるスクリプトですが 何かの参考に置いておきます

実行するとフォルダ選択ダイアログが出るので その指定したフォルダに
1階層目にあるグループを一つ一つ順に出力してJPEG画像で出力します
ファイル名はレイヤ名を使い、重複が有る場合は末尾に数字を付加するようにしてあります。

#target photoshop

//配列内にobjがあるかをチェック
function check_array(target_array,obj){
    for (var i in target_array){
        if (target_array[i] == obj){
            return true;
            break;
            }
    }
    return false;
 }

//名前の重複を調べて再割当て
function chack_name(array1,name1){
    if (! check_array(array1,name1)){
        return name1;
     }else{
         //序数
         var tag = 1;
         //同一名が100以上になることは考えない
         while (tag < 100){
            var name2 = name1 + "_" + tag;
            if (! check_array(array1,name2)){
                return name2;
            }
            tag += 1;
        }
    }
}

//JPEGで保存
function save_JPG(file_path){
    jpgFile = new File(file_path);
    jpgSaveOptions = new JPEGSaveOptions();
    jpgSaveOptions.embedColorProfile = true;
    jpgSaveOptions.formatOptions = FormatOptions.STANDARDBASELINE;
    jpgSaveOptions.matte = MatteType.NONE;
    jpgSaveOptions.quality = 1;
    app.activeDocument.saveAs(jpgFile, jpgSaveOptions, true,Extension.LOWERCASE);
}

//main
// in case we double clicked the file
app.bringToFront();
app.displayDialogs = DialogModes.NO;
//ドキュメントが開かれているかどうか判別
if (app.documents.length ==0)
{
	//ドキュメントが開かれていない場合処理なし
}
else
{ 
    //Folder.selectDialog ([prompt])  :出力先を指定
    var outputDir = Folder.selectDialog (["Plese select output directory"]);
    //選択されてない場合はnullが返る
    //alert(outputDir );
    if (outputDir != null){
        //作業するドキュメントを取得
        var active_doc = activeDocument;
        try {
            //ルート階層にあるレイヤーセットを取得
            var docLayerSets= activeDocument.layerSets;
            //ルート階層にある全てのレイヤーを取得
            var docArtLyaers= activeDocument.layers;
            var docArtLyaerCount = docArtLyaers.length
            //レイヤの表示状態を退避する配列を作成
            layer_v_array = new Array(docArtLyaerCount);
            //全てのレイヤーの表示状態を取得して非表意に
            for (i = 0; i < docArtLyaerCount; i++){
                //表示状態の取得
                layer_v_array[i] = docArtLyaers[i] .visible;
                //非表示に
                docArtLyaers[i] .visible = false;
            }
            //ファイル名の重複チェックのための配列
            name_array = new Array(docLayerSets.length);
            //グループの書き出し
            for (i = 0; i < docLayerSets.length; i++){
                //レイヤを表示
                docLayerSets[i].visible = true;
                //レイヤ名の取得
                layer_name = docLayerSets[i].name;
                //ファイル名の重複がないか処理
                layer_name = chack_name(name_array,layer_name);
                //名前のリストに追加
                name_array[i] = layer_name;
                //ファイルパスの生成
                var file_path = outputDir  + "/" + layer_name + ".jpg";
                //alert(file_path);
                //ファイルの書き出し
                save_JPG(file_path);
                //対象レイヤーを非表示に
                docLayerSets[i].visible = false;
            }
            //レイヤの表示を元の様態に戻す
            for (i = 0; i < docArtLyaerCount; i++){
                //表示状態の取得
                docArtLyaers[i] .visible = layer_v_array[i];
            }
        } catch (e) {
            if ( DialogModes.NO != app.playbackDisplayDialogs ) {
                alert(e);
            }
    	//return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
        }
    }
}


使い方や他のスクリプト類はこちら を参照してください
http://yukimi.moemoe.gr.jp/MT/archives/photoshop/

●コミスタ補助ツール

2011年8月23日    

ComicStudioの機能を補助するアプリケーションで作ってみました
説明画面はMacOSXですがWindows版アプリも同様に動くかと思います

Mac版:CS_Tools_mac.zip

Windows版:CS_Tools_win.zip
(Windows版は解凍したフォルダの中のCS_Tools.exeを実行してください)

画面の通りソフトの機能は2つ

11082201.jpg
 ■ComicStudioの3Dワークスペースからパース定規レイヤーに
 ■Photoshopから書き出したIllustlaterパスをComicStudioの定規レイヤーに
となっています 

くわしい説明は続きに

続きを読む "コミスタ補助ツール"

●ComicStudioで自動保存

2011年2月 4日    

以前 フォトショップで自動保存するスクリプト について書きましたが
スクリプトでの操作に対応しないComicStudioでも自動保存する方法があったので
作ってみました
MacOSX専用になります Windows環境の場合はこちらを参考にしてください
CS_autosave.lzh

コミスタで操作している時に10分毎に保存のコマンドを送るようになってます
基本的に上のファイルを解凍してダブルクリックするだけで動くようになっていますが
システム環境設定を一部変更する場合がありますので注意してください

動作テストに1分毎での保存に設定したものを使ってみましたが
差し当たって操作の障害になることもないようです


自分好みにカスタマイズしたい人のためにスクリプトのメイン部分も続きに置いておきます

続きを読む "ComicStudioで自動保存"

●SketchUpのシーンをComicStudioに1.6

2011年1月16日    

GoogleSketchUpからComicStudioやIllustStudioへ
形状とカメラデータを書き出すプラグインをアップデートしました
基本的にはバージョン1.5と同じですが
  • 階層化したコンポーネントで形状が乱れる場合があった
  • 頂点座標が0になる場合に不正なデータが記録されることがあった

といったバグ対応しています
1.5をご利用の方は置き換えをお勧めします
10050901.jpg

以前と同じ内容になりますが
続きには使い方と主な機能を書いておきます

続きを読む "SketchUpのシーンをComicStudioに1.6"

●Shade書捨てスクリプト

2010年12月 9日    

Shade12が発売になりましたね
今まで10.5を使っていましたがアップデートして色々試してみています
ただ自分の使うスクリプトでクラッシュしたりするので移行はまだまだ先かな
ムービーを作るのに使う使い捨てスクリプトをメモ

最初にバインド設定したものの上の階層の設定を足したい場合に使うスクリプト

# coding: utf-8
#選択形状でループ
for shape_ in xshade.scene().active_shapes:
	#コントロールポイントでループ
	for i in xrange(shape_.total_number_of_control_points):
		#ポリゴンメッシュのみを処理対象に
		if shape_.type != 7 :continue
		vind_list = []
		#頂点のバインドの数を取得
		target = shape_.vertex(i)
		bind_num = target.skin.number_of_binds
		for j in xrange(bind_num):
			bind = target.skin.get_bind(j)
vind_list.append([bind.shape,bind.weight]) target.skin.append_bind() #target.skin.get_bind(0).shape = target.skin.get_bind(0).shape.parent #0番のバインドを削除する for j in xrange(bind_num): target.skin.get_bind(j+1).shape = vind_list[j][0]
target.skin.get_bind(j+1).weight = vind_list[j][1]
shape_.update_skin_bindings()

Shade12から追加されたプリミティブ形状を作成するスクリプト
スクリプトではカプセル形状を親子階層になったボールジョイントの位置に作成

# coding: utf-8
#xshade.scene().create_primitive_capsule(None,「プリミティブ:0,自由曲面:1,ポリゴンメッシュ:3」,True,「U方向の分割数:16」,「V方向の分割数:16」,「開始位置の中心座標」,「直径」, 1, 「終了位置の相対座標」)
scene_ = xshade.scene()
shape_ = xshade.scene().active_shape()
if shape_.type == 2 and shape_.part_type == 10:
	if shape_.parent.type == 2 and shape_.parent.part_type == 10:
		point1 = shape_.parent.ball_joint.position
		point2 = shape_.ball_joint.position
		pos_2 = map((lambda x,y:x-y),point2,point1)
		size1 = shape_.ball_joint.size
		scene_.create_primitive_capsule(None,3,True,20,16,point1,size1,1,pos_2)

座標変換とかには対応してないので

ボールジョイントを回転等をさせると明後日の位置に作成されてしまいますがメモってとこで

●Photoshopで不要なチャンネルを削除する2

2010年11月 7日    

昨日はAppleScriptでチャンネルを削除するスクリプトの記事を書きましたが
Windows版でも使えるjavascriptでの方法を調べたので書き残しておきます

まず アルファチャンネルを全て削除するスクリプト
テキストエディッタで

activeDocument.channels.removeAll();
の一行を書いたテキストファイルを作って
「アルファチャンネル全削除.jsx」といった感じに 拡張子.jsxで保存
Photoshopの ファイル>スクリプト>参照... でそのファイルを選択するだけ
画像の色を構成するもの以外のアルファチャンネルが全て削除されます
(RGBモードのファイルなら RGBのチャンネル以外と言った感じ)
ファイルの受け渡しでアルファチャンネルは消してしまたい時に使えるのではないでしょうか

続けて Photoshopは通常操作で複数のチャンネルを削除できないので
選択したチャンネルのみを消すスクリプトも

ch = activeDocument.activeChannels;
for (i = 0; i < ch.length;i++){
	if (ch[i].kind != ChannelType.COMPONENT){ch[i].remove();}
	}
上と同様に色を構成するチャンネルは消さないようにはしてあります

ちなみにフォトショップのスクリプトは
ファイルを選択して実行する行程をアクションに記録する事もできます
スクリプトフォルダ に保存することで 
スクリプトのメニューに表示されるようにすることもできます
(MacのCS3ならアプリケーション/Adobe Photoshop CS3/プリセット/スクリプト)
さらにアクションに記録しておけば
自動処理>バッチ... で複数のファイルを一括処理してしまうこともできるでしょうね

いずれのスクリプトも PhotoshopCS以降が対象です

●Photoshopで不要なチャンネルを削除する

2010年11月 6日    

ちょっと用あって10枚以上のアルファチャンネルのあるファイルの
チャンネルを削除する用があったのでスクリプト書いてみた

数行だけれど必要な人は居るかも

AppleScriptなのでMac専用だけど
需要あったらWindowsでも使えるものを作るかも

tell application "Adobe Photoshop CS3"
	activate
	--doc duplicate current document
	set a to count (channels of current document)
	if a > 3 then
		repeat a - 3 times
			delete channel 4 of current document
		end repeat
	end if
end tell


ちなみに3行目のdoc duplicate current documentは

元のドキュメントを不用意にいじらないようにするために複製で作業するための命令

必要ならば--を削除すると機能します

●SketchUpのシーンをComicStudioに1.5

2010年10月21日    

GoogleSketchUpからComicStudioへ
形状とカメラデータを書き出すプラグインをアップデートしました
  • 日本語ファイルパス対応
  • スムーズのかけられた曲面への対応
  • 線データが意図しない場所に出力されるのを修正
といったバグ対応しています

10102001.jpg
以前と同じ内容になりますが
続きには使い方と主な機能を書いておきます

続きを読む "SketchUpのシーンをComicStudioに1.5"

●MacOSXでPython等のスクリプトを通常アプリのように

2010年9月16日    

今 Pythonで絵描きさん用ツールを作成しているのですが
それを配布するにあたりスクリプトの状態のままではマズいので

(主に使い勝手の面で)

通常のアプリケーションのように扱えるようにする方法を調べたのでメモ

ほぼ ここのサイトにある通りなのだけれど
http://d.hatena.ne.jp/y-echo/20100103/1262539509

参照しているサイトがMacOSX移行期のものなのでいつなくなるか不安なので

基礎的な情報として
MacOSXの一般的なアプリケーションは『ソフト名』に.appの拡張子のついたフォルダの中に

決まった形式で ソフトに必要な実行ファイルや画像ファイルを収めた形になっています
(アプリケーションバンドルと呼ばれます)

適当なフォルダに手動で.appの拡張子をつけると Finder上は一つのアプリケーションファイルのようになります

ただし 当たり前ですがそのままでは何も機能しません

アプリとして機能させるのに最小限必要なファイル構成は

[アプリ名.app]           ...親フォルダ
     └Contents
           ├Info.plist  ...アプリケーションの設定を記したXMLファイル
           └MacOS       ...実行するスクリプトやバイナリを収めるフォルダ
		       └(実行バイナリ等)
となっており Contentsフォルダ内にアプリケーションに必要なデータを収める形になっています
Finder上でアプリ名のフォルダ Contentsフォルダ MacOSフォルダを作ってもいいし
参考にしたサイトのように ターミナルでディレクトリを作ってもいいでしょう

ここではFinder操作でフォルダを作ります 親フォルダの.appの拡張子はまだつけないでおいてください

次にMacOSディレクトリに実行ファイルをいれます
通常のアプリではコンパイルされたファイルがここに入っていますが
シェルスクリプト等の実行可能なスクリプトファイルも利用できます
ここでは仮にPythonのスクリプトファイル test.py があるとします

最後に適当なテキストエディッタで文字コードUTF-8でInfo.plistを作成します

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>CFBundleExecutable</key>
    <string>test.py</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
  </dict>
</plist>

これでアプリ名のフォルダに.appと拡張子を付加すれば
アプリケーションとして機能するようになります

アイコンを付加したい場合は
Contentsの下にResourcesフォルダを作ってその中に.icons拡張子のアイコンデータを収めて
Info.plist のの間の部分に

	<key>CFBundleIconFile</key>
	<string>(アイコンファイル名)</string>
の2行を追加します

(アイコンデータの作り方は検索で比較的多く出るので省略)

概要はこんなところですが
試している間で失敗したことをいくつか

アプリ化したものを一度起動するとInfo.plist等のデータがメモリ上にキャッシュされてるのか
変更が反映されないようです 設定をかえた場合はアプリ名を一度かえてみてください

Python等のスクリプトファイルの改行コードはLFで
(普段のスクリプトファイルをCRで書いていたので動かなくて往生してしまいました)

次はWindows用のexe化だ

●Shadeの線形状をコミスタの定規に

2010年9月11日    

ComicStudioの3Dレイヤに続き定規レイヤーのデータの解析をしてみました
フォトショップのパスやShadeの線形状と同じベジェも使えるようなので

過去の自作スクリプトを活用してカメラウィンドウの表示のまま
Shadeの線形状をコミスタのレイヤーファイルとして書き出すスクリプトを
書いてみました。
146514837.jpg
本当はもう少し使いやすいものに仕上げたかったのですが
しばらくいじっていられそうにないので 暫定版の書捨てスクリプトのまま公開
line_to_cru100911.lzh
Shadeのブラウザ上で選択している線形状が書き出し対象になります
スクリプトを実行して生成された拡張子.cruのファイルを
ComicStudioでファイル>読み込み>レイヤーファイルで読み込みます
定規のレイヤーフォルダを選択した状態だと定規レイヤーとして
画像レイヤーを選択した状態だと そのレイヤーのサブ定規として読み込まれるようです

●Shadeのカメラ情報をComicStudioに

2010年8月 8日    

先に公開していたSketchUpのカメラをComicStudioに書き出すものに続いて
ShadeのカメラデータをComicStudioに書き出すスクリプトを作成してみました
ExportCSD.py
フリーウェアですがソースコードの再利用に関してはご一報ください

カメラデータのみの書き出しで形状書き出しは未搭載です
形状の書き出しは別記事で紹介している
LWOエクスポートスクリプトをご利用ください

このスクリプトだけでは寂しいのでもうひとつ

作りだめしている小物の中から肉まんの蒸し器をUPしました
10080701.jpg
季節外れも甚だしいですが
よろしければご利用ください

●Photoshop自動保存スクリプト

2010年7月 8日    

twitterでイラストレーターのCHOCO先生がAutomatorを使って
作業中ファイルの自動保存を作っているとの書き込みをみて
こういうやり方もありますよー的にAppleScriptを書いてメッセージを送ってみた
(Automator:MacOS上でパーツの組み合わせで自動処理をする環境)
(AppleScript:MacOSのソフトを制御できるプログラミング環境Automatorより前からあってより細かい処理が可能)


他の人も使えるでしょうし
少し調整して公開



#保存用フォルダの作成 #あらかじめ保存フォルダを作ってある場合この下4行は必要ありません tell application "Finder" if "autsave" is not in name of every folder of desktop then make folder at desktop with properties {name:"autsave"} end if end tel

#自動保存の常駐ループ on idle
try #保存フォルダの指定 必要に応じて""の中を書き換えてください set save_dir to "~/Desktop/autsave/" tell application "Adobe Photoshop CS3" #作業中のドキュメントのファイル名を取得
set doc_name to name of current document as string set sevepath to save_dir & doc_name save current document in file sevepath as Photoshop format with copying #保存 end tell return 600 #繰り替えす秒数 on error display dialog "保存に失敗しました" end try end idle

Photoshopで最前面の書類の複製を自動保存するようにしてあります
AppleScriptエディッタ(leopard以前ではスクリプトエディッタ)にこちらをコピペしてください

保存時に
フォーマット:アプリケーション 
『実行後自動的に終了しない』をチェックすると常駐アプリになります
CS3以外のバーション利用の場合は初回起動時にPhotoshopを指定してださいと ダイアログが出るかもしれません

●SketchUpのシーンをComicStudioに1.3

2010年5月 9日    

先日公開した SketchUpのシーンをComicStudioに のプラグインですが 

windows版のComicStudio/iIIustStudioで読み込みに問題があった等

いくつかのバグがあったので修正しました.


加えてコンポーネントの対応を加えたので 

Google3Dギャラリーの形状も利用できるようになりました

export_csd_1_3

10050901.jpg

ちなみにGoogle3Dギャラリーに登録されてる形状の権利関係はこういった感じ
日本の国内法でどこまで有効か微妙な部分もあるけど
ユーザーの権利の部分を読む限り
Google 3D ギャラリーにUPされた時点でアップロード者が派生物の作成を許諾したことになるようです
つまり 3Dギャラリーから落としたものを下絵にするのは問題なさそうです

●SketchUpのシーンをComicStudioに

2010年4月30日    

以前の記事
スケッチアップのカメラ設定のみを書き出すプラグインを公開していましたが
同時に3D形状も書き出すものを作成しました
export_csd1_2.rbs
いくつかの致命的なバグがあったので修正しましたくわしくはこちら

ダウンロードしたファイルを
Windows の場合:C:/Program Files/Google/Google SketchUp 7/Plugins
MacOSXの場合:起動ドライブの/ライブラリ/Application Support/Google SketchUp 7/SketchUp/Plugins
にコピーして SketchUpを再起動すれば
『プラグイン』メニューに『ComicStudioデータ書き出し』という項目が追加されます

作成される拡張子.csdのファイルをコミックスタジオ/イラストスタジオで読み込んでください
(同時に生成される拡張子.objのファイルは3D形状のデータです)
10042901.jpg


  • スケッチアップのカメラ設定をコミックスタジオに書き出し

  • Wavefront Object形式で3D立体形状を書き出し

  • スケッチアップで非表示の形状を出力しない

  • スケッチアップの線形状を立体化することで書き出し


といった機能を備えています
穴空けやコンポーネントには対応していない等一部不備がありますが
(1.4で対応しました)
線の書き出しは単純ながら作画のアタリには使えるかと思います

どうぞお試しください

●ランダム生成した頂点を結んで三角ポリゴンに

2010年4月 7日    

後々のために計算で生成した頂点座標から
三角ポリゴンで分割した形状を作るためのテストプログラムを書き捨て

#ランダム生成した頂点を結んで三角ポリゴンに
import random #ランダム生成のモジュール
import math

#交差判定
def closs_line(pos_1_1, pos_1_2, pos_2_1, pos_2_2):
#交差を判定するベクトルを求める
vec_0 = [pos_1_2[0] - pos_1_1[0], pos_1_2[1] - pos_1_1[1]]
vec_1 = [pos_2_1[0] - pos_1_1[0], pos_2_1[1] - pos_1_1[1]]
vec_2 = [pos_2_2[0] - pos_1_1[0], pos_2_2[1] - pos_1_1[1]]
#外積計算
normal_1 = vec_0[0]* vec_1[1]-vec_0[1]* vec_1[0]
normal_2 = vec_0[0]* vec_2[1]-vec_0[1]* vec_2[0]
#法線の方向が異なる場合延長線とは交差している
if normal_1* normal_2 < 0:
vec_4 = [pos_2_2[0] - pos_2_1[0], pos_2_2[1] - pos_2_1[1]]
vec_5 = [pos_1_1[0] - pos_2_1[0], pos_1_1[1] - pos_2_1[1]]
vec_6 = [pos_1_2[0] - pos_2_1[0], pos_1_2[1] - pos_2_1[1]]
#外積計算
normal_1 = vec_4[0]* vec_5[1]-vec_4[1]* vec_5[0]
normal_2 = vec_4[0]* vec_6[1]-vec_4[1]* vec_6[0]
if normal_1* normal_2 < 0:return 1
else:return 0
else:return 0

#点の座標を生成
vec2_point_list = []
for i in xrange(50):
pos_x = random.uniform(-100,100)
pos_y = random.uniform(-100,100)
vec2_point_list.append([pos_x, pos_y])
#print vec2_point_list
###稜線情報生成
##点列の頭から頂点同士の接続を調べる
edge_dic = {}#頂点番号:[接続先の頂点番号リスト] の辞書
for i in xrange(len(vec2_point_list)):
edge_i = []
pos_1_1 = vec2_point_list[i]#基準の頂点座標
#for j in xrange(i+1,len(vec2_point_list)):
for j in xrange(len(vec2_point_list)):
if i == j :continue
pos_1_2 = vec2_point_list[j]#接続確認先の頂点座標
#引く線分の長さ
length_1 = math.hypot(pos_1_2[0]- pos_1_1[0],pos_1_2[1]- pos_1_1[1])
closs_flag = 0
for k in xrange(i):
if closs_flag != 0 :continue
closs_list = []
edge_k_list = edge_dic[k]
edge_k_list2 = edge_k_list
pos_2_1 = vec2_point_list[k] #交差する線分の頂点1
for l in edge_k_list:
if l == i or l == j : continue
if l in closs_list: continue
pos_2_2 = vec2_point_list[l]#交差する線分の頂点2
#これまで生成された線分と新しく生成する線分の交差を判定
#交差した線がある場合 短い線を残し長い方の稜線を削除
closs = closs_line(pos_1_1, pos_1_2, pos_2_1, pos_2_2)
if closs == 1:
length_2 = math.hypot(pos_2_2[0]- pos_2_1[0],pos_2_2[1]- pos_2_1[1])
if length_1 closs_list.append(l)
#print "del: %i => %i(closs %i %i)" % (k,l,i,j)
else:closs_flag += 1
if closs_flag == 0:
#交差方向のエッジをリストから取り除く
for m in closs_list:edge_k_list2.remove(m)
edge_dic[k] = edge_k_list2
if closs_flag == 0:
edge_i.append(j)
edge_i = list(set(edge_i))
edge_dic[i] = edge_i

#Shadeのポリゴンメッシュ生成
xshade.scene().begin_creating()
xshade.scene().begin_polygon_mesh(None)
for i in vec2_point_list:
pos = [i[0], 0, i[1]]
xshade.scene().append_polygon_mesh_vertex(pos)
for i in xrange(len(edge_dic)):
if edge_dic[i]:
for j in edge_dic[i]:
xshade.scene().append_polygon_mesh_edge(i, j)
xshade.scene().end_polygon_mesh()
xshade.scene().end_creating()


●GoogleSketcUpのカメラ設定をComicStudioに

2010年3月29日    

先日の日記で書いていた ComicStudioの3D設定ファイルの解析結果を元に

GoogleSketchUpのカメラ設定を
ComicStudioに読み込ませるためのプラグインを書いてみました
2日で書いた殴り書きの汚いスクリプトですが よろしければお使いください
10032801export_csd.lzh

ダウンロードしたファイルを解凍してできたexport_cs.rbを
Windows の場合:C:/Program Files/Google/Google SketchUp 7/Plugins
MacOSXの場合:起動ドライブの/ライブラリ/Application Support/Google SketchUp 7/SketchUp/Plugins
にコピーして SketchUpを再起動すれば
プラグインメニューにスクリプトが追加されるかと思います

10032801.jpg
左が元のSketchUp の画面右が書き出したデータを読み込ませたComicStudioの画面です

注意点としてはComicStudioのカメラの『距離』の設定はデフォルトのままなので
必要に応じて調整してください
また、CSDファイルはComicStudioの3D形状の読み込み状態を記録したファイルなので
3Dを読み込んだシーンに設定ファイルを読み込ませると カメラ以外は消えてしまいます
使う場合はCSDファイルを読み込んだ後 個別の3Dファイルを読み込むようにしてください

ちなみに3Dの形状は
こちらのサイトにあるlwo_exportを使って読み込ませました
プラグインの設定もlwo_exportの形状出力に合わせて調整してあります

今のところは 3D形状は別途読み込む必要がありますが
将来的には形状を親子関係を設定して一括して読み込めるようにする予定です

(必要な情報はそろってて半月もあれば作れるのですが
 主にお財布的な事情で...  ってなわけでカンパ歓迎です
 三菱東京UFJ銀行 厚木支店(店番号707) 普通講座 4725509 口座名:ユキミツキ)

●Photoshop書捨てスクリプト

2010年2月13日    

友人から画像に変更を加えずに解像度を変更して
途中に処理をはさむ方法を聞かれたので Photoshop-javascriptを書捨て


//画像の変更をせずに解像度の変更をするスクリプト //今の画像の単位を記憶 ref_ruler = app.preferences.rulerUnits; //画像の単位をピクセルに app.preferences.rulerUnits =Units.PIXELS //現在の画像サイズを記憶 ref_width = activeDocument.width; ref_height = activeDocument.height; ref_resolution = activeDocument.resolution; //解像度の変更 activeDocument.resizeImage(ref_width ,ref_height,72); //スタイルの適応 activeDocument.activeLayer.applyStyle("スタイル 1"); //解像度を戻す activeDocument.resizeImage(ref_width ,ref_height,ref_resolution); //画像の単位設定を戻す app.preferences.rulerUnits = ref_ruler

別の人がtwitterで新規レイヤーを下に作るショートカットないかとつぶやいてたので
スクリプトでつくってみる

//新規レイヤーを現在のレイヤの下に layer_ref = activeDocument.activeLayer; //ダイアログの抑制背設定を記録 dialog_ref = displayDialogs; //JavaScriptExecutionMode.NEVER if ( layer_ref.isBackgroundLayer == 0){ try { displayDialogs = DialogModes.ALL; //レイヤ作成 new_layer = activeDocument.artLayers.add(); //選択されていたレイヤの下に移動 new_layer.move(layer_ref,ElementPlacement.PLACEAFTER ); }finally{ //ダイアログの抑制を戻す displayDialogs = dialog_ref; } }

.jsまたは.jsxの拡張子でテキストファイルに保存して
ファイル>スクリプト>参照で指定すると実行できます
ファイル指定の行程をアクションで記録してファンクションキー割り当てれば
ボタン一発もいけるはず

2/15追記 名前設定する必要があるってことなのでダイアログを出すように変更
また『(Photoshopのあるフォルダ)/プリセット/スクリプト』に
他のプリセットスクリプトといっしょに収めて再起動すれば
標準機能と同じようにキーボードショートカットが割当可能なことが判明

●LWOエクスポート/インポートスクリプト バージョンアップです

2009年12月29日    

Shadeで.lwo(LightWave3D object file)をインポート/エクスポートするスクリプトをアップデートしました
Shade11への対応とUVの入出力に対応しました
通常Professionalでしか扱うことのできないlwoの形状データを扱うことができるようになります

Shade10/11のWidget形式となります
Shade10とShade11では別バイナリとなっています

ダウンロードしたファイルを解凍してできる
お使いのバージョンに合ったフォルダを開き
中にあるLWO_toolsフォルダごとShadeのWidgetsフォルダにコピーして
Shadeを再起動すれば利用可能になるかと思います
(詳しいインストール方法はShadeのマニュアルを参照してください)

http://artistside.com/?m=pc&a=page_fh_content&target_c_diary_id=15359

インポートは指定した形状のレイヤを一つのポリゴンメッシュとして作成
エクスポートはブラウザ上で選択した形状を選択形状毎に
ポリゴンメッシュに変換後それぞれをlwoとして出力します(複数形状可)

UVの入出力 テクスチャーの出力に対応しました
出力では距離UVのUV値と レイヤ1のテクスチャーデータをLWOに設定した状態で出力します
入力ではパラメタUVと距離UVの両方に同じUV値を設定します

テクスチャ出力の確認には(株)セルシスが販売しているComicStudioを利用しました
UV設定がされたポリゴンメッシュならばテクスチャー込みでコミスタ等に受け渡すことができるかと思います

●書き捨てスクリプト メモ

shadeの自作スクリプトのバグチェックのための書き捨てスクリプトをメモ

ポリゴンメッシュのuv値を(面id,頂点id):uv値 と出力するスクリプト


shd_shape = xshade.scene().active_shape()
for i in range(shd_shape.number_of_faces):
vertex_id_list =shd_shape.face(i) .vertex_indices#面を構成する頂点のid
uv_list = shd_shape.face(i).parameter_uv#パラメターUVの値を距離UVに
for j in xrange(len(uv_list)):
print "(" + str(i) + "," + str(vertex_id_list[j])+ ")" + str(uv_list[j])

●ShadeのUVをフォトショップの選択範囲に

2009年12月 1日    

書捨て状態だったスクリプトを公開
MacOSXのShadeとPhotoshop環境以外では使いようがないけれど
何かの参考に


import sys
import commands

##ApleScript部分ここから##
AppleScript_="""
on run argv
set argv_ to item 1 of argv
set point_list to {}
tell application "Adobe Photoshop CS3"
--activate
set width_ to width of current document as pixels
set Height_ to height of current document as pixels
if ((count word of argv_) mod 2) = 1 then
return
else
repeat with i from 1 to (count word of argv_) div 2
set a1 to (word (i * 2 - 1) in argv_ as number) * width_
set a2 to (word (i * 2) in argv_ as number) * Height_
set end of point_list to {a1, a2}
end repeat
end if
--選択範囲を追加
select current document region point_list combination type extended
end tell
end run
"""
##AppleScript部分ここまで##

##選択されている面のUVを取得
shd_shape = xshade.scene().active_shape()
f=commands.getoutput('osascript -e \'tell application \"Adobe Photoshop CS3\" to deselect selection of current document\'')
for i in range(shd_shape.number_of_faces):
if (shd_shape.face(i).active):
UV_list = shd_shape.face(i).distance_uv #距離UV
#UV_list = shd_shape.face(i).parameter_uv #パラメータUV値
argv_ = ""
for j in range(len(UV_list)):
(u,v) = UV_list[j]
argv_ = argv_ + str(u) + " " +str(v) + " "
(u,v) = UV_list[0]
argv_ = argv_ + str(u) + " " +str(v)
#print argv_
f=commands.getoutput('osascript -e \'' + AppleScript_ + '\' \''+ argv_ +'\'')
#print f
f=commands.getoutput('osascript -e \'tell application \"Adobe Photoshop CS3\" to activate\'')

●LWOエクスポート/インポートスクリプト作りました

2009年7月28日    

Shadeで.lwo(LightWave3D object file)をインポート/エクスポートするスクリプトを作成しました
通常Professionalでしか扱うことのできないlwoの形状データを扱うことができるようになります

Shade10のWidget形式となります
ダウンロードしたファイルを解凍してできるLWO_toolsフォルダごと
WidgetsフォルダにコピーしてShadeを再起動すれば利用可能になるかと思います
(詳しいインストール方法はマニュアルを参照してください)

インポートは指定した形状のレイヤを一つのポリゴンメッシュとして作成
エクスポートはブラウザ上で選択した形状を選択形状毎にポリゴンメッシュに変換後それぞれをlwoとして出力します

現状では形状データ以外のUV等は無視されますが 対応していく予定です
まだまだ未完成ですがご意見ご感想等お待ちしております

http://yukimi.moemoe.gr.jp/etc/LWO_tools.lzh

●コントロールポイント座標の記憶/適応

2009年7月10日    

形状操作する時に
コントロールポイントの座標を一時的に退避させておくのに使うスクリプトを書き捨て
スクリプトの実行内容はメモリに保持されるのでそれを利用


shape_ = xshade.scene().active_shape()

dialog1= xshade.create_dialog()
ibutton1 = dialog1.append_radio_button('/記憶/適応')
if dialog1.ask():
ask1 = dialog1.get_value(ibutton1)
if ask1 == 0:
#記憶
position_list = []
for i in xrange(shape_.total_number_of_control_points):
position_list.append(shape_.vertex(i).position)
elif ask1 == 1:
#適応
if ((shape_.total_number_of_control_points) == len(position_list)):
for i in xrange( len(position_list)):
shape_.vertex(i).position = position_list[i]

おまけ
Shadeの2つあるUVの値をもう片方の値へと設定するスクリプト


shd_shape = xshade.scene().active_shape()
for i in range(shd_shape.number_of_faces):
shd_shape.face(i).distance_uv = shd_shape.face(i).parameter_uv#パラメターUVの値を距離UVに
#shd_shape.face(i).parameter_uv = shd_shape.face(i).distance_uv#距離UVの値をパラメターUVに

●Shade-Pythonメモ-日本語コード,パートの開閉について

2009年4月10日    

ShadeでのPythonのデフォルトの文字コードはutf-8のようだけれど

他の文字コードを利用する時につまづいたのでメモ

#coding: utf-8

a = "てすと"
b=unicode(a,'utf-8').encode('shift-jis')

始めa.encode('shift-jis')って具合で変換できるものだと思っていたのだけれど・・・
Pythonの文字関係の処理はどうにも馴染めない

もうひとつ Shadeのパートの開閉に関するテスト


i=1
#全ての形状を調べる
while (scene.get_shape_by_ordinal(i)):
shape = scene.get_shape_by_ordinal(i)
if (shape.type == 2): #パート
if (shape..disclosed):print i #パートが開いている場合,序数を出力
i += 1

これで 閉じたパートの中に開いたパートを入れた場合でも
閉じたパート中の開いたパートも開いたパートとして認識する

ちなみに 空のパート リンクパートも開いたパートとして認識する

●Shade-Pythonメモ

2009年4月 2日    

パートに含まれるポリゴンメッシュを一つのポリゴンにまとめた時
どうなるか試した時のテストスクリプトをメモ


#ポリゴンメッシュに変換(分割なし)
xshade.scene().convert_to_polygon_mesh()

#
shape =xshade.scene().active_shape()
for i in xrange(shape.number_of_faces):
shape.face(i).active = 1
xshade.scene().update_figure_window()
#1/6秒静止(600=1秒)
xshade.sleep(100)
shape.face(i).active = 0

結合したものは元のOrdianl順に面の番号が再配置されるよう

●プログラムのバグがああああ

2008年6月27日    

前の日記にも出した3D形状変形プログラムに誤作動が発生して
苦戦中...
今週一週間何も進んでいない=□○_
どうしてもバグがとれないので愚痴書き込み

放置してもいいんだけど今後これが使えないとなると
予定が大幅に狂うし・・・
幸か不幸か仕事のデータが来るのが遅れていてよかった

っていうか 誤作動が発生しているのは一行のコードに特定できているし
ダンプさせた中間データも正常なのに なーぜーうごーかーなーい〜〜〜〜

6/29追記
コア中のコアに当たる基本ルーチンの変数名を間違えてた(笑
一回の実行で数万回実行される部分のルーチンが 添字の間違いとはいえ恐ろしい
今迄動いてたのが不思議なくらい

●自動モデリングですよ

2008年6月 4日    

827615700_237.jpg
3Dソフト上のカメラ方向から見た形状を
Photoshopで作ったパスの形状に変形するスクリプトです
上の図では球体(赤)を細長い形(青)に変形してます

構想1年 ちまちまと機能を開発/テストすること3ヶ月
やっとこさ動くモノができましたよヽ(゜▽゜≡゜ワ゜)ノ

Photoshop上でのマスク切り抜き作業を
クリッピングマスクでやっているので
条件がよければ Photoshpの作業の後のモデリング作業を自動化できるってわけです

これで作業時間の短縮に・・・ なるといいなぁ

●ShadeのUVをイメージを作成

2008年5月 9日    

# coding: utf-8
error_string = "Error: no image"
image_object_name = "UV_image"
image_size =(512,512)
paint_color =(1.0, 0.0, 0.0)

def draw_line(image_object,vec2_1,vec2_2,paint_color):
w=vec2_2[0] - vec2_1[0]; h=vec2_2[1] - vec2_1[1]
if w== 0:
for i in xrange(int(abs(h))):
x = int(vec2_1[0] ); y = int(vec2_1[1] + i*cmp(h,0))
image_object.image.set_pixel(x,y,paint_color)
elif abs(w) > abs(h) :
a = h/w
for i in xrange(int(abs(w))):
x = int(vec2_1[0] + i*cmp(w,0)); y = int(vec2_1[1] + i*a*cmp(w,0))
image_object.image.set_pixel(x,y,paint_color)
else:
a = w/h
for i in xrange(int(abs(h))):
x = int(vec2_1[0] + i*a*cmp(h,0)); y = int(vec2_1[1] + i*cmp(h,0))
image_object.image.set_pixel(x,y,paint_color)

scene = xshade.scene()
if scene.rendering.image:
image_object = scene.create_master_image(image_object_name)
image_object.image = xshade.create_image(image_size , 32)
else:
xshade.show_message_box(error_string, False)

for shape_ in xshade.scene().active_shapes:
for i in xrange(shape_.number_of_faces):
uv_list = shape_.face(i).distance_uv
for j in xrange(len(uv_list)):
vec2_1= (uv_list[j-1][0] * image_size[0] , uv_list[j-1][1] * image_size[1])
vec2_2= (uv_list[j][0] * image_size[0] , uv_list[j][1] * image_size[1])
draw_line(image_object,vec2_1,vec2_2,paint_color)
image_object.image.create_window()

●ShadeWidget 基本テンプレート

2008年4月 4日    

ShadeのWidgetでPythonとjavascriptが混在するのは美しくないので
外部のスクリプトファイルを実行すつように変更
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title></title>
<link href="shade_widget.css" type="text/css" />
<style type="text/css"></style>
<script src="shade_widget.js" type="text/javascript" charset="utf-8"></script>

<script type="text/javascript">
<!-- 起動時に呼び出す関数 -->
function initialize(){
	//Debug status
	document.debug = false;
	//window size parameter
	windowWidth = 300;
	windowHeight = 200;
	//Debug switch
	if (!document.debug){
	document.getElementById('debug').style.display= 'none';
	}
	//Window size set
	if (!document.debug){
	window.resizeTo( windowWidth , windowHeight );
	}
}
<!-- 絶対パスを取得 -->
function urlParser(path){
	var img=new Image();
	img.src=path;//相対パスをセット
	path=img.src;//絶対パスを保持
	img.src='#'; //実行しているhtmlのurlでロードを止める
	path = path.match(/file:\/\/(.+)/)[1];
	path = decodeURI(path);//URLエンコードされて値が得られるのでデコード
	return path;
}
<!-- 引数で与えられたPythonを実行 -->
function do_Python(f_name){
	f_path = urlParser("./") + f_name;
	py_scr = "execfile('" + f_path + "')";
	window.external.setScript(py_scr);
}
<!-- 引数で与えられたAppleScriptを実行 -->
function do_AppleScript(f_name){
	f_path = urlParser("./") + f_name;
	py_scr ="import commands\n";
	py_scr += "f=commands.getoutput('osascript \"" + f_path + "\" ')\n";
	py_scr += "print f"; //戻り値をメッセージウィンドウに表示
	window.external.setScript(py_scr);
}
</script>
</head>

 <!-- body onloadで起動時に実行する関数を呼び出す -->
 <!-- body onmouseover でWigetクリック時に関数が呼び出される -->
<body bgcolor="#cccccc" onload="javascript:initialize()">

<!-- Pythonスクリプトを呼び出す -->
<input type="button" value="do Pyrhon" onclick='do_Python("test.py");'><br>
<!-- AppleScriptを呼び出す -->
<input type="button" value="do AS" onclick='do_AppleScript("as_test.scpt");'>


</body>
</html>

●shadeに用意されているクラスを調べる

2008年3月14日    

dirコマンドで
用意されているクラスをたどる


def roop_(base,x):
for i in x:
global list_
if (str(i) not in list_):
list_.append(str(i))
base2 = str(base)+'.'+ str(i)
x2=dir(eval(base2))
print base2
roop_(base2,x2)

list_=['xshade']
base_= 'xshade'
x = dir(eval(base_))
text = roop_(base_,x)

800行をこえた....
全部調べるのは大変そうだ

●Shade-頂点 稜線に接する面を取得

2008年3月 6日    

Shadeで頂点や稜線に接する面を取得するコマンドがなかったので


shape_ = xshade.scene().active_shape()

#辞書として 初期化
vertex_shered_face={} #頂点と接する面のリスト
edge_shered_face = {} #稜線と接する面のリスト

#頂点番号をキーとする辞書を作る
for i in range(shape_.total_number_of_control_points):vertex_shered_face[i] = []

#頂点に接する面を探す
for i in range(shape_.number_of_faces):
for j in shape_.face(i).vertex_indices: vertex_shered_face[j].append(i)

#稜線番号をキーとする辞書を作る
for i in range(shape_.number_of_edges):
#対象となる頂点に接している面のリストを取得
face_list_v0 = vertex_shered_face[shape_.edge(i).v0]
face_list_v1 = vertex_shered_face[shape_.edge(i).v1]
edge_shered_face[i] = []
for j in face_list_v0:
if j in face_list_v1:edge_shered_face[i].append(j)

print edge_shered_face

●Python覚え書き

2008年3月 4日    

クリップボードの中のPythonScriptを実行する


import commands
f=commands.getoutput('osascript -e \'return the clipboard\'')
print f #戻り値をメッセージウィンドウに出力

クリップボード内のスクリプトで commandsをインポートするとエラーになるので注意
Windowsではwin32clipboardモジュールをインポートすることでクリップボードを扱えるらしい

Shadeでムービーを作成して
ムービープレーヤーで開く


import os
import sys , commands,time

f_name = "/test.mov"

##動画を閉じる
CloseMovieAS_="""
tell application "QuickTime Player"
repeat with i from 1 to (count documents)
if name of document i is "test.mov" then close document i
end repeat
end tell
"""

##動画再生ApleScript##
PlayMovieAS_="""
on run argv
tell application "QuickTime Player"
activate
open argv as POSIX file
play document 1
set looping of document 1 to true
end tell
end run
"""

#同名の動画が開かれている場合閉じる
commands.getoutput('osascript -e \'' +CloseMovieAS_ + '\' ')
time.sleep(0.1)

#保存するパスを設定
if shade.active_document:
f_path = os.path.dirname(shade.active_document) + f_name
else: f_path = "/Users/yukimi/Temp_items" + f_name

#シーンを取得
scene_= xshade.scene()

#アニメーションの開始フレームを取得
if scene_.animation_settings.starting_frame == -1: start_frame = 0
else: start_frame = scene_.animation_settings.starting_frame

#アニメーションの終了フレームを取得
if scene_.animation_settings.ending_frame == -1:
end_frame = 300
scene_.animation_settings.ending_frame = end_frame
else:end_frame = scene_.animation_settings.ending_frame

xshade.scene().inhibit_update() #画面の更新を止める
start_time=time.time()
#アニメーションの作成を開始
scene_.rendering.start_animation( f_path )
for flame_ in xrange(start_frame,(end_frame +1)):
scene_.sequence_value = flame_ #シーケンス値(フレーム)
scene_.rendering.render()
scene_.rendering.append_animation()
scene_.rendering.finish_animation()
end_time=time.time()
print str(end_time - start_time) + "sec" #経過時間を表示
#シーケンス値を0位置に
scene_.sequence_value = 0
xshade.scene().allow_update() #画面の更新を再開

#再生スクリプトを実行
commands.getoutput('osascript -e \'' + PlayMovieAS_ + '\' \''+ f_path +'\'')

●javascriptでPhotoShop

2008年1月29日    

08012901.jpg
いろいろあってjavascriptでのPhotoshopを自動制御を色々試し中
今まではAppleScript(MacOS標準のスクリプト言語、色々なアプリケーションを制御できる)
を使って制御していたのだけれど

javaScriptの方がやれることが多いのと
Windowsでも動くスクリプトを作る必要があったのと
使い勝手のいい開発環境があった  ということで

新しいものを色々作って試し中
今日は テキストのある位置から特定の距離だけ離れたところの色を取得するものを作成
このスクリプト自体はなんてことないのだけれど
応用すれば 一括して色を置き換えたり
作画用のベタ塗りしたレイヤを一気に準備することもできるかと

ちなみにスクリプトはこんな感じの短いの
試作と実行は ExtendScript Toolkit 2 ってアプリケーションでやってます
Windows版どこにインストールされるかわからないけれど
MacOSXならApplication/ユーティリティ/Adobeユーティリティ/にあります

#target photoshop 
var active_layer = activeDocument.activeLayer 
if (active_layer.kind ==LayerKind.TEXT){ 
var text_contents= active_layer.textItem.contents //テキストレイヤーの内容を取得 
var bounds_ =active_layer .bounds //テキストレイヤーの描画位置を取得 
var pick_point = Array(bounds_[0]+150,bounds_[1]+15)//テキストレイヤーの左上から(100,20)の位置を設定 
var picker_ = activeDocument.colorSamplers.add(pick_point) 
var color_ = picker_.color //色を取得 
//foregroundColor= color_ //描画色に設定 
picker_.remove() //作成したカラーサンプラーを削除 
}
さて 次は何を作るかな

●色分けレイヤースクリプト

2006年9月28日    

3Dソフトで オブジェクト毎に色分けして
フォトショップで 色別にレイヤーに分解するスクリプトでけたヽ(´▽`)ノ

3Dソフトでの色分けも自分でやらないといけないし
フォトショプにスクリプト経由で色から選択範囲を作る方法がないようで
そのへんでちと苦労

細かい不具合はまだあるけど
とりあえずこれでだいぶ省力化になるかな!?