using System; using System.Globalization; using System.Windows; using System.Windows.Data; namespace CtrEditor.Converters { /// /// Converter para calcular el margen de las secciones del tanque /// basado en los porcentajes de las secciones previas /// public class TankSectionMarginConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { if (values == null || values.Length < 2) return new Thickness(4, 4, 4, 4); // Convertir valores a double if (!TryConvertToDouble(values[values.Length - 1], out double tankSize)) return new Thickness(4, 4, 4, 4); // Calcular la altura total acumulada de las secciones previas double accumulatedPercentage = 0.0; for (int i = 0; i < values.Length - 1; i++) // -1 para excluir tankSize { if (TryConvertToDouble(values[i], out double percentage)) { accumulatedPercentage += percentage; } } try { // Convertir tankSize a píxeles (100 píxeles por metro aproximadamente) var tankHeightPixels = tankSize * 100.0; // Calcular altura acumulada en píxeles var accumulatedHeightPixels = (accumulatedPercentage / 100.0) * tankHeightPixels; // Calcular margen bottom basado en la altura acumulada var marginBottom = 4.0 + accumulatedHeightPixels; return new Thickness(4, 4, 4, marginBottom); } catch (Exception) { return new Thickness(4, 4, 4, 4); } } private bool TryConvertToDouble(object value, out double result) { result = 0.0; if (value == null) return false; // Intentar conversión directa si ya es double if (value is double d) { result = d; return true; } // Intentar conversión desde float if (value is float f) { result = f; return true; } // Intentar conversión desde int if (value is int i) { result = i; return true; } // Intentar parsing desde string if (value is string s) { if (double.TryParse(s.Replace(',', '.'), NumberStyles.Float, CultureInfo.InvariantCulture, out result)) return true; } return false; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotImplementedException("ConvertBack no está implementado para TankSectionMarginConverter"); } } }