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