[S0054] 形状エディタでシェル形状を作成する

シェル形状は2次元面の体積を持たないソリッドです。
解析においては構造解析で使用したり、その他の解析でごく薄い厚みでメッシュを生成して利用します。
形状エディタでは押し出しサーフェスを使用し線を押し出して作成します。
このスクリプトでは、直線を作成し押し出しサーフェスを定義して矩形のシェルソリッドを作成します。

前提条件

  • シェルの開始座標、幅及び高さは、方程式により設定する

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

  • シェルの開始座標、幅及び高さを方程式として登録する
  • ZX平面をY軸方向にオフセットした基準平面を作成し、この平面にスケッチを作成する
    Y軸方向のオフセット量に開始座標y成分の変数を設定する
    スケッチ平面ではX方向が全体のZ方向、Y方向は全体のX方向となる
  • 指定した開始座標を基準として、シェルの幅を表す直線を作成し、拘束を付与する
    開始点をX軸からの距離、Y軸からの距離で拘束し、それぞれの距離に開始座標の成分の変数を設定する
  • 作成した直線をY軸方向に押し出し、矩形のシェル形状を作成する。
# 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()

# 寸法パラメータ
ShellWidth = 100
ShellHeight = 100
ShellStartX = 0
ShellStartY = 0
ShellStartZ = 0

# 方程式名
EqWidth = u"width"
EqHeight = u"height"
EqStartX = u"start_x"
EqStartY = u"start_y"
EqStartZ = u"start_z"


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 createShellEquations():
    """シェルの幅、高さ、開始座標を方程式として登録する"""
    designTable = geomDoc.GetDesignTable()

    equationDataList = [
        (EqWidth, ShellWidth),
        (EqHeight, ShellHeight),
        (EqStartX, ShellStartX),
        (EqStartY, ShellStartY),
        (EqStartZ, ShellStartZ),
    ]

    designTable.EditStart()

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


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

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

    return offsetPlane


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

    sketch = part.CreateSketch(offsetPlaneRef)

    return sketch


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


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

    return equationName


def drawBaseShapeForShell(sketch, width):
    """シェルの基準となる直線を作成し、寸法と位置を拘束する"""
    sketch.OpenSketch()

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

    # シェルの幅を表す直線
    startVertex = sketch.CreateVertex(sketchStartX, sketchStartY)
    endVertex = sketch.CreateVertex(sketchStartX, sketchStartY + width)
    startRef = geomDoc.CreateReferenceFromItem(startVertex)
    endRef = geomDoc.CreateReferenceFromItem(endVertex)
    widthLine = sketch.CreateLine(
        sketchStartX,
        sketchStartY,
        sketchStartX,
        sketchStartY + width
    )
    widthLineRef = geomDoc.CreateReferenceFromItem(widthLine)
    sketch.CreateMonoConstraint(u"verticality", widthLineRef)
    # 直線の長さを方程式で拘束する
    widthConstraint = sketch.CreateBiConstraint(u"distance", startRef, endRef)
    setConstraintExpression(widthConstraint, u"Distance", EqWidth)
    # 直線の開始点のX位置を方程式で拘束する
    startXConstraint = sketch.CreateMonoConstraint(u"distancefromxaxis", startRef)
    startXDistanceExpression = getDistanceExpressionFromSignedValue(EqStartX, ShellStartX)
    setConstraintExpression(startXConstraint, u"Distance", startXDistanceExpression)
    # 直線のZ位置を方程式で拘束する
    startZConstraint = sketch.CreateMonoConstraint(u"distancefromyaxis", startRef)
    startZDistanceExpression = getDistanceExpressionFromSignedValue(EqStartZ, ShellStartZ)
    setConstraintExpression(startZConstraint, u"Distance", startZDistanceExpression)

    sketch.CloseSketch()


def createShellByExtrude(part, sketch):
    """直線をY軸方向に押し出し、長方形のシェル形状を作成する"""
    extrudeSurface = part.CreateExtrudeSurface(sketch)
    extrudeSurface.SetTypeByName(u"OneSide")
    extrudeSurface.SetReverse(False)
    extrudeSurface.SetProperty(u"Height", EqHeight)

    return extrudeSurface


def createShellPart(part):
    """Part内に方程式付きのシェル形状を作成する"""
    sketch = createSketchOnShellPlane(part)
    drawBaseShapeForShell(sketch, ShellWidth)
    createShellByExtrude(part, sketch)


def main():
    """方程式付きのシェル形状を持つPartを作成する"""
    createShellEquations()

    part = createNewPart()
    createShellPart(part)
    part.ClosePart()


main()

Download Python source code

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

JMAG-Express Online
An engineer's diary