[S0037] Create a 2D shape of the I-shaped rotor of an IPM motor

JMAG Geometry Editor allows to create model geometries as a JMAG-specific CAD tool.
The approach to creating model geometries often differs depending on whether you use a GUI or a script.
For example, with a GUI, draw rough lines at first and then remove the extra lines later, while with a script, draw while adjusting the length and position.
This script creates the 2D shape of the I-shaped rotor of an IPM motor.
Create a 2D shape of the I-shaped rotor of an IPM motor

Preconditions

  • Create a 1/4 model with 4 poles.
  • Assume mirror symmetry at 45 degree.

Script Function

  • Create a sketch on the XY plane and set it to editable status.
  • Create an outline using arcs and lines and apply constraints. Divide the lines in the magnet pocket.
  • Create a rectangle for the magnet and apply constraints.
  • Create a region for the magnet and set its name and color.
  • Create a mirrored copy of the magnet region to create a 1/4 model.
  • Create a slit. After roughly creating its position and dimensions, apply constraints.
  • Create a region for the core and set its name and color.
  • Create a mirrored copy of the core region to create a 1/4 model.
# Copyright (c) 2026 JSOL CORPORATION
#
# This script is released under the MIT License.
# See the full license text at:
# https://www.jmag-international.com/scriptlibrary/jmag_script_library_mit/


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

sketchAngle = 45  # 90-degree model with 45-degree mirror symmetry
InnerD = 15  # Inner radius
OuterD = 50  # Outer radius
MagnetPosFromCenter = 24  # Distance of the magnet from the center
MagnetThickness = 4.5  # Magnet thickness
MagnetWidth = 19  # Magnet width

HalfWidthBetweenSlits = 1.3  # Distance between slits/2
SlitDepth = 1.0  # Slit depth


def drawArcByCenterRadiusAngleFromXAxis(sketch, centerVertexObj, radius, angle):
    """
    Draw an arc on the sketch by specifying the center position, radius, and angle.
    Assume the center point lies on the X-axis.
    """
    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):
    """
    Calculate the position of the vertex located at a specified distance from the specified vertex, 
    in a specified angular direction relative to the X-axis.
    """
    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):
    """Create a region on the sketch from all items in the argument's itemList."""
    selection = geomDoc.GetSelection()
    selection.Clear()
    for item in itemList:
        selection.Add(item)
    sketch.CreateRegions()
    selection.Clear()

def getRegionItemByOrder(sketch, createdOrder):
    """Retrieve the region object in the specified order."""
    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):
    """Create the geometry of a rotor of an I-shaped IPM motor in the sketch."""
    magnetEdgeList = []  # Edges those makes up the magnet
    coreEdgeList = []  # Edges those makes up the core
    
    # Create and fix a vertex at the origin
    originVertex = sketch.CreateVertex(0, 0)
    refOriginVertex = geomDoc.CreateReferenceFromItem(originVertex)
    sketch.CreateMonoConstraint(u"fixture", refOriginVertex)
    
    # Inner and outer arc
    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)
    
    # Create line connecting the inner and outer arcs in the radial direction along the X-axis
    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)
    
    # Create center lines in the radial direction dividing with magnetic pockets
    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)
    
    # Create the magnet region with drawing rectangles
    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)

    # Set name and color for magnet region
    magnetRegion = getRegionItemByOrder(sketch, 1)
    if magnetRegion.GetScriptTypeName() == u"RegionItem":
        magnetRegion.SetName(u"Magnet")
        magnetRegion.SetProperty(u"Color", u"#a0a0a4")
        magnetRegion.SetProperty(u"UseParentColor", 0)

    # Create mirror copy for magnet region
    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)

    # Create a slit
    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))

    # Create the core region
    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)

    # Create mirror copy for core region
    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):
    """Create geometry in the sketch"""
    sketch.OpenSketch()
    
    drawIShapedIPMRotor(sketch)

    sketch.CloseSketch()


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

drawInSketch(newSketch)

Download Python source code

How to use script file

Use the JMAG Script Library after reading and agreeing to the following terms of use.

Search Filter
  • All Categories

An engineer's diary
JMAG-Express Online