[PowerShell]Blenderランチャ_その3


うちのパソコンにはいくつかのバージョンのBlenderをインストールしています。

インストーラーでインストールしているBlenderのバージョンが 2.82aで、ZIPファイルを展開しておいてあるものが 2.83 beta 、2.90 alpha、2.79b という感じです。ZIPファイルから展開している3つはそれぞれのバージョンの名前の付いたフォルダ内に。

画像2

それぞれのバージョンをダウンロードするところはここらから。

あとついでにBlenderベンチマークもあること紹介しておきましょう。

複数バージョンがある環境

と、本題に。複数のバージョンのBlenderで何かしようとすると、保存ファイルの非互換性とかいろいろ気になりますよね。うっかり他のバージョンで起動してそのまま保存しちゃったとか、も起こりがちです。

ということで、ドラッグドロップしたら.blendファイルの保存バージョンがわかって、指定のバージョンのBlenderで起動できる .bat+.ps1 作りました、っていうのが4月の話。

あと、一つ追加で欲しい機能が出てきました。それは「一時的に追加のAdd-onがほとんど入ってない設定で起動したい」ってことでした。いくつかは入っててほしい、という感じで。

はい、なので対応しましたよ、と。種を明かすと環境変数を設定した上でプログラム実行させるかどうか、というところなんですけどね。

前準備

フォルダを作ります。この階層で。そしてスクリプト内の $bconfpath を確認し必要があれば適宜編集します。

画像1

スクリプト

.ps1 ファイルのみの変更です。

# b_launch
#
# 1.version detect <- from Magic number
# 2.launcher 
# 3.alternative config folder

param($arg)

$bfilepath=""
$bversion=""
$blabel="No File"

# make sure config/scripts/datafiles folder are created under the configpath\<2.XX>\ !!
$bconfpath="C:\blender"

function Get-BlendFileVersion([String]$bfilepath)
{
   $bver=""

   try{
       if(Test-Path $bfilepath)
       {
           $content = Get-Content $bfilepath -Encoding Byte -ReadCount 1KB
           $header = [System.Text.Encoding]::UTF8.GetString($content[0][0..6])
           if( $header -eq "BLENDER")
           {
              $bver= [System.Text.Encoding]::UTF8.GetString($content[0][9..11])
              return $bver
           }
       }
   }catch{}
   return ""
}


if($arg -ne "")
{
  $bfilepath = $arg
  $bversion =Get-BlendFileVersion($bfilepath) 
  $blabel= "["+$bversion+"]:" + [System.IO.Path]::GetFileName($bfilepath)  
}

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$form = New-Object System.Windows.Forms.Form
$form.Text = 'Select a Blender'
$form.Size = New-Object System.Drawing.Size(300,260)
$form.StartPosition = 'CenterScreen'

$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = New-Object System.Drawing.Point(75,160)
$okButton.Size = New-Object System.Drawing.Size(75,23)
$okButton.Text = 'OK'
$okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $okButton
$form.Controls.Add($okButton)

$cancelButton = New-Object System.Windows.Forms.Button
$cancelButton.Location = New-Object System.Drawing.Point(150,160)
$cancelButton.Size = New-Object System.Drawing.Size(75,23)
$cancelButton.Text = 'Cancel'
$cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $cancelButton
$form.Controls.Add($cancelButton)

$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = $blabel
$form.Controls.Add($label)

$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,40)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = 'Please select a Blender:'
$form.Controls.Add($label)

$listBox = New-Object System.Windows.Forms.ListBox
$listBox.Location = New-Object System.Drawing.Point(10,60)
$listBox.Size = New-Object System.Drawing.Size(260,20)
$listBox.Height = 60

$checkbox = new-object System.Windows.Forms.checkbox
$checkbox.Location = new-object System.Drawing.Size(10,115)
$checkbox.Size = new-object System.Drawing.Size(250,50)
$checkbox.Text = "Alternative Folder"
$checkbox.Checked = $false
$Form.Controls.Add($checkbox)  

# <Label>,<program location(fullpath)>,<altconf sub folder(2.XX)>
$ble=@(
  @("2.82a(official)","C:\Program Files\Blender Foundation\Blender 2.82\blender.exe","2.82"),
  @("2.83(beta)","C:\blender-2.83\blender.exe","2.83"),
  @("2.90(alpha)","C:\blender-2.90\blender.exe","2.90"),
  @("2.79(legacy)","C:\blender-2.79\blender.exe","2.79")
  )

for( $i=0;$i -lt $ble.Length; $i++)
{
   [void] $listBox.Items.Add($ble[$i][0])
}

$form.Controls.Add($listBox)

$form.Topmost = $true

$result = $form.ShowDialog()

if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
   $x = $listBox.SelectedIndex
   if( $x -ge 0 ){
       if( $checkbox.Checked -eq $true ){
           $env:BLENDER_USER_CONFIG = $bconfpath +"\"+ $ble[$x][2] +"\config"
           $env:BLENDER_USER_SCRIPTS = $bconfpath +"\"+ $ble[$x][2] +"\scripts"
           $env:BLENDER_USER_DATAFILES = $bconfpath +"\"+ $ble[$x][2] +"\datafiles"
       }

       if([String]::IsNullOrEmpty($bfilepath))
       {

           Start-Process -FilePath $ble[$x][1]
       }
       else
       {
           $arglist=($bfilepath)
           Start-Process -FilePath $ble[$x][1] -ArgumentList $arglist
       }

   }

}

ちょっと画面変わりました

下にチェックボックスついてますね。起動時はチェックは入っていません。チェックを入れて起動すると代替の設定フォルダを使用します。

画像3

あまり新しい話題でもない

環境変数を指定して実行する、というのはそう新しい話題でもないので詳しいことは省きます。

わざわざチェックボックスまで付けたところ、ニーズとして想定されるプロジェクトごとにパイプラインが構築されている場合に共有されるAdd-on等の管理をユーザーフォルダを切り替えることで行いたい、とかその辺?みたいな?実はバージョンごとの起動はそこまで重要じゃないと思います。

See Also:


お読みいただきありがとうございます。サポートいただいた分はおやつのグレードアップに使おうかと思います。スキ、SNSにシェアもよろしくお願いします!