# Copyright (c) 2026 JSOL CORPORATION
#
# 本スクリプトはMITライセンスのもとで公開しています。
# ライセンス全文は以下を参照してください。
# https://www.jmag-international.com/jp/scriptlibrary/jmag_script_library_mit/

app = designer.GetApplication()

# 条件名
CircularChannelName = u"circle"
RectangularChannelName = u"rectangle"
HeatTransferConditionName = u"left"
HeatTransferLayeredConditionName = u"right"

# 円形チャネルの設定
CircularDiameter = 8
CircularNumberOfChannel = 2
CircularChannelLengthUpper = 80
CircularChannelLengthLower = 0
CircularReferenceAxisAngle = 45
CircularPitchDiameter = 40
CircularOriginX = -100
CircularOriginY = 50
CircularOriginZ = 0
CircularAxisX = 0
CircularAxisY = 0
CircularAxisZ = 1
CircularReferenceDirectionX = 1
CircularReferenceDirectionY = 0
CircularReferenceDirectionZ = 0

# 矩形チャネルの設定
RectangularChannelWidth = 20
RectangularChannelHeight = 20
RectangularNumberOfChannel = 2
RectangularChannelLengthUpper = 80
RectangularChannelLengthLower = 0
RectangularReferenceAxisAngle = 0
RectangularPitchDiameter = 50
RectangularOriginX = 60
RectangularOriginY = 50
RectangularOriginZ = 40
RectangularAxisX = 1
RectangularAxisY = 0
RectangularAxisZ = 0
RectangularReferenceDirectionX = 0
RectangularReferenceDirectionY = 1
RectangularReferenceDirectionZ = 0


def createCircularMeshChannel(meshControl):
    """円形断面の軸方向メッシュチャネルを作成する。"""
    channel = meshControl.CreateCondition(u"MeshChannel", CircularChannelName)
    channel.SetValue(u"ChannelType", u"AxialDirection")
    channel.SetValue(u"ChannelShape", u"CircularChannel")
    channel.SetValue(u"CircularDiameter", CircularDiameter)
    channel.SetValue(u"NumberOfChannel", CircularNumberOfChannel)
    channel.SetValue(u"ChannelLengthUpper", CircularChannelLengthUpper)
    channel.SetValue(u"ChannelLengthLower", CircularChannelLengthLower)
    channel.SetValue(u"ReferenceAxisAngle", CircularReferenceAxisAngle)
    channel.SetValue(u"PitchDiameter", CircularPitchDiameter)

    origin = app.CreatePoint(CircularOriginX, CircularOriginY, CircularOriginZ)
    axis = app.CreatePoint(CircularAxisX, CircularAxisY, CircularAxisZ)
    referenceDirection = app.CreatePoint(
        CircularReferenceDirectionX,
        CircularReferenceDirectionY,
        CircularReferenceDirectionZ
    )
    channel.SetPoint(u"Origin", origin)
    channel.SetPoint(u"Axis", axis)
    channel.SetPoint(u"ReferenceDirection", referenceDirection)

    return channel


def createRectangularMeshChannel(meshControl):
    """矩形断面の軸方向メッシュチャネルを作成する。"""
    channel = meshControl.CreateCondition(u"MeshChannel", RectangularChannelName)
    channel.SetValue(u"ChannelType", u"AxialDirection")
    channel.SetValue(u"ChannelShape", u"RectangularChannel")
    channel.SetValue(u"RectangularChannelWidth", RectangularChannelWidth)
    channel.SetValue(u"RectangularChannelHeight", RectangularChannelHeight)
    channel.SetValue(u"NumberOfChannel", RectangularNumberOfChannel)
    channel.SetValue(u"ChannelLengthUpper", RectangularChannelLengthUpper)
    channel.SetValue(u"ChannelLengthLower", RectangularChannelLengthLower)
    channel.SetValue(u"ReferenceAxisAngle", RectangularReferenceAxisAngle)
    channel.SetValue(u"PitchDiameter", RectangularPitchDiameter)

    origin = app.CreatePoint(RectangularOriginX, RectangularOriginY, RectangularOriginZ)
    axis = app.CreatePoint(RectangularAxisX, RectangularAxisY, RectangularAxisZ)
    referenceDirection = app.CreatePoint(
        RectangularReferenceDirectionX,
        RectangularReferenceDirectionY,
        RectangularReferenceDirectionZ
    )
    channel.SetPoint(u"Origin", origin)
    channel.SetPoint(u"Axis", axis)
    channel.SetPoint(u"ReferenceDirection", referenceDirection)

    return channel


def setMeshChannelToHeatTransferCondition(condition, meshChannel):
    """熱伝達境界条件の設定対象にメッシュチャネルを指定する。"""
    condition.SetValue(u"TargetType", u"Mesh")
    condition.SetLinkWithType(u"LinkedMeshChannel", meshChannel.GetName())


def main():
    """メッシュチャネルを作成し、熱伝達境界条件の設定対象に指定する。"""
    study = app.GetCurrentStudy()
    meshControl = study.GetMeshControl()

    circularChannel = createCircularMeshChannel(meshControl)
    rectangularChannel = createRectangularMeshChannel(meshControl)

    heatTransferCondition = study.GetCondition(HeatTransferConditionName)
    setMeshChannelToHeatTransferCondition(heatTransferCondition, circularChannel)
    heatTransferLayeredCondition = study.GetCondition(HeatTransferLayeredConditionName)
    setMeshChannelToHeatTransferCondition(
        heatTransferLayeredCondition,
        rectangularChannel
    )


main()
