@awilliamwright .
Now that we know the cause of the misalignment, we created a script.
When the script is run, a dialog box appears to enter the scaling ratio, so enter any number.
# Fusion360API Python script
import traceback
import adsk.core as core
import adsk.fusion as fusion
def run(context):
ui = core.UserInterface.cast(None)
try:
app: core.Application = core.Application.get()
ui = app.userInterface
msg = '\n'.join(
[
'Scales all displayed bodies at once.',
'Enter the scaling ratio.',
]
)
scale, res = ui.inputBox(
msg,
'scaling',
'0.75',
)
if res:
return
if not is_float(scale):
return
exec_occurrence_show_bodies_scaling(
float(scale)
)
ui.messageBox('Done')
except:
if ui:
ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
def exec_occurrence_show_bodies_scaling(
scale: float
) -> None:
bodyLst: list = get_show_bodies()
occLst: list = get_occ_list_by_bodies(bodyLst)
move_occs(occLst, scale)
app: core.Application = core.Application.get()
des: fusion.Design = app.activeProduct
des.snapshots.add()
exec_scaling(bodyLst, scale)
def get_unique_bodies(
bodyLst: list,
) -> list:
dict = {}
body: fusion.BRepBody = None
for body in bodyLst:
dict.setdefault(
body.parentComponent.entityToken,
body,
)
return list(dict.values())
def exec_scaling(
bodyLst: list,
scale: float,
) -> None:
app: core.Application = core.Application.get()
des: fusion.Design = app.activeProduct
root: fusion.Component = des.rootComponent
bodyLstUnique = get_unique_bodies(bodyLst)
rootBodyLst = [b for b in bodyLst if b.parentComponent == root]
bodyLstUnique.extend(rootBodyLst)
objs: core.ObjectCollection = core.ObjectCollection.create()
[objs.add(occ) for occ in bodyLstUnique]
scaleFeats: fusion.ScaleFeatures = root.features.scaleFeatures
scaleIpt: fusion.ScaleFeatureInput = scaleFeats.createInput(
objs,
root.originConstructionPoint,
core.ValueInput.createByReal(scale),
)
scaleFeats.add(scaleIpt)
def move_occs(
occLst: list,
scale: float,
) -> None:
occ: fusion.Occurrence = None
for occ in occLst:
mat: core.Matrix3D = occ.transform2.copy()
origin, xAxis, yAxis, zAxis = mat.getAsCoordinateSystem()
ary = origin.asArray()
ary = [v * scale for v in ary]
origin.setWithArray(ary)
mat.setWithCoordinateSystem(origin, xAxis, yAxis, zAxis)
occ.transform2 = mat
def get_occ_list_by_bodies(
bodyLst: list
) -> list:
app: core.Application = core.Application.get()
des: fusion.Design = app.activeProduct
root: fusion.Component = des.rootComponent
dict = {}
body: fusion.BRepBody = None
for body in bodyLst:
if body.parentComponent == root:
continue
occ: fusion.Occurrence = body.assemblyContext
dict.setdefault(
occ.entityToken,
occ,
)
return list(dict.values())
def get_show_bodies() -> list:
app: core.Application = core.Application.get()
des: fusion.Design = app.activeProduct
root: fusion.Component = des.rootComponent
bodyLst = root.findBRepUsingPoint(
core.Point3D.create(0,0,0),
fusion.BRepEntityTypes.BRepBodyEntityType,
10000000000,
True,
)
return [b for b in bodyLst]
def is_float(
txt: str
) -> bool:
try:
float(txt)
return True
except ValueError:
return False
The position of the component (occurrence) is moved in advance to be in the proper position after scaling.

It is possible that this may not work, as I just checked with the attached data.