[S0044] 形状エディタで球を作成する

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

前提条件

  • 球の中心座標及び半径は、方程式により設定する

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

  • 球の中心座標及び半径に設定する変数を方程式として登録する
  • XY平面をZ軸方向にオフセットした基準平面を作成し、この平面にスケッチを作成する
    Z軸からのオフセット量に中心座標z成分の変数を設定する
  • 指定した中心座標を基準として半円と回転軸となる直線を作成し、拘束を付与する
    中心点をX軸からの距離、Y軸からの距離で拘束し、それぞれの距離に中心座標の成分の変数を設定する
    半円には半径拘束を設定し、半径に変数を設定する
  • 半円と直線による領域を作成する
  • 作成した半円領域を直線を回転軸として360 deg回転押し出し、球形状を作成する
# 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()

# 寸法パラメータ
SphereCenterX = 0
SphereCenterY = 0
SphereCenterZ = 0
SphereRadius = 100

# 方程式名
EqCenterX = u"center_x"
EqCenterY = u"center_y"
EqCenterZ = u"center_z"
EqSphereRadius = u"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 createSphereEquations():
    """球の中心座標と半径を方程式として登録する"""
    designTable = geomDoc.GetDesignTable()

    equationDataList = [
        (EqCenterX, SphereCenterX),
        (EqCenterY, SphereCenterY),
        (EqCenterZ, SphereCenterZ),
        (EqSphereRadius, SphereRadius),
    ]

    designTable.EditStart()

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

    designTable.EditEnd()


def createOffsetXYPlane(part):
    """center_zでオフセットしたXY平面を作成する"""
    refXYPlane = part.GetPlaneXY()

    offsetPlane = part.CreateReferencePlane()
    offsetPlane.SetTypeByString(u"Distance")
    offsetPlane.SetPropertyByReference(u"Plane", refXYPlane)
    offsetPlane.SetProperty(u"Distance", EqCenterZ)

    return offsetPlane


def createSketchOnSpherePlane(part):
    """center_zでオフセットしたXY平面上にスケッチを作成する"""
    offsetPlane = createOffsetXYPlane(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 drawBaseShapeForSphere(sketch, radius):
    """球の断面となる半円と回転軸を作成し、領域を生成する"""
    sketch.OpenSketch()

    # 中心点
    centerVertex = sketch.CreateVertex(SphereCenterX, SphereCenterY)
    centerRef = geomDoc.CreateReferenceFromItem(centerVertex)
    # 球の断面になる半円
    arc = sketch.CreateArc(
        SphereCenterX,
        SphereCenterY,
        SphereCenterX,
        SphereCenterY - radius,
        SphereCenterX,
        SphereCenterY + radius
    )
    arcRef = geomDoc.CreateReferenceFromItem(arc)

    # 中心点のX位置を方程式で拘束する
    centerXConstraint = sketch.CreateMonoConstraint(
        u"distancefromyaxis",
        centerRef
    )
    centerXDistanceExpression = getDistanceExpressionFromSignedValue(
        EqCenterX,
        SphereCenterX
    )
    setConstraintExpression(centerXConstraint, u"Distance", centerXDistanceExpression)
    # 中心点のY位置を方程式で拘束する
    centerYConstraint = sketch.CreateMonoConstraint(
        u"distancefromxaxis",
        centerRef
    )
    centerYDistanceExpression = getDistanceExpressionFromSignedValue(
        EqCenterY,
        SphereCenterY
    )
    setConstraintExpression(centerYConstraint, u"Distance", centerYDistanceExpression)
    # 半径を方程式で拘束する
    radiusConstraint = sketch.CreateMonoConstraint(
        u"radius",
        arcRef
    )
    setConstraintExpression(radiusConstraint, u"Radius", EqSphereRadius)

    # 回転軸になる半円の直線部
    axisLine = sketch.CreateLine(
        SphereCenterX,
        SphereCenterY - radius,
        SphereCenterX,
        SphereCenterY + radius
    )
    axisRef = geomDoc.CreateReferenceFromItem(axisLine)
    # 直線部を鉛直にする
    sketch.CreateMonoConstraint(u"verticality", axisRef)
    # 直線部が中心点を通るようにする
    sketch.CreateBiConstraint(u"coincident", axisRef, centerRef)

    # 半円と直線部から閉じた領域を作成する
    createRegionFromItems(sketch, [arc, axisLine])

    sketch.CloseSketch()

    return axisLine


def createSphereByRevolve(part, sketch, axisLine):
    """半円領域を半円の直線部を軸として360deg回転させ、球形状を作成する"""
    revolve = part.CreateRevolveSolid(sketch)

    revolve.SetTypeByName(u"Outside")
    revolve.SetProperty(u"AxisType", u"SelectEntity")

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

    revolve.SetAngle(360.0)

    return revolve


def createSpherePart(part):
    """Part内に方程式付きの球形状を作成する"""
    sketch = createSketchOnSpherePlane(part)
    axisLine = drawBaseShapeForSphere(sketch, SphereRadius)
    createSphereByRevolve(part, sketch, axisLine)


def main():
    """方程式付きの球形状を持つPartを作成する"""
    createSphereEquations()

    part = createNewPart()
    createSpherePart(part)
    part.ClosePart()


main()

Download Python source code

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

JMAG-Express Online
An engineer's diary