[S0052] 形状エディタでトーラス形状を作成する

JMAG-Designerの形状エディタで3次元の形状の作成を行うには、まず平面を指定して2次元のスケッチを作成します。
作成したい3次元形状においてどの断面を押し出すか、後で切り取るかなど作成手順を検討して平面を決め断面図形を作成します。
このスクリプトでは、円領域を作成し、円中心から距離のある軸に対して回転押し出しを定義してトーラスのソリッドを作成します。

前提条件

  • トーラスの中心座標、中心半径及びチューブ半径は、方程式により設定する

スクリプトにおける設定内容

  • トーラスの中心座標、中心半径及びチューブ半径に設定する変数を方程式として登録する
  • ZX平面をY軸方向にオフセットした基準平面を作成し、この平面にスケッチを作成する
    Y軸方向のオフセット量に中心座標y成分の変数を設定する
    スケッチ平面ではX方向が全体のZ方向、Y方向は全体のX方向となる
  • 指定した中心座標を基準として、円断面、回転軸となる直線及び補助線を作成し、拘束を付与する
    中心点をX軸からの距離、Y軸からの距離で拘束し、それぞれの距離に中心座標の成分の変数を設定する
    円断面には半径拘束を設定、中心座標と円断面中心を結ぶ補助線にはトーラス半径に当たる距離拘束を設定する
  • 円断面に領域を作成する
  • 作成した円領域を、回転軸とした直線を軸として360deg回転押し出し、トーラス形状を作成する
# Copyright (c) 2026 JSOL CORPORATION
#
# 本スクリプトはMITライセンスのもとで公開しています。
# ライセンス全文は以下を参照してください。
# https://www.jmag-international.com/jp/scriptlibrary/jmag_script_library_mit/

app = designer.GetApplication()
geomApp = app.CreateGeometryEditor()
geomDoc = geomApp.GetDocument()

# 寸法パラメータ
TorusCenterX = 0
TorusCenterY = 0
TorusCenterZ = 0
TorusRadius = 100
TubeRadius = 20

# 方程式名
EqCenterX = u"center_x"
EqCenterY = u"center_y"
EqCenterZ = u"center_z"
EqTorusRadius = u"torus_radius"
EqTubeRadius = u"tube_radius"


def createNewPart():
    """新しいPartを作成し、編集可能な状態で開く"""
    assm = geomDoc.GetAssembly()
    part = assm.CreatePart()
    part.OpenPart()

    return part


def setupEquation(equation, expression):
    """DesignTable上の方程式の基本設定を行う"""

    # The argument of SetType
    # 0: 値
    # 1: 式
    equation.SetType(0)
    equation.SetExpression(str(expression))


def createTorusEquations():
    """トーラスの中心座標、中心半径、チューブ半径を方程式として登録する"""
    designTable = geomDoc.GetDesignTable()

    equationDataList = [
        (EqCenterX, TorusCenterX),
        (EqCenterY, TorusCenterY),
        (EqCenterZ, TorusCenterZ),
        (EqTorusRadius, TorusRadius),
        (EqTubeRadius, TubeRadius),
    ]

    designTable.EditStart()

    for equationName, expression in equationDataList:
        designTable.AddEquation(equationName)
        equation = designTable.GetEquation(equationName)
        setupEquation(equation, expression)

    designTable.EditEnd()


def createOffsetZXPlane(part):
    """center_yでオフセットしたZX平面を作成する"""
    refZXPlane = part.GetPlaneZX()

    offsetPlane = part.CreateReferencePlane()
    offsetPlane.SetTypeByString(u"Distance")
    offsetPlane.SetPropertyByReference(u"Plane", refZXPlane)
    offsetPlane.SetProperty(u"Distance", EqCenterY)

    return offsetPlane


def createSketchOnTorusPlane(part):
    """center_yでオフセットしたZX平面上にスケッチを作成する"""
    offsetPlane = createOffsetZXPlane(part)
    offsetPlaneRef = geomDoc.CreateReferenceFromItem(offsetPlane)

    sketch = part.CreateSketch(offsetPlaneRef)

    return sketch


def createRegionFromItems(sketch, itemList):
    """引数のitemListすべてからスケッチ上に領域を作成する"""
    selection = geomDoc.GetSelection()
    selection.Clear()
    for item in itemList:
        selection.Add(item)
    sketch.CreateRegions()
    selection.Clear()


def setConstraintExpression(constraint, propertyName, equationName):
    """拘束寸法に方程式名を設定する"""
    constraint.SetProperty(propertyName, equationName)


def getDistanceExpressionFromSignedValue(equationName, value):
    """符号付き座標値から、距離拘束に使用する正の式を返す"""
    if value < 0:
        return u"-" + equationName

    return equationName


def drawBaseShapeForTorus(sketch, torusRadius, tubeRadius):
    """トーラスの断面となる円と回転軸を作成し、領域を生成する"""
    sketch.OpenSketch()

    # ZX平面上のスケッチでは、スケッチX方向をZ方向、スケッチY方向をX方向として扱う。
    sketchCenterX = TorusCenterZ
    sketchCenterY = TorusCenterX

    # トーラス中心
    centerVertex = sketch.CreateVertex(sketchCenterX, sketchCenterY)
    centerRef = geomDoc.CreateReferenceFromItem(centerVertex)
    # トーラスの回転軸
    axisLine = sketch.CreateLine(
        sketchCenterX - torusRadius,
        sketchCenterY,
        sketchCenterX + torusRadius,
        sketchCenterY
    )
    axisRef = geomDoc.CreateReferenceFromItem(axisLine)
    # 回転軸を水平にし、トーラス中心を通るように拘束する
    sketch.CreateMonoConstraint(u"horizontality", axisRef)
    sketch.CreateBiConstraint(u"coincident", axisRef, centerRef)
    # トーラス中心のX位置を方程式で拘束する
    centerXConstraint = sketch.CreateMonoConstraint(
        u"distancefromxaxis",
        centerRef
    )
    centerXDistanceExpression = getDistanceExpressionFromSignedValue(
        EqCenterX,
        TorusCenterX
    )
    setConstraintExpression(centerXConstraint, u"Distance", centerXDistanceExpression)
    # トーラス中心のZ位置を方程式で拘束する
    centerZConstraint = sketch.CreateMonoConstraint(
        u"distancefromyaxis",
        centerRef
    )
    centerZDistanceExpression = getDistanceExpressionFromSignedValue(
        EqCenterZ,
        TorusCenterZ
    )
    setConstraintExpression(centerZConstraint, u"Distance", centerZDistanceExpression)

    # チューブ断面の中心
    tubeCenterVertex = sketch.CreateVertex(
        sketchCenterX,
        sketchCenterY + torusRadius
    )
    tubeCenterRef = geomDoc.CreateReferenceFromItem(tubeCenterVertex)
    # トーラス中心からチューブ断面中心までの距離を表す補助線
    radiusLine = sketch.CreateLine(
        sketchCenterX,
        sketchCenterY,
        sketchCenterX,
        sketchCenterY + torusRadius
    )
    radiusLineRef = geomDoc.CreateReferenceFromItem(radiusLine)
    # 補助線を回転軸に垂直にし、チューブ断面中心までの距離を方程式で拘束する
    sketch.CreateBiConstraint(u"perpendicularity", axisRef, radiusLineRef)
    sketch.CreateBiConstraint(u"coincident", radiusLineRef, centerRef)
    sketch.CreateBiConstraint(u"coincident", radiusLineRef, tubeCenterRef)
    torusRadiusConstraint = sketch.CreateBiConstraint(
        u"distance",
        centerRef,
        tubeCenterRef
    )
    setConstraintExpression(torusRadiusConstraint, u"Distance", EqTorusRadius)
    # チューブ断面になる円
    tubeCircle = sketch.CreateCircle(
        sketchCenterX,
        sketchCenterY + torusRadius,
        tubeRadius
    )
    tubeCircleRef = geomDoc.CreateReferenceFromItem(tubeCircle)
    # チューブ断面の半径を方程式で拘束する
    tubeRadiusConstraint = sketch.CreateMonoConstraint(
        u"radius",
        tubeCircleRef
    )
    setConstraintExpression(tubeRadiusConstraint, u"Radius", EqTubeRadius)

    # チューブ断面の円から閉じた領域を作成する
    createRegionFromItems(sketch, [tubeCircle])

    sketch.CloseSketch()

    return axisLine


def createTorusByRevolve(part, sketch, axisLine):
    """円領域を回転軸まわりに360deg回転させ、トーラス形状を作成する"""
    revolve = part.CreateRevolveSolid(sketch)
    revolve.SetTypeByName(u"OneSide")
    revolve.SetProperty(u"AxisType", u"SelectEntity")

    axisRef = geomDoc.CreateReferenceFromItem(axisLine)
    revolve.SetAxis(axisRef)

    revolve.SetAngle(360.0)

    return revolve


def createTorusPart(part):
    """Part内に方程式付きのトーラス形状を作成する"""
    sketch = createSketchOnTorusPlane(part)
    axisLine = drawBaseShapeForTorus(sketch, TorusRadius, TubeRadius)
    createTorusByRevolve(part, sketch, axisLine)


def main():
    """方程式付きのトーラス形状を持つPartを作成する"""
    createTorusEquations()

    part = createNewPart()
    createTorusPart(part)
    part.ClosePart()


main()

Download Python source code

ファイルご利用の注意点
JMAGスクリプトライブラリをご利用されるに際し、以下をよくお読みいただき、ご同意の上ご利用くださるようお願い申し上げます。
絞込み検索
  • カテゴリー 一覧

JMAG-Express Online
An engineer's diary