Hi @j4n.vokurka .
I did not understand what you meant about array and color.
The following sample displays the area of several selected surfaces and exports them to a file.
# Fusion360API Python script
import traceback
import adsk.fusion
import adsk.core
_app: adsk.core.Application = None
_ui: adsk.core.UserInterface = None
_handlers = []
_facesIpt: adsk.core.SelectionCommandInput = None
_infoIpt: adsk.core.TextBoxCommandInput = None
DEBUG = False
class MyCommandCreatedHandler(adsk.core.CommandCreatedEventHandler):
def __init__(self):
super().__init__()
def notify(self, args: adsk.core.CommandCreatedEventArgs):
dumpMsg(args.firingEvent.name)
try:
global _handlers
cmd: adsk.core.Command = adsk.core.Command.cast(args.command)
inputs: adsk.core.CommandInputs = cmd.commandInputs
# inputs
global _facesIpt
_facesIpt = inputs.addSelectionInput(
'_facesIptId',
'faces',
'select faces'
)
_facesIpt.setSelectionLimits(0)
_facesIpt.addSelectionFilter(adsk.core.SelectionCommandInput.Faces)
global _infoIpt
_infoIpt = inputs.addTextBoxCommandInput(
'_infoIptId',
'total area',
'-',
1,
True
)
# event
onDestroy = MyCommandDestroyHandler()
cmd.destroy.add(onDestroy)
_handlers.append(onDestroy)
onExecute = MyExecuteHandler()
cmd.execute.add(onExecute)
_handlers.append(onExecute)
onInputChanged = MyInputChangedHandler()
cmd.inputChanged.add(onInputChanged)
_handlers.append(onInputChanged)
onValidateInputs = MyValidateInputsHandler()
cmd.validateInputs.add(onValidateInputs)
_handlers.append(onValidateInputs)
except:
_ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
class MyValidateInputsHandler(adsk.core.ValidateInputsEventHandler):
def __init__(self):
super().__init__()
def notify(self, args: adsk.core.ValidateInputsEventArgs):
dumpMsg(args.firingEvent.name)
global _facesIpt
if _facesIpt.selectionCount < 1:
args.areInputsValid = False
class MyInputChangedHandler(adsk.core.InputChangedEventHandler):
def __init__(self):
super().__init__()
def notify(self, args: adsk.core.InputChangedEventArgs):
dumpMsg(args.firingEvent.name)
global _facesIpt, _infoIpt
if args.input != _facesIpt:
return
if _facesIpt.selectionCount < 1:
_facesIpt.commandPrompt = 'select faces'
_infoIpt.text = '-'
return
megArea = getTotalArea()
_facesIpt.commandPrompt = f'total area:{megArea}'
_infoIpt.text = megArea
class MyExecuteHandler(adsk.core.CommandEventHandler):
def __init__(self):
super().__init__()
def notify(self, args: adsk.core.CommandEventArgs):
dumpMsg(args.firingEvent.name)
area = getTotalArea()
exportText(area)
class MyCommandDestroyHandler(adsk.core.CommandEventHandler):
def __init__(self):
super().__init__()
def notify(self, args: adsk.core.CommandEventArgs):
dumpMsg(args.firingEvent.name)
adsk.terminate()
def dumpMsg(s):
if not DEBUG:
return
global _app
_app.log(f'{s}')
print(s)
def getTotalArea() -> str:
global _facesIpt
area = 0
for idx in range(_facesIpt.selectionCount):
face: adsk.fusion.BRepFace = _facesIpt.selection(idx).entity
area += face.area
global _app
unitMgr: adsk.core.UnitsManager = _app.activeProduct.unitsManager
defUnits = unitMgr.defaultLengthUnits
units = unitMgr.formatUnits(f'{defUnits}*{defUnits}')
value = unitMgr.convert(area, unitMgr.internalUnits, units)
return unitMgr.standardizeExpression(str(value), units)
def exportText(txt: str):
def getExportPath() -> str:
dlg: adsk.core.FileDialog = _ui.createFileDialog()
dlg.title = 'export'
dlg.isMultiSelectEnabled = False
dlg.filter = 'Text File(*.txt)'
if dlg.showSave() != adsk.core.DialogResults.DialogOK:
return ''
return dlg.filename
# ****
path = getExportPath()
if len(path) < 1:
return
with open(path, 'w', newline="") as f:
f.write(txt)
def run(context):
try:
global _app, _ui
_app = adsk.core.Application.get()
_ui = _app.userInterface
cmdDef: adsk.core.CommandDefinition = _ui.commandDefinitions.itemById(
'kantoku_total_area_cmd'
)
if not cmdDef:
cmdDef = _ui.commandDefinitions.addButtonDefinition(
'kantoku_total_area_cmd',
'total_area',
'total_area'
)
global _handlers
onCommandCreated = MyCommandCreatedHandler()
cmdDef.commandCreated.add(onCommandCreated)
_handlers.append(onCommandCreated)
cmdDef.execute()
adsk.autoTerminate(False)
except:
if _ui:
_ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))