こちら、同じお悩みをお抱えの方です。
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だと返ってきます・・・間違ってます。
恐らく単位の問題だけだろうと思うので、届く可能性が有りそう。
(肝心な方は進んでいない)