【覚書】maya python入門 其の十一
かなり番外編ですが、11…
とある理由でデータが壊れる事があったので、MAYAで自動バックを作成する
ツールを作りました。
このスクリプトはセーブ実行時にそのデータを指定フォルダに
コピーし、日時で細かく管理、バックアップするツールです。
誤ってセーブしてしまい、一個前に戻りたい…
とかいう時に使用して下さい。
個人的に、あまりナンバリングをシーンにつけるのが
好きじゃないので作成しています。
私はナンバリング派だから。
という人はスルーして下さい。
下記に記載している、コマンドを「AutoBackUP.py」として保存し
C:\Users\ユーザー名\Documents\maya\バージョン\ja_JP\prefs\scripts
英語の場合は
C:\Users\ユーザー名\Documents\maya\バージョン\prefs\scripts
に配置して下さい。
んでMAYA起動。
その後このスクリプトをセーブのショートカットに割り当てます。
手順は以下の通り。
まずはホットキーに新規マッピングします。
マッピングは以下の所から変更できます。
続けて
ホットキーエディタで、コマンドを作成します。
「カテゴリー」から今回は「File」を選択します。
さらに右下の「新規」を押して
下部にあるコマンドに以下のコマンドを入力してください。
import AutoBackUP
AutoBackUP.Auto()
入力が完了したら、ホットキーを割り当てます。
右上にある、「新しいホットキーの割り当て」
にて、ご自身の好きなコマンドを割り当ててください。
私はショートカットのセーブ時に必ず行いたいので
「Ctrl+S」にしてます。
なので、既存のセーブシーンの上書きです。
※普通のセーブシーンがホットキーから外れます。
後は下にある、「割り当て」を実行して下さい。
以上で完了です。
実行してみると、こんな感じになります。
これが実行前。
んで実行すると
こんな感じでプロジェクトフォルダのシーンフォルダ内に「Ver」と命名されたフォルダができます。
この中にバックアップデータができていきます。
画像にも書いてますが、セーブ事にできるので容量には気をつけて下さい。
あと、これは改善予定ではあるんですが、バージョン違いでシーンを開いた時は
このスクリプトがうまく適用できない事があるかと思います。
その時は、一度メニューのセーブを行なってから実行してみてください。
これで大概いけるはずです。
以上です。
以下コード
import maya.cmds as cmds import os.path import shutil import datetime def BackUPP(): day = datetime.datetime.now() Time = day.strftime("%m-%d_%Hh%Mm%Ss") ScenePath = cmds.file( query=True, lastTempFile=True).rpartition( "/" )[0] Scene_Name = cmds.file( query=True, sn=True) Scene_Name_Only = cmds.file( query=True, sn=True , shn=True) Path = ScenePath + "/ver/" if not os.path.exists(Path): os.makedirs(Path) Rename = str(Path)+str(Scene_Name_Only)+"_"+str(Time)+".ma" shutil.copyfile(Scene_Name, Rename) def Auto(): cmds.file( save=True) BackUPP()
【覚書】maya python入門 其の十
今回も動画で学んだコマンドを紹介。
前回に続いて軽めのコードになります。
こんな感じのやつです。
シーン一覧をMAYAディレクトリから取得して
一覧表示し、選択後読み込みといったやつだったと思います。
ではコード
import maya.cmds as cmds import os def UI(): if cmds.window( "Selector_Window" , exists=True ): cmds.deleteUI( "Selector_Window" ) Create_Window = cmds.window( "Selector_Window" , t="Selector" , w=300 , h=300 ,mnb=False , mxb=False , s=False ) oLayout = cmds.columnLayout( w=300 , h=300 ) ImagePath = cmds.internalVar( upd=True ) + "icons/title.jpg" cmds.image( w=300 , h=100 , image=ImagePath ) cmds.separator( h=15 ) Menu_01 = cmds.optionMenu("Menu_01" , w=300 , l="Select Project" , cc=Charactor_Set) Project_Set() cmds.separator( h=15 ) Menu_02 = cmds.optionMenu("Menu_02" , w=300 , l="Select Charactor") Charactor_Set() cmds.separator( h=15 ) cmds.button( l="Open Scene" , w=300 , h=80 , c=Set ) cmds.showWindow(Create_Window) def Project_Set(): projectPath = cmds.internalVar( upd=True ).rpartition( "prefs" )[0] + "projects/" projects = os.listdir(projectPath) for i in projects: cmds.menuItem( l=i , parent="Menu_01") def Charactor_Set(*args): menuItems = cmds.optionMenu( "Menu_02" , q=True , itemListLong=True) if menuItems != None: for r in menuItems: cmds.deleteUI(r) selProject = cmds.optionMenu( "Menu_01" , q=True , v=True ) charactorPath = cmds.internalVar( upd=True ).rpartition( "prefs" )[0] + "projects/" + selProject +"/" sceneFils = os.listdir(charactorPath) charactors = [] for j in sceneFils: if j.rpartition( "." )[2] == "mb": charactors.append(j) for k in charactors: ScnceName = k.rpartition(".")[0] cmds.menuItem( l=ScnceName , parent="Menu_02") def Set(*args): selProject = cmds.optionMenu( "Menu_01" , q=True , v=True ) charactorPath = cmds.internalVar( upd=True ).rpartition( "prefs" )[0] + "projects/" + selProject +"/" SelectScene = cmds.optionMenu( "Menu_02" , q=True , v=True ) SceneName = charactorPath + SelectScene + ".mb" cmds.file( SceneName , open=True , force=True , prompt=False ) print "opening Scene " + SceneName UI()
以外に長いんですよね。
使っている物は今までさほど変わらないので、違った部分だけ参照してみます。
Menu_01 = cmds.optionMenu("Menu_01" , w=300 , l="Select Project" , cc=Charactor_Set)
プルダウンのメニューの詳細を指定しています。
projectPath = cmds.internalVar( upd=True ).rpartition( "prefs" )[0] + "projects/" projects = os.listdir(projectPath)
ディレクトリフォルダパスで「prefs」で区切って(パスを戻って)
「projects」というパスを指定しています。
要は、
C:\Users\ユーザー名\Documents\maya\2016\prefs
が、
C:\Users\ユーザー名\Documents\maya\2016\projects
に変更した感じです。
んで、次に「listdir」にて作成したパスにあるファイル、フォルダを取得しています。
一応ここも
for i in projects: cmds.menuItem( l=i , parent="Menu_01")
このFOR文でプロジェクトフォルダを取得し、それをプルダウンのメニューに仕込んでます。
続けてそのプロジェクトにあるシーンファイル一覧を取得する部分。
charactorPath = cmds.internalVar( upd=True ).rpartition( "prefs" )[0] + "projects/" + selProject +"/"
ここはプロジェクト取得とほぼ一緒です。
さらに「selProject」というサブフォルダを取得しているだけです。
んで、シーンを取得するのですが、その時に下記のコードで「mbファイル」
だけを取得しております。
charactors = [] for j in sceneFils: if j.rpartition( "." )[2] == "mb": charactors.append(j)
単純に空の配列を作成して、IFで引っ掛かったシーンファイルを
配列に格納しているだけです。
後はその配列に格納されたデータを元に
メニューに登録していきます。
for k in charactors: ScnceName = k.rpartition(".")[0] cmds.menuItem( l=ScnceName , parent="Menu_02")
あとは今までと同じなので、おいておきます…
そんな感じでした。
以上です。
【覚書】maya python入門 其の九
今回からは、動画とかで学んだ事書いていきます。
昔勉強で作成したモノになります。
リンクはすみません。忘れました。
今回スクリプトの内容はこんな感じ。
画像を読み込み→キューブを作成→入力されて名前にリネーム
とこんな感じの簡単なツールです。
画像を↓
ではコードです。
import maya.cmds as cmds if cmds.window("PyWindow",exists=True): cmds.deleteUI("PyWindow") Create_Window = cmds.window( "PyWindow", t = "pythonScirpt_Panel", w=300 , h=300 , s=False , mnb=False , mxb=False) cmds.columnLayout( adj=True ) imagepath = cmds.internalVar( upd=True )+"icons/Window_image02.jpg" cmds.image( w=300 , h=100 , image = imagepath ) cmds.separator( h=10 ) cmds.text("Create And Rename Tool") cmds.separator( h=10 ) sliderW = cmds.intSliderGrp( l="Width" , min=1.0 , max=30.0 , field=True , v=1.0 ) sliderH = cmds.intSliderGrp( l="Hight" , min=1.0 , max=30.0 , field=True , v=1.0 ) sliderD = cmds.intSliderGrp( l="Depth" , min=1.0 , max=30.0 , field=True , v=1.0 ) cmds.button( l="Create Cube" , c="SetCube()") cmds.separator( h=20 ) Re_name = cmds.textFieldGrp( l="Rename" , ed=True , text="InputChangeName") cmds.button( l="Rename_Cube Name" , c="Rename_Set()") cmds.showWindow(Create_Window) def SetCube(): SetCubeWidth = cmds.intSliderGrp(sliderW, q=True ,v=True ) SetCubeHight = cmds.intSliderGrp(sliderH, q=True ,v=True ) SetCubeDepth = cmds.intSliderGrp(sliderD, q=True ,v=True ) GetCube = cmds.polyCube(w=SetCubeWidth,h=SetCubeHight,d=SetCubeDepth,n="SRT_Cube",ch=False) cmds.move(0,SetCubeHight/2.0,0,GetCube,r=True) def Rename_Set(): Set_name = cmds.textFieldGrp(Re_name, q=True , text=True ) cmds.rename(Set_name)
結構そのまま写したような気がします。
内容は簡単ですね。
では中身を見ていきます。
if cmds.window("PyWindow",exists=True): cmds.deleteUI("PyWindow")
これは今も多用している記載方法です。
「PyWindow」この名前のウィンドウがあれば、削除する。
といった内容になります。
フラグ「exists」で存在の有無を確認しています。
Trueなら、deleteUIで既存UIを削除している状態です。
続いて
Create_Window = cmds.window( "PyWindow", t = "pythonScirpt_Panel", w=300 , h=300 , s=False , mnb=False , mxb=False) cmds.columnLayout( adj=True )
特に難しい所ではないですね。
大きさ、名前を設定し、ウィンドウを作成。
縦にレイアウトを設定している感じです。
では次。
imagepath = cmds.internalVar( upd=True )+"icons/Window_image02.jpg" cmds.image( w=300 , h=100 , image = imagepath ) cmds.separator( h=10 ) cmds.text("Create And Rename Tool") cmds.separator( h=10 )
「C:\Users\ユーザー\Documents\maya\バージョン\prefs\」+「icons\Window_image02.jpg」
のパスを取得しています。
「cmds.internalVar( upd=True )」でMAYAのユーザーフォルダを取得しています。
それに+して、iconsフォルダ内にある画像のパスを取得しています。
その後「cmds.image」で画像を読み込み
セパレートで少し範囲を区切り、テキストのラベルを配置しています。
sliderW = cmds.intSliderGrp( l="Width" , min=1.0 , max=30.0 , field=True , v=1.0 ) sliderH = cmds.intSliderGrp( l="Hight" , min=1.0 , max=30.0 , field=True , v=1.0 ) sliderD = cmds.intSliderGrp( l="Depth" , min=1.0 , max=30.0 , field=True , v=1.0 ) cmds.button( l="Create Cube" , c="SetCube()") cmds.separator( h=20 )
スライダーとボタンを配置しています。
キューブの高さ、奥行き、幅を1-30の間で値をアサインできるようにし
キューブを作成するボタンを作成。
Re_name = cmds.textFieldGrp( l="Rename" , ed=True , text="InputChangeName") cmds.button( l="Rename_Cube Name" , c="Rename_Set()") cmds.showWindow(Create_Window)
リネーム用の入力ボックスと、リネームを実行するボタンを実行。
上記で設定したウィンドウを表示しています。
これでウィンドウは生成されたので、これ以下は
各ボタンの実行文になります。
def SetCube(): SetCubeWidth = cmds.intSliderGrp(sliderW, q=True ,v=True ) SetCubeHight = cmds.intSliderGrp(sliderH, q=True ,v=True ) SetCubeDepth = cmds.intSliderGrp(sliderD, q=True ,v=True ) GetCube = cmds.polyCube(w=SetCubeWidth,h=SetCubeHight,d=SetCubeDepth,n="SRT_Cube",ch=False) cmds.move(0,SetCubeHight/2.0,0,GetCube,r=True)
設定された高さ、奥行き、幅を取得し、キューブを作成。
底辺を原点になるように設定。
def Rename_Set(): Set_name = cmds.textFieldGrp(Re_name, q=True , text=True ) cmds.rename(Set_name)
入力された値をもって、キューブの名前を変更します。
これで以上ですね。
内容は簡単なんですが以外と長くなりました。
ただ、値の取り方なんかは役にたったかと思います。
以上。
【覚書】maya python入門 其の八
かなり番外編ですが、
折角なんで、タイトルは続けてみようと思います。
先日、大阪でGTMFと呼ばれるセミナーがあり、1セッションだけ受講したので
その報告と同時にコードの紹介をしたいと思います。
「Autodesk Maya;大人気!カスタム・グラフエディタと便利ツールをPythonで!!」
こんなやつです。
中身はダイキンのサイトwww.comtec.daikin.co.jp
の振り返りです。
一点だけ気になることをおっしゃったので実演したいと思います。
それはMAYAPythonでセレクターを作るというもので
SIでいうシノプティックビューにあたるものです。
MAYA非常にUI作成が簡易な為、簡単に実現できました。
こんな感じ。
画像はネットに落ちてたものです。
コードも。
# -*- coding: UTF-8 -*- #------------------------------------------------------------------------------- import maya.cmds as cmds def Sel(*args): print "selection" window = cmds.window() form = cmds.formLayout() JPG = cmds.image(image = 'c:/test.jpg') b1 = cmds.button(l="R_Hund" , bgc = [1.0,0.5,0.3] , c=Sel) b2 = cmds.button(l="L_Hund" , bgc = [0.0,0.5,1.0] ,c=Sel) cmds.formLayout( form, edit=True, attachForm=[(JPG, 'top', 0),(JPG, 'left', 0),(JPG, 'right', 0),(JPG, 'bottom', 0),(b1,'top',330),(b1,'left',130),(b2,'top',330),(b2,'left',320)] ) cmds.showWindow( window )
このコード自体は私個人が適当に書いたコードなので
ダイキンさんのそれとは少し違います。
Cドライブのtest.jpgを読み込んで
ボタンをフォトショなので調べた値に、置いてるだけです。
こんな感じでセレクターが簡単に作れました。
この詳細は後日サイトにて公開されるみたいなので
そちらをみるとより理解が深まると思います。
詳しく知りたい方は、SDKまで…
以上。
【覚書】maya python入門 其の七
今回は昔作った勉強用のスクリプトがあったので
それを紐解いていきたいと思います。
内容は、スライダーで設定された値を持って
球を作成するというモノになります。
こんな感じです。↓
では早速コード
import maya.cmds as cmds if cmds.window("Obj_EditWindow",exists=True): cmds.deleteUI(Set_Window) Set_Window = cmds.window("Obj_EditWindow",t="Edit_Radius",w=300,h=300) cmds.columnLayout(adj = True) cmds.text("Input RadiusValue") SetRadius = cmds.intSliderGrp( l = "Radius_Value", min = 0.01 , max = 100 , f = True) cmds.button( l = "Create_Sphere",c="Create_Sphere()") cmds.showWindow(Set_Window) def Create_Sphere(): GetRadius = cmds.intSliderGrp(SetRadius, q=True , v=True) C_Sphere = cmds.polySphere(r=GetRadius, n="Sphere_SetRadius")
とても簡単なツールなんで、行も少ないですね。
細かい説明は今度するとして、もう一個スクリプトがあったので
こちらも貼ってみたいと思います。
Aimコンストを行うスクリプト?(マクロ)です。
実行するとこんな感じ。↓
コード。
import maya.cmds as cmds oSel = cmds.ls(orderedSelection=True) if len( oSel ) >= 2: target = oSel[0] oSel.remove( target ) for i in oSel: cmds.aimConstraint(target,i,aimVector=[0,1,0]) else: print 'plase two selection!'
こちらも特に説明がなくてもいい気がしますね。
最後にもう一個。
これは今でも偶に観ています。
ってかHELPに全く同じやつが載ってるはずです・・・
こんなやつです。↓
コード↓
mods = cmds.getModifiers() print 'Modifiers are:' if (mods & 1) > 0: print ' Shift' if (mods & 2) > 0: print ' CapsLock' if (mods & 4) > 0: print ' Ctrl' if (mods & 8) > 0: print ' Alt'
これが本当によく使うコードなので
覚えておきたいんですが、すぐ忘れるんですよね・・・。
とまぁ今回はこの辺りで。
以上。
【覚書】maya python入門 其の六
続いて少しだけ数学をしたいと思います。
やっぱりスクリプトやるとなると、この辺り補っていかないと
後々苦労したり、無駄が増えてしまうので…
と書きつつ詳しい事は説明しません。
※できません汗
なので、コード見つつこんな事ができるんだ…。
程度で進めていければ、幸いです。
ってことでまずは、三角関数を使って
球を円状に配置したいと思います。
コード
import maya.cmds as cmds import math num = 60 radius = 6 for i in range(num): Cir = 2.0 * math.pi * i / num x = radius * math.sin(Cir) z = radius * math.cos(Cir) cmds.polySphere(r=0.5) cmds.move(x,0.0,z)
こんな感じになります。
「num」が球の総数で、
「radius」が半径ですね。
円を描いているところは
実質この部分
Cir = 2.0 * math.pi * i / num
x = radius * math.sin(Cir)
z = radius * math.cos(Cir)
一行目で、円周と総数を割って、一個辺りの角度を求め
2,3行目で縦、横の長さ(比率)を取得し、その値でXYに値を代入しています。
原理が分かれば、超簡単なんですが、高校数学を挫折していた人間からすると
相当悩みました。
今でもまだ理解仕切ってません。
ただ、そういうものだ。と思えばとりあえずはいいじゃないでしょうか?
原理が分かれば、多種多様に使えるので覚えた方がいいですが・・・・
さておき、次は上記2Dだったので、3Dにしてみようかと思います。
なので、少しだけいじって螺旋をしてみました。
import maya.cmds as cmds import math num = 60 radius = 6 for i in range(num): Cir = 2.0 * math.pi * i / num x = radius * math.sin(Cir) z = radius * math.cos(Cir) y = i cmds.polySphere(r=0.5) cmds.move(x,y,z)
ほとんど上と変わってないです。
Y(高さ)の値に1ずつ増える値を入れているだけです。
少しの違いで結構な差がでるのは、触ってて面白いですよね。
さて次は折角三角関数を使ってるので、それをエクスプレッションに仕込んでみたいと思います。
ちょうどWEBに似たような奴があったので、簡単にカスタムしてみました。
import maya.cmds num = 10 for i in range(0, num): name = maya.cmds.polySphere() maya.cmds.move(i * 2, i * 2, 0) val = i * 0.5 maya.cmds.expression(object=name[0], string=('ty = 3 * sin(time + ' + str(val) + ');'))
ほとんど変えてませんw
コピペだけはしてませんが。
思ったですが、エクスプレッションMAYAは、編集し易いですね。。。
めちゃくちゃびっくりしました。
では、軽く説明。
maya.cmds.expression(object=name[0], string=('ty = 3 * sin(time + ' + str(val) + ');'))
作成した、オブジェクトに対して、「トランスYにサインカーブ」のエクスプレッション仕込む。
という内容ですね。
特に難しい事はないかな?と思います。
そいや、謎というか、MAYAの仕様というか
エクスプレッション自体はMELで記述しなければいけません。
※微妙にPythonの書き方とは違いますよね?
なので、基本MEL文法になるように、且つ仕込む場合は文字列として記載しなければならないので
「string=()」でMEL記述を文字列にしております。
この辺り少しややこしいので、注意が必要です。
仕込まれたデータを見るとこんな感じですね。
うん。MELですねw
ちなみにエクスプレッションのエディタは、アトリビュートのトランスフォーム(挿入されているノード)
で右クリックで、出ますね。
では続けてもう一個。
2個目のスクリプトをエクスプレッションにしたものですね。
import maya.cmds as cmds import math num = 150 radius = 3 for i in range(num): Cir = 2.0 * math.pi * i / num x = radius * math.sin(Cir) z = radius * math.cos(Cir) y = i oObj = cmds.polySphere(r=0.5) cmds.expression(s=(oObj[0]+'.tx = '+ str(radius) +' * cos(time + ' + str(Cir) + ');')) cmds.expression(s=(oObj[0]+'.ty = time + ' + str(y) + ';')) cmds.expression(s=(oObj[0]+'.tz = '+ str(radius) +' * sin(time + ' + str(Cir) + ');'))
螺旋みたいな、龍みたいな。
今回はエクスプレッションののターゲットを直で指定しています。
cmds.expression(s=(oObj[0]+'.tx = '+ str(radius) +' * cos(time + ' + str(Cir) + ');'))
この方が兎に角楽です。。。。
あ、そいやさっきも使ってましたが、エクスプレッションに「time」を仕込むことで
タイムラインに沿った動きが可能となります。
詳しい事はこちらに譲ります。
最後にタンジェントも使ってみたかったので、こちらも
意図したものと少し離れてしまいましたが、まぁよしとします…
こんな感じで、色々出来たりします。
ちなみにグーグルさんで色々なカーブが見れるので参考に実行してみると
面白いかもですね笑
こんな感じでエクスプレッションも簡単にスクリプトから実行できるので
リグとかも使えそうですね。
ただ、内容がMELなのはイケテナイっす。
まぁ仕方ないですが・・
以上です。
【覚書】maya python入門 其の五
間はさみましたが、続けてキーのコピー、ペーストの方を見て行きたいと思います。
全体的にアニメーターよりの内容になっていきますが、概念は同じなのでご了承下さい。
まずはコードから。
import maya.cmds as cmds oCube = cmds.polyCube(n='Cube_KeyEdit') oTime = cmds.currentTime(q=True) oCurrent = float(oTime) print oCurrent cmds.setKeyframe( oCube[0], t=0 ,v=5, at='translateZ') cmds.setKeyframe( oCube[0], t=10 ,v=-5, at='translateZ') cmds.setKeyframe( oCube[0], t=20 ,v=5, at='translateZ') cmds.setKeyframe( oCube[0], t=30 ,v=-5, at='translateZ') cmds.setKeyframe( oCube[0], t=40 ,v=5, at='translateZ')
内容は簡単で立方体を作成して、キーを打ってるだけです。
上部の変数は後ほど使う物ですね。
これを元に、キーのコピーだったりペーストをやってみたいと思います。
内容的には再度上記の状態を作成して、それに対して
キーをコピーカレントフレームにペーストし、サイクル処理を行う。
というところまでやってみたいと思います。
コード
import maya.cmds as cmds oCube = cmds.polyCube(n='Cube_KeyEdit') oTime = cmds.currentTime(q=True) oCurrent = float(oTime) print oCurrent cmds.setKeyframe( oCube[0], t=0 ,v=5, at='translateZ') cmds.setKeyframe( oCube[0], t=10 ,v=-5, at='translateZ') cmds.setKeyframe( oCube[0], t=20 ,v=5, at='translateZ') cmds.setKeyframe( oCube[0], t=30 ,v=-5, at='translateZ') cmds.setKeyframe( oCube[0], t=40 ,v=5, at='translateZ') cmds.selectKey( oCube[0], attribute='translateZ' ) cmds.copyKey(oCube[0]) cmds.pasteKey(oCube[0],time=(oCurrent,oCurrent),attribute='translateZ') cmds.setInfinity( pri='cycle',poi="cycle")
こんな感じです。
特に難しい処理は行なっておりませんが、SIと違って
Fカーブエディタ(グラフエディタ)の扱いが超絶楽ですね。
さすがにこれだけだと寂しいので、一個簡単なスクリプトを。
SIでよく使っていた、カーブのタンジェントを頭のキーと、お尻のキーを合わせるものです。
今回は難しい事はしたくないので、単純にお尻のキータンジェントを
頭のキータンジェントにコピーしたいと思います。
ではコード
import maya.cmds as cmds cmds.select() oSel = cmds.ls(sl=True) oKeys = cmds.keyTangent(oSel,q=True,outAngle=True) oTan = oKeys[-1] oTime = cmds.keyTangent(oSel,e=True,index=(0,0),inAngle=oTan)
こんな感じです。
ゲームアニメーションとか作ってると、これを多用します。
アウトアングルを配列でGETして、その最後の要素をoTan = oKeys[-1]の「[-1]」で取得。
それを、「cmds.keyTangent(oSel,e=True,index=(0,0),inAngle=oTan)」で頭のキー(index=(0,0))で
キーを指定して、タンジェントにペーストしてます。
これをベースに処理軽減だったり、複数化を仕込むと仕事で使えそうですね。
と今回この辺りで…。
次回はエクスプレッションかランダムについて進めていきたいと思います。
以上。