Hi! In my daily workflow i have to create a lot of setups, so I'd like to make this a little bit faster by creating a script. But i'm struggeling getting my selected Body as setup.models and my Component Fixtures as setup.fixtures. Everything else is working as it is supposed to be.
I hope anybody can help me.
import adsk.core, adsk.fusion, adsk.cam, traceback
import os
from enum import Enum
def run(context):
ui = None
try:
app = adsk.core.Application.get()
ui = app.userInterface
product = app.activeProduct
design = adsk.fusion.Design.cast(product)
# use existing document, load 2D Strategies model from the Fusion CAM Samples folder
doc = app.activeDocument
#Start AutoSetup
ui.messageBox('Start AutoSetup')
# Select Part
# Select Part
ui.messageBox('Select Part')
selectedEntity = ui.selectEntity('Select the part to machine', 'Bodies')
# Überprüfen, ob ein Körper ausgewählt wurde
if selectedEntity is None:
ui.messageBox('Kein Körper ausgewählt. Das Skript wird beendet.')
return
ui.messageBox('Part Selected')
#WCS
WCS = design.userParameters.itemByName('wcs').expression
ui.messageBox('WCS {} is selected'.format(WCS))
# switch to manufacturing space
camWS = ui.workspaces.itemById('CAMEnvironment')
camWS.activate()
# get the CAM product
products = doc.products
#################### create setup ####################
#################### create setup ####################
cam = adsk.cam.CAM.cast(products.itemByProductType("CAMProductType"))
setups = cam.setups
setupInput = setups.createInput(adsk.cam.OperationTypes.MillingOperation)
# This part is not working !
models = adsk.core.ObjectCollection.create()
models.add(selectedEntity[0])
setupInput.models = models
# create the setup
setup = setups.add(setupInput)
docname = app.activeDocument.name
setup.name = docname
setup.fixtureEnabled = True
programNameParam = setup.parameters.itemByName('job_programName')
programNameParam.expression = "'{}'".format(docname)
programWorkoffsetParam = setup.parameters.itemByName('job_workOffset')
programWorkoffsetParam.expression = WCS
except:
if ui:
ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
Solved! Go to Solution.
Solved by kandennti. Go to Solution.
Hi @j_zander -San.
The most likely reason is that you are using an ObjectCollection object.
You can set it up using a list.
I was also able to set the fixtures using cam.SetupInput.
The following sample was tested with the attached f3d.
# Fusion360API Python script
import traceback
import adsk.core as core
import adsk.fusion as fusion
import adsk.cam as cam
def run(context):
ui: core.UserInterface = None
try:
app: core.Application = core.Application.get()
ui = app.userInterface
camObj: cam.CAM = get_cam_product()
rootOcc: fusion.Occurrence = camObj.designRootOccurrence
root: fusion.Component = rootOcc.component
setup: cam.Setup = create_setup(
camObj,
root.bRepBodies[0],
root.allOccurrences[0]
)
ui.messageBox("Done")
except:
if ui:
ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
def create_setup(
camObj: cam.CAM,
targetBody: fusion.BRepBody,
fixture: core.Base,
) -> cam.Setup:
setups: cam.Setups = camObj.setups
setupIpt: cam.SetupInput = setups.createInput(
cam.OperationTypes.MillingOperation
)
setupIpt.models = [targetBody]
setupIpt.fixtures = [fixture]
setup: cam.Setup = setups.add(setupIpt)
return setup
def get_cam_product() -> cam.CAM:
app: core.Application = core.Application.get()
activete_cam_env()
return app.activeProduct
def activete_cam_env() -> None:
app: core.Application = core.Application.get()
ui: core.UserInterface = app.userInterface
camWS: core.Workspace = ui.workspaces.itemById('CAMEnvironment')
camWS.activate()
The result looks like this
Thanks for your help. The Solution is ok but in your script the setupmodel has to be a body and can't be a component. And in my project Fixture is a vise with a few components. The script just adds the first component of the fixture components. Also the script uses the first component it's finding. In my case it is the stockmodel i use to position my parts inside my vise. This should be ignored.
Is it possible to Select a whole component by name with everything inside of it? Then i just could put my body that should be machined inside of the targetBodyComponent and its automatically selectet.
I attach my fixture file here. Thanks for your help 🙂
I
@j_zander -San.
I may not be understanding what you mean.
Do you mean like this?
# Fusion360API Python script
import traceback
import adsk.core as core
import adsk.fusion as fusion
import adsk.cam as cam
def run(context):
ui: core.UserInterface = None
try:
app: core.Application = core.Application.get()
ui = app.userInterface
camObj: cam.CAM = get_cam_product()
rootOcc: fusion.Occurrence = camObj.designRootOccurrence
root: fusion.Component = rootOcc.component
# models
modelsOcc: fusion.Occurrence = root.allOccurrences.itemByName("targetBody:1")
if not modelsOcc: return
# fixtures:
fixturesOcc: fusion.Occurrence = root.allOccurrences.itemByName("Fixture:1")
if not fixturesOcc: return
setup: cam.Setup = create_setup(
camObj,
[modelsOcc],
[fixturesOcc],
)
ui.messageBox("Done")
except:
if ui:
ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
def create_setup(
camObj: cam.CAM,
models: list[core.Base],
fixtures: list[core.Base],
) -> cam.Setup:
setups: cam.Setups = camObj.setups
setupIpt: cam.SetupInput = setups.createInput(
cam.OperationTypes.MillingOperation
)
setupIpt.models = models
setupIpt.fixtures = fixtures
setup: cam.Setup = setups.add(setupIpt)
return setup
def get_cam_product() -> cam.CAM:
app: core.Application = core.Application.get()
activete_cam_env()
return app.activeProduct
def activete_cam_env() -> None:
app: core.Application = core.Application.get()
ui: core.UserInterface = app.userInterface
camWS: core.Workspace = ui.workspaces.itemById('CAMEnvironment')
camWS.activate()
Can't find what you're looking for? Ask the community or share your knowledge.