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.
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.
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)



