解析テンプレートは、スタディや条件、回路などの解析設定を、他のモデルに引き継ぐことができる機能です。
解析テンプレートを適用する際には、材料や条件の設定対象としての部品やエンティティのペアを指定する必要があり、面やエッジなどのエンティティについては事前にセットを作成しておく必要があります。
解析テンプレートと適用するモデルで部品やセットの名前が一致するものは自動的にペアが作成されます。
このスクリプトでは解析テンプレートの部品とセットの情報の取得、自動で関連付けされないペアを取得します。
その後、大文字小文字とスペース有無の差異以外では名前が一致する場合にペアを作成し、作成したペア情報を付与して解析テンプレートを適用します。
前提条件
- 解析テンプレートを適用するモデルが作成済みであること
このスクリプト例では、プロジェクトツリー上でアクティブなモデルに対して実行している - 解析テンプレートとモデルの関連付けは部品とセットを扱う
スクリプトにおける設定内容
- 解析テンプレートの持つ部品の情報を取得し表示する
- モデルにおいて、解析テンプレートと自動で関連付けされない部品を表示する
- 解析テンプレートにおいて、モデルと自動で関連付けされない部品を表示する
- 自動で関連付けされなかった部品について、大文字小文字とスペース有無の差異だけなら関連付けを作成する
- 解析テンプレートの持つセットの情報を取得し表示する
- モデルにおいて、解析テンプレートと自動で関連付けされないセットを表示する
- 解析テンプレートにおいて、モデルと自動で関連付けされないセットを表示する
- 自動で関連付けされなかったセットについて、大文字小文字とスペース有無の差異だけなら関連付けを作成する
- 作成した関連付け情報を付与して、解析テンプレートを適用する
# Copyright (c) 2026 JSOL CORPORATION
#
# 本スクリプトはMITライセンスのもとで公開しています。
# ライセンス全文は以下を参照してください。
# https://www.jmag-international.com/jp/scriptlibrary/jmag_script_library_mit/
import copy
JTMPL_FILEPATH = u"D:/Temp/JAC173IPM-Basic-03d.jtmpl" # 解析テンプレートファイルのフルパス
def separateInfoTo3LinesFormat(serialInfoList):
"""1列のtupleを3カラムごとのtupleに変換"""
resultList = []
tempInfo = ["name", "index", "type"]
count = 1
for val in serialInfoList:
if count % 3 == 1:
tempInfo[0] = val
elif count % 3 == 2:
tempInfo[1] = val
else:
tempInfo[2] = val
reservedInfo = copy.copy(tempInfo)
resultList.append(reservedInfo)
count += 1
return resultList
def makePairIgnoreCaseDifferenceAndSpaces(unLinkedTemplateSide, unLinkedModelSide):
"""名前を大文字小文字の違い、スペースの有無を無視して一致した場合は関連付けする"""
pairArray = []
for tmplInfo in unLinkedTemplateSide:
for modelInfo in unLinkedModelSide:
# 0: 名前
# 1: インデックス
# 2: タイプ
if tmplInfo[0].replace(" ", "").lower() == modelInfo[0].replace(" ", "").lower() and tmplInfo[2] == modelInfo[2]:
for i in range(3):
pairArray.append(tmplInfo[i])
for i in range(3):
pairArray.append(modelInfo[i])
break
return pairArray
def checkParts(templateCtrl):
"""部品について、テンプレートにある全部品、モデルと関連付けできていない部品を取得"""
print("Parts:")
jtmplPartList = templateCtrl.GetPartsFromTemplate()
# 3カラムで1部品の情報を示すため、3カラムごとのtupleに変換して扱う
partsList = separateInfoTo3LinesFormat(jtmplPartList)
# 3列目の値:0は部品、1は部品グループであることを示している
partType = {"0": "Part", "1": "Group"}
print("[partname], ", "[parttype]")
for partInfo in partsList:
partInfo[2] = partType[partInfo[2]]
print(partInfo[0], ",", partInfo[2])
print("")
allPaired = jtmplCtrl.IsAllPairsParts()
if allPaired == False:
unsetPartsInModelSide = jtmplCtrl.GetUnsetPartsFromSetting()
if len(unsetPartsInModelSide) > 0:
print("There are unlinked parts in model side.")
unlinkedPart = separateInfoTo3LinesFormat(unsetPartsInModelSide)
for partInfo in unlinkedPart:
partInfo[2] = partType[partInfo[2]]
print(" ", partInfo[0], ",", partInfo[2])
unsetPartsInTemplateSide = jtmplCtrl.GetUnsetPartsFromTemplate()
if len(unsetPartsInTemplateSide) > 0:
print("There are unlinked parts in template side.")
unlinkedPart = separateInfoTo3LinesFormat(unsetPartsInTemplateSide)
for partInfo in unlinkedPart:
partInfo[2] = partType[partInfo[2]]
print(" ", partInfo[0], ",", partInfo[2])
return allPaired # すべて関連付けされていればTrue
def checkSets(templateCtrl):
"""セットについて、テンプレートにある全セット、モデルと関連付けできていないセットを取得"""
print("Sets:")
jtmplSetList = jtmplCtrl.GetSetsFromTemplate()
# 3カラムで1部品の情報を示すため、3カラムごとのtupleに変換して扱う
setList = separateInfoTo3LinesFormat(jtmplSetList)
print("[setname], ", "[targettype]")
for setInfo in setList:
print(setInfo[0], ",", setInfo[2])
print("")
allPaired = jtmplCtrl.IsAllPairsSets()
if allPaired == False:
unsetSetsInModelSide = jtmplCtrl.GetUnsetSetsFromSetting()
if len(unsetSetsInModelSide) > 0:
print("There are unlinked sets in model side.")
unlinkedSet = separateInfoTo3LinesFormat(unsetSetsInModelSide)
for setInfo in unlinkedSet:
print(" ", setInfo[0], ",", setInfo[2])
unsetSetsInTemplateSide = jtmplCtrl.GetUnsetSetsFromTemplate()
if len(unsetSetsInTemplateSide) > 0:
print("There are unlinked sets in template side.")
unlinkedSet = separateInfoTo3LinesFormat(unsetSetsInTemplateSide)
for setInfo in unlinkedSet:
print(" ", setInfo[0], ",", setInfo[2])
return allPaired # すべて関連付けされていればTrue
app = designer.GetApplication()
targetModel = app.GetCurrentModel()
jtmplCtrl = targetModel.CreateAnalysisTemplateControl(JTMPL_FILEPATH)
fixedUpPairParts = []
fixedUpPairSets = []
partsPaired = checkParts(jtmplCtrl)
if not partsPaired:
# 自動で関連付けされなかった部品の名前を比較してルール内でマッチすれば関連付けを作成する
unsetPartsInTemplateSide = jtmplCtrl.GetUnsetPartsFromTemplate()
unsetPartsInModelSide = jtmplCtrl.GetUnsetPartsFromSetting()
fixedUpPairParts = makePairIgnoreCaseDifferenceAndSpaces(separateInfoTo3LinesFormat(
unsetPartsInTemplateSide), separateInfoTo3LinesFormat(unsetPartsInModelSide))
print("")
setsPaired = checkSets(jtmplCtrl)
if not setsPaired:
# 自動で関連付けされなかったセットの名前を比較してルール内でマッチすれば関連付けを作成する
unsetSetsInTemplateSide = jtmplCtrl.GetUnsetSetsFromTemplate()
unsetSetsInModelSide = jtmplCtrl.GetUnsetSetsFromSetting()
fixedUpPairSets = makePairIgnoreCaseDifferenceAndSpaces(separateInfoTo3LinesFormat(
unsetSetsInTemplateSide), separateInfoTo3LinesFormat(unsetSetsInModelSide))
# モデルに解析テンプレートを適用する。自動で関連付けされるペアは指定を省略可能
targetModel.ImportAnalysisTemplateAuto(JTMPL_FILEPATH, fixedUpPairParts, fixedUpPairSets)


