EXCEL VBAを用いてFemapのノードに拘束を付与する方法

はじめに

このガイドでは、Excel VBAを使用してFemapのノードに境界条件を付与する方法について詳しく説明します。手動での設定は時間がかかり、エラーが発生しやすいですが、VBAを活用することで効率的かつ正確に作業を進めることができます。本ガイドを通じて、ExcelとFemapを連携させる手法を学び、設計業務の自動化を実現しましょう。

ノードに境界条件を付与するVBAコード

まず、ノードに拘束をつける前に、BCセットを作成する必要があります。VBAを使ってBCセットを作成する方法はこちらをご覧ください。

基本的なVBAコードの例

以下のコードは、Excel VBAを使用してFemapのノードに境界条件を付ける方法の例です。

VB
Sub makeBCNode()
  'Femap model オブジェクトの生成
  Dim f As Object
  Set f = GetObject(, "Femap.model")
  
  'BCセットオブジェクトの作成
  Dim bcSet As Object
  Set bcSet = f.feBCSet
  
  'BCNodeオブジェクトの生成
  Dim bcNode As Object
  Set bcNode = f.feBCNode
  
  'その他必要な変数
  Dim bcSetId As Long '境界条件を付与するBCセットのID
  Dim nodeId As Long  '境界条件を付与するノードのID
  Dim condArray(5) As Boolean 'ノードに付与する境界条件
  Dim rc As Long 'リターンコードの格納用
  
  '変数に値を入力
  bcSetId = 1 'この例では境界条件を付与するBCセットIDを1とする
  nodeId = 1 'この例では、境界条件を付与するノードIDを1とする
  condArray(0) = True 'この例では、境界条件としてX方向並進を拘束する。(拘束しない場合はFalseを代入する)
  condArray(1) = True 'この例では、境界条件としてY方向並進を拘束する。(拘束しない場合はFalseを代入する)
  condArray(2) = True 'この例では、境界条件としてZ方向並進を拘束する。(拘束しない場合はFalseを代入する)
  condArray(3) = True 'この例では、境界条件としてX軸方向の回転を拘束する。(拘束しない場合はFalseを代入する)
  condArray(4) = True 'この例では、境界条件としてY軸方向の回転を拘束する。(拘束しない場合はFalseを代入する)
  condArray(5) = True 'この例では、境界条件としてZ軸方向の回転を拘束する。(拘束しない場合はFalseを代入する)
  
  '境界条件を付与するBCセットをアクティブにする
  bcSet.Active = bcSetId
  
  'ノードに境界条件を設定する
  rc = bcNode.Add(-1 * nodeId, condArray(0), condArray(1), condArray(2), condArray(3), condArray(4), condArray(5))
  
  'オブジェクト開放
  Set bcNode = Nothing
  Set bcSet = Nothing
  Set f = Nothing
End Sub 
  

詳細な説明

  • 3~4行目。fはFemapモデルオブジェクトを参照します。GetObject関数を使用して、現在実行中のFemapアプリケーションに接続します。
  • 7~8行目。bcSetは境界条件セットオブジェクトを参照します。f.feBCSetを使用して新しいBCセットを作成します。
  • 11~12行目。bcNodeは境界条件ノードオブジェクトを参照します。f.feBCNodeを使用して新しいBCノードを作成します。
  • 15行目。bcSetIdは境界条件セットのIDを格納します。
  • 16行目。nodeIdは境界条件を付与するノードのIDを格納します。
  • 17行目。condArrayは各方向の境界条件を格納する配列です。
  • 18行目。rcはリターンコードを格納します。
  • 21~28行目。各変数に値を代入しています。この部分で代入しているものを変更することで、任意のBCセットの任意のノードに、好きな高速条件を与えることができます。
  • 31行目。境界条件を付与するBCセットをアクティブにします。
  • 34行目。bcNode.Addメソッドを使用して、指定したノードに境界条件を設定します。-1 * nodeIdはノード番号の符号を反転させています。こうすることで、このメソッドでノード1つ1つに対し高速条件を適用させることができます。
  • 37~39行目。使用したオブジェクトを開放し、メモリをクリアします。

Excelと連携させる例

ノードの高速状態はよう数字で表されます。
各数字の有無が、特定の自由度を示しています。

1X方向の並進(移動)
2Y方向の並進(移動)
3Z方向の並進(移動)
4X軸方向の回転
5Y軸方向の回転
6Z軸方向の回転

ノードの自由度、Degrees of Freedom (DOF)

たとえば、「123」と設定されている場合、そのノードはX,Y,Z方向の移動が拘束されていることを意味します。「456」ならばX,Y,Z軸周りの回転が拘束されていることを意味します。

そこで、次のようなエクセルのシートを準備します。

このエクセルに対応するコードを記載します。

VB
Sub makeBCNode()
 'Femap model オブジェクトの生成
  Dim f As Object
  Set f = GetObject(, "Femap.model")
  
  'BCセットオブジェクトの作成
  Dim bcSet As Object
  Set bcSet = f.feBCSet
  
  'BCNodeオブジェクトの生成
  Dim bcNode As Object
  Set bcNode = f.feBCNode
  
  'その他必要な変数
  Dim bcSetId As Long '境界条件を付与するBCセットのID
  Dim nodeId As Long  '境界条件を付与するノードのID
  Dim condString As String '境界条件の文字列
  Dim condArray(5) As Boolean 'ノードに付与する境界条件
  Dim rc As Long 'リターンコードの格納用
  
  '変数に値を入力
  bcSetId = Cells(2, 1)
  nodeId = Cells(2, 2)
  condString = Str(Cells(2, 3))
  If InStr(condString, "1") > 1 Then
    condArray(0) = True
  Else
    condArray(0) = False
  End If
  If InStr(condString, "2") > 1 Then
    condArray(1) = True
  Else
    condArray(1) = False
  End If
  If InStr(condString, "3") > 1 Then
    condArray(2) = True
  Else
    condArray(2) = False
  End If
  If InStr(condString, "4") > 1 Then
    condArray(3) = True
  Else
    condArray(3) = False
  End If
  If InStr(condString, "5") > 1 Then
    condArray(4) = True
  Else
    condArray(4) = False
  End If
  If InStr(condString, "6") > 1 Then
    condArray(5) = True
  Else
    condArray(5) = False
  End If
  
  '境界条件を付与するBCセットをアクティブにする
  bcSet.Active = bcSetId
  
  'ノードに境界条件を設定する
  rc = bcNode.Add(-1 * nodeId, condArray(0), condArray(1), condArray(2), condArray(3), condArray(4), condArray(5))
  
  'オブジェクト開放
  Set bcNode = Nothing
  Set bcSet = Nothing
  Set f = Nothing
End Sub 

内容は基本的なVBAコードで説明したものとほぼ同じですが、1点大きく異なります。
Excelで拘束状態に1~6の数字を入力させています。これを文字列として取り出し、各数字の有無でそれぞれの拘束状態を判別し、設定するように工夫しています。

おわりに

このガイドを通じて、Excel VBAを使用してFemapのノードに境界条件を付与する方法を学んでいただけたと思います。手動での設定に比べて、VBAを活用することで作業の効率化と正確性が向上します。これからも、VBAを活用して設計業務の自動化を進め、より高度な解析や設計に取り組んでいただければ幸いです。

これでノードの境界条件を設定するのは簡単だね。ノードは自由度を奪われて泣いてるかもしれないね。

コメント

タイトルとURLをコピーしました