[S0053] 形状エディタで螺旋形状を作成する

形状エディタの回転押し出しには螺旋オプションがあります。
これを使用しトーラスとほぼ同じ手順で螺旋形状が作成できます。
このスクリプトでは、円領域を作成し、円中心から距離のある軸に対して螺旋での回転押し出しを定義して螺旋ソリッドを作成します。

前提条件

  • 螺旋の開始座標、ピッチ、巻数、螺旋半径及びチューブ半径は、方程式により設定する

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

  • 螺旋の開始座標、ピッチ、巻数、螺旋半径及びチューブ半径を方程式として登録する
  • YZ平面をX軸方向にオフセットした基準平面を作成し、この平面にスケッチを作成する
    X軸方向のオフセット量に開始座標x成分の変数を設定する
    スケッチ平面ではX方向が全体のY方向、Y方向は全体のZ方向となる
  • 指定した開始座標を基準として、円断面、螺旋軸となる直線及び補助線を作成し、拘束を付与する
    開始点を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()

# 寸法パラメータ
HelixPitch = 50
HelixStartX = 0
HelixStartY = 0
HelixStartZ = 0
HelixTurn = 5
HelicalRadius = 100
TubeRadius = 20

# 方程式名
EqPitch = u"pitch"
EqStartX = u"start_x"
EqStartY = u"start_y"
EqStartZ = u"start_z"
EqTurn = u"turn"
EqHelicalRadius = u"helical_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 createHelixEquations():
    """螺旋の開始座標、ピッチ、巻数、各半径を方程式として登録する"""
    designTable = geomDoc.GetDesignTable()
    equationDataList = [
        (EqPitch, HelixPitch),
        (EqStartX, HelixStartX),
        (EqStartY, HelixStartY),
        (EqStartZ, HelixStartZ),
        (EqTurn, HelixTurn),
        (EqHelicalRadius, HelicalRadius),
        (EqTubeRadius, TubeRadius),
    ]

    designTable.EditStart()

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

    designTable.EditEnd()


def createOffsetYZPlane(part):
    """start_xでオフセットしたYZ平面を作成する"""
    refYZPlane = part.GetPlaneYZ()

    offsetPlane = part.CreateReferencePlane()
    offsetPlane.SetTypeByString(u"Distance")
    offsetPlane.SetPropertyByReference(u"Plane", refYZPlane)
    offsetPlane.SetProperty(u"Distance", EqStartX)

    return offsetPlane


def createSketchOnHelixPlane(part):
    """start_xでオフセットしたYZ平面上にスケッチを作成する"""
    offsetPlane = createOffsetYZPlane(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 drawBaseShapeForHelix(sketch, helicalRadius, tubeRadius):
    """螺旋の断面となる円と螺旋軸を作成し、領域を生成する"""
    sketch.OpenSketch()

    # YZ平面上のスケッチでは、スケッチX方向をY方向、
    # スケッチY方向をZ方向として扱う。
    sketchStartX = HelixStartY
    sketchStartY = HelixStartZ

    # 螺旋軸上の基準点
    axisPointVertex = sketch.CreateVertex(sketchStartX, sketchStartY)
    axisPointRef = geomDoc.CreateReferenceFromItem(axisPointVertex)
    # Y軸方向の螺旋軸
    axisLine = sketch.CreateLine(
        sketchStartX - helicalRadius,
        sketchStartY,
        sketchStartX + helicalRadius,
        sketchStartY
    )
    axisRef = geomDoc.CreateReferenceFromItem(axisLine)
    sketch.CreateMonoConstraint(u"horizontality", axisRef)
    sketch.CreateBiConstraint(u"coincident", axisRef, axisPointRef)
    # 螺旋軸上の開始点のY位置を方程式で拘束する
    startYConstraint = sketch.CreateMonoConstraint(
        u"distancefromyaxis",
        axisPointRef
    )
    startYDistanceExpression = getDistanceExpressionFromSignedValue(
        EqStartY,
        HelixStartY
    )
    setConstraintExpression(
        startYConstraint,
        u"Distance",
        startYDistanceExpression
    )
    # 螺旋軸のZ位置を方程式で拘束する
    startZConstraint = sketch.CreateMonoConstraint(
        u"distancefromxaxis",
        axisPointRef
    )
    startZDistanceExpression = getDistanceExpressionFromSignedValue(
        EqStartZ,
        HelixStartZ
    )
    setConstraintExpression(
        startZConstraint,
        u"Distance",
        startZDistanceExpression
    )

    # チューブ断面の中心
    tubeCenterVertex = sketch.CreateVertex(
        sketchStartX,
        sketchStartY + helicalRadius
    )
    tubeCenterRef = geomDoc.CreateReferenceFromItem(tubeCenterVertex)
    # 螺旋半径を表す補助線
    radiusLine = sketch.CreateLine(
        sketchStartX,
        sketchStartY,
        sketchStartX,
        sketchStartY + helicalRadius
    )
    radiusLineRef = geomDoc.CreateReferenceFromItem(radiusLine)
    # 補助線を回転軸に垂直にし、チューブ断面中心までの距離を方程式で拘束する
    sketch.CreateBiConstraint(u"perpendicularity", axisRef, radiusLineRef)
    sketch.CreateBiConstraint(u"coincident", radiusLineRef, axisPointRef)
    sketch.CreateBiConstraint(u"coincident", radiusLineRef, tubeCenterRef)
    helicalRadiusConstraint = sketch.CreateBiConstraint(
        u"distance",
        axisPointRef,
        tubeCenterRef
    )
    setConstraintExpression(helicalRadiusConstraint, u"Distance", EqHelicalRadius)
    # チューブ断面となる円
    tubeCircle = sketch.CreateCircle(
        sketchStartX,
        sketchStartY + helicalRadius,
        tubeRadius
    )
    tubeCircleRef = geomDoc.CreateReferenceFromItem(tubeCircle)
    # チューブ断面の半径を方程式で拘束する
    tubeRadiusConstraint = sketch.CreateMonoConstraint(
        u"radius",
        tubeCircleRef
    )
    setConstraintExpression(tubeRadiusConstraint, u"Radius", EqTubeRadius)

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

    sketch.CloseSketch()

    return axisLine


def createHelixByRevolve(part, sketch, axisLine):
    """円領域を螺旋軸まわりに回転させ、螺旋形状を作成する"""
    revolve = part.CreateRevolveSolid(sketch)

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

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

    revolve.SetProperty(u"UseHelical", True)
    revolve.SetProperty(u"HelicalPitch", EqPitch)

    revolve.SetProperty(u"Reverse", True)
    revolve.SetProperty(u"Angle", u"360.0*" + EqTurn)
    return revolve


def createHelixPart(part):
    """Part内に方程式付きの螺旋形状を作成する"""
    sketch = createSketchOnHelixPlane(part)
    axisLine = drawBaseShapeForHelix(sketch, HelicalRadius, TubeRadius)
    createHelixByRevolve(part, sketch, axisLine)


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

    part = createNewPart()
    createHelixPart(part)
    part.ClosePart()


main()

Download Python source code

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

JMAG-Express Online
An engineer's diary