[S0037] IPMモータのI字型ロータの2次元形状を作成する

JMAGの形状エディタでは、JMAG専用CADとしてモデル形状を作成できます。
モデル形状の作成では、GUIで行う場合とスクリプトで行う場合には、多くの場合でアプローチが異なります。
例えば、GUIではおおよその線を引いて後で余分な線を取り除くことをしますが、スクリプトでは長さや位置を合わせて描いていくなどの違いがあります。
このスクリプトではIPMモータのI字型ロータの2次元形状を作成します。
IPMモータのI字型ロータの2次元形状を作成する

前提条件

  • 極数4として1/4モデルで作成する
  • 45degで鏡面対称性があるものとする

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

  • XY平面上にスケッチを作成し、編集可能ステータスとする
  • 円弧と直線で外形を作成し、拘束を付与する。磁石ポケットでは直線を分割しておく
  • 磁石の矩形を作成し、拘束を付与する
  • 磁石の領域を作成し、名前と色を設定する
  • 磁石の領域の鏡面コピーを作成し、1/4モデルとする
  • スリットを作成する。位置と寸法をおおよそで作成した後、拘束を付与する
  • コアの領域を作成し、名前と色を設定する
  • コアの領域の鏡面コピーを作成し、1/4モデルとする
# 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()

sketchAngle = 45  # 90degモデルで45degの鏡面対称
InnerD = 15  # 内径半径
OuterD = 50  # 外形半径
MagnetPosFromCenter = 24  # 中心からの磁石位置距離
MagnetThickness = 4.5  # 磁石厚さ
MagnetWidth = 19  # 磁石幅

HalfWidthBetweenSlits = 1.3  # スリット間距離/2
SlitDepth = 1.0  # スリット深さ


def drawArcByCenterRadiusAngleFromXAxis(sketch, centerVertexObj, radius, angle):
    """スケッチ上に中心座標、半径と角度を指定して円弧を描く。中心点はX軸上にある前提"""
    startX = centerVertexObj.GetX() + radius
    startY = 0
    
    dummyLine = sketch.CreateLineByLengthAngle(centerVertexObj.GetX(), centerVertexObj.GetY(), radius, angle)
    endVertex = dummyLine.GetEndVertex()
    
    arc = sketch.CreateArc(centerVertexObj.GetX(), centerVertexObj.GetY(), 
        startX, startY, endVertex.GetX(), endVertex.GetY())
    
    selection = geomDoc.GetSelection()
    selection.Clear()
    selection.Add(dummyLine)
    selection.Delete()
    selection.Clear()
    
    return arc

def calculatePositionByLengthFromPosAndAngleFromXAxis(sketch, vertexObj, length, angle):
    """指定された頂点から、X軸に対して指定された角度方向に指定された長さの位置にある座標を計算する"""
    dummyLine = sketch.CreateLineByLengthAngle(vertexObj.GetX(), vertexObj.GetY(), length, angle)
    vertex = dummyLine.GetEndVertex()
    pos = geomApp.CreatePoint(vertex.GetX(), vertex.GetY(), 0)
    
    selection = geomDoc.GetSelection()
    selection.Clear()
    selection.Add(dummyLine)
    selection.Delete()
    selection.Clear()
    
    return pos

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

def getRegionItemByOrder(sketch, createdOrder):
    """指定した順番目の領域オブジェクトを取得する"""
    numItems = sketch.NumItems()
    currentCount = 0
    for i in range(numItems):
        objItem = sketch.GetItem(i)
        if objItem.GetScriptTypeName() == u"RegionItem":
            if currentCount == createdOrder - 1:
                return objItem
            else:
                currentCount += 1
    return sketch


def drawIShapedIPMRotor(sketch):
    """スケッチにI字型のIPMモータのロータ形状を作成する"""
    magnetEdgeList = []  # 磁石を構成するエッジ群
    coreEdgeList = []  # コアを構成するエッジ群
    
    # 原点にVertexを配置し固定
    originVertex = sketch.CreateVertex(0, 0)
    refOriginVertex = geomDoc.CreateReferenceFromItem(originVertex)
    sketch.CreateMonoConstraint(u"fixture", refOriginVertex)
    
    # 内円と外円
    innerArc = drawArcByCenterRadiusAngleFromXAxis(sketch, originVertex, InnerD, sketchAngle)
    sketch.CreateMonoConstraint(u"radius", geomDoc.CreateReferenceFromItem(innerArc))
    outerArc = drawArcByCenterRadiusAngleFromXAxis(sketch, originVertex, OuterD, sketchAngle)
    sketch.CreateMonoConstraint(u"radius", geomDoc.CreateReferenceFromItem(outerArc))
    coreEdgeList.append(innerArc)
    coreEdgeList.append(outerArc)
    
    # X軸上径方向に内円と外円を結ぶ直線
    radiusLineOnX = sketch.CreateLine(innerArc.GetStartVertex().GetX(), innerArc.GetStartVertex().GetY(),
        outerArc.GetStartVertex().GetX(), outerArc.GetStartVertex().GetY())
    sketch.CreateMonoConstraint(u"horizontality", geomDoc.CreateReferenceFromItem(radiusLineOnX))
    sketch.CreateBiConstraint(u"coincident", refOriginVertex, geomDoc.CreateReferenceFromItem(radiusLineOnX))
    coreEdgeList.append(radiusLineOnX)
    
    # 中心線上に磁石ポケットで区切って結ぶ直線
    magnetBottomCenterPos = calculatePositionByLengthFromPosAndAngleFromXAxis(sketch, originVertex, 
        MagnetPosFromCenter, sketchAngle)
    lineInnerToMagnet = sketch.CreateLine(innerArc.GetEndVertex().GetX(), innerArc.GetEndVertex().GetY(),
        magnetBottomCenterPos.GetX(), magnetBottomCenterPos.GetY())
    lineMagnetHeightCenter = sketch.CreateLineByLengthAngle(magnetBottomCenterPos.GetX(), magnetBottomCenterPos.GetY(),
        MagnetThickness, sketchAngle)
    lineMagnetToOuter = sketch.CreateLine(lineMagnetHeightCenter.GetEndVertex().GetX(), lineMagnetHeightCenter.GetEndVertex().GetY(),
        outerArc.GetEndVertex().GetX(), outerArc.GetEndVertex().GetY())
    sketch.CreateBiConstraint(u"coincident", refOriginVertex, geomDoc.CreateReferenceFromItem(lineInnerToMagnet))
    sketch.CreateBiConstraint(u"coincident", geomDoc.CreateReferenceFromItem(lineInnerToMagnet),
        geomDoc.CreateReferenceFromItem(lineMagnetHeightCenter))
    sketch.CreateBiConstraint(u"coincident", geomDoc.CreateReferenceFromItem(lineInnerToMagnet),
        geomDoc.CreateReferenceFromItem(lineMagnetToOuter))
    sketch.CreateBiConstraint(u"angle", geomDoc.CreateReferenceFromItem(radiusLineOnX),
        geomDoc.CreateReferenceFromItem(lineMagnetToOuter))
    magnetEdgeList.append(lineMagnetHeightCenter)
    coreEdgeList.append(lineInnerToMagnet)
    coreEdgeList.append(lineMagnetToOuter)
    
    # 磁石の矩形を作成し領域化
    lineMagnetBottom = sketch.CreateLineByLengthAngle(lineInnerToMagnet.GetEndVertex().GetX(), lineInnerToMagnet.GetEndVertex().GetY(),
        MagnetWidth, sketchAngle - 90)
    sketch.CreateBiConstraint(u"perpendicularity", geomDoc.CreateReferenceFromItem(lineMagnetHeightCenter),
        geomDoc.CreateReferenceFromItem(lineMagnetBottom))
    sketch.CreateBiConstraint(u"distance", refOriginVertex, geomDoc.CreateReferenceFromItem(lineMagnetBottom))
    lineMagnetTop = sketch.CreateLineByLengthAngle(lineMagnetHeightCenter.GetEndVertex().GetX(), lineMagnetHeightCenter.GetEndVertex().GetY(),
        MagnetWidth, sketchAngle - 90)
    sketch.CreateBiConstraint(u"distance", geomDoc.CreateReferenceFromItem(lineMagnetBottom),
        geomDoc.CreateReferenceFromItem(lineMagnetTop))
    lineMagnetHightRight = sketch.CreateLine(lineMagnetBottom.GetEndVertex().GetX(), lineMagnetBottom.GetEndVertex().GetY(),
        lineMagnetTop.GetEndVertex().GetX(), lineMagnetTop.GetEndVertex().GetY())
    sketch.CreateBiConstraint(u"distance", geomDoc.CreateReferenceFromItem(lineMagnetHeightCenter),
        geomDoc.CreateReferenceFromItem(lineMagnetHightRight))
    magnetEdgeList.append(lineMagnetBottom)
    magnetEdgeList.append(lineMagnetTop)
    magnetEdgeList.append(lineMagnetHightRight)
    createRegionFromItems(sketch, magnetEdgeList)

    # 磁石の領域に名前と色を設定
    magnetRegion = getRegionItemByOrder(sketch, 1)
    if magnetRegion.GetScriptTypeName() == u"RegionItem":
        magnetRegion.SetName(u"Magnet")
        magnetRegion.SetProperty(u"Color", u"#a0a0a4")
        magnetRegion.SetProperty(u"UseParentColor", 0)

    # 磁石の領域の鏡面コピー作成
    magnetMergedRegionFeature = sketch.CreateRegionMirrorCopy()
    magnetMergedRegionFeature.SetProperty(u"Merge", 1)
    magnetMergedRegionFeature.SetName(u"MagnetMirror1Pole")
    magnetMergedRegionFeature.SetSymmetry(geomDoc.CreateReferenceFromItem(lineMagnetHeightCenter))
    magnetMergedRegionFeature.SetPropertyByReference(u"Region", geomDoc.CreateReferenceFromItem(magnetRegion))

    coreEdgeList.append(lineMagnetBottom)
    coreEdgeList.append(lineMagnetTop)

    # スリットを作成
    arcSlitBridge = drawArcByCenterRadiusAngleFromXAxis(sketch, originVertex, OuterD - SlitDepth, 8.0)
    sketch.CreateBiConstraint(u"distance", geomDoc.CreateReferenceFromItem(outerArc),
        geomDoc.CreateReferenceFromItem(arcSlitBridge))
    lineSlitBottomParallelMagnet = sketch.CreateLineByLengthAngle(lineMagnetBottom.GetEndVertex().GetX(), lineMagnetBottom.GetEndVertex().GetY(),
        3.0, sketchAngle - 90)
    sketch.CreateBiConstraint(u"coincident", geomDoc.CreateReferenceFromItem(lineMagnetBottom),
        geomDoc.CreateReferenceFromItem(lineSlitBottomParallelMagnet))
    lineSlitBottom = sketch.CreateLine(lineSlitBottomParallelMagnet.GetEndVertex().GetX(), lineSlitBottomParallelMagnet.GetEndVertex().GetY(),
        arcSlitBridge.GetStartVertex().GetX(), arcSlitBridge.GetStartVertex().GetY())
    sketch.CreateBiConstraint(u"distance", geomDoc.CreateReferenceFromItem(radiusLineOnX),
        geomDoc.CreateReferenceFromItem(lineSlitBottom))
    lineSlitTopParallelMagnet = sketch.CreateLineByLengthAngle(lineMagnetTop.GetEndVertex().GetX(), lineMagnetTop.GetEndVertex().GetY(),
        3.0, sketchAngle - 90)
    sketch.CreateBiConstraint(u"coincident", geomDoc.CreateReferenceFromItem(lineMagnetTop),
        geomDoc.CreateReferenceFromItem(lineSlitTopParallelMagnet))
    lineSlitTop = sketch.CreateLine(lineSlitTopParallelMagnet.GetEndVertex().GetX(), lineSlitTopParallelMagnet.GetEndVertex().GetY(),
        arcSlitBridge.GetEndVertex().GetX(), arcSlitBridge.GetEndVertex().GetY())
    sketch.CreateBiConstraint(u"distance", geomDoc.CreateReferenceFromItem(lineSlitBottom),
        geomDoc.CreateReferenceFromItem(lineSlitTop))

    # コアの領域を作成
    coreEdgeList.append(arcSlitBridge)
    coreEdgeList.append(lineSlitBottomParallelMagnet)
    coreEdgeList.append(lineSlitBottom)
    coreEdgeList.append(lineSlitTopParallelMagnet)
    coreEdgeList.append(lineSlitTop)
    createRegionFromItems(sketch, coreEdgeList)
    coreRegion = getRegionItemByOrder(sketch, 2)
    if coreRegion.GetScriptTypeName() == u"RegionItem":
        coreRegion.SetName(u"RotorCore")
        coreRegion.SetProperty(u"Color", u"lime")
        coreRegion.SetProperty(u"UseParentColor", 0)

    # コアの領域の鏡面コピー作成
    coreMergedRegionFeature = sketch.CreateRegionMirrorCopy()
    coreMergedRegionFeature.SetProperty(u"Merge", 1)
    coreMergedRegionFeature.SetName(u"CoreMirror1Pole")
    coreMergedRegionFeature.SetSymmetry(geomDoc.CreateReferenceFromItem(lineMagnetToOuter))
    coreMergedRegionFeature.SetPropertyByReference(u"Region", geomDoc.CreateReferenceFromItem(coreRegion))


def drawInSketch(sketch):
    """スケッチに形状を作成する"""
    sketch.OpenSketch()
    
    drawIShapedIPMRotor(sketch)

    sketch.CloseSketch()


assm = geomDoc.GetAssembly()
refXYPlane = assm.GetPlaneXY()
newSketch = assm.CreateSketch(refXYPlane)

drawInSketch(newSketch)

Download Python source code

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

JMAG-Express Online
An engineer's diary