# 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)
