# 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() # 寸法パラメータ SphereCenterX = 0 SphereCenterY = 0 SphereCenterZ = 0 SphereRadius = 100 # 方程式名 EqCenterX = u"center_x" EqCenterY = u"center_y" EqCenterZ = u"center_z" EqSphereRadius = u"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 createSphereEquations(): """球の中心座標と半径を方程式として登録する""" designTable = geomDoc.GetDesignTable() equationDataList = [ (EqCenterX, SphereCenterX), (EqCenterY, SphereCenterY), (EqCenterZ, SphereCenterZ), (EqSphereRadius, SphereRadius), ] designTable.EditStart() for equationName, expression in equationDataList: designTable.AddEquation(equationName) equation = designTable.GetEquation(equationName) setupEquation(equation, expression) designTable.EditEnd() def createOffsetXYPlane(part): """center_zでオフセットしたXY平面を作成する""" refXYPlane = part.GetPlaneXY() offsetPlane = part.CreateReferencePlane() offsetPlane.SetTypeByString(u"Distance") offsetPlane.SetPropertyByReference(u"Plane", refXYPlane) offsetPlane.SetProperty(u"Distance", EqCenterZ) return offsetPlane def createSketchOnSpherePlane(part): """center_zでオフセットしたXY平面上にスケッチを作成する""" offsetPlane = createOffsetXYPlane(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 drawBaseShapeForSphere(sketch, radius): """球の断面となる半円と回転軸を作成し、領域を生成する""" sketch.OpenSketch() # 中心点 centerVertex = sketch.CreateVertex(SphereCenterX, SphereCenterY) centerRef = geomDoc.CreateReferenceFromItem(centerVertex) # 球の断面になる半円 arc = sketch.CreateArc( SphereCenterX, SphereCenterY, SphereCenterX, SphereCenterY - radius, SphereCenterX, SphereCenterY + radius ) arcRef = geomDoc.CreateReferenceFromItem(arc) # 中心点のX位置を方程式で拘束する centerXConstraint = sketch.CreateMonoConstraint( u"distancefromyaxis", centerRef ) centerXDistanceExpression = getDistanceExpressionFromSignedValue( EqCenterX, SphereCenterX ) setConstraintExpression(centerXConstraint, u"Distance", centerXDistanceExpression) # 中心点のY位置を方程式で拘束する centerYConstraint = sketch.CreateMonoConstraint( u"distancefromxaxis", centerRef ) centerYDistanceExpression = getDistanceExpressionFromSignedValue( EqCenterY, SphereCenterY ) setConstraintExpression(centerYConstraint, u"Distance", centerYDistanceExpression) # 半径を方程式で拘束する radiusConstraint = sketch.CreateMonoConstraint( u"radius", arcRef ) setConstraintExpression(radiusConstraint, u"Radius", EqSphereRadius) # 回転軸になる半円の直線部 axisLine = sketch.CreateLine( SphereCenterX, SphereCenterY - radius, SphereCenterX, SphereCenterY + radius ) axisRef = geomDoc.CreateReferenceFromItem(axisLine) # 直線部を鉛直にする sketch.CreateMonoConstraint(u"verticality", axisRef) # 直線部が中心点を通るようにする sketch.CreateBiConstraint(u"coincident", axisRef, centerRef) # 半円と直線部から閉じた領域を作成する createRegionFromItems(sketch, [arc, axisLine]) sketch.CloseSketch() return axisLine def createSphereByRevolve(part, sketch, axisLine): """半円領域を半円の直線部を軸として360deg回転させ、球形状を作成する""" revolve = part.CreateRevolveSolid(sketch) revolve.SetTypeByName(u"Outside") revolve.SetProperty(u"AxisType", u"SelectEntity") axisRef = geomDoc.CreateReferenceFromItem(axisLine) revolve.SetAxis(axisRef) revolve.SetAngle(360.0) return revolve def createSpherePart(part): """Part内に方程式付きの球形状を作成する""" sketch = createSketchOnSpherePlane(part) axisLine = drawBaseShapeForSphere(sketch, SphereRadius) createSphereByRevolve(part, sketch, axisLine) def main(): """方程式付きの球形状を持つPartを作成する""" createSphereEquations() part = createNewPart() createSpherePart(part) part.ClosePart() main()