Hi @ivr22 .
It looked like fun, so I gave it a try.
# Fusion360API Python script
import adsk.core, adsk.fusion, traceback
def run(context):
ui = adsk.core.UserInterface.cast(None)
try:
app :adsk.fusion.Application = adsk.core.Application.get()
ui = app.userInterface
# select body
msg :str = 'Select Body'
selFiltter :str = 'Bodies'
sel :adsk.core.Selection = selectEnt(msg ,selFiltter)
if not sel: return
body :adsk.fusion.BRepBody = sel.entity
# select guide curve
msg = 'Select Guide Curve (SketchCurves)'
selFiltter = 'SketchCurves'
sel :adsk.core.Selection = selectEnt(msg ,selFiltter)
if not sel: return
crv :adsk.fusion.SketchCurve = sel.entity
# create Cross Section Surfaces
createCrossSections(body, crv, 100)
# finish
ui.messageBox('Done')
except:
if ui:
ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
def createCrossSections(
body :adsk.fusion.BRepBody,
sktCrv :adsk.fusion.SketchCurve,
count :int) -> list:
# -- support function --
def getParams(
crv :adsk.core.Curve3D) -> list:
# get Evaluator
eva :adsk.core.CurveEvaluator3D = crv.evaluator
# get start end point
_, startPnt, endPnt = eva.getEndPoints()
# get start/end parameter
_, sPrm = eva.getParameterAtPoint(startPnt)
_, ePrm = eva.getParameterAtPoint(endPnt)
# get length
_, length = eva.getLengthAtParameter(sPrm, ePrm)
# get step
step = length / (count + 1)
# get parameter
prms = []
for idx in range(1,count+1):
_, prm = eva.getParameterAtLength(sPrm, step * idx)
prms.append(prm)
return prms
def getPlanes(
crv :adsk.core.Curve3D,
parameters :list) -> list:
# get Evaluator
eva :adsk.core.CurveEvaluator3D = crv.evaluator
# get tangent
_, tangents = eva.getTangents(parameters)
tans = [t for t in tangents]
# point3d
_, points = eva.getPointsAtParameters(parameters)
pnts = [p for p in points]
# plane
Plane = adsk.core.Plane
return [Plane.create(p, v) for p, v in zip(pnts, tans)]
def initCrossSections(
body :adsk.fusion.BRepBody,
planes :list) -> list:
tmpMgr :adsk.fusion.TemporaryBRepManager = adsk.fusion.TemporaryBRepManager.get()
surfs = []
for pln in planes:
wire = tmpMgr.planeIntersection(body, pln)
if not wire:
continue
surf = tmpMgr.createFaceFromPlanarWires([wire])
if not surf:
continue
surfs.append(surf)
return surfs
def addSurfs(
comp :adsk.fusion.Component,
surfs :list) -> list:
bodies = comp.bRepBodies
des :adsk.fusion.Design = comp.parentDesign
breps =[]
if des.designType == adsk.fusion.DesignTypes.DirectDesignType:
breps = [bodies.add(surf) for surf in surfs]
else:
baseFeatures = comp.features.baseFeatures
baseFeature = baseFeatures.add()
baseFeature.startEdit()
for surf in surfs:
try:
breps.append(bodies.add(surf, baseFeature))
except:
pass
baseFeature.finishEdit()
return breps
# ----
# Curve
crv = sktCrv.worldGeometry
# Params
prms = getParams(crv)
# Planes
plns = getPlanes(crv, prms)
# CrossSections
surfs = initCrossSections(body, plns)
# add surfaces
comp = sktCrv.parentSketch.parentComponent
breps = addSurfs(comp, surfs)
return breps
def selectEnt(
msg :str,
filtterStr :str) -> adsk.core.Selection :
try:
app = adsk.core.Application.get()
ui = app.userInterface
sel = ui.selectEntity(msg, filtterStr)
return sel
except:
return None

However, I don't think you can get the same results with anything other than the root component.
Also, if you have a cut that has multiple cross sections, you will have multiple surfaces.