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でやった方が早い。
しかし、値を変えて連続で何個も解析するならば、これを使う価値は出てくる。
すでにあるマテリアルを編集したい場合。
上記では、新規にマテリアルを作った。
しかし、既存のマテリアルの値をいじりたいときもあると思う。
そういう時は、
- Getしてから
- いじって
- 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_ELEM | 8 |
ジオメトリ(ソリッド) | FT_SOLID | 39 |
ジオメトリ(面) | FT_SURFACE | 5 |
ノード | FT_NODE | 7 |
(自分にとっての)プログラミングの基本
先週やったかもしれないが再掲。
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
続きを読む