20190225

FEMAPのVBA(APIプログラミング)を使った その2。

さくらのブログって、文字数制限あるのか。
「内容の文字数が長すぎます」ってエラーが返ってきた。
文字数至上主義の私にとっては寝耳に水。

全編10,000文字オーバーだったのが、分割されちゃった。ぐすん。

というわけで、二つに分かれます。

プロパティの編集

今回は、あまりいじらない。
来月以降にいじる。
マテリアルを新しく作っているので、プロパティに設定しないとダメ。だからその部分だけやる。

プロパティを新しく作る

プロパティのときも、一行追加するだけで作れる。マテリアルも何も設定されていない。
ただ、やはり、この程度の事をするだけらば、GUIで作ったほうがいい。

Sub Main
Dim App As femap.model
Set App = feFemap()

App.feProp.Put(1)

End Sub

プロパティにいろいろ設定することを考えると、下の書き方のほうが賢明。

Sub Main
Dim App As femap.model
Set App = feFemap()

Dim Plop1 As femap.Prop
Set Plop1 = App.feProp
Plop1.Put(Plop1.NextEmptyID()) ' 次の(空の)IDに、putする。

End Sub

新規に作ったプロパティに、新規に作ったマテリアルをセットする。

  1. マテリアルを作成
  2. 1で作ったマテリアルを、プロパティにセットする。
Sub Main
Dim App As femap.model
Set App = feFemap()

Dim Mat1 As femap.Matl
Set Mat1 = App.feMatl
Mat1.Ex = 100000
Mat1.Nuxy = 0.3
Mat1.Put(Mat1.NextEmptyID()) ' 次の(空の)IDに、putする。

Dim Plop1 As femap.Prop
Set Plop1 = App.feProp ' App.feAppMessage(1, "Material ID" & Mat1.ID)
Plop1.matlID = Mat1.ID
Plop1.Put(Plop1.NextEmptyID()) ' 次の(空の)IDに、putする。

End
Sub

line elementのbar element(バー要素)のプロパティを作るには。

3次元梁要素。断面形状の設定とかの設定をしたい。
line elementのbar elementのL形鋼とかH型(I型)鋼だとかを作りたい。

Sub Main
Dim App As femap.model
Set App = feFemap()
Dim Mat1 As femap.Matl
Set Mat1 = App.feMatl
Mat1.Ex = 100000
Mat1.Nuxy = 0.3
Mat1.Put(Mat1.NextEmptyID()) ' 次の(空の)IDに、putする。
Dim Plop1 As femap.Prop
Set Plop1 = App.feProp
Dim Plop2 As femap.Prop
Set Plop2 = App.feProp
Dim Plop3 As femap.Prop
Set Plop3 = App.feProp
' App.feAppMessage(1, "Material ID" & Mat1.ID)
Plop1.matlID = Mat1.ID
'''''''''''''''''''''''
'''ここまでは、さっきと一緒'''
'''''''''''''''''''''''

''''''''''''
''' H型鋼 '''
''''''''''''
Plop1.type = 2 ' これで、バー要素になった。
Dim danmen() As Varinat
ReDim danmen(5)
danmen(0) = 100.
danmen(1) = 75.
danmen(2) = 75.
danmen(3) = 8.
danmen(4) = 8.
danmen(5) = 5.
Plop1.ComputeStdShape(9, danmen, 0, 0, False, False, False ) ' H形鋼(9)の、断面形状情報はdanmenに入れたやつで(H100x75)、オリエンテーションは右(=0)で、断面プロパティの評価方法は自動(=0)、その他はFalse。とりあえず。動くかのtestなので。
Plop1.Put(Plop1.NextEmptyID()) ' 次の(空の)IDに、putする。
''''''''''''
''' □型鋼 '''
''''''''''''
Plop2.matlID = Mat1.ID ' Materialは、全部一緒。
Plop2.type = 2 ' バー要素。
''''''''''失敗例''''''''''''''''''''''''''''''
' □型鋼の断面形状の情報は3つだが。間違った長さの引数を入れても、断面形状の計算が始まらない。
' せっかく早く帰ったのに、下の様なコードを書いていたらまったく動かず。
' 20~翌0.10まで格闘して、「接点制限版じゃ一回しか断面計算できないんだ…」と思い始めていた。
' ReDim danmen(2)
' danmen(0) = 50.
' danmen(1) = 50.
' danmen(2) = 3.2
''''''''''失敗例''''''''''''''''''''''''''''''
ReDim danmen(5) ' あくまでも、断面形状の引数は5(0~5までの6つ。)□型鋼の断面形状の情報は3つ。
danmen(0) = 50.
danmen(1) = 50.
danmen(5) = 3.2' GUIで、6っぽいところに値があったから、まさかと思い入力したら。まさかだった。
Plop2.ComputeStdShape(2, danmen, 0, 0, False, False, False ) ' 角形鋼(2)、断面形状情報は縦・横・厚(□50x50x3.2)
Plop2.Put(Plop2.NextEmptyID()) ' 次の(空の)IDに、putする。
''''''''''''
''' L型鋼 '''
''''''''''''
Plop3.matlID = Mat1.ID ' Materialは、全部一緒。
Plop3.type = 2 ' バー要素。
ReDim danmen(5) ' 断面形状はL型。
danmen(0) = 50. ' 高さ
danmen(1) = 50. ' 幅
danmen(4) = 4. ' 厚さ下。
danmen(5) = 4. '
Plop3.ComputeStdShape(11, danmen, 0, 0, False, False, False ) ' L形鋼(11)、断面形状情報は縦・横・厚(□50x50x3.2)
Plop3.Put(Plop3.NextEmptyID()) ' 次の(空の)IDに、putする。

End Sub

これで、bar要素のプロパティはできたと思う。
下に、その他の値を入力したら、何になるのか書いた。

しかし、それ以上に、断面形状の引数の配列の、どのインデックスに数値を入力するのかが難しい。
特にL型とボックスなどの6つ長さ情報いらないやつ。
Lは[0,1,4,5]、□は[0,1,5]に入れるべし…そんなのわかるか!!

GUIをよく見て、狙いをさだめないと、断面形状の計算が始まりません。
→メッセージに何も表示されなかったら、正常に断面が入力されていない。
→断面の配列を使いまわすのであれば、初期化などについても、気を付けられたし。前のが残っちゃってたり。

proprtyのtype一覧
プロパティのタイプ入力すべきID
ロッド1
バー2
チューブ3
リンク4
ビーム5
スプリング6
DOFスプリング7
カーブドビーム8
ギャップ9
プロットオンリー10
プレート(線形)17
プレート(2次)18
平面ひずみ(線形)19
平面ひずみ(2次)20
軸対称(線形)23
軸対称(2次)24
ソリッド(線形)25
ソリッド(2次)26
質量27
質量マトリクス28
剛体29
剛性マトリクス30
カーブドチューブ31
平面プロットオンリー32
コンタクト34
軸対称シェル(線形)35
軸対称シェル(2次)36
2次ビーム37

↑のほかにも書いてあった。
2しか使ってないが。

ComputeStdShapeの引数
ComputeStdShape( シェイプID, 断面形状, オリエンテーション(右なら0), 断面プロパティの評価方法(自動なら0), せん断中心のオフセット, ねじれ定数の計算の有無(ありならTrue), stress_recovery  )

という感じで使うらしい。
これをやった後、Putすると、ちゃんと断面形状の設定されたプロパティができあがる。

シェイプID

シェイプIDには、数値を入れる。
シェイプID以外にも、FEMAP constantで用意されている。
→FSHP_Cとか、FSHP_Lとかでも代用可能。書かないが。

  • 標準断面
形状
1長方形バー
2長方形チューブ
5円形バー
6円形チューブ
9I型
10チャネル
11アングル
  • Nastran断面
形状
16Rod
17Tube
18L
19I
20Channel
22Box
23Bar
24Cross
25H

よくわからないのは書かなかったが、上記以外にももっとあった。
使ったのは2,9,11だけだけど。

その他は、適当。

断面形状の評価方法は自動(=0)。
Boolianなら、ほぼ容赦なくFalse。

断面形状

必要な数だけ、配列に入れて入力にする。
必要な数は、シェイプIDによって変わってくる。
そのシェイプをGUIで編集するときの順番通りに配列を作る。

これがものすごく難しかった。配列の大きさは、(5)で指定(0~5までの6個)でないと、計算されない。

posted by yuchan at 07:00 | Comment(0) | FEMAP

FEMAPのVBA(APIプログラミング)を使った その1。

V11.1.1だけど、10.4でも使えるでしょ。多分。

FemapのVBA(APIプログラミング)を使う。
ほとんどGUIでできるようになっているので、あまり使う機会がない。
しかし、GUIでは機械的に条件を少し変えて繰り返すなどの操作ができないのでそれについてやってみる。

FemapのVBAの実行方法

APIプログラミングのウィンドウにコードを貼り付けて
みどりの三角ボタンを押すだけ。

ショートカットの設定のせいで困ることもある

ショートカットキーを設定していると、「APIプログラミング」のウィンドウが使いづらくなります。
私は、「P」にジオメトリのポイントを設定しているのですが、Pを押すと座標ウィンドウが立ち上がるために、「APIプログラミング」のウィンドウでPropertyと入力できなくなりました。

だから、コードは貼り付け。コードはテキストエディタなどで書いて保存しています。
ソースコードの記録を取っておくという観点からは、このやり方のほうがいいのかもしれません。

もしも、ショートカットを設定するときは、Ctrl+〜とかにした方がいいと思います。

Shiftは、アルファベット大文字入力の時困る。komaru_(Shift)KOMARU
VBAは、変数名などををキャメルケースで書くことが多い。
スネークケースではない。だから、大文字は使えるようにしておきたい。

僕なら、Altキーをショートカットに使ったりしない。

「僕なら」。
えらい人が言ったらその通りにしたいけど…。

Altは、便利キーなので、ショートカットの設定に使うのは、個人的にやめたほうがいいと思う。

Alt便利機能コマンド
ノードのマージAlt→T→K→N→Alt+S→Enter→Alt+M→Enter
測長Alt→T→E→D

「キーボードから手を放さないというだけで、こんなにストレスが減るのか!」

APIのreference等

書き方がわからないときは下記3つが役に立つ。

  • apiフォルダ
    カスタムツールのツールディレクトリから、apiというフォルダが見れる。ここにvbaのサンプルが入っている。
    while文の条件式の書き方は必見。
  • メソッド/プロパティ一覧
    「APIプログラミング」ウィンドウの、上部のアイコンの左から4番目。関数、メソッド、プロパティの名前がわかる。詳しい使い方は、下のReferenceに書いてある。
  • FEMAPのReference
    上記の「メソッド/プロパティ一覧」内の「?」ボタンから飛べる。
    関数の入力、出力の説明が書いてある。API以外のreferenceと共通。

こんな関数あり!?

いろいろ書物が充実しておりますが、それでも関数の使い方がわからず、迷走しました。
具体的には、入力も出力も、関数の引数の中に入れてしまう関数があった。
引数は、かならずしも全て入力というわけではないのか。

これはVBA流なのか?pythonしかやったことないから分からん。

整数型の注意点

VBAの整数型にはInteger型とLONG型がありました。

FEMAPでモデリングしていると、エレメント数や節点数が10万(100,000)を超える事は結構あると思う。
そういう意味でも、6万とちょっと(0含めて65536)のバリエーションしか作れないINTEGER型を使うべきではない。
そもそも、FEMAPのAPIで使う場合には、LONG型が要求されるので、INTEGERは使う機会がない。

入れられる値
INTEGER(整数)型-32,768〜32,767の整数。
LONG(長整数)型-2,147,483,648〜2,147,483,647の整数。

もしVBAじゃなくPythonだったなら、INTの桁数に制限が無かったのに。

マテリアルの編集

マテリアルの情報の取得(→messageに表示)

表示するだけなので、GUIでやった方が早い。

Sub Main
' 使用する前に
' マテリアルをアクティブにしてください。
' アクティブになっていない事があります。

Dim App As femap.model
Set App = feFemap()

Dim a As femap.matl ' 『aって言ったら、femap.matlの事ですよ』の宣言。
Set a = App.feMatl ' 『App(既に用意していたfemapのmodel)の中のfeMatl(femap.matlが、値のデータ型)として、a(femap.matl)を入れますよ。』
' 上記Setが無い場合→API エラー (行番号 11): (10094) OLEオートメーション:オブジェクト変数が初期化されていません。

' aは、何も入っていない空っぽの状態。
a.Get(App.feMatl.Active) ' すでに作ってある、アクティブなマテリアルを、aに取得する。→すでに作ってあるアクティブなマテリアルの情報を取り出せる。
App.feAppMessage(1, a.Ex & " young module") ' ヤング率をmessageに表示してみた。

' 書き換えもできるが、aを上書きしただけではだめ。
' aをputしないと反映されない。

End
Sub

マテリアルを新しく作る

マテリアルを新しく作るだけなら、初期設定に一行追加するだけ。
ただ、この程度の事をするだけらば、GUIで作ったほうがいい。

Sub Main
Dim App As femap.model
Set App = feFemap()

App.feMatl.Put() ' マテリアルを新しく作ったり、上書きしたりするときに使う。

End Sub

これで、マテリアルが新しく作られた。
等方性マテリアルとなっているかと思う。

マテリアルの値を設定

マテリアルの値を詳しく設定するには、どうするのかというと、

×上記のputしてから、それを作りこむ

〇App(femap.model.feMatl)にsetしたfemap.Matlに値を入れて、それをputする。

Sub Main
Dim App As femap.model
Set App = feFemap()

Dim Mat1 As femap.Matl
Set Mat1 = App.feMatl
Mat1.Ex = 100
Mat1.Nuxy = 0.3

Mat1.Put(Mat1.NextEmptyID()) ' 次の(空の)IDに、putする。

End Sub

これも、一個のマテリアルを設定するだけならば、GUIでやった方が早い。
しかし、値を変えて連続で何個も解析するならば、これを使う価値は出てくる。

すでにあるマテリアルを編集したい場合。

上記では、新規にマテリアルを作った。
しかし、既存のマテリアルの値をいじりたいときもあると思う。

そういう時は、

  1. Getしてから
  2. いじって
  3. Putする。

さっきのデータがあるとして、

Sub Main
Dim App As femap.model
Set App = feFemap()

Dim Mat2 As femap.Matl
Set Mat2 = App.feMatl
Mat2.Get(1) ' 1. Getして、
Mat2.Ex = 2.06e+11 ' 2. いじって、
Mat2.Nuxy = 0.3 ' 2. いじって、
Mat2.Put(1) ' 最初のIDに、putする。 ' 3. Putする。

End Sub

メモリ節約のために オブジェクトの消滅

Referenceの「5. FEMAP Entityオブジェクト」に載っていたが、メモリ量の削減のためには以下のやり方がいいらしい。

  • Set し直す→前にSetされていたオブジェクトが消える。
  • Set ○○ = Nothing → ○○が無くなる。

FemapのAPIの基本

ダイアログを出す機能 femap.Set

ユーザーにダイアログで選ばせて、そのエレメントを変数に入れる。

その変数を、関数に入れて処理する。

Sub Main
Dim App As femap.model
Set App = feFemap()

Dim surfSet As femap.Set
Set surfSet = App.feSet

' femap.setを使う。モデルのfeSetにセットして使う。
' モデルのfesetは、選択するダイアログを出す「Select」が使える。
Dim solidSet As femap.Set
Set solidSet = App.feSet()

' ソリッドエレメントを選択するダイアログを出す。選択した結果は、solidSetに保管される。
rc = solidSet.Select( FT_ELEM, False, "Select element. エレメントを選択。")

End Sub

ソリッドだけでなく、線や面を選ぶダイアログも、これを使う。
何を選択できるようになるかは、一番目の引数で決まる。
一番目の引数は、zdatatype。「メソッド/プロパティ一覧」で紹介されているだけでも50以上種類があった。

選択させたいものzdatatype引数は番号でも可。zdatatypeでなくても可。
エレメントFT_ELEM8
ジオメトリ(ソリッド)FT_SOLID39
ジオメトリ(面)FT_SURFACE5
ノードFT_NODE7

(自分にとっての)プログラミングの基本

先週やったかもしれないが再掲。

vbaのfor構文(と、0埋め(ゼロパッディング))

vbaのfor構文は下記でできる。
ここでは、messageを変えるだけ。

for構文(0から1まで、0.1刻み。)
Sub Main
Dim App As femap.model
Set App = feFemap()

For i_1 = 0 To 1 Step 0.1
App.feAppMessage(1, i_1) ' 変数i_1の中身をmessageに表示する。
Next i_1

End Sub
ゼロ埋め

あと、ゼロ埋めもやっといた。
条件を変えて解析を流したけど、ファイルの名前のせいでソートしにくいって時に使える。

Format(1, “000000”) ‘ “000001”と返ってくる。はず。

これは、画像ファイルなどを書き出した後、ファイル名のソートがしやすくなるなどの利点があるので、for構文とセットでやっておきたい。
(まぁ、ファイルの作成日時などでソートしてもいい気がするけど。)

Sub Main
Dim App As femap.model
Set App = feFemap()
For i_1 = 0 To 10
i_2 = Format(i_1, "000")' ゼロ埋めしたi_1。000と指定する事で、3桁表示になる。
App.feAppMessage(1, i_2)
Next i_1

End Sub
続きを読む
posted by yuchan at 07:00 | Comment(332) | FEMAP

20190128

FemapのVBA(APIプログラミング)で文字列の表示

月末なのに、一回も書いていなかった。
長続きが目的なので、一応書いておく。
本当は、もう少し内容が充実するはずだったのだけれども。

FEMAPのVBA

FEMAPのVBAは、「APIプログラミング」というところから利用できました。
これを使って、文字列を表示したいと思います。

メッセージボックス

まずは、メッセージボックスから。

MsgBox “Analysis complete!”

これは、VBAの機能なので、FEMAPの機能ではない。

メッセージの欄に、文字を出す。

Sub Main
Dim App As femap.model
Set App = feFemap()

App.feAppMessage(1, "aaa")
End Sub

でもできるし、

Sub Main
feFemap.feAppMessage(0, "aaa")
End Sub

でもできた。

閉じる

ウィンドウを閉じる機能も試した。

Sub Main
Dim App As femap.model
Set App = feFemap()

App.feFileClose(False)
End Sub

画像を保存する。

Sub Main
Dim App As femap.model
Set App = feFemap()

App.feFilePictureSave2(True, 0, 12, "012.png")
End Sub

引数は、

  • 1番目 boolian

    • True ファイルダイアログが出現。
    • False 何もしない。
  • 2番目 FPRG_DESKTOP
    1~3の数字化FPRG_DESKTOPを入力。

  1. 1. 0: FPRG_WINDOW
  2. 1: FPRG_LAYOUT
  3. 2: FPRG_DESKTOP
  • 3番目 zPictFormat
    1~12の数字かzPictFormatを入力。

  1. FPM_BMP
  2. FPM_METAFILE
  3. FPM_PLACEMF
  4. FPM_JPEG
  5. FPM_BMPSERIES
  6. FPM_AVI
  7. FPM_JT
  8. 不明
  9. FPM_GIF
  10. FPM_GIFANIM
  11. FPM_TIF
  12. FPM_PNG

そうそう。12がやりたかったんだよ。

  • 4番目 タイトル 文字列
    ダブルコーテーションで囲もう。

posted by yuchan at 07:00 | Comment(0) | FEMAP

20180820

軸対称要素の荷重のかけ方

軸対称要素の荷重のかけ方

タイトルの先頭に、「(FEMAPの)」と書いていたが消した。

画像に書いた。もはや、文字を書く気すらおきん。
たったこれだけのために、僕のお盆休みが消えた。
本当は、「ちょちょっ」とやって「ぱっ」とTwitterなんかに投稿して、
僕の満たされない承認欲求を満たそうと画策していた。
そんなこと、もったいなくってできない。

この画像は、40880文字分のPythonコードで作られている。
行数にすると、1155行。
(不必要な空白行、スペースも多いので、実質800〜900行か?)

なんで途中でやめられなかったのか、悔やまれる。ぼくのオヴォン休み。と、最終日22:18に思うのであった。


20180819215836.png

posted by yuchan at 07:00 | Comment(0) | FEMAP

20180719

Femapで円筒座標系を使って荷重をかける時の注意点。

有料ソフトなので、画像は載せなかった。
絵がないと、分かりにくい内容だけど。

なぜFemapを使っているのか。

計算力学技術者試験の受験資格を手に入れたい。
計算力学技術者の初級(2級の受験資格になる)は、講習で手に入る(結構高い)。

その講習で、Femapを使った。
Femapは300ノード制限バージョンを使用した。

Femapをいじっていて、使ったことのない円筒座標系を使ってみようと思った。
円筒座標系の荷重でつまづいたので、書き残す。

先に結論を書いておくと、
円筒座標系の中心は、原点。任意の場所を円筒の中心にできない。

円筒座標系で荷重をかけたかった。

こうすりゃいいんじゃない?と思って、

  • 座標系を「全体直交座標系」→「全体円筒座標系」に変更。
  • 方向を「ベクトル」にしdR, dT, dZ(中心からの距離Radius、角度Theta, 高さ座標Z)を(1., 0., 0.)に変更。
  • 荷重を入力。

これだけでできると思っていた。
(通常は、これだけでできる。)

[あらぬ方向に荷重方向の矢印が伸びている絵をここに乗せたかった。]

うまくいっていません。
明らかに、円筒の中心から伸びてきた矢印ではない。
この矢印の根元は、どこをさしているのかというと、(0, 0, 0)

問題なのは、モデルの原点。

最初に書かなかったけど、すでにモデルはできていた。
そのとき、円筒座標系のことを何も考えずに作ってしまっていた。
円筒の中心は、原点から離れた場所に作っていた。

これが原因だった。

円筒座標系とベクトルを使って荷重をかけると、原点から線が伸びる。
だから、荷重方向がおかしなことになった。

これは、絵がないとわからないでしょう。
なのに絵は載せられない(怖くて)。

解決策

  1. 円筒の中心点を、原点に移動する。
  2. 座標系を「全体直交座標系」→「全体円筒座標系」に変更。
  3. 方向を「ベクトル」にしdR, dT, dZ(中心からの距離Radius、角度Theta, 高さ座標Z)を(1., 0., 0.)に変更。
  4. 荷重を入力。

2以降は、上と同じ。

局所円筒座標系はないのか

円筒座標系の中心は、原点。任意の場所を円筒の中心にできない。
「全体円筒座標系」の中心は、絶対原点。
なら、「局所円筒座標系」とか作って、任意の場所を中心に荷重をかけられるようにしてくれたらいいのに。
あっても多分使わないけど。

  • 2個以上の筒状のタンクか何かが、連結されていて
  • 筒の内部で、圧力ではない荷重が放射状にかかっている
    こういうのを模擬するときに使えるかもしれないと思った。

まぁ、そんなん無くても、三角関数(円周上の座標(cosΘ, sinΘ))を使って値を出して、ノード一点一点にその値を当てはめればできますが。

posted by yuchan at 07:00 | Comment(1) | FEMAP