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