# 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() # 寸法パラメータ TorusCenterX = 0 TorusCenterY = 0 TorusCenterZ = 0 TorusRadius = 100 TubeRadius = 20 # 方程式名 EqCenterX = u"center_x" EqCenterY = u"center_y" EqCenterZ = u"center_z" EqTorusRadius = u"torus_radius" EqTubeRadius = u"tube_radius" 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 createTorusEquations(): """トーラスの中心座標、中心半径、チューブ半径を方程式として登録する""" designTable = geomDoc.GetDesignTable() equationDataList = [ (EqCenterX, TorusCenterX), (EqCenterY, TorusCenterY), (EqCenterZ, TorusCenterZ), (EqTorusRadius, TorusRadius), (EqTubeRadius, TubeRadius), ] designTable.EditStart() for equationName, expression in equationDataList: designTable.AddEquation(equationName) equation = designTable.GetEquation(equationName) setupEquation(equation, expression) designTable.EditEnd() def createOffsetZXPlane(part): """center_yでオフセットしたZX平面を作成する""" refZXPlane = part.GetPlaneZX() offsetPlane = part.CreateReferencePlane() offsetPlane.SetTypeByString(u"Distance") offsetPlane.SetPropertyByReference(u"Plane", refZXPlane) offsetPlane.SetProperty(u"Distance", EqCenterY) return offsetPlane def createSketchOnTorusPlane(part): """center_yでオフセットしたZX平面上にスケッチを作成する""" offsetPlane = createOffsetZXPlane(part) offsetPlaneRef = geomDoc.CreateReferenceFromItem(offsetPlane) sketch = part.CreateSketch(offsetPlaneRef) return sketch def createRegionFromItems(sketch, itemList): """引数のitemListすべてからスケッチ上に領域を作成する""" selection = geomDoc.GetSelection() selection.Clear() for item in itemList: selection.Add(item) sketch.CreateRegions() selection.Clear() def setConstraintExpression(constraint, propertyName, equationName): """拘束寸法に方程式名を設定する""" constraint.SetProperty(propertyName, equationName) def getDistanceExpressionFromSignedValue(equationName, value): """符号付き座標値から、距離拘束に使用する正の式を返す""" if value < 0: return u"-" + equationName return equationName def drawBaseShapeForTorus(sketch, torusRadius, tubeRadius): """トーラスの断面となる円と回転軸を作成し、領域を生成する""" sketch.OpenSketch() # ZX平面上のスケッチでは、スケッチX方向をZ方向、スケッチY方向をX方向として扱う。 sketchCenterX = TorusCenterZ sketchCenterY = TorusCenterX # トーラス中心 centerVertex = sketch.CreateVertex(sketchCenterX, sketchCenterY) centerRef = geomDoc.CreateReferenceFromItem(centerVertex) # トーラスの回転軸 axisLine = sketch.CreateLine( sketchCenterX - torusRadius, sketchCenterY, sketchCenterX + torusRadius, sketchCenterY ) axisRef = geomDoc.CreateReferenceFromItem(axisLine) # 回転軸を水平にし、トーラス中心を通るように拘束する sketch.CreateMonoConstraint(u"horizontality", axisRef) sketch.CreateBiConstraint(u"coincident", axisRef, centerRef) # トーラス中心のX位置を方程式で拘束する centerXConstraint = sketch.CreateMonoConstraint( u"distancefromxaxis", centerRef ) centerXDistanceExpression = getDistanceExpressionFromSignedValue( EqCenterX, TorusCenterX ) setConstraintExpression(centerXConstraint, u"Distance", centerXDistanceExpression) # トーラス中心のZ位置を方程式で拘束する centerZConstraint = sketch.CreateMonoConstraint( u"distancefromyaxis", centerRef ) centerZDistanceExpression = getDistanceExpressionFromSignedValue( EqCenterZ, TorusCenterZ ) setConstraintExpression(centerZConstraint, u"Distance", centerZDistanceExpression) # チューブ断面の中心 tubeCenterVertex = sketch.CreateVertex( sketchCenterX, sketchCenterY + torusRadius ) tubeCenterRef = geomDoc.CreateReferenceFromItem(tubeCenterVertex) # トーラス中心からチューブ断面中心までの距離を表す補助線 radiusLine = sketch.CreateLine( sketchCenterX, sketchCenterY, sketchCenterX, sketchCenterY + torusRadius ) radiusLineRef = geomDoc.CreateReferenceFromItem(radiusLine) # 補助線を回転軸に垂直にし、チューブ断面中心までの距離を方程式で拘束する sketch.CreateBiConstraint(u"perpendicularity", axisRef, radiusLineRef) sketch.CreateBiConstraint(u"coincident", radiusLineRef, centerRef) sketch.CreateBiConstraint(u"coincident", radiusLineRef, tubeCenterRef) torusRadiusConstraint = sketch.CreateBiConstraint( u"distance", centerRef, tubeCenterRef ) setConstraintExpression(torusRadiusConstraint, u"Distance", EqTorusRadius) # チューブ断面になる円 tubeCircle = sketch.CreateCircle( sketchCenterX, sketchCenterY + torusRadius, tubeRadius ) tubeCircleRef = geomDoc.CreateReferenceFromItem(tubeCircle) # チューブ断面の半径を方程式で拘束する tubeRadiusConstraint = sketch.CreateMonoConstraint( u"radius", tubeCircleRef ) setConstraintExpression(tubeRadiusConstraint, u"Radius", EqTubeRadius) # チューブ断面の円から閉じた領域を作成する createRegionFromItems(sketch, [tubeCircle]) sketch.CloseSketch() return axisLine def createTorusByRevolve(part, sketch, axisLine): """円領域を回転軸まわりに360deg回転させ、トーラス形状を作成する""" revolve = part.CreateRevolveSolid(sketch) revolve.SetTypeByName(u"OneSide") revolve.SetProperty(u"AxisType", u"SelectEntity") axisRef = geomDoc.CreateReferenceFromItem(axisLine) revolve.SetAxis(axisRef) revolve.SetAngle(360.0) return revolve def createTorusPart(part): """Part内に方程式付きのトーラス形状を作成する""" sketch = createSketchOnTorusPlane(part) axisLine = drawBaseShapeForTorus(sketch, TorusRadius, TubeRadius) createTorusByRevolve(part, sketch, axisLine) def main(): """方程式付きのトーラス形状を持つPartを作成する""" createTorusEquations() part = createNewPart() createTorusPart(part) part.ClosePart() main()