C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

tokenize.generate_tokens

こちら、同じお悩みをお抱えの方です。
Re: How to get the final value of CAMParameter - Autodesk Community

式として入力された結果を得たいのですが、デザインは可能でCAMは出来ないんです。
式の文字列からパラメータを再度取得して・・・と言う感じの再帰的な事をやれば
取得出来そうな気はしていたのですが、文字列を計算式としてどう解析すれば良いのか
分かっていませんでした。(正規表現なら・・・とも思っていましたが)

tokenizeと言う標準ライブラリがある事を知りました。
regex - Pythonで数式文字列をトークンに分割する - 初心者向けチュートリアル

それっぽく修正したつもり。

import adsk.core, adsk.fusion, adsk.cam, traceback
from io import StringIO
import tokenize

_app = adsk.core.Application.cast(None)
_ui = adsk.core.UserInterface.cast(None)
_cam = None

def run(context):
    try:
        global _app, _ui, _cam
        _app = adsk.core.Application.get()
        _ui = _app.userInterface

        doc = _app.activeDocument
        products = doc.products
        product = products.itemByProductType('CAMProductType')
        _cam = adsk.cam.CAM.cast(product)

        ope :adsk.cam.Operation = _cam.allOperations[0]

        stayDownDistance :adsk.cam.CAMParameter = ope.parameters.itemByName('stayDownDistance')

        print('title:{}\nname:{}\nexpression:{}'.format(
            stayDownDistance.title,
            stayDownDistance.name,
            stayDownDistance.expression
        ))
        # 上手く行ってない
        returnValue = adsk.core.ValueInput.createByString(stayDownDistance.expression)
        
        # 正しくない
        expression = getRealValue(stayDownDistance.expression, ope.parameters)
        res = eval(''.join(expression))
        print(f'{stayDownDistance.expression} -> {res}')

    except:
        if _ui:
            _ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

# https://tutorialmore.com/questions-976968.htm
def getRealValue(
    formula :str,
    operation_parameters :adsk.cam.CAMParameters
    ):

    global _cam
    unitMgr =  _cam.unitsManager

    try:
        value = unitMgr.evaluateExpression(formula)
        return str(value)
    except:
        pass

    tokens = [token[1] for token in tokenize.generate_tokens(StringIO(formula).readline) if token[1]]
    operations = ('+','-','*','/','(',')')
    expression = []
    for token in tokens:

        try:
            value = unitMgr.evaluateExpression(token)
            expression.append(str(value))
            continue
        except:
            pass

        if token.isnumeric():
            expression.append(token)
        elif token in operations:
            expression.append(token)
        else:
            try:
                prm = operation_parameters.itemByName(token)

                res = getRealValue(prm.expression, operation_parameters)
                expression.extend(res)
            except:
                pass

    return  expression

10インチが64.51599999999999だと返ってきます・・・間違ってます。
恐らく単位の問題だけだろうと思うので、届く可能性が有りそう。
(肝心な方は進んでいない)