Limited, but seems to have reached the goal.
(The root component is only)
The following sample creates 10 bodies and divides them into two groups.
# Fusion360API Python script-sample_CreateBodyGroup
# Fusion360 ver2.0.9313
import adsk.core, adsk.fusion, traceback
_app = adsk.core.Application.cast(None)
_ui = adsk.core.UserInterface.cast(None)
import json
def createBoxesGroup(
groupName :str,
bodiesList :list
):
app = adsk.core.Application.get()
ui = app.userInterface
des :adsk.fusion.Design = _app.activeProduct
root :adsk.fusion.Component = des.rootComponent
# selections
sels :adsk.core.Selections = ui.activeSelections
sels.clear()
# select root bodies
bodies :adsk.fusion.BRepBodies = root.bRepBodies
sels.add(bodies)
# Create SurfaceGroup
app.executeTextCommand(u'Commands.Start FusionCreateSurfaceGroupCommand')
# get SurfaceGroups Properties
# SurfaceGroups(SurfaceGroupsMetaType id: 21)
surfaceGroupsProp = app.executeTextCommand(u'PEntity.Properties 21')
# Convert to json
surfaceGroups = json.loads(surfaceGroupsProp)
# SurfaceGroup count
surfaceGroups_count = len(surfaceGroups['children'])
# print(str(surfaceGroups_count))
# get Target Id
targetId = surfaceGroups['children'][surfaceGroups_count - 1]['entityId']
# Rename SurfaceGroup
app.executeTextCommand(u'PInterfaces.Rename {} {}'.format(targetId, groupName))
# select bodiesList
[sels.add(body) for body in bodiesList]
# select SurfaceGroup
# https://github.com/kantoku-code/Fusion360_Small_Tools_for_Developers/blob/master/TextCommands/TextCommands_txt_Ver2_0_8176.txt#L2058
# Except for the root component, the <Paths> need to be changed.
app.executeTextCommand(u'Selections.Add 57:3:21:{}'.format(targetId))
# exec FusionMoveToSurfaceGroupCommand
app.executeTextCommand(u'Commands.Start FusionMoveToSurfaceGroupCommand')
app.executeTextCommand(u'NuCommands.CommitCmd')
def createBoxes(
comp :adsk.fusion.Component,
count :int
):
def createBox(
comp :adsk.fusion.Component,
pnt :adsk.core.Point3D
) -> adsk.fusion.BRepBody:
vec3D = adsk.core.Vector3D
lVec = vec3D.create(1.0, 0.0, 0.0)
wVec= vec3D.create(0.0, 1.0, 0.0)
bouBox3D = adsk.core.OrientedBoundingBox3D
box = bouBox3D.create(pnt, lVec, wVec, 10, 10, 10)
tmpBrMgr = adsk.fusion.TemporaryBRepManager.get()
baseFeats = comp.features.baseFeatures
baseFeat = baseFeats.add()
baseFeat.startEdit()
cube :adsk.fusion.BRepBody = comp.bRepBodies.add(tmpBrMgr.createBox(box),baseFeat)
baseFeat.finishEdit()
return cube
# return boxis
for idx in range(count):
createBox(
comp,
adsk.core.Point3D.create(0.0 + float(20.0 * idx), 0.0, 0.0))
def run(context):
try:
global _app, _ui
_app = adsk.core.Application.get()
_ui = _app.userInterface
_app.documents.add(adsk.core.DocumentTypes.FusionDesignDocumentType)
des :adsk.fusion.Design = _app.activeProduct
root :adsk.fusion.Component = des.rootComponent
# createBoxes
createBoxes(root, 10)
# message
vp :adsk.core.Viewport = _app.activeViewport
vp.fit()
_ui.messageBox('Group the bodies.')
# Grouping
groupOdd = [box for idx,box in enumerate(root.bRepBodies) if idx % 2 == 0]
groupEven = [box for idx,box in enumerate(root.bRepBodies) if idx % 2 != 0]
# createBoxesGroup
createBoxesGroup('Odd', groupOdd)
createBoxesGroup('Even', groupEven)
except:
if _ui:
_ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
Although limited to the root component, I think it will work if you copy the createBoxesGroup function and call it with a group name and a list of bodies as parameters.

I could learn a lot from it. Thank you.