PythonAPIでケーブル配策モデルを自動作成
Overview
機構解析ソフトAltair MotionView / MotionSolveはPython APIが提供されており、さまざまな自動化が可能です。
今回はケーブル配策を対象に、ケーブルモデルを自動生成するPythonサンプルスクリプトを作成しました。
これにより、あるテンションをかけてケーブルをクリップした場合の最大曲げ角度(曲率)やトータルの曲げ角度などを評価できます。
Pre-Requisite
サンプルスクリプトのダウンロードはこちらです。
Altair SimulationのDesktop, Mechanical Solversのインストールが必要です。
ファイル構成
00_python_sub
calc_angle.py :ケーブルの最大曲げ角度、トータル曲げ角度算出用ユーザーサブルーチン
cable_class.py :ケーブル作成自動化のpython class
cable_instance_type1.py :ケーブル配策モデル サンプル1 両端のクリップ
cable_instance_type2.py :ケーブル配策モデル サンプル2 接触あり
cable_instance_type3.py :ケーブル配策モデル サンプル3 クリップのスライドあり
Usage/Installation Instructions
実行方法
MotionViewを起動し、モデルブラウザの右クリックメニューのPython Scriptをクリックして、ケーブル配策モデルサンプル cable_instance_type1.py~cable_instance_type3.pyのいづれかを選択します。
cable_instance_type1.pyの場合、下記のようなモデルが自動で作成されます。
ケーブルの最大曲げ角度、トータル曲げ角度算出用ユーザーサブルーチンのパスが相対パスで定義されています。
ver. 2022.3現在では絶対パスに直す必要がありますので、calc_angle.pyを再度選択して、絶対パスに変更してください。
解析リボンの実行をクリックすると、ライブアニメーションでケーブルが変形する様子が確認できます。
結果の確認
HyperViewで.h3dファイルを開くことでアニメーション結果を確認できます。
HyperGraphで.abfファイルを開くことで最大曲げ角度などのプロットを確認できます。
最大曲げ角度などのプロットは.abfのREQSUB -> angleに格納されています。
RESULT(1):トータル曲げ角度
RESULT(2):最大曲げ角度
RESULT(3):最大曲げ角度の要素番号
ケーブルは離散のビーム要素でモデル化されていますので、曲げ角度は隣り合う要素の角度で計算しています。
ケーブル配策モデル サンプル1の解説
ケーブルの両端を固定クリップとしてケーブル配策を行うサンプルです。
cable_instance_type1.py
from cable_class import cable #instance c=cable() sbeam=c.createBeam(varname='beam',N_beam=101,d_beam=10.0,con=0) sguide1=c.createGuide(varname='guide1',N_guide=2,d_guide=10.0, center = 5, attbody='beam.pb1.body0', attcurve = 'beam.curve_beam', lock=1, fix=0) sguide2=c.createGuide(varname='guide2',N_guide=2,d_guide=10.0, center = 1000-5, attbody='beam.pb1.body100', attcurve = 'beam.curve_beam', lock=1, fix=0) mot1=c.createMotionSys(varname='mot1',attbody='guide1.b_guide',x=0,y=0,rz='90d',t=5) mot2=c.createMotionSys(varname='mot2',attbody='guide2.b_guide',x=100,y=0,rz='-90d',t=5) #sbeam ケーブルを定義します。離散の個数N_beamと1区間の長さd_beamを定義します。この場合(101-1) x 10.0 = 1000 mmのケーブルを定義しています。接触を用いない場合はcon=0としてください。 #sguide クリップを定義しています。今回ケーブル両端の2つのクリップを定義しています。クリップの長さd_guideと中心位置centerを定義します。attbodyでクリップを固定するケーブルのボディを選択します。両端なのでbody0とbody100を選択しています。クリップをケーブルに固定する場合はlock=1とします。クリップを初期位置から動かす場合はfix=0とします。 #mot クリップの移動位置を定義します。本スクリプトでは2次元を仮定していますので、x,y,rzを定義しています。また初期位置から移動位置までの移動時間をtで定義しています。
ケーブル配策モデル サンプル2の解説
あるテンションをかけたケーブルがモノに接触する場合のケーブル配策を行うサンプルです。
cable_instance_type2.py
from cable_class import cable #instance c=cable() sbeam=c.createBeam(varname='beam',N_beam=101,d_beam=10.0,con=1) sguide1=c.createGuide(varname='guide1',N_guide=2,d_guide=10.0, center = 5, attbody='beam.pb1.body0', attcurve = 'beam.curve_beam', lock=1, fix=1) sguide2=c.createGuide(varname='guide2',N_guide=2,d_guide=10.0, center = 595, attbody='', attcurve = 'beam.curve_beam', lock=0, fix=1) sobj1=c.createObj(varname='obj1',x=200,y= 55,z=0,r=50) sobj2=c.createObj(varname='obj2',x=300,y=-55,z=0,r=50) sobj2=c.createObj(varname='obj3',x=400,y= 55,z=0,r=50) con1=c.createContactSys(varname='con_beam1',NN=101,bpname='beam',objsys='obj1') con2=c.createContactSys(varname='con_beam2',NN=101,bpname='beam',objsys='obj2') con3=c.createContactSys(varname='con_beam3',NN=101,bpname='beam',objsys='obj3') tens=c.createTension(varname='tension',attbody='beam.pb1',NN=101,marker='guide2.b_guide.cm', value=50) mot1=c.createMotionSys(varname='mot1',attbody='obj1.b_obj',x=200,y= 25,rz=0,t=5) mot2=c.createMotionSys(varname='mot2',attbody='obj2.b_obj',x=300,y=-25,rz=0,t=5) mot3=c.createMotionSys(varname='mot3',attbody='obj3.b_obj',x=400,y= 25,rz=0,t=5) #sbeam ケーブルを定義します。今回は接触がありますのでcon=1としています。 #sguide クリップを定義しています。2つめのクリップはケーブルがクリップをスライドする設定ですので、attbodyがブランクで、lock=0としています。また、クリップは初期位置で固定のためfix=1としています。 #sobj ケーブルの接触対象を定義しています。本スクリプトでは円柱のみです。中心座標x,yと半径rを定義します。 #con 接触を定義しています。NNでビームの分割数を指定してください。 #ten ケーブルのテンションを定義しています。テンションを与えるケーブルの要素番号をNNで指定します。また、テンションを与える方向をmarkerで選択します。今回は2つ目のガイドの向きに従う設定です。最後に荷重をvalueで定義します。 #mot 接触対象物である円柱の移動位置を定義します。
ケーブル配策モデル サンプル3の解説
あるテンションをかけたケーブルをスライドするクリップで固定する場合のケーブル配策を行うサンプルです。
cable_instance_type3.py
from cable_class import cable #instance c=cable() sbeam=c.createBeam(varname='beam',N_beam=101,d_beam=10.0,con=0) sguide1=c.createGuide(varname='guide1',N_guide=2,d_guide=10.0, center = 5, attbody='beam.pb1.body0', attcurve = 'beam.curve_beam', lock=1, fix=0) sguide2=c.createGuide(varname='guide2',N_guide=2,d_guide=10.0, center = 200, attbody='', attcurve = 'beam.curve_beam', lock=0, fix=0) sguide3=c.createGuide(varname='guide3',N_guide=2,d_guide=10.0, center = 400, attbody='', attcurve = 'beam.curve_beam', lock=0, fix=0) sguide4=c.createGuide(varname='guide4',N_guide=2,d_guide=10.0, center = 600, attbody='', attcurve = 'beam.curve_beam', lock=0, fix=0) mot1=c.createMotionSys(varname='mot1',attbody='guide1.b_guide',x=400,y=-200, rz='180d', t=5) mot2=c.createMotionSys(varname='mot2',attbody='guide2.b_guide',x=200,y=0, rz='90d', t=5) mot3=c.createMotionSys(varname='mot3',attbody='guide3.b_guide',x=400,y=200, rz='0d', t=5) mot4=c.createMotionSys(varname='mot4',attbody='guide4.b_guide',x=600,y=0, rz='-90d',t=5) tens=c.createTension(varname='tension',attbody='beam.pb1',NN=101,marker='guide4.b_guide.cm', value=50) #sbeam ケーブルを定義します。今回は接触はありませんのでcon=0としています。 #sguide クリップを定義しています。1つ目のクリップはケーブル固定で2~4つ目のクリップはケーブルがクリップをスライドする設定です。 #mot クリップの移動位置を定義します。 #ten ケーブルのテンションを定義しています。
Post-Requisite
使用製品:Altair MotionSolve/MotionView
よくあるエンジニアからの質問はこちら