From 26ad07d076c4e3a1586325a44ac0bfea2754d336 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Gonz=C3=A1lez?= Date: Wed, 5 Nov 2025 10:35:53 +0100 Subject: [PATCH] =?UTF-8?q?Preparo=20para=20f=C3=B3rmulas=20que=20devuelve?= =?UTF-8?q?n=20cadenas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .metadata | 25 +++++-------------------- lib/ai/formula_screen.dart | 27 +++++++++++++++++++-------- lib/formula_evaluator.dart | 35 +++++++++++++++++++++++++++++------ 3 files changed, 53 insertions(+), 34 deletions(-) diff --git a/.metadata b/.metadata index 3f600b8..0bb2266 100644 --- a/.metadata +++ b/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: "077b4a4ce10a07b82caa6897f0c626f9c0a3ac90" + revision: "05db9689081f091050f01aed79f04dce0c750154" channel: "stable" project_type: app @@ -13,26 +13,11 @@ project_type: app migration: platforms: - platform: root - create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 - base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 - - platform: android - create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 - base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 - - platform: ios - create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 - base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 - - platform: linux - create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 - base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 - - platform: macos - create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 - base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 + create_revision: 05db9689081f091050f01aed79f04dce0c750154 + base_revision: 05db9689081f091050f01aed79f04dce0c750154 - platform: web - create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 - base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 - - platform: windows - create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 - base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 + create_revision: 05db9689081f091050f01aed79f04dce0c750154 + base_revision: 05db9689081f091050f01aed79f04dce0c750154 # User provided section diff --git a/lib/ai/formula_screen.dart b/lib/ai/formula_screen.dart index 6218063..81d82ad 100644 --- a/lib/ai/formula_screen.dart +++ b/lib/ai/formula_screen.dart @@ -26,7 +26,7 @@ class D4rtEditingController extends TextEditingController { String? _lastError; String? get lastError => _lastError; - Number? _lastValue; + FormulaResult? _lastValue; D4rtEditingController({String? text}) : super(text: text); @@ -36,8 +36,10 @@ class D4rtEditingController extends TextEditingController { _lastValue = FormulaEvaluator.evaluateExpression(text); _lastError = null; return true; - } catch (e) { + } catch (e, s) { _lastError = e.toString(); + print( "validate: $text: $e" ); + print( "stack: $s" ); return false; } } @@ -98,15 +100,24 @@ class _FormulaScreenState extends State { if( controller.d4rtValue == null ){ throw FormulaEvaluationException( "Field ${input.name} is invalid" ); } - final value = controller.d4rtValue; + final value = controller.d4rtValue.value; // Convert input to base unit if needed // Always convert from dropdown unit to variable's base unit - inputValues[input.name] = widget.corpus.convert( - value, - _selectedUnits[input.name]!, - input.unit, - ); + late final convertedValue; + if( value is Number ) { + convertedValue = widget.corpus.convert( + value, + _selectedUnits[input.name]!, + input.unit, + ); + } + else{ + convertedValue = value; + } + + inputValues[input.name] = convertedValue; + } final evaluator = FormulaEvaluator(); diff --git a/lib/formula_evaluator.dart b/lib/formula_evaluator.dart index 9a668e9..0665b38 100644 --- a/lib/formula_evaluator.dart +++ b/lib/formula_evaluator.dart @@ -25,6 +25,20 @@ class MyMath{ static Number myPow(Number b, Number e) => Math.pow(b,e) as Number; } +class FormulaResult{ + const FormulaResult(); +} + +class StringResult extends FormulaResult{ + final String value; + const StringResult(this.value); +} + +class NumberResult extends FormulaResult{ + final Number value; + const NumberResult(this.value); +} + class FormulaEvaluator { final D4rt _interpreter; @@ -34,7 +48,7 @@ class FormulaEvaluator { prepareInterpreter(_interpreter); } - static Number getNumberValueOf(String s){ + static Number _getNumberValueOf(String s){ return double.parse(s); } @@ -44,12 +58,12 @@ class FormulaEvaluator { name: 'MyMath', staticMethods: { 'myPow': (visitor, positionalArgs, namedArgs) { - final Number base = getNumberValueOf( positionalArgs[0].toString() ); - final Number exp = getNumberValueOf( positionalArgs[1].toString() ); + final Number base = _getNumberValueOf( positionalArgs[0].toString() ); + final Number exp = _getNumberValueOf( positionalArgs[1].toString() ); return MyMath.myPow(base,exp); }, 'myLog': (visitor, positionalArgs, namedArgs) { - final Number x = getNumberValueOf( positionalArgs[0].toString() ); + final Number x = _getNumberValueOf( positionalArgs[0].toString() ); return MyMath.myLog(x); }, } @@ -58,7 +72,7 @@ class FormulaEvaluator { interpreter.registerBridgedClass(myMathDefinition, "package:d4rt_formulas.dart"); } - static dynamic evaluateExpression(String code, [D4rt? interpreter]) { + static FormulaResult evaluateExpression(String code, [D4rt? interpreter]) { final d4rtInterpreter = interpreter ?? createDefaultInterpreter(); prepareInterpreter(d4rtInterpreter); final d4rtCode = """ @@ -71,7 +85,16 @@ class FormulaEvaluator { }"""; //print("evaluateExpression:\n$d4rtCode"); final result = d4rtInterpreter.execute(source: d4rtCode); - return result.toDouble(); + switch ( result ){ + case int value: + return NumberResult(value.toDouble()); + case Number value: + return NumberResult(value); + case String value: + return StringResult(value); + default: + throw FormulaEvaluationException( "Unexpected result type: ${result.runtimeType} -- $result" ); + } } dynamic evaluate(Formula formula, Map inputValues) {