Hi @balunist .
If the only conditions are startPoint, endPoint, and radius, four arcs are candidates. I think that is why the method cannot be prepared.

I have created a sample that finds 4 transit points and creates all arcs.
# Fusion360API Python script
import traceback
import adsk.fusion
import adsk.core
import math
import itertools
def run(context):
ui: adsk.core.UserInterface = None
try:
app: adsk.core.Application = adsk.core.Application.get()
ui = app.userInterface
des: adsk.fusion.Design = app.activeProduct
msg: str = 'Select Sketch Point(start)'
selFilter: str = 'SketchPoints'
sel: adsk.core.Selection = selectEnt(msg, selFilter)
if not sel:
return
startPnt: adsk.fusion.SketchPoint = sel.entity
msg = 'Select Sketch Point(end)'
sel = selectEnt(msg, selFilter)
if not sel:
return
endPnt: adsk.fusion.SketchPoint = sel.entity
length = startPnt.worldGeometry.distanceTo(
endPnt.worldGeometry
)
unitMgr: adsk.core.UnitsManager = des.unitsManager
msg = 'Enter the radius.\n'
msg += f'({unitMgr.formatInternalValue(length * 0.5)} or more)'
res, cancelled = ui.inputBox(
msg,
'',
str(
unitMgr.convert(
length * 0.5,
unitMgr.internalUnits,
unitMgr.defaultLengthUnits
) + 1
)
)
if cancelled:
return
if not isFloat(res):
return
radius = unitMgr.convert(
float(res),
unitMgr.defaultLengthUnits,
unitMgr.internalUnits
)
if radius < length * 0.5:
return
createTwoPointsRadiusArcs(
startPnt,
endPnt,
radius,
)
except:
if ui:
ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
def isFloat(s) -> bool:
try:
float(s)
return True
except:
return False
def createTwoPointsRadiusArcs(
startPnt: adsk.fusion.SketchPoint,
endPnt: adsk.fusion.SketchPoint,
radius: float):
def getMidPoint(
sPnt: adsk.core.Point3D,
ePnt: adsk.core.Point3D) -> adsk.core.Point3D:
return adsk.core.Point3D.create(
(sPnt.x + ePnt.x) * 0.5,
(sPnt.y + ePnt.y) * 0.5,
(sPnt.z + ePnt.z) * 0.5,
)
def getOffsetVector(
p1: adsk.core.Point3D,
p2: adsk.core.Point3D,
vec: adsk.core.Vector3D) -> adsk.core.Vector3D:
v: adsk.core.Vector3D = vec.crossProduct(
p1.vectorTo(p2)
)
v.normalize()
return v
def getCenterPoints(
sPnt: adsk.core.Point3D,
mPnt: adsk.core.Point3D,
r: float,
offsetVec: adsk.core.Vector3D) -> list:
l1 = sPnt.distanceTo(mPnt)
theta = math.acos(l1 / r)
vec: adsk.core.Vector3D = offsetVec.copy()
vec.scaleBy(
math.tan(theta) * l1
)
centers = []
for scl in [1, -1]:
v: adsk.core.Vector3D = vec.copy()
v.scaleBy(scl)
p: adsk.core.Point3D = mPnt.copy()
p.translateBy(v)
centers.append(p)
return centers
def getTransitPoints(
centers: list,
r: float,
offsetVec: adsk.core.Vector3D) -> list:
vec: adsk.core.Vector3D = offsetVec.copy()
vec.scaleBy(r)
vecs = []
for s in [1, -1]:
v: adsk.core.Vector3D = vec.copy()
v.scaleBy(s)
vecs.append(v)
pnts = []
for pnt, v in itertools.product(centers, vecs):
p = pnt.copy()
p.translateBy(v)
pnts.append(p)
return pnts
def createArcs(
skt: adsk.fusion.Sketch,
sPnt: adsk.core.Point3D,
ePnt: adsk.core.Point3D,
transitPoints: list):
arcs: adsk.fusion.SketchArcs = skt.sketchCurves.sketchArcs
arcLst = []
skt.isComputeDeferred = True
for mPnt in transitPoints:
p1: adsk.core.Point3D = skt.modelToSketchSpace(sPnt)
p2: adsk.core.Point3D = skt.modelToSketchSpace(mPnt)
p3: adsk.core.Point3D = skt.modelToSketchSpace(ePnt)
arcLst.append(arcs.addByThreePoints(p1, p2, p3))
skt.isComputeDeferred = False
# ********
skt: adsk.fusion.Sketch = startPnt.parentSketch
sPnt: adsk.core.Point3D = startPnt.worldGeometry
ePnt: adsk.core.Point3D = endPnt.worldGeometry
# midPoint
midPnt: adsk.core.Point3D = getMidPoint(sPnt, ePnt)
# offset vector
vec: adsk.core.Vector3D = getOffsetVector(
sPnt,
ePnt,
skt.xDirection.crossProduct(
skt.yDirection
)
)
# center points
centers = getCenterPoints(
sPnt,
midPnt,
radius,
vec
)
# transit points
transitPnts = getTransitPoints(
centers,
radius,
vec
)
# arcs
createArcs(
skt,
sPnt,
ePnt,
transitPnts
)
def selectEnt(
msg: str,
filterStr: str) -> adsk.core.Selection:
try:
app = adsk.core.Application.get()
ui = app.userInterface
sel = ui.selectEntity(msg, filterStr)
return sel
except:
return None