モデル内の接続要素情報を取得して、特定の接続要素を削除する

未分類

例題説明

モデル内のすべての要素情報を取得し、削除対象とする接続要素のタイプを指定してListを作成し、その接続要素を削除します。
今回の例題では、MPCを削除対象としています。

サンプルコード


# 3つのキューブパートを作成します。
Geometry.Part.Cube()
Geometry.Part.Cube(dlOrigin=[0.015, 0.0, 0.0], strName="Cube_2", iPartColor=6409934)
Geometry.Part.Cube(dlOrigin=[0.03, 0.0, 0.0], strName="Cube_3", iPartColor=13259210)

# 作成したパートに合わせて、メインウィンドウの拡大サイズを調整します。
JPT.ViewFitToModel()

# Edge間に2つのMPC接続要素を作成します。
Connections.MPC.General.TwoEdges(crMasterEdge=Edge(72), crSlaveEdge=Edge(44), listMpcConnection=[MPC_CONNECTION(iDof=1), MPC_CONNECTION(iDof=2), MPC_CONNECTION(iDof=4), MPC_CONNECTION(), MPC_CONNECTION(), MPC_CONNECTION()], bUpdateDispCS=1)
Connections.MPC.General.TwoEdges(strName="MPC_2", crMasterEdge=Edge(46), crSlaveEdge=Edge(18), listMpcConnection=[MPC_CONNECTION(iDof=1), MPC_CONNECTION(iDof=2), MPC_CONNECTION(iDof=4), MPC_CONNECTION(), MPC_CONNECTION(), MPC_CONNECTION()], bUpdateDispCS=1)

# Edge間に2つのRBE2接続要素を作成します。
Connections.RigidElements.RBE2.OneToOne(crlMasterTargets=[Edge(64)], crlSlaveTargets=[Edge(36)])
Connections.RigidElements.RBE2.OneToOne(crlMasterTargets=[Edge(38)], crlSlaveTargets=[Edge(10)], strName="RBE2_2")

# 節点とFace間にRBE3接続要素を作成します。
Connections.RigidElements.RBE3.OneToMany(crlMasterTargets=[Face(78)], crlSlaveTargets=[Node(1429)], listRbe3TermConnection=[(0, 63, 1), (1, 7, 1)], strName="RBE3_1", dTolerance=0.003)
Connections.RigidElements.RBE3.OneToMany(crlMasterTargets=[Node(949)], crlSlaveTargets=[Face(52)], listRbe3TermConnection=[(0, 63, 1), (1, 7, 1)], strName="RBE3_2", dTolerance=0.003)

# モデル内のすべての接続要素の情報を取得します。
dconns = JPT.GetAllConnections()

# 取得した接続要素の情報をのうち、MPCのみをPSJコマンドで使用できる形式のリストに変換します。
ditem_mpcs = []
for conn in dconns:
    if conn.type == JPT.DItemType.CONNECT_MPC:
        ditem_mpcs.append(JPT.CastToDItem(conn))

list_mpcs = JPT.DItemListToMacroListTCursor(ditem_mpcs)

# 作成したリストを使用して、モデル内すべての接続要素を削除します。
JPT.Exec('DeleteItem(0, {}, [], [], 1)'.format(list_mpcs))

サンプルコードの説明

キューブパート作成

まず、3つのキューブパートを作成します。
1つ目のキューブパートは、設定値をすべてデフォルトで作成します。


Geometry.Part.Cube()

2つ目のキューブパートは、座標値にdlOrigin=[0.015, 0.0, 0.0]、パート名にstrName="Cube_2"、パートの色としてiPartColor=640993を指定して作成します。


Geometry.Part.Cube(dlOrigin=[0.015, 0.0, 0.0], strName="Cube_2", iPartColor=6409934)

3つ目のキューブパートは、座標値にdlOrigin=[0.03, 0.0, 0.0]、パート名にstrName="Cube_3"、パートの色としてiPartColor=13259210を指定して作成します。


Geometry.Part.Cube(dlOrigin=[0.03, 0.0, 0.0], strName="Cube_3", iPartColor=13259210)

作成後、表示画面サイズに合わせて、表示中のモデルの拡大表示率を、JPT.ViewFitToModel()によって調整します。


JPT.ViewFitToModel()
接続要素作成

モデル内にMPC、RBE2、RBE3接続要素をそれぞれ2つずつ作成します。
MPCはCube_1とCube_2のEdge(ID:18, 46)間、Cube_2とCube_3のEdge(ID:36,64)間を指定して作成します。設定値はデフォルト値です。

Connections.MPC.General.TwoEdges(crMasterEdge=Edge(72), crSlaveEdge=Edge(44), listMpcConnection=[MPC_CONNECTION(iDof=1), MPC_CONNECTION(iDof=2), MPC_CONNECTION(iDof=4), MPC_CONNECTION(), MPC_CONNECTION(), MPC_CONNECTION()], bUpdateDispCS=1)
Connections.MPC.General.TwoEdges(strName="MPC_2", crMasterEdge=Edge(46), crSlaveEdge=Edge(18), listMpcConnection=[MPC_CONNECTION(iDof=1), MPC_CONNECTION(iDof=2), MPC_CONNECTION(iDof=4), MPC_CONNECTION(), MPC_CONNECTION(), MPC_CONNECTION()], bUpdateDispCS=1)

次に、RBE2をモデルに作成します。
MPCと同様に、Cube_1とCube_2のEdge(ID:10, 38)間、Cube_2とCube_3のEdge(ID:44,72)間を指定して作成します。設定値はデフォルト値です。


Connections.RigidElements.RBE2.OneToOne(crlMasterTargets=[Edge(64)], crlSlaveTargets=[Edge(36)])
Connections.RigidElements.RBE2.OneToOne(crlMasterTargets=[Edge(38)], crlSlaveTargets=[Edge(10)], strName="RBE2_2")

最後に、RBE3をモデルに作成します。
RBE3は、Cube_2の節点とFace間(節点ID:949, Face ID:52)間、Cube_3の節点とFace間(節点ID:949, Face ID:78)間を指定して作成します。設定値はデフォルト値です。


Connections.RigidElements.RBE3.OneToMany(crlMasterTargets=[Face(78)], crlSlaveTargets=[Node(1429)], listRbe3TermConnection=[(0, 63, 1), (1, 7, 1)], strName="RBE3_1", dTolerance=0.003)
Connections.RigidElements.RBE3.OneToMany(crlMasterTargets=[Node(949)], crlSlaveTargets=[Face(52)], listRbe3TermConnection=[(0, 63, 1), (1, 7, 1)], strName="RBE3_2", dTolerance=0.003)
すべての接続要素情報をDConnect形式で取得

モデル内のすべての接続要素情報を取得し、その情報を変数dconnsに代入します。


dconns = JPT.GetAllConnections()

JPT.GetAllConnections()は、モデル内すべての接続情報を取得するPSJ Utilityです。
取得した情報は、Jupiter内で使用されるConnectVectorというリスト型のクラスオブジェクトで、この中にはDConnectというクラスオブジェクトが入っています。

ConnectVector、DConnectオブジェクトについての詳細はそれぞれリンク先をご参考ください。
 ・ConnectVector
 ・DConnect

dconnsの内容については、次のコードを用いることで、Jupiter上のPython APIウィンドウに出力して確認することが出来ます。


# dconnsの内容を確認します。
print("dfconnsの内容 :" + str(dconns))
print("dconnsのオブジェクトタイプ :" + str(type(dconns)))
print("dconnsの持つオブジェクトの形式 :" + str(dconns[0]))
print("dconnsの持つオブジェクトのタイプ :" + str(type(dconns[0])))

ConnectVectorDConnectもJupiter上でのアドレスであり、この形式のままではPSJコマンドで使用することができません。そこで、dconnsの持つデータの形式をPSJコマンドで使用するための形式に変換する必要があります。

取得した接続要素情報からMPCだけを抽出し、マクロ用のリストに変換する

dconns内の接続要素情報から、MPCのみを抽出しマクロ用のリスト形式に変換していきます。


ditem_mpcs = []
for conn in dconns:
    if conn.type == JPT.DItemType.CONNECT_MPC:
        ditem_mpcs.append(JPT.CastToDItem(conn))

このコードでは、まずditem_mpcsという空のリストを作成します。
次に、for文とif文を組み合わせてdconnsの持つDConnectオブジェクトから、MPCのみを対象としてDItemオブジェクトの形式へと変換します。その後、作成していたリストditem_mpcsへ変換したMPCのDItemを追加していきます。

このコードで使用しているJPT.CastToDItem()は、DConnectなどのオブジェクトクラスを、DItemオブジェクト形式に変換するPSJ Utilityです。
また、本例のように、if文でDItem Typeを指定することにより、特定の種類のみの接続要素や境界条件を対象にとることが可能になります。

DItemオブジェクト、DItem Typeについての詳細はリンク先をご参考ください。
 ・DItem
 ・DItem Type

ditem_connectionsの内容については、次のコードを用いることで、Jupiter上のPython APIウィンドウに出力して確認することが出来ます。


# ditem_mpcsの内容を確認します。
print("本モデルに設定された接続要素数 = [" + str(len(ditem_mpcs)) + "]")
print("ditem_mpcsの内容 :" + str(ditem_mpcs))
print("ditem_mpcsの持つオブジェクトタイプ :" + str(type(ditem_mpcs[0])))

len(ditem_mpcs)は、ditem_mpcsの長さ、つまり格納されている”DItemオブジェクトの総数=モデル内のすべてのFace数”を取得しています。
また、ditem_mpcの持つDItemは、DConnectと同様にJupiter上のアドレスであり、まだPSJコマンドで使用できる形式ではありません。ここでもう一度、形式を変換する必要があります。


list_mpcs = JPT.DItemListToMacroListTCursor(ditem_mpcs)

JPT.DItemListToMacroListTCursor()は、DItemVectorオブジェクトまたは DItemオブジェクトのリストをカーソルのリスト (マクロ文字列型) に変換するPSJ Utilityです。これにより、ditem_mpcsの持つDItemはPSJコマンドで使用できる形式であるマクロ文字列型のリストへと変換されます。変換後のリストは、変数list_mpcsに代入されます。
lise_mpcsの内容については、次のコードを用いることで、Jupiter上のPython APIウィンドウに出力して確認することが出来ます。


# list_mpcsの内容を確認します。
print("list_mpcsの内容 :" + str(list_mpcs))
print("list_mpcsの持つオブジェクトタイプ :" + str(type(list_mpcs)))

マクロ文字列型は、エンティティの種類を指すID:エンティティのモデル上で割り当てられているIDの形をとっている文字列型です。この文字列型はマクロでも利用されます。

作成したリストから、モデル内のMPCのみをすべて削除

最後に、作成したリストlist_mpcsを使用して、モデル内のMPCのみをすべて削除します。
削除にあたり、Jupiterで、境界条件や接続要素などのアイテムを削除した際に出力されるマクロDeleteItem(0, [], [], [], 1)を、マクロをPSJコマンドとして使用する関数JPT.Exec()をと組み合わせて使用します。
JPT.Exec()を使用すると、マクロは使えるようになりますが、マクロは文字列として扱われる為、このままでは変数を使用することはできません。
そこで、Pythonメソッド.format()を用います。これにより、変数list_mpcsをマクロで使用することが可能となります。


JPT.Exec('DeleteItem(0, {}, [], [], 1)'.format(list_connections))

利用しているAPI

Geometry.Part.Cube()

JPT.ViewFitToModel()

Connections.RigidElements.RBE2.OneToOne() # 記事なし

Connections.RigidElements.RBE3.OneToOne() # 記事なし

Connections.MPC.General.TwoEdges()

JPT.GetAllConnections()

JPT.CastToDItem()

JPT.DItemListToMacroListTCursor()

JPT.Exec()

関連記事